AlmaLinux 9:撤销一次 dnf 误装
什么时候该用它
Section titled “什么时候该用它”装错包、装错版本、误删依赖,第一反应不该是「再装回去」,而是看 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 开始”dnf history list | head -4ID | 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。(云镜像是否同样自带事务,本页没有验证。)
装一个包,记下它的 ID
Section titled “装一个包,记下它的 ID”sudo dnf -y install treednf history list | head -3ID | 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}' 取最新一条。
sudo dnf -y history undo 3rpm -q treeRemoved: tree-1.8.0-10.el9.aarch64Complete!
package tree is not installedundo 做的是反向执行:事务 3 装了 1 个包,undo 就删掉这 1 个包。
undo 本身也记一条事务
Section titled “undo 本身也记一条事务”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 看清受影响包。
undo 与 rollback 选哪个
Section titled “undo 与 rollback 选哪个”| 场景 | 用哪个 |
|---|---|
| 刚装错一个包 | 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 仓库取对应版本。
练习:撤销一次误装
Section titled “练习:撤销一次误装”前置:AlmaLinux 9,root 或 sudo。
sudo dnf -y install treeID=$(dnf history list | awk 'NR==3{print $1}')echo "本次事务 ID=$ID"sudo dnf -y history undo "$ID"检查:
rpm -q tree→package tree is not installeddnf history list | head -3→ 多了一条history undo事务- 对这条新事务再 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」这一步。
- 仓库与默认启用项:AlmaLinux 仓库
- 离线装包:离线环境装包
- 多仓库冲突(页面待补):
/repo-priority/