用 dnf history 回滚一次误操作(Rocky 9 实测)
什么时候该用它
Section titled “什么时候该用它”装错包、装错版本、误删依赖——在 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。
事务历史长什么样
Section titled “事务历史长什么样”先装一个包,制造一个可回滚的事务:
dnf -y install treerpm -q treednf history listID | Command line | Date and time | Action(s) | Altered------------------------------------------------------------------------------- 1 | -y install tree | 2026-10-18 13:22 | Install | 1ID 就是后面 undo 要用的编号;Altered 是这次事务影响的包数量。
撤销这个事务
Section titled “撤销这个事务”dnf -y history undo 1rpm -q treeRemoved: tree-1.8.0-10.el9.aarch64Complete!
package tree is not installedundo 做的是反向执行:事务 1 装了 1 个包,undo 就删掉这 1 个包。它不会把你「恢复到装之前的时间点」,只处理这个事务涉及的包。
undo 自己也会记一条事务
Section titled “undo 自己也会记一条事务”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 始终在历史里,不会被抹掉。
undo 与 rollback 选哪个
Section titled “undo 与 rollback 选哪个”| 场景 | 用哪个 | 原因 |
|---|---|---|
| 刚装错一个包 | dnf history undo <ID> | 只反向这一个事务,影响面最小 |
| 连续几步升级后想整体退回 | dnf history rollback <ID> | 退回到该事务之后的状态,连带撤销它之后的所有事务 |
| 只想看某个事务动了什么 | dnf history info <ID> | 不动系统,先看清楚再决定 |
两个命令都只对 DNF 管理过的软件包生效。
撤不回来的东西
Section titled “撤不回来的东西”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 同样依赖版本可用性,不是通用解药。
- 仓库与默认启用项:Rocky 仓库结构与启停
- 自动更新策略:
/dnf-automatic/(该页尚未放行) - 通用包管理命令:枢纽站的 包管理基础