尝试从10.10升级到11.04之前,一切似乎都进行得很好,直到重新启动为止。出现此错误消息是:

Kernel Panic - not syncing: VFS: Unable to mount root fs on unknown-block(0,0)


我们该如何解决?

评论

您的麻烦可能与您的主系统无关,而与安装介质(USB记忆棒)无关。➪参见此处:askubuntu.com/a/632636/479118

由于没有足够的代表,我无法发布答案,但是当我遇到此问题时,我通过启动到活动USB记忆棒,安装主分区和EFI分区,启用网络并运行sudo apt-get install来解决了该问题。 linux-image-generic升级到最新的内核。

这有太多答案,但不是我所需要的:dpkg --configure linux-kernel- -generic-不能使用-a,因为这再次触发了恢复菜单。有关更多信息,请参见我的答案。

#1 楼

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

评论


如果在选择该操作系统存在的唯一内核选项时(在多重引导情况下)显示内核恐慌怎么办,如何启动update-initramfs?

– knocte
2014年1月29日上午9:04

@knocte,请参见Tomeu Roig的答案。

–psusi
2014年1月29日14:07

我无法进入Ubuntu系统或恢复模式,如何执行该命令以测试其是否有效?

–凯斯
16年7月16日在9:54

@sherrellbc,它确实与rootfs有关。内核无法安装rootfs,因为未正确配置它。相反,假定内核将使用initramfs挂载rootfs。在使用initramfs之前的日子里,您必须配置内核以知道要挂载rootfs的硬编码块号,这就是当它没有initramfs时回退的行为。

–psusi
18-2-11的2:43

就我而言,原因是存储空间不足。因此,我选择了先前的内核,从硬盘驱动器启动,删除内容,然后重新启动回原始内核。

–伊布
18年6月11日在21:51

#2 楼

从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 


,现在您可以制作update-initramfs和update-grub而没有错误。

update-initramfs -u -k 2.6.38-8-generic (or your version)


如果您不知道自己的版本。使用:

dpkg --list | grep linux-image


并更新Grub。

update-grub2


重新启动系统。

评论


我在编辑中添加了sudo mount --bind / dev / pts / mnt / dev / pts和sudo mount --bind / sys / mnt / sys;没有这个,update-grub2抱怨。

– Hbf
2012年11月8日15:51

如何找到确切的版本?

– knocte
2014年1月29日在9:05

如果您使用的是EFI,则除了第一个/ dev / sdax之外,没有安装点。

–Paul Gregoire
2014年7月28日14:36

非常好-对我来说,这消除了“ kernel panic”错误。我仍然必须通过在grub中选择“修复”启动选项并选择“修复损坏的包装”来跟进它。那解决了我剩下的问题。

–加特曼多
16-3-22在23:27



挂载:挂载点{路径}不存在。所有安装点都不存在。我该如何解决这个问题?

–凯斯
16年7月16日在10:07



#3 楼

如果发生这种情况是在内核更新异常终止后发生的(例如,在aptitude safe-upgrade时系统崩溃),请使用较旧的内核启动并运行dpkg --configure -a

这将完成升级,包括按照psusi解释配置启动设置。

#4 楼

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

我解决了问题通过引导到已安装的最早的内核,并使用aptitude删除一些未使用的内核。通过使用aptitude,卸载完成后,dpkg会自动尝试配置损坏的软件包,这次成功了。

评论


这是最接近我的解决方案的方法。仅运行dpkg --configure -a就足以触发update-initramfs挂钩并修复损坏的内核。

–对称
13年5月11日在19:44

您的意思是您有一个单独的/ boot分区吗?

– Ciro Santilli郝海东冠状病六四事件法轮功
2015年10月1日上午7:00

这是我到达之前设置的服务器,并在其自己的分区和无人值守的升级上配置了/ boot。

–sheepeatingtaz
2015年10月1日在14:24

您可以使用sudo apt-get autoremove删除旧内核,以防/ boot空间不足。

–弗洛里安·布鲁克(Florian Brucker)
16年7月21日在5:42

我启动了一个较旧的内核,执行了sudo apt-get autoremove,再次重新启动(较旧的内核),然后执行了sudo apt-get dist-upgrade,并且此方法有效。这是在我拥有的小型测试机上。虽然同样的问题,100%/ boot

– jmlumpkin
18年5月23日在2:51

#5 楼

基于内核消息的完整诊断过程
,但是使用此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上进行了测试。

#6 楼

我遇到了这个问题,因为linux头文件正在更新,并且电力消失了。
我如下恢复了,

转到grub菜单并选择
高级选项>选择上一个内核和启动,

一旦获得终端,请运行以下命令,

sudo dpkg --configure -a


从dpkg的手册页开始,

--configure package...|-a|--pending
              Configure a package which has been unpacked but not yet configured.  If -a or --pending is given instead of package, all unpacked but unconfigured packages are configured.

              To reconfigure a package which has already been configured, try the dpkg-reconfigure(8) command instead.

              Configuring consists of the following steps:

              1. Unpack the conffiles, and at the same time back up the old conffiles, so that they can be restored if something goes wrong.

              2. Run postinst script, if provided by the package.


日志如下,

Setting up linux-image-4.15.0-76-generic (4.15.0-76.86) ...
Processing triggers for initramfs-tools (0.130ubuntu3.9) ...
update-initramfs: Generating /boot/initrd.img-4.15.0-74-generic
Processing triggers for linux-image-4.15.0-76-generic (4.15.0-76.86) ...
/etc/kernel/postinst.d/dkms:
 * dkms: running auto installation service for kernel 4.15.0-76-generic
   ...done.
/etc/kernel/postinst.d/initramfs-tools:
update-initramfs: Generating /boot/initrd.img-4.15.0-76-generic
/etc/kernel/postinst.d/zz-update-grub:
Sourcing file `/etc/default/grub'
Generating grub configuration file ...
Found linux image: /boot/vmlinuz-4.15.0-76-generic
Found initrd image: /boot/initrd.img-4.15.0-76-generic
Found linux image: /boot/vmlinuz-4.15.0-74-generic
Found initrd image: /boot/initrd.img-4.15.0-74-generic
Found linux image: /boot/vmlinuz-4.15.0-72-generic
Found initrd image: /boot/initrd.img-4.15.0-72-generic
Found memtest86+ image: /boot/memtest86+.elf
Found memtest86+ image: /boot/memtest86+.bin
Found Windows 7 on /dev/sda1
done


和voila,已下载但未配置的较新软件包正在运行。

#7 楼

除了Tomeu的说明外,在chroot之前,我还需要:

sudo mount --bind /dev /mnt/dev

另外,在chroot之后:

cp -r /usr/lib/i386-linux-gnu/pango /usr/lib/

(从这里得到。)

评论


Tomeu已经提到在/ mnt / dev上安装/ dev。

– Lekensteyn
2011-10-16 8:59

#8 楼

您还可以在救援模式下引导服务器,然后仅重新安装grub

http://info.w3calculator.com/free-code/linux/recover-from-corrupted-boot-image/

评论


链接已死..

–约翰·乔(John Joe)
18年4月24日在16:24

#9 楼

由于/ boot分区已满,因此出现此问题,因此我的内核更新失败。
我通过从GRUB菜单中的旧内核启动来解决此问题。

当设法引导时,我开始清除旧的内核,但是我设法解决了一些依赖性问题,因此首先我必须卸载linux-server软件包。

apt-get remove linux-server
apt-get update
apt-get -f install
apt-get upgrade


然后我重新启动,一切正常!

#10 楼

就我而言:


是由于升级到LTS 20.04期间崩溃而引起的。


dpkg --configure -a再次打开了恢复菜单,因此软件包没有(重新)配置。


所以我不得不列出已安装的内核
dpkg --list | grep linux-kernel | more



并专门配置是新安装的:
dpkg --configure linux-kernel-5.20.0-52-generic



在相关说明中,升级崩溃的原因可能是:


安装用完了包含内核的卷上的空间:
dpkg --purge remove linux-kernel-<someOldVersion>

我不会立即使用“删除所有旧内核”,因为如果最新版本被破坏,您希望启动一些。


您的磁盘已耗尽-运行smartctl --health --alle2fsck ...


某些驱动程序导致整个操作系统挂起-对我来说,在4K上播放4K电影时,这发生在nVidia驱动程序上屏幕。