跳转到内容
搜索 RHEL 文档

    浏览当前文档目录

    RHEL 10 包回滚、降级与版本锁定

    包回滚有三层:撤销一次 DNF 事务、把某个包钉在指定版本、以及降级到旧版本。RHEL 10 上第一层和第三层的命令没变,第二层有个坑——versionlock 不再随 dnf-plugins-core 一起装。

    在 PVE 390 rhel10-lab(RHEL 10.2 x86_64,已注册开发者订阅)上实际执行:

    Terminal window
    sudo dnf -q -y install zsh
    rpm -q zsh
    sudo dnf -q history | head -4
    sudo dnf -q -y history undo last
    rpm -q zsh # 预期 rc=1
    sudo dnf -q -y install zsh
    sudo dnf -q versionlock add zsh # 未装插件时失败
    sudo dnf -y install python3-dnf-plugin-versionlock
    sudo dnf -q versionlock add zsh
    sudo dnf -q versionlock list
    sudo dnf -q versionlock delete zsh

    E3 记录:plans/content-expansion/evidence/rhel/rhel-pkg-rollback/run.json(12 步,含退出码与每步输出 sha256)。

    $ sudo dnf -q -y install zsh
    $ rpm -q zsh
    zsh-5.9-15.el10.x86_64
    $ sudo dnf -q history | head -4
    ID | 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 zsh
    package zsh is not installed # rc=1

    history 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 zsh
    No such command: versionlock. Please use /bin/dnf --help
    It could be a DNF plugin command, try: "dnf install 'dnf-command(versionlock)'"

    装上独立包后可用:

    Terminal window
    sudo dnf -y install python3-dnf-plugin-versionlock
    sudo dnf -q versionlock add zsh
    sudo 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 解析依赖时只接受匹配的版本。删除:

    Terminal window
    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 不能替代旧版本来源,它只约束“选哪个版本”。
    • RHEL 10 上是否显式安装 python3-dnf-plugin-versionlock?只装 dnf-plugins-core 会找不到命令;
    • 锁定项是否写进配置管理,而不是手工 versionlock add?文件在 /etc/dnf/plugins/versionlock.list;
    • 回滚脚本是否只回滚 RPM 事务、另做配置/数据备份?
    • 降级是否有可用的旧版本源(EUS/快照/Satellite)?
    • 是否在 history undo 前确认 last 指向正确事务?多步操作后 last 可能不是你以为什么。
    • 没有构造“仓库中存在旧版本”的场景,因此 dnf downgrade 的成功路径未实测;
    • versionlock 阻止升级的效果未单独演示:当前仓库里 zsh 没有可升级版本,dnf upgrade zsh 输出为空(无事务),不能据此证明锁定生效;
    • 未测试 EUS/快照源下的降级;
    • 未测试跨大版本(9→10)后的 history 行为。