RHEL 10 包回滚、降级与版本锁定
包回滚有三层:撤销一次 DNF 事务、把某个包钉在指定版本、以及降级到旧版本。RHEL 10 上第一层和第三层的命令没变,第二层有个坑——versionlock 不再随 dnf-plugins-core 一起装。
在 PVE 390 rhel10-lab(RHEL 10.2 x86_64,已注册开发者订阅)上实际执行:
sudo dnf -q -y install zshrpm -q zshsudo dnf -q history | head -4sudo dnf -q -y history undo lastrpm -q zsh # 预期 rc=1sudo dnf -q -y install zshsudo dnf -q versionlock add zsh # 未装插件时失败sudo dnf -y install python3-dnf-plugin-versionlocksudo dnf -q versionlock add zshsudo dnf -q versionlock listsudo dnf -q versionlock delete zshE3 记录:plans/content-expansion/evidence/rhel/rhel-pkg-rollback/run.json(12 步,含退出码与每步输出 sha256)。
回滚:dnf history undo
Section titled “回滚:dnf history undo”$ sudo dnf -q -y install zsh$ rpm -q zshzsh-5.9-15.el10.x86_64$ sudo dnf -q history | head -4ID | Command line | Date and time | Action(s) | Altered----------------------------------------------------------------------- 3 | -y install zsh | 2026-11-04 02:26 | Install | 1$ sudo dnf -q -y history undo last$ rpm -q zshpackage zsh is not installed # rc=1history undo 撤销的是那一条事务:装了什么就卸什么、升了什么就降回去。它不负责:
- 恢复被包覆盖的配置文件(
/etc下的改动不会回滚); - 重启或恢复服务状态;
- 回滚数据库、业务数据或容器镜像。
版本锁定:RHEL 10 的 versionlock 是独立包
Section titled “版本锁定:RHEL 10 的 versionlock 是独立包”在 RHEL 10.2 上,dnf-plugins-core 已装(dnf-plugins-core-4.7.0-10.el10),但 versionlock 不在里面:
$ sudo dnf versionlock add zshNo such command: versionlock. Please use /bin/dnf --helpIt could be a DNF plugin command, try: "dnf install 'dnf-command(versionlock)'"装上独立包后可用:
sudo dnf -y install python3-dnf-plugin-versionlocksudo dnf -q versionlock add zshsudo dnf -q versionlock list# zsh-0:5.9-15.el10.*sudo cat /etc/dnf/plugins/versionlock.list# # Added lock on Wed Nov 4 02:30:18 2026# zsh-0:5.9-15.el10.*锁定项是 NEVRA 通配(这里 zsh-0:5.9-15.el10.*),不是“禁止升级”这么简单:DNF 解析依赖时只接受匹配的版本。删除:
sudo dnf -q versionlock delete zsh批量清理用 dnf versionlock clear;排查看 dnf versionlock list 与 /etc/dnf/plugins/versionlock.list 是否一致。
降级:先有旧版本,才谈得上降
Section titled “降级:先有旧版本,才谈得上降”dnf downgrade <pkg> 的前提是仓库或本地源里仍有旧 NEVRA。RHEL 的常规仓库通常只保留当前版本,所以:
- 常规仓库里
dnf downgrade经常报 “No package available”; - 要保留可降级路径,需要 EUS/版本化仓库、本地快照(
reposync+createrepo)或 Satellite 内容视图保留旧版本; versionlock不能替代旧版本来源,它只约束“选哪个版本”。
自动化脚本检查清单
Section titled “自动化脚本检查清单”- RHEL 10 上是否显式安装
python3-dnf-plugin-versionlock?只装dnf-plugins-core会找不到命令; - 锁定项是否写进配置管理,而不是手工
versionlock add?文件在/etc/dnf/plugins/versionlock.list; - 回滚脚本是否只回滚 RPM 事务、另做配置/数据备份?
- 降级是否有可用的旧版本源(EUS/快照/Satellite)?
- 是否在
history undo前确认last指向正确事务?多步操作后last可能不是你以为什么。
未实测与边界
Section titled “未实测与边界”- 没有构造“仓库中存在旧版本”的场景,因此
dnf downgrade的成功路径未实测; versionlock阻止升级的效果未单独演示:当前仓库里zsh没有可升级版本,dnf upgrade zsh输出为空(无事务),不能据此证明锁定生效;- 未测试 EUS/快照源下的降级;
- 未测试跨大版本(9→10)后的
history行为。
- RHEL 仓库与内容视图 — 仓库与 releasever
- RHEL 的 DNF 行为变化 — 模块弃用、filelists、debug 插件
- 官方:Managing software with the DNF tool(Reverting DNF transactions、Handling package management history)