Frage Systemd: Startet eine Einheit, nachdem eine andere Einheit WIRKLICH gestartet hat


In meinem speziellen Fall möchte ich anfangen remote-fs Einheit immerhin glusterfs beginnt vollständig.

Meine Systemdateien:

glusterfs Ziel:

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 Ziel:

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, alle Gluster-Daemons starten erfolgreich und ich möchte das Gluster-Dateisystem über NFS mounten, aber Glusters NFS-Share wird nicht unmittelbar danach fertig glusterfs.service gestartet, aber ein paar Sekunden später, so in der Regel remote-fs ist nicht in der Lage, es sogar zu montieren Requires und After Richtlinien.

Lass uns das Protokoll sehen:

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...

Hier ist alles in Ordnung, entferntes Dateisystem (/ stor) scheint mount zu sein, nachdem glusterfs gestartet wurde, da es laut Unit-Dateien sein sollte ... Aber die nächsten Zeilen sind:

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

Was? GlusterFS war nur für diesen Moment bereit! Und dann sehen wir:

//...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.

Mount fehlgeschlagen, da der NFS-Server nicht bereit war, als Systemd versuchte, den Speicher bereitzustellen.

Aufgrund der nicht-deterministischen Art des Systemd-Boot-Prozesses gelingt es manchmal (ca. 1 von 10 Booten), dieses Dateisystem beim Booten zu mounten.

Wenn der onboot-Ladevorgang fehlgeschlagen ist, kann ich mich beim Server anmelden und das Verzeichnis / stor manuell mounten, so dass der NFS-Dienst von Gluster funktioniert.

Also wie fange ich an remote-fs nach dem glusterfsd, d. h. nach Started GlusterFS brick processes Zeile erscheint im Protokoll?

remote-fs scheint eines der allerletzten Ziele zu sein, so dass ich es nicht nach einem anderen "Workaround" -Ziel starten kann, das tatsächlich nicht benötigt wird remote-fs.


20
2018-04-14 10:03


Ursprung


Kannst du ein hinzufügen? ExecStartPre=<command>Eigenschaft zum Unit-Bereich von glusterfsd.service das führt einen Befehl aus, der blockt, bis glusterfs bereit ist? Das kann die verhindern glusterfsd.service vom Erfolg anzeigen und aktivieren remotefs.target. - Ben Campbell
Ich bin wirklich verwirrt von dir glusterfsd.service Einheitsdatei. Es scheint tatsächlich keine Dienste zu starten und tatsächlich tötet irgendein glusterfsd Prozesse. Haben Sie andere glusterbezogene Unit-Dateien? - GregL
Kannst du das auch zeigen? stor.mount Einheit? - Brian Redbeard


Antworten:


Sie können die Systemd Bootsequenz mit folgendem Befehl analysieren. Zeigen Sie die Ausgabedatei mithilfe eines SVG-unterstützenden Webbrowsers an.

systemd-analyze plot > test.svg

Dieses Plotten liefert Ihnen die Timing-Statistiken des letzten Bootes, die Ihnen einen klareren Blickwinkel auf das Problem liefern.

Ich habe mein NFS-Installationsproblem gelöst, indem ich hinzugefügt habe mount Befehle in zu /etc/rc.local. Aber ich bin mir nicht sicher, ob es mit glusterd Integration funktioniert, einen Versuch wert für eine schnelle Lösung. Um systemd rc.local ausführen zu können, sollten Sie folgende Bedingung erfüllen:

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

3
2017-08-19 08:37





Wie schon von anderen vorgeschlagen; Ich bin mir nicht sicher, ob es tatsächlich eine Abhängigkeit von "glusterfsd" ist, anstatt einer allgemeinen Verzögerung in etwas anderem, zum Beispiel einer DNS-Suche, die erfolgreich sein muss, um 'node4' aufzulösen und die NFS-Freigabe erfolgreich zu mounten.

Wir sind auf diese Verzögerung gestoßen, da die meisten unserer Setups einen lokalen Validierungs-Resolver verwenden, der verfügbar sein muss, bevor andere Dienste, die von DNS abhängen, erfolgreich gestartet werden können.

Die Lösung hierfür war ein 'ExecStartPre'-Skript, das im Grunde immer die Verfügbarkeit der spezifischen Abhängigkeiten testet, bis es erfolgreich ist (Exit 0) oder das Timeout versucht (Exit 1).

Stellen Sie sicher, dass Sie außerhalb des Hauptverzeichnisses systemd lib anpassen, wenn Sie können. Wenn Sie die Paketdateien ändern, werden sie wahrscheinlich beim nächsten Update überschrieben.


1
2017-11-10 16:56





Vielleicht könnten Sie das hinzufügen remote-fs Ziel:

[Unit]
...
ConditionPathExists=/stor

0
2017-09-15 10:41





Vielleicht könnte eine Umfrage helfen. Dies ist unabhängig von systemd. Zum Beispiel benutze ich mysql -e ';' in einer Schleife, bevor Sie etwas Nützliches mit MySQL machen.


0
2018-04-13 17:43