はじめに
DNF の履歴(history)は、完了したトランザクションと、コミットされる前に失敗したコマンドを区別できるため、非常に有用です。ロールバックの対象となるのは、単なる失敗したコマンドラインではなく、必ず「完了したトランザクション」である必要があります。
この実験では、セットアップ時にインストールされた小さな 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
この失敗したコマンドは診断の証拠として有用ですが、取り消し(undo)の対象となるトランザクションではありません。
ロールバック対象の確認
このステップでは、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 を使用してロールバックを行い、そのトランザクションによってインストールされたパッケージが削除されたことを検証しました。



