Abhängigkeiten der System-Netzwerkkonfiguration
Es ist sehr einfach, die Einheitenbestellung von systemd zu beeinflussen. Andererseits müssen Sie vorsichtig sein, was eine fertige Einheit garantiert.
Konfigurieren Sie Ihren Dienst
Bei aktuellen Systemen network.target
garantiert die Bestellung nach nur, dass der Netzwerkdienst gestartet wurde, nicht, dass eine tatsächliche Konfiguration vorliegt. Sie müssen danach bestellen network-online.target
und es hineinziehen, um das zu erreichen.
[Unit]
Wants=network-online.target
After=network-online.target
Für die Kompatibilität mit älteren Systemen müssen Sie möglicherweise auch nach network.target bestellen.
[Unit]
Wants=network-online.target
After=network.target network-online.target
Das ist für die Unit-Datei Ihres Dienstes und für systemd.
Implementierung in aktuelle Softwareversionen
Jetzt müssen Sie sicherstellen, dass dies network-online.target
wie erwartet funktioniert (oder zumindest verwendet werden kann network.target
).
Die aktuelle Version von NetworkManager bietet das, NetworkManager-wait-online.service
was von network-online.target
und damit von Ihrem Dienst abgerufen wird. Dieser spezielle Dienst stellt sicher, dass Ihr Dienst wartet, bis alle Verbindungen, die für den automatischen Start konfiguriert sind, erfolgreich sind, fehlschlagen oder eine Zeitüberschreitung aufweisen.
Die aktuelle Version von systemd-networkd blockiert Ihren Dienst, bis alle Geräte wie angefordert konfiguriert sind. Es ist einfacher, da derzeit nur Konfigurationen unterstützt werden, die beim Booten angewendet werden (genauer gesagt die Startzeit von `systemd-networkd.service).
Der Vollständigkeit halber /etc/init.d/network
blockiert der Dienst in Fedora, wie von den aktuellen Versionen von systemd interpretiert, network.target
und damit indirekt auch network-online.target
Ihren Dienst. Es ist ein Beispiel für eine Skript-basierte Implementierung.
Wenn sich Ihre Implementierung, ob daemon- oder skriptbasiert, als einer der oben genannten Netzwerkverwaltungsdienste verhält, verzögert sie den Start Ihres Dienstes, bis die Netzwerkkonfiguration entweder erfolgreich abgeschlossen wurde, aus gutem Grund fehlgeschlagen ist oder nach einer angemessenen Zeit abgelaufen ist Rahmen zu vervollständigen.
Möglicherweise möchten Sie überprüfen, ob netctl auf die gleiche Weise funktioniert, und diese Informationen sind eine wertvolle Ergänzung zu dieser Antwort.
Implementierungen in älteren Softwareversionen
Ich glaube nicht, dass Sie eine ausreichend alte Version von systemd sehen werden, bei der dies nicht gut funktioniert. Aber Sie können prüfen, ob zumindest network-online.target
existiert und dass es nach geordnet wird network.target
.
Bisher garantierte NetworkManager nur, dass mindestens eine Verbindung angewendet wurde. Und selbst damit das funktioniert, müsste man das NetworkManager-wait-online.service
explizit aktivieren . Dies wurde in Fedora schon lange behoben, aber erst kürzlich im Upstream angewendet.
systemctl enable NetworkManager-wait-online.service
Hinweise zur Implementierung von network.target und network-online.target
Sie sollten nicht immer Ihre Software hängen von vornehmen müssen NetworkManager.service
oder NetworkManager-wait-online.service
noch andere spezifische Dienstleistungen. Stattdessen sollten sich alle Netzwerkverwaltungsdienste vor network.target
und optional selbst bestellen network-online.target
.
Ein einfacher skriptbasierter Netzwerkverwaltungsdienst sollte die Netzwerkkonfiguration vor dem Beenden abschließen und sich vor network.target
und damit indirekt vor dem Beenden selbst anordnen network-online.target
.
[Unit]
Before=network.target
[Service]
Type=oneshot
ExecStart=...
RemainAfterExit=yes
Ein Daemon-basierter Netzwerkverwaltungsdienst sollte sich ebenfalls vorher network.target
selbst bestellen, auch wenn dies nicht sehr nützlich ist.
[Unit]
Before=network.target
[Service]
Type=simple
ExecStart=...
Ein Dienst, der für die Daemon wartet beenden sollte sich nach dem Dienst bestellen und vor network-online.target
. Es sollte Requisite
auf dem Daemon-Dienst verwendet werden, damit es sofort fehlschlägt, wenn der entsprechende Netzwerkverwaltungsdienst nicht verwendet wird.
[Unit]
Requisite=...
After=...
Before=network-online.target
[Service]
Type=oneshot
ExecStart=...
RemainAfterExit=yes
Das Paket sollte einen Symlink zum wartenden Dienst im wants
Verzeichnis für installieren network-online.target
, damit er von Diensten abgerufen wird, die auf das konfigurierte Netzwerk warten möchten.
ln -s /usr/lib/systemd/system/... /usr/lib/systemd/system/network-online.target.wants/
Dazugehörige Dokumentation
Schlussnoten
Ich hoffe, dass ich Ihnen nicht nur bei der Beantwortung Ihrer Frage geholfen habe, sondern auch dazu beigetragen habe, die Situation in Upstream- und Linux-Distributionen zu verbessern, sodass ich jetzt eine bessere Antwort geben kann, als dies zum Zeitpunkt des Erstellens der ursprünglichen möglich war .