apt でアップグレード後にサービスが動かなくなった場合の切り戻し

apt でアップグレード後にサービスが動かなくなった時の切り戻し手順のメモです。

はじめに

Raspberry Pi(Raspbian)で apt upgrade でパッケージのアップグレードを行った後に docker のサービスが起動しなくなりました。その時の切り戻しの手順のメモです。

手順

アップグレードされたパッケージの確認

/var/log/dpkg.log の内容を確認します。実際のファイルの内容は以下でした。

/var/log/dpkg.log
2024-03-02 20:12:47 startup archives unpack
2024-03-02 20:12:49 upgrade docker-compose-plugin:armhf 2.24.5-1~raspbian.11~bullseye 2.24.6-1~raspbian.11~bullseye
2024-03-02 20:12:49 status half-configured docker-compose-plugin:armhf 2.24.5-1~raspbian.11~bullseye
2024-03-02 20:12:49 status unpacked docker-compose-plugin:armhf 2.24.5-1~raspbian.11~bullseye
2024-03-02 20:12:50 status half-installed docker-compose-plugin:armhf 2.24.5-1~raspbian.11~bullseye
2024-03-02 20:13:07 status unpacked docker-compose-plugin:armhf 2.24.6-1~raspbian.11~bullseye
2024-03-02 20:13:08 startup packages configure
2024-03-02 20:13:08 configure docker-compose-plugin:armhf 2.24.6-1~raspbian.11~bullseye 
2024-03-02 20:13:08 status unpacked docker-compose-plugin:armhf 2.24.6-1~raspbian.11~bullseye
2024-03-02 20:13:08 status half-configured docker-compose-plugin:armhf 2.24.6-1~raspbian.11~bullseye
2024-03-02 20:13:09 status installed docker-compose-plugin:armhf 2.24.6-1~raspbian.11~bullseye
2024-03-09 16:22:31 startup archives unpack
2024-03-09 16:22:33 upgrade docker-buildx-plugin:armhf 0.12.1-1~raspbian.11~bullseye 0.13.0-1~raspbian.11~bullseye
2024-03-09 16:22:33 status half-configured docker-buildx-plugin:armhf 0.12.1-1~raspbian.11~bullseye
2024-03-09 16:22:33 status unpacked docker-buildx-plugin:armhf 0.12.1-1~raspbian.11~bullseye
2024-03-09 16:22:33 status half-installed docker-buildx-plugin:armhf 0.12.1-1~raspbian.11~bullseye
2024-03-09 16:22:55 status unpacked docker-buildx-plugin:armhf 0.13.0-1~raspbian.11~bullseye
2024-03-09 16:22:55 upgrade docker-ce-cli:armhf 5:25.0.3-1~raspbian.11~bullseye 5:25.0.4-1~raspbian.11~bullseye
2024-03-09 16:22:55 status half-configured docker-ce-cli:armhf 5:25.0.3-1~raspbian.11~bullseye
2024-03-09 16:22:56 status unpacked docker-ce-cli:armhf 5:25.0.3-1~raspbian.11~bullseye
2024-03-09 16:22:56 status half-installed docker-ce-cli:armhf 5:25.0.3-1~raspbian.11~bullseye
2024-03-09 16:23:11 status triggers-pending man-db:armhf 2.9.4-2
2024-03-09 16:23:14 status unpacked docker-ce-cli:armhf 5:25.0.4-1~raspbian.11~bullseye
2024-03-09 16:23:14 upgrade docker-ce:armhf 5:25.0.3-1~raspbian.11~bullseye 5:25.0.4-1~raspbian.11~bullseye
2024-03-09 16:23:14 status half-configured docker-ce:armhf 5:25.0.3-1~raspbian.11~bullseye
2024-03-09 16:23:14 status unpacked docker-ce:armhf 5:25.0.3-1~raspbian.11~bullseye
2024-03-09 16:23:14 status half-installed docker-ce:armhf 5:25.0.3-1~raspbian.11~bullseye
2024-03-09 16:23:34 status unpacked docker-ce:armhf 5:25.0.4-1~raspbian.11~bullseye
2024-03-09 16:23:34 upgrade docker-ce-rootless-extras:armhf 5:25.0.3-1~raspbian.11~bullseye 5:25.0.4-1~raspbian.11~bullseye
2024-03-09 16:23:34 status half-configured docker-ce-rootless-extras:armhf 5:25.0.3-1~raspbian.11~bullseye
2024-03-09 16:23:34 status unpacked docker-ce-rootless-extras:armhf 5:25.0.3-1~raspbian.11~bullseye
2024-03-09 16:23:34 status half-installed docker-ce-rootless-extras:armhf 5:25.0.3-1~raspbian.11~bullseye
2024-03-09 16:23:40 status unpacked docker-ce-rootless-extras:armhf 5:25.0.4-1~raspbian.11~bullseye
2024-03-09 16:23:40 upgrade docker-compose-plugin:armhf 2.24.6-1~raspbian.11~bullseye 2.24.7-1~raspbian.11~bullseye
2024-03-09 16:23:40 status half-configured docker-compose-plugin:armhf 2.24.6-1~raspbian.11~bullseye
2024-03-09 16:23:40 status unpacked docker-compose-plugin:armhf 2.24.6-1~raspbian.11~bullseye
2024-03-09 16:23:40 status half-installed docker-compose-plugin:armhf 2.24.6-1~raspbian.11~bullseye
2024-03-09 16:23:58 status unpacked docker-compose-plugin:armhf 2.24.7-1~raspbian.11~bullseye
2024-03-09 16:23:58 startup packages configure
2024-03-09 16:23:58 configure docker-buildx-plugin:armhf 0.13.0-1~raspbian.11~bullseye 
2024-03-09 16:23:58 status unpacked docker-buildx-plugin:armhf 0.13.0-1~raspbian.11~bullseye
2024-03-09 16:23:58 status half-configured docker-buildx-plugin:armhf 0.13.0-1~raspbian.11~bullseye
2024-03-09 16:23:58 status installed docker-buildx-plugin:armhf 0.13.0-1~raspbian.11~bullseye
2024-03-09 16:23:58 configure docker-compose-plugin:armhf 2.24.7-1~raspbian.11~bullseye 
2024-03-09 16:23:58 status unpacked docker-compose-plugin:armhf 2.24.7-1~raspbian.11~bullseye
2024-03-09 16:23:58 status half-configured docker-compose-plugin:armhf 2.24.7-1~raspbian.11~bullseye
2024-03-09 16:23:58 status installed docker-compose-plugin:armhf 2.24.7-1~raspbian.11~bullseye
2024-03-09 16:23:58 configure docker-ce-cli:armhf 5:25.0.4-1~raspbian.11~bullseye 
2024-03-09 16:23:58 status unpacked docker-ce-cli:armhf 5:25.0.4-1~raspbian.11~bullseye
2024-03-09 16:23:58 status half-configured docker-ce-cli:armhf 5:25.0.4-1~raspbian.11~bullseye
2024-03-09 16:23:58 status installed docker-ce-cli:armhf 5:25.0.4-1~raspbian.11~bullseye
2024-03-09 16:23:58 configure docker-ce-rootless-extras:armhf 5:25.0.4-1~raspbian.11~bullseye 
2024-03-09 16:23:58 status unpacked docker-ce-rootless-extras:armhf 5:25.0.4-1~raspbian.11~bullseye
2024-03-09 16:23:58 status half-configured docker-ce-rootless-extras:armhf 5:25.0.4-1~raspbian.11~bullseye
2024-03-09 16:23:58 status installed docker-ce-rootless-extras:armhf 5:25.0.4-1~raspbian.11~bullseye
2024-03-09 16:23:58 configure docker-ce:armhf 5:25.0.4-1~raspbian.11~bullseye 
2024-03-09 16:23:58 status unpacked docker-ce:armhf 5:25.0.4-1~raspbian.11~bullseye
2024-03-09 16:23:58 status half-configured docker-ce:armhf 5:25.0.4-1~raspbian.11~bullseye
2024-03-09 16:24:37 status installed docker-ce:armhf 5:25.0.4-1~raspbian.11~bullseye
2024-03-09 16:24:39 trigproc man-db:armhf 2.9.4-2 
2024-03-09 16:24:39 status half-configured man-db:armhf 2.9.4-2
2024-03-09 16:25:01 status installed man-db:armhf 2.9.4-2

/var/log/dpkg.log のログの内容から upgrade と出力されている行を抽出します。

upgrade の行のログの形式はスペース区切りで

  1. 日付
  2. 時刻
  3. 処理
  4. パッケージ名
  5. アップグレード前のバージョン
  6. アップグレード後のバージョン

になっています。この内容から「パッケージ名=アップグレード前のバージョン」の形式で一覧を作成します。

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

リダイレクトで書き出したファイルの内容は以下です。

./rollback.txt
docker-buildx-plugin:armhf=0.12.1-1~raspbian.11~bullseye
docker-ce-cli:armhf=5:25.0.3-1~raspbian.11~bullseye
docker-ce:armhf=5:25.0.3-1~raspbian.11~bullseye
docker-ce-rootless-extras:armhf=5:25.0.3-1~raspbian.11~bullseye
docker-compose-plugin:armhf=2.24.6-1~raspbian.11~bullseye

切り戻しのシミュレーション

切り戻すパッケージとバージョンの一覧のファイルの内容を 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 が動かなくなったバージョンへのアップグレードは切り戻しを行ってスキップしましたが、次のバージョンでは問題なく動作しました。