systemd入門

Unit

Unitには以下の11種類があります。各Unitを定義したファイルの拡張子がタイプを表しています。下表の区別の他、Unitにはsystemとuserの区別があります。

タイプ名説明
serviceサービス
deviceデバイス
mountマウント
automountオートマウント
swapスワップ
pathファイル監視
socketsocketやdbusの待ち受け
timerタイマー
scopeLinux Control Groupの管理
sliceLinux Control Groupの管理
target依存関係の整理
表1

現在systemdが扱っているUnitの一覧を調べるには以下のコマンドを実行します。1行に1Unitの情報を表示します。各行にLOAD(メモリ上に読んでいるか), ACTIVE(unitの状態), SUB(サブ状態), DESCRIPTION(説明) を表示します。

$ systemctl list-units -a

unitの詳細を調べる場合は、以下のコマンドを実行します。人間が見やすいのがstatusサブコマンドで、より詳細を調べたいときや機械処理したいときにshowサブコマンドを使います。

$ systemctl status unit名
$ systemctl show unit名

unit file

配置場所

大きく以下の3箇所に配置されるそうです。私の環境(Linux x220 5.4.0-91-generic #102-Ubuntu SMP Fri Nov 5 16:31:28 UTC 2021 x86_64 x86_64 x86_64 GNU/Linux; ※Linux Mintです)でも以下に設定ファイルやunit fileがありました。

  • /lib/systemd/配下
    パッケージに含まれるunit fileを配置する
  • /run/systemd/配下
    再起動すると消えるが今だけ利用するものを配置する
  • /etc/systemd/配下
    管理者が作成したunit fileを配置する

unit fileの中身

Software designの記事では、RHELのhttpd.serviceを取り上げていますが、httpdをインストールしていないので、NeworkManager.serviceを見てみました。

$ cat /lib/systemd/system/NetworkManager.service 
[Unit]
Description=Network Manager
Documentation=man:NetworkManager(8)
Wants=network.target
After=network-pre.target dbus.service
Before=network.target 

[Service]
Type=dbus
BusName=org.freedesktop.NetworkManager
ExecReload=/usr/bin/busctl call org.freedesktop.NetworkManager /org/freedesktop/NetworkManager org.freedesktop.NetworkManager Reload u 0
#ExecReload=/bin/kill -HUP $MAINPID
ExecStart=/usr/sbin/NetworkManager --no-daemon
Restart=on-failure
# NM doesn't want systemd to kill its children for it
KillMode=process
CapabilityBoundingSet=CAP_NET_ADMIN CAP_DAC_OVERRIDE CAP_NET_RAW CAP_NET_BIND_SERVICE CAP_SETGID CAP_SETUID CAP_SYS_MODULE CAP_AUDIT_WRITE CAP_KILL CAP_SYS_CHROOT

ProtectSystem=true
ProtectHome=read-only

[Install]
WantedBy=multi-user.target
Also=NetworkManager-dispatcher.service

# We want to enable NetworkManager-wait-online.service whenever this service
# is enabled. NetworkManager-wait-online.service has
# WantedBy=network-online.target, so enabling it only has an effect if
# network-online.target itself is enabled or pulled in by some other unit.
Also=NetworkManager-wait-online.service