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
。
小智 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)
重新启动系统。
she*_*taz 25
在我的情况下,问题是/boot
容量为 100%,所以最后 2 个内核更新没有成功完成,因此在GRUB2选择最新内核时重新启动,它失败了。
我通过启动到已安装的最旧内核并使用 aptitude 删除一些未使用的内核来解决该问题。通过使用aptitude,卸载发生后,dpkg自动尝试配置损坏的包,这次成功了。
基于内核消息的完整诊断程序
但是使用这个QEMU 仿真设置,我尝试为每种可能的故障类型生成最少的示例,以帮助您调试问题。
在这个简单的设置中,QEMU 模拟了一个系统:
/dev/vda
(v
是已将virtio指示符信,如果它被划分的分区将是/dev/vda1
,/dev/vda2
等)您可能会遇到的错误是:
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:
它给出了它可以读取的分区列表。
在我们的例子中,列表是空的,因为下一行是完全不相关的。
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 分区。
您传递了错误的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 上测试。
归档时间: |
|
查看次数: |
440396 次 |
最近记录: |