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.service
und 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.device
erstellt wird libvirtd.service
und 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.device
Netzwerkschnittstelle 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