今回はパッケージの日々のアップデートと、Ubuntuまるごとのアップグレードを制御する方法を紹介します。
アップデートとアップグレード
Ubuntuは最新版のリリース時から(場合によってはリリース前から)パッケージのアップデートを提供しています。アップデートの理由は不具合修正や脆弱性の修正が主ではありますが、Firefoxなどアップストリームによるリリースがあったのでこれに追随するからというものもあります。
理由はさておき、パッケージのアップデートがリリースされた場合、デフォルトの設定では定期的にリポジトリ情報を更新し(換言するとapt updateを自動実行し)、セキュリティアップデートの場合は即座に適用します。そうではない場合、1週間毎にアップデートがあることを告知します。
最新バージョンのUbuntuがリリースされた場合、通常リリース(中間リリース)の場合はアップグレードが促されるダイアログが表示されます。LTSでは次のLTSがリリースされた場合に同様の動きとなります。ということは設定を変更しない限りLTSから通常リリースへのアップグレードはできません。
今回はこのあたりの振る舞いをカスタマイズし、アップデートやアップグレードを制御する方法を紹介するのが主旨です。
なお、本稿では日々の更新をアップデート、Ubuntuの新しいバージョンがリリースされた場合に更新するのをアップグレードと呼称します。
あくまで扱うのはDebianパッケージのみであり、Snapパッケージについては特に紹介しません。自動的にアップデートされる上ロールバックも簡単にできるので、そのままにしておくのがベストでしょう。そもそもアップデートを止める仕組みはありません。
またCanonical Livepatch Serviceについても紹介しません。やや古い記事ではありますが第443回をご覧ください。現状と比較するとかなり簡単に設定できるようにはなっていますが、基本は変わりありません。
余談ですが、定期的にリポジトリ情報を更新する方法はcronではなくsystemd.timerで行われています。「/lib/systemd/system/apt-daily.timer」がそのファイルです。
GUIでのアップデートの設定変更
アップデートの設定は「ソフトウェアとアップデート」の「アップデート」タブで行います。図1はUbuntu 20.04 LTSの「アップデート」タブですが、21.04でも設定できる項目は同じです。
「その他のパッケージの確認対象」は「すべてのアップデート」「セキュリティ&推奨アップデート」「セキュリティアップデートのみ」から選択できます。この設定を変更すると/etc/apt/sources.listを書き換えます。
「アップデートの自動確認」は「毎日」「2日ごと」「毎週」「2週間ごと」「なし」から選択できます。この設定を変更すると、/etc/apt/apt.conf.d/10periodicとapt.conf.d/20auto-upgradesの「APT::Periodic::Update-Package-Lists」の値を変更します。“1”だと毎日、14だと2週間というわけです。
「セキュリティアップデートがあるとき」は「すぐに表示」「ダウンロードを自動的に行う」「ダウンロードとインストールを自動的に行う」から選択できます。この値を変更すると、/etc/apt/apt.conf.d/10periodicと20auto-upgrades[1]の「APT::Periodic::Unattended-Upgrade」「APT::Periodic::Download-Upgradeable-Packages」「APT::Periodic::AutocleanInterval」の値を変更します。例えば「ダウンロードを自動的に行う」だと、パッケージのダウンロードは行うので「APT::Periodic::Download-Upgradeable-Packages」は「1」に、インストールは行わないので「APT::Periodic::Unattended-Upgrade」は「0」に、ダウンロードしたパッケージを消さないように「APT::Periodic::AutocleanInterval」は「0」になります。
「その他のアップデートがあるとき」は「すぐに表示」「1週間ごとに表示」「2週間ごとに表示」から選択できます。この値を変更すると、dconfの「/com/ubuntu/update-notifier/regular-auto-launch-interval」の値を変更します。ポイントは「すぐに表示」は「0」であり、全く表示させたくない場合は「/com/ubuntu/update-notifier/no-show-notifications」を「true」にする必要があります。
個々の項目を見ていくと、基本的にaptの設定を書き換えていることがわかります。
CLIでのアップデートの設定変更
ではGUIのないサーバーでアップデートの設定を変更したい場合はどうするのかというと、「unattended-upgrade」パッケージを使用します。とはいえUbuntu(デスクトップ)にもインストールされていますし、こちらもaptの設定を書き換えるので「ソフトウェアとアップデート」の設定と共存できます。設定自体は/etc/apt/apt.conf.d/50unattended-upgradesに対して行います。設定の読み込みは冒頭の数字の若い順番に行われるため、「ソフトウェアとアップデート」の設定よりも「unattended-upgrade」の設定のほうが優先されます。
具体的にな設定方法に関しての説明は省略しますが、英語とはいえわかりやすい解説が書かれているのでそれほど難しくはないでしょう。
本連載では第83回と第173回でunattended-upgradeを紹介していました。なかなかに歴史を感じます。
アップグレードの設定変更
アップグレードの設定変更は、もうおわかりかと思いますが、「ソフトウェアとアップデート」の「アップデート」タブにある最後のひとつ、「Ubuntuの新バージョンの告知」で行います。LTSでのデフォルト設定は「長期サポート(LTS)版」で、通常リリースでは「すべての新バージョン」となっています。ということは、LTSから通常リリースにアップグレードしたい場合はここを「すべての新バージョン」に、例えばUbuntu 21.10から22.04 LTSにアップグレードし、その後はLTSのリリース毎にアップグレードしたい場合は「LTS」とすればいいことになります。
この設定を変更すると、「/etc/update-manager/release-upgrades」の「Prompt」の値を書き換えます。値は「never」「normal」「lts」です。
値が「normal」または「lts」で、新リリースがあった際はアップグレードの告知が表示されます。図2はUbuntu 20.10で表示されたアップグレードの告知です。実際のプログラムは/usr/lib/ubuntu-release-upgrader/check-new-release-gtkです。
「アップグレードしない」をクリックすると、dconfの「/apps/update-manager/check-new-release-ignore」にアップデート対象のコードネーム(今回だと「hirste」)を書き込みます。ということは、例えばUbuntu 18.04 LTSから20.04 LTSにアップグレードしたくない場合はこの値を「focal」にすればいいわけですが、20.04 LTSから22.04 LTSにアップグレードしたくない場合は22.04 LTSのリリース後にこの値を書き換える必要があります。恒久的にアップグレードしたくない場合は前述の「Ubuntuの新バージョンの告知」を「なし」にすればいいことになります。
「次回にたずねる」をクリックすると、dconfの「/com/ubuntu/update-notifier/release-check-time」に次に起動する時間をUNIX時間で記録します。調べてみたところ、クリックした日時の1週間後の同時刻になりました。
「今すぐアップグレードする」をクリックすると、いうまでもありませんがアップグレードを行うアプリケーションが起動します。
「Ubuntu Weekly Topics 2021年5月14日号」にあるように、Ubuntuのアップグレード開始を速やかに行わないことが増えてきました。どうやってこのようなことをしているのかというと、「/usr/lib/ubuntu-release-upgrader/check-new-release-gtk」が通常リリースの場合はhttp://changelogs.ubuntu.com/meta-releaseに、LTSの場合はhttp://changelogs.ubuntu.com/meta-release-ltsにアクセスして新リリースがないかを確認しているのです。これらのファイルは当然ではあるものUbuntuのすべてのリリースに関する記述があるため、コードネームを忘れてしまった場合や、パッケージがhttp://old-releases.ubuntu.com/送りになっているかどうかを確認する必要がある場合に見てみるのもいいでしょう。