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

Blu*_*ber 58 apt kernel

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

Ser*_*nyy 41

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

在此处输入图片说明

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

在此处输入图片说明

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

更新:

/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
Run Code Online (Sandbox Code Playgroud)

因此,如果您比较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";
  };
Run Code Online (Sandbox Code Playgroud)

因此,您可以将这些注释掉,它允许您使用 自动删除内核apt-autoremove,但请记住 - 这样做的风险由您自己承担

  • 很有意思!我的“/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` 之外的其他内容保留了这些版本中间版本,对吧? (2认同)
  • @BlueBomber,`apt-get autoremove` 没有删除`/etc/apt/apt.conf.d/01autoremove-kernels` 中未列出的内核的原因是这些内核被标记为手动安装;请参阅我的 [答案](http://askubuntu.com/a/712836/21005)。 (2认同)

jar*_*rno 12

对我来说,它有助于安装最新的 (X)ubuntu (15.10)。在早期版本中,内核包可能被标记为手动安装,至少,如果使用 Software Updater 安装,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选项运行。

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

  • `apt-mark` 对我有用,希望我能投票 10 次:P (2认同)