@[toc]
一、APT 体系架构全景
APT(Advanced Package Tool)并非单一命令,而是一个分层工具链。理解它的层级结构,是掌握所有命令的前提。

核心层级
| 层级 | 工具 | 职责 |
|---|---|---|
| 用户层 | apt |
现代统一接口,整合 apt-get + apt-cache,带进度条和颜色输出 |
| 传统层 | apt-get / apt-cache |
脚本兼容接口,功能分离(获取/查询) |
| 高级层 | aptitude |
带 TUI 的依赖解决专家,处理复杂冲突 |
| 标记层 | apt-mark / apt-config |
包状态标记与配置读取 |
| 底层 | dpkg |
直接操作 .deb 文件,无依赖解析能力 |
| 仓库层 | sources.list |
定义软件源(HTTP/FTP/本地/CD-ROM) |
关键洞察:
apt命令本身是一个前端封装,它调用libapt库,最终通过dpkg完成实际的包安装/卸载操作。
二、现代 apt 命令详解(日常使用首选)
Debian 8+ / Ubuntu 16.04+ 引入的 apt 命令整合了旧工具的常用功能,并增加了进度条和颜色输出。

2.1 更新与升级
apt update — 更新本地包索引
sudo apt update
sudo apt update -qq # 静默模式,仅显示错误
sudo apt update -o Acquire::http::Proxy="http://proxy:8080/" # 指定代理
原理:从 sources.list 中定义的每个仓库下载 Packages.gz / Sources.gz 等索引文件,解压到 /var/lib/apt/lists/。不升级任何软件,只是刷新“商品目录”。
apt upgrade — 安全升级
sudo apt upgrade
sudo apt upgrade -y # 自动确认,不提示
sudo apt upgrade --no-install-recommends # 不安装推荐依赖
行为:升级已安装包到最新版本,但不删除任何包,也不安装新的依赖包。保守、安全。
apt full-upgrade / dist-upgrade — 完整升级
sudo apt full-upgrade # 现代写法(推荐)
sudo apt dist-upgrade # 传统写法(等效)
与 upgrade 的关键区别:
- 可以安装新依赖(新包)
- 可以删除旧包(当依赖关系变化时)
- 用于发行版大版本升级(如 Debian 11 → 12)
警告:
full-upgrade可能删除包,生产环境建议先apt upgrade,确认无误后再考虑full-upgrade。
2.2 安装操作
apt install — 安装软件
sudo apt install nginx
sudo apt install nginx=1.18.0-6ubuntu1 # 安装指定版本
sudo apt install -f # 修复依赖关系(force-fix)
sudo apt install --no-install-recommends pkg # 跳过推荐包
sudo apt install -t unstable pkg # 从指定发行版安装
依赖解析流程:
- 读取包的
Depends/Pre-Depends/Recommends/Suggests字段 - 计算最小依赖集(SAT 问题求解)
- 下载所有
.deb到/var/cache/apt/archives/ - 调用
dpkg按顺序解压配置
apt reinstall — 重新安装
sudo apt reinstall nginx
用于修复损坏的安装(文件被误删、权限搞乱),保留原有配置文件。
apt build-dep — 安装编译依赖
sudo apt build-dep nginx
自动安装编译 Nginx 源码所需的全部 Build-Depends,是源码包开发者的利器。
apt download — 仅下载不安装
apt download nginx # 下载到当前目录
apt download $(apt-rdepends nginx | grep -v "^ ") # 下载完整依赖树
2.3 卸载操作
apt remove vs apt purge — 核心区别
| 命令 | 删除二进制 | 删除配置文件 | 使用场景 |
|---|---|---|---|
apt remove pkg |
✅ | ❌ | 暂时卸载,保留配置以便日后重装 |
apt purge pkg |
✅ | ✅ | 彻底清除,不留痕迹 |
sudo apt remove nginx
sudo apt purge nginx
sudo apt purge $(dpkg -l | grep '^rc' | awk '{print $2}') # 批量清理残留配置
状态码解释(dpkg -l 第一列):
ii:正确安装iU:已安装但未配置rc:已删除(Removed),但配置文件保留(Config-files残留)
apt autoremove — 清理孤儿包
sudo apt autoremove
sudo apt autoremove --purge # 同时清理配置
“孤儿包”判定逻辑:APT 会追踪每个包的安装原因。如果某包不再被任何手动安装的包依赖,且是自动安装的,则标记为可删除。
apt clean — 清空下载缓存
sudo apt clean
删除 /var/cache/apt/archives/ 下所有已下载的 .deb,释放磁盘空间。
2.4 查询操作(重点:apt search 的匹配原理)
apt search — 全文搜索(不只是包名!)
这是最容易被误解的命令。apt search 的匹配范围包括:
- 包名(Package name)
- 描述(Description)
- 依赖/提供/冲突等元数据(某些版本)
apt search nginx
apt search "web server" # 会返回大量结果,因为很多描述含此词
apt search --names-only nginx # 现代 apt 不支持此参数!
精确搜索包名的正确方法:
# 方法 1:apt list + 通配符(只匹配包名)
apt list 'nginx*'
# 方法 2:apt-cache search --names-only(传统工具)
apt-cache search --names-only nginx
# 方法 3:dpkg -l + grep(已安装包)
dpkg -l | grep nginx
# 方法 4:正则精确匹配
apt search ^nginx$ # 部分版本支持正则
apt show — 显示包详情
apt show nginx
apt show -a nginx # 显示所有可用版本(不只是最高优先级)
输出包含:版本号、优先级、章节、维护者、依赖树、反向依赖、下载大小、SHA256 等完整元数据。
apt list — 高级过滤
apt list --installed # 列出已安装包
apt list --upgradeable # 列出可升级包
apt list --all-versions # 列出所有可用版本
apt list 'nginx*' # 通配符匹配包名
apt list --installed 'lib*' # 组合过滤
apt policy — 版本策略分析(高级)
apt policy nginx
输出示例:
nginx:
Installed: 1.18.0-6ubuntu1
Candidate: 1.18.0-6ubuntu1
Version table:
*** 1.18.0-6ubuntu1 500
500 http://archive.ubuntu.com/ubuntu jammy/main amd64 Packages
100 /var/lib/dpkg/status
1.14.0-0ubuntu1 100
100 http://old-releases.ubuntu.com/ubuntu bionic/main amd64 Packages
优先级数值含义:
100:当前已安装版本500:普通仓库版本990:目标发行版(apt-get install -t)1001:Pin 锁定(禁止升级)
2.5 系统维护
apt edit-sources — 安全编辑源列表
sudo apt edit-sources
自动调用 $EDITOR 编辑 /etc/apt/sources.list,并做语法检查,避免手滑破坏格式。
三、传统工具链:apt-get 与 apt-cache
虽然 apt 已整合大部分功能,但脚本和高级场景仍需这些工具。
3.1 apt-get — 脚本化的包操作
| 命令 | 等效现代命令 | 特殊用途 |
|---|---|---|
apt-get update |
apt update |
无差异 |
apt-get upgrade |
apt upgrade |
无差异 |
apt-get dist-upgrade |
apt full-upgrade |
传统写法 |
apt-get install |
apt install |
支持 --reinstall 等更多标志 |
apt-get source pkg |
无 | 下载源码包(apt 不支持) |
apt-get build-dep pkg |
apt build-dep pkg |
无差异 |
apt-get changelog pkg |
无 | 查看变更日志 |
apt-get check |
无 | 诊断依赖完整性 |
apt-get autoclean |
无 | 仅删除无法下载的旧版本 .deb |
# 下载源码包(开发者必备)
apt-get source nginx
cd nginx-1.18.0/
dpkg-buildpackage -us -uc # 编译
# 查看安全更新详情
apt-get changelog openssl | head -50
3.2 apt-cache — 缓存查询专家
apt-cache search nginx # 搜索(同 apt search)
apt-cache search --names-only nginx # 仅匹配包名
apt-cache show nginx # 显示详情(同 apt show)
apt-cache showpkg nginx # 显示原始依赖树
apt-cache depends nginx # 正向依赖树
apt-cache rdepends nginx # 反向依赖(谁依赖我)
apt-cache policy nginx # 版本策略(同 apt policy)
apt-cache stats # 缓存统计
apt-cache showpkg 输出解析:
apt-cache showpkg nginx
输出包含:
Versions:所有可用版本列表Reverse Depends:反向依赖列表Dependencies:每个版本的依赖关系及版本约束Provides:提供的虚拟包Reverse Provides:哪些包提供此虚拟包
四、底层工具:dpkg
当 APT 上层工具无法解决问题时(如强制安装、查询文件归属),需要直接使用 dpkg。
4.1 基础操作
# 安装本地 .deb(不解决依赖!)
sudo dpkg -i package.deb
# 卸载包
sudo dpkg -r package # 保留配置
sudo dpkg -P package # 清除配置(purge)
# 查询已安装包状态
dpkg -l # 列出所有包
dpkg -l 'nginx*' # 通配符过滤
dpkg -s nginx # 显示包状态(同 apt show,但仅限已安装)
dpkg -L nginx # 列出包安装的所有文件
dpkg -S /usr/bin/nginx # 查询文件属于哪个包(超级实用!)
4.2 故障排查
# 诊断损坏的包
dpkg --audit
# 重新配置所有未完成的包
sudo dpkg --configure -a
# 强制安装(忽略依赖警告——危险!)
sudo dpkg --force-depends -i package.deb
# 解压但不配置(调试用)
sudo dpkg --unpack package.deb
4.3 包状态数据库
dpkg 的状态记录在 /var/lib/dpkg/status,这是一个纯文本数据库。当系统严重损坏时,可以手动编辑修复(谨慎操作)。
五、高级依赖管理
5.1 apt-mark — 标记包状态
APT 需要知道每个包是用户主动安装的还是作为依赖自动安装的,这决定 autoremove 时是否删除。
sudo apt-mark auto nginx # 标记为自动安装(可被 autoremove)
sudo apt-mark manual nginx # 标记为手动安装(保留)
sudo apt-mark hold nginx # 锁定版本,禁止升级
sudo apt-mark unhold nginx # 解除锁定
# 查看标记状态
apt-mark showauto # 列出所有自动包
apt-mark showmanual # 列出所有手动包
apt-mark showhold # 列出所有锁定包
5.2 版本锁定:Pinning(固定优先级)
通过 /etc/apt/preferences 或 /etc/apt/preferences.d/ 实现版本冻结或混合发行版。
场景 1:禁止某个包升级
# 创建 /etc/apt/preferences.d/nginx
Package: nginx
Pin: version 1.18.0-6ubuntu1
Pin-Priority: 1001
Priority > 1000 表示强制安装此版本,即使更高版本可用。
场景 2:从 testing 安装单个包,其余保持 stable
# /etc/apt/preferences.d/mixed
Package: *
Pin: release a=stable
Pin-Priority: 900
Package: *
Pin: release a=testing
Pin-Priority: 400
sudo apt install -t testing some-package
优先级数值规则:
| 优先级 | 含义 |
|---|---|
> 1000 |
强制降级/安装此版本 |
990-1000 |
目标发行版优先 |
500-989 |
普通仓库版本 |
100-499 |
非目标发行版 |
1-99 |
仅当明确请求时安装 |
< 0 |
永远不安装 |
5.3 aptitude — 依赖解决专家
当 apt 报 unmet dependencies 或 broken packages 且无法自动修复时,aptitude 的交互式解决方案往往能找到出路。
sudo aptitude install pkg # 安装,提供多种解决方案
sudo aptitude remove pkg # 卸载
sudo aptitude search '~i' # 列出已安装包(搜索语法强大)
sudo aptitude why pkg # 解释为什么安装了这个包
sudo aptitude why-not pkg # 解释为什么不能安装
TUI 模式(交互式):
sudo aptitude
u:更新包列表+/-:标记安装/删除g:执行操作q:退出
六、仓库配置详解
6.1 sources.list 格式
deb [选项] URI 发行版 组件 [组件 ...]
deb-src [选项] URI 发行版 组件 [组件 ...]
完整示例:
# /etc/apt/sources.list
deb [arch=amd64 signed-by=/usr/share/keyrings/ubuntu-archive-keyring.gpg] \
http://archive.ubuntu.com/ubuntu jammy main restricted universe multiverse
deb http://archive.ubuntu.com/ubuntu jammy-updates main restricted
deb http://security.ubuntu.com/ubuntu jammy-security main restricted
deb-src http://archive.ubuntu.com/ubuntu jammy main # 源码包
URI 类型:
http:///https://:网络仓库file:/mnt/cdrom:本地光盘/ISOftp://:FTP 服务器
发行版后缀:
| 后缀 | 含义 |
|---|---|
jammy |
主发行版 |
jammy-updates |
常规更新 |
jammy-security |
安全更新 |
jammy-backports |
向后移植 |
jammy-proposed |
预发布测试 |
6.2 添加第三方仓库(安全做法)
以 Docker 官方仓库为例:
# 1. 添加 GPG 密钥(避免 apt-key add 的全局污染)
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | \
sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
# 2. 创建 list 文件(注意 signed-by 指向)
echo "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] \
https://download.docker.com/linux/ubuntu jammy stable" | \
sudo tee /etc/apt/sources.list.d/docker.list
# 3. 更新
sudo apt update
安全提示:旧教程常使用
apt-key add将密钥加入全局信任环,这会让该密钥对所有仓库生效,存在供应链攻击风险。现代做法是用signed-by限定单仓库。
七、实用技巧与故障排查
7.1 一键系统维护脚本
#!/bin/bash
# system-maintenance.sh
set -e
echo "=== 更新包索引 ==="
sudo apt update
echo "=== 升级已安装包 ==="
sudo apt upgrade -y
echo "=== 清理孤儿包 ==="
sudo apt autoremove --purge -y
echo "=== 清理下载缓存 ==="
sudo apt autoclean
echo "=== 诊断依赖完整性 ==="
sudo apt-get check
echo "=== 系统维护完成 ==="
7.2 常见故障排查
错误 1:Hash Sum mismatch
sudo rm -rf /var/lib/apt/lists/*
sudo apt update
错误 2:Could not get lock /var/lib/dpkg/lock
# 检查是否有其他 apt 进程在运行
ps aux | grep apt
# 安全删除锁文件(确认无其他进程后)
sudo rm /var/lib/dpkg/lock-frontend
sudo rm /var/lib/dpkg/lock
sudo dpkg --configure -a
错误 3:unmet dependencies / broken packages
# 方法 1:自动修复
sudo apt --fix-broken install
sudo apt install -f
# 方法 2: aptitude 智能解决
sudo aptitude install <package>
# 方法 3:手动清理冲突包
sudo dpkg --remove --force-remove-reinstreq <package>
错误 4:磁盘空间不足(/var/cache/apt/archives)
sudo apt clean # 清空缓存
sudo apt autoremove --purge # 删除孤儿包
sudo dpkg -l | grep '^rc' | awk '{print $2}' | xargs sudo dpkg --purge # 清理残留配置
7.3 离线安装技巧
# 在有网络的机器上
apt-get download package-name
apt-get download $(apt-cache depends --recurse --no-recommends --no-suggests \
--no-conflicts --no-breaks --no-replaces --no-enhances package-name | grep "^\w")
# 复制到离线机器
sudo dpkg -i *.deb
sudo apt-get install -f # 修复可能的缺失依赖
八、命令速查表
| 任务 | 现代命令 | 传统命令 | 底层命令 |
|---|---|---|---|
| 更新索引 | apt update |
apt-get update |
— |
| 安全升级 | apt upgrade |
apt-get upgrade |
— |
| 完整升级 | apt full-upgrade |
apt-get dist-upgrade |
— |
| 安装 | apt install pkg |
apt-get install pkg |
dpkg -i pkg.deb |
| 卸载(留配置) | apt remove pkg |
apt-get remove pkg |
dpkg -r pkg |
| 完全卸载 | apt purge pkg |
apt-get purge pkg |
dpkg -P pkg |
| 搜索 | apt search str |
apt-cache search str |
— |
| 仅搜包名 | — | apt-cache search --names-only str |
— |
| 显示详情 | apt show pkg |
apt-cache show pkg |
dpkg -s pkg |
| 列出文件 | — | — | dpkg -L pkg |
| 查文件归属 | — | — | dpkg -S /path |
| 下载源码 | — | apt-get source pkg |
— |
| 查看日志 | — | apt-get changelog pkg |
— |
| 清理孤儿包 | apt autoremove |
apt-get autoremove |
— |
| 清空缓存 | apt clean |
apt-get clean |
— |
| 锁定版本 | apt-mark hold pkg |
— | — |
九、总结
APT 的设计哲学是分层解耦:dpkg 负责原子性的包操作,apt 负责依赖解析和仓库交互,aptitude 处理复杂冲突,而 apt-mark / Pinning 提供细粒度控制。
日常使用中,优先使用 apt(更友好的输出),脚本中使用 apt-get(稳定的接口承诺),遇到棘手的依赖冲突时求助 aptitude,底层调试和本地 .deb 操作则离不开 dpkg。
掌握这套工具链,你就拥有了 Debian/Ubuntu 生态中最强大的软件管理能力。
原文 https://blog.csdn.net/2301_79518550/article/details/158283915