systemdではユニット
ところで,
- ※1
- System V系initのようにサービスだけをsystemdが扱うのであれば
「起動順序」 が適切なのですが, systemdのユニットには .mount
(マウントポイントのユニット) や .target
といった「起動」 という用語がふさわしくないユニットがあります。そのため, やや変わった言い回しではありますが, 「アクティベート順序」 という言葉を使うことにしました。
今回は,
ユニットの設定ファイルを特定する
それでは実際のユニット設定ファイルを眺めていきましょう。今回,systemd-resolved.
です
- ※2
- Ubuntu 18.
04 LTS デスクトップ版に入っていて, 今回紹介したい設定を比較的取り揃えていることの2点が systemd-resolved.
を選んだ理由です。service
systemct cat
コマンドを使用すると,
$ systemctl cat systemd-resolved.service
すると,/lib/
とその中身が表示されます。すべてを載せると量が多いため,
# /lib/systemd/system/systemd-resolved.service
(中略)
[Unit]
Description=Network Name Resolution
(中略)
DefaultDependencies=no
After=systemd-sysusers.service systemd-networkd.service
Before=network.target nss-lookup.target shutdown.target
Conflicts=shutdown.target
Wants=nss-lookup.target
(中略)
[Install]
WantedBy=multi-user.target
(後略)
アクティベート順序
ユニットのアクティベート順序は,After=
とBefore=
で設定されます。これらのディレクティブはスペース区切りをすることで,
systemd-resolved.
でのアクティベート順序を見ていきます。After=
の設定に従い,systemd-sysusers.
またはsystemd-networkd.
,systemd-resolved.
は,Before=
では同様に,network.
,nss-lookup.
,shutdown.
の3つは,systemd-resolved.
がアクティブになるのを待ってアクティベートを開始します。複数のユニットが同時に非アクティブ化される際は、逆の順序で実施されます。つまり,After=
で指定されたユニット,Before=
で指定されたユニットの順に非アクティブ化されます。
ここでAfter=
もBefore=
もユニットのアクティベートの順序を示すだけで,
- ※3
- もっとも,
System V系initでも, LSB (Linux Standard Base) に則って, サービスのrcスクリプト上で依存関係を表現し, insservがそれを使って依存関係が満たされるようにサービスの起動順序をコントロールするといった仕組みがありました。
「同時にアクティベートされる場合において」After=
やBefore=
の設定に関係なく,