为什么不apt-get autoremove删除我的旧内核?

我的启动分区在SSD上,因此它没有超过8个安装的内核版本的空间,并且最终一些内核更新将无法安装,因为我的启动分区充满了旧版本。 关于如何删除旧版本(甚至如何自动化过程)有很多问题,但我的问题很简单: 为什么apt-get autoremove不能自动检测并自动删除它们,有没有办法让我自己做它这样做 ? 我的意思是, apt-get无论如何都是安装它们的,所以它知道它们,所以它为什么选择留下所有旧版本?

至于回答原因,请参阅文件/etc/apt/apt.conf.d/01autoremove-kernels

在此处输入图像描述

正如您所看到的,apt被告知永远不会自动移动内核,正如另一个(脚本)文件/etc/kernel/postinst.d/apt-auto-removal 。 这是:

在此处输入图像描述

如果你的脚本足够好,你可以编辑它只保存几个内核,虽然我无法帮助你,因为我的脚本fu不是那么好

更新:

/etc/kernel/postinst.d/apt-auto-removal有这一部分:

 if [ "$latest_version" != "$installed_version" ] \ || [ "$latest_version" != "$running_version" ] \ || [ "$installed_version" != "$running_version" ] then # We have at least two kernels that we have reason to think the # user wants, so don't save the second-newest version. previous_version= fi 

因此,如果您比较01autoremove-kernels文件和uname -r的输出,您将意识到当前正在运行的内核以及之前的最新内核将永远不会被该脚本删除。 原来是另一个文件/etc/apt/apt.conf.d/01autoremove ,其中有行:

  APT { NeverAutoRemove { "^firmware-linux.*"; "^linux-firmware$"; }; VersionedKernelPackages { # linux kernels "linux-image"; "linux-headers"; "linux-image-extra"; "linux-signed-image"; # kfreebsd kernels "kfreebsd-image"; "kfreebsd-headers"; # hurd kernels "gnumach-image"; # (out-of-tree) modules ".*-modules"; ".*-kernel"; "linux-backports-modules-.*"; # tools "linux-tools"; }; 

所以你可以对这些进行评论,它会允许你使用apt-autoremove自动删除内核,但要记住 – 这样做需要你自担风险

对我来说,它有助于安装最新的(X)ubuntu(15.10)。 在早期版本中,内核包可能被标记为手动安装,至少如果使用软件更新程序安装,则sudo apt-get autoremove --purge无法删除它们。 有关于该问题的错误报告: Bug#1175637 , Bug#1439769

在早期版本中,您可以尝试标记由sudo apt-mark auto $(apt-mark showmanual | grep -E "^linux-([[:alpha:]]+-)+[[:digit:].]+-[^-]+(|-.+)$")自动安装的内核包sudo apt-mark auto $(apt-mark showmanual | grep -E "^linux-([[:alpha:]]+-)+[[:digit:].]+-[^-]+(|-.+)$")然后运行sudo apt-get autoremove --purge以查看,如果它有所不同。 该命令仍然不应该删除/etc/apt/apt.conf.d/01autoremove-kernels中显示的内核包,但最安全的是apt-get autoremove使用--dry-run选项运行apt-get autoremove

更新:提到的链接似乎不再起作用。

这是Dustin Kirkland几年前编写的带有故障安全的内核清除脚本的链接。 它应该仍然适用于12.04。

[删除非工作链接]

我打算在我的14.04机器上测试它,但似乎我不再遇到那里的问题(最后通过常规更新频道修复?)。 因此,如果在他/她的机器上有许多旧内核的人想要测试它,请做并分享您的发现。

 KERNELS1=$(uname -r|cut -d - -f1-2); KERNELS2=$(for i in $(ls -l /vmlinuz*|awk '{print $(NF-0)}'); do echo $i |xargs basename|cut -d - -f2-3; done); dpkg -l|egrep 'linux-headers-[0-9]\.[0-9]\.[0-9]-[0-9]|linux-image-[0-9]\.[0-9]\.[0-9]-[0-9]'|egrep -v ''"${KERNELS1}"'|'"${KERNELS2}"''|awk '{print $2}'|xargs apt-get purge -y 

我在Ubuntu 12.04上使用它!

这将保持当前运行的内核以及最新安装的内核(vmlinuz)和之前的内核(vmlinuz.old)。 将删除所有其他内核和标头。