systemd: 実行時に動的に提供されるネットワーク デバイスを待機するにはどうすればよいですか?

systemd: 実行時に動的に提供されるネットワーク デバイスを待機するにはどうすればよいですか?

libvirt によって制御される多数の仮想マシンをホストするサーバー (ハイパーバイザー) があります。libvirt は、仮想マシンとハイパーバイザー間の通信用の仮想ネットワークを提供します。この仮想ネットワークは、実行時に によって確立され、libvirtd.serviceと呼ばれますsys-devices-virtual-net-virbr1.device

ハイパーバイザー上で実行されるいくつかのサービス (IMAP、データベースなど) は、その仮想ネットワークにバインドする必要があります。

私たちが直面している問題は、ハイパーバイザー上で実行されているサービスが、仮想ネットワークがセットアップされる前に systemd によって起動され、サービスの起動が失敗するという点です。現在の起動順序は次のグラフに示されています。

systemd 起動順序グラフ

このような場合には、systemdのディレクティブがあります。

  • After=
  • Required=
  • Wants=

などなど。しかし、私のケースでは役に立ちません。私が理解している限りでは、これは実行時に動的にsys-devices-virtual-net-virbr1.device作成され、システム起動時に systemd に認識されないことが原因です。したがって、ネットワーク インターフェイスが不明であるlibvirtd.serviceため、起動時に systemd によって依存関係を解決できません。sys-devices-virtual-net-virbr1.device

systemd はこのような問題を解決する技術を提供していますか?

ヒントがあればありがたいです。ありがとうございます。

答え1

デバイス ユニットが別のユニットで明示的に定義されていない場合でも (たとえば、udev からのものである場合)、サービス ユニットをデバイス ユニットに依存するように構成できます。

[Unit]
BindsTo=sys-devices-virtual-net-virbr1.device
After=sys-devices-virtual-net-virbr1.device

man systemd.unitでわかるように

バインド先=

 Configures requirement dependencies, very similar in style to
 Requires=. However, this dependency type is stronger: in addition 
 to the effect of Requires= it declares that if the unit bound to 
 is stopped, this unit will be stopped too. 
 When used in conjunction with After= on the same unit the 
 behaviour of BindsTo= is even stronger. In this case, the unit
 bound to strictly has to be in active state for this unit to also 
 be in active state

関連情報