2023-03-08

Linux で systemd をアップデートしたらどうやって反映させるの?

Linux Mint 21.1 に systemd 249.11-0ubuntu3.7 というアップデートが配信されたので早速アップデートしたものの、systemd 自体のアップデートってどうやって反映させるの?ということで調べてみました。


アップデートの内容がセキュリティ関連ということですぐさま実施しましたが、Linux kernel だともう PC を再起動するしかないんですが、systemd 自体のアップデートはどうすればいいんでしょうか?

とりあえず、systemctl daemon-reload はかけておきましたが、これで完了?でいいのかしら?



ということで、調べてみるとプロセス単位で再起動が必要なものをリストアップしてくれるツールが存在しているということです。Debian 向けとしては checkrestart というコマンドで、具体的には debian-goodies というパッケージをインストールします。

$ checkrestart -a
コマンド 'checkrestart' が見つかりません。次の方法でインストールできます:
sudo apt install debian-goodies

debian-goodies は標準ではインストールされていないようなので、手動でインストールします。

$ apt install debian-goodies 
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています... 完了        
状態情報を読み取っています... 完了        
以下の追加パッケージがインストールされます:
  autoconf automake autopoint autotools-dev debhelper debugedit dh-autoreconf dh-strip-nondeterminism dwz elfutils
  equivs libarchive-cpio-perl libasm1 libdebhelper-perl libfile-slurper-perl libfile-stripnondeterminism-perl
  libfile-which-perl libltdl-dev libmail-sendmail-perl libsub-override-perl libsys-hostname-long-perl libtool
  po-debconf
提案パッケージ:
  autoconf-archive gnu-standards autoconf-doc dh-make apt-file konqueror popularity-contest libtool-doc gfortran
  | fortran95-compiler gcj-jdk libmail-box-perl
以下のパッケージが新たにインストールされます:
  autoconf automake autopoint autotools-dev debhelper debian-goodies debugedit dh-autoreconf dh-strip-nondeterminism
  dwz elfutils equivs libarchive-cpio-perl libasm1 libdebhelper-perl libfile-slurper-perl
  libfile-stripnondeterminism-perl libfile-which-perl libltdl-dev libmail-sendmail-perl libsub-override-perl
  libsys-hostname-long-perl libtool po-debconf
アップグレード: 0 個、新規インストール: 24 個、削除: 0 個、保留: 1 個。
3,794 kB のアーカイブを取得する必要があります。
この操作後に追加で 12.9 MB のディスク容量が消費されます。
続行しますか? [Y/n] 

思っていたよりもたくさんの関連パッケージが必要になるみたいです。でもまあ、インストールしてみます。

インストールが完了したので、さっそく checkrestart を試してみましょう。

$ sudo checkrestart -a
lsof: WARNING: can't stat() fuse.gvfsd-fuse file system /run/user/1000/gvfs
      Output information may be incomplete.
lsof: WARNING: can't stat() fuse.portal file system /run/user/1000/doc
      Output information may be incomplete.
Found 116 processes using old versions of upgraded files
(74 distinct programs)
(43 distinct packages)

Of these, 17 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:
accountsservice:
	968	/usr/libexec/accounts-daemon
avahi-daemon:
	973	/usr/sbin/avahi-daemon
	1013	/usr/sbin/avahi-daemon
network-manager:
	976	/usr/sbin/NetworkManager
irqbalance:
	982	/usr/sbin/irqbalance
networkd-dispatcher:
	995	/usr/bin/networkd-dispatcher
polkitd:
	996	/usr/libexec/polkitd
rsyslog:
	997	/usr/sbin/rsyslogd
udisks2:
	1005	/usr/libexec/udisks2/udisksd
modemmanager:
	1130	/usr/sbin/ModemManager
rtkit:
	1221	/usr/libexec/rtkit-daemon
upower:
	1274	/usr/libexec/upowerd
lightdm:
	1287	/usr/sbin/lightdm
kerneloops:
	1401	/usr/sbin/kerneloops
	1403	/usr/sbin/kerneloops
colord:
	1622	/usr/libexec/colord
packagekit:
	3491	/usr/libexec/packagekitd
cups-daemon:
	76907	/usr/sbin/cupsd
	77192	/usr/lib/cups/notifier/dbus
cups-browsed:
	76918	/usr/sbin/cups-browsed

These are the systemd services:
systemctl restart accounts-daemon.service
systemctl restart NetworkManager-wait-online.service
systemctl restart NetworkManager-dispatcher.service
systemctl restart nm-priv-helper.service
systemctl restart NetworkManager.service
systemctl restart networkd-dispatcher.service
systemctl restart polkit.service
systemctl restart dmesg.service
systemctl restart rsyslog.service
systemctl restart udisks2.service
systemctl restart ModemManager.service
systemctl restart rtkit-daemon.service
systemctl restart upower.service
systemctl restart colord.service
systemctl restart packagekit-offline-update.service
systemctl restart packagekit.service

These are the initd scripts:
service avahi-daemon restart
service irqbalance restart
service lightdm restart
service kerneloops restart
service cups restart
service cups-browsed restart

These processes (26) do not seem to have an associated init script to restart them:
xserver-xorg-core:
	1160	/usr/lib/xorg/Xorg
pipewire-bin:
	1424	/usr/bin/pipewire
	1425	/usr/bin/pipewire
wireplumber:
	1426	/usr/bin/wireplumber
cinnamon-session:
	1432	/usr/bin/cinnamon-session
fcitx5:
	1518	/usr/bin/fcitx5
at-spi2-core:
	1535	/usr/libexec/at-spi-bus-launcher
	1545	/usr/libexec/at-spi2-registryd
cinnamon-settings-daemon:
	1556	/usr/libexec/csd-background
	1558	/usr/libexec/csd-wacom
	1561	/usr/libexec/csd-screensaver-proxy
	1562	/usr/libexec/csd-color
	1564	/usr/libexec/csd-xsettings
	1572	/usr/libexec/csd-a11y-settings
	1575	/usr/libexec/csd-housekeeping
	1576	/usr/libexec/csd-power
	1580	/usr/libexec/csd-clipboard
	1583	/usr/libexec/csd-media-keys
	1586	/usr/libexec/csd-print-notifications
	1587	/usr/libexec/csd-automount
	1588	/usr/libexec/csd-keyboard
	1655	/usr/libexec/csd-printer
gvfs-daemons:
	1630	/usr/libexec/gvfs-udisks2-volume-monitor
	1804	/usr/libexec/gvfsd-metadata
gvfs-backends:
	1660	/usr/libexec/gvfs-gphoto2-volume-monitor
	1665	/usr/libexec/gvfs-mtp-volume-monitor
	2330	/usr/libexec/gvfsd-network
	2344	/usr/libexec/gvfsd-dnssd
	16382	/usr/libexec/gvfsd-http
gnome-online-accounts:
	1679	/usr/libexec/goa-daemon
	1686	/usr/libexec/goa-identity-service
libproxy1-plugin-gsettings:amd64:
	1694	/usr/lib/x86_64-linux-gnu/libproxy/0.4.17/pxgsettings
	1849	/usr/lib/x86_64-linux-gnu/libproxy/0.4.17/pxgsettings
	1907	/usr/lib/x86_64-linux-gnu/libproxy/0.4.17/pxgsettings
	2388	/usr/lib/x86_64-linux-gnu/libproxy/0.4.17/pxgsettings
python3.10-minimal:
	1701	/usr/bin/python3.10
	1760	/usr/bin/python3.10
	2131	/usr/bin/python3.10
	2204	/usr/bin/python3.10
cinnamon:
	1704	/usr/bin/cinnamon
libxapp1:amd64:
	1734	/usr/libexec/xapps/sn-watcher/xapp-sn-watcher
evolution-data-server:
	1747	/usr/libexec/evolution-data-server/evolution-alarm-notify
	1792	/usr/libexec/evolution-source-registry
	1814	/usr/libexec/evolution-calendar-factory
	1871	/usr/libexec/evolution-addressbook-factory
policykit-1-gnome:
	1753	/usr/lib/policykit-1-gnome/polkit-gnome-authentication-agent-1
nemo:
	1755	/usr/bin/nemo-desktop
network-manager-gnome:
	1756	/usr/bin/nm-applet
gnome-terminal:
	2010	/usr/libexec/gnome-terminal-server
system-config-printer:
	2071	/usr/share/system-config-printer/applet.py
sticky:
	2072	/usr/lib/sticky/sticky.py
xdg-desktop-portal:
	2363	/usr/libexec/xdg-desktop-portal
	2367	/usr/libexec/xdg-document-portal
transmission-gtk:
	69206	/usr/bin/transmission-gtk
xdg-dbus-proxy:
	77229	/usr/bin/xdg-dbus-proxy
	99076	/usr/bin/xdg-dbus-proxy
firefox:
	77883	/usr/lib/firefox/firefox-bin
	77975	/usr/lib/firefox/firefox-bin
	78020	/usr/lib/firefox/firefox-bin
	78162	/usr/lib/firefox/firefox-bin
	78448	/usr/lib/firefox/firefox-bin
	78484	/usr/lib/firefox/firefox-bin
	78526	/usr/lib/firefox/firefox-bin
	78652	/usr/lib/firefox/firefox-bin
	78654	/usr/lib/firefox/firefox-bin
	95927	/usr/lib/firefox/firefox-bin
	97673	/usr/lib/firefox/firefox-bin
	97716	/usr/lib/firefox/firefox-bin
	105366	/usr/lib/firefox/firefox-bin
	106405	/usr/lib/firefox/firefox-bin
	110796	/usr/lib/firefox/firefox-bin
	112120	/usr/lib/firefox/firefox-bin
	114249	/usr/lib/firefox/firefox-bin
	114543	/usr/lib/firefox/firefox-bin
	115854	/usr/lib/firefox/firefox-bin
	115909	/usr/lib/firefox/firefox-bin
	116034	/usr/lib/firefox/firefox-bin
	116037	/usr/lib/firefox/firefox-bin
	116088	/usr/lib/firefox/firefox-bin
	116193	/usr/lib/firefox/firefox-bin
xdg-desktop-portal-gtk:
	100091	/usr/libexec/xdg-desktop-portal-gtk

思っていたのよりもかなりたくさんのプロセスを再起動しなければならないことが判明しました。サーバー用途で使っていてどうしても再起動が難しい場合は仕方ないとしても、デスクトップ Linux であれば素直に PC を再起動した方が速いですね。

というわけで、systemd 自体のアップデートをした時は PC を再起動するのが手っ取り早い、という知見を得ました。