在 Debian 及其衍生发行版(如 Ubuntu、Linux Mint、Deepin)中,软件包的标准格式是 .deb。而 dpkg(Debian Package) 正是这些系统上最低层的包管理工具,直接用来安装、删除和查询 .deb 包文件。更高层的工具,比如大家熟知的 apt(Advanced Package Tool),内部实际上是调用 dpkg 来完成最终的操作。理解 dpkg 的基本用法,可以让你在 apt 给出让人摸不着头脑的错误时,直接深入到包系统的底层去排错。
1. dpkg 能做什么
dpkg 直接操作单个 .deb 软件包,并不处理软件源、也不自动安装依赖。它的核心场景包括:
- 从本地文件安装一个已经下载好的
.deb包(dpkg -i)。 - 查询系统中已安装包的信息(
dpkg -l、dpkg -s)。 - 检查某个文件是由哪个软件包安装的(
dpkg -S)。 - 列出某个已安装包在你的系统里释放了哪些文件(
dpkg -L)。 - 卸载一个已安装的包,保留或不保留配置文件(
dpkg -r或dpkg -P)。
虽然日常大多数任务使用 apt install 或 apt remove 更为方便,但在排查故障、手动修复损坏的包数据库,或者在没有网络的情况下批量安装本地包时,dpkg 是必不可少的工具。
2. 常用命令示例
下面这些命令是 dpkg 最实用的操作,绝大部分情况下你会直接用到它们。
安装本地 .deb 包
sudo dpkg -i package.deb
如果安装过程中提示缺少依赖,dpkg 不会自动解决它们,而是直接报错并终止。此时可以换用 sudo apt install ./package.deb(注意 ./ 写法),apt 会帮你自动处理依赖。如果因为某些原因只想用 dpkg,可以随后运行 sudo apt install -f 来补全缺失的依赖。
移除软件包
sudo dpkg -r 包名 # 删除包,但保留配置文件
sudo dpkg -P 包名 # 彻底清除,包括配置文件
例如要完全删除 nginx 的一切痕迹(包括 /etc/nginx 下的自定配置),就用 -P。但注意,这会同时删掉你自己的配置文件,无法恢复。
列出所有已安装的包
dpkg -l
输出会很长,可以结合 grep 过滤,例如 dpkg -l | grep python 查看名字含 python 的包。输出中第一列的两个字母缩写代表了包的期望状态和当前状态,常见的有 ii(已安装)、rc(已删除但残留配置文件)、un(未知)等。
查看包的详细描述
dpkg -s 包名
输出包括版本、大小、依赖关系、描述等元数据。特别有用的是可以查看 Status 行确认包是否正常安装完整。
找出一个文件属于哪个包
dpkg -S /path/to/file
例如你想知道 /etc/ssh/sshd_config 是哪个包带来的,直接运行 dpkg -S /etc/ssh/sshd_config 就会得到 openssh-server: ...。这个功能在定位配置文件来源或者排查可疑文件时非常有用。
列出某个包安装的所有文件
dpkg -L 包名
比如 dpkg -L nginx 会显示 nginx 安装的所有文件路径,包括二进制、文档、配置文件等。配合 grep 可以快速定位该包使用的目录和文件模式。
3. dpkg 与 apt 的关系
你需要记住一个总结性的认知:apt 解决“我要装什么以及从哪里装”,dpkg 解决“怎么把这个包真正装到系统上”。apt 会解析依赖、连接软件仓库、下载所需的 .deb 文件,然后调用 dpkg 执行实际的解包与安装。如果直接使用 dpkg 手动安装了一个包而后出现依赖问题,apt 后续操作也能检测到并尝试修复。两者配合工作,构成了 Debian 系发行版稳固的包管理基石。
掌握这几个最常用的 dpkg 子命令,你就拥有了一条直接查看和管理系统底层软件包的可靠路径。在自动化脚本中(特别是在部署环境锁定版本时)dpkg 也因依赖更少、行为更可预测而被广泛使用。