如何在更新后删除一个无法工作的内核?

我有一个简单的问题。在我更新了内核之后,除非我选择旧的内核,否则无法启动(卡在紫色屏幕上)。那么,我该如何使用Synaptic删除新的内核呢?而且,我应该如何安全地进行这个操作?我使用的是Quantal Quetzel版本。我的内核是3.5.0-40,可正常工作的内核是3.5.0-39。另外,我该如何阻止内核更新在更新管理器中显示?谢谢。

内核的版本是什么?你想要移除哪个版本? - mojo706
我的内核版本是3.5.0-40。 - Dave
1如果您希望答案包含有关如何防止新内核再次与其他更新一起安装的信息,您可能需要在问题中提及这一点。 - Eliah Kagan
我认为删除内核或停止内核更新是不明智的,因为它们通常是安全更新。请参考这个问题了解更好的做法。 - jarno
5个回答

如果最新的内核更新导致问题(原始问题),大多数人的最佳选择是回滚到之前正常工作的内核(前提是至少保留1个回滚选项)。

否则,使用@ZAB的解决方案通过apt软件包管理器安装指定版本的内核。

一般情况下,要删除不需要的过时内核,请打开终端会话并运行以下命令:

重要提示:如果/boot不在其独立分区上(空间不足),请避免显式清除旧内核。将它们视为升级出现问题(硬件驱动程序模块等)时的备份/回退选项。

有关内核升级和保留机制的好文章Ubuntu上的apt如何决定保留多少个旧内核

TL;DR: 查看由后置安装挂钩(脚本)生成的/etc/apt/apt.conf.d/01autoremove-kernels文件。

从Ubuntu 20.04 LTS运行的代码段5.4.0以便更好地理解:
// DO NOT EDIT! File autogenerated by /etc/kernel/postinst.d/apt-auto-removal
APT::NeverAutoRemove
{
   "^linux-.*-5\.4\.0-28-generic$";
   "^linux-.*-5\.4\.0-29-generic$";
   "^linux-.*-5\.4\.0-31-generic$";
   "^kfreebsd-.*-5\.4\.0-28-generic$";
   "^kfreebsd-.*-5\.4\.0-29-generic$";
   "^kfreebsd-.*-5\.4\.0-31-generic$";
   "^gnumach-.*-5\.4\.0-28-generic$";
   "^gnumach-.*-5\.4\.0-29-generic$";
   "^gnumach-.*-5\.4\.0-31-generic$";
   "^.*-modules-5\.4\.0-28-generic$";
   "^.*-modules-5\.4\.0-29-generic$";
   "^.*-modules-5\.4\.0-31-generic$";
   "^.*-kernel-5\.4\.0-28-generic$";
   "^.*-kernel-5\.4\.0-29-generic$";
   "^.*-kernel-5\.4\.0-31-generic$";
};

查找内核包名称

dpkg -l | grep linux-image

在撰写本文时,在amd64/x86_64架构上,镜像名称为:linux-image-$(uname -r)-generic

对于未签名的内核镜像,例如由nvidia驱动程序创建的镜像,镜像可能是:linux-image-unsigned-4.20.17-042017-generic

删除(彻底删除所有配置文件)

sudo apt-get purge linux-image-3.5.0-40-generic

如果您想要进行深度清理(包括残留的软件包配置...),请小心使用:

dpkg -l | awk '/^rc/ { print $2 }' | xargs apt-get purge -y
dpkg -l | awk '/^rc/ { print $2 }' | xargs dpkg -P

注意:对于Ubuntu 18.04 LTS或更高版本,您可能还希望删除任何相同版本的linux-moduleslinux-headers软件包以节省磁盘空间/保持系统精简。

更新 - 2020-05-21

明确清除旧内核可能会导致意外结果。除非/boot位于自己的小分区(空间不足),否则不建议这样做。

请参考@ZAB提出的方法来摆脱最新的内核更新引入的错误(破坏事物)。

Ubuntu维基关于删除旧内核

(我个人没有找到)没有类似Fedora/RHEL/CentOS的简单等效方法,可以通过设置installonly_limit=2告诉DNF或YUM仅保留最新的两个内核。


哦,我需要在那之后执行sudo update-grub吗? - Dave
软件包的postrm脚本会在您移除(清除)它时为您更新grub;-) - Terry Wang
谢谢Terry,问题解决了。现在我该如何让内核更新不再出现在更新管理器中呢? - Dave
请注意,在非LTS版本上,您可能没有linux-current-genericlinux-image-generic-lts-raring。请运行以下命令以更新软件包并进行升级:sudo apt-get update && apt-get dist-upgrade -y - Terry Wang
1这个恶意解决方案也将移除依赖包 linux-image-generic-*。系统将停止获取内核更新,并且之后的 autoremove 调用会删除旧的内核,这将完全破坏你的系统。 - ZAB
@ZAB 感谢你的指出,我会在帖子中加上注释。多年来,当我将HWE内核和AWS边缘滚动内核混合使用时,我确实发现了这个问题。不幸的是,我还没有找到Fedora / CentOS等效的installonly_limit=2方法。 - Terry Wang
@TerryWang这不是关于旧内核,也不是新问题。Debian/Ubuntu内核更新基础设施是建立在依赖关系之上的。你认为特定的内核映像如何登陆到你的系统?它被列为通用内核包中的一个依赖项。请查看我下面的回答,了解保留系统更新功能需要哪些步骤。 - ZAB
在Ubuntu上(而且很可能是Debian - 对不起,我不再是Debian的用户了),内核安装后钩子脚本会生成/etc/apt/apt.conf.d/01autoremove-kernels,该文件解释了默认内核升级和保留机制的工作原理。无论如何,如果磁盘空间不是问题,请让系统保持默认设置。 - Terry Wang
@TerryWang 问题是如何删除最新的有错误的内核。最新的内核作为主要发行包linux-image-generic-linux-generic-的依赖项进行安装和更新。如果您只删除最新的内核镜像和所有相关的软件包,这也会导致主要软件包被删除,之后一切都会崩溃,将没有更新,并且已安装的内核将变成孤立状态,并在随后的autoremove调用后被删除。 - ZAB
@ZAB 很好的观点,经过这么长时间终于解决了最初的问题;-) 所以从我的角度来看,最好的选择实际上是不要碰有问题的内核,而是使用备用选项,前提是你至少保留两个内核,而不需要去处理Debian方式的内核升级及其依赖关系。 - Terry Wang
@TerryWang 是的,将 DEFAULT=savedGRUB_SAVEDEFAULT=true 添加到 /etc/default/grub ,运行 sudo update-grub,重新启动并从高级引导选项子菜单中选择较旧的工作内核版本也是一种可能的解决方法...直到维护人员修复存储库中的错误。 - ZAB

不要盲目地按照接受的答案建议去做。这样会破坏你的系统。在按下“y”之前,请阅读apt工具给出的提示。
以下步骤是为了删除有问题的内核5.3.0-53,以此为例。之前正常工作的内核是5.3.0-51
首先运行sudo apt remove linux-image-5.3.0-53-generic --verbose-versions并阅读输出内容:
...
The following NEW packages will be installed:
  linux-image-unsigned-5.3.0-53-generic (5.3.0.53.109)
...

我们不需要这个软件包,按下 n 并要求同时删除它 sudo remove linux-image-5.3.0-53-generic linux-image-unsigned-5.3.0-53-generic --verbose-versions 现在会打印出以下内容:
....
The following packages will be REMOVED:
 linux-generic-hwe-18.04 (5.3.0.53.109)
 ....

这个软件包很重要,这是主要的分发软件包,提供内核更新。我们需要重新安装它的以前版本。因此,请按y并找到以前好的内核版本。在我的情况下,它是5.3.0.51.104。尝试重新安装它sudo apt install linux-generic-hwe-18.04=5.3.0.51.104 --verbose-versions,打印出以下内容:
The following packages have unmet dependencies:
 linux-generic-hwe-18.04 : Depends: linux-image-generic-hwe-18.04 (= 5.3.0.51.104)  but 5.3.0.53.109 is to be installed
                           Depends: linux-headers-generic-hwe-18.04 (= 5.3.0.51.104) but 5.3.0.53.109 is to be installed

让我们把这个我们不喜欢的新版本列入黑名单。编辑文件/etc/apt/preferences,并添加以下内容:
Package: linux-generic-hwe-18.04 linux-image-generic-hwe-18.04 linux-headers-generic-hwe-18.04
Pin: version 5.3.0.53.109
Pin-Priority: -1

重复执行sudo apt install linux-generic-hwe-18.04=5.3.0.51.104 --verbose-versions,检查输出,在我这种情况下一切都看起来正常,所以我同意并重新启动。


sudo apt-get remove linux-image-3.5.0-40*.

我建议你始终保留至少一个旧内核,以防你需要因为一些你现在可能无法预料的原因而启动它。

我知道要保留核心部分的重要性。除了这个之外,我还有另一个。谢谢,明天我会尝试并回复。 - Dave

我在启动过程中无法出现引导菜单, 但是我想要删除最新的内核 - 它导致火狐浏览器崩溃,剪贴板管理器停止工作, 也无法运行Timeshift还原。而且我没有获得引导菜单。
dpkg -l | grep linux-image

然后选择一个内核并使用(如有需要,连续使用)
sudo apt-get purge linux-image-unsigned-5.4.0-81-generic

dpkg -l 列表中选择适当的名称

sudo rm -r /lib/modules/5.4.0-81-generic

核心可能以各种不同的形式出现

sudo apt autoremove linux-headers-generic-hwe-18.04

警告屏幕可能会出现,告诉您正在删除当前内核,是否要中止?(回复“否”)

这个问题上其他的答案似乎都不正确。完整的答案是两者的混合,并进行了一些进一步的修正;
``` sudo apt-get purge *4.18.0-21* ```
其中`4.18.0-21`是您内核的版本号,请使用`ls /boot`命令查看。
对我来说,这就是解决方法(尽管需要运行类似的命令两次才能摆脱`/lib/modules/4.18.0-21-generic`)。请小心使用此命令,以确保不删除任何必需的内容。
有趣的是,在我的情况下,`linux-headers-generic-hwe-18.04`也被删除了。当我尝试重新安装它时,它又想要安装最新的内核,所以没有这么做。后来研究确实证明它是`4.18.0-21`内核的一部分。https://packages.ubuntu.com/bionic-updates/linux-headers-generic-hwe-18.04