みかんのゆるふわ技術ブログ

Raspberry PiやIoT関係のことを書き残していきます

寝ている間にRaspberry Piを全自動アップデート!~unattended-upgradesを使おう

Raspberry Pi OSは時々セキュリティアップデートやバグ修正などのため、パッケージのアップデートが配信されます。

unattended-upgradesを使うと、アップデートを自動的に適用できます。

寝ている間にアップグレードしてくれると便利ですよね🥰早速設定しましょう。

unattended-upgradesとは?

unattended-upgradesはDebian由来のツールで、UbuntuやRaspberry Pi OSなどDebian系のOSで使えます。 自動でアップデートを適用してくれるほか、結果をメールで通知したり、自動で再起動したりできます。 パッケージによっては、アップデートに再起動が必要になりますもんね。

これを使えば、管理の手間が減ること間違いなしでしょう。早速使ってみましょう。

インストール

aptで簡単にインストールできます。

$ sudo apt install unattended-upgrades

試したところ2020年9月現在、Debian用の設定そのままになっているようで、入れただけではRaspberry Piでは使えませんでした。 Raspberry Pi OSに合わせた設定を自分でする必要があります。

アップデートの設定

設定ファイルは/etc/apt/apt.conf.d/50unattended-upgradesにあります。これをエディタで開いて編集しましょう。

アップデート対象の設定

まず、アップデート対象パッケージの設定を行います。デフォルトでは、このようになっていました。 (コメントアウトされていた行は除いています)

Unattended-Upgrade::Origins-Pattern {
        "origin=Debian,codename=${distro_codename},label=Debian";
        "origin=Debian,codename=${distro_codename},label=Debian-Security";
};

この通り、Debianの一部のパッケージが対象になっています。 調べるとわかりますが、Raspberry Pi OSのパッケージはOriginがRaspbianRaspberry Pi Foundationなどになっており、このままではマッチせず何にもアップデートされません。変更しましょう。

とりまsudo apt updateで出てくるパッケージを全部アップデートしたい場合は、以下で十分です。

Unattended-Upgrade::Origins-Pattern {
        "o=*,a=*";    // この行だけに置き換え
};

Debianとかの行は削除して大丈夫です。 もし、何らかの理由でアップデートしたくないパッケージがある場合は、

Unattended-Upgrade::Package-Blacklist {
}

の欄にパッケージ名を書けばアップデート対象外になります。

自動再起動の設定

Linuxカーネルなど一部のアップデートの適用にはRaspberry Piの再起動が必要です。 デフォルトでは、自動では再起動されません。自分でログインして再起動する必要があります。

必要なときに自動で再起動させるには、/etc/apt/apt.conf.d/50unattended-upgradesに次のように設定します。

Unattended-Upgrade::Automatic-Reboot "true";
Unattended-Upgrade::Automatic-Reboot-WithUsers "true";
Unattended-Upgrade::Automatic-Reboot-Time "02:00";

1行目のAutomatic-Reboottrueにすると、アップデート後に再起動が必要な場合に自動で再起動します。 デフォルトはfalseになっており、再起動は行われません。

2行目のAutomatic-Reboot-WithUserstrueにすると、ログインしているユーザーがいても、問答無用で再起動します。

3行目のAutomatic-Reboot-Timeを指定すると、この時間になるまで再起動を保留します。この場合は夜中の2時に再起動します。これを設定しない場合は、アップデート直後に再起動します。

不要になったパッケージを自動削除

次のようにすると、sudo apt autoremoveを実行したのと同じように、不要なパッケージを自動削除できます。

Unattended-Upgrade::Remove-Unused-Kernel-Packages "true";
Unattended-Upgrade::Remove-New-Unused-Dependencies "true";
Unattended-Upgrade::Remove-Unused-Dependencies "true";

メール通知の設定

アップデート結果はログファイル/var/log/unattended-upgrades/unattended-upgrades.logを見ればわかります。

ログインしてログファイルをチェックするのが面倒なら、アップデート結果をメールで通知させられます。 /etc/apt/apt.conf.d/50unattended-upgradesに次のように設定します。

Unattended-Upgrade::Mail "example@gmail.com";
Unattended-Upgrade::MailOnlyOnError "false";

1行目のMailのところにあて先メールアドレスを書きます。 2行目のMailOnlyOnErrortrueにすると、何かエラーが出たときだけメールが送られるようになります。デフォルトはfalseです。

なお、この機能を使うには、mailxコマンドでメールが送れるようになっている必要があります。 以前の記事でGmailにリレーするだけのPostfixメールサーバーをインストールする方法を説明しています。

www.mikan-tech.net

この設定をしたうえで、mailxコマンドが入っているmailutilsbsd-mailxパッケージをインストールすればOKです。

$ sudo apt install bsd-mailx

アップデート時刻の設定

デフォルトでは1日2回ランダムな時間にパッケージのダウンロードが行われます。 また、1日1回午前6時ごろにアップデートが実行されます。特に問題ない場合は何もする必要はありません。

時刻を変更したい場合は次のようにします。

unattended-upgradessystemdでスケジューリングされて起動します。自動アップデートは2つの段階に分かれています。

  • パッケージのダウンロード - apt-daily.timer
  • ダウンロードしたパッケージのインストール - apt-daily-upgrade.timer

デフォルトでは前者が6時~18時と18時~翌6時のランダムな時間にそれぞれ1回ずつ、後者が午前6時となっています。

設定ファイルは、次の場所にあります。

ダウンロード時刻の設定

  • デフォルト設定: /lib/systemd/system/apt-daily.timer
  • ユーザ設定: /etc/systemd/system/apt-daily.timer.d/override.conf

最初はデフォルト設定のみですが、これを直接編集するのはお行儀が良くないようです。 変更するには、次のようにしてユーザ設定を編集します。

$ sudo systemctl edit apt-daily.timer

エディタが開きますので、次のようにします。

[Timer]
OnCalendar=
OnCalendar=01:00
RandomizedDelaySec=4h
Persistent=true

これで、午前1時~5時の間にパッケージをダウンロードするようになりました。 「毎週日曜日」などの設定もできますので、詳しくは公式の説明をご覧ください。

デフォルトでは起動時に設定時刻を過ぎていた場合、起動直後すぐにアップデートが開始されます。 これを避けるため、Persistent=trueの行を入れています。 これがあると、電源OFF時に過ぎていたものは無視し、次の時刻までアップデートを始めません。

ユーザ設定を適用するには、次のようにします。

$ sudo systemctl restart apt-daily.timer
$ sudo systemctl status apt-daily.timer    # 設定のチェック
● apt-daily.timer - Daily apt download activities
   Loaded: loaded (/lib/systemd/system/apt-daily.timer; enabled; vendor preset: enabled)
  Drop-In: /etc/systemd/system/apt-daily.timer.d
           └─override.conf
   Active: active (waiting) since Fri 2020-09-04 17:54:27 JST; 1s ago
  Trigger: Sat 2020-09-05 03:14:00 JST; 6h left

Triggerの欄に次回トリガー予定時刻が出てきますので、チェックしてみましょう。

アップデート時刻の設定

同じようにして、アップデートの時刻も変更できます。

  • デフォルト設定: /lib/systemd/system/apt-daily-upgrade.timer
  • ユーザ設定: /etc/systemd/system/apt-daily-upgrade.timer.d/override.conf

次のようにすると、ユーザ設定が編集できます。

$ sudo systemctl edit apt-daily-upgrade.timer

エディタが開きますので、次のようにします。

[Timer]
OnCalendar=
OnCalendar=05:00
RandomizedDelaySec=1h
Persistent=true

これで、5時~6時の間にダウンロード済パッケージのアップデートを開始します。

ユーザ設定を適用するには、次のようにします。

$ sudo systemctl restart apt-daily.timer
$ sudo systemctl status apt-daily.timer    # 設定のチェック

動かしてみよう

動作テスト

動作テストを行うには、次のようにします。

$ sudo unattended-upgrade -d --dry-run

このコマンドはパッケージをダウンロードしますが、実際にアップデートは行いません。 これで、システムに影響を与えずに動作をチェックできます。

実際の動作の様子

私のRaspberry Piで試したところ、時間になると勝手にアップデートして再起動もしてくれました。 アップデートが終わると、私のメールアドレスにちゃんとメールも飛んできました。

f:id:kimura_khs:20200907183038p:plain:w300

でも再起動後にメールは送られてこないんですね。アップデート後にちゃんと起動したか心配だな…🤔 そこは別の方法でメールを飛ばすしかなさそうです。まあ起動しないということは滅多にないと思いますけどね。

ダウンロードやアップグレードが行われている最中はRaspberry Piが結構重くなります。 あまり使わない時間帯を選んだほうが良いでしょう。