为什么 Ubuntu 不自动删除旧内核?

Reg*_*ser 96 kernel

我想知道为什么 Ubuntu 不会自动删除旧内核。

当然没有什么是完美的,事情可能会出错,所以如果更新不起作用,拥有一个备份内核可能会很棒。但是,只保留最新内核和最新内核之前的内核并删除所有旧内核也足够了。

Ubuntu 不会自动执行此操作有什么原因吗?

Rin*_*ind 44

Ubuntu 不会自动执行此操作有什么原因吗?

我只能看到一个原因:它不能完美地工作;目前没有明确的方法来确定“旧内核”的定义是什么。“旧”并不意味着“未使用”,也不意味着“不需要”。任何错误都会杀死用户的机器。

所以到目前为止,手动方法是首选,因为这将移除的权力交到了用户的手中。


此结论的资源:

Ubuntu WIKI:删除旧内核的建议

Last-good-boot 在 Intrepid/8.10 final 中完全实现,但是它已被禁用,因为它被认为不够稳定。该设置是文件 /etc/default/kernel-helper-rc.conf 中的一行。


Launchpad:aptitude 是否应该提供删除旧内核版本的方法?

apt-get具有自动删除功能,可卸载所有不需要作为依赖项且未手动安装的软件包。从 Ubuntu 14.04 开始,所有过时的内核和头文件都应该自动标记为不再需要,因此可以使用 apt-get autoremove 命令清除。(有报道称这还没有完全奏效)。我不知道 aptitude 中有一个类似于 apt-get 的 autoremove 的功能。


Ubuntu-devel:发行版提供的清理旧内核的机制

虽然同意自动清理会很有帮助并且似乎很合适,但存在一个轻微的潜在陷阱(或两个)。内核有很多种,人们可能有意也可能无意并行安装这些内核。此外,各种版本有时会有一组不断变化的依赖包。有一段时间这应该只是 linux-backports-modules(曾经有 linux-ubuntu-modules 和 linux-restricted-modules)。虽然这不是什么大问题。从模式匹配的角度来看,generic-pae 内核有点麻烦,因为它们往往会破坏“使用“-”分割的最后一部分来获得风味”。但无论如何,我认为主要问题是各种口味,所以自动清理应该保留每个的最后三个,即使这可能会留下更多的内核。

  • 它至少应该是一个选项,能够仅启用我的 .02 自动删除 (3认同)
  • “旧”不是意味着“不是要启动的最后两个(或三个)内核之一”吗?除非你安装了两行不同的内核?嗯,我想您可能正在使用旧版本的内核在另一个分区上进行不同的安装。但是,如果您是某种放克精灵,则应该有一个默认状态会被取消。或者它至少应该在默认情况下在 /boot 上分配足够的空间,这样你就不用担心很多年了。否则奶奶永远不会运行Linux。 (3认同)

小智 22

这里发生了两件事:

  1. 新内核是全新的软件包,而不是具有较新版本号的更新软件包,因此安装新内核映像不会替换任何旧内核映像。它们共存。

  2. Ubuntu 使用了一堆 apt 魔法来保护最后两个内核版本免受 'apt-get autoremove'(最新的和上次启动的)的影响。有关详细信息,请参阅 /etc/apt/apt.conf.d/01autoremove-kernels。

这一切意味着一旦您重新启动到最新的内核,'apt-get autoremove' 应该删除除当前和上次启动的内核包之外的所有内容。

旧内核仍然在 /boot 中堆积,因为默认情况下在 Ubuntu 中没有启用 autoremove - 您必须经常手动运行它,或者必须启用它。

这可能会在 16.04 中更改 -无人值守升级包的错误修复将默认启用旧内核的自动删除。


小智 20

这个脚本将完成这项工作。它将删除所有未使用的内核。

sudo dpkg -l 'linux-*' | sed '/^ii/!d;/'"$(uname -r | sed "s/\(.*\)-\([^0-9]\+\)/\1/")"'/d;s/^[^ ]* [^ ]* \([^ ]*\).*/\1/;/[0-9]/!d' | xargs sudo apt-get -y purge
Run Code Online (Sandbox Code Playgroud)

除此之外,不删除内核一定是一件相当新鲜的事情。由于旧的内核垃圾,我有一个 Ubuntu 14 系统一个接一个地运行到这个完整启动分区的问题。

它会使经验不足的用户的生活变得极其复杂。这实际上是一个菜鸟陷阱。规范应该解决这个问题。

  • 在没有`| 的情况下运行这个脚本是明智的。xargs ...` 部分检查将要删除的软件包,然后再实际删除它们:`sudo dpkg -l 'linux-*' | sed '/^ii/!d;/'"$(uname -r | sed "s/\(.*\)-\([^0-9]\+\)/\1/")"'/ d;s/^[^ ]* [^ ]* \([^ ]*\).*/\1/;/[0-9]/!d'` (7认同)
  • 此脚本有潜在危险:当我进行系统更新以安装新内核,然后在重新启动之前运行此脚本时,将删除新内核而不是旧内核。我不想说这是一个糟糕的脚本,只是在调用它时必须小心。 (3认同)
  • @PeterM,在`dpkg` 前面不需要`sudo`。 (2认同)