为什么/var/cache/apt/archives/目录下会有deb文件?

为什么在 /var/cache/apt/archives/ 目录下会有 deb 文件?
在什么情况下会将 deb 文件下载到该目录中?
1个回答

背景信息

在Ubuntu(以及Ubuntu基于的Debian)中,有两个通常被称为“软件包管理器”的东西:dpkg和APT。

dpkg是一个程序,用于安装和删除软件包,并维护已安装软件包及其版本的数据库。当它安装软件包时,它会从.deb归档文件中进行。这些归档文件是软件包分发的方式。

dpkg不仅会复制(或删除)文件并更新其数据库 - 它还将运行安装脚本和卸载脚本。它可能被认为是相当复杂的。但它不会做的事情是查找和下载软件包。

APT会查找和下载软件包,并适当地运行dpkg来安装、升级和删除它们。APT实际上不是任何单一的软件,尽管有一个apt Install apt软件包提供了它的基本部分。

APT 包括一个库(libapt-pkg),提供核心功能,可以通过各种工具访问。一些工具,如 apt-get,也由 apt Install apt 包提供。其他工具需要单独安装。APT 还提供了各种配置文件,用于控制其核心库及使用它的程序的工作方式。
此外,APT 是一个用于存储和检索关于软件源提供的软件包及其版本的数据,并根据这些数据自动执行软件包管理任务(如安装和升级软件包)的系统。这包括跟踪哪些软件包是其他软件包所需的,并自动选择和安装适当的软件包来满足这些依赖关系。
例如,当我告诉apt-get工具安装chocolate-doom Install chocolate-doom软件包时,它会自动找出需要安装的其他软件包,并自动获取和安装它们。
$ sudo apt-get install chocolate-doom
Reading package lists... Done
Building dependency tree       
Reading state information... Done
The following extra packages will be installed:
  doom-wad-shareware libmikmod3 libsdl-mixer1.2 libsdl-net1.2 libsdl1.2debian
Recommended packages:
  doom-engine
The following NEW packages will be installed:
  chocolate-doom doom-wad-shareware libmikmod3 libsdl-mixer1.2 libsdl-net1.2
  libsdl1.2debian
0 upgraded, 6 newly installed, 0 to remove and 1 not upgraded.
Need to get 0 B/2,846 kB of archives.
After this operation, 8,626 kB of additional disk space will be used.

图形工具如软件中心、软件更新器/更新管理器和Synaptic执行与apt-get类似的功能。它们还使用APT系统——通过观察其规则并利用核心库提供的功能的组合——来更改安装的软件包,以便以用户通常希望的方式工作,并且通常能够持续正常运行。
/var/cache/apt/archives文件夹的使用方式和时间
apt-getaptitude软件中心Synaptic软件更新器/更新管理器或任何其他软件包管理工具从配置的软件源下载软件包(以及它们所依赖的其他软件包)并安装它们时,下载的软件包(即从中安装它们的.deb归档文件)存储在/var/cache/apt/archives目录中。
如果您在磁盘上有一个.deb文件,并使用dpkg进行安装,这不会导致它在/var/cache/apt/archives中复制一份。但是,当使用或实现APT系统的自动依赖解析和软件包获取的程序下载软件包时,它们就会存储在那里。
虽然自动下载的软件包的.deb文件存储在/var/cache/apt/archives中并从那里安装,但它们实际上并不直接下载到该位置。相反,未完成(即正在进行中)的.deb文件下载存在于/var/cache/apt/archives/partial中,然后在完成时移动到/var/cache/apt/archives中。
.deb软件包文件在成功安装后仍然会被缓存在/var/cache/apt/archives目录中,以备将来使用。但是,您可以使用sudo apt-get autoclean命令安全地删除那些很久没有再次需要的.deb文件,或者使用sudo apt-get clean命令完全清除缓存的.deb文件。有关更多信息,请参阅man apt-get
为了说明sudo apt-get autoclean和类似命令的功能,并确定是否要运行它们,您可以通过在命令后加上-s标志来模拟它们的操作。最好在autoclean(或其他)动作动词之前传递此标志。在使用-s时,通常不需要使用sudo以root身份运行实用程序,因为不会进行任何实际更改。
例如,在我的系统上:
$ apt-get -s autoclean
NOTE: This is only a simulation!
      apt-get needs root privileges for real execution.
      Keep also in mind that locking is deactivated,
      so don't depend on the relevance to the real current situation!
Reading package lists... Done
Building dependency tree       
Reading state information... Done
Del libubsan0 4.9.1-15ubuntu1 [83.7 kB]
Del cups-server-common 1.7.5-3 [519 kB]
Del python2.7 2.7.8-9 [205 kB]
Del g++-4.9 4.9.1-15ubuntu1 [17.4 MB]
Del libstdc++-4.9-dev 4.9.1-15ubuntu1 [1,121 kB]
    ....

列出的软件包不会被卸载,只是缓存的.deb文件会被删除。(实际上,当我运行该命令时,两者都没有发生,因为它只是一个模拟。)
其他已下载的文件
通过dpkg安装的软件(通过APT或其他方式)实际上并不是从提供它的.deb文件中运行的。如在“背景信息”部分所述,.deb文件会被解压。这就是为什么它们可以被移除而安装的软件包仍然正常运行的原因。
系统中从.deb软件包安装的文件并不是直接下载到其当前位置,而是从提供它们的.deb文件中提取出来的(或者在安装过程中或之后特别创建的一些配置文件的情况下)。
但是,.deb文件并不是包管理工具下载的唯一文件。通常还会下载其他提供有关软件包位置信息的文件。
例如,当我运行sudo apt-get update时,输出会包含以下行:
Get:13 http://us.archive.ubuntu.com utopic/main i386 Packages [1,341 kB]

这意味着像http://us.archive.ubuntu.com/ubuntu/dists/utopic/main/binary-amd64/Packages.bz2这样的文件被下载并检查,以帮助更新APT数据库中关于特定软件源提供的可用软件包(以及版本)的信息。您可以在/var/lib/apt/list目录中找到Packages文件和其他类似文件。存储在那里的副本具有诸如us.archive.ubuntu.com_ubuntu_dists_utopic_main_binary-amd64_Packages之类的区分名称,因为可能有许多这样的文件。
您特别询问了apt-cache。它查询软件包数据库,但不对系统进行任何更改或下载任何文件。

与软件中心相关的下载文件

当Ubuntu软件中心下载其自身使用的数据时,与APT(或dpkg)功能无关的特定数据,它们存储在/var/cache/software-center中。
例如,在我的系统上(以及大多数系统上),该文件夹包含一个xapian子文件夹:
ek@Ilex:/var/cache/software-center/xapian$ ls
flintlock       postlist.baseB  record.baseB    spelling.baseB  termlist.baseB
iamchert        postlist.DB     record.DB       spelling.DB     termlist.DB
postlist.baseA  record.baseA    spelling.baseA  termlist.baseA

软件中心使用Xapian进行索引,以便快速搜索信息。

其他相关工具的下载文件

一些额外的与APT系统配合使用的实用程序在其操作过程中会下载和存储文件。Ubuntu默认未安装apt-file,但可以从apt-file Install apt-file包中安装。

apt-file存储有关哪些文件由哪些软件包提供的信息(即使对于未本地安装的软件包也是如此)。它通过下载压缩的Contents文件来获取有关软件包内容的信息:

$ sudo apt-file update
Downloading complete file http://us.archive.ubuntu.com/ubuntu/dists/utopic/Contents-amd64.gz
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 29.6M  100 29.6M    0     0   856k      0  0:00:35  0:00:35 --:--:--  832k

当以root身份运行apt-file update时(如上所示),这些文件将被下载到/var/cache/apt/apt-file目录中。为了发现这一点,我运行了以下命令:
$ sudo updatedb
$ locate Contents-amd64
/var/cache/apt/apt-file/us.archive.ubuntu.com_ubuntu_dists_utopic-proposed_Contents-amd64.gz
/var/cache/apt/apt-file/us.archive.ubuntu.com_ubuntu_dists_utopic_Contents-amd64.gz

请注意,本帖中提供的信息列举了Ubuntu上软件包管理工具下载和存储数据文件的一些示例,但不应将其视为这些文件使用和存储的详尽列表。

谢谢。apt-cache 或者 apt-file 也会下载很多东西吗?如果是的话,它们在哪里? - Tim
当一个使用或实现APT系统的自动依赖解析和软件包获取的程序下载软件包时,它会将这些软件包存储在哪里。 - Tim
@Tim 我已经大幅扩展了我的回答,希望能够恰当地回答那些问题(以及更多)。如往常一样,非常欢迎你的反馈意见,尤其是如果有任何不清楚的地方。 - Eliah Kagan
谢谢。"apt-cache查询软件包数据库",该数据库是在线的还是在本地计算机上?apt-cache需要访问互联网吗? - Tim
@Tim 它查询您的本地软件包数据库。apt-cache 实际上不会检查您的远程仓库。本地数据库是由其他程序更新的,例如当您运行 sudo apt-get update 或者通过软件中心和软件更新/更新管理器自动更新时。运行 apt-cache 的结果当然会受到对本地软件包数据库所做更改的影响,但 apt-cache 本身不会进行这些更改。 - Eliah Kagan
为了腾出空间,可以移除的文件只有 /var/cache/apt/archives 目录下的 .deb 文件吗? - Tim
@Tim 通常情况下,删除我在答案中提到的大多数其他文件是不安全的,但它们的大小相对较小,所以如果你的目标是释放空间,你可能不会得到太多好处。相比之下,/var/cache/apt/archives 中的缓存 deb 文件(有时还包括 /var/cache/apt/archives/partial 中未完成的下载)可能占用了相当大的空间。你可以使用 sudo apt-get clean 安全地删除它们。当然,这可能或可能不足以释放你所需的空间。du -sh /var/cache/apt/archives 命令将显示当前被缓存的 deb 文件占用了多少空间。 - Eliah Kagan
我真心希望有一种方法可以将有用的答案收藏起来以备将来使用。我不得不花了一些时间才找到一个讲得通的答案(并且解决了我的问题)。由于这是Linux中经常遇到且无法避免的问题,我相当确定将来还需要再次阅读这个答案。 - Orian
1@Orian(很高兴这个回答对你有帮助!)你可以点击问题下方的星星。它就在问题的得分和投票箭头下面。然后问题会出现在你个人资料的“收藏夹”选项卡中。只有问题可以被收藏。对于这个回答,目前它是该问题上唯一的一个。可能会有其他回答发布——尽管你可能也想看看那些回答,因为有时候新的回答会提供关于某个主题的最新发展信息。你可以使用浏览器的书签功能,即使是对于回答也适用。使用回答下方的“分享”链接打开特定回答所在的页面。 - Eliah Kagan
+1 真是个精彩的回答!当你运行$ sudo du /var/cache/apt/archives -h时,你会得到4.0K /var/cache/apt/archives/partial383M /var/cache/apt/archives。你的回答中没有提到partial目录?对于像我这样的小型Ubuntu安装来说,383MB似乎有点大? - WinEunuuchs2Unix
deb包文件在成功安装后仍然保留在/var/cache/apt/archives中,以备将来可能需要使用的情况。有哪些可能会使用这些文件的未来用途的例子? - gerardw