第 8 章 Debian 软件包管理工具

# 第 8 章 Debian 软件包管理工具

## 8.1. Debian 提供了哪些软件包管理程序？

有多个工具可以管理 Debian 软件包，从图形或文本界面工具，到用于安装软件包的底层工具。所有可用的工具都依赖底层的工具才能正常工作，这里按照复杂度从高到低排序。

很重要的一个知识点是高层的软件包管理工具，例如 aptitude 或 synaptic，依赖 apt，而 apt 又依赖 dpkg 来管理系统中的软件包。

参见 Debian 参考手册的第 2 章 Debian 软件包管理以获得关于 Debian 软件包管理工具的更多信息。该文档有多种语言的翻译以及不同的格式，参见 Debian 用户手册概览中的 Debian 参考手册条目。

### 8.1.1. dpkg

这是主要的软件包管理程序。dpkg 支持很多选项。常用的有：

- 列出所有选项：`dpkg --help`。

- 打印指定的软件包的控制文件（和其他信息）：`dpkg --info foo_VVV-RRR.deb`。

- 安装软件包（包括解压缩和配置）到硬盘上的文件系统中：`dpkg --install foo_VVV-RRR.deb`。

- 解压缩（但不配置）Debian 档案到硬盘上的文件系统中：`dpkg --unpack foo_VVV-RRR.deb`。注意，经过这一操作的软件包不一定可以使用；有些文件可能需要进一步配置才可以正常运行。这一命令会卸载该程序的任何已经安装的版本，并执行软件包的 preinst（参见第 7.6 节 “什么是 Debian preinst、postinst、prerm，和 postrm 脚本？”）脚本。

- 配置一个已经被解压缩的软件包：`dpkg --configure foo`。这一命令会执行软件包的 postinst（参见第 7.6 节 “什么是 Debian preinst、postinst、prerm，和 postrm 脚本？”）脚本，并执行一些其他操作。这一命令也会更新软件包的 `conffiles` 列出的文件。注意“configure”操作的参数是软件包名（例如 foo），不是 Debian 档案文件名（例如 foo_VVV-RRR.deb）。

- 从 Debian 档案中解压一个名为“blurf”的文件（或一组名为“blurf*”的文件）：`dpkg --fsys-tarfile foo_VVV-RRR.deb | tar -xf - 'blurf*'`。

- 卸载一个软件包（但不包括配置文件）：`dpkg --remove foo`。

- 卸载一个软件包（包括配置文件）：`dpkg --purge foo`。

- 列出包含字符串（或正则表达式）“foo*”的软件包的安装状态：`dpkg --list 'foo*'`。

### 8.1.2. APT

APT 是高级包管理工具（Advanced Package Tool），是 Debian 包管理系统的一个高级界面，提供了 apt-get 程序。它提供了可以搜索和管理软件包，以及查询软件包信息的命令行工具，以及访问 libapt-pkg 库的所有功能的底层接口。更多信息，请参阅位于 `/usr/share/doc/apt-doc/guide.html/index.html` 的用户指南（您需要先安装 `apt-doc` 软件包）。

从 Debian Jessie 开始，一些常用的 apt-get 和 apt-cache 命令在新的 apt 程序中有一个等价的形式。这意味着某些流行的命令，例如 apt-get update、apt-get install、apt-get remove、apt-cache search 和 apt-cache show 可以简单地通过 apt 进行调用，比如 apt update、apt install、apt remove、apt search 和 apt show。以下是新旧命令的概览：

     apt-get update             ->  apt update
     apt-get upgrade            ->  apt upgrade
     apt-get dist-upgrade       ->  apt full-upgrade
     apt-get install 软件包    ->  apt install 软件包
     apt-get remove 软件包     ->  apt remove 软件包
     apt-get autoremove         ->  apt autoremove
     apt-cache search 字符串    ->  apt search 字符串
     apt-cache policy 软件包   ->  apt list -a 软件包
     apt-cache show 软件包     ->  apt show 软件包
     apt-cache showpkg 软件包  ->  apt show -a 软件包

apt 工具整合了 apt-get 和 apt-cache 的功能，并且默认具有更漂亮的彩色输出格式，让人眼看起来更舒服。如果要用于脚本或者需要使用高级用法，则仍然建议或必须使用 apt-get。

apt-get 提供了一种简单的方式来使用命令行从多个来源获取和安装软件包。和 dpkg 不同，apt-get 不能解析 .deb 文件，它使用包名来安装软件包，且只能从 `/etc/apt/sources.list` 指定的源里安装 .deb 文件。apt-get 从配置的源中下载完 .deb 档案[5]后会直接调用 dpkg。

使用 apt-get 的常见方式有：

- 要更新您系统中的软件包列表，您可以运行：

      apt update

  （您应该定期执行该命令以更新软件包列表）

- 要安装软件包 `foo` 和它的全部依赖，请运行：

      apt install foo

- 要从您的系统中卸载软件包 foo，请运行：

      apt remove foo

- 要从您的系统中卸载软件包 foo 和它的配置文件，请运行：

      apt purge foo

- 要列出所有可以更新到新版本的软件包，请运行：

      apt list --upgradable

- 要升级您系统中的所有软件包（但不安装额外的软件包或卸载软件包），请运行：

      apt upgrade

- 要升级您系统中的所有软件包，并且在必要的时候安装额外的软件包或卸载软件包，请运行：

      apt full-upgrade

  （使用 `upgrade` 命令升级时，如果为了满足新的依赖关系需要安装额外的软件包，则会保留软件包的旧版本。`full-upgrade` 命令则没有那么保守。）

注意您需要以 root 用户登录才可以执行修改软件包的命令。

注意 apt-get 现在默认会安装推荐的软件包，另外由于它的鲁棒性，它也是在命令行安装系统和进行重大系统升级时首选的软件包管理程序。

apt 工具集也包含了 apt-cache 工具，可以查询软件包列表。您可以用它在软件包管理系统中通过简单的文本或正则表达式查询，或者依赖关系查询来找出提供特定功能的软件包。使用 apt-cache 的常见方式有：

- 要找出描述中包含`词语`的软件包：

      apt search 词语

- 要打印软件包的详细信息：

      apt show 软件包

- 要打印软件包的依赖：

      apt-cache depends 软件包

- 要打印软件包各可用版本的详细信息，以及反向依赖它的软件包：

      apt-cache showpkg 软件包

欲了解更多信息，请安装 `apt` 软件包，并阅读 apt(8)、apt-get(8)、sources.list(5)，并安装 `apt-doc` 软件包，并阅读 `/usr/share/doc/apt-doc/guide.html/index.html`。

### 8.1.3. aptitude

aptitude 是 Debian GNU/Linux 系统的一个软件包管理器，是 apt 包管理器的一个前端。aptitude 是一个文本界面，使用 curses 库。可以通过视觉界面或命令行执行操作。

aptitude 让用户可以方便快捷地完成软件包管理任务。它允许用户查看软件包列表，并执行软件包管理任务，例如安装、升级和卸载软件包。

aptitude 提供了 apt-get 的功能，以及许多额外的功能：

- aptitude 可以方便地访问软件包的所有版本。

- aptitude 将过时的软件包列于“过期的和在本地创建的软件包”下，使跟踪这些软件包变得十分容易。

- aptitude 包含了一个强大的搜索软件包和限制所显示的软件包的机制。熟悉 mutt 的用户会很容易上手，因为 mutt 是该机制中表达式的语法的来源。

- aptitude 可以用于安装预定义的任务。更多信息，请见第 8.1.5 节 “tasksel”。

- aptitude 在全屏模式下内置 su 功能，所以可以以普通用户执行。当确实需要管理员权限时，它会调用 su（并询问 root 密码，如果有的话）。

您可以使用 aptitude 的视觉界面（只需简单地运行 `aptitude`），或者直接从命令行调用。命令行语法和 apt-get 很相似。例如，要安装 `foo` 软件包，您可以运行 `aptitude install `foo``。

注意 aptitude 是在命令行进行日常软件包管理的首选程序。

更多信息，请阅读 aptitude(8) 手册页，并安装 `aptitude-doc` 软件包。

### 8.1.4. synaptic

synaptic 是一个图形化的软件包管理器。它能够以用户友好的方式安装、升级和卸载软件包。除了提供 aptitude 提供的大多数功能之外，它的功能还包括编辑正在使用的软件仓库列表，以及浏览和软件包相关的所有文档。访问 Synaptic 网站以获得更多信息。

### 8.1.5. tasksel

当您希望完成特定的任务时，寻找符合您需要的软件包的组合可能会很困难。Debian 开发者定义了不同的`任务（task）`，它指的是与特定的任务有关的 Debian 软件包的组合。可以使用 tasksel 或 aptitude 安装任务。

通常，Debian 安装程序会自动安装与标准系统和桌面环境有关的任务。安装的桌面环境和 CD/DVD 有关，一般是 GNOME 桌面（`gnome-desktop` 任务）。另外，根据您在安装过程中的选择，可能还会自动安装一些任务。比如说，如果您选择了除英语以外的语言，则还会自动安装和该语言有关的任务。

### 8.1.6. 其他软件包管理工具

#### 8.1.6.1. dpkg-deb

该程序可以处理 Debian 档案（`.deb`）文件。常见的用法有：

- 列出所有选项：`dpkg-deb --help`。

- 列出 Debian 档案文件中包含的文件：`dpkg-deb --contents foo_VVV-RRR.deb`。

- 解压 Debian 档案文件中的文件到用户指定的目录：`dpkg-deb --extract foo_VVV-RRR.deb tmp` 解压 `foo_VVV-RRR.deb` 中的所有文件到 `tmp/` 目录。这样可以在不将软件包安装到根文件系统的情况下，方便地在临时目录查看软件包的内容。

- 解压软件包的控制文件：`dpkg-deb --control foo_VVV-RRR.deb tmp`。

注意仅使用 `dpkg-deb --extract` 解压的软件包并没有被正确安装，您应当使用 `dpkg --install` 进行安装。

更多信息请见手册页 dpkg-deb(1)。

## 8.2. Debian 声称可以更新正在运行的程序，这是怎么做到的？

Debian GNU/Linux 系统的内核（文件系统）支持替换正在使用的文件。

我们也提供了一个名为 start-stop-daemon 的程序，可以在运行级别改变时（例如从多用户模式切换到单用户模式，或者关机时）启动或停止守护进程。该程序也会在安装含有守护进程的软件包时被安装脚本执行，以停止正在运行的守护进程，并在需要时重启它们。

## 8.3. 怎么知道 Debian 系统中安装了哪些软件包？

要知道 Debian 系统中安装的所有软件包的状态，请执行

    dpkg --list

这会对每个软件包打印一行概览，包括两个字母的状态符号（在表头中有解释）、软件包名、已安装的版本，以及一行简短的描述。

欲了解包名与以“foo”开头的任意模式匹配的软件包的状态，请执行：

    dpkg --list 'foo*'

要获得特定软件包的更详细报告，请执行：

    dpkg --status 软件包名

## 8.4. 如何显示已安装的软件包包含的文件？

要列出已安装的软件包 `foo` 提供的所有文件，请执行

    dpkg --listfiles foo

注意，不会显示软件包的安装脚本所创建的文件。

## 8.5. 如何查出一个特定的文件属于哪个软件包？

要获得名为 `foo` 的文件所属的软件包，可选择以下命令中的一个：

- `dpkg --search foo`

  这会在已安装的软件包中搜索 `foo`。（目前，该命令等价于在 `/var/lib/dpkg/info/` 目录中所有扩展名为 `.list` 的文件里进行搜索，并调整输出，以打印软件包名和文件路径。）

  另一个更快的方法是使用 dlocate 工具。

      dlocate -S foo

- `zgrep foo Contents-ARCH.gz`

  这会找出所有完整路径名中含有子串 `foo` 的文件。文件 `Contents-ARCH.gz`（其中 ARCH 为所需的架构）位于 Debian 档案站点（即 `/debian/dists/trixie` 中）的主要软件包目录（main、non-free、contrib）内。一个 `Contents` 文件仅包含它所处的子目录树的软件包。所以，用户可能需要搜索不止一个 `Contents` 文件，才能找到含有文件 `foo` 的软件包。

  这个方法相比于 `dpkg --search` 的优点是可以找到未在您的系统上安装的软件包的文件。

- `apt-file search `foo``

  如果您安装了 `apt-file` 软件包，和上一个类似，它可以找到完整路径名中含有子串或正则表达式 `foo` 的文件。该命令相比于上一个的优点是不需要手动下载 `Contents-ARCH.gz` 文件，因为当您（以 root 用户）执行 `apt-file update` 时，它会自动对 `/etc/apt/sources.list` 中定义的所有软件源执行该操作。

## 8.6. 为什么我卸载“foo”的时候没有卸载“foo-data”？怎样确保旧的、不再使用的库软件包被卸载？

有些软件包被分割成程序（“foo”）和数据（“foo-data”）（或者“foo”和“foo-doc”）。Debian 中的许多游戏、多媒体应用和词典都是这种情况。这样做的原因是有的用户可能只想访问原始数据，而不想安装程序，或者是因为有的程序不需要数据就可以运行，所以“foo-data”是可选的。

对于库而言，也有类似的状况：通常，安装这些库是因为有个包含应用程序的软件包依赖它。当应用程序软件包被卸载时，库软件包可能留在系统中。或者：比如应用程序软件包不再依赖 libdb4.2，而开始依赖 libdb4.3 时，在升级该应用程序软件包时，libdb4.2 可能仍留在系统中。

在这些情况下，“foo-data”不依赖“foo”，所以当您卸载“foo”软件包时，大多数软件包管理工具不会卸载“foo-data”。库软件包也是同理。必须这样处理以避免循环依赖。然而，如果您使用的软件包管理工具是 apt-get（参见第 8.1.2 节 “APT”）或 aptitude（参见第 8.1.3 节 “aptitude”），它们会跟踪自动安装的软件包，并在没有其他软件包使用它们的情况下，允许您卸载这些软件包。

[5] 注意在其他软件包管理系统中也有这一工具的移植，比如红帽软件包管理器，又叫做 rpm。

第 7 章 Debian 软件包管理系统基础 |  | 第 9 章 使您的 Debian 系统保持最新状态