systemd: Linuxシステム起動・管理


前提


ドキュメント


initの廃止

initの欠点

たいていのLinuxがsystemdに移行

CentOS7では、/sbin/init/lib/systemd/systemdへリンク


12種類のユニット

各ユニットは名前.タイプで識別し、コマンドではserviceだけは.serviceを省略できる。


ユニットファイルの場所


ユニットの一覧(起動状態): systemctl list-units

起動中か否か(active/inactive)のユニット一覧。

# serviceの一覧
systemctl list-units --all --type service
UNIT                  LOAD      ACTIVE   SUB     DESCRIPTION
abrt-ccpp.service     loaded    active   exited  Install ABRT coredump hook
abrt-vmcore.service   loaded    inactive dead    Harvest vmcores for ABRT

ユニットファイルの一覧(有効/無効状況): systemctl list-unit-files

ユニットファイルが有効か(自動起動か)どうか(enabled/disabled)の一覧。

systemctl list-unit-files --type service
UNIT FILE                                     STATE   
abrt-ccpp.service                             enabled 
abrt-pstoreoops.service                       disabled
anaconda.service                              static

static[Install]セクションがないもの。


systemctlのサブコマンド


ユニットファイル: セクションとディレクティブ

# コメント
[セクション]
ディレクティブ=
ディレクティブ=

[セクション]
ディレクティブ=

graphical.targetの例

[Unit]
Description=Graphical Interface
Documentation=man:systemd.special(7)
Requires=multi-user.target
Wants=display-manager.service
Conflicts=rescue.service rescue.target
After=multi-user.target rescue.service rescue.target display-manager.service
AllowIsolate=yes

multi-user.targetの例

[Unit]
Description=Multi-User System
Documentation=man:systemd.special(7)
Requires=basic.target
Conflicts=rescue.service rescue.target
After=basic.target rescue.service rescue.target
AllowIsolate=yes

targetユニット: 複数のユニットをまとめる役割のユニット

# targetユニットファイルのリスト
systemctl list-unit-files --type target

default.target

システムブートでsystemdが呼び出すデフォルトのtarget。

targetの起動順序

各ユニットファイルのAfter=のディレクティブで、先に起動するtargetの指定があり、起動順序が決まる。


ユニットの依存関係一覧: systemctl list-dependencies

systemctl list-dependencies
default.target
(中略)
● └─multi-user.target
(中略)
●   ├─basic.target
(中略)
●   │ ├─sysinit.target
(中略)
●   │ │ ├─local-fs.target
●   │ │ │ ├─-.mount
●   │ │ │ ├─boot.mount

serviceをtargetに含める

targetがserviceに依存する

設定方法

パッケージの多くは後者のやり方。


[Unit]セクション

リスト項目は、スペース区切り。

依存関係

代わりに、依存ユニット側の[Install]セクション(+systemctl enable)による方法がある。

順序関係

依存とは独立に順序関係のディレクティブがあり、依存定義だけなら並列処理。

双方のユニットを停止するとき、その順番は起動と逆になる。


[Install]セクション

他のユニットから依存される側のユニットファイルで使う。

systemctl enableで自動起動になる仕組み

例: firewalld.serviceのユニットファイル

# 抜粋
[Install]
WantedBy=multi-user.target

[Service]セクション


[Install]セクションのないサービス

作成例: /etc/systemd/system/sleep60.service

[Unit]
Description=Sleep60サービス
[Service]
ExecStart=/usr/bin/sleep 60m

[Install]セクションのあるサービス

前例のsleep60.serviceに依存するサービスを作る例。

作成例: /etc/systemd/system/sleep30.service

[Unit]
Description=Sleep30サービス
# sleep60サービスが成功してから、これを起動
Requires=sleep60.service
After=sleep60.service

[Service]
ExecStart=/usr/bin/sleep 30m

[Install]
WantedBy=multi-user.target

systemctl enableで自動起動になる

systemctl enable sleep30
Created symlink from /etc/systemd/system/multi-user.target.wants/sleep30.service to /etc/systemd/system/sleep30.service.

systemctl status sleep30
● sleep30.service - Sleep30サービス
   Loaded: loaded (/etc/systemd/system/sleep30.service; enabled; vendor preset: disabled)
   Active: inactive (dead)

手動で起動する場合: systemctl start

systemctl start sleep30

# 確認
systemctl status sleep30 sleep60