更新后如何删除非工作内核?

Dav*_*ave 20 package-management synaptic uninstall boot kernel

我有。一个简单的问题。更新内核后,除非选择旧内核,否则无法启动(卡在紫色屏幕上)。那么如何使用突触删除新内核。我如何安全地做到这一点?我在 Quantal Quetzel。我的内核是 3.5.0-40。工作内核是 3.5.0-39。另外,如何阻止内核更新出现在更新管理器中?谢谢。

Ter*_*ang 29

如果最新的内核更新破坏了事情(原始问题),对大多数人来说,最好的选择是回退到以前的工作内核(前提是您至少保留 1 个回退选项)。

否则,使用@ZAB的解决方案来安装通过apt包管理器提供的内核版本的特定版本。

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

重要提示:如果/boot不在它的小分区上(空间不足),请避免明确清除旧内核。当升级引入问题(硬件驱动程序模块等)时,请考虑它们的备份/回退选项。

良好的阅读内核升级和保护机制如何apt在Ubuntu决定多少老的内核,以保持

TL;DR:看看/etc/apt/apt.conf.d/01autoremove-kernels由 postinstall hook(脚本)生成的文件。

运行 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$";
};
Run Code Online (Sandbox Code Playgroud)

查找内核包名

dpkg -l | grep linux-image
Run Code Online (Sandbox Code Playgroud)

在撰写本文时,关于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
Run Code Online (Sandbox Code Playgroud)

如果您想进行深度清理(剩余的包配置...),请谨慎使用:

dpkg -l | grep linux-image
Run Code Online (Sandbox Code Playgroud)

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

更新 - 2020-05-21

显式清除旧内核可能会导致意外结果。不推荐,除非/boot是在它自己的小分区上(空间不足)。

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

关于删除旧内核的 Ubuntu wiki

通过设置installonly_limit=2告诉 DNF 或 YUM 只保留最新的 2 个内核,没有(我个人没有发现)简单的等效于 Fedora/RHEL/CentOS 的方法。


ZAB*_*ZAB 8

不要盲目地按照已接受答案中的建议进行操作。它会破坏你的系统。apt在按 之前请阅读实用程序告诉您的内容y

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)
...
Run Code Online (Sandbox Code Playgroud)

我们不需要这个包,请按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)
 ....
Run Code Online (Sandbox Code Playgroud)

这个包很重要,这是为我们提供内核更新的主要分发包。我们需要重新安装它的以前版本。所以按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
Run Code Online (Sandbox Code Playgroud)

让我们将这个我们不喜欢的新版本列入黑名单。编辑文件/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
Run Code Online (Sandbox Code Playgroud)

重复sudo apt install linux-generic-hwe-18.04=5.3.0.51.104 --verbose-versions检查输出,就我而言,一切似乎都很好,所以我同意并重新启动。