内核因“无法打开根设备”错误而崩溃,我应该在哪里附加“root=”选项?

内核因“无法打开根设备”错误而崩溃,我应该在哪里附加“root=”选项?

每当我尝试使用 Linux 内核 3.0.0.13(通过升级安装的内核)进行启动时,都会出现内核恐慌错误:

VFS:无法打开根设备“sda1”或未知块(0,0)请附加正确的“root=”启动选项;

幸运的是,如果我使用以前的版本启动,就不会出现任何问题。我该如何解决这个问题?我应该在哪里添加正确的root= option?如果我无法让这个内核工作,我该如何将其从默认内核中删除并坚持使用旧版本?

答案1

您没有提供太多日志等信息来继续操作,但我猜您遇到的这个错误很可能是因为内核被 IDE/SATA 驱动器混淆了。快速谷歌搜索让我找到了链接1链接2链接 3

以下是摘录自链接引用经过上面的链接之一

最有可能是最常发生的问题之一(但一旦你解决了它,你很可能永远不会再看到它):

Unable to mount root fs on unknown-block(0,0)

或者

VFS: Cannot open root device "sda3" or unknown-block(8,3)
Please append a correct "root=" boot option; here are the available partitions:
  sda driver: sd
    sda1 sda2

根据您的情况,数字0,08,3可能有所不同 - 它指的是内核尝试访问(但失败)的设备。一般来说,如果第一个数字是 0,则内核无法识别硬件。如果是其他数字(例如 8),则无法识别文件系统(但可以访问硬件)。

这里的问题是,您正在引导的内核无法将root=/dev/...您提供的参数(在引导加载程序配置中)转换为真实的可访问文件系统。有多种原因可能导致此类故障:

  • 内核配置缺少 HDD 控制器的驱动程序(情况 1、4、5)
  • 内核配置缺少 HDD 控制器使用的总线的驱动程序
  • 内核配置缺少您正在使用的文件系统的驱动程序
  • 您的 root= 参数中设备识别错误(情况 2、3)

如果您知道原因,解决问题就很容易。您很可能不知道,因此下面是快速检查。

打开内核配置向导(制作菜单配置部分),以便您可以相应地更新内核配置。

  • 检查您是否内置了(而不是作为模块)对硬盘控制器使用的总线/协议的支持。
  • 最有可能的是 PCI 支持、SATA 支持(位于 SCSI 设备支持之下)...
  • 检查您是否已内置(而非作为模块)支持您使用的 HDD 控制器。最常见的情况之一:您选择了对硬盘控制器协议(IDE、SATA、SCSI 等)的支持,但忘记选择 HDD 控制器
    驱动程序本身(如 Intel PIIX)。尝试
    运行以下 lscpi 命令,并将其输出粘贴到
    http://kmuto.jp/debian/hcl/。该网站会向您显示您需要为您的系统选择哪些内核驱动程序。在 menuconfig 中,
    您可以键入“/”以打开搜索功能,然后键入驱动程序
    名称以查找其所在位置。 # lspci -n
  • 检查您是否已内置(而不是作为模块)对所使用的文件系统的支持。
  • 假设您的根文件系统使用 btrfs(我绝对不推荐),但您没有选择它,或者选择将其构建为模块
    ,那么您将得到您看到的错误。确保文件系统
    支持已在内核中构建。
  • 检查内核参数是否root=指向正确的分区。

    这并不像听起来那么愚蠢。当您使用一个内核启动时,它可能会将您的磁盘列为 /dev/sda,而您的(已配置的)内核则认为它是 /dev/hda。这并不是因为内核彼此不一致,而是因为所使用的驱动程序:较旧的驱动程序使用 hda 语法,较新的驱动程序使用 sda。

    尝试将 hda 与 sda 切换(将 hdb 与 sdb 切换,等等)。

    此外,最近的内核会概述它们在设备上找到的分区。如果是这样,它可能有助于您确定是否错误选择了分区(在本节开头给出的示例中,只找到了两个分区,而内核被指示启动第三个分区)。如果没有,很可能是因为内核不知道从哪个设备开始(因此它无法尝试显示分区)。

  • 检查引导加载程序正在引导的内核是否正确。我见过有人在构建第一个内核(无法引导)后,忘记/boot在用新内核覆盖之前必须先挂载。结果,他们将内核复制到根文件系统(/),而引导加载程序仍然希望内核映像位于/boot分区上。

答案2

该错误可能与 initrd 映像过大有关。

可以通过更改压缩方法并从目标文件中删除调试符号来解决此问题:

# Strip unneeded symbols of object files
$ cd /lib/modules/5.4.5-rt3  # or your new kernel
$ sudo find . -name *.ko -exec strip --strip-unneeded {} +

# Change the compression format
$ sudo vi /etc/initramfs-tools/initramfs.conf
# Modify COMPRESS=lz4 to COMPRESS=xz (line 53)

COMPRESS=xz 

参考:https://stackoverflow.com/a/59678390

答案3

阅读完此答案后,解释了发生了什么事情,请尝试使用 [Boot-Reapir CD][1][1]:https://help.ubuntu.com/community/Boot-Repair

非常成功地修复了“设备在您的 root= 参数中被错误识别(情况 2、3)”。

相关内容