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

Mil*_*ari 14 linux kernel-panic grub2 kali-linux manjaro

我的笔记本电脑上装有 Windows 10 和 Manjaro,一切正常。昨天,我在另一个分区安装了 Kali Linux。它已正确安装并且工作正常。但问题是当我想启动我的 Manjaro 时。我在 grub 菜单上选择 Manjaro,但这是我看到的屏幕。

wn-block(0,0)
[    0.667378] CPU: 1 PID: 1 Comm: swapper/0 Not tainted 4.9.47-1-MANJARO #1
[    0.667435] Hardware name: Acer Aspire E5-575G/Ironman_SK  , BIOS V1.04 04/26/2016
[    0.667493]  ffffc90000c8bde0 ffffffff813151d2 ffff880276a77000 ffffffff8190b950
[    0.667717]  ffffc90000c8be68 ffffffff8117ecd4 ffffffff00000010 ffffc90000c8be78
[    0.667940]  ffffc90000c8be10 327c3b64ed88e616 327c3b64ed88e616 ffffc90000c8be80
[    0.668162] Call Trace:
[    0.668213]  [<ffffffff813151d2>] dump_stack+0x63/0x81
[    0.668267]  [<ffffffff8117ecd4>] panic+0xe4/0x22d
[    0.668321]  [<ffffffff81v2a590>] mount_block_root+0x27c/0x2c7
[    0.668377]  [<ffffffff81b298be>] ? set_debug_rodata+0x12/0x12
[    0.668432]  [<ffffffff81b2a640>] mount_root+0x65/0x68
[    0.668486]  [<ffffffff81b2a772>] prepare_namespace+0x12f/0x167
[    0.668542]  [<ffffffff81b2a1ca>] kernel_init_freeable+0x1ec/0x205
[    0.668598]  [<ffffffff81610b30>] ? rest_init+0x90/0x90
[    0.668652]  [<ffffffff81610b3e>] kernel_init+0xe/0x100
[    0.668706]  [<ffffffff8161dfd5>] ret_from_fork+0x25/0x30
[    0.668786] Kernel Offset: disabled
[    0.668893] ---[ end Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(0,0)
_
Run Code Online (Sandbox Code Playgroud)

我该如何解决这个问题?

Mar*_*ark 10

VFS: unable to mount root fs on unknown-block(0 0)意味着内核无法挂载根文件系统。造成这种情况的常见原因有两个:

  1. 内核不支持设备上的文件系统。如果您编译了自己的内核,这通常是因为您指定文件系统驱动程序应该构建为模块而不是内核的本机部分;如果您使用发行版的内核,这通常是因为您为根文件系统选择了一种特殊格式。无论哪种情况,都不要这样做。

  2. 传递给内核的根设备名称是错误的。这个可能很难修复:我发现的最好方法是从引导加载程序修改内核命令行,对root=参数应该是什么样子进行有根据的猜测,直到我找到可行的方法。

  • 感谢您的回复。但我现在不知道该怎么办。我有 Manjaro,一切正常,但安装 Kali 后,grub 屏幕发生了变化,当我想启动 Manjaro 时,出现错误。但对 Kali 来说没问题。@标记 (2认同)

Cir*_*郝海东 7

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

通过使用此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 上测试。


小智 7

VFS:无法在未知块(0 0)上挂载根文件系统_ _ _

\n
    \n
  1. 长按电源按钮关闭笔记本电脑。
  2. \n
  3. 选择 \xe2\x80\x9cadvanced\xe2\x80\x9d 选项。
  4. \n
  5. 选择通用的最低版本(\xe2\x80\x9crecovery 模式\xe2\x80\x9d)
  6. \n
  7. 单击 \xe2\x80\x9cclean\xe2\x80\x9d \xe2\x80\x9c 尝试释放可用空间\xe2\x80\x9d
  8. \n
  9. 然后 \xe2\x80\x9cresume\xe2\x80\x9d \xe2\x80\x9cresume 正常启动\xe2\x80\x9d
  10. \n
\n


小智 6

还有第三个原因,这恰好是我的问题:

通常,在每个 grub 菜单项中,都有“linux ...”行和“initrd ....”行。

因为 /boot 中的空间不足,所以我删除了 initrd.... 文件,为不同的内核版本运行 update-initramfs,但忽略了运行 update-grub,这将更新相应的条目。

我通过在启动序列期间在启动菜单中手动添加该行来修复此问题,然后在登录后将其永久化并可以运行 update-grub。