跳转到内容
搜索 Rocky Linux 文档

    浏览当前文档目录

    用 dnf history 回滚一次误操作(Rocky 9 实测)

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

    本页实际执行的只有:安装 tree、dnf history list、dnf -y history undo 1、dnf -y history undo 2、dnf history info 1。镜像为 Rocky 9.3、dnf 4.14.0;Rocky 9.8 的 dnf 是 4.20,输出宽度可能不同,未在该版本实测。其余结论(rollback 的行为、版本不可获取时的失败)来自 DNF 官方文档核对,文中已分别标注。原始日志:plans/content-expansion/evidence/logs/rocky-dnf-history-rollback.log。

    先装一个包,制造一个可回滚的事务:

    Terminal window
    dnf -y install tree
    rpm -q tree
    dnf history list
    ID | Command line | Date and time | Action(s) | Altered
    -------------------------------------------------------------------------------
    1 | -y install tree | 2026-10-18 13:22 | Install | 1

    ID 就是后面 undo 要用的编号;Altered 是这次事务影响的包数量。

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

    undo 做的是反向执行:事务 1 装了 1 个包,undo 就删掉这 1 个包。它不会把你「恢复到装之前的时间点」,只处理这个事务涉及的包。

    ID | Command line | Date and time | Action(s) | Altered
    -------------------------------------------------------------------------------
    2 | -y history undo 1 | 2026-10-18 13:22 | Removed | 1
    1 | -y install tree | 2026-10-18 13:22 | Install | 1

    这一点很实用:撤销本身也可撤销。真撤错了,再 dnf history undo 2 就回到撤销前的状态。原事务 1 始终在历史里,不会被抹掉。

    场景用哪个原因
    刚装错一个包dnf history undo <ID>只反向这一个事务,影响面最小
    连续几步升级后想整体退回dnf history rollback <ID>退回到该事务之后的状态,连带撤销它之后的所有事务
    只想看某个事务动了什么dnf history info <ID>不动系统,先看清楚再决定

    两个命令都只对 DNF 管理过的软件包生效。

    undo 之后再启动服务前,至少核对三件事:

    • 配置文件:装包时被覆盖或新建的 /etc 文件不会随之恢复;
    • 服务状态:systemctl enable 的软链不在 DNF 事务里;
    • 数据目录:数据库、应用产生的数据与日志,undo 一概不动。

    常见问题

    `dnf history undo` 能撤销配置文件改动吗?

    不能。undo 只反向事务里涉及的软件包(安装/删除/升级),/etc 下被覆盖或新建的配置文件不会恢复,systemctl enable 的软链也不在事务里,启动服务前要自己核对配置。

    undo 之后还能再改回来吗?

    可以。undo 本身记成一条新事务(本次实测 ID 2,动作 Removed);对 ID 2 再执行 undo 会记成 ID 3(动作 Install),tree 重新装上。前提是相关包版本仍可获取。

    为什么 undo 某个事务时提示找不到包或版本?

    通常是目标版本已被后续升级替换、仓库里不再提供原版本。此时 undo 无法完成反向操作,DNF 会拒绝该事务;先 dnf history info <ID> 看清涉及哪些包,再从 vault 仓库取回对应版本或手工处理。rollback 同样依赖版本可用性,不是通用解药。