Ubuntu 21.
needrestartの基本
glibcなど特定のライブラリパッケージに脆弱性が見つかり、
しかしながらどのパッケージが更新され、
needrestart自体はPerl製のシンプルなスクリプトです。簡単に仕組みを説明すると、/proc/
」
ちなみにneedrestart自体は単にライブラリだけでなく、
- カーネル本体の更新
- Intel/
AMDのCPUのマイクロコードの更新 - Java/
Perl/ Python/ Rubyで利用しているライブラリの更新 - Dockerコンテナ内部のプロセスは無視
- LXC/
LXDコンテナ内のプロセスの場合はインスタンスの再起動を通知 - QEMU更新時に再起動が必要なVMのリストを通知
その結果、

unattended-upgradeのようにバックグラウンドで自動更新するケースについては、sudo needrestart
を実行すると良いでしょう。また-p
」
ちなみにneedrestartが最初からインストールされるようになったのは、
特にサーバー版/Cloud Image版の場合、apt upgrade
」
needrestartの設定は/etc/
に集約されています。このファイルを直接変更してもいいのですが、/etc/
ディレクトリにfoo.
」conf.
以下のみを変更するようにしたほうが良いでしょう。ファイル名でソートされた上で読み込まれますので、00-foo.
」
再起動モードの変更
まずはパッケージ更新時の再起動通知について設定してみましょう。これはneedrestart.
に次のように説明されています。
# Restart mode: (l)ist only, (i)nteractive or (a)utomatically.
#
# ATTENTION: If needrestart is configured to run in interactive mode but is run
# non-interactive (i.e. unattended-upgrades) it will fallback to list only mode.
#
#$nrconf{restart} = 'i';
選択肢は次の3種類です。
- 再起動が必要なサービスを表示するだけ
(l) - サービスごとに再起動が必要かどうかを通知する
(i) - 必要なサービスはすべて自動的に再起動する
(a)
未設定時は
たとえば次のように実行すれば、/etc/
ディレクトリに
$ echo "\$nrconf{restart} = 'a';" | sudo tee /etc/needrestart/conf.d/50-autorestart.conf
なお、
常に再起動を抑止する
needrestartは、defno
」
# Change default answer to 'no' in (i)nteractive mode.
#$nrconf{defno} = 1;
上記をコメントアウトしたり、$nrconf{defno}
を1にすることで、
ただしこのままだと
$ sudo needrestart -u NeedRestart::UI::stdio -n (中略) Restarting services... Services to be restarted: Restart «ModemManager.service»? [yNas?] Restart «dbus.service»? [yNas?] Restart «lxd-agent.service»? [yNas?]
このように必要なものだけ、needrestart.
でも変更できます。
# Use preferred UI package.
#$nrconf{ui} = 'NeedRestart::UI::stdio';
これをコメントアウトするだけです。指定できるUIはneedrestart -u ?
」
特定のサービスの抑制
特定のサービスだけneedrestartのチェック対象から外すことも可能です。たとえば、
# Blacklist services (list of regex) - USE WITH CARE.
# You should prefer to put services to $nrconf{override_rc} instead.
# Any service listed in $nrconf{blacklist_rc} will be ignored completely!
#$nrconf{blacklist_rc} = [
#];
# Override service default selection (hash of regex).
$nrconf{override_rc} = {
(中略)
# do not restart oneshot services, see also #862840
qr(^apt-daily\.service$) => 0,
qr(^apt-daily-upgrade\.service$) => 0,
qr(^unattended-upgrades\.service$) => 0,
(中略)
};
# Override container default selection (hash of regex).
$nrconf{override_cont} = {
};
「$nrconf{blacklist_
」$nrconf{override_
」$nrconf{override_
」
ようはこれらのハッシュに、qr(サービス名にマッチする正規表現) = 0,
」
もし/etc/
以下で変更する場合は、
$nrconf{override_rc}{ qr(正規表現) } = 0;
特定のライブラリを指定したブラックリスト
サービス名ではなくライブラリのファイル名でブラックリスト化することも可能です。こちらは
# Blacklist binaries (list of regex).
$nrconf{blacklist} = [
# ignore sudo (not a daemon)
qr(^/usr/bin/sudo(\.dpkg-new)?$),
# ignore DHCP clients
qr(^/sbin/(dhclient|dhcpcd5|pump|udhcpc)(\.dpkg-new)?$),
# ignore apt-get (Debian Bug#784237)
qr(^/usr/bin/apt-get(\.dpkg-new)?$),
];
もし/etc/
以下で変更する場合は、
$nrconf{blacklist}{ qr(正規表現) } = 0;
パッケージのフック処理
needrestartはパッケージ更新時のフック処理によって呼び出されています。フックのタイミングは次の2パターンです。
/etc/
dpkg/ dpkg. cfg. d/ needrestart /etc/
apt/ apt. conf. d/ 99needrestart
前者はapt内部で呼ばれるdpkgコマンドにおいて、
status: パッケージ名: ステータス
status: パッケージ名 : error : エラーメッセージ
status: ファイル名 : conffile-prompt : 選択肢
processing: ステージ: パッケージ名
needrestartで必要なのは
前者の/etc/
では、/usr/
を呼び出し、/run/
にunpacked
ファイルやerror
ファイルを作成します。
後者の/etc/
では、DPkg::Post-Invoke
から/usr/
を呼び出しています。DPkg::Post-Invoke
はdpkgの処理が完了したときに呼ばれるスクリプトを指定する設定です。apt-pinvoke
では、unkacked
があるけれどもerror
がない、needrestart
コマンドを実行しています。
この仕組みはパッケージに絡む処理ならなんでも流用可能です。よって上記の仕組みを参考にすれば、