我使用 Debian kernel-package 编译并安装了自定义 Linux 内核。一切顺利:创建了 .deb 文件,并在 /boot 中创建了自定义 vmlinuz 和 initrd.img,并且自动修改了 /boot/grub/menu.lst。但是在我启动自定义内核后,发生了以下情况:
取得一些进展后,写下以下内容:
Begin: Waiting for root file system
并等待一会儿。然后打印以下内容:
Gave up waiting for root device. Common problems:
- Boot args (cat /proc/cmdline)
- Check root delay= (did the system wait long enough?)
- Check root= (did the system wait for the right device?)
- Missing modules (cat /proc/modules; ls /dev)
ALERT! doesn't exist. Dropping to a shell!
/bin/sh
(initramfs)
并跳转到 RAM 中的 shell。当我尝试时mount /dev/hda6 /tmp/hda6
,确实没有 hda6。hda6 是运行我的 Debian 并包含自定义 initrd.img 的分区。
请大家帮帮我!
答案1
root=
当内核启动选项中的行与硬件不匹配时,就会出现此问题。
可能是你的新内核没有为你的启动设备提供/dev/hda
设备节点。有几种可能。
您的设备现在可能是
/dev/hdb
这样的。可能是您的内核现在正在为该设备使用较新的驱动程序,而您的启动设备现在
/dev/sda
或类似情况。/dev/hd{a..z}
设备使用较旧的 PATA 驱动程序。这在 SATA 设备中很普遍,但也可以以这种方式访问较旧的 PATA 接口。(例如,Ubuntu 默认使用此方法,但 PATA 光驱除外。)
修复此问题的最简单方法是启动内核,等待它带您进入 shell,然后检查/dev/disk/by-uuid
或/dev/disk/by-label
找出正确的设备。然后您可以挂载该设备,更正root=
Grub 配置中的参数,然后重新启动。
考虑在参数中使用 UUID 或分区标签,root=
而不是特定设备;这样,重命名设备的内核驱动程序更改不会影响启动。您可以使用 查找 UUID 和标签tune2fs -l <device>
,也可以使用 添加标签sudo tune2fs -L <label> <device>
。
以下是root=
每种方式的论据(请注意,没有引号):
root=/dev/sda6
root=UUID=94b1e7d5-9fc5-4f44-b5b1-c776afc808d4
root=LABEL=debian-root-volume-label
答案2
您需要检查的第一件事是您的内核是否能够识别您的硬件。
- 首先,检查硬盘类型,并确保它在内核配置中已启用。这很可能是导致问题的原因。
- 我不记得
dmesg
Debian 默认 initramfs 中是否包含该程序,但您可以输入 检查内核调试输出dmesg | less
。然后尝试查找与您的硬盘相关的行。此外,了解驱动器的供应商或至少接口也很有用。 - 最后,您可以
quiet
从内核命令行中删除启动选项(如果有),然后只需使用 Shift+PgUp/PgDn 键向上滚动调试输出即可搜索与上一段相同的信息。
另外,在高清相关问题中提供一些有关硬盘的信息可能也是个好主意。