1. 查看包依赖
1.1 正向依赖
依赖哪些包
1
| apt-cache depends nginx
|
1
| apt-cache depends --installed nginx
|
1
2
| apt show nginx
dpkg -s nginx | grep -E '^(Package|Version|Depends|Pre-Depends|Recommends|Suggests|Conflicts|Breaks|Replaces):'
|
1.2 反向依赖
谁依赖这个包
1
| apt-cache rdepends golang-github-containers-common
|
1
| apt-cache rdepends --installed golang-github-containers-common
|
1
| aptitude why golang-github-containers-common
|
1.3 依赖树与冲突
模拟安装与文件反查
1
| apt-cache showpkg nginx
|
1
| apt install --simulate nginx
|
1.4 第三方与非官方源包
Snap、手工安装等需单独排查
1
| cat /etc/apt/sources.list /etc/apt/sources.list.d/*.list
|
1
| which nginx && file "$(which nginx)"
|
2. 查看包的变更历史
2.1 本机变更记录
最近什么时候装、升、删过
1
| less /var/log/apt/history.log
|
1
2
| zgrep -h nginx /var/log/apt/history.log* /var/log/dpkg.log*
grep -E 'install|upgrade|remove' /var/log/apt/history.log | grep nginx
|
Start-Date: 2026-07-10 14:32:01
Commandline: apt upgrade
Upgrade: nginx:amd64 (1.18.0-6ubuntu14.4, 1.18.0-6ubuntu14.5)
End-Date: 2026-07-10 14:32:15
2.2 上游变更记录
这个包在仓库里改过什么
1
| apt changelog nginx | less
|
1
| apt-cache madison nginx
|
Ubuntu 官方还可查 Launchpad 上对应源码包的 changelog 与 bugs,适合看跨多个版本的修复记录。
2.3 版本差异对比
升级前后文件变化
1
| dpkg-deb -c /var/cache/apt/archives/nginx_*.deb | head
|
1
| dpkg -L nginx > /tmp/nginx-files.txt
|
3. 避免包自动升级带来的麻烦
unattended-upgrades、定时 apt upgrade、云镜像初始化脚本最容易在大版本跳跃、依赖链连带升级、配置被覆盖三类场景出问题。
3.1 锁定版本 hold
禁止指定包被升级
1
| sudo apt-mark hold nginx
|
1
| sudo apt-mark unhold nginx
|
适合核心中间件(nginx、mysql、内核)及已知有 breaking change 的版本。
3.2 安装时钉死版本
安装或降级到指定版本
1
| sudo apt install nginx=1.18.0-6ubuntu14.4
|
1
| apt install --simulate nginx=1.18.0-6ubuntu14.4
|
版本号来自 apt-cache madison nginx。钉死后建议立刻 apt-mark hold,否则下次 upgrade 仍可能被拉高。
3.3 APT Pinning
按源或版本固定优先级,配置目录 /etc/apt/preferences.d/
Package: nginx
Pin: version 1.18.0-6ubuntu14.4
Pin-Priority: 1001
Package: *
Pin: origin "某个源的 Origin 字段"
Pin-Priority: -1
3.4 控制无人值守自动升级
配置文件 /etc/apt/apt.conf.d/50unattended-upgrades
1
| systemctl status unattended-upgrades
|
1
| cat /etc/apt/apt.conf.d/20auto-upgrades
|
常见做法:只自动打安全更新、用 Package-Blacklist 排除关键包、评估 Unattended-Upgrade::Automatic-Reboot 等行为项。
3.5 升级前预览
先看会动哪些包再执行
1
| apt-get -s dist-upgrade
|
- 安装 apt-listchanges 显示变更说明
1
| sudo apt install apt-listchanges
|
3.6 配置文件不被静默覆盖
升级时处理 conffile 冲突
1
| sudo apt-config dump | grep DPkg::Options
|
Dpkg::Options {"--force-confold";};
- 升级时一律用维护者新版本,写入 apt.conf.d
Dpkg::Options {"--force-confnew";};
更稳妥的做法是升级前备份 /etc 下相关目录,或用 etckeeper、配置管理工具。
3.7 生产环境实践建议
- 分环境验证:先在 staging 跑
apt upgrade,再看应用与监控 - hold + 变更窗口:核心包 hold,非核心分批升
- 固定镜像或快照:用 Packer 或私有 apt 镜像冻结某一时刻的仓库
- 记录 baseline:定期
dpkg -l > packages-$(date +%F).txt 便于回滚对比 - 避免盲目 dist-upgrade:除非明确要升发行版,否则日常用 upgrade
4. 常用排查流程速查
1
| apt-cache rdepends --installed <包名>
|
1
| apt-cache depends --installed <包名>
|
1
| zgrep <包名> /var/log/apt/history.log*
|
1
2
| apt install <包名>=<版本>
apt-mark hold <包名>
|