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

尝试从10.10升级到11.04时,一切似乎都进行得很顺利,直到重新启动。出现了以下错误信息:
Kernel Panic - not syncing: VFS: Unable to mount root fs on unknown-block(0,0)

我们如何修复这个问题?


2你的问题可能与你的主系统无关,而是与你的安装介质(USB闪存驱动器)有关... ➪ 在这里查看:http://askubuntu.com/a/632636/479118 - Frank N
1由于我的声誉不够高,我无法发表答案,但当我遇到这个问题时,我通过引导到一个启动盘的USB上,挂载主分区和EFI分区启用网络设置,并运行 sudo apt-get install linux-image-generic 来升级到最新的内核,从而解决了这个问题。 - Owen
1这个问题有太多答案,但都不是我需要的: dpkg --configure linux-kernel-<version>-generic - 不要加上 -a,因为那会再次触发恢复菜单。请查看我的回答获取更多信息。 - Ondra Žižka
11现在已经过去了11年,22.04仍然无法自动修复这个问题,也没有给出合理的提示来采取哪些步骤!! - Rick James
1引导到 Boot-Repair 的实体光盘并修复 GRUB。详细指南在此处 - Collin Krawll
12个回答

你缺少了该内核的initramfs。在GRUB菜单下选择另一个内核,路径为Advanced options for Ubuntu,然后运行sudo update-initramfs -u -k version来生成version的initrd(将version替换为内核版本字符串,例如4.15.0-36-generic),最后运行sudo update-grub

12如果在选择该操作系统的唯一内核选项(在多重引导场景中)时出现内核恐慌,那么如何启动update-initramfs呢? - knocte
6@knocte,请参考Tomeu Roig的回答。 - psusi
4我无法进入“Ubuntu系统”或“恢复模式”,有什么方法可以执行该命令以测试它是否有效? - Casper
@Casper,请尝试使用较旧的内核版本(在高级选项中)。 - psusi
好主意,虽然错误信息没有很好地反映这一点。我立刻就以为与根文件系统有关,而不是内存磁盘。+1 - sherrellbc
2@sherrellbc,这与rootfs有关。内核无法挂载rootfs,因为它没有正确配置以执行此操作。相反,假设内核将使用initramfs来挂载rootfs。在没有initramfs的时代,您必须配置内核以了解用于挂载rootfs的硬编码块号,当没有initramfs时,它会回退到这种行为。 - psusi
1在我的情况下,原因是存储空间不足。所以我选择了之前的内核,启动了计算机,从硬盘中删除了一些文件,然后重新启动回到原始的内核。 - Ibu
当我尝试进入Ubuntu的高级选项时,我会返回到主GRUB菜单。如果我进入我的Windows分区,它可以工作,否则不能。你能帮助我吗? - desmond13
我无法进入高级选项,因为我没有权限这样做。当我与实验室的IT人员讨论了这个问题后,他用自己的账户进入了高级选项,并没有遇到任何问题。他通过网络引导了电脑。然后他选择了一个不同的内核(我之前尝试安装的那个),接着Ubuntu开始启动。一旦系统启动,他继续安装软件包,这些软件包是在我关闭笔记本电脑时正在进行的。然后他赋予我Grub权限,以便我可以自己完成所有操作(如果再次出现类似情况的话)。 - desmond13
在我的Ubuntu 19.10上,我必须运行apt install initramfs-tools才能使用update-initramfs命令。 - yunspace
这会修复以后的问题吗?还是我每次内核更新之后都要重新做一遍? - uav
1抱歉,但这对我来说行不通。我可以尝试使用另一个版本进行重启,我可以执行所有命令,但是重新启动后,问题依然存在。 - Denis BUCHER
@DenisBUCHER,请仔细检查您传递给update-initramfs的版本是否是grub默认启动的版本。 - psusi
这个方法在我运行do-release-upgrade后遇到VFS问题时起作用了,谢谢! - Gloat
你救了我一天的忙! - mixalbl4
我的笔记本电脑在运行时从大约3英尺的高度掉下来了,它安装了Debian 10,现在我遇到了这个错误(还有其他一些错误信息,并以这条消息结束)。也许这对我有用吗?我不知道如何获取另一个内核,我只是在grub界面,而且这个命令不起作用。 - user163831
谢谢!顺便说一下,这是通用的,也适用于Kali。 - Shivang Kakkar

从一个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-initramfsupdate-grub了。
update-initramfs -u -k 2.6.38-8-generic (or your version)

如果您不知道您的版本,请使用:
dpkg --list | grep linux-image

只需更新Grub即可。
update-grub

重新启动您的系统。

2我已经在我的编辑中添加了sudo mount --bind /dev/pts /mnt/dev/ptssudo mount --bind /sys /mnt/sys;如果没有这样做,update-grub2 将会报错。 - Hbf
8如何找到确切的“版本”? - knocte
2如果你使用EFI,除了第一个挂载点/dev/sdax之外,其他挂载点都不存在。 - Paul Gregoire
@knocte 尝试执行 ls /mnt/boot,查找最新的内核版本。或者如果你想做得更准确,请阅读 /mnt/boot/grub/grub.cfg 中的 menuentry 'Ubuntu' - Ciro Santilli OurBigBook.com
在Ubuntu 14.04上工作过!initrd文件在/boot目录下找不到了。问题是:这个文件怎么可能突然消失了呢?我没有做任何看起来危险的操作。 - Ciro Santilli OurBigBook.com
1非常好 - 这对我来说解决了“内核恐慌”错误。然后我还得在 grub 中选择“修复”启动选项,并选择“修复破损的软件包”。这解决了我剩下的问题。 - Gatmando
1挂载:挂载点 {path} 不存在。所有的挂载点都不存在。我该如何解决这个问题? - Casper
由于您使用了--bind和chroot,所以您不需要-k选项。 - Déjà vu
1尝试时,出现以下类型的错误消息: update-initramfs: 生成 /boot/initrd.img-4.15.0.50.52 警告:缺少 /lib/modules/4.15.0.50.52 确保所有必要的驱动程序都已构建到 Linux 镜像中! depmod: 错误:无法打开目录 /lib/modules/4.15.0.50.52:没有该文件或目录 depmod: 致命错误:无法搜索模块:没有该文件或目录 depmod: 警告:无法打开 /var/tmp/mkinitramfs_ch6X8K/lib/modules/4.15.0.50.52/modules.order:没有该文件或目录 - JeanSibelius
你是我的救命恩人。 - oya163
谢谢!不过,之后当我运行vagrant时,它会报错说文件系统是只读的,因为它试图删除/lib/modules中的vboxvideo文件 - 有没有办法解决它被更改为只读的问题? - meder omuraliev
我必须做类似的事情:使用Live CD并在执行update-initramfs之前挂载文件系统。但是我正在使用全盘加密(在安装Ubuntu时选择的),所以挂载方式不同;尝试这样做会导致错误,主要是关于不存在的挂载点。 - Daniel
请确保您使用与当前安装版本相同的Live CD。例如,我在我的当前16版本上尝试了Ubuntu 20的Live CD,但内核版本不兼容。因此,我不得不下载旧的Ubuntu 16 Live CD。 - shreyansp
我该怎么做?我的驱动器是LVM,我不知道如何挂载它。 - user163831

如果这是在内核更新中断后发生的(例如,在执行“aptitude safe-upgrade”时系统崩溃),请按照以下步骤操作:
1. 使用旧版本的内核启动。 2. 运行“dpkg --configure -a”命令。
这将完成升级过程,并配置引导设置,具体可参考psusi的解释

2当我从Ubuntu 20.04升级到22.04时,我收到了上述错误。应用您的解决方案修复了一切。谢谢! - user238607
我遇到了以下错误:ERROR (dkms apport): binary package for evdi: 1.12.0 not found,搜索结果显示这与我不再使用的DisplayLink有关,所以我卸载了它,运行sudo displaylink-installer uninstall,然后重新执行上述操作,问题得到解决。 - Waqleh
哇,谢谢。内核崩溃 - 不同步:VFS:无法在未知块(0,0)上挂载根文件系统听起来真的很糟糕,我已经准备好摧毁旧服务器并安装新的硬盘了。我只需要删除一些旧的内核。 - undefined
这在20.04上运行成功了。 - undefined

在我的情况下,问题是/boot的容量已经达到100%,所以最近的两个内核更新没有成功完成,因此当GRUB2选择最新的内核时,它失败了。
我通过启动安装的最旧的内核,并使用aptitude删除一些未使用的内核来解决这个问题。通过使用aptitude,在卸载完成后,dpkg会自动尝试配置损坏的软件包,这次成功了。

5这是离我解决方案最接近的方法;只需运行 dpkg --configure -a 就足够触发 update-initramfs 挂钩,并修复损坏的内核。 - Symmetric
1你的意思是你有一个单独的/boot分区,是这样吗? - Ciro Santilli OurBigBook.com
2这是在我到达之前设置好的服务器,它配置了/boot在自己的分区上,并且启用了无人值守升级。 - sheepeatingtaz
4如果你的/boot空间不足,你可以使用sudo apt-get autoremove命令来删除旧的内核。 - Florian Brucker
2我引导到一个较旧的内核,执行了sudo apt-get autoremove,再次重启(较旧的内核),然后执行了sudo apt-get dist-upgrade,这样就解决了问题。这是在我的一台小型测试机上进行的。但是出现了相同的问题,/boot 100% 使用。 - jmlumpkin

完整的诊断过程基于内核消息
但是使用这个QEMU仿真设置,我尝试产生每种可能的故障类型的最小示例,以帮助您调试问题。
在这个简单的设置中,QEMU模拟了一个具有以下特点的系统:
- 一个表示真实硬件的硬盘或SSD的单个virtio磁盘 - 那个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:无法打开根设备“vda”或unknown-block(0,0):错误-6 <4>[0.542035] 请附加正确的“root=”引导选项;以下是可用的分区: <0>[0.542562] 内核恐慌-不同步:VFS:无法挂载未知块(0,0)上的根文件系统 因此,在这里Linux告诉我们它根本无法读取vda:VFS:无法打开根设备“vda”或unknown-block(0,0):错误-6。 然后,在请附加正确的“root=”引导选项;以下是可用的分区:处,它给出了一个它可以读取的分区列表。 但在我们的情况下,由于下一行与此完全无关,所以列表为空。
Linux可以从磁盘读取字节,但它无法理解文件系统以读取其中的文件。 这通常是因为您没有配置内核以读取该文件系统类型。 我可以通过删除内核读取ext4文件系统的能力来达到这种情况: CONFIG_EXT4_FS=y 删除后,错误消息如下所示: <4>[0.585296] 所有分区列表: <4>[0.585913] fe00 524288 vda <4>[0.586123] 驱动程序:virtio_blk <4>[0.586471] 没有文件系统可以挂载根目录,尝试过: <4>[0.586497] squashfs <4>[0.586724] <0>[0.587360] 内核恐慌-不同步:VFS:无法在未知块(254,0)上挂载根文件系统 因此,Linux告诉我们它通过使用virtio_blk设备从磁盘中找到了一个vda分区。 但是,它无法读取该分区。它尝试了我们启用的唯一其他文件系统squashfs,但由于我们有一个ext4分区,所以无法工作。
您传递了错误的root=内核命令行选项。 这很简单,只需传递正确的选项!内核甚至会给出它所知道的选项列表! 例如,如果我们传递一个不存在的错误选项: root=/dev/vda2 内核会给出以下类型的错误: <4>[0.608475] 请附加正确的“root=”引导选项;以下是可用的分区: <4>[0.609563] fe00 524288 vda <4>[0.609723] 驱动程序:virtio_blk <0>[0.610433] 内核恐慌-不同步:VFS:无法在未知块(254,2)上挂载根文件系统 明确告诉我们“嘿:没有vda2,但有一个vda!” 这个例子也很好地解释了先前情况中的(0,0)(254,0)(254,2)的含义: (0,0):第一个数字0表示根本无法从磁盘读取 (254,2):254是分配给磁盘的某个ID。2是该ID内的分区,如/dev/vda2。而分区0表示
在Linux 5.4.3上进行了测试。

我遇到了这个问题,因为Linux头文件正在更新,而且电力断了。 我按照以下步骤进行恢复,
进入grub菜单并选择 高级选项 > 选择以前的内核并启动,
一旦进入终端,运行以下命令,
sudo dpkg --configure -a

从dpkg的man页面中提取的内容如下:
--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

嘿,新下载的但尚未配置的软件包已经可以使用了。

在我的情况下,这是因为我的Dell XPS 15 9550存在一种奇怪的问题,即无法在UEFI过程中将完整的initrd映像加载到RAM中。我也在另一个与此相关的问题上得到了答案。

https://askubuntu.com/a/1412273/170833


在我的情况下:
  • 这是由于升级到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驱动程序会出现这种情况。


除了Tomeu的指示之外,在chroot之前,我需要执行以下操作:
sudo mount --bind /dev /mnt/dev
此外,在chroot之后,还需要执行以下操作:
cp -r /usr/lib/i386-linux-gnu/pango /usr/lib/
从这里获取到的。

1Tomeu已经提到了将/dev挂载到/mnt/dev上。 - Lekensteyn

我遇到了一个问题,因为我的/boot分区已满,所以我的内核更新失败了。 我通过从GRUB菜单中启动旧的内核来解决了这个问题。
当我成功启动后,我开始清理旧的内核,但是我遇到了一些依赖问题,所以首先我必须卸载linux-server软件包。
apt-get remove linux-server
apt-get update
apt-get -f install
apt-get upgrade

然后我重新启动了,一切都正常工作了!