介绍
DNF 历史记录非常有用,因为它将已完成的事务与在提交前失败的命令分离开来。回滚的目标必须是已完成的事务,而不仅仅是任何失败的命令行操作。
在本实验中,设置脚本会安装 tree 这个小型软件包并记录其事务 ID。你将捕获一个失败的软件包操作,检查 DNF 历史记录,查看已暂存的安装事务,将其撤销,并验证 tree 是否已被卸载。
查看近期 DNF 历史记录
在此步骤中,你将在尝试任何回滚操作之前查看近期的软件包事务。
进入项目目录并创建一个工作区。
cd /home/labex/project
mkdir -p update-rollback
保存近期的 DNF 历史记录。
sudo dnf history list | tee update-rollback/history-before.txt
检查 tree 当前是否已安装。
rpm -q tree | tee update-rollback/tree-query-before.txt
最近一次成功的事务就是实验设置中暂存的 tree 安装操作。
捕获失败的软件包操作
在此步骤中,你将运行一个在安装任何内容之前就会失败的软件包命令。这将为你提供失败输出,以便与已完成的历史记录进行对比。
尝试安装一个不存在的软件包名称。
sudo dnf -y install rhce-missing-package 2>&1 | tee update-rollback/failed-install.txt || true
读取失败信息。
sed -n '1,16p' update-rollback/failed-install.txt
这个失败的命令是很有用的证据,但它并不是你要撤销的事务。
查看回滚目标
在此步骤中,你将检查安装 tree 的已完成事务。在实际的故障处理中,你会从 dnf history list 中选择此 ID;本实验已存储了该暂存 ID,以便你专注于撤销工作流。
保存暂存的事务 ID。
cat /var/tmp/rhce-tree-transaction-id | tee update-rollback/transaction-id.txt
读取该事务的详细信息。
tid=$(cat update-rollback/transaction-id.txt)
sudo dnf history info "$tid" | sed -n '1,28p' | tee update-rollback/transaction-info.txt
事务详情应显示 tree 的安装记录。
撤销已完成的安装事务
在此步骤中,你将撤销已完成的 tree 安装事务。撤销命令使用的是事务 ID,而不是失败的软件包命令。
读取事务 ID。
tid=$(cat update-rollback/transaction-id.txt)
撤销该事务。
sudo dnf -y history undo "$tid" | tee update-rollback/undo.txt
保存撤销后的历史记录。
sudo dnf history list | tee update-rollback/history-after.txt
DNF 会将此次撤销记录为一个新的事务。
验证回滚结果
在此步骤中,你将确认由暂存事务安装的软件包已不再存在。
查询该软件包。
rpm -q tree | tee update-rollback/tree-query-after.txt || true
检查命令路径。
command -v tree || true
读取最新的历史记录条目。
sudo dnf history list | sed -n '1,6p'
回滚操作移除了 tree,而失败的缺失软件包命令仅作为诊断证据保留了下来。
总结
你检查了 DNF 历史记录,捕获了一个失败的软件包操作,查看了已完成的安装事务,使用 dnf history undo 进行了回滚,并验证了该事务安装的软件包已被移除。



