诊断失败的更新与回滚操作

LinuxBeginner
立即练习

介绍

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 进行了回滚,并验证了该事务安装的软件包已被移除。