跳转到内容
搜索 AlmaLinux 文档

    浏览当前文档目录

    AlmaLinux 9:撤销一次 dnf 误装

    装错包、装错版本、误删依赖,第一反应不该是「再装回去」,而是看 dnf 的事务历史:每次安装/删除/升级都记成一个带 ID 的事务,undo 可以反向执行其中某一个。

    本文在 almalinux:9 容器(AlmaLinux 9.8,aarch64,dnf 4.14.0)中实际执行:cat /etc/almalinux-release、dnf --version、dnf repolist --enabled、dnf -y install tree、dnf history list、dnf -y history undo 3、再次 rpm -q tree。日志:plans/content-expansion/evidence/logs/alma-dnf-history-rollback.log。

    rollback 的行为、版本不可获取时的失败、以及配置/服务状态的恢复均未在本环境验证,文中按「文档口径」标注。

    先看清事务 ID,不要假设它从 1 开始

    Section titled “先看清事务 ID,不要假设它从 1 开始”
    Terminal window
    dnf history list | head -4
    ID | Command line | Date and time | Action(s) | Altered
    -------------------------------------------------------------------------------
    2 | reinstall -y --installro | 2026-10-02 09:09 | R | 2
    1 | install -y ... | 2026-10-02 09:08 | Install | ...

    本次使用的 almalinux:9 容器镜像里已经有构建阶段留下的事务。所以撤销「你刚装的那一个」时,不能写 undo 1——要先看列表,拿到真正属于你这次操作的 ID。(云镜像是否同样自带事务,本页没有验证。)

    Terminal window
    sudo dnf -y install tree
    dnf history list | head -3
    ID | Command line | Date and time | Action(s) | Altered
    -------------------------------------------------------------------------------
    3 | -y install tree | 2026-10-18 16:33 | Install | 1

    本次实测里新事务是 ID 3(前两个是镜像自带的)。脚本里可以用 dnf history list | awk 'NR==3{print $1}' 取最新一条。

    Terminal window
    sudo dnf -y history undo 3
    rpm -q tree
    Removed:
    tree-1.8.0-10.el9.aarch64
    Complete!
    package tree is not installed

    undo 做的是反向执行:事务 3 装了 1 个包,undo 就删掉这 1 个包。

    ID | Command line | Date and time | Action(s) | Altered
    -------------------------------------------------------------------------------
    4 | -y history undo 3 | 2026-10-18 16:33 | Removed | 1
    3 | -y install tree | 2026-10-18 16:33 | Install | 1

    撤销也会记一条新事务(本次是 ID 4)。理论上对 4 再 undo 可以回到撤销前——本页没有执行这一步(Rocky 上的同类结果不能算作 Alma 的证据);需要时先 dnf history info 4 看清受影响包。

    场景用哪个
    刚装错一个包dnf history undo <ID>:只反向这一个事务
    连续几步后想整体退回dnf history rollback <ID>:退回到该事务之后的状态
    只想看动了什么dnf history info <ID>:不动系统

    两者都只对 DNF 管理过的软件包生效。

    • 写死 undo 1:镜像自带事务的情况下会撤销到构建阶段的包,甚至触发依赖冲突(本次实测对 ID 1 执行就报了 rtld(GNU_HASH) 冲突);
    • undo 后不管配置:/etc 下被覆盖的文件不会恢复,systemctl enable 的软链也不在事务里;
    • 版本已不可获取:undo 会直接拒绝,先 dnf history info 看清涉及包,再从 vault 仓库取对应版本。

    前置:AlmaLinux 9,root 或 sudo。

    Terminal window
    sudo dnf -y install tree
    ID=$(dnf history list | awk 'NR==3{print $1}')
    echo "本次事务 ID=$ID"
    sudo dnf -y history undo "$ID"

    检查:

    1. rpm -q tree → package tree is not installed
    2. dnf history list | head -3 → 多了一条 history undo 事务
    3. 对这条新事务再 undo → tree 重新装上

    常见问题

    为什么 `dnf history undo 1` 会失败?

    本次容器镜像自带 2026-10-02 的构建事务,ID 1 属于镜像构建而不是你的操作。对它执行 undo 会试图撤销构建阶段装上的包,实测报 rtld(GNU_HASH) 依赖冲突。先 dnf history list 找到你自己那条事务的 ID。

    undo 会把配置文件一起恢复吗?

    不会。undo 只反向事务里涉及的软件包,/etc 下被覆盖或新建的文件不会恢复,systemctl enable 的软链也不在事务记录里;执行后仍要核对配置与服务状态。

    撤销后发现撤错了怎么办?

    先 dnf history info <ID> 确认涉及哪些包,再决定是否对新产生的那条 undo 事务再 undo。前提是相关版本仍可获取;本页未在 Alma 上实测「undo 的 undo」这一步。