web-dev-qa-db-ja.com

systemd-networkdでnetwork.targetにDHCPを強制的に待機させる方法は?

Systemd-networkdを使用してインターフェイスを構成しています:

[Match]
Name=enp3s0

[Network]
DHCP=v4 

起動時に一部のサービスがDHCPの完了を待機していないことを除いて、これは非常にうまく機能します。たとえば、NFSマウントされたディレクトリとnginxは、起動時にネットワークがないために失敗します。

Network.targetにDHCPを待機させる方法はありますか?


エディターからのメモ。 ドキュメント によると:

多くのネットワーク管理ソリューションは、無条件にnetwork-online.targetを取り込む方法を提供し、それによりnetwork.targetの効果をnetwork-online.targetの効果にアップグレードします。

Systemd-networkdを使用する場合は、systemd-networkd-wait-online.serviceを有効にすることでこれを行うことができます。

systemctl enable systemd-networkd-wait-online.service

しかし、私はこれを試しましたdid notnetwork.targetに応じてサービスをDHCPに待機させました。明示的にnetwork-online.targetに依存するサービスをDHCPを待機させるだけであり、実際にはそれを機能させる必要があります。

6
Baptiste Wicht

Systemd-networkdを使用する場合、すべてのインターフェースが起動していて、IPアドレスが割り当てられていることを確認するには、次のようにします。

systemctl enable systemd-networkd-wait-online.service

他の誰かがNetworkManagerを使用している可能性があります。その場合、次のようになります。

systemctl enable NetworkManager-wait-online.service

参照: http://www.freedesktop.org/wiki/Software/systemd/NetworkTarget/

3
SAM

ほとんどのLinuxバリアントはsystemdでNetwork Managerを使用し、NetworkManager-wait-online.serviceを使用してネットワークが稼働しているかどうかを判断します。この場合は、/lib/systemd/system/NetworkManager-wait-online.serviceを編集して変更できます。

ExecStart=/usr/bin/nm-online -s -q --timeout=30

に:

ExecStart=/usr/bin/nm-online -q --timeout=30

-sオプションは、具体的にはネットワーク接続を待つのではなく、NetworkManagerの起動が完了するのを待ちます。

これを削除すると、ネットワークステータスがより適切に示され、依存するサービスを開始する前に、systemdはそれが起動するのを待つことができます。

1
corky

以前は特にsystemd-networkdを使用したことがありませんが、systemdsystemd-networkdが使用するsystemdサービスファイルを調整することで間違いなく解決できるはずです。

サービスファイルの検索

実行すると:

systemctl status systemd-networkd

次のような出力が得られるはずです(systemd-modules-load.serviceがないため、例としてsystemd-networkdを使用しています)。

systemd-modules-load.service - Load Kernel Modules
Loaded: loaded (/usr/lib/systemd/system/systemd-modules-load.service; static)
Active: failed (Result: exit-code) since So 2013-08-25 11:48:13 CEST; 32s ago
 Docs: man:systemd-modules-load.service(8).
       man:modules-load.d(5)
Process: 15630 ExecStart=/usr/lib/systemd/systemd-modules-load (code=exited, status=1/FAILURE)

2行目は、サービスファイルの場所を示します(例では/usr/lib/systemd/system/systemd-modules-load.service)。サービスファイルは、systemd階層でいつ開始するかを決定します。

サービスファイルの変更

このファイルをテキストエディタで開くと、3つの非常に重要なセクションがあります。

  • [Unit]

  • [Service]

  • [Install]

[Unit]セクションには、AfterおよびRequiresディレクティブを含めることができます。 Afterは、サービスを別のsystemdユニットの後に強制的に開始します。Requiresは、別のsystemdユニットがまだ有効になっていない場合は強制的に開始します(ただし強制はしません)注文)。

したがって、systemd-networkdサービスファイルが見つかった場合は、systemd-networkdの後に開始するユニットを決定し、設定する必要がある[Unit]セクションに追加します。

[Unit]
...
Requires=[unit name]
After=[unit name]

このメソッドを使用すると、他のユニットの後にsystemd-networkdサービスを強制的に開始できます。

その他の懸念

/etc/fstab経由でマウントしている場合、ネットワークマウントが失敗すると言いますが、それらのエントリには_netdevオプションが含まれていますか?

0
Centimane