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

我想知道为什么Ubuntu不会自动删除旧的内核。
当然,没有什么是完美的,事情可能会出错,所以如果更新不起作用,保留一个备份内核可能是很好的。但只保留最新的内核和上一个版本,并删除所有旧的内核也足够了。
难道Ubuntu不自动执行这个操作有什么原因吗?

看看以下是否足够好。我整合了一些资源,关于应该被视为删除的内容存在很多疑问。 - Rinzwind
有趣的是,其他Linux系统确实会删除旧的内核... - Rinzwind
1@Rinzwind 删除?Arch 只是覆盖它们 - 然后有些东西在重新启动之前仍然无法使用(比如 iptables)。 - muru
3为什么Ubuntu不自动删除旧的内核?它实际上是这样做的。"我想知道为什么Ubuntu不会手动删除旧的内核。" 对于这个,我不知道你具体指的是什么。 - Braiam
Fedora会保留可配置数量的内核,当安装新内核时,会删除最旧的内核,但保留当前正在运行的内核。 - Davidmh
@Braiam 抱歉,那是个打错字。 - Registered User
1对我来说,每隔两个月就收到“磁盘空间不足”的消息,然后不得不解决这个相当技术性的问题,真是太愚蠢了。我真的理解为什么Ubuntu不适合非技术用户使用。 - sunew
2@sunew 是的,这个问题完全毁了我父母运行12.04版本作为完整LTS期间的机器-填满了磁盘的inode表!这里应该有一个明智的默认设置,技术用户(刻意安装不同内核)可以轻松覆盖。 - artfulrobot
@EliahKagan:这个问题及其答案的意图和范围是不同的。 - David Foerster
sudo apt 安装 byobu && sudo purge-old-kernels,参考 http://ubuntuhandbook.org/index.php/2016/05/remove-old-kernels-ubuntu-16-04/ - Akira Yamamoto
8个回答

有没有一个原因,为什么Ubuntu不会自动执行这个操作?
我只能看到一个原因:它不能完美地工作;目前没有一种清晰的方式来决定“旧内核”的定义。 “旧”并不意味着“未使用”,也不意味着“不需要”。而且任何错误都可能导致用户的机器崩溃。
所以到目前为止,手动方法更受欢迎,因为这样可以让用户自己决定是否删除。
这个结论的资源:
Ubuntu WIKI:删除旧内核的提议 最后一个良好启动已经在Intrepid/8.10 final中完全实现,但由于被认为不够稳定,所以已经被禁用了。设置位于文件/etc/default/kernel-helper-rc的一行中。
启动器: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内核有点麻烦,因为它们倾向于破坏“使用“-”分割后的最后一部分作为内核版本”的规则。但无论如何,我认为主要问题在于各种不同的内核版本,所以自动清理应该保留每个版本的最后三个,即使这样可能会留下更多的内核。

我同意Ubuntu不应该自动删除旧内核。我曾经遇到过一种情况,新内核导致某些软件出现严重问题;在问题修复之前,我不得不保留最旧的正常工作的内核。当然,我会避免使用apt-get autoremove命令。 - Paddy Landau
3至少应该有一个选项可以启用自动删除 只是我的个人意见。 - mBardos
@mBardos 有一种方法:Ubuntu Tweak 可以实现这个功能。 - Rinzwind
3“old” 不是指“不是最后2个(或3个)内核之一吗?”除非您安装了两行不同的内核?嗯,我想您可能正在另一个分区上使用旧版本的内核进行不同的安装。但是,如果您是某种灵巧的巫师,应该有一个默认状态被取消的状态。或者至少默认情况下应该分配足够的空间在/boot上,这样您就不需要担心多年了。否则,老奶奶永远不会运行Linux。 - intuited
@PaddyLandau:请查看@andrewdevans的回答。我刚刚执行了autoremove命令,dpkg --get-selections | grep -v deinstall | grep linux显示已安装三个内核。 - idbrii
@idbrii,这很有意思,因为上次我尝试时,它确实删除了除最近两个之外的内核。我想知道我们的系统之间可能有什么不同之处? - Paddy Landau
@PaddyLandau 我正在使用最新的LTS版本。也许这意味着更加谨慎,并且默认配置了不同的行为?我还剩下三个内核安装,但它们并不是连续的版本(类似35、51、52)。我猜想这些是我最后启动的三个内核,但我不确定。我不经常使用这台机器,所以更新不是很频繁。也许你的内核没有通过某种质量措施,而我的内核由于我使用较少而没有出现问题? - idbrii
目前没有明确的方法来决定什么是旧内核的定义。嗯?你知道apt autoremove是做什么的吗?猜猜看?"OLD"只是指内核的修订版本较低于其他版本。Autoremove会根据/etc/apt/apt.conf.d/01autoremove-kernels文件,删除相同主要版本的旧版本。从来没有一个系统脚本/二进制文件来处理内核清理,只有APT。因此,你会在谷歌上看到像这个链接(https://help.ubuntu.com/community/RemoveOldKernels#Safely_Removing_Old_Kernels)中提供的1万个答案。我认为这不是最好的管理方式。 - B. Shea
@bshea 用户手动执行,而不是自动执行,无论autoremove中是否有"auto"一词。正如您引用的那部分之后所述:旧的且从未启动过的内核并不意味着它是一个不需要的内核。 - Rinzwind
我从未提到过“自动”。老是指老。那你会怎么称呼它呢?- 我只是说它除了老之外没有其他意思。apt autoremove会删除旧内核。你似乎想纠缠于措辞上的问题。 - B. Shea
@bshea 不对。必须要挑刺。你不想删除旧内核,而是想删除不需要的内核。这是一个具体情况下的决定,而不是像问题所问的那样自动化的。为什么Ubuntu不会自动删除旧内核。 - Rinzwind

这里有两件事情正在进行:

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

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

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

旧内核仍然在 /boot 中累积,因为 Ubuntu 默认未启用 autoremove - 您必须定期手动运行它,或者必须启用它。

这可能会在 16.04 中发生变化 - 对于unattended-upgrades软件包的bugfix将默认启用旧内核的自动删除。


这个脚本会完成任务。它将删除所有未使用的内核。
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

除此之外,不删除内核应该是一个相对较新的事情。我有一个又一个运行Ubuntu 14系统的问题都是由于旧内核垃圾导致启动分区满了。
这会让经验不足的用户的生活变得非常复杂。实际上,这是一个新手陷阱。Canonical 应该解决这个问题。

3这个脚本有潜在的危险性:当我进行系统更新并安装新内核后,在重新启动之前运行这个脚本,新内核将被删除而不是旧的。我不想说这是一个糟糕的脚本,只是要小心何时调用它。 - daniel kullmann
谢谢!"0 个升级,0 个新安装,48 个要删除的,5 个未升级。完成此操作后,将释放 3,322 MB 的磁盘空间。" - thenickdude
7在实际删除软件包之前,最好先运行此脚本的| xargs ...部分以检查即将被删除的软件包:sudo dpkg -l 'linux-*' | sed '/^ii/!d;/'"$(uname -r | sed "s/\(.*\)-\([^0-9]\+\)/\1/")"'/d;s/^[^ ]* [^ ]* \([^ ]*\).*/\1/;/[0-9]/!d' - PeterM
2@PeterM,dpkg前面不需要加上sudo - jarno
关于脚本的问题有一个单独的问答,请点击这里 - jarno
这个脚本的目的是要删除我最新更新的内核。有人可以确认一下吗? - We are Borg
@WeareBorg 当然,它旨在删除除当前启动的内核之外的所有内核。 - jarno

简单的方法是使用ubuntu-tweak来删除旧内核。您选择清理标签,然后勾选旧内核框。这将给您一个内核列表,它认为您不再需要。您可以选择全部并点击清理,过一段时间后,工作就完成了。由于我比较紧张,所以我使用uname -a命令检查了我正在运行的内核,但它没有出现在列表中。这个方法适用于我妻子的笔记本电脑(引导分区相对较小,并显示警告)和我的笔记本电脑(正常运行)。大家都同意这样做是安全的吗?

哦,自动删除内核是可以安全地完成的;只是负责实现这一点的人不太有信心声称他能为每个人决定删除特定系统的内核。老旧并不意味着不受欢迎 ;) - Rinzwind
正如@Rinzwind所指出的,这里实际上有两个问题。如何以及何时/是否去做。我曾经使用ubuntu-tweak,它能够工作,但对于我使用的KDE并不是很友好。现在,每当我得到一个内核更新时,我会进入muon图形界面包管理器,搜索内核,找到要删除的那个,将其最后的数字(例如36)添加到内核 - 内核36,按已安装进行排序,并选择要删除的2或3个软件包。这很容易。这也是手动操作的,所以如果我编译了任何仍需要旧内核的驱动程序模块,那个内核在我准备好之前都不会被删除。 - Joe


我认为Ubuntu 15.10的最新版本可以自动删除旧内核,只需编辑/etc/apt/apt.conf.d/50unattended-upgrades文件: 将以下行更改为:
Unattended-Upgrade::Remove-Unused-Dependencies "true";
不过,我还没有测试过这个功能。

请查看有关该问题的错误报告 - jarno
还可以看看我相关的答案 - jarno

我遇到了一个无法安装软件的问题。Apt-get无法安装linux-headers,报告磁盘已满。$ df -i 报告IUse%达到100%:磁盘有剩余空间,但是inode已用尽。$ sudo dpkg --configure -a 失败,$ sudo apt-get -f install$ sudo apt-get autoremove 也都失败。
当我手动从 /usr/src 中删除了几个旧的内核文件夹时,问题得到解决 - 只需使用 $ rm 或 shift-delete 删除这些文件夹。这样释放了足够的inode空间,使得 $ apt-get -f install 完成。
之后,我只剩下了10个Linux内核。我运行了 $ sudo apt-get autoremove,删除了1.4GB的文件。这让人不禁问:真的吗?真的吗?但说实话,这是运行用户友好系统的正确方式吗?

是的,确实如上所述,你可能会意外地需要那个较旧的内核。 - Reinier Post
你试过用 dpkg --purge 命令来清除一些内核吗? - jarno

Ubuntu只会自动删除不再需要或存在安全风险的项目...所以我认为这是出于安全考虑的原因。假设由于某种奇怪的原因,一个新的内核变得不安全...那么在新内核修复之前,您将被重定向回旧内核。此外,新的内核可能会带来一些变化,因此有些内核是可选择的。例如,将14.04.1更新到14.04.2时,您可以选择使用新内核,但是当新的长期支持版本15.04于今年4月发布时,您的内核将自动更新。所以我认为这是出于安全考虑。
但是,如果您想要删除它,请尝试运行以下命令行。
sudo apt-get autoremove

这应该删除任何不需要的软件,比如你的旧内核,如果没有,请尝试。
sudo apt-get remove (kernels-name)

1假设由于某种奇怪的原因,一个新的内核变得不安全...那么在新内核修复期间,你将会被临时重定向回旧的内核。您对这个说法有什么来源吗? - John Kugelman
3@JohnKugelman 不会发生这种情况。会发布一个新的软件包修复此问题,人们会升级到新版本。如果遇到极端无法解决的问题,会将旧版本内核打包并赋予更高的版本号(可能是时期变化),以实现升级。 - hobbs
"...当新的LTS版本15.04发布时..." - 15.04不会是LTS版本,除非Canonical进行了重大的支持转变,而我没有听说过这样的消息。 - iGadget
实际上,15.04将成为新的LTS版本,但与所有发布版本一样,直到新系统发布后的特定日期之前,它才会成为新的标准LTS版本...我相信Canonical这样做是因为他们希望确保系统完全安全...当我输入这些文字时,15.04已经发布了,所以再过几个月它就会成为LTS版本...我计划在那之前不升级...反正变化不大。 - Tactux
@TAC_Tux,Ubuntu的LTS版本不是这样的。你可能在想Debian项目的做法。这是当前的Ubuntu发布计划:https://wiki.ubuntu.com/LTS - Martijn Heemels
@Martijn Heemels 哈哈,是的,我发现这个帖子非常古老,在那个时候我对Canonical和Ubuntu的发布系统了解不足。下一个LTS将在明年的16.04版本中运行。 - Tactux