apt pinning 是 debian/ubuntu 中比 apt-mark hold 更灵活的版本控制机制,通过设置 pin-priority 实现按版本、源或发布信息精准选包,适用于多源共存、安全更新隔离及声明式策略管理等复杂场景。

APT pinning 是 Debian/Ubuntu 系统中一种精细控制软件包版本的机制,它通过设置优先级(Pin-Priority)让 APT 在多个可用版本间做出明确选择。相比 apt-mark hold 的“全量跳过升级”,pinning 更灵活:既能锁定特定版本,也能允许安全更新、限制某源升级、或降级回旧版——关键在于你如何配置规则。
什么时候该用 pinning 而不是 apt-mark hold?
当你需要更细粒度控制时,比如:
- 只允许某个包接收安全更新(来自
security.ubuntu.com),但拒绝常规仓库的新版 - 从第三方源(如 nginx.org)安装新版后,防止被官方源覆盖回旧版
- 临时降级一个包并长期保持,且希望该版本在
apt list --upgradable中完全不出现 - 批量锁定多个包,同时保留统一策略管理能力(如按前缀或通配符)
怎么配置 APT pinning 锁定指定版本
推荐在 /etc/apt/preferences.d/ 下新建独立文件(如 nginx-pin.pref),避免直接修改全局 /etc/apt/preferences:
Package: nginx Pin: version 1.24.0-1ubuntu1 Pin-Priority: 1001
说明:
-
Package:指定包名,支持通配符(如nginx*)或换行写多个Package:行 -
Pin:可用version、release(如a=jammy-security)、origin(如o=nginx)等匹配方式;version必须与apt list -a nginx输出的完整版本号完全一致 -
Pin-Priority:大于 1000 才能强制选中(默认候选版本优先级为 500,已安装版本为 100);设为-1则彻底禁止安装该版本
配置完后运行 sudo apt update 生效,再用 apt-cache policy nginx 验证:已安装版本和 Candidate 应显示 1001 优先级,且无其他版本可选。
常见陷阱与注意事项
pinning 功能强大,但也容易误配导致意外行为:
- 优先级冲突:若多个
.pref文件对同一包设置了不同Pin-Priority,以最后读取的文件为准(按字母序),建议文件名带序号如01-nginx-pin.pref - 版本号必须精确:
nginx=1.24.0-1ubuntu1和nginx=1.24.0-1ubuntu1~22.04.1是不同版本,不能混用 - 不影响手动安装:即使 pinning 锁死,
sudo apt install nginx=1.22.0-1ubuntu1仍可执行(只要该版本在源中存在) - 不阻止 unattended-upgrades:Ubuntu 自动安全更新可能绕过 pinning,需额外关闭或配合
/etc/apt/apt.conf.d/50unattended-upgrades中的Unattended-Upgrade::Allowed-Origins白名单控制
对比 apt-mark hold:该选哪个?
简单场景优先用 apt-mark hold —— 它轻量、直观、兼容所有 apt 升级命令,且不会干扰依赖解析。而 pinning 更适合运维复杂环境,例如:
- 多源共存(官方源 + 第三方源 + 内部私有源)
- 需要区分对待安全更新与功能更新
- 自动化部署中需声明式定义版本策略(配合 Ansible 或 Puppet)
两者也可共存:apt-mark hold 用于快速应急锁定,pinning 用于长期策略固化。但不要为同一包同时设置 hold 和高优先级 pin,否则行为不可预测。











