apt でアップグレード後にサービスが動かなくなった場合の切り戻し
apt でアップグレード後にサービスが動かなくなった時の切り戻し手順のメモです。
はじめに
Raspberry Pi(Raspbian)で apt upgrade
でパッケージのアップグレードを行った後に docker のサービスが起動しなくなりました。その時の切り戻しの手順のメモです。
手順
アップグレードされたパッケージの確認
/var/log/dpkg.log の内容を確認します。実際のファイルの内容は以下でした。
/var/log/dpkg.log のログの内容から upgrade
と出力されている行を抽出します。
upgrade
の行のログの形式はスペース区切りで
- 日付
- 時刻
- 処理
- パッケージ名
- アップグレード前のバージョン
- アップグレード後のバージョン
になっています。この内容から「パッケージ名=アップグレード前のバージョン」の形式で一覧を作成します。
awk
コマンドで /var/log/dpkg.log
の内容から抽出しました。
awk '$3 == "upgrade" { print $4"="$5 }' /var/log/dpkg.log > ./rollback.txt
ある日時以降を指定して絞る場合は以下のようにできます。
awk '$1" "$2 >= "2024-03-09 16:22:31" && \
$3 == "upgrade" { print $4"="$5 }' /var/log/dpkg.log > ./rollback.txt
パッケージを指定して抽出する場合は以下のように絞るといいと思います。
# docker のみで絞る場合
awk '$4 ~ /^docker/ && \
$3 == "upgrade" { print $4"="$5 }' /var/log/dpkg.log > ./rollback.txt
最終的に日時とパッケージを指定して以下で抽出しました。
awk '$1" "$2 >= "2024-03-09 16:22:31" && \
$4 ~ /^docker/ && \
$3 == "upgrade" { print $4"="$5 }' /var/log/dpkg.log > ./rollback.txt
リダイレクトで書き出したファイルの内容は以下です。
切り戻しのシミュレーション
切り戻すパッケージとバージョンの一覧のファイルの内容を apt
コマンドに与えて確認します。
xargs sudo apt --dry-run install < ./rollback.txt
--dry-run
オプションのマニュアルの内容は以下です(一部抜粋)
-s, –simulate, –just-print, –dry-run, –recon, –no-act
何もしない - 現在のシステム状態に基づいて起こるイベントのシミュレーションを行い、実際にはシステムを変更しません。
コマンドの実行結果は以下のようパッケージがダウングレードされる内容が出力されました。
以下のパッケージは「ダウングレード」されます:
docker-buildx-plugin docker-ce docker-ce-cli docker-ce-rootless-extras docker-compose-plugin
アップグレード: 0 個、新規インストール: 0 個、ダウングレード: 5 個、削除: 0 個、保留: 0 個。
切り戻しを行う
--allow-downgrades
オプションを指定して apt
コマンドでインストールを行います。
xargs sudo apt install -y --allow-downgrades < ./rollback.txt
おわりに
apt
でアップグレード後にサービスが動かなくなった時に備えて切り戻しを手順化しておくことで、パッケージのアップグレードを躊躇したりアップグレード後に焦ることもなくなりそうです。
ちなみに docker が動かなくなったバージョンへのアップグレードは切り戻しを行ってスキップしましたが、次のバージョンでは問題なく動作しました。