6.2. aptitude、apt-get和 apt 命令

APT 是个原先有图形接口的大计划。以包括核心应用程序的程序库为基础,且包括第一个前端 — 命令行指令 — apt-getapt 是 APT 的第二个命令行指令包括若干处理错误的 apt-get

其他众多的图形界面以外部项目形式出现:synapticaptitude(它同时包含文本模式界面和图形界面 — 即使尚未完成),wajig,等等。最为推荐的界面,apt,会在本节案例中使用。注意,尽管如此,apt-getaptitude的命令行语法也仍与之非常类似。在aptapt-getaptitude存在较大差异时,将会详述差异。

6.2.1. 开端

对于 APT 的任何操作,需要更新可用包的列表;这可以简单地通过apt update来完成。取决于您连接的速度,该操作需要花费一定时间,因为这包括下载一定数量的软件包/源代码/翻译-*语言代码*文件,这些文件随着 Debian 的开发而逐渐变大(对于main部分,至少有 10MB 数据)。当然,从光盘中安装无需任何下载 — 此情况下,操作是十分迅速的。

6.2.2. 安装和卸载

通过APT,软件包可以从系统中添加或移除,命令分别为apt install*软件包*apt remove*软件包*。在以上两种情况中,APT 将会自动安装必要的依赖包或者删除依赖于删除包的软件包。apt purge*软件包*命令包含一个彻底删除 — 相关的配置文件也会被删除。

TIP 多次安装同一批软件包

在几台电脑上安装同一批软件包会很实用。这很容易做到。

首先,从电脑中取得所安装软件包的列表作为用于复制的“模板”。

  1. $

pkg-list 文件内容是已安装软件包的清单。然后,用以下的指令把 pkg-list 文件复制在欲更新的电脑:

  1. ## Update dpkg's database of known packages↵
  2. # avail=`mktemp`
  3. # apt-cache dumpavail > "$avail"
  4. # dpkg --merge-avail "$avail"
  5. # rm -f "$avail"
  6. ## Update dpkg's selections↵
  7. # dpkg --set-selections < pkg-list
  8. ## Ask apt-get to install the selected packages↵
  9. # apt-get dselect-upgrade

第一个命令记录在 dpkg 库中可用的软件包列表,然后 dpkg --set-selections 恢复选中你想要安装的包,apt-get 的激活执行所需要的操作!aptitude 没有这样的命令。

TIP 同时进行卸载和安装

在命令 apt (或 apt-get、或 aptitude) 加入后缀就可以同时安装指定的软件包与移除其他软件包。在 apt install 命令加入 “-” 及希望移除的软件包名称。在 apt remove 命令加入 “+” 及希望安装的软件包名称。

下面的例子展示两种不同方法来安装package1 和卸载package2

  1. # apt install package1 package2-
  2. [...]↵
  3. # apt remove package1+ package2
  4. [...]↵

此方法也可用于把不同的软件包排除在外,比如由于Recommends造成的。一般,依赖解决者会用此作为寻找其他办法的线索。

技巧 apt --reinstallaptitude reinstall

在软件包中的文件发生移除或更改时,系统有时候可能会受损。恢复这些文件最简单的方法是重装受影响的软件包。不幸的是,包系统会认为后者已安装而拒绝重新安装;为了避免此情况,使用aptapt-get命令的 --reinstall选项。如下命令会重新安装postfix,即使它已存在:

  1. #

aptitude命令行略微不同,但可通过aptitude reinstall postfix获得同样的结果。

该问题不与dpkg同时出现,但管理员极少直接使用它。

注意!使用apt --reinstall命令恢复受到攻击时变更的软件包,不会当然地恢复系统原本的样子。第 14.7 节 “处理被攻陷的机器”详述了受损系统要采取的必要步骤。

如果文件 sources.list 提及了数个发布版本,可以指定要安装软件包的版本。要求特定版本号可以通过 apt install *package*=*version*,但以标明其初始发行版本 (Stable, Testing 或者 Unstable)的方式— 通过 apt install *package*/*distribution* — 更为推荐。倘若 sources.list文件所述软件源之一仍可用的情况下,通过此命令可以回溯一个软件包的旧版本 (比如您知晓其情况良好的情况)。否则,snapshot.debian.org 归档可以补救(参阅侧边栏r 进阶旧包版本: snapshot.debian.org)。

例 6.3. 安装 spamassassin(垃圾邮件过滤) 的 unstable 版本

  1. #

更进一步 .deb 文件的缓存

APT 在 /var/cache/apt/archives/ 目录中保存每个下载的 .deb文件的副本。在频繁更新的情况下,该目录下每个软件包的数个版本可能会占用大量磁盘空间;您应当经常整理它们。可以使用如下两个命令:apt-get clean完全清空整个目录;apt-get autoclean仅移除不会再下载的软件包(因为它们已从 Debian 镜像中消失)和明显无用的软件包(配置参数APT::Clean-Installed可以阻止移除安装中的.deb文件)。注意apt不支持上述命令。

6.2.3. 系统升级

常规升级是推荐的,因为它们包含最新的安全更新。要升级,可使用apt upgradeapt-get upgradeaptitude safe-upgrade(当然需在apt update之后)。该命令会查找要升级的已安装包,同时不移除任何包。也就是说,目标是确保可能的侵入式升级最小化。apt-get命令略苛刻于 aptitudeapt命令,因为它会拒绝安装未预先安装的软件包。

TIP 增量更新

如先前所述,apt update 命令的目标是为每个软件包源码下载相应的软件包(或源码)文件。然而,即使经过 bzip2 压缩,这些文件仍会相当大(针对 Jessie 的 main 部分的 Packages.xz 占用空间超过6MB)。如果您想要频繁更新,上述下载将花费较多时间。

为了加快处理速度,APT 可以下载只有变动内容的 “diff” 文件,而不是整个文件。官方的 Debian 镜射网站发行此等文件列出 Packages 文件及其后续版本的不同处。每次升级与每周升级分别都有对应的文件。每个供 不稳定版 的 “diff” 文件只有几十 KB 大小,所以每周使用 apt update 命令需要下载的数据不会太大。稳定版 与 测试版 的分行版,只有极小的改变。

然而,有的时候仍需要下载整个 软件包 文件,尤其是上回升级是很久以前的事且不适合增量式升级。若网络速度极快但机器的处理器性能不足以应付升级,下载省下的时间还不足以弥补电脑计算新版版的时间 (从旧版开始逐一地升级)。在这种情况下,可以使用配置参数 Acquire::Pdiffs 并设置为 false

apt 会选择最新的版本号 (除了来自 实验版 与 稳定反向植入版,其缺省忽略版本号)。若指定 测试版 或 不稳定版 于 sources.list 内,则 apt upgrade 会把 稳定版 系统切换至 测试版 或 不稳定版,这些都不是您要的。

搜索升级的软件包时需把特定的发行版告知 apt,采用 -t--target-release 选项,然后是发行版的名称 (如:apt -t stable upgrade)。为了避免每次使用 apt 都需指定版本,可以把, you can add APT::Default-Release "stable"; 加在 /etc/apt/apt.conf.d/local 之内。

对于非常重要的升级,如从一个 Debian 主版本变更为下一版本,你需要使用apt full-upgrade。使用此命令,apt将会完全升级,即使必须移除一些废弃包或者安装新的依赖包。这也适用于日常使用 Debian Unstable并每天跟随其演化的用户。它是如此简便以至于几乎无需解释:APT的声誉基于此项强大的功能。

不同于 aptaptitudeapt-get 不知道 full-upgrade 命令。反而,您应使用 apt-get dist-upgrade (”升级发行版”),此古老且知名的命令也被 aptaptitude 接受给读者相当的便利。

6.2.4. 配置选项

除了已提及的配置细目,还可在 /etc/apt/apt.conf.d/ 文件夹内增加 APT 的其他配置。让 APT 告知 dpkg 忽略由 DPkg::options { "--force-overwrite"; } 引发的错误。

若只能经由代理服务器近用网页,添加像这样的一列 Acquire::http::proxy "http://*yourproxy*:3128"。对 FTP 代理服务器,用 Acquire::ftp::proxy "ftp://*yourproxy*"。更多的配置选项,参考 apt.conf(5) 手册页以 man apt.conf 命令 (手删的详情,见 第 7.1.1 节 “手册页面”) 查看。

基本 结尾是 .d 的文件夹名称

结尾是 .d 数据使用机会愈来愈多。每个文件夹内的配置档系供多个文件使用。所以,在 /etc/apt/apt.conf.d/ 内的文件都是供 APT 配置之用。APT 以字顺方式纳入他们,最后一个文件可以修正在前的配置。

此结构对机器的管理者与软件包维护带来若干弹性。确实,管理者容易修改软件的配置,只需在有问题的文件夹添加文件而不必变动既有的文件。需要调整另个软件的配置,以确保与既有软件相依,软件包维护者以同样的方法就能达成。Debian 的政策禁止修改其他软件包的配置档 — 只有被授权者才能修改。软件包升级时,用户应保留选择配置档版本的权力。外部修改此文件时将启动该选项,管理者就知道是外来的修改。

没有 .d 文件夹时,外部软件包就不能在没有修改配置档的前提下修改程序设置。所以,必须邀请用户选择修改方式,并列出在文件 /usr/share/doc/*package*/README.Debian 内的选项。

视应用程序的需要,可直接使用或由外部脚本管理 .d 文件夹,将所有文件串联成一个配置档。更动文件夹内容后,必须再运行脚本,才能纳入该等变动。还有一件重要的事,千万不要直接运行自动生成的配置档,因为下次运行脚本后将失去所有的东西。受到环境的限制才被迫选择指定的方法 (直接使用 .d 文件夹或由该文件夹产生的文件),不论何种方法,配置的弹性收益远大于其带来的复杂性。Exim 4 邮件服务器是产生文件方法的范例之一:可用多个文件 (/etc/exim4/conf.d/*) 配置串联成 /var/lib/exim4/config.autogenerated 再由 update-exim4.conf 命令运行。

6.2.5. 包的优先级管理

配置 APT 最重要的层面之一是管理每个软件包来源的优先性。例如,从 测试版、不稳定 或 实验版 中选取一个或多个软件包。可以指令每个软件包的优先性 (视其版本或发行版,同个软件包可以有多个优先性)。这些优先性将影响 APT 的行为:每个软件包总是选择最优先的版本 (除非旧于已安装的版本或优先性小于 1000)。

APT 设置若干缺省的优先性。已安装软件包版本的优先性是 100。未安装版本缺省优先性为 500,若是另个发布的目标则可跳至 990 (以 -t 命令行选项或 APT::Default-Release 配置指令调整)。

/etc/apt/preferences 文件内添加条目的方式,指名受影响软件包名称、版本、出处及其新的优先性。

APT 永远不会安装旧版的软件包 (就是软件包的版本编号小于已安装的软件包),除非其优先性高于 1000。APT 总是安装优先性最高的软件包。若两个软件包的优先性相同,APT 安装最新的 (其版本编号较高)。若同版本的两个软件包优先性相同但内容不同,APT 安装还没有安装的版本 (包括没有递增修订编号的软件包,通常是需要的)。

更具体地说,永远不会安装优先性小于 0 的软件包。没有安装其他版本时,将安装优先性在 0 与 100 之间的软件包。其他发行版没有更新版本或可用的版本时,安装优先性在 100 与 500 之间的软件包。在目标发行版内没有更新的版本时,安装优先性在 501 与 990 之间的软件包。已安装的版本不是更新时,安装优先性在 990 与 1000 之间的软件包。即使使强迫 APT 降级也要安装优先性高于greater than 1000 的软件包。

APT 检查 /etc/apt/preferences 时,首先考量最精确的条目 (通常是指定的软件包),然后是较通用的 (包括发行版内的所有软件包)。存在多个通用条目时,选用第一个。可用的选项包括软件包名称及其源文件。每个软件包来源包括 发布 文件,由 APT 与 软件包 文件同时下载。指定来源 (通常 “Debian” 的官方镜射站软件包,但也可以是个人的或机构的第三方典藏所)。给予发行版名称 (通常是 Debian 提供标准发行版内的 稳定版、测试版、不稳定版 或 实验版) 及其版本 ( 8 就是 Debian 的 Jessie)。接着以实例查看其语法。

特例实验性的优先性

若把 Experimental 列在 sources.list 文件内,几乎不会安装对应软件包因为其 APT 优先性为1。当然这是特例,避免用户意外安装 Experimental 软件包。这些软件包只能以指令 aptitude install *软件包名称*/experimental 安装 — 用户键入此指令时自然知道其风险。还是有可能 (虽然 建议) 把 Experimental 内的软件包视为其他发行版而给予优先性 100。在 /etc/apt/preferences 文件内给予特定的条目就行了:

  1. Package: *
  2. Pin: release a=experimental
  3. Pin-Priority: 500

暂时假设您只需用到 Debian 稳定版的软件包。除非特别指明,不会安装其他版本的软件包。可以在 /etc/apt/preferences 文件内写入以上的条目:

  1. Package: *
  2. Pin: release a=stable
  3. Pin-Priority: 900
  4.  
  5. Package: *
  6. Pin: release o=Debian
  7. Pin-Priority: -10

a=stable 设置发行版的名称。o=Debian 限制来自 “Debian” 的软件包。

假设若干服务器内的程序使用 Perl 5.14 且不希望被升级为其他版本。您需用到此条目:

  1. Package: perl
  2. Pin: version 5.14*
  3. Pin-Priority: 1001

此配置档的参考文档在手册的 apt_preferences(5),以 man apt_preferences 命令就可看到。

秘诀/etc/apt/preferences 内的评论

/etc/apt/preferences 文件没有放置评论的官方语法,但可以在每个条目的 “Explanation” 字段置入若干说明:

  1. Explanation: The package xserver-xorg-video-intel provided
  2. Explanation: in experimental can be used safely
  3. Package: xserver-xorg-video-intel
  4. Pin: release a=experimental
  5. Pin-Priority: 500

6.2.6. 在多个发行版工作

apt 是很奇妙的工具,可从其他发行版提取软件包。例如,安装 稳定版 系统之后,或许想要在不偏离系统原来状态下,试试 测试版 或 不稳定版 的软件包。

混用不同版本软件包出问题时,Even if you will occasionally encounter problems while mixing packages from different distributions, apt 可以处理得极为恰当把风险降到最低。最好的方法是把所有的发行版置于 /etc/apt/sources.list 文件内 (某些人总是置入三个发行版,不过还是要记得 不稳定版 是有经验用户的专属。) 且在 APT::Default-Release 参数中设置偏好的发行版 (见 第 6.2.3 节 “系统升级”) 。

假设 稳定版 是您的参考版本,但是 测试版 与 不稳定版 也列在 sources.list 文件内。在这个情况下,您可使用 apt install *软件包名称*/testing 安装来自 测试版 的软件包。若因相依性未满足而安装失败,可以在 测试版 内加入 -t testing 参数。同样的方式也适用于 不稳定版。

在此情况下,除了已经被其他发行版升级之外,升级 (upgradefull-upgrade) 只在 稳定版 内完成:其他的升级在各自的发行版内处理。稍后以 APT 缺省的优先性说明此行为。请使用 apt-cache policy (见专栏 秘诀 apt-cache policy) 查看指定的优先性。

每件事都围绕在 APT 只处理高于或等于已安装版本号软件包的前提下 (假设 /etc/apt/preferences 还未强迫优先性高于 1000 的某些软件包)。

秘诀 apt-cache policy

运行 apt-cache policy 显示每个软件包来源缺省的优先性,就能了解优先性的机制。也可使用 apt-cache policy *软件包名称* 命令显示指定软件包所有可用版本的优先性。

假设从Let’s assume that you have installed version 1 of a first package from 稳定版 安装第一个软件包的第一版且从and that version 2 and 3 are available respectively in 测试版 与 不稳定版 安装同软件包的第二版与第三版水。已安装的版本优先性为 100 但在but the version available in 稳定版 (相同的) 优先性为 990 (因为它是目标发布版的一部分)。在 测试版 与 不稳定版 的软件包其优先性为 500 (缺省不安装版本的优先性)。获选者为优先性 990 的版本1。软件包 “留在 稳定版 内”。

另个软件包的例子,已从 测试版 安装版本 2。版本 1 在 稳定版 且版本 3 在 不稳定版。因为优先性小于已安装的版本,所以版本 1 (优先性为 990 — 小于 1000) 已作废。只剩下优先性为 500 的版本 2 与版本 3。在此情况下,APT 选择较新的版本,即使用 不稳定版。若不要已安装自 测试版 的软件包,可以迁移至 不稳定版,必须指定来自于 不稳定版 优先性小于 500 (例如 490) 的软件包。修改 /etc/apt/preferences 文件即可:

  1. Package: *
  2. Pin: release a=unstable
  3. Pin-Priority: 490

6.2.7. 自动追踪已安装的软件包

apt 的必要功能之一是经由相依性追踪已安装的软件包。这些软件包称为 “自动”,且通常包括其程序库。

有了这些信息后,移除软件包时,软件包管理者可以计算该等不再需要的自动软件包 (因为没有 “手动安装” 软件包相依于他)。apt-get autoremove 会清除该等软件包。aptitudeapt 没有这个命令:辨认之后,前者自动移除它们,而用户不需手动运行后者命令。所有的情况下,在清除消息中列出所有影响到的软件包。

把软件包标记为自动是个好习惯,不需要时就被自动移除。apt-mark auto *软件包名称* 会标记该软件包为自动而 apt-mark manual *软件包名称* 则不标记。aptitude markautoaptitude unmarkauto 作用相同只是功能较多 (见 第 6.4.1 节 “aptitude)。命令交互接口的 aptitude 也可查看多个软件包的 “自动旗标”。

自动安装软件包出现在系统内。系由于从命令行取得该等信息,可使用 aptitude why *软件包名称* (aptapt-get 没有类似的功能):

  1. $

其他 deborphandebfoster

早年 aptapt-getaptitude 还不能追踪自动软件包时,以另外两个指令产不必要软件包清单:deborphandebfoster

deborphan 是两者中最基础的。扫瞄 libsoldlibs 区块 (没有补充命令) 在已安装软件包中,寻找不再相依于其他软件包者。其结果做为移除非必要软件包的依据。

debfoster 还有其他用法,极类似 APT:维护一个已安装的软件包以及需要互调用的软件包清单。系统内出现新的软件包且 debfoster 不知道它需要那些软件包,则在屏幕显示其相依的软件包清单。此程序提供新的选择:移除软件包 (或许连同相依者),标记为必要,或暂时忽略它。