内核恐慌 - 不同步:VFS:无法在未知块(0,0)上挂载根文件系统

Jef*_*h1e 173 upgrade boot kernel

尝试从 10.10 升级到 11.04 后,一切似乎都很顺利,直到重新启动。出现此错误消息:

Kernel Panic - not syncing: VFS: Unable to mount root fs on unknown-block(0,0)
Run Code Online (Sandbox Code Playgroud)

我们如何解决这个问题?

psu*_*usi 164

您缺少该内核的 initramfs。从Ubuntu 高级选项下的 GRUB 菜单中选择另一个内核,然后运行sudo update-initramfs -u -k version以生成 initrd version(替换version为内核版本字符串,例如4.15.0-36-generic) then sudo update-grub

  • 如果在选择该操作系统存在的唯一内核选项时显示内核恐慌怎么办(在多引导场景中),如何启动 update-initramfs? (8认同)
  • @knocte,请参阅 Tomeu Roig 的回答。 (5认同)
  • 我无法进入“Ubuntu 系统”或“恢复模式”,如何执行该命令来测试它是否有效? (3认同)
  • @sherrellbc,它确实与 rootfs 有关。内核无法挂载 rootfs,因为它没有正确配置。相反,它假定内核将使用 initramfs 来挂载 rootfs。在 initramfs 之前的日子里,您必须配置内核以知道要挂载的 rootfs 的硬编码块编号,这是它在没有 initramfs 时回退到的行为。 (2认同)
  • 就我而言,原因是存储空间不足。所以我选择了以前的内核,启动,从硬盘驱动器中删除内容,然后重新启动回到原始内核。 (2认同)

小智 87

从livecd开始,打开aa终端

sudo fdisk -l
sudo mount /dev/sdax /mnt
sudo mount --bind /dev /mnt/dev
sudo mount --bind /dev/pts /mnt/dev/pts
sudo mount --bind /proc /mnt/proc
sudo mount --bind /sys /mnt/sys
sudo chroot /mnt 
Run Code Online (Sandbox Code Playgroud)

现在您可以update-initramfs毫无错误地制作和更新grub。

update-initramfs -u -k 2.6.38-8-generic (or your version)
Run Code Online (Sandbox Code Playgroud)

如果你不知道你的版本。用:

dpkg --list | grep linux-image
Run Code Online (Sandbox Code Playgroud)

只需更新 Grub。

update-grub2
Run Code Online (Sandbox Code Playgroud)

重新启动系统。

  • 我怎样才能找到**确切**`版本`? (7认同)
  • 我在编辑中添加了 `sudo mount --bind /dev/pts /mnt/dev/pts` 和 `sudo mount --bind /sys /mnt/sys`;没有这个,`update-grub2` 就会抱怨。 (2认同)
  • 如果您使用 EFI,则除了第一个 /dev/sdax 之外,不存在任何挂载点。 (2认同)

Rap*_*ael 47

如果在内核更新中止后发生这种情况(例如系统崩溃 while aptitude safe-upgrade),

  1. 使用较旧的内核启动,并且
  2. dpkg --configure -a

这将完成升级,包括配置psusi 解释的引导设置。

  • 当我从 Ubuntu 20.04 升级到 22.04 时,收到上述错误。应用您的解决方案解决了一切。谢谢! (2认同)

she*_*taz 25

在我的情况下,问题是/boot容量为 100%,所以最后 2 个内核更新没有成功完成,因此在GRUB2选择最新内核时重新启动,它失败了。

我通过启动到已安装的最旧内核并使用 aptitude 删除一些未使用的内核来解决该问题。通过使用aptitude,卸载发生后,dpkg自动尝试配置损坏的包,这次成功了。

  • 这是最接近我的解决方案的;只需运行 `dpkg --configure -a` 就足以触发 update-initramfs 钩子,并修复损坏的内核。 (4认同)
  • 你可以使用 `sudo apt-get autoremove` 来删除旧内核,以防你的 `/boot` 空间不足。 (3认同)
  • 这是在我到达之前设置的服务器,它在自己的分区上配置了 /boot 和无人值守升级 (2认同)
  • 我启动到旧内核,执行“sudo apt-get autoremove”,再次重新启动(旧内核),然后执行“sudo apt-get dist-upgrade”,这有效。这是在我拥有的一台小型测试机器上进行的。同样的问题,100% `/boot` (2认同)

Cir*_*郝海东 6

基于内核消息的完整诊断程序

但是使用这个QEMU 仿真设置,我尝试为每种可能的故障类型生成最少的示例,以帮助您调试问题。

在这个简单的设置中,QEMU 模拟了一个系统:

  • 单个 virtio 磁盘,代表真实硬件的硬盘或 SDD
  • 该 virtio 磁盘中有一个未分区的原始 ext4 映像。在正常操作中,该装置将出现下/dev/vdav是已将virtio指示符信,如果它被划分的分区将是/dev/vda1/dev/vda2等)

您可能会遇到的错误是:

  1. Linux 无法从磁盘读取字节。

    这可能是因为磁盘损坏了,或者是因为您没有将 Linux 配置为具有读取该硬件类型的能力。

    在我的 QEMU 案例中,我可以通过删除允许内核读取该 virtio 磁盘的关键选项来重现这一点:

    CONFIG_VIRTIO_BLK=y
    CONFIG_VIRTIO_PCI=y
    
    Run Code Online (Sandbox Code Playgroud)

    生成的错误消息如下所示

    <4>[    0.541708] VFS: Cannot open root device "vda" or unknown-block(0,0): error -6
    <4>[    0.542035] Please append a correct "root=" boot option; here are the available partitions:
    <0>[    0.542562] Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(0,0)
    
    Run Code Online (Sandbox Code Playgroud)

    因此,这里的Linux告诉我们,它不能从VDA都在阅读:VFS: Cannot open root device "vda" or unknown-block(0,0): error -6

    然后,Please append a correct "root=" boot option; here are the available partitions:它给出了它可以读取的分区列表。

    在我们的例子中,列表是空的,因为下一行是完全不相关的。

  2. Linux 可以从磁盘读取字节,但它不理解文件系统从中读取文件。

    这通常是因为您没有将内核配置为读取该文件系统类型。

    我可以通过删除内核读取 ext4 文件系统的能力来达到这种情况:

    CONFIG_EXT4_FS=y
    
    Run Code Online (Sandbox Code Playgroud)

    删除后,错误消息是:

    <4>[    0.585296] List of all partitions:
    <4>[    0.585913] fe00          524288 vda
    <4>[    0.586123]  driver: virtio_blk
    <4>[    0.586471] No filesystem could mount root, tried:
    <4>[    0.586497]  squashfs
    <4>[    0.586724]
    <0>[    0.587360] Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(254,0)
    
    Run Code Online (Sandbox Code Playgroud)

    所以 Linux 告诉我们它vda通过使用virtio_blk设备读取磁盘来设法找到一个分区。

    但是,它无法读取该分区。它尝试了squashfs,这是我们启用的唯一其他文件系统,但这不起作用,因为我们有一个 ext4 分区。

  3. 您传递了错误的root=内核命令行选项。

    这个很简单,只要通过正确的一个!内核甚至会给你一个它知道的列表!

    例如,如果我们传递一个错误:

    root=/dev/vda2
    
    Run Code Online (Sandbox Code Playgroud)

    它甚至不存在,内核给出了一个类型的错误:

    <4>[    0.608475] Please append a correct "root=" boot option; here are the available partitions:
    <4>[    0.609563] fe00          524288 vda
    <4>[    0.609723]  driver: virtio_blk
    <0>[    0.610433] Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(254,2)
    
    Run Code Online (Sandbox Code Playgroud)

    Clearing 告诉我们“嘿:没有vda2,但是有vda!”

    这个例子也很好地阐明了(0,0),(254,0)(254,2)之前案例的含义:

    • (0,0): 第一个数字 0 表示根本无法从磁盘读取
    • (254,2): 254 是分配给磁盘的某个 ID。2是具有该 ID 的分区,如/dev/vda2. 分区0表示原始未分区的分区,如/dev/vda.

在 Linux 5.4.3 上测试。