我有一台 Slack 13.1 机器,内核为 2.6.36。然后,我将内核更新为3.12.1.
该机器已连接:具有三个分区的可启动磁盘(/dev/sda1 --> Linux OS 文件...、/dev/sda2 --> 数据、/dev/sda3 --> 更多数据)、一个“虚拟” SSD 只是用来存储东西(/dev/sdb1)和 USB 端口。
事实上,每当我尝试使用以下命令启动 Linux 时USB 包含数据(不是 LiveUSB)连接到机器,在启动过程中,发生了一些事情,将 sda 设备分配给 USB,因此无法在“可启动磁盘”中安装 Linux 分区,因为内核恐慌:
VFS: Mounted root (vfat filesystem) readonly on device 8:1.
devtmpfs: error mounting -2
[...]
Kernel panic - not syncing: no init found. Try passing init=..
我正在使用的引导加载程序是利洛。我不知道是否有办法强制启动过程不更改设备名称或将其中任何一个预先分配给某个设备。这是它的配置:
# Linux bootable partition config begins
image = /boot/vmlinuz
root=/dev/sda1
append="panic=120"
label=3.12.20-smp
read-only
/etc/fstab:
/dev/sda1 / ext4 rw 1 1
由于 USB 设备分区被视为 sda1,因此它显然不包含任何类型的 init 进程或应用程序,因此我会出现内核恐慌。
我曾尝试使用 root="LABEL=myLabel" 或 root="LABEL=current" 但没有运气...我认为是因为它在根节点中搜索标签,而不是在所有分区中搜索标签:S
对发生的事情有什么建议吗?可以修复吗?提前致谢!
答案1
忘记通过设备名称来识别设备吧。使用UUID就不会有任何问题。
您可以通过命令识别设备的UUID blkid
。
顺便说一句,我不知道LILO是否支持UUID。万一它不切换到 GRUB。
答案2
Linux 上的设备编号是该操作系统中最糟糕的事情之一。其他所有合理的 *nix 都使用类似控制器/目标/lun 之类的东西来寻址磁盘。
我曾经通过更改 BIOS 中的启动设备顺序(将 USB 放在最后)在我的 PC 上解决了这个问题。
我不知道这是否适用于所有情况,因为 Linux 通常不关心 BIOS 设置。
答案3
问题在于磁盘名称是按顺序创建的;内核检测到的第一个磁盘变为/dev/sda
,第二个磁盘变为 ,/dev/sdb
等等。
解决问题的方法是禁用 USB 磁盘(包括 USB 驱动器)的使用(即检测),直到系统完成启动。这可以通过将内核配置为不将 USB 存储驱动程序包含在内核本身中而是将其构建为模块来完成。这样,在启动过程中只会找到“正常”磁盘,并且只有在安装了根文件系统之后才可以加载模块usb_storage.ko
。
这是假设您自己构建了内核,并且没有使用 initrd(初始 ramdisk)。