最直接有效的方式是使用发行版原生包管理器的锁定机制:Debian/Ubuntu 用 apt-mark hold,RHEL/CentOS/Rocky 用 dnf versionlock;二者均轻量、可靠、易验证且不破坏依赖解析。

最直接有效的方式是使用发行版原生包管理器的锁定机制:Debian/Ubuntu 系统用 apt-mark hold,RHEL/CentOS/Rocky 系统用 dnf versionlock。这两种方法轻量、可靠、易验证,且不会破坏依赖解析。
Debian/Ubuntu:用 apt-mark hold 锁定
该命令修改 APT 的状态记录,对所有标准升级操作(apt upgrade、apt full-upgrade)生效,不影响手动安装或依赖拉取。
- 锁定单个包:
sudo apt-mark hold nginx - 批量锁定多个包:
sudo apt-mark hold openjdk-17-jdk docker.io python3-pip - 查看当前所有被锁包:
apt-mark showhold(无需 sudo) - 解除锁定:
sudo apt-mark unhold nginx
注意:Ubuntu LTS 中的 unattended-upgrades 可能绕过 hold。如需完全隔离,需同步编辑 /etc/apt/apt.conf.d/50unattended-upgrades,关闭自动重启并显式加入黑名单:
RHEL/CentOS/Rocky:用 dnf versionlock 精确控制
versionlock 插件支持锁定到 epoch:version-release.arch 级别,适合内核、glibc、容器运行时等敏感组件。
- 先安装插件:
sudo dnf install python3-dnf-plugins-extras-versionlock - 锁定当前已装版本:
sudo dnf versionlock add httpd - 锁定特定构建(推荐用于生产镜像):
sudo dnf versionlock add kernel-core-5.14.0-284.30.1.el9_2.x86_64 - 查看规则:
dnf versionlock list - 删除某条规则:
sudo dnf versionlock delete httpd-2.4.57-1.el9
规则持久保存在 /etc/dnf/plugins/versionlock.list,支持通配符(如 kernel-*)和注释。但注意:它不干预 dnf reinstall 或 dnf distro-sync 操作。
验证是否真正生效
锁定后必须验证,避免配置未加载或被覆盖:
- 检查待升级列表:
apt list --upgradable(Debian/Ubuntu)或dnf list upgrades(RHEL系),确认目标包不在其中 - 执行模拟升级:
apt upgrade --dry-run或dnf update --assumeno,观察输出是否明确跳过被锁包 - 若发现仍提示升级,检查是否被依赖链触发(如锁了 nginx,但某新包依赖更高版 nginx),此时需同步锁定其依赖项
补充建议:切断自动更新源头
仅靠包级锁定不够,还需停用系统级自动更新服务,防止策略被绕过:
- 禁用定时任务:
sudo systemctl disable --now apt-daily.timer apt-daily-upgrade.timer - 屏蔽关键服务(防意外激活):
sudo systemctl mask apt-daily.service apt-daily-upgrade.service - 麒麟等衍生系统还需停用
kylin-update-manager:sudo systemctl disable --now kylin-update-manager.service
不复杂但容易忽略。


















