我刚刚将我的服务器升级到 Debian Buster (Raspbian)。但是,当我现在启动时,我的 USB 硬盘未安装。我在启动屏幕上看到类似以下内容:
mount: /media/PiHDD: can't find UUID=<string>
如果我手动安装sudo mount -a
,则所有硬盘都已安装
以下是/etc/fstab
:
proc /proc proc defaults 0 0
/dev/mmcblk0p1 /boot vfat defaults 0 0
/dev/mmcblk0p2 / ext4 defaults,noatime 0 0
UUID=<string> /media/PiHDD ext4 defaults,noatime 0 0
UUID=<string2> /media/PiHDD2 ext4 defaults,noatime 0 0
...
在更新至 Buster 之前,它运行良好。
我还尝试根据 的输出使用PARTUUID
或来识别硬盘驱动器,但这些在使用等启动时也会失败。LABEL
blkid
can't find LABEL
我没有使用 systemd (PID 1 是 init,并file /sbin/init
提供可执行文件)。/sbin/init --version
给出SysV init version: 2.93
.我已更新到最新(测试)内核4.19.57-v7+
。
启动时,我认为我的系统在尝试安装 USB 设备之前会看到它们。我可以New USB device found
在安装失败之前看到。我也在Attached SCSI disk
找到设备后看到,但我不确定它是在安装失败之前还是之后。这一切都在/var/log/syslog
,但由于某种原因mount… can't find UUID
,我在启动时看到的错误不在/var/log
.
如何让我的系统在启动时自动挂载 USB 硬盘?
以下是 的内容/etc/inittab
。
# /etc/inittab: init(8) configuration.
# $Id: inittab,v 1.91 2002/01/25 13:35:21 miquels Exp $
# The default runlevel.
id:2:initdefault:
# Boot-time system configuration/initialization script.
# This is run first except when booting in emergency (-b) mode.
si::sysinit:/etc/init.d/rcS
# What to do in single-user mode.
~~:S:wait:/sbin/sulogin
# /etc/init.d executes the S and K scripts upon change
# of runlevel.
#
# Runlevel 0 is halt.
# Runlevel 1 is single-user.
# Runlevels 2-5 are multi-user.
# Runlevel 6 is reboot.
l0:0:wait:/etc/init.d/rc 0
l1:1:wait:/etc/init.d/rc 1
l2:2:wait:/etc/init.d/rc 2
l3:3:wait:/etc/init.d/rc 3
l4:4:wait:/etc/init.d/rc 4
l5:5:wait:/etc/init.d/rc 5
l6:6:wait:/etc/init.d/rc 6
# Normally not reached, but fallthrough in case of emergency.
z6:6:respawn:/sbin/sulogin
# What to do when CTRL-ALT-DEL is pressed.
ca:12345:ctrlaltdel:/sbin/shutdown -t1 -a -r now
# Action on special keypress (ALT-UpArrow).
#kb::kbrequest:/bin/echo "Keyboard Request--edit /etc/inittab to let this work."
# What to do when the power fails/returns.
pf::powerwait:/etc/init.d/powerfail start
pn::powerfailnow:/etc/init.d/powerfail now
po::powerokwait:/etc/init.d/powerfail stop
# /sbin/getty invocations for the runlevels.
#
# The "id" field MUST be the same as the last
# characters of the device (after "tty").
#
# Format:
# <id>:<runlevels>:<action>:<process>
#
# Note that on most Debian systems tty7 is used by the X Window System,
# so if you want to add more getty's go ahead but skip tty7 if you run X.
#
1:2345:respawn:/sbin/getty --noclear 38400 tty1
2:23:respawn:/sbin/getty 38400 tty2
3:23:respawn:/sbin/getty 38400 tty3
4:23:respawn:/sbin/getty 38400 tty4
5:23:respawn:/sbin/getty 38400 tty5
6:23:respawn:/sbin/getty 38400 tty6
# Example how to put a getty on a serial line (for a terminal)
#
#T0:23:respawn:/sbin/getty -L ttyS0 9600 vt100
#T1:23:respawn:/sbin/getty -L ttyS1 9600 vt100
# Example how to put a getty on a modem line.
#
#T3:23:respawn:/sbin/mgetty -x0 -s 57600 ttyS3
#Spawn a getty on Raspberry Pi serial line
T0:23:respawn:/sbin/getty -L ttyAMA0 115200 vt100
答案1
使用 sysvinit,您将拥有三个早期启动脚本:“sysinit”、“bootwait”和“boot”(通过 /etc/inittab)。它们在启动运行级别之前安装设备和加载模块等。
root 已经安装,/proc 是第一个需要的。 /sys 也可能。
稍后尝试安装 UUID 设备。这意味着您必须mount -a
稍微分开,并以不同的方式在 /etc/fstab 中分发(无)auto 选项。 /proc 和外部存储实际上并不属于同一安装步骤。
想想 systemd 和所有这些“依赖项”。
在挂载 UUID-USB 设备之前,必须需要某些模块(驱动程序)。
(如果你使用 initrd 它会变得有点复杂。我知道它如何挂起等待“按标签”设备)
要改变你就必须看看/etc/inittab
。以下是我的一些台词:
...
# Simple "old Linux" inittab from manpage:
# one (default) runlevel, 4 gettys, one bootwait rc-script
id:2:initdefault:
# sysinit/boot-scripts, they run first
#si::sysinit:/etc/sysinit.init
bw::bootwait:/etc/boot.init
# b::boot:/etc/rc
...
这是 /etc/boot.init (“bootwait”脚本):
#! /bin/bash
# Boot script, as defined in sysv inittab
echo "$0: starting...."
mountpoint /proc || mount -v -t proc Proc /proc
mountpoint /sys || mount -v -t sysfs Sys /sys
# root ro -> rw ?
# fed is ro, arch rw...
mount -o remount /
# Modules: for keyboard
modprobe -a xhci-pci usbhid hid-generic # i2c-hid
echo 0 > /sys/devices/virtual/graphics/fbcon/cursor_blink
echo "...$0 done"
当我用 sysvinit 启动时,这就是我所需要的。重要的部分是键盘模块!如果你的键盘没电了,什么都不能用! proc 和 sys 的挂载有点奢侈——只需注意我如何手动挂载这两个虚拟设备即可。我曾尝试使用/etc/fstab,但没有多大意义。最小的命令只是mount -t proc none /proc
我需要这个mountpoint ... || mount
命令,因为 systemd initrd 已经安装了 proc、sys 和 run (tmpfs)。我不想看到“已安装”错误,而是看到正确的输出。这不是 systemd,但通过一个简单的脚本您就可以完成基础知识。
答案2
我看起来 SysV 现在维护得很差。我转移到 systemd,并且没有任何配置更改,我的驱动器现在按预期安装在启动时。
FWIW 在 Debian/Raspbian 上,我刚刚做了sudo apt-get purge sysvinit-core
,它也自动安装了libnss-systemd
和systemd-sysv
.