web-dev-qa-db-fra.com

SystemD: Démarrer une unité après une autre unité commence vraiment

Dans mon cas particulier, je veux commencer remote-fs Unité après tout glusterfs commence complètement.

Mes fichiers SystemD:

glusterfs cible:

node04:/usr/lib/systemd/system # cat glusterfsd.service 
[Unit]
Description=GlusterFS brick processes (stopping only)
After=network.target glusterd.service

[Service]
Type=oneshot
ExecStart=/bin/true
RemainAfterExit=yes
ExecStop=/bin/sh -c "/bin/killall --wait glusterfsd || /bin/true"
ExecReload=/bin/sh -c "/bin/killall -HUP glusterfsd || /bin/true"

[Install]
WantedBy=multi-user.target

remote-fs cible:

node04:/usr/lib/systemd/system # cat remote-fs.target 
[Unit]
Description=Remote File Systems
Documentation=man:systemd.special(7)
Requires=glusterfsd.service
After=glusterfsd.service remote-fs-pre.target
DefaultDependencies=no
Conflicts=shutdown.target

[Install]
WantedBy=multi-user.target

OK, tous les démons de Gluster commencent à réussir et je souhaite montez le système de fichiers de Gluster via NFS, mais le partage NFS de Glist se prépare pas immédiatement après glusterfs.service a commencé, mais quelques secondes plus tard, alors généralement remote-fs est incapable de le monter même en ce qui concerne Requires et After directives.

Voyons le journal:

Apr 14 16:16:22 node04 systemd[1]: Started GlusterFS, a clustered file-system server.
Apr 14 16:16:22 node04 systemd[1]: Starting GlusterFS brick processes (stopping only)...
Apr 14 16:16:22 node04 systemd[1]: Starting Network is Online.
Apr 14 16:16:22 node04 systemd[1]: Reached target Network is Online.
Apr 14 16:16:22 node04 systemd[1]: Mounting /stor...

Ici, tout va bien, le système de fichiers distant (/ stire) semble être monté après le démarrage de Glusterfs, car il s'agissait d'être en fonction des fichiers unitaires ... mais les lignes suivantes sont:

//...skipped.....
Apr 14 16:16:22 node04 systemd[1]: Started GlusterFS brick processes (stopping only).

Quoi? Glusterfs s'est prêt que pour ce moment! Et puis nous voyons:

//...skipped.....
Apr 14 16:16:23 node04 mount[2960]: mount.nfs: mounting node04:/stor failed, reason given by server: No such file or directory
Apr 14 16:16:23 node04 systemd[1]: stor.mount mount process exited, code=exited status=32
Apr 14 16:16:23 node04 systemd[1]: Failed to mount /stor.
Apr 14 16:16:23 node04 systemd[1]: Dependency failed for Remote File Systems.
Apr 14 16:16:23 node04 systemd[1]: Unit stor.mount entered failed state.

Le montage a échoué car NFS Server n'était pas prêt lorsque SystemD a tenté de monter le stockage.

En raison de la nature non déterministe du processus de démarrage SystemD, parfois (environ 1 de 10 bottes) montage Ce système de fichiers sur Boot réussit.

Si le mont OnBoot n'a pas échoué, je peux vous connecter au serveur et monter manuellement le répertoire/store, de sorte que le service NFS de Glist semble fonctionner correctement.

Alors, comment commencer remote-fs après glusterfsd, c'est-à-dire après Started GlusterFS brick processes la ligne apparaît dans le journal?

remote-fs semble être l'un des derniers objectifs, donc je ne peux donc pas commencer à commencer après une autre cible "de contournement" qui n'est en fait pas requise par remote-fs.

21
Sergey

Vous pouvez analyser la séquence de démarrage SystemD en suivant la commande suivante. Affichez le fichier de sortie à l'aide d'un navigateur Web support SVG.

systemd-analyze plot > test.svg

Ce traçage vous fournira les statistiques de chronométrage de dernière démarrage, qui vous fournira un point de vue plus clarifié au problème.

J'ai résolu mon problème de montage NFS en ajoutant mount commandes à /etc/rc.local. Cependant, je ne suis pas sûr, cela fonctionnera-t-il avec une intégration GLUSTERD, vaut la peine d'essayer d'une solution rapide. Afin de faire SystemD Run RC.Local, vous devez satisfaire la condition suivante:

# grep Condition /usr/lib/systemd/system/rc-local.service
ConditionFileIsExecutable=/etc/rc.d/rc.local
3
aesnak

Comme déjà suggéré par d'autres; Je ne suis pas sûr que ce soit en fait une dépendance à "Glusterfsd", au lieu d'un retard général dans quelque chose d'autre, par exemple une recherche DNS qui doit réussir à résoudre le "noeud4" et montez avec succès la part de NFS.

Nous avons rencontré ce délai car la plupart de nos configurations utilisent un résolveur de validation local, qui doit être disponible avant que d'autres services dépendent de DNS puissent commencer avec succès.

La solution à cela était d'avoir un script "Execstartpre" qui teste essentiellement la disponibilité des dépendances spécifiques de plus et plus, jusqu'à ce qu'il réussisse (sortie 0) ou des moments d'essayer (sortie 1).

Assurez-vous de personnaliser en dehors du principal Annuaire SystemD Lib, si vous le pouvez. Changer les fichiers du package signifie qu'ils seront probablement écrasés sur la prochaine mise à jour qui se présente.

1
user304238

Peut-être qu'un sondage pourrait aider. Ceci est indépendant de SystemD. Par exemple, j'utilise mysql -e ';' Dans une boucle avant de faire quelque chose d'utile avec MySQL.

0
user97619

Peut-être que vous pourriez ajouter ceci à remote-fs cible:

[Unit]
...
ConditionPathExists=/stor
0
Markus