Wie starte ich einen systemd-Dienst, bevor das Netzwerk startet?

11

Ich versuche, einen neuen Dienst (unter Debian Jessie) einzurichten, der einige Mounts einrichten muss, in denen die Netzwerkkonfiguration gespeichert ist. Daher muss dieser Dienst abgeschlossen sein, bevor network.service gestartet wird.

Ich habe folgendes versucht:

[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

Mit systemd-analyze plotkann ich sehen, dass mein Dienst startet, aber networking.serviceungefähr 3 Sekunden früher startet:

Geben Sie hier die Bildbeschreibung ein

Anscheinend ist meine Konfiguration falsch, aber es fällt mir schwer, das Problem zu finden ... Jede Hilfe wird sehr geschätzt.

Aktualisieren

Ich habe es derzeit gelöst, indem ich die Dienstkonfiguration so geändert habe, dass sie vorher startet, local-fs.targetanstatt 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

Trotzdem möchte ich verstehen, warum meine erste Konfiguration nicht wie erwartet funktioniert hat ...?

Udo G.
quelle
Aufgrund der Funktionsweise von systemd ist die buchstäbliche zeitliche Reihenfolge, in der die Dinge ablaufen, möglicherweise nicht signifikant. Wenn das Netzwerk gestartet wird, stimmt es erfolgreich mit den Dateien in diesem Verzeichnis überein?
Tom Hunt
Ich bin mir nicht sicher, ob ich Ihre Frage verstanden habe. Wie auch immer, /etc/network/interfaceshat Verweise auf ip-upSkripte, die sich in einer anderen Partition befinden. Diese Partition wird von einem komplexen Skript bereitgestellt /opt/intermodul-mounts/start.sh, das ausgeführt werden muss , bevor das Netzwerk eingerichtet wird. Derzeit werden die ip-upSkripte effektiv nicht gestartet, da sie beim Booten nicht verfügbar sind. Wenn Sie service networking restartdanach ausgeführt werden, werden alle Schnittstellen korrekt aufgerufen.
Udo G
Mögliches Duplikat: superuser.com/questions/1005742/…
Josip Rodin

Antworten:

8

network-pre.target ist ein Ziel, mit dem Dienste bestellt werden können, bevor eine Netzwerkschnittstelle konfiguriert wird. Der Hauptzweck ist die Verwendung mit Firewall-Diensten, die eine Firewall einrichten möchten, bevor eine Netzwerkschnittstelle aktiv ist. Es ist eine passive Einheit: Sie können sie nicht direkt starten und sie wird nicht vom Netzwerkverwaltungsdienst abgerufen, sondern von dem Dienst, der zuvor ausgeführt werden möchte.

Sie möchten verwenden, network-pre.targetwenn Sie etwas einrichten möchten, bevor das Netzwerk gestartet wird

Dienste, die ausgeführt werden sollen, bevor das Netzwerk konfiguriert wird, sollten Before = network-pre.target platzieren und Wants = network-pre.target festlegen, um es abzurufen.

Sie sollten diese unter [Unit]Abschnitt setzen:

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

Referenz

Edward Torvalds
quelle
1
Hey @edwardtorvalds, ich habe genau dies für einige Netzwerkkonfigurations-Setups getan, aber das Gerät scheint nie zu laufen. Die Antwort auf systemctl is-enabled <unit>ist immer static. Natürlich kann ich es nicht aktivieren, weil es keine gibt WantedBy=. Was will es denn? Dies ist etwas, das einige Einstellungen vor dem Laden des Netzwerks vornimmt.
Gottheit
Sie können gesucht von = remote-fs.target oder mount-fs.target versuchen.
Edward Torvalds
2
Vielen Dank. Ich am Ende tun Before=network-pre.targetund Wants=network-pre.targetund für die [Install]wir haben WantedBy=network.target. Der letzte Abschnitt zwang es, durch die Vernetzung benötigt zu werden, der erstere ordnete es. War allerdings ein Schmerz
Gottheit
Da Sie sich definitiv viel besser mit systemd auskennen als ich, können Sie sich das andere q ansehen, das ich habe? unix.stackexchange.com/questions/277783/… Ich versuche immer noch herauszufinden, wie es geht.
Gottheit
Ich bin verwirrt, weil ich keine Erfahrung mit verschlüsselter Partition habe. Wenn Sie mich einfach können, tun Sie dies bitte
Edward Torvalds
3

Wie in Debian Jessie hat das Paket netfilter-persistent (das Laden von iptables-Regeln, bevor das Netzwerk aktiv ist) einen netfilter-persistent.service , der wie folgt aussieht:

# 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
quelle
Warum steht es im Konflikt mit dem shutdown.target?!
Alexis Wilke
1

Der Fehler ist einfach und eines der wichtigsten Dinge, die ich immer verwechsle: Sie mischen Beforeund RequiredBy. Das passt nicht zusammen. Die anderen haben Recht mit dem Ziel.

Fluch
quelle
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

Wenn Sie etwas in diese Richtung tun, wird sichergestellt, dass dieses Gerät vor dem Netzwerk ausgeführt wurde, jedoch nachdem die meisten anderen wichtigen Einstellungen vorgenommen wurden.

spkane
quelle