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.targetgarantit 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.targetet 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.targetfonctionne comme prévu (ou que vous pouvez au moins l'utiliser network.target).
La version actuelle de NetworkManager offre le NetworkManager-wait-online.servicequi est tiré par network-online.targetet 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/networkservice dans Fedora, tel qu'interprété par les versions actuelles de systemd, bloque network.targetet donc, indirectement, bloque network-online.targetet 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.targetexiste 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.serviceexplicitement. 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.serviceou NetworkManager-wait-online.serviceni aucun autre services. Au lieu de cela, tous les services de gestion de réseau doivent se commander avant network.targetet é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.targetet 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.targetmê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 Requisitele 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 wantsrépertoire network-online.targetafin 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. .