Legen Sie fest, dass der systemd-Dienst nach dem Einhängen der fstab ausgeführt wird

33

Ich arbeite an einem systemd .serviceSkript, das gestartet werden soll, nachdem ein CIFS-Netzwerkstandort beim Booten über /etc/fstabto eingehängt /mnt/wurde.

Das Skript wartet darauf, dass zuerst ein OpenVPN-Abhängigkeitsskript gestartet wird, aber ich möchte auch, dass es wartet, bis der Ladevorgang abgeschlossen ist.

/etc/systemd/system/my-daemon.service :

[Unit]
Description=Launch My Daemon
After=network.target vpn-launch.service
Requires=vpn-launch.service

Ich habe versucht, Folgendes systemd.mountin die Zeile aufzunehmen:, After=network.target vpn-launch.service systemd.mountaber es hat nicht die erhofften Ergebnisse geliefert.

Winterflaggen
quelle
Funktioniert es, wenn Sie systemd-remount-fsIhrer AfterListe hinzufügen ?
Eric Renouf

Antworten:

40

Ein CIFS-Netzwerkstandort wird beim Booten über /etc/fstabto eingehängt /mnt/.

Nein ist es nicht. Wenn Sie das richtig machen, passt der Rest auf natürliche Weise.

Der Mount wird von einer (generierten) systemd- Mount-Unit ausgeführt , die so etwas wie den Namen trägt mnt-wibble.mount. Sie können den tatsächlichen Namen in der Ausgabe des systemctl list-units --type=mountBefehls sehen. Sie können es wie jedes andere Gerät mit genauer betrachten systemctl status.

Dann ganz einfach: Sie müssen bestellen, dass Ihr Gerät gestartet wird, nachdem dieses Mount-Gerät gestartet wurde.

After = network.target vpn-launch.service mnt-wibble.mount

Weitere Lektüre

JdeBP
quelle
10
Listeneinhänge mit "systemctl list-units --type = mount"
nijave
Für Anhänger ist "wibble" nur ein Pseudonym, wie "foobar"
Rogerdpack
17

Entschuldigung, aber ich kann noch keinen Kommentar abgeben.

Wie JdeBP sagte, sollten Sie auf dem Dateisystem Mount bestellen. Sie können den Namen der Mount-Einheit vorhersagen oder alternativ (im Unit-Bereich) Folgendes verwenden:

RequiresMountsFor = / absolute / Pfad / von / mount

Diese Option erstellt die Abhängigkeiten zu den entsprechenden * .mount-Einheiten, um den Pfad vor dem Starten des Dienstes zugänglich zu machen. Es ist möglicherweise nicht auf allen Systemversionen verfügbar, aber ich habe es in den letzten 6 Monaten auf einem CentOS 7-Computer verwendet.

Miguelbernadi
quelle
(Und Ihre Unterschiede zum Vanille-System sind hier .) RequiresMountsFor=Hat seine eigenen Vorbehalte. Mit RedHat Bug # 1088057 und Chris Siebenmann in der Hand, sollten Sie in der Lage sein antworten superuser.com/questions/988734 . Auch in dieser Frage handelt es sich um ein CIFS-Mount. Aber die Implikation ist, dass es zum autoGlück ist.
JdeBP
@JdeBP Danke für den Kommentar. Ich war mir der Vorbehalte und Probleme bei dieser Funktion nicht bewusst.
Miguelbernadi
14

Obwohl beide Antworten korrekt sind, möchte ich meine zwei Cent in die Diskussion einbringen, da mir nach der Suche einige Anweisungen und Beispiele für das weitere Vorgehen fehlten.

  1. Fügen Sie das Dateisystem zu hinzu /etc/fstab
  2. Geben Sie ein, mit mount -adem alle in fstab genannten Dateisysteme gemountet werden
  3. Suchen Sie nach der systemd-Einheit, mit der Folgendes generiert wurde:

    systemctl list-units | grep '/path/to/mount' | awk '{ print $1 }'

    (sollte etwas zurückgeben, das mit endet. .mount)
  4. Fügen Sie die gefundene Mount-Unit der After=Anweisung in der *.serviceDatei hinzu

Hier ist ein Beispiel für das Starten des my-daemonDienstes beim Booten, aber nachdem das Netzwerk bereit ist, wird eine CIFS-Freigabe unter bereitgestellt /mnt/cifsund der vpn-launchDienst wurde gestartet:

/ etc / fstab

//servername/sharename /mnt/cifs cifs defaults,some,other,options 0 0

Hinweis: Möglicherweise möchten Sie nofailIhre fstab-Optionen erweitern (z. B. bei Verwendung eines externen Laufwerks). Andernfalls startet Ihr Computer nicht, wenn das Gerät nicht angeschlossen ist. Siehe ArchWikis Artikel fstab


/etc/systemd/system/my-daemon.service

[Unit]
Description=Launch My Daemon
Requires=vpn-launch.service mnt-cifs.mount
After=network.target vpn-launch.service mnt-cifs.mount

[Service]
ExecStart=/path/to/my-daemon

[Install]
WantedBy=multi-user.target

Vergessen Sie nicht, den Dienst so zu aktivieren, dass er beim Booten gestartet wird: systemctl enable my-daemon

Beachten Sie, dass dies auch für andere Dateisysteme (NFS, Festplatten usw.) funktioniert.

Wie bereits erwähnt, sind beide Antworten richtig und ich empfehle jedem, sie zu lesen, aber für mich hätten ein paar Beispiele mir Zeit gespart.

Update (25.06.2019):

  • Hinweis zu fstab-Optionen hinzugefügt, um die Boot-Sperre bei Verwendung externer Laufwerke zu verhindern
  • mnt-cifs.mountzur Requires=Liste hinzugefügt , die my-daemon.servicedas Fehlschlagen des Startvorgangs verursacht , wenn die cifs-Bereitstellung nicht erfolgreich bereitgestellt wurde
BM-Bergmotte
quelle
Um ganz klar zu sein: "mnt-cifs.mount" ist der Name der Mount-Einheit für Ihren spezifischen Mount-Punkt systemctl list-units --type=mount.
smdvlpr
1

@ bm-bergmotte: danke für deine anweisung, die mir sehr geholfen hat. Bei mir funktioniert es einfach, wenn ich sage

After=network.target vpn-launch.service mnt-cifs.mount
Requires=vpn-launch.service mnt-cifs.mount

Wenn ich "mnt-cifs.mount" nicht in das Feld "Requires" (und in dieser Reihenfolge) einbaue, funktioniert dies für den Neustart / Start. Der Dienst wird jedoch trotzdem gestartet, wenn das Gerät nicht gemountet ist. Nachdem Sie es zusätzlich in "" Requires "gestellt haben, wird das Gerät vom Dienst vor dem Start gemountet, falls das Gerät nicht gemountet wurde.

gemacht
quelle
Du hast recht. Wenn der Mount fehlschlägt, wird der my-daemon.service trotzdem gestartet. After=diktiert nur die Reihenfolge. Requires=macht es zwingend erforderlich, dass das cifs-Mount vorhanden sein muss (siehe Antwort von Sufiyan Ghori zu diesem Thema). Ich werde meine Antwort aktualisieren.
BM-Bergmotte