Please enable Javascript to view the contents

Ubuntu 包依赖与变更管理

 ·  ☕ 3 分钟

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
aptitude why-not nginx

1.3 依赖树与冲突

模拟安装与文件反查

  • 查看依赖解析树
1
apt-cache showpkg nginx
  • 模拟安装单个包
1
apt install --simulate nginx
  • 模拟整次升级
1
apt-get -s upgrade
  • 反查文件属于哪个包
1
dpkg -S /usr/bin/nginx
  • 列出包安装了哪些文件
1
dpkg -L nginx

1.4 第三方与非官方源包

Snap、手工安装等需单独排查

  • 查看包来自哪个源
1
apt-cache policy nginx
  • 查看已配置的 apt 源
1
cat /etc/apt/sources.list /etc/apt/sources.list.d/*.list
  • 查看 Snap 包
1
snap list
  • 查看二进制路径与类型
1
which nginx && file "$(which nginx)"

2. 查看包的变更历史

2.1 本机变更记录

最近什么时候装、升、删过

  • 查看 APT 操作历史
1
less /var/log/apt/history.log
  • 查看 dpkg 状态变更
1
less /var/log/dpkg.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
  • history.log 记录格式示例
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 上游变更记录

这个包在仓库里改过什么

  • 查看 changelog
1
apt changelog nginx | less
  • 查看可用版本与来源优先级
1
apt-cache policy nginx
  • 列出仓库中所有可用版本
1
apt-cache madison nginx

Ubuntu 官方还可查 Launchpad 上对应源码包的 changelog 与 bugs,适合看跨多个版本的修复记录。

2.3 版本差异对比

升级前后文件变化

  • 查看缓存中的 deb 内容
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
apt-mark showhold
  • 解除锁定
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
  • 查看 pin 是否生效
1
apt-cache policy nginx

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 list --upgradable
  • 模拟 upgrade
1
apt-get -s upgrade
  • 模拟 dist-upgrade
1
apt-get -s dist-upgrade
  • 安装 apt-listchanges 显示变更说明
1
sudo apt install apt-listchanges

3.6 配置文件不被静默覆盖

升级时处理 conffile 冲突

  • 查看当前 dpkg 选项
1
sudo apt-config dump | grep DPkg::Options
  • 升级时保留本机配置,写入 apt.conf.d
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
aptitude why <包名>
  • 最近谁升级了它
1
zgrep <包名> /var/log/apt/history.log*
  • 怎么防止明天又被自动升
1
apt-mark hold <包名>
  • 钉版本后再锁定
1
2
apt install <包名>=<版本>
apt-mark hold <包名>

微信公众号
作者
微信公众号