libvirt によって制御される多数の仮想マシンをホストするサーバー (ハイパーバイザー) があります。libvirt は、仮想マシンとハイパーバイザー間の通信用の仮想ネットワークを提供します。この仮想ネットワークは、実行時に によって確立され、libvirtd.service
と呼ばれますsys-devices-virtual-net-virbr1.device
。
ハイパーバイザー上で実行されるいくつかのサービス (IMAP、データベースなど) は、その仮想ネットワークにバインドする必要があります。
私たちが直面している問題は、ハイパーバイザー上で実行されているサービスが、仮想ネットワークがセットアップされる前に 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