システムネットワーク構成の依存関係について

システムネットワーク構成の依存関係について

私はsystemdに初めて触れ、そのアーキテクチャを学んでいます。

次に、カスタムシェルスクリプトを実行する方法を理解しようとしています。このスクリプトを実行する必要があります。後ろにネットワーク層が開始されました。

私はsystemdとnetctlを使ってArchを実行しています。

テストのためip addr list > /tmp/ip.txt

(/etc/systemd/system/test.service)
[Unit]
Description=test service

[Service]
ExecStart=/root/test.script

[Install]
WantedBy=multi-user.target

その後、スクリプトを有効にしました。

systemctl enable test

再起動後にスクリプトが実行されますが、ネットワークが動作する前に実行されます。つまり、出力にはip.txtプライマリインターフェイスに割り当てられたIPv4アドレスがないと表示されます。ログインすると、実際にIPv4アドレスが割り当てられ、ネットワークが機能します。

パラメータを操作してスクリプトが実行される場所を変更できるようですが、WantedBy方法がわかりません。

誰もが正しい方向に私を指すことができますか?

ベストアンサー1

システムネットワーク構成の依存関係について

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

これはあなたのサービスとシステムの単位ファイルです。

現在のバージョンのソフトウェアの実装

これで、期待どおりに機能していることを確認する必要がありますnetwork-online.target(または少なくとも利用可能ですnetwork.target)。

現在のバージョンネットワーク管理者あなたのサービスに興味を持ってNetworkManager-wait-online.serviceいる何かを提供してください。network-online.targetこの特別なサービスは、自動的に開始するように設定されたすべての接続が成功、失敗、またはタイムアウトするまでサービスが待機することを保証します。

現在のバージョンシステムネットワークすべてのデバイスが必要に応じて設定されるまで、サービスをブロックします。現時点では、起動時に適用される設定(より具体的には「systemd-networkd.serviceの開始時間」)のみをサポートしているため、簡単です。

完全性のために、/etc/init.d/networkFedoraのサービス(現在のsystemdとして解釈されている)はブロックし、間接network.target的にnetwork-online.targetサービスをブロックします。これはスクリプトベースの実装の例です。

実装(デーモンベースでもスクリプトベースでも)が上記のネットワーク管理サービスの1つとして機能している場合、ネットワーク構成が正常に完了するか、合理的な理由で失敗するか、タイムアウトフレームが経過するまでサービスの開始が遅れます。完了するのに適した時間がかかります。

次の点を確認したい場合があります。ネットワーク制御同じ方法で作業すると、この情報はこの回答に貴重な追加情報になります。

以前のバージョンのソフトウェアで実装

私はそれがうまく動作するのに十分な古いバージョンのsystemdを見ることができないと思います。ただし、少なくともnetwork-online.target存在するか、後でソートされるかを確認できますnetwork.target

前にネットワーク管理者少なくとも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.targetRequisiteそのネットワーク管理サービスを使用していない場合は、すぐに失敗するようにデーモンサービスで使用する必要があります。

[Unit]
Requisite=...
After=...
Before=network-online.target

[Service]
Type=oneshot
ExecStart=...
RemainAfterExit=yes

wantsnetwork-online.targetパッケージは、ネットワークが構成されるのを待つサービスからプルできるように、ディレクトリに待機しているサービスへのシンボリックリンクをインストールする必要があります。

ln -s /usr/lib/systemd/system/... /usr/lib/systemd/system/network-online.target.wants/

関連文書

最終メモ

私はあなたが質問したときにあなたの質問に答えるのを助けただけでなく、アップストリームとLinuxディストリビューションの状況を改善し、元の質問を書いたときよりも今より良い答えを提供できることを願っています。

おすすめ記事