Linux开发学习记录(2):如何愉快(?)地使用Debian系包管理工具

成元 2026-02-17 { 教程, 笔记 } [ Linux, Dpkg, Apt ]

前言

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 部分:

dpkg

工具介绍

dpkg 是 Debian 系 Linux 中最基础的包管理工具,全称为 Debian Package Manager
它的主要功能如下:

它的上游工具是 aptaptitude,它的下游工具是 dpkg-debdpkg-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系统包管理工具思维导图理解各个工具之间的关系。

主要功能

安装软件包

~$ sudo dpkg -i code.deb

注意:dpkg 安装 deb 软件包时,会先解压文件安装,再检查依赖是否完整,如果依赖不完整,那么 dpkg 还是会认为 deb 软件包安装成功,并提醒用户自行下载依赖并安装。 如果发现依赖缺失,可以利用 apt 等高级工具安装依赖,比如使用命令 apt install -f 尝试修复。

即使是本地 deb 包,也建议直接使用apt等高级工具来安装,这样便于处理依赖关系,更多见 apt 章节

卸载软件包

~$ sudo dpkg -r code
~$ sudo dpkg -P code

修复损坏的软件包

调用后端工具

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 软件包的信息

~$ 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 软件包中的文件

~$ 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
~$ dpkg-deb -R code.deb code
~$ tree code | head -10       
code
├── DEBIAN
│   ├── control
│   ├── postinst
│   ├── postrm
│   ├── prerm
│   └── templates
└── usr
    └── share
        ├── appdata

创建新的 .deb 软件包

举例,如下:

~$ 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 数据库中已知软件包的信息

列出已知的软件包
~$ dpkg-query -l code
......
||/ 名称           版本               体系结构     描述
+++-==============-==================-============-=================================
ii  code           1.104.1-1758154125 amd64        Code editing. Redefined.
列出已知的软件包的状态(详细信息)
~$ 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/
列出已知的软件包安装到系统上的文件
~$ 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

查询文件归属

~$ 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

软件仓库网站或者各种软件包开发人员的网站上通常会提供上述格式的文本,你可以直接将这些文本复制/粘贴到 sources.list 文件中。这是添加仓库最安全的方式,最好不要仍由自己发挥,这一般会带来问题。

主要功能

通过仓库获取最新的软件包信息

列出所有可用的软件包

~$ 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

搜索指定的软件包

~$ apt search --names-only zsh
zsh/noble,now 5.9-6ubuntu2 amd64 [已安装]
  具有很多特性的 Shell

查看指定软件包的信息

~$ 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 (列出打
 开的文件),它也只做这个。它列出了所有被正在当前系统运行的进程打开的文 件的信息。

通过仓库(或者本地)安装软件包

# 通过仓库下载并安装软件包
~$ sudo apt install git
......

# 直接安装本地的软件包
~$ apt install ./code.deb
......

通过仓库更新软件

卸载软件包

彩蛋

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 小节

主要选项

指定输出格式

# 输出格式为: <包名> <已经安装的版本(如果没有就显示无)> <仓库中的最新版本(如果没有就显示无)>
~$ 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 类似。

搜索指定的软件包

# 精确搜索名字为 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

列出指定软件包的版本

~$ 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系统的各个包管理工具间的关系可以参考下图:

发展历程

整体架构

参考文章