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

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

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

答案1

至于回答原因,请参阅文件/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,但请记住 - 这样做需要你自担风险

答案2

对我来说,它有助于安装最新的 (X)ubuntu (15.10)。在早期版本中,内核包可能被标记为手动安装,至少如果使用软件更新程序安装的话,这样就sudo apt-get autoremove --purge无法删除它们。有关于此问题的错误报告:错误 #1175637错误 #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选项运行。

或者,你可以使用linux 清除更有选择性地清除旧内核,即使它们是手动安装的。

答案3

首先尝试删除旧的内核包,但如果 /boot/initrd.img 文件仍然存在,那么这对我有用:

删除 /boot/initrd.img-4.8.0-39-generic

sudo update-initramfs -d -k 4.10.0-37-generic

一次删除一个 initrd.img 文件。

相关内容