失敗したアップデートの診断とロールバックオプション

LinuxBeginner
オンラインで実践に進む

はじめに

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 を使用してロールバックを行い、そのトランザクションによってインストールされたパッケージが削除されたことを検証しました。