Debian/Ubuntu用apt-mark hold、RHEL/CentOS/Rocky用dnf versionlock是主流且可靠的版本锁定方案;前者轻量生效于所有apt升级命令,后者支持精确NEVRA版本控制,二者均需验证生效并注意绕过场景。

直接结论:Debian/Ubuntu 用 apt-mark hold,RHEL/CentOS/Rocky 用 dnf versionlock;其他方式(如 dpkg --set-selections 或 APT pinning)要么易被绕过,要么配置复杂、优先级难控,不建议作为主方案。
Debian/Ubuntu 怎么用 apt-mark hold 锁定当前安装版本
这是最轻量、最可靠的一线防护,对 apt upgrade、apt full-upgrade、apt-get upgrade 全部生效,且不影响依赖解析(比如锁了 nginx,装 certbot 仍能拉入它需要的 python3-requests)。
- 锁定单个包:
sudo apt-mark hold nginx - 批量锁定(推荐用于运行时栈):
sudo apt-mark hold openjdk-17-jdk python3-pip docker.io - 验证是否生效:
apt-mark showhold(输出应含目标包名) - 注意:
unattended-upgrades可能绕过hold——若需绝对隔离,须同步关闭自动安全更新,修改/etc/apt/apt.conf.d/50unattended-upgrades中的Unattended-Upgrade::Automatic-Reboot和Unattended-Upgrade::Package-Blacklist
RHEL/CentOS/Rocky 怎么用 dnf versionlock 锁定精确 NEVRA 版本
dnf versionlock 插件支持精确到 epoch:version-release.arch 的规则,比单纯锁包名更严谨,适合内核、容器运行时等敏感组件。
Linux 安全审计工具,检查 SSH 配置、开放/监听端口、防火墙规则(ufw/iptables/nftables)、失败登录尝试、sudoers 权限...
- 先启用插件:
sudo dnf install python3-dnf-plugins-extras-versionlock - 锁住当前已安装的
httpd:sudo dnf versionlock add httpd(自动读取完整 NEVRA) - 锁死指定构建(推荐用于上线镜像):
sudo dnf versionlock add kernel-core-5.14.0-284.30.1.el9_2.x86_64 - 规则持久化在
/etc/dnf/plugins/versionlock.list,可直接编辑;dnf versionlock list查看全部规则 - 警告:
versionlock不干预dnf reinstall或dnf distro-sync,这些操作仍可能覆盖锁定版本
为什么别直接用 dpkg --set-selections 或 /etc/apt/preferences.d/
这两个方法底层虽有效,但属于“状态标记”而非“策略控制”,真实运维中容易翻车:
-
dpkg --set-selections是apt-mark hold的底层调用,但缺少封装校验,手工误写格式(如漏空格、多换行)会导致标记失效或污染状态 -
/etc/apt/preferences.d/*.pref依赖 Pin-Priority 数值比较,一旦多个文件冲突或优先级设错(比如把安全源 priority 设得比本地源还高),反而会强制升级而非阻止 - 两者都不被
unattended-upgrades尊重,且无法通过apt-mark showhold统一查看,排查成本高
锁定后必须验证是否真生效
很多故障源于“以为锁住了,其实没生效”。每次锁定后务必走三步验证:
- 运行
apt list --upgradable(Debian/Ubuntu)或dnf list upgrades(RHEL系),确认目标包未出现在列表中 - 执行模拟升级:
apt upgrade --dry-run或dnf update --assumeno,观察输出是否明确跳过被锁包 - 手动触发一次
apt install或dnf update,再用rpm -q <pkg></pkg>或dpkg -l | grep <pkg></pkg>对比版本是否真的没变
最容易被忽略的是:锁定只作用于常规升级路径,不防手动重装、不防 distro-sync、不防第三方脚本调用 rpm/dpkg 直接覆盖——生产环境关键服务,建议配合容器化或配置管理工具做二次隔离。

















