![内核恐慌 - 未同步:VFS:无法在未知块(0,0)上挂载根文件系统](https://linux22.com/image/953631/%E5%86%85%E6%A0%B8%E6%81%90%E6%85%8C%20-%20%E6%9C%AA%E5%90%8C%E6%AD%A5%EF%BC%9AVFS%EF%BC%9A%E6%97%A0%E6%B3%95%E5%9C%A8%E6%9C%AA%E7%9F%A5%E5%9D%97%EF%BC%880%2C0%EF%BC%89%E4%B8%8A%E6%8C%82%E8%BD%BD%E6%A0%B9%E6%96%87%E4%BB%B6%E7%B3%BB%E7%BB%9F.png)
尝试从 10.10 升级到 11.04 时一切似乎都很顺利,直到重新启动。出现了以下错误消息:
Kernel Panic - not syncing: VFS: Unable to mount root fs on unknown-block(0,0)
我们怎样才能解决这个问题?
答案1
您缺少该内核的 initramfs。从 GRUB 菜单中选择另一个内核Ubuntu 的高级选项然后运行sudo update-initramfs -u -k version
以生成 initrd version
(version
用内核版本字符串替换,例如4.15.0-36-generic
)sudo update-grub
。
答案2
从 livecd 启动,打开终端并执行:
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
如果您/boot
在单独的分区上,还可以调用:
sudo mount /dev/sday /mnt/boot
现在您可以update-initramfs
毫无错误地制作和更新 grub 了。
update-initramfs -u -k 2.6.38-8-generic (or your version)
如果你不知道你的版本。请使用:
dpkg --list | grep linux-image
并更新 Grub。
update-grub
重新启动系统。
答案3
如果在内核更新中止后发生这种情况(例如系统崩溃aptitude safe-upgrade
),
- 使用较旧的内核启动
- 跑步
dpkg --configure -a
。
这将完成升级,包括配置启动设置psusi 解释。
答案4
基于内核消息的完整诊断过程
但使用这个QEMU 仿真设置我尝试提供每种可能的故障类型的最少示例来帮助您调试问题。
在该简单设置中,QEMU 模拟具有以下功能的系统:
- 单个 virtio 磁盘,代表真实硬件的硬盘或 SDD
- 该 virtio 磁盘中有一个原始的未分区的 ext4 映像。在正常运行中,该设备将出现在
/dev/vda
(v
是 virtio 的指示字母,如果已分区,则分区将为/dev/vda1
、/dev/vda2
等。)
可能遇到的错误有:
Linux 无法从磁盘读取字节。
这可能是因为磁盘损坏,或者因为您没有配置 Linux 以使其具有从该硬件类型读取的能力。
在我的 QEMU 案例中,我可以通过删除允许内核读取该 virtio 磁盘的关键选项来重现此问题:
CONFIG_VIRTIO_BLK=y CONFIG_VIRTIO_PCI=y
产生的错误消息如下所示
<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)
因此这里 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:
它给出它可以读取的分区列表。然而,在我们的例子中,列表是空的,因为下一行完全不相关。
Linux 可以从磁盘读取字节,但它不了解文件系统以从中读取文件。
这通常是因为您没有配置内核来读取该文件系统类型。
我可以通过删除内核读取 ext4 文件系统的能力来达到这个目的:
CONFIG_EXT4_FS=y
删除该内容后,错误消息为:
<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)
因此 Linux 告诉我们它
vda
通过使用设备读取磁盘成功找到了一个分区virtio_blk
。但后来,它无法读取该分区。它尝试
squashfs
,这是我们启用的唯一其他文件系统,但它不起作用,因为我们有一个 ext4 分区。您传递了错误的
root=
内核命令行选项。这个很简单,只要传递正确的一个!内核甚至会给你一个它所知道的列表!
例如,如果我们传递一个错误:
root=/dev/vda2
它甚至不存在,内核给出以下类型的错误:
<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)
清除告诉我们“嘿:没有
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 上测试。