这个问题开始于我今天安装 Ubuntu 更新时,有 125 个软件包需要更新。我在笔记本电脑上sudo apt update
依次运行apt list --upgradable
和sudo apt upgrade
,然后转向台式机继续其他工作。我注意到笔记本电脑的屏幕变暗了,当我看时,左上角有一个光标在闪烁,屏幕上没有其他内容。我尝试切换到另一个虚拟终端,但没有得到任何响应。我短暂地按了一下电源按钮看看是否会有反应,然后笔记本电脑关机了。当我重新启动笔记本电脑时,它返回到同一个闪烁的光标屏幕。不过,这次我能够通过按打开一个虚拟终端,Ctrl-Alt-F1
然后我登录了。我和技术支持人员一起查看了已安装的软件包列表,他认为问题在于视频驱动程序升级不当,从nvidia-driver-460
到nvidia-driver-470
,并说我们必须安装nvidia-driver-495
。
当我尝试安装该nvidia-driver-495
软件包时,我收到一条错误消息,说dpkg
已中断,我需要运行sudo dpkg --configure -a
,它看起来像是安装了 125 个软件包列表中所有其他待安装的软件包。然后我nvidia-driver-495
再次尝试安装,但提示缺少nvidia-driver-510
依赖项。然后我运行sudo apt install
安装nvidia-driver-510
,所有它是依赖项。我检查了 GUI 终端,Ctrl-Alt-F7
它仍然只有闪烁的光标。然后我运行sudo apt install nvidia-driver-495
,没有产生任何错误 - 但我仍然只有 GUI 终端上闪烁的光标。
我重启了笔记本电脑,然后
error: can't find command `hwmatch'
error: can't allocate initrd.
Press any key to continue...
随后出现内核崩溃。我重新启动笔记本电脑,只收到消息can't allocate initrd
,随后再次出现内核崩溃。当我再次重新启动笔记本电脑时,系统提供了 GRUB 菜单,并且能够使用之前的内核启动机器5.13.0-28
。
经过一番研究,我运行sudo update-initramfs -c -k 5.13.0-30-generic
并重启了机器——故障模式相同,最后重新引导到内核-28
继续。我又研究了一下,然后运行update-grub
、重启——又经历了同样的循环。
我尝试-30
从中删除内核文件/boot
,运行sudo apt update
后显示所有软件包都是最新的,运行后sudo apt remove
删除所有-30
文件,再次运行update-grub
- 并apt update
一直坚持所有软件包都是最新的:就好像它知道它安装了新内核版本,但后来没有注意到它何时被删除。我重新启动了笔记本电脑,这是成功的,因为它正在启动之前工作的-28
内核 - 但apt update
仍然不知道内核升级。我sudo apt-get remove --purge
使用文件列表运行-30
,这只清除了配置文件,因为软件包本身已经被删除 - 并且apt update
仍然对新内核一无所知。
我运行了apt list --installed | grep linux-image
,列出了仍然安装的两个内核,-27
然后-28
。我运行了apt-cache search linux-image|grep 13|grep generic
,得到了一个简短的内核列表,可以安装。然后我运行sudo apt-get install linux-headers-5.13.0-30-generic linux-hwe-5.13-headers-5.13.0-30 linux-image-5.13.0-30-generic linux-modules-5.13.0-30-generic linux-modules-extra-5.13.0-30-generic
重新安装所有必需的软件包。部分输出是
/etc/kernel/header_postinst.d/dkms:
* dkms: running auto installation service for kernel 5.13.0-30-generic
Kernel preparation unnecessary for this kernel. Skipping...
这让我怀疑是否错过了一个必要的步骤。其他一切看起来都很好,所以我重启了机器——然后回到
error: can't find command `hwmatch'
error: can't allocate initrd.
hwmatch
和内核崩溃。我最终通过遵循以下建议,通过另外几次重启解决了缺失问题https://www.linux.org/threads/error-cant-find-command-hwmatch-during-boot.32618/- 复制到我必须创建的目录/usr/lib/grub/i386-pc/hwmatch.mod
中。/boot/efi/efi/grub
我注意到的一件事是该-30
initrd
图像比其他图像大 50% 以上:
-rw-r--r-- 1 root root 99M Mar 2 16:41 initrd.img-5.13.0-27-generic
-rw-r--r-- 1 root root 99M Mar 2 16:57 initrd.img-5.13.0-28-generic
-rw-r--r-- 1 root root 156M Mar 2 21:41 initrd.img-5.13.0-30-generic
这可能是问题的一部分,也可能是问题的后果,我不确定。
sudo apt-get remove --purge
再次运行删除所有软件包后-30
,我运行了sudo find / -xdev -name "*5.13.0-30*"
只返回
/var/cache/apt/archives/linux-headers-5.13.0-30-generic_5.13.0-30.33~20.04.1_amd64.deb
/var/cache/apt/archives/linux-modules-extra-5.13.0-30-generic_5.13.0-30.33~20.04.1_amd64.deb
/var/cache/apt/archives/linux-image-5.13.0-30-generic_5.13.0-30.33~20.04.1_amd64.deb
/var/cache/apt/archives/linux-hwe-5.13-headers-5.13.0-30_5.13.0-30.33~20.04.1_all.deb
/var/cache/apt/archives/linux-modules-5.13.0-30-generic_5.13.0-30.33~20.04.1_amd64.deb
我不认为这些文件是问题所在,但在尝试寻找“此内核不需要准备内核”消息的其他原因失败后,我曾经find
删除过它们。sudo apt-get install
然而,当我再次运行时,我得到了相同的“不需要准备内核”消息 - 重新启动又让我遇到了这个error: can't allocate initrd
问题。
现在我-30
又删除了内核,这样当我想重新启动笔记本电脑时就不必费力了,但我会喜欢安装新内核,我确信它有一些安全修复。
我需要做什么才能让 Ubuntu 忘记内核-30
曾经安装过,以便我可以成功将其安装到可启动状态?