apt-get 的自动删除功能不一致

apt-get 的自动删除功能不一致

我目前正在清理几台服务器。
我注意到一些奇怪的行为:

当我这样做时,apt-get autoremove它会列出几个在我继续时要自动删除的标题,有时它会保留文件/文件夹/usr/src,有时它们会被删除。

有什么原因吗?或者我该从哪里开始搜索?谷歌搜索没有找到太多结果。

即使自动删除功能给出“0 删除”,但标题仍然保留的机器

ubuntu@acc-ws-website-1:~$ sudo apt-get autoremove
Reading package lists... Done
Building dependency tree
Reading state information... Done
0 upgraded, 0 newly installed, 0 to remove and 65 not upgraded.

ubuntu@acc-ws-website-1:~$ ls -lart /usr/src
total 108
drwxr-xr-x 10 root   root   4096 Apr 16  2014 ..
drwxr-xr-x 24 root   root   4096 Jul  8  2014 linux-headers-3.13.0-24
drwxr-xr-x  7 root   root   4096 Jul  8  2014 linux-headers-3.13.0-24-generic
drwxr-xr-x  3 ubuntu ubuntu 4096 Apr 17  2015 ixgbevf-2.14.2
drwxr-xr-x 24 root   root   4096 Oct  6  2015 linux-headers-3.13.0-65
drwxr-xr-x  7 root   root   4096 Oct  6  2015 linux-headers-3.13.0-65-generic
drwxr-xr-x 24 root   root   4096 Oct 20  2015 linux-headers-3.13.0-66
drwxr-xr-x  7 root   root   4096 Oct 20  2015 linux-headers-3.13.0-66-generic
drwxr-xr-x 24 root   root   4096 Nov  5  2015 linux-headers-3.13.0-67
drwxr-xr-x  7 root   root   4096 Nov  5  2015 linux-headers-3.13.0-67-generic
drwxr-xr-x 24 root   root   4096 Nov 10  2015 linux-headers-3.13.0-68
drwxr-xr-x  7 root   root   4096 Nov 10  2015 linux-headers-3.13.0-68-generic
drwxr-xr-x 24 root   root   4096 Dec  1  2015 linux-headers-3.13.0-70
drwxr-xr-x  7 root   root   4096 Dec  1  2015 linux-headers-3.13.0-70-generic
drwxr-xr-x 24 root   root   4096 Dec  2  2015 linux-headers-3.13.0-71
drwxr-xr-x  7 root   root   4096 Dec  2  2015 linux-headers-3.13.0-71-generic
drwxr-xr-x 24 root   root   4096 Dec 17  2015 linux-headers-3.13.0-73
drwxr-xr-x  7 root   root   4096 Dec 17  2015 linux-headers-3.13.0-73-generic
drwxr-xr-x 24 root   root   4096 Dec 19  2015 linux-headers-3.13.0-74
drwxr-xr-x  7 root   root   4096 Dec 19  2015 linux-headers-3.13.0-74-generic
drwxr-xr-x 24 root   root   4096 Feb  2  2016 linux-headers-3.13.0-77
drwxr-xr-x  7 root   root   4096 Feb  2  2016 linux-headers-3.13.0-77-generic
drwxr-xr-x 24 root   root   4096 Feb 23  2016 linux-headers-3.13.0-79
drwxr-xr-x  7 root   root   4096 Feb 23  2016 linux-headers-3.13.0-79-generic
drwxr-xr-x 24 root   root   4096 Mar 30 06:50 linux-headers-3.13.0-115
drwxr-xr-x  7 root   root   4096 Mar 30 06:50 linux-headers-3.13.0-115-generic
drwxr-xr-x 27 root   root   4096 Mar 30 06:52 .

ubuntu@acc-ws-website-1:~$ uname -r
3.13.0-112-generic

而我期望的是这样的:

ubuntu@tools-jenkins:~$ sudo apt-get autoremove
Reading package lists... Done
Building dependency tree
Reading state information... Done
0 upgraded, 0 newly installed, 0 to remove and 94 not upgraded.

ubuntu@tools-jenkins:~$ ls -lart /usr/src
total 32
drwxr-xr-x 10 root root 4096 Mar 25  2015 ..
drwxr-xr-x 24 root root 4096 Dec  6 06:39 linux-headers-3.13.0-105
drwxr-xr-x  7 root root 4096 Dec  6 06:39 linux-headers-3.13.0-105-generic
drwxr-xr-x 24 root root 4096 Mar  8 06:44 linux-headers-3.13.0-112
drwxr-xr-x  7 root root 4096 Mar  8 06:44 linux-headers-3.13.0-112-generic
drwxr-xr-x 24 root root 4096 Mar 30 06:26 linux-headers-3.13.0-115
drwxr-xr-x  7 root root 4096 Mar 30 06:26 linux-headers-3.13.0-115-generic
drwxr-xr-x  8 root root 4096 Apr  3 10:50 .

ubuntu@tools-jenkins:~$ uname -r
3.13.0-105-generic

答案1

如果您的系统上仍安装了大量linux-headers*软件包,您可以尝试这种简单的方法来删除旧的标头:

dpkg-query -f '${binary:Package}\n' -W linux-headers\*|xargs apt-mark auto
apt-mark manual linux-headers-generic
apt-get -f autoremove

如果我的假设是正确的,那么您的标头以某种方式被标记为手动安装,这会阻止您的系统删除这些软件包。例如,您直接安装了这些软件包,即要求 apt 安装内核标头软件包的确切版本。上述命令尝试将所有这些软件包标记为自动安装,并使一切按预期工作。

如果软件包已被删除,但文件夹仍然存在且里面只有一些残留文件,则意味着这些文件不属于该软件包。这可防止 apt 在卸载linux-headers*软件包时删除顶层目录。在这种情况下,您应该手动删除文件。

琐事:apt 的自动删除功能仅适用于自动安装的软件包。这意味着软件包必须被标记为“自动安装”,并且不应有任何依赖于它的软件包。对于 Linux 内核及其标头,我们有以下常见情况:

  • 有一个或多个元包linux-generic,例如linux-image-genericlinux-headers-generic通常标记为手动安装
  • 有很多“真正的”软件包,其中包含文件,例如linux-image-4.8.0-45-generic元软件包依赖于其中一些软件包;这些通常标记为“自动安装”
  • 当元包更新时,它通常需要“真实”包的较新版本,因此会安装新版本
  • 标记为“自动安装”的软件包仅在没有手动安装的软件包依赖于它时才会自动删除,因此当安装了新软件包后,旧软件包可能会在稍后自动删除,因为没有人再依赖这些软件包

答案2

你看到 94 个没有升级吗?这就是问题所在,我遇到过类似的问题,然后我手动升级了所有项目(未通过 apt-get upgrade 升级,这些文件包含依赖项)。之后我使用 apt-get autoremove,它成功了。当你使用 apt-get upgrade 升级时,在详细文本的末尾,你可以看到未升级文件的列表。一个接一个地查看它们(不要担心,有些升级会升级列表中的一半)。希望这能有所帮助,加油伙计。

PS:升级之前,请确保备份工作系统的映像,以防出现问题。

相关内容