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がRaspbian
やRaspberry 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-Reboot
をtrue
にすると、アップデート後に再起動が必要な場合に自動で再起動します。
デフォルトはfalse
になっており、再起動は行われません。
2行目のAutomatic-Reboot-WithUsers
をtrue
にすると、ログインしているユーザーがいても、問答無用で再起動します。
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行目のMailOnlyOnError
をtrue
にすると、何かエラーが出たときだけメールが送られるようになります。デフォルトはfalse
です。
なお、この機能を使うには、mailx
コマンドでメールが送れるようになっている必要があります。
以前の記事でGmailにリレーするだけのPostfixメールサーバーをインストールする方法を説明しています。
この設定をしたうえで、mailx
コマンドが入っているmailutils
かbsd-mailx
パッケージをインストールすればOKです。
$ sudo apt install bsd-mailx
アップデート時刻の設定
デフォルトでは1日2回ランダムな時間にパッケージのダウンロードが行われます。 また、1日1回午前6時ごろにアップデートが実行されます。特に問題ない場合は何もする必要はありません。
時刻を変更したい場合は次のようにします。
unattended-upgrades
はsystemdでスケジューリングされて起動します。自動アップデートは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で試したところ、時間になると勝手にアップデートして再起動もしてくれました。 アップデートが終わると、私のメールアドレスにちゃんとメールも飛んできました。
でも再起動後にメールは送られてこないんですね。アップデート後にちゃんと起動したか心配だな…🤔 そこは別の方法でメールを飛ばすしかなさそうです。まあ起動しないということは滅多にないと思いますけどね。
ダウンロードやアップグレードが行われている最中はRaspberry Piが結構重くなります。 あまり使わない時間帯を選んだほうが良いでしょう。