comment démarrer un service systemd avant le démarrage du réseau?

11

J'essaie de mettre en place un nouveau service (sous Debian Jessie) qui doit mettre en place des montages où la configuration réseau est stockée et donc ce service doit se terminer avant le réseautage.service démarre.

J'ai essayé ce qui suit:

[Unit]
Description=mount/repair remaining filesystems (all persistent fs beyond "/")
#Before=network-pre.target
Before=networking.service

[Service]
Type=oneshot
ExecStart=/opt/intermodul-mounts/start.sh
TimeoutSec=0
RemainAfterExit=yes

[Install]
RequiredBy=networking.service

En utilisant systemd-analyze plotje peux voir que mon service démarre, mais networking.servicedémarre environ 3 secondes plus tôt:

entrez la description de l'image ici

Apparemment, ma configuration est erronée, mais j'ai du mal à trouver le problème ... Toute aide grandement appréciée ..

Mise à jour

Je l'ai actuellement résolu en modifiant la configuration du service pour démarrer avant local-fs.targetau lieu de networking.service:

[Unit]
DefaultDependencies=no
Description=mount/repair remaining filesystems (all persistent fs beyond "/")
Before=local-fs.target

[Service]
Type=oneshot
ExecStart=/opt/intermodul-mounts/start.sh
TimeoutSec=0
RemainAfterExit=yes

[Install]
RequiredBy=local-fs.target

Je voudrais quand même comprendre pourquoi ma première configuration n'a pas fonctionné comme prévu ...?

Udo G
la source
En raison du fonctionnement de systemd, l'ordre temporel littéral dans lequel les choses fonctionnent peut ne pas être significatif. Lorsque le réseautage apparaît, est-il correctement conforme aux fichiers de ce répertoire?
Tom Hunt
Je ne suis pas sûr d'avoir compris votre question. Quoi qu'il en soit, /etc/network/interfacesa des références à des ip-upscripts qui résident dans une autre partition. Cette partition est montée par un script complexe /opt/intermodul-mounts/start.shqui doit être exécuté avant la mise en réseau. Actuellement, les ip-upscripts ne démarrent pas efficacement car ils ne sont pas accessibles au démarrage. L'exécution service networking restartultérieure affiche correctement toutes les interfaces.
Udo G
Copie possible: superuser.com/questions/1005742/…
Josip Rodin

Réponses:

8

network-pre.target est une cible qui peut être utilisée pour commander des services avant de configurer une interface réseau. Son objectif principal est de l'utiliser avec des services de pare-feu qui souhaitent établir un pare-feu avant que toute interface réseau ne soit active. C'est une unité passive: vous ne pouvez pas la démarrer directement et elle n'est pas attirée par le service de gestion de réseau, mais par le service qui veut s'exécuter avant lui.

Vous souhaitez utiliser network-pre.targetsi vous souhaitez configurer quelque chose avant le démarrage du réseau

Les services qui souhaitent être exécutés avant la configuration du réseau doivent placer Before = network-pre.target et également définir Wants = network-pre.target pour le récupérer.

Vous devez les mettre sous la [Unit]section:

Before=network-pre.target
Wants=network-pre.target

Référence

Edward Torvalds
la source
1
Hé @edwardtorvalds, je faisais exactement cela pour une configuration de configuration réseau, mais l'unité ne semble jamais fonctionner. La réponse à systemctl is-enabled <unit>est toujours static. Bien sûr, je ne peux pas l'activer car il n'y en a pas WantedBy=. Après tout, que veut-il? C'est quelque chose qui fait une configuration avant que le réseau ne se charge.
deitch
vous pouvez essayer voulu par = remote-fs.target ou mount-fs.target.
Edward Torvalds
2
Merci. J'ai fini par faire Before=network-pre.targetet Wants=network-pre.targetet pour ce que [Install]nous avons fait WantedBy=network.target. La dernière section l'a obligée à être mise en réseau, la première l'a mise en ordre. Mais c'était une douleur
deitch
puisque vous avez définitivement la tête sur systemd beaucoup mieux que moi, pouvez-vous regarder l'autre q que j'ai? unix.stackexchange.com/questions/277783/… J'essaie toujours de comprendre comment le faire.
deitch
Je suis confus parce que je n'ai pas d'expérience avec la partition cryptée, si vous pouvez simplement me le faire, veuillez le faire
Edward Torvalds
3

Comme fait dans Debian Jessie, le paquet netfilter-persistent (permettant de charger les règles iptables avant que le réseau ne soit en place) a un netfilter-persistent.service qui ressemble à:

# https://www.freedesktop.org/wiki/Software/systemd/NetworkTarget/
# based on the netfilter-persistent package
[Unit]
Description=netfilter persistent configuration
DefaultDependencies=no

Before=network-pre.target
Wants=network-pre.target

Wants=systemd-modules-load.service local-fs.target
After=systemd-modules-load.service local-fs.target

Conflicts=shutdown.target
Before=shutdown.target

[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/usr/sbin/netfilter-persistent start
ExecStop=/usr/sbin/netfilter-persistent stop

[Install]
WantedBy=multi-user.target
user2024640
la source
Pourquoi est-il en conflit avec le shutdown.target?!
Alexis Wilke
1

L'erreur est simple et l'une des principales choses que je mélange toujours: vous mélangez Beforeet RequiredBy. Ça ne va pas ensemble. Les autres ont raison sur la cible.

Fléau
la source
0
[Unit]
Description=mount/repair remaining filesystems (all persistent fs beyond "/")
DefaultDependencies=no
After=sysinit.target local-fs.target
Before=basic.target

[Service]
Type=oneshot
ExecStart=/opt/intermodul-mounts/start.sh
TimeoutSec=0
RemainAfterExit=yes

[Install]
WantedBy=basic.target

Faire quelque chose dans ce sens garantira que cet appareil a fonctionné avant le réseau, mais après que la plupart des autres configurations importantes se sont produites.

spkane
la source