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


53

我的启动分区位于SSD上,因此无法容纳大约8个以上已安装内核版本,最终由于我的启动分区中充满了旧版本,因此某些内核更新将无法安装。关于如何删除旧版本(甚至如何使过程自动化),还有很多问题,但我的问题很简单:为什么不apt-get autoremove自动检测并删除它们,有没有办法做到这一点?我的意思是,apt-get无论如何都安装了它们,因此它了解它们,那么为什么选择保留所有旧版本呢?



1
在大多数情况下,Autoremove 确实会删除旧内核。内核会累积,因为默认情况下系统不会自动运行autoremove。这是无人值守升级中的设置,可以更改。当先前排队的apt操作(例如安装新内核)失败(由于空间不足)时,Autoremove无法删除旧内核。请参阅bugs.launchpad.net/bugs/1357093,获取无人值守升级的补丁程序,该补丁程序开始自动删除旧内核。
user535733

Answers:


36

至于回答为什么,请参考文件 /etc/apt/apt.conf.d/01autoremove-kernels

在此处输入图片说明

如您所见,正如另一个(脚本)文件所告诉的,apt被告知永不自动删除内核/etc/kernel/postinst.d/apt-auto-removal。这里是:

在此处输入图片说明

如果您手动安装2个选择的内核,即第一个和当前内核,则apt-autoremove只会删除您没有手动安装的旧版本,因此,您将始终拥有这2个选项以及最新的选项。

更新:

在其中/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,但请记住,这样做需要您自担风险


1
很有意思!我的/etc/apt/apt.conf.d/01autoremove-kernels行很多,但其中只有两个版本:3.13.0。{39,43}。但是dpkg -l linux-*列出了四个版本,即3.13.0。{39,40,41,43},所以除了/etc/apt/apt.conf.d/01autoremove-kernels保留那些中间版本以外,还有其他什么吧?
BlueBomber 2014年

1
TL:DR:01autoremove是您想要的文件,01autoremove-kernels可能只是一种保护,因此apt不会删除当前安装的内核和最新内核(以防万一最新螺丝钉

1
除非我01autoremove读错了,否则它只是防止自动删除依赖包,例如linux-image-extra。更改它不会影响是否linux-image-3.16.0-31-generic自动删除。其中的所有模式均与我们要自动删除的软件包名称不匹配。
彼得·科德斯

1
@PeterCordes不要在中删除或注释行/etc/apt/apt.conf.d/01autoremove。这不会帮助您自动删除旧版本的内核软件包,但可能会产生不良影响。该文件不能自动删除,linux-image-extra但可以匹配该NeverAutoRemove部分中的正则表达式的程序包。
jarno 2015年

2
@BlueBomber,apt-get autoremove不删除未列出的内核的原因/etc/apt/apt.conf.d/01autoremove-kernels是,这些内核被标记为手动安装;看我的答案
jarno 2015年

8

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

在较早的发行版中,您可以尝试标记自动安装的内核软件包,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选项运行是最安全的。


哦,autoremove命令倾向于删除太多内核,请参见Bug#1440608
jarno 2015年

1
apt-mark做的伎俩我,希望我能给予好评的10倍:P
迈克·格里森JR服装设计师
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.