6.2. aptitude、apt-get和 apt 命令
APT 是个原先有图形接口的大计划。以包括核心应用程序的程序库为基础,且包括第一个前端 — 命令行指令 — apt-get
。apt
是 APT 的第二个命令行指令包括若干处理错误的 apt-get
。
其他众多的图形界面以外部项目形式出现:synaptic
,aptitude
(它同时包含文本模式界面和图形界面 — 即使尚未完成),wajig
,等等。最为推荐的界面,apt
,会在本节案例中使用。注意,尽管如此,apt-get
与 aptitude
的命令行语法也仍与之非常类似。在apt
、apt-get
、aptitude
存在较大差异时,将会详述差异。
6.2.1. 开端
对于 APT 的任何操作,需要更新可用包的列表;这可以简单地通过apt update
来完成。取决于您连接的速度,该操作需要花费一定时间,因为这包括下载一定数量的软件包
/源代码
/翻译-*语言代码*
文件,这些文件随着 Debian 的开发而逐渐变大(对于main
部分,至少有 10MB 数据)。当然,从光盘中安装无需任何下载 — 此情况下,操作是十分迅速的。
6.2.2. 安装和卸载
通过APT,软件包可以从系统中添加或移除,命令分别为apt install*软件包*
、apt remove*软件包*
。在以上两种情况中,APT 将会自动安装必要的依赖包或者删除依赖于删除包的软件包。apt purge*软件包*
命令包含一个彻底删除 — 相关的配置文件也会被删除。
TIP 多次安装同一批软件包
在几台电脑上安装同一批软件包会很实用。这很容易做到。
首先,从电脑中取得所安装软件包的列表作为用于复制的“模板”。
$
pkg-list
文件内容是已安装软件包的清单。然后,用以下的指令把 pkg-list
文件复制在欲更新的电脑:
- ## Update dpkg's database of known packages↵
- #
avail=`mktemp`
↵- #
apt-cache dumpavail > "$avail"
↵- #
dpkg --merge-avail "$avail"
↵- #
rm -f "$avail"
↵- ## Update dpkg's selections↵
- #
dpkg --set-selections < pkg-list
↵- ## Ask apt-get to install the selected packages↵
- #
apt-get dselect-upgrade
↵
第一个命令记录在 dpkg 库中可用的软件包列表,然后 dpkg --set-selections
恢复选中你想要安装的包,apt-get
的激活执行所需要的操作!aptitude
没有这样的命令。
TIP 同时进行卸载和安装
在命令 apt
(或 apt-get
、或 aptitude
) 加入后缀就可以同时安装指定的软件包与移除其他软件包。在 apt install
命令加入 “-
” 及希望移除的软件包名称。在 apt remove
命令加入 “+
” 及希望安装的软件包名称。
下面的例子展示两种不同方法来安装package1 和卸载package2。
- #
apt install package1 package2-
↵- [...]↵
- #
apt remove package1+ package2
↵- [...]↵
此方法也可用于把不同的软件包排除在外,比如由于Recommends
造成的。一般,依赖解决者会用此作为寻找其他办法的线索。
技巧 apt --reinstall
和 aptitude reinstall
在软件包中的文件发生移除或更改时,系统有时候可能会受损。恢复这些文件最简单的方法是重装受影响的软件包。不幸的是,包系统会认为后者已安装而拒绝重新安装;为了避免此情况,使用apt
和apt-get
命令的 --reinstall
选项。如下命令会重新安装postfix,即使它已存在:
#
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 版本
#
更进一步 .deb
文件的缓存
APT 在 /var/cache/apt/archives/
目录中保存每个下载的 .deb
文件的副本。在频繁更新的情况下,该目录下每个软件包的数个版本可能会占用大量磁盘空间;您应当经常整理它们。可以使用如下两个命令:apt-get clean
完全清空整个目录;apt-get autoclean
仅移除不会再下载的软件包(因为它们已从 Debian 镜像中消失)和明显无用的软件包(配置参数APT::Clean-Installed
可以阻止移除安装中的.deb
文件)。注意apt
不支持上述命令。
6.2.3. 系统升级
常规升级是推荐的,因为它们包含最新的安全更新。要升级,可使用apt upgrade
、apt-get upgrade
、aptitude safe-upgrade
(当然需在apt update
之后)。该命令会查找要升级的已安装包,同时不移除任何包。也就是说,目标是确保可能的侵入式升级最小化。apt-get
命令略苛刻于 aptitude
或 apt
命令,因为它会拒绝安装未预先安装的软件包。
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的声誉基于此项强大的功能。
不同于 apt
与 aptitude
,apt-get
不知道 full-upgrade
命令。反而,您应使用 apt-get dist-upgrade
(”升级发行版”),此古老且知名的命令也被 apt
与 aptitude
接受给读者相当的便利。
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
文件内给予特定的条目就行了:
- Package: *
- Pin: release a=experimental
- Pin-Priority: 500
暂时假设您只需用到 Debian 稳定版的软件包。除非特别指明,不会安装其他版本的软件包。可以在 /etc/apt/preferences
文件内写入以上的条目:
- Package: *
- Pin: release a=stable
- Pin-Priority: 900
- Package: *
- Pin: release o=Debian
- Pin-Priority: -10
a=stable
设置发行版的名称。o=Debian
限制来自 “Debian” 的软件包。
假设若干服务器内的程序使用 Perl 5.14 且不希望被升级为其他版本。您需用到此条目:
- Package: perl
- Pin: version 5.14*
- Pin-Priority: 1001
此配置档的参考文档在手册的 apt_preferences(5),以 man apt_preferences
命令就可看到。
秘诀 在 /etc/apt/preferences
内的评论
/etc/apt/preferences
文件没有放置评论的官方语法,但可以在每个条目的 “Explanation
” 字段置入若干说明:
- Explanation: The package xserver-xorg-video-intel provided
- Explanation: in experimental can be used safely
- Package: xserver-xorg-video-intel
- Pin: release a=experimental
- 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
参数。同样的方式也适用于 不稳定版。
在此情况下,除了已经被其他发行版升级之外,升级 (upgrade
与 full-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
文件即可:
- Package: *
- Pin: release a=unstable
- Pin-Priority: 490
6.2.7. 自动追踪已安装的软件包
apt
的必要功能之一是经由相依性追踪已安装的软件包。这些软件包称为 “自动”,且通常包括其程序库。
有了这些信息后,移除软件包时,软件包管理者可以计算该等不再需要的自动软件包 (因为没有 “手动安装” 软件包相依于他)。apt-get autoremove
会清除该等软件包。aptitude
与 apt
没有这个命令:辨认之后,前者自动移除它们,而用户不需手动运行后者命令。所有的情况下,在清除消息中列出所有影响到的软件包。
把软件包标记为自动是个好习惯,不需要时就被自动移除。apt-mark auto *软件包名称*
会标记该软件包为自动而 apt-mark manual *软件包名称*
则不标记。aptitude markauto
与 aptitude unmarkauto
作用相同只是功能较多 (见 第 6.4.1 节 “aptitude
”)。命令交互接口的 aptitude
也可查看多个软件包的 “自动旗标”。
自动安装软件包出现在系统内。系由于从命令行取得该等信息,可使用 aptitude why *软件包名称*
(apt
与 apt-get
没有类似的功能):
$
其他 deborphan
与 debfoster
早年 apt
、apt-get
与 aptitude
还不能追踪自动软件包时,以另外两个指令产不必要软件包清单:deborphan
与 debfoster
。
deborphan
是两者中最基础的。扫瞄 libs
与 oldlibs
区块 (没有补充命令) 在已安装软件包中,寻找不再相依于其他软件包者。其结果做为移除非必要软件包的依据。
debfoster
还有其他用法,极类似 APT:维护一个已安装的软件包以及需要互调用的软件包清单。系统内出现新的软件包且 debfoster
不知道它需要那些软件包,则在屏幕显示其相依的软件包清单。此程序提供新的选择:移除软件包 (或许连同相依者),标记为必要,或暂时忽略它。