systemd: Wie wartet man auf ein zur Laufzeit dynamisch bereitgestelltes Netzwerkgerät?

systemd: Wie wartet man auf ein zur Laufzeit dynamisch bereitgestelltes Netzwerkgerät?

Wir haben einen Server (Hypervisor), der viele virtuelle Maschinen hostet, die von libvirt gesteuert werden. libvirt stellt ein virtuelles Netzwerk für die Kommunikation zwischen den virtuellen Maschinen und dem Hypervisor bereit. Dieses virtuelle Netzwerk wird zur Laufzeit von eingerichtet libvirtd.serviceund aufgerufen sys-devices-virtual-net-virbr1.device.

Einige auf dem Hypervisor ausgeführte Dienste sollten an dieses virtuelle Netzwerk gebunden sein, beispielsweise IMAP, Datenbank usw.

Das Problem, mit dem wir konfrontiert sind, besteht darin, dass die auf dem Hypervisor laufenden Dienste von systemd gestartet werden, bevor das virtuelle Netzwerk eingerichtet ist, und daher der Start der Dienste fehlschlägt. Die aktuelle Startreihenfolge wird in diesem Diagramm angezeigt:

Diagramm zur Startreihenfolge von systemd

Für solche Fälle gibt es systemd-Direktiven, wie

  • After=
  • Required=
  • Wants=

und so weiter. Aber in meinem Fall helfen sie nicht. Soweit ich verstanden habe, liegt der Grund dafür darin, dass die dynamisch zur Laufzeit sys-devices-virtual-net-virbr1.deviceerstellt wird libvirtd.serviceund systemd beim Systemstart nicht bekannt ist. Die Abhängigkeit kann also beim Start von systemd nicht aufgelöst werden, da die sys-devices-virtual-net-virbr1.deviceNetzwerkschnittstelle nicht bekannt ist.

Bietet systemd Techniken zur Lösung solcher Probleme?

Jeder Hinweis ist willkommen. Danke.

Antwort1

Sie können eine Serviceeinheit als abhängig von einer Geräteeinheit konfigurieren, auch wenn diese Geräteeinheit nicht explizit in einer anderen Einheit definiert ist (z. B. wenn sie von udev stammt).

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

Wie Sie in man systemd.unit sehen können

BindsTo=

 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

verwandte Informationen