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

luc*_*one 10 kernel 11.10

每当我尝试使用 linux 内核 3.0.0.13(由升级安装的内核)启动时,我都会收到内核恐慌错误:

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

幸运的是,如果我使用以前的版本启动,我没有任何问题。我该如何解决这个问题?我应该在哪里附加正确的root= option?如果我没有让这个内核工作,我如何将它作为默认值删除并坚持使用旧内核?

Nit*_*esh 12

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

以下是从摘录提到的链接通过上面的链接之一

很可能是最常见的问题之一(但一旦你解决了它,你很可能再也不会看到它了):

Unable to mount root fs on unknown-block(0,0)
Run Code Online (Sandbox Code Playgroud)

或者

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
Run Code Online (Sandbox Code Playgroud)

数字0,08,3在您的情况下可能不同 - 它指的是内核尝试访问(并且失败)的设备。一般可以说,如果第一位为0,则内核无法识别硬件。如果它是另一个数字(如 8),则无法识别文件系统(但可以访问硬件)。

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

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

如果您知道原因是什么,解决问题很容易。你很可能没有,所以这里是一个快速检查。

打开内核配置向导(make menuconfig部分),以便您可以相应地更新内核配置。

  • 检查您是否内置(而不是作为模块)支持您的硬盘控制器使用的总线/协议。
  • 这很可能是 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分区上。