前言
This blog does have Super Cow Powers.
本文会简略地介绍以下内容:
如果想了解详细的内容,请自行阅读对应的资料。
.deb
.deb 是 Debian 及其衍生系统(如Ubuntu)的软件包格式,本质上是一个 ar 归档文件,包含软件的二进制文件、配置文件、依赖信息等。
通过 ar 命令可以查看其内部结构( code.deb 的获取方式见备注 ):
~$ ar t code.deb
debian-binary
control.tar.xz
data.tar.xz
_gpgorigin
典型的 .deb 包包含 3 部分:
- debian-binary:文本文件,记录 deb 格式版本(通常为 2.0)
- control.tar.gz:压缩包,包含软件包的元数据和控制脚本,核心文件为 control(依赖、版本等信息)
- data.tar.xz/gz:压缩包,包含软件的实际文件(二进制、配置、文档等),解压后会安装到系统对应路径(如 /usr/bin/、/etc/)
上面演示中出现的
_gpgorigin并不是 .deb 包常见的内容,用于验证包的完整性和真实性。
dpkg
工具介绍
dpkg 是 Debian 系 Linux 中最基础的包管理工具,全称为 Debian Package Manager 。
它的主要功能如下:
- 直接操作 .deb 格式的软件包(安装、卸载、查询、验证);
- 维护系统软件包数据库(记录已安装包的状态、文件列表等);
- 处理软件包安装过程中的文件解压、配置脚本执行等底层操作。
它的上游工具是 apt 和 aptitude,它的下游工具是 dpkg-deb 和 dpkg-query。
也就是说 dpkg 是 dpkg-deb 和 dpkg-query 的前端工具,与此同时 apt 和 aptitude 是 dpkg 的前端工具。
如果你查询 dpkg、dpkg-deb 和 dpkg-query 的手册,会发现 dpkg-deb 和 dpkg-query 有的选项,dpkg 基本上也有。事实上 dpkg 工具作为一个“前端”,可以识别并调用 dpkg-query 和 dpkg-deb 的大部分常用选项,但它并不支持这两个工具的所有选项,尤其是那些用于精细化控制的选项,当他发现用户调用的选项是其后端的选项,其会传递参数给后端并将控制权交给后端执行对应的选项。
注意:dpkg 是底层工具,不负责自动解决依赖关系,并且其假定用户已经将 .deb 软件包下载到本地或者能以 URL 的形式提供。处理依赖关系或者自动下载等功能需要用到它的上游工具(实际上日常使用也推荐使用它的上游工具)。详情见dpkg 安装软件包小节、 apt 的介绍小节和 aptitude 的介绍小节。
可以参考Debian系统包管理工具思维导图理解各个工具之间的关系。
主要功能
安装软件包
- 选项:
-i, --install package-file...
举例,如下:
~$ sudo dpkg -i code.deb
注意:dpkg 安装 deb 软件包时,会先解压文件安装,再检查依赖是否完整,如果依赖不完整,那么 dpkg 还是会认为 deb 软件包安装成功,并提醒用户自行下载依赖并安装。
如果发现依赖缺失,可以利用 apt 等高级工具安装依赖,比如使用命令 apt install -f 尝试修复。
即使是本地 deb 包,也建议直接使用apt等高级工具来安装,这样便于处理依赖关系,更多见 apt 章节。
卸载软件包
- 选项:
-r, --remove package...|-a|--pending
该选项用于卸载软件包,但保留配置文件。
如果提供-a或--pending而不是软件包名称,则将移除文件/var/lib/dpkg/status中标记为要移除的所有已解压软件包。
举例,如下:
~$ sudo dpkg -r code
- 选项:
-P, --purge package...|-a|--pending
该选项用于卸载软件包,并删除配置文件。
如果提供-a或--pending而不是软件包名称,则将移除文件/var/lib/dpkg/status中标记为要移除的所有已解压软件包。
举例,如下:
~$ sudo dpkg -P code
修复损坏的软件包
- 选项:
--configure package...|-a|--pending
该选项用于配置已解压但尚未配置的软件包,如果提供-a或--pending而不是软件包名称,则将配置所有已解压但未配置的软件包。
当软件包安装/配置过程中断(如断电、手动终止),可能导致“半配置”状态,即文件已经解压,但是软件包自带的配置脚本(如 postinst)没有完全运行,导致配置"卡在一半"了,可以使用该选项处理。
调用后端工具
如 dpkg 的工具介绍中所说的一样,dpkg 可以直接使用其后端工具的大部分选项。
举例:如下:
~$ dpkg-query -l code | tail -3
||/ 名称 版本 体系结构 描述
+++-==============-==================-============-=================================
ii code 1.104.1-1758154125 amd64 Code editing. Redefined.
~$ dpkg -l code | tail -3
||/ 名称 版本 体系结构 描述
+++-==============-==================-============-=================================
ii code 1.104.1-1758154125 amd64 Code editing. Redefined.
# 可以看到 dpkg-query 的选项 -l 也可以通过 dkpg 直接使用(dpkg会自动识别并传递参数给 dpkg-query )
详情见 dpkg-deb 的功能介绍与 dpkg-query 的功能介绍。
dpkg-deb
工具介绍
dpkg-deb 用于打包、解包 Debian 软件包(.deb)以及提供相关信息。
可以参考Debian系统包管理工具思维导图理解各个工具之间的关系。
主要功能
查询 .deb 软件包的信息
- 选项:
-I, --info archive [control-file-name...]
该选项用于显示 .deb 软件包的信息。
举例,如下:
~$ dpkg-deb -I code.deb
新格式的 Debian 软件包,格式版本 2.0。
大小 116522198 字节:主控包=3292 字节。
1439 bytes, 18 lines control
4461 字节, 131 行 * postinst #!/usr/bin/env
920 字节, 34 行 * postrm #!/bin/bash
274 字节, 6 行 * prerm #!/usr/bin/env
234 bytes, 6 lines templates
Package: code
Version: 1.109.4-1771257466
Section: devel
Depends: ca-certificates, libasound2 (>= 1.0.17), libatk-bridge2.0-0 (>= 2.5.3), libatk1.0-0 (>= 2.11.90), libatspi2.0-0 (>= 2.9.90), libc6 (>= 2.14), libc6 (>= 2.16), libc6 (>= 2.17), libc6 (>= 2.2.5), libc6 (>= 2.25), libc6 (>= 2.28), libc6 (>= 2.4), libcairo2 (>= 1.6.0), libcurl3-gnutls | libcurl3-nss | libcurl4 | libcurl3, libdbus-1-3 (>= 1.9.14), libexpat1 (>= 2.1~beta3), libgbm1 (>= 17.1.0~rc2), libglib2.0-0 (>= 2.39.4), libgtk-3-0 (>= 3.9.10), libgtk-3-0 (>= 3.9.10) | libgtk-4-1, libnspr4 (>= 2:4.9-2~), libnss3 (>= 2:3.30), libnss3 (>= 3.26), libpango-1.0-0 (>= 1.14.0), libudev1 (>= 183), libx11-6, libx11-6 (>= 2:1.4.99.1), libxcb1 (>= 1.9.2), libxcomposite1 (>= 1:0.4.4-1), libxdamage1 (>= 1:1.1), libxext6, libxfixes3, libxkbcommon0 (>= 0.5.0), libxkbfile1 (>= 1:1.1.0), libxrandr2, xdg-utils (>= 1.0.2)
Recommends: libvulkan1
Priority: optional
Architecture: amd64
Maintainer: Microsoft Corporation <vscode-linux@microsoft.com>
Homepage: https://code.visualstudio.com/
Installed-Size: 470414
Provides: visual-studio-code
Conflicts: visual-studio-code
Replaces: visual-studio-code
Description: Code editing. Redefined.
Visual Studio Code is a new choice of tool that combines the simplicity of
a code editor with what developers need for the core edit-build-debug cycle.
See https://code.visualstudio.com/docs/setup/linux for installation
instructions and FAQ.
提取 .deb 软件包中的文件
- 选项:
-x, --extract archive directory
该选项用于将 .deb 软件包中的文件系统树(只有文件系统树,不包含DEBIAN目录)提取到指定的目录。
注意,将包提取到根目录并不会导致正确的安装!请使用 dpkg 来安装包。
举例,如下:
~$ dpkg-deb -x code.deb code
~$ tree code | head -10
code
└── usr
└── share
├── appdata
│ └── code.appdata.xml
├── applications
│ ├── code.desktop
│ └── code-url-handler.desktop
├── bash-completion
│ └── completions
-
选项:
-X, --vextract archive directory
类似上面的选项(-x),不过这个选项会显示解压的过程(每解压一个文件就显示该文件的路径)。
注意,将包提取到根目录并不会导致正确的安装!请使用 dpkg 来安装包。 -
选项:
-R, --raw-extract archive directory类似上面的选项(-x),不过该选项用于会完整地提取出 .deb 包的所有内容(文件系统树和DEBIAN目录)。
注意,将包提取到根目录并不会导致正确的安装!请使用 dpkg 来安装包。
另外注意, dpkg 不能直接调用该选项。
举例,如下:
~$ dpkg-deb -R code.deb code
~$ tree code | head -10
code
├── DEBIAN
│ ├── control
│ ├── postinst
│ ├── postrm
│ ├── prerm
│ └── templates
└── usr
└── share
├── appdata
创建新的 .deb 软件包
- 选项:
-b, --build binary-directory [archive|directory]
从存储在binary-directory中的文件系统树创建一个 debian 归档文件(即 .deb 软件包)。
binary-directory规定必须有一个DEBIAN子目录,其中包含控制信息文件,例如control。
构建时,DEBIAN目录本身不会包含在最终包的根文件系统中,但其内容会成为包的控制数据。
以下是DEBIAN目录中一些关键的特殊文件及其作用:文件名 必须? 作用 control 必需 这是核心文件,也是唯一绝对必需的文件。它定义了包的“身份信息”和“安装规则”,如包名、版本、架构、依赖关系、描述等。没有它,dpkg-deb 就不知道该如何描述这个包,构建会直接失败 。 preinst 可选 这是一个在软件包被解压之前执行的脚本。通常用于在实际安装前做一些准备工作,比如停止可能会冲突的服务,或者创建必要的用户和组 。 postinst 可选 这是最常用的维护者脚本之一,在软件包被解压并配置完成后执行。它用于完成安装后的设置工作,比如解压后创建符号链接、更新缓存、启动服务等 。 prerm 可选 在软件包被移除之前执行的脚本。常用于优雅地停止将要被移除的软件包所提供的服务 。 postrm 可选 在软件包被移除之后执行的脚本。用于执行最后的清理工作,比如删除用户、清理配置文件或日志文件 。 conffiles 可选 这个文件列出了该软件包中需要被作为配置文件对待的文件列表(每行一个)。dpkg 通过这个列表在升级时特别处理这些文件,以保留用户对配置文件的修改,而不会被新版本直接覆盖 。 shlibs 可选 这个文件记录了该软件包提供的共享库及其对应的依赖关系信息。它主要被 dpkg-shlibdeps 工具在构建时读取,用来为依赖该库的其他软件包自动生成准确的依赖关系 。 md5sums 可选 这个文件列出了包中所有文件的 MD5 校验和。dpkg 用它来验证软件包文件在安装后是否被篡改或损坏。通常由构建工具自动生成,但手动打包时也可以自己提供 。 triggers 可选 这个文件用于声明该软件包对某些事件的“触发”或“感兴趣”。这是一种更高级的机制,允许一个包的特定动作(如运行某个脚本)延迟到所有包处理完后再统一执行,以提高安装效率。
举例,如下:
~$ mkdir -p my-package/DEBIAN my-package/usr/local/bin
~$ cat > my-package/DEBIAN/control << EOF
Package: my-package
Version: 1.0
Architecture: amd64
Maintainer: Your Name <your@email.com>
Depends: libc6 (>= 2.34)
Description: A simple demo package
This is a minimal .deb package for testing.
EOF
~$ cat > my-package/usr/local/bin/hello << EOF
#!/bin/bash
echo "Hello, dpkg!"
EOF
~$ chmod u+x my-package/usr/local/bin/hello
~$ tree my-package
my-package
├── DEBIAN
│ └── control
└── usr
└── local
└── bin
└── hello
~$ dpkg-deb --build my-package
dpkg-deb: 正在 'my-package.deb' 中构建软件包 'mypkg'。
~$ dpkg-deb -I my-package.deb
新格式的 Debian 软件包,格式版本 2.0。
大小 616 字节:主控包=251 字节。
192 bytes, 7 lines control
Package: mypkg
Version: 1.0
Architecture: amd64
Maintainer: Your Name <your@email.com>
Depends: libc6 (>= 2.34)
Description: A simple demo package
This is a minimal .deb package for testing.
dpkg-query
工具介绍
dpkg-query 是一个用于查询 dpkg 数据库的工具。
可以参考Debian系统包管理工具思维导图理解各个工具之间的关系。
主要功能
查询 dpkg 数据库中已知软件包的信息
列出已知的软件包
- 选项:
-l, --list [package-name-pattern...].
该选项用于列出 dpkg 数据库中已知的软件包。
可以提供一个模式用于查找特定的软件包,或者不给出模式,会列出所有已知的软件包。
举例,如下:
~$ dpkg-query -l code
......
||/ 名称 版本 体系结构 描述
+++-==============-==================-============-=================================
ii code 1.104.1-1758154125 amd64 Code editing. Redefined.
列出已知的软件包的状态(详细信息)
- 选项:
-s, --status [package-name...]
该选项用于输出 dpkg 数据库中已知的软件包的状态(详细信息)。
主要用于查询软件包的版本、依赖、配置状态等信息。
可以提供一个模式用于查找特定的软件包,或者不给出模式,会列出所有已知的软件包。
举例,如下:
~$ dpkg-query -s code
Package: code
Status: install ok installed
Priority: optional
Section: devel
Installed-Size: 446270
Maintainer: Microsoft Corporation <vscode-linux@microsoft.com>
Architecture: amd64
Version: 1.104.1-1758154125
Replaces: visual-studio-code
Provides: visual-studio-code
Depends: ca-certificates, libasound2 (>= 1.0.17), libatk-bridge2.0-0 (>= 2.5.3), libatk1.0-0 (>= 2.11.90), libatspi2.0-0 (>= 2.9.90), libc6 (>= 2.14), libc6 (>= 2.16), libc6 (>= 2.17), libc6 (>= 2.2.5), libc6 (>= 2.25), libc6 (>= 2.28), libcairo2 (>= 1.6.0), libcurl3-gnutls | libcurl3-nss | libcurl4 | libcurl3, libdbus-1-3 (>= 1.9.14), libexpat1 (>= 2.1~beta3), libgbm1 (>= 17.1.0~rc2), libglib2.0-0 (>= 2.37.3), libgtk-3-0 (>= 3.9.10), libgtk-3-0 (>= 3.9.10) | libgtk-4-1, libnspr4 (>= 2:4.9-2~), libnss3 (>= 2:3.30), libnss3 (>= 3.26), libpango-1.0-0 (>= 1.14.0), libudev1 (>= 183), libx11-6, libx11-6 (>= 2:1.4.99.1), libxcb1 (>= 1.9.2), libxcomposite1 (>= 1:0.4.4-1), libxdamage1 (>= 1:1.1), libxext6, libxfixes3, libxkbcommon0 (>= 0.5.0), libxkbfile1 (>= 1:1.1.0), libxrandr2, xdg-utils (>= 1.0.2)
Recommends: libvulkan1
Conflicts: visual-studio-code
Description: Code editing. Redefined.
Visual Studio Code is a new choice of tool that combines the simplicity of
a code editor with what developers need for the core edit-build-debug cycle.
See https://code.visualstudio.com/docs/setup/linux for installation
instructions and FAQ.
Homepage: https://code.visualstudio.com/
列出已知的软件包安装到系统上的文件
- 选项:
-L, --listfiles package-name...
该选项用于列出指定软件包安装到你系统上的文件。
必须提供一个模式用于查找特定的软件包。
举例,如下:
~$ dpkg-query -L code | tail -5
/usr/share/pixmaps
/usr/share/pixmaps/vscode.png
/usr/share/zsh
/usr/share/zsh/vendor-completions
/usr/share/zsh/vendor-completions/_code
查询文件归属
- 选项:
-S, --search filename-search-pattern...
该选项用于查询系统中某个文件由哪个软件包提供。
必须提供一个模式用于查找特定的软件包。
举例,如下:
~$ dpkg-query -S /usr/share/appdata/code.appdata.xml
code: /usr/share/appdata/code.appdata.xml
apt
工具介绍
apt 是 APT 软件包管理系统的前端。
APT 全称为 Advanced Package Tool ,是建立在 dpkg 之上的一套更高级的包管理系统。
apt 为 APT 软件包管理系统提供了一个高级的命令行接口。它旨在作为最终用户界面,并且默认启用一些更适合交互式使用的选项,与更专门的 APT 工具(如 apt-get 和 apt-cache )相比的话。可以理解为 apt 是 apt-get 和 apt-cache 的封装,它更现代,对用户更友好。
apt 基于 apt-get,而 apt-get 基于 dpkg ,因此 dpkg 和 apt 能识别彼此安装的 deb 软件包。
与 dpkg 相比,apt 不假定用户已经将 .deb 软件包下载到本地或者能以 URL 的形式提供,其能够自动的从所用的 Linux 发行版仓库中下载并安装软件包。更重要的是其能够自动解析依赖关系,根据需求安装额外的库和软件包。
就像 dpkg 一样,apt 的大部分功能依赖其后端工具。观察 apt 的手册会发现其标明了它的功能来自于那个后端工具,如 update (apt-get(8))。详细的选项可以进一步阅读对应的手册来知晓功能,比如这里就应该阅读 apt-get(8) 手册。
可以参考Debian系统包管理工具思维导图理解各个工具之间的关系。
apt 仓库
apt 默认的软件存储库位置是在安装 Linux 发行版时设置的,仓库位置保存文件 /etc/apt/sources.list 中。
举例,如下:
~$ cat /etc/apt/sources.list
deb http://mirrors.aliyun.com/ubuntu/ noble main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ noble main restricted universe multiverse
......
在许多情况下,根本用不着添加/删除软件仓库,所以没必要该这个文件。但是,apt 只会从这些仓库拉取软件。此外,在搜索要安装或者更新的软件时,apt 也只检查这些仓库。如果你想为你的软件包管理系统加入一些额外的软件仓库,那就得修改文件了。
该文件中存在这如下结构或者说格式的文本:
deb(or deb-src) address distribution_name package_type_list
- deb 表明这是一个已编译程序的仓库源(即提供二进制包,用于下载 .deb 文件 )
deb-src 表明这是一个源代码的仓库原(即提供源码包,用于下载 tarball、打包配置等文件 ) - adress 是软件仓库的地址
- distribution_name 是软件仓库的发行版的版本名称。
比如上面的例子中为 noble,这并非表明当前用户使用的 Linux 发行版为 Ubuntu Noble Numbat (即 Ubuntu 24.04 LTS),只是说明这个 Linux 发行版正在使用 Ubuntu 24.04 LTS (Noble Numbat) 软件仓库。 - package_type_list 表明仓库里有什么类型的软件包(可能并不止一个单词)。
比如上面的例子中出现的 main restricted universe multiverse,还可能有 partner 等词。
软件仓库网站或者各种软件包开发人员的网站上通常会提供上述格式的文本,你可以直接将这些文本复制/粘贴到 sources.list 文件中。这是添加仓库最安全的方式,最好不要仍由自己发挥,这一般会带来问题。
主要功能
通过仓库获取最新的软件包信息
- 操作:
update
该选项用于从配置的所有软件源中获取最新的可用软件包信息,但不会安装或升级任何软件。
其他命令基于此获取的软件包数据进行操作,例如执行软件包升级(upgrades)或搜索(search)并显示所有可供安装的软件包的详细信息。
列出所有可用的软件包
- 操作:
list
用于显示仓库中所有可用的软件包,通过--installed选项可以只列出已经安装的软件包。
举例,如下:
~$ apt list | tail -3
zziplib-bin/noble 0.13.72+dfsg.1-1.2build1 amd64
zziplib-bin/noble 0.13.72+dfsg.1-1.2build1 i386
zzuf/noble 0.15-2build3 amd64
搜索指定的软件包
- 操作:
search
用于从本地软件包信息缓存中搜索指定的软件包。默认会搜索名称或者描述中包含搜索关键字的软件包,可使用--names-only选项来指明只搜索名称。
举例,如下:
~$ apt search --names-only zsh
zsh/noble,now 5.9-6ubuntu2 amd64 [已安装]
具有很多特性的 Shell
查看指定软件包的信息
- 操作:
show
用于本地软件包信息缓存搜索指定的软件包的信息,包括其依赖关系、安装和下载大小、软件包可用的源、软件包内容的描述等更多信息。
能够显示软件包非常详细的元数据,是了解一个软件包的绝佳方式。
举例,如下:
~$ apt show lsof
Package: lsof
Version: 4.95.0-1build3
Priority: standard
Section: utils
Origin: Ubuntu
Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com>
Original-Maintainer: Andres Salomon <dilinger@debian.org>
Bugs: https://bugs.launchpad.net/ubuntu/+filebug
Installed-Size: 486 kB
Depends: libc6 (>= 2.34), libselinux1 (>= 3.1~), libtirpc3t64 (>= 1.0.2)
Homepage: https://github.com/lsof-org/lsof
Task: standard, ubuntu-wsl
Download-Size: 247 kB
APT-Manual-Installed: no
APT-Sources: http://mirrors.aliyun.com/ubuntu noble/main amd64 Packages
Description: 列出打开文件的工具
Lsof 是一个 Unix 特有的诊断工具。它的名称代表 LiSt Open Files (列出打
开的文件),它也只做这个。它列出了所有被正在当前系统运行的进程打开的文 件的信息。
通过仓库(或者本地)安装软件包
- 操作:
install
用于从仓库中安装指定的软件包,或者就像 dpkg 一样直接安装已下载到本地的 .deb 软件包(或以URL形式提供)。
会自动读取安装的软件包的信息并处理依赖关系,有时会从仓库安装额外的包来满足依赖关系,这正是我们使用 apt 的一个重要的原因。
提醒:使用前需要使用update操作获取最新的软件包信息,不然可能会导致无法知晓可用的软件包。
举例,如下:
# 通过仓库下载并安装软件包
~$ sudo apt install git
......
# 直接安装本地的软件包
~$ apt install ./code.deb
......
通过仓库更新软件
-
操作:
upgrade
用于从通过sources.list配置的源中,安装当前系统上所有已安装软件包的可用升级。
如果需要满足依赖关系,将安装新软件包,但永远不会删除现有软件包。
如果某个软件包的升级需要移除一个已安装的软件包,则该软件包的升级将不会执行。
提醒:使用前需要使用update操作获取最新的软件包信息,不然可能会导致无法知晓可用的升级。 -
操作:
full-upgrade
执行与upgrade相同的功能,但如果需要升级整个系统,它将移除当前已安装的软件包。
full-upgrade在处理复杂的依赖关系时更彻底,但风险也更高,因为它可能会为了完成升级而删除一些软件包。在 Ubuntu 系统中,这个命令通常等同于dist-upgrade。
卸载软件包
-
操作:
remove
用于删除指定的软件包,但会保留对应的数据和配置文件。
类似dpkg-deb -r。
如果软件包存在依赖,不会将依赖删除,请参考下面的automove。 -
操作:
purge
用于删除指定的软件包,并且还会删除对应的数据和配置文件。
类似dpkg-deb -P。
如果软件包存在依赖,不会将依赖删除,请参考下面的automove。 -
操作:
autoremove
用于移除那些当初为了满足其他软件包的依赖关系而自动安装,但现在由于依赖关系变更或需要它们的软件包已被移除而不再需要的软件包。
但是本人不建议你轻易使用,因为它的外号是依赖粉碎机,执行后可能会造成比较严重的后果。
彩蛋
apt 有一个著名的牛力彩蛋,具体如下:
~$ apt -h | tail -1
本 APT 具有超级牛力。
~$ apt moo
(__)
(oo)
/------\/
/ | ||
* /\---/\
~~ ~~
..."It's a Bird ... It's a Plane ... It's Super Cow!"...
~$ apt moo moo
(__)
_______~(..)~
,----\(oo)
/|____|,'
* /"\ /\
~ ~ ~ ~
..."It's a Bird ... It's a Plane ... It's Super Cow!"...
~$ apt moo moo moo
\_/
m00h (__) -(_)-
\ ~Oo~___ / \
(..) |\
_____________|_|_|______________________________________
..."It's a Bird ... It's a Plane ... It's Super Cow!"...
aptitude
工具介绍
aptitude 是一个基于文本的 Debian GNU/Linux 包系统前端工具,提供了比 apt-get 更友好的交互方式和更强大的包管理功能。
aptitude 是一个 TUI (terminal user interface),操作可以从可视化界面或命令行执行。
可以说它是 APT 软件包管理系统的一个功能更强大的前端,也可以说是 apt-get 命令的加强版替代品。
aptitude 和 apt 一样,都基于 apt-get ,因为 apt-get 基于 dpkg ,因此 dpkg 和 aptitude 能识别彼此安装的 deb 软件包。
aptitude 和 apt 一样,会解决包的依赖关系,不过(个人认为) aptitude 的功能比 apt 更为强大。
可以参考Debian系统包管理工具思维导图理解各个工具之间的关系。
可视化模式
如果在命令行中未指定动作,aptitude 将以可视化模式启动。
在该模式下会提供一个同时支持键盘与鼠标操作的可视化窗口,你可以在里面完成诸多操作,比如玩扫雷。
Search patterns
aptitude 规定了一些特有的模式给一些特定的操作使用。
举例,如下:
# 精确搜索名字为 git 的软件包
~$ aptitude search '~n^git$'
i git - 快速、可缩放的分布式版本控制系统
p git:i386 - 快速、可缩放的分布式版本控制系统
查阅 aptitude reference manual 的 “Search Patterns” 章节 获取更多的信息。
由其是 Search term reference 小节 。
主要选项
指定输出格式
- 选项:
-F <format>, --display-format <format>
指定应用于显示来自 search 和 versions 操作的输出的格式。
命令行选项 –disable-columns 通常与 -F 结合使用。
对于 search,这对应于配置选项 Aptitude::CmdLine::Package-Display-Format;对于 versions,这对应于配置选项 Aptitude::CmdLine::Version-Display-Format。
举例,如下:
# 输出格式为: <包名> <已经安装的版本(如果没有就显示无)> <仓库中的最新版本(如果没有就显示无)>
~$ aptitude search '~n^git$' -F '%p %v %V' --disable-columns
git 1:2.43.0-1ubuntu7.3 1:2.43.0-1ubuntu7.3
git:i386 <无> 1:2.43.0-1ubuntu7.3
查阅 aptitude reference manual 的 “Customizing how packages are displayed” 章节 获取更多的信息。
主要操作
部分操作与 apt 类似。
搜索指定的软件包
- 操作:
search
用于从本地软件包信息缓存中搜索指定的软件包。默认会搜索名称中包含搜索关键字的软件包。
可以使用Search patterns描述指定的包,还可以使用-F选项描述如何输出信息。
举例,如下:
# 精确搜索名字为 git 的软件包
# 输出格式为: <包名> <已经安装的版本(如果没有就显示无)> <仓库中的最新版本(如果没有就显示无)>
~$ aptitude search '~n^git$' -F '%p %v %V'
git 1:2.43.0-1ubun 1:2.43.0-1ubun
git:i386 <无> 1:2.43.0-1ubun
列出指定软件包的版本
- 操作:
versions显示命令行上列出的软件包的版本。
可以使用Search patterns描述指定的包,还可以使用-F选项描述如何输出信息。
举例,如下:
~$ aptitude versions 'git'
软件包 git:
p 1:2.43.0-1ubuntu7 noble 500
i 1:2.43.0-1ubuntu7.3 noble-security,noble-updates 500
软件包 git:i386:
p 1:2.43.0-1ubuntu7 noble 500
p 1:2.43.0-1ubuntu7.3 noble-security,noble-updates 500
待补充
aptitude 相较于 apt 有诸多的新特性,短时间内难以说明,可参考下面提供的资料。
aptitude user's manual
aptitude user's manual - I. Command-line reference - aptitude
aptitude user's manual - 2.aptitude reference guide - Search patterns - Search term reference
aptitude user's manual - 2.aptitude reference guide - Customizing aptitude - Customizing the package list
aptitude user's manual - 2.aptitude reference guide - Managing packages - Accessing package information
彩蛋
如果说 apt 具有超级牛力,那么 aptitude 则没有,为什么了?见下文:
~$ aptitude -h | tail -1
这个 aptitude 没有超级牛力。
~$ aptitude moo
本程序中没有复活节彩蛋。
~$ aptitude -v moo
本程序中确实没有复活节彩蛋。
~$ aptitude -vv moo
我不是已经告诉您本程序中没有复活节彩蛋了吗?
~$ aptitude -vvv moo
停下来!
~$ aptitude -vvvv moo
好吧,好吧,如果我给您复活节彩蛋,您会停手吗?
~$ aptitude -vvvvv moo
好吧,您赢了。
/----\
-------/ \
/ \
/ |
-----------------/ --------\
----------------------------------------------
~$ aptitude -vvvvvv moo
这是什么?这当然是一只大象被一条蛇吞吃了。
备注
演示用的 .deb 包
本文以 microsoft vs code (微软大战代码) 的 .deb 包举例,可以通过以下的方式获取本文编写时该软件的最新版 .deb 包。
wget https://vscode.download.prss.microsoft.com/dbazure/download/stable/c3a26841a84f20dfe0850d0a5a9bd01da4f003ea/code_1.109.4-1771257466_amd64.deb -O code.deb
Debian系统包管理工具思维导图
Debian系Linux系统的各个包管理工具间的关系可以参考下图:
发展历程
整体架构
参考文章
- Linux 命令行与 shell 脚本编程大全
- dpkg 依赖的 dpkg-deb 和 dpkg-query 介绍
- apt,apt-get,aptitude 的三角恋
- 具有牛力的 aptitude
- dpkg 详解:Debian 系 Linux 系统的底层包管理工具
- Debian 包管理文档
- .deb 包结构详解
- debian 目录中的必需内容
- aptitude user's manual