Skip to content
Search RHEL

This page uses Chinese content. Search opens the Chinese documentation.

    Browse this documentation

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

    This content is not available in your language yet.

    包回滚有三层:撤销一次 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 行为。