Raspberry Pi OS (Raspbian, Debian) でapt upgrade後に再起動が必要かどうか調べるには

Raspberry Pi OS(Raspbian, Debian)を含むLinuxではWindowsと同様に定期的にパッケージのアップデートが必要になりますが、アップデート後にサービスやOSの再起動が必要な場合があります。

そこでパッケージのアップデート後にサービスやOSの再起動が必要かどうかはどうやって判断できるのかを調べてみました。

[ad]

3行まとめ

  • checkrestartまたはneedrestartコマンドで再起動が必要かどうかが分かる
  • needrestartパッケージがインストールされた状態でapt upgradeとすると自動的に再起動できるサービスは自動的に再起動してくれる。
  • ただしカーネルのアップデートを反映するには再起動が必要

調査してみた

使えそうなパッケージ

Debianパッケージ検索https://packages.debian.org/ja/)ページにて”restart”と検索したところ、以下の二つのパッケージが再起動の要否を確認してくれそうです。

  • needrestart (https://packages.debian.org/stretch/needrestart)
  • debian-goodiesのcheckrestart プログラム (https://packages.debian.org/stretch/debian-goodies)

比較のため両方インストールして確認してみます。

インストール

sudo apt-get install debian-goodies needrestart を実行して上記2つのパッケージをインストールします。

コンソール

$ sudo apt-get install debian-goodies needrestart

$ sudo apt-get install debian-goodies needrestart
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています                
状態情報を読み取っています... 完了
以下の追加パッケージがインストールされます:
  dctrl-tools libintl-perl libintl-xs-perl libmodule-find-perl libmodule-scandeps-perl libproc-processtable-perl libsort-naturally-perl libterm-readkey-perl lsof
提案パッケージ:
  debtags popularity-contest xdg-utils zenity needrestart-session | libnotify-bin
以下のパッケージが新たにインストールされます:
  dctrl-tools debian-goodies libintl-perl libintl-xs-perl libmodule-find-perl libmodule-scandeps-perl libproc-processtable-perl libsort-naturally-perl libterm-readkey-perl lsof needrestart
アップグレード: 0 個、新規インストール: 11 個、削除: 0 個、保留: 0 個。
1,454 kB のアーカイブを取得する必要があります。
この操作後に追加で 6,170 kB のディスク容量が消費されます。
続行しますか? [Y/n] Y
取得:1 http://ftp.tsukuba.wide.ad.jp/Linux/raspbian/raspbian stretch/main armhf lsof armhf 4.89+dfsg-0.1 [311 kB]

※※(省略)※※

debian-goodies (0.69.1) を設定しています ...
needrestart (2.11-3+deb9u1) を設定しています ...

その後、sudo apt update && sudo apt upgradeで実際にパッケージをアップデートしてテスト用の環境を用意します。実際にアップデートしたところ、needrestartプログラムが自動で実行されていることが分かりました。

コンソール

$ sudo apt update && sudo apt upgrade

$ sudo apt update && sudo apt upgrade
取得:1 http://archive.raspberrypi.org/debian stretch InRelease [25.4 kB]                            
取得:2 http://raspbian.raspberrypi.org/raspbian stretch InRelease [15.0 kB]                         
取得:3 http://archive.raspberrypi.org/debian stretch/main armhf Packages [221 kB]
取得:4 http://archive.raspberrypi.org/debian stretch/ui armhf Packages [45.0 kB]             
306 kB を 4秒 で取得しました (68.6 kB/s)                              
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています       
状態情報を読み取っています... 完了
アップグレードできるパッケージが 6 個あります。表示するには 'apt list --upgradable' を実行してください。
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています                
状態情報を読み取っています... 完了
アップグレードパッケージを検出しています... 完了
以下のパッケージはアップグレードされます:
  libraspberrypi-bin libraspberrypi-dev libraspberrypi-doc libraspberrypi0 raspberrypi-bootloader raspberrypi-kernel
アップグレード: 6 個、新規インストール: 0 個、削除: 0 個、保留: 0 個。
71.6 MB のアーカイブを取得する必要があります。
この操作後に追加で 5,853 kB のディスク容量が消費されます。
続行しますか? [Y/n] Y
取得:1 http://archive.raspberrypi.org/debian stretch/main armhf libraspberrypi-doc armhf 1.20190517-1 [31.4 MB]
取得:2 http://archive.raspberrypi.org/debian stretch/main armhf libraspberrypi-dev armhf 1.20190517-1 [404 kB]                                                                                             
取得:3 http://archive.raspberrypi.org/debian stretch/main armhf raspberrypi-kernel armhf 1.20190517-1 [35.1 MB]                                                                                            
取得:4 http://archive.raspberrypi.org/debian stretch/main armhf libraspberrypi-bin armhf 1.20190517-1 [332 kB]                                                                                             
取得:5 http://archive.raspberrypi.org/debian stretch/main armhf libraspberrypi0 armhf 1.20190517-1 [839 kB]                                                                                                
取得:6 http://archive.raspberrypi.org/debian stretch/main armhf raspberrypi-bootloader armhf 1.20190517-1 [3,567 kB]                                                                                       
71.6 MB を 24秒 で取得しました (2,933 kB/s)                                                                                                                                                                
changelog を読んでいます... 完了
(データベースを読み込んでいます ... 現在 49551 個のファイルとディレクトリがインストールされています。)
.../0-libraspberrypi-doc_1.20190517-1_armhf.deb を展開する準備をしています ...
libraspberrypi-doc (1.20190517-1) で (1.20190401-1 に) 上書き展開しています ...
.../1-libraspberrypi-dev_1.20190517-1_armhf.deb を展開する準備をしています ...
libraspberrypi-dev (1.20190517-1) で (1.20190401-1 に) 上書き展開しています ...
.../2-raspberrypi-kernel_1.20190517-1_armhf.deb を展開する準備をしています ...
'rpikernelhack による /boot/bcm2708-rpi-0-w.dtb から /usr/share/rpikernelhack/bcm2708-rpi-0-w.dtb への退避 (divert)' を追加しています
'rpikernelhack による /boot/bcm2708-rpi-b-plus.dtb から /usr/share/rpikernelhack/bcm2708-rpi-b-plus.dtb への退避 (divert)' を追加しています

※※(省略)※※

libraspberrypi0 (1.20190517-1) を設定しています ...
libraspberrypi-doc (1.20190517-1) を設定しています ...
libraspberrypi-dev (1.20190517-1) を設定しています ...
libraspberrypi-bin (1.20190517-1) を設定しています ...
Scanning processes...                                                                                                                                                                                       
Scanning linux images...                                                                                                                                                                                    
No services need to be restarted.
No containers need to be restarted.
No user sessions are running outdated binaries.

緑色の5行がneedrestartが自動的に実行された際の出力です。ここでの出力の結果では再起動の必要はなさそうですが。。。

checkrestartを実行してみる

管理者権限でcheckrestartを実行してみます。

コンソール
$ sudo checkrestart
Found 1 processes using old versions of upgraded files
(1 distinct program)
(1 distinct packages)

Of these, 1 seem to contain systemd service definitions or init scripts which can be used to restart them.
The following packages seem to have definitions that could be used
to restart their services:
udev:
 123 /lib/systemd/systemd-udevd
These are the initd scripts:
service udev restart

どうやらudevサービスの再起動が必要なようです。最後の行にサービスを再起動する場合のコマンドまで書いてあります。(ここではservice udev restartですね。)

確かに再起動の要否を確認できました。

needrestartを実行してみる

次に手動でneedrestartを実行してみます。

実行したところ、プロンプト(ncurses)が表示され再起動が促されました。

コンソール
$ sudo needrestart
needrestartを実行したところカーネルのアップデートを反映するために再起動が必要だと教えてくれた

うーん、checkrestartとneedrestartでは出力結果が異なるのが気になりますが、再起動の要否は分かりました。

[ad]

needrestartについてさらに調べてみたら結構便利なことが分かった

その後needrestartについてもう少し調べていたら、Raspberry Pi OSのベースとなるDebian GNU/Linuxのリリースノートにneedrestartに関することが記載されていました。

このリリースでの新規事項は needrestart です。これはインストールされると、毎回の APT アップグレードセッション後にチェックを実行します。システム上で動作しているサービスが、パッケージアップグレード時点での変更の恩恵を受けるために再起動する必要がある場合、これらを再起動してくれます。ライブラリのセキュリティ更新が動作しているサービスに確実に反映されるのを保証するため、needrestart をインストールすることをお勧めします。

Debian 8 (jessie) リリースノート (64 ビット PC 用)

なるほど、needrestartをインストールしておけばaptコマンドを実行する度に再起動が必要なサービスを自動的に再起動してくれるようです。先ほど検証した際にkernel以外が表示されなかったのは、既に対象サービスがneedrestartによって再起動された後だったからか。そしてkernelに関してはOS自体の再起動が必要だったため、手動実行の際に表示された、ということでしょう。

リリースノートがneedrestartをお勧めしているので、checkrestartではなくneedrestartを利用するのが良さそう。

まとめ

今回はaptでパッケージをアップデートした際にサービスやOSの再起動が必要かどうかを調べる方法を調査してみました。私自身はリリースノートにneedrestartがお勧めと書いてあったのを受けて、needrestartパッケージをメインに利用しようと思いますが、皆さんも一度自分で試してみて検討してみてはいかがでしょうか。

それでは良い一日を。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です