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を待機させるだけであり、実際にはそれを機能させる必要があります。
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/
ほとんどの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はそれが起動するのを待つことができます。
以前は特にsystemd-networkd
を使用したことがありませんが、systemd
はsystemd-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
オプションが含まれていますか?