systemdネットワーク構成の依存関係
systemdのユニットの順序に影響を与えることは非常に簡単です。一方、完成したユニットが保証するものに注意する必要があります。
サービスを構成する
現在のシステムでは、注文後network.target
にネットワークサービスが開始されていることを保証するだけで、実際の構成が存在することは保証されません。あなたはnetwork-online.target
それを達成するために後で注文し、それを引っ張る必要があります。
[Unit]
Wants=network-online.target
After=network-online.target
古いシステムとの互換性のために、network.targetの後にも注文する必要があるかもしれません。
[Unit]
Wants=network-online.target
After=network.target network-online.target
これは、サービスのユニットファイルとsystemdの場合です。
ソフトウェアの現在のバージョンでの実装
次に、それがnetwork-online.target
期待どおりに動作すること(または少なくともを使用できることnetwork.target
)を確認する必要があります。
NetworkManagerの現在のバージョンは、サービスNetworkManager-wait-online.service
によってnetwork-online.target
、したがってサービスによって取得されるものを提供します。この特別なサービスにより、開始するように構成されたすべての接続が自動的に成功、失敗、またはタイムアウトするまで、サービスが待機します。
systemd-networkdの現在のバージョンは、すべてのデバイスが要求どおりに構成されるまでサービスをブロックします。現在は、ブート時に適用される構成(より具体的には `systemd-networkd.serviceの起動時)のみをサポートするという点で簡単です。
完全を期すために/etc/init.d/network
、Fedora のサービスは、systemdの現在のバージョンで解釈されるnetwork.target
ようにnetwork-online.target
、サービスをブロックし、間接的にブロックします。これは、スクリプトベースの実装の例です。
デーモンベースまたはスクリプトベースの実装が上記のネットワーク管理サービスの1つとして動作する場合、ネットワーク構成が正常に完了するか、正当な理由で失敗するか、妥当な時間後にタイムアウトするまで、サービスの開始を遅らせます完了するフレーム。
netctlが同じように機能するかどうか、またこの情報がこの回答に追加される価値があるかどうかを確認することができます。
古いバージョンのソフトウェアでの実装
systemdの十分に古いバージョンでは、これがうまく機能しないのではないでしょうか。しかし、少なくともnetwork-online.target
存在することと、それが後に注文されることを確認できますnetwork.target
。
以前は、NetworkManagerは少なくとも1つの接続が適用されることのみを保証していました。そして、それが機能するためには、NetworkManager-wait-online.service
明示的に有効にする必要があります。これはFedoraで長い間修正されてきましたが、最近になってアップストリームに適用されました。
systemctl enable NetworkManager-wait-online.service
network.targetおよびnetwork-online.targetの実装に関する注意
ソフトウェアを他の特定のサービスに依存させNetworkManager.service
たりNetworkManager-wait-online.service
、他の特定のサービスに依存させたりする必要はありません。代わりに、すべてのネットワーク管理サービスは、前network.target
にオプションで自分自身を注文する必要がありますnetwork-online.target
。
単純なスクリプトベースのネットワーク管理サービスは、終了する前にネットワーク構成を終了し、前にnetwork.target
、したがって間接的に前に自身を順序付けする必要がありnetwork-online.target
ます。
[Unit]
Before=network.target
[Service]
Type=oneshot
ExecStart=...
RemainAfterExit=yes
デーモンベースのネットワーク管理サービスは、network.target
あまり有用ではありませんが、事前に注文する必要があります。
[Unit]
Before=network.target
[Service]
Type=simple
ExecStart=...
デーモンが終了するのを待つサービスは、特定のサービスの後、前に自分自身を注文する必要がありますnetwork-online.target
。Requisite
それぞれのネットワーク管理サービスが使用されていない場合にすぐに失敗するように、デーモンサービスで使用する必要があります。
[Unit]
Requisite=...
After=...
Before=network-online.target
[Service]
Type=oneshot
ExecStart=...
RemainAfterExit=yes
パッケージは、設定されたネットワークを待機するサービスによって取得されるように、wants
ディレクトリ内の待機中のサービスへのシンボリックリンクをインストールするnetwork-online.target
必要があります。
ln -s /usr/lib/systemd/system/... /usr/lib/systemd/system/network-online.target.wants/
関連資料
最終ノート
あなたが質問したときにあなたの質問に答えるだけでなく、アップストリームおよびLinuxディストリビューションの状況を改善することに貢献したことを願っています。 。