systemdではユニット
ところで、
今回は、
ユニットの設定ファイルを特定する
それでは実際のユニット設定ファイルを眺めていきましょう。今回、systemd-resolved.です
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=もユニットのアクティベートの順序を示すだけで、
「同時にアクティベートされる場合において」After=やBefore=の設定に関係なく、
依存関係
次に、systemd-resolved.でも、
なお、
Wants=とWantedBy=
Wants=を見てください。Wants=では対象としてnss-lookup.が設定されています。これはsystemd-resolved.がアクティベートされるときに、
また、[Install]セクションではWantedBy=multi-user.と指定されています。これはmulti-user.がアクティベートされるときに、systemd-resolved.もアクティベートされてほしいということを表現しています。
ここで
つまり、Wants=だと、nss-lookup.)systemd-resolved.)
WantedBy=でも同じです。当該ユニットsystemd-resolved.)multi-user.)
Requires=とRequiredBy=
あいにく、systemd-resolved.にはありませんが、Wants=やWantedBy=よりも強力な依存関係に、Requires=とRequiredBy=があります。Requires=で指定したユニットもアクティベートがトリガーされますが、Wants=とは異なり、
RequiredBy=はRequires=を受動態としたものです。A.の設定でRequiredBy=B.となっている場合にB.がアクティベートされると、A.もアクティベートされます。この場合もA.のアクティベートが失敗すると、RequiredBy=で指定されたB.のアクティベートは失敗します。
これらの依存関係を設定するディレクティブと、A.はB.を必要としておりRequires=B.)、After=B.)」という指示を表現できます
WantedBy=とRequiredBy=を指定した場合のシンボリックリンク
A.でWantedBy=B.やRequiredBy=B.といった形でB.が指定されている場合にA.をsystemctl enableコマンドなどで有効化すると、/etc/以下のB.」B.」WantsやRequiresとして理解されるわけです。
systemd-resolved.ではWantedBy=multi-user.となっていますので、/etc/にシンボリックリンクがあることが確認できます。
$ readlink /etc/systemd/system/multi-user.target.wants/systemd-resolved.service /lib/systemd/system/systemd-resolved.service
Conflicts=
systemd-resolved.にはConflicts=の指定があります。これは一風変わった依存関係で、Conflicts=で指定されたユニットか、
systemd-resolved.ではConflicts=shutdown.となっています。よって、systemd-resolved.がアクティブならshutdown.は非アクティブ、
shutdown.がアクティブになるときは、systemd-resolved.も停止へ向かうと考えればさほど違和感なく理解できるはずです。
アクティベート順序・依存関係を見る
systemd-analyzeコマンドを使用することで、systemctl list-dependenciesコマンドを利用することで、
アクティベート順序を見る
systemd-analyzeコマンドを使って、systemd-resolved.と関連ユニットのアクティベート順序を見てみます。
手順としては簡単で以下のコマンドを実行し、
$ systemd-analyze plot > systemd-analyze.svg
このSVGファイルをブラウザで開けば、
次の図は、
さて、systemd-resolved.のアクティベート順序で注目すべきはAfter=systemd-sysusers.とBefore=network.でした。
今回はアクティベート順序を機能させるため、After=で指定されているsystemd-networkd.を有効にしています。これは通常のデスクトップ版では、
図ではsystemd-networkd.の濃い赤色で示されるActivatingのバーが終わったタイミングで、systemd-resolved.のバーが始まっていることを確認できます。
一方、Before=については、systemd-resolved.がActiveとなった後から、nss-lookup.とnetwork.のバーが始まっていることを確認できます。特にnss-lookup.は、systemd-resolved.の赤いActivatingの部分が終わったタイミングでバーが始まっています。
依存関係を見る
最後に、
$ systemctl list-dependencies
systemd-resolved.に注目し、
default.target (中略) ● └─multi-user.target ● ├─systemd-resolved.service (後略)
「おや、Wants=nss-lookup.はどこへ?」--allをつけてみてください-all付きは再帰的に実行されるため出力結果が多くなってしまいますが、systemd-resolved.にしぼると次のようなツリーとなっているのがわかります。
$ systemctl list-dependencies systemd-resolved.service --all systemd-resolved.service ● ├─-.mount ● │ └─system.slice ● │ └─-.slice ● ├─system.slice ● │ └─-.slice ● └─nss-lookup.target
アクティベート順序や依存関係については、