在Debian系统中,有许多基于APT的软件包管理工具可用于执行基于仓库的软件包管理操作。这些工具包括apt、apt-get/apt-cache和aptitude。在本篇教程中,我们将介绍这三种基本的软件包管理工具的使用方法和特点。
对于涉及软件包安装或更新软件包元数据的软件包管理操作,必须有 root 权限。
一、aptitude工具
尽管 aptitude 是作者主要使用的一个非常好的可互动工具,但应该知道下列警示:
1、不建议在新版本发布后在 stable Debian 系统上使用 aptitude 命令来进行跨版本的系统升级。
- 建议使用”apt full-upgrade”或“apt-get dist-upgrade” 来进行这个操作。
2、aptitude命令有时候会为了testing 或 unstable Debian 系统升级清除大量软件包。
- 这个情况吓坏了许多的系统管理员。请不要惊慌;
- 这似乎大多数是由元软件包的依赖或推荐的软件包版本偏差造成的,例如 gnome-core;
- 要解决这个问题,可以在 aptitude 命令菜单中选择 “取消待执行的动作” ,退出 aptitude,并使用 “apt full-upgrade”;
- apt-get 和 apt-cache 是最基础 的基于 APT 的软件包管理工具:
- apt-get 和 apt-cache 只提供命令行用户界面;
- apt-get 是进行跨版本的主系统升级等操作的最合适工具;
- apt-get 提供了一个强大的软件包依赖解析器;
- apt-get 对硬件资源的要求不高。它消耗更少的内存并且运行速度更快;
- apt-cache 提供了一个 标准的正则表达式来搜索软件包名称和描述;
- apt-get 和 apt-cache 可以使用 /etc/apt/preferences 来管理软件包的多个版本,但这非常繁琐。
apt 命令是一个用于软件包管理的高级命令行界面。它基本上是 apt-get、apt-cache 和类似命令的一个封装,被设计为针对终端用户交互的界面,它默认启用了某些适合交互式使用的选项。
- apt 工具在用户使用 apt install 安装软件包时提供了一个友好的进度条;
- 在成功安装下载的软件包后,apt 将默认删除缓存的 .deb 软件包。
建议用户使用新的 apt(8) 命令用于 交互式的使用场景,而在 shell 脚本中使用 apt-get(8) 和apt-cache(8) 命令。
aptitude 命令是最通用的基于 APT 的软件包管理工具:
- aptitude 提供了一个全屏的交互式文本用户界面;
- aptitude 同样也提供了一个命令用户界面;
- aptitude 是用于日常软件包管理(例如检查已安装的软件包和搜索可用的软件包)的最合适工具;
- aptitude 对硬件资源的要求更高。它消耗更多的内存并且运行速度更慢;
- aptitude 提供一个增强的正则表达式来搜索所有的软件包元数据;
- aptitude 可以管理软件包的多个版本,并且不使用 /etc/apt/preferences,这会十分直观。
二、基础软件包管理操作
下面是使用 apt(8), aptitude(8) 和 apt-get(8) / apt-cache(8) 的命令行基本软件包管理操作。
使用 apt(8), aptitude(8) 和 apt-get(8) / apt-cache(8) 的命令行基本软件包管理操作:
apt 语法 |
aptitude 语法 |
apt-get / apt-cache 语法 |
说明 |
---|---|---|---|
apt update |
aptitude update |
apt-get update |
更新软件包档案库元数据 |
apt install foo |
aptitude install foo |
apt-get install foo |
安装 “foo ” 软件包的候选版本以及它的依赖 |
apt upgrade |
aptitude safe-upgrade |
apt-get upgrade |
安装已安装的软件包的候选版本并且不移除任何其它的软件包 |
apt full-upgrade |
aptitude full-upgrade |
apt-get dist-upgrade |
安装已安装的软件包的候选版本,并且需要的话会移除其它的软件包 |
apt remove foo |
aptitude remove foo |
apt-get remove foo |
移除 “foo ” 软件包,但留下配置文件 |
apt autoremove |
N/A | apt-get autoremove |
移除不再需要的自动安装的软件包 |
apt purge foo |
aptitude purge foo |
apt-get purge foo |
清除 “foo ” 软件包的配置文件 |
apt clean |
aptitude clean |
apt-get clean |
完全清除本地仓库的软件包检索文件 |
apt autoclean |
aptitude autoclean |
apt-get autoclean |
清除本地仓库中过时软件包的软件包检索文件 |
apt show foo |
aptitude show foo |
apt-cache show foo |
显示 “foo ” 软件包的详细信息 |
apt search 正则表达式 |
aptitude search regex |
apt-cache search regex |
搜索匹配 regex 的软件包 |
N/A | aptitude why regex |
N/A | 解释匹配 regex 的软件包必须被安装的原因 |
N/A | aptitude why-not regex |
N/A | 解释匹配 regex 的软件包不必安装的原因 |
apt list --manual-installed |
aptitude search '~i!~M' |
apt-mark showmanual |
列出手动安装的软件包 |
apt / apt-get 和 aptitude 能够混用,没有大问题。“aptitude why regex” 可以通过 “aptitude -v why regex” 列出更多的信息。类似的信息可以通过”apt rdepends package” 或 “apt-cache rdepends package” 获取。
当 aptitude 命令在命令行模式下启动后遇到了一些问题(例如软件包冲突),可以在之后的提示中按下 “e” 键切换到全屏的交互模式。
虽然 aptitude 命令提供了丰富的功能,例如增强的软件包解析器,但它的复杂程度导致了(或可能导致)一些退步,例如 Bug #411123、Bug #514930 及 Bug #570377。如有疑问,请使用 apt,apt-get 和 apt-cache 命令来替代 aptitude 命令。
另外,可以在 “aptitude” 后面使用的命令选项。
aptitude(8) 中重要的命令选项:
命令选项 | 说明 |
---|---|
-s |
模拟命令的结果 |
-d |
仅下载,不进行安装/更新 |
-D |
在自动安装和删除前,显示简要的说明 |
三、aptitude交互式使用
要使用交互式的软件包管理,可以像下面那样以交互模式启动 aptitude 。
$ sudo aptitude -u Password:
这将更新档案库信息的本地副本,并以菜单的形式全屏显示软件包列表。 aptitude 将它的配置放在 “~/.aptitude/config”。
如果想用 root 的配置而非使用者的,可以在上面的例子中使用 “sudo -H aptitude …” 代替 “sudo aptitude …” 。当 aptitude 以交互模式启动时,会自动设置待执行的动作。如果您不喜欢,您可以通过菜单:“动作” → “取消待执行的动作” 来取消它。
四、aptitude的按键绑定
在全屏模式下浏览软件包状态和设置动作的按键如下。
aptitude 的按键绑定:
快捷键 | 键绑定功能 |
---|---|
F10 或 Ctrl-t |
菜单 |
? |
显示按键帮助(更加完整的清单) |
F10 → 帮助 → 用户手册 |
显示用户手册 |
u |
更新软件包档案库信息 |
+ |
标记该软件包以便升级或安装 |
- |
标记该软件包以便移除(保留配置文件) |
_ |
标记该软件包以便清除(移除配置文件) |
= |
将软件包设为保持状态 |
U |
标记所有可升级包(动作如同 full-upgrade) |
g |
开始 下载 并 安装 所选择包 |
q |
退出该界面并保存变更 |
x |
退出该界面并清除变更 |
Enter |
查看软件包的信息 |
C |
查看软件包的变更记录 |
l |
变更软件包的显示限制 |
/ |
搜寻匹配的第一个软件包 |
\ |
重复上一个搜索 |
可以通过命令行指定文件名称,也可以通过按 “l” 或 “/” 之后在菜单提示下输入下列所述的 aptitude 正则表达式。aptitude 正则表达式可以使用 “~n” 开头后接软件包名称的字符串来精确匹配软件包名称。
需要在可视化界面中按下 “U” 键让所有的已安装软件包升级到可用版本 。否则只有选中的软件包和一些与之有依赖关系的软件包才能被升级到可用版本。
五、aptitude软件包视图
aptitude(8) 全屏交互模式下,软件包列表里的软件包会像下面的例子那样显示。
idA libsmbclient -2220kB 3.0.25a-1 3.0.25a-2
该行的从左到右的含义如下。
- “状态”标签 (第一个字母);
- “动作”标签(第二个字母);
- “自动”标签(第三个字母);
- 软件包名称;
- 该“动作”对磁盘空间的变化;
- 软件包当前版本;
- 软件包可用版本。
注意:可以在帮助菜单中找到完整的标签列表,按“?”即可在帮助菜单底部显示。
可用版本 的选择是依据当前的本地首选项。软件包视图的几种类型都可以在“ 视图 ”菜单下找到。
aptitude 视图:
视图 | 视图描述 |
---|---|
软件包视图 |
参见 表 2.10 “标准软件包视图的分类” (默认) |
检查推荐结果 |
列出推荐安装但还没有安装的软件包 |
平面软件包列表 |
不分类地列出软件包 (用于正则表达式) |
Debtags 浏览器 |
列出由 debtags 进行分类的软件包 |
源代码软件包视图 |
列出由源代码软件包分组的软件包 |
请帮助我们改进用 debtags 标记的软件包!
标准“软件包视图”分类软件包的方法与带有一些额外功能的 dselect 有点像。
标准软件包视图的分类:
分类 | 视图描述 |
---|---|
可升级软件包 |
按照 section → area → 软件包 的顺序显示列出软件包 |
新软件包 |
同上 |
已安装软件包 |
同上 |
未安装软件包 |
同上 |
过期的和在本地创建的软件包 |
同上 |
虚拟软件包 |
列出同样功能的软件包 |
软件集 |
列出一个特定任务所需的不同功能的软件包 |
软件集视图可以用来为任务选出最佳的软件包。
六、aptitude搜索方式选项
aptitude 提供了几个可以使用正则表达式来搜索软件包的选项。
1、shell 命令行:
“aptitude search ‘aptitude_regex’” 列出安装状态、软件包名称和匹配软件包的剪短描述;
“aptitude show ‘package_name’” 列出软件包的详细描述。
2、全屏交互模式:
- “l” 可以限制匹配软件包的视图;
- “/” 搜索匹配的软件包;
- “\” 向后搜索匹配的软件包;
- “n” 查找下一个;
- “N” 查找上一个。
字符串 package_name 被看作软件包名称的精确字符串匹配,除非它是以 “~” 开头的正则表达式。
七、aptitude正则表达式
aptitude 正则表达式是类 mutt 的拓展 ERE,aptitude 具体的特殊匹配规则扩展如下。
aptitude 正则表达式:
扩展匹配规则描述 | 正则表达式 |
---|---|
匹配软件包名称 | ~nregex_name |
匹配描述 | ~dregex_description |
匹配软件集名称 | ~tregex_task |
匹配 debtag | ~Gregex_debtag |
匹配维护者 | ~mregex_maintainer |
匹配软件包的 section | ~sregex_section |
匹配软件包版本 | ~Vregex_version |
匹配档案库 | ~A{bookworm,trixie,sid } |
匹配来源 | ~O{debian,… } |
匹配优先级 | ~p{extra,important,optional,required,standard } |
匹配必要的软件包 | ~E |
匹配虚拟软件包 | ~v |
匹配新的软件包 | ~N |
匹配待执行的动作 | ~a{install,upgrade,downgrade,remove,purge,hold,keep } |
匹配已安装软件包 | ~i |
匹配带有 A 标签的已安装软件包(自动安装的软件包) | ~M |
匹配不带有 A 标签的已安装软件包(管理员选择的软件包) | ~i!~M |
匹配已安装并且是可升级的软件包 | ~U |
匹配已删除但未清除的软件包 | ~c |
匹配已移除,已清除或可移除的软件包 | ~g |
匹配破坏依赖关系的软件包 | ~b |
匹配破坏 type 依赖关系的软件包 | ~B类型 |
匹配 pattern 软件包的 type 依赖关系 | ~D[类型:]模式 |
匹配 pattern 软件包破坏的 type 依赖关系 | ~DB[类型:]模式 |
匹配依赖于 pattern 软件包的 type 依赖的软件包 | ~R[类型:]模式 |
匹配依赖于 pattern 软件包破坏的 type 依赖的软件包 | ~RB[类型:]模式 |
匹配其它已安装软件包所依赖的软件包 | ~R~i |
匹配没有被其它已安装软件包所依赖的软件包 | !~R~i |
匹配其它已安装软件包所依赖或建议安装的软件包 | ~R~i|~R推荐:~i |
匹配 pattern 过滤版本之后的软件包 | ~S 过滤 模式 |
匹配所有软件包(真) | ~T |
不匹配软件包(假) | ~F |
- 正则表达式使用的是 ERE,就跟 egrep(1)、awk(1) 和 perl(1) 这些典型的类 Unix 文本工具中所使用的 “^”、“.*”、“$” 等是相同的。
- 依赖关系 type 是一种特定的软件包相互关系(depends、predepends、recommends、suggests、conflicts、replaces、provides)。
- 默认的 type 依赖关系是 “depends”。
当 regex_pattern 为空字符串时,请立即在命令后面添加 “~T”。
下面是一些快捷方式:
- “~Pterm” == “~Dprovides:term”;
- “~Cterm” == “~Dconflicts:term”;
- “…~W term” == “(…|term)”。
用户熟悉 mutt 的快速选择,因为 mutt 的灵感来源于表达式语法。
lenny 版本的 aptitude(8) 中,新的长格式语法,例如 “?broken”,在正则表达式中可以用来等效为它旧的短格式 “~b”。现在空格字符 “ ” 被认为是除了波浪字符 “~” 外的另一个正则表达式终止字符。
八、aptitude的依赖解决
如果通过菜单 “F10 → 选项 → 首选项 → 正在处理依赖关系” 进行相应的设置,则在 aptitude 中选择一个软件包时,不仅会将其 “Depends:” 列表中的软件包选上,“Recommends:” 列表中的软件包也会被选上。在 aptitude 下,这些自动安装的软件包在不再需要时会自动移除。
aptitude 命令中控制 “自动安装” 行为的标签也可以通过 apt 软件包中的 apt-mark(8) 命令来设置。
九、软件包活动日志
可以在日志文件里查询到软件包活动历史。
软件包活动日志文件:
文件 | 内容 |
---|---|
/var/log/dpkg.log |
dpkg 级的软件包活动日志 |
/var/log/apt/term.log |
通用 APT 活动日志 |
/var/log/aptitude |
aptitude 命令活动日志 |
事实上,很难从这些日志上快速获得有用的信息。