为什么 /var/cache/apt/archives/ 中有 deb 文件?

Tim*_*Tim 12 package-management apt maintenance deb software-installation

为什么里面有 deb 文件 /var/cache/apt/archives/

在什么情况下将 deb 文件下载到该目录中?

Eli*_*gan 23

背景资料

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

dpkg是一个安装和删除包的程序,并维护一个关于安装了哪些包、在哪些版本上的数据库。当它安装软件包时,它是从.deb存档文件中安装的。这些档案是分发包的方式。

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

APT 查找和下载软件包,并dpkg适当运行以安装、升级和删除它们。APT 并不是任何单一的软件,尽管有一个apt安装 apt 提供其基本部件的包。

APT 包含一个库 ( libapt-pkg ),该库提供可通过各种工具访问的核心功能。aptapt-get也提供了一些这样的工具,例如。安装 apt包裹。其他工具单独安装。APT 还提供各种配置文件来控制其核心库以及使用它的程序的工作方式。

更重要的是,APT 是一个系统,用于存储和检索有关哪些软件源提供哪些版本的包的数据,并根据这些数据自动执行包管理任务,例如安装和升级包。这包括跟踪其他包需要哪些包才能工作,并自动选择和安装适当的包以满足这些依赖关系。

例如,当我告诉apt-get实用程序安装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.
Run Code Online (Sandbox Code Playgroud)

软件中心、软件更新程序/更新管理器和 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即使在成功安装后仍会被缓存,以备将来使用。但是您可以使用 安全地删除足够旧的 .deb 文件,它们不太可能再次被需要sudo apt-get autoclean,或者使用 .deb.deb完全清除缓存的文件sudo apt-get clean。有关man apt-get更多信息,请参阅。

为了说明sudo apt-get autoclean和类似命令的功能,以及确定您是否希望运行它们,您可以通过运行 then 和标志来模拟它们的操作-s。最好在(或任何其他)动作动词之前传递这个标志autoclean。通常不需要sudo在使用时以 root 身份运行实用程序-s,因为没有进行实际更改。

例如,在我的系统上:

$ 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]
    ....
Run Code Online (Sandbox Code Playgroud)

列出的软件包不会被卸载;相反,只会删除缓存的 .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]
Run Code Online (Sandbox Code Playgroud)

这意味着下载并检查了像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
Run Code Online (Sandbox Code Playgroud)

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

其他相关实用程序的下载文件

一些与 APT 系统一起使用的附加实用程序下载和存储文件作为其操作的一部分。apt-file默认情况下未在 Ubuntu 中安装,但可以从apt 文件安装安装apt文件 包裹。

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

apt-file update以 root 身份运行时(如上),这些文件被下载到/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
Run Code Online (Sandbox Code Playgroud)

请注意,本文中提供的信息提供了许多由 Ubuntu 上的包管理实用程序下载和存储的数据文件示例,但不应将其视为使用和存储此类文件的实例的详尽列表。