Dépendances de la configuration réseau de systemd
Il est très facile d’affecter la commande d’unités de systemd. D'autre part, vous devez faire attention à ce qu'une unité achevée garantit.
Configurez votre service
Sur les systèmes actuels, commander après network.target
garantit simplement que le service réseau a été démarré, et non qu'il existe une configuration réelle. Vous devez commander après network-online.target
et le tirer pour y parvenir.
[Unit]
Wants=network-online.target
After=network-online.target
Pour assurer la compatibilité avec les systèmes plus anciens, vous devrez peut-être aussi commander après network.target.
[Unit]
Wants=network-online.target
After=network.target network-online.target
C'est pour le fichier d'unité de votre service et pour systemd.
Implémentation dans les versions actuelles du logiciel
Maintenant, vous devez vous assurer que cela network-online.target
fonctionne comme prévu (ou que vous pouvez au moins l'utiliser network.target
).
La version actuelle de NetworkManager offre le NetworkManager-wait-online.service
qui est tiré par network-online.target
et donc par votre service. Ce service spécial garantit que votre service attendra que toutes les connexions configurées pour être démarrées réussissent, échouent ou dépassent automatiquement le délai imparti.
La version actuelle de systemd-networkd bloque votre service jusqu'à ce que tous les périphériques soient configurés comme demandé. Il est plus facile dans la mesure où il ne prend actuellement en charge que les configurations appliquées au démarrage (plus précisément au moment du démarrage de `systemd-networkd.service).
Par souci d'exhaustivité, le /etc/init.d/network
service dans Fedora, tel qu'interprété par les versions actuelles de systemd, bloque network.target
et donc, indirectement, bloque network-online.target
et votre service. C'est un exemple d'implémentation basée sur un script.
Si votre implémentation, qu'elle soit basée sur un démon ou sur un script, se comporte comme l'un des services de gestion de réseau ci-dessus, elle retardera le démarrage de votre service jusqu'à ce que la configuration du réseau soit terminée avec succès, échoue pour une bonne raison ou expire après un délai raisonnable. cadre à compléter.
Vous voudrez peut-être vérifier si netctl fonctionne de la même manière et que ces informations constitueraient un ajout précieux à cette réponse.
Implémentations dans les anciennes versions du logiciel
Je ne pense pas que vous verrez une version suffisamment ancienne de systemd où cela ne fonctionnerait pas bien. Mais vous pouvez vérifier qu'il network-online.target
existe au moins et qu'il est commandé après network.target
.
Auparavant, NetworkManager garantissait uniquement qu’au moins une connexion serait appliquée. Et même pour que cela fonctionne, vous devez l'activer NetworkManager-wait-online.service
explicitement. Ce problème a été corrigé depuis longtemps dans Fedora, mais il n'a été appliqué que récemment en amont.
systemctl enable NetworkManager-wait-online.service
Notes sur les implémentations network.target et network-online.target
Vous ne devriez pas avoir besoin de faire de votre logiciel dépendra NetworkManager.service
ou NetworkManager-wait-online.service
ni aucun autre services. Au lieu de cela, tous les services de gestion de réseau doivent se commander avant network.target
et éventuellement network-online.target
.
Un simple service de gestion de réseau basé sur un script doit terminer la configuration du réseau avant de quitter et doit se commander avant network.target
et donc indirectement avant network-online.target
.
[Unit]
Before=network.target
[Service]
Type=oneshot
ExecStart=...
RemainAfterExit=yes
Un service de gestion de réseau basé sur un démon doit également se commander avant network.target
même s’il n’est pas très utile.
[Unit]
Before=network.target
[Service]
Type=simple
ExecStart=...
Un service qui attend la fin du démon doit se commander lui-même après le service spécifique et avant network-online.target
. Il doit utiliser Requisite
le service démon pour qu’il échoue immédiatement si le service de gestion de réseau correspondant n’est pas utilisé.
[Unit]
Requisite=...
After=...
Before=network-online.target
[Service]
Type=oneshot
ExecStart=...
RemainAfterExit=yes
Le paquet doit installer un lien symbolique vers le service en attente dans le wants
répertoire network-online.target
afin que celui-ci soit attiré par les services qui souhaitent attendre le réseau configuré.
ln -s /usr/lib/systemd/system/... /usr/lib/systemd/system/network-online.target.wants/
Documentation connexe
Notes finales
J'espère avoir non seulement aidé à répondre à votre question au moment où vous l'avez posée, mais également à améliorer la situation des distributions amont et Linux, afin que je puisse maintenant donner une meilleure réponse que celle qui était possible au moment de la rédaction de l'original. .