Erläutern Sie systemd, dass / var mit / home / var verknüpft ist

2

Angenommen, eine Installation von Debian unstable unter Verwendung von systemd for init mit zwei Dateisystempartitionen /und /home. Nehmen wir weiter an, dass ich aus Gründen, die mit den physischen Datenträgern zu tun haben, den Inhalt /varin /home/vardas /varVerzeichnis verschoben und es durch einen entsprechenden Symlink ersetzt habe. (Bitte versuchen Sie nicht, mich davon abzuhalten, /varin die /homePartition zu wechseln, oder verwandeln Sie dies in ein systemd-Argument ;-)

Bei dieser Konfiguration muss systemd informiert werden, dass Geräte, die etwas benötigen, /varerst nach der /homeMontage gestartet werden können . Das, von dem ich weiß, dass es kaputt ist (da es versucht, /var/libsehr früh in der Startsequenz auf eine Datei zuzugreifen ) systemd-random-seed.service, könnte aber leicht eine beliebige Anzahl anderer sein, die mir noch nicht aufgefallen sind.

Was ist die beste Möglichkeit, um die allgemeine Regel zu konfigurieren, dass "etwas, von dem etwas benötigt wird, /varerst nach dem Mounten gestartet werden kann /home"? Ich werde eine Antwort in der Form "Hinzufügen Requires=und After=Anweisungen zu jeder betroffenen Unit-Datei" nur akzeptieren, wenn Sie nachweisen können, dass es keine überlegene Alternative gibt.

Die Version von systemd, die derzeit unter Debian Unstable läuft, ist 224.

zwol
quelle

Antworten:

3

Nun, init kann nicht wirklich von alleine wissen, welche Dateien ein bestimmter Dienst benötigt, daher müssen die Abhängigkeiten "dieser Dienst verwendet / var" ohnehin noch irgendwo deklariert werden .

Das sollte natürlich von den Entwicklern und Paketierern gemacht werden, nicht von Ihnen. Zum Beispiel hat das oben Genannte systemd-random-seed.service bereits alle notwendigen Abhängigkeiten:

$ systemctl cat systemd-random-seed
# /usr/lib/systemd/system/systemd-random-seed.service
# Diese Datei ist Teil von systemd.
...
DefaultDependencies = no
RequiresMountsFor = / var / lib / systemd / random-seed
...

In Ihrem Fall besteht die "bessere Alternative" darin, anstelle des Symlinks ein Bind-Mount zu verwenden . Das wird sich auf natürliche Weise in die Abhängigkeiten der .mount-Einheiten von systemd einklinken und ansonsten identische Funktionen für einen Symlink bereitstellen.

Das heißt, wenn Sie ein Bind-Mount haben /var, hängen alle Einheiten, die bereits von abhängen var.mount, automatisch (indirekt) davon ab home.mount.

# / etc / fstab
/ home / var / var keine bind 0 0

(Wenn dies nicht akzeptabel ist, würde das Kompilieren einer benutzerdefinierten systemd-Version mit der darin gehackten Abhängigkeit möglicherweise Ihre "Anforderungen" besser erfüllen.)


Wenn einige Ihrer .service Einheiten richtigen Abhängigkeiten fehlen, es ist eine weitere Option - Sie können drehen /varin eine auto systemd der autofs4 - Unterstützung.

Bei der automatischen Bereitstellung wird jeder Prozess, der versucht, auf Dateien unter / var zuzugreifen, blockiert, bis das Dateisystem bereitgestellt wird. Auf diese Weise wird eine globale Abhängigkeit erstellt, ohne dass einzelne Serviceeinheiten bearbeitet werden müssen.

Fügen Sie dazu die x-systemd.automountOption in fstab hinzu. (Oder, wenn Sie es vorziehen, var.mountfstab, dann erstellen Sie auch eine entsprechende var.automount.)

# / etc / fstab
/ home / var / var keine Bindung, x-systemd.automount 0 0

Natürlich setzt dies wiederum voraus, dass es sich /varnicht um einen Symlink, sondern um einen Bind Mount handelt.

Grawity
quelle
Aha! Nachdem ich diese Frage gestellt habe, ist mir die Möglichkeit eines Bind-Mounts aufgefallen, aber ich konnte in der Dokumentation nichts finden, was darauf hinweist, ob es funktionieren würde oder nicht. Ich akzeptiere dies, nachdem ich bestätigt habe, dass es funktioniert (der Computer befindet sich gerade in einer sehr großen Paketinstallation).
zwol
Beim automount-Ansatz ist einige Vorsicht geboten: Er funktioniert möglicherweise beim Start, hilft aber beim Bestellen des Herunterfahrens überhaupt nicht ... Ich denke, es ist nur hauptsächlich ein Problem beim Bestellen des Herunterfahrens des vernetzten Dateisystems. Wenn ein lokaler Mount nicht beendet werden kann, weil er noch verwendet wird, sollte systemd-shutdown damit umgehen können.
Sourcejedi
0

Mehr als ein Jahr später, mit der Version von systemd (229), die jetzt mit Ubuntu 16.04 ausgeliefert wird, gibt es in fstab Unterstützung für solche Abhängigkeiten.

So einfach ist das.

# /etc/fstab
home/var /var x-systemd.requires=/home,x-systemd.automount,none bind 0 0

Ich habe die Idee von diesem Beitrag https://copyninja.info/blog/systemd_automount_entry.html

DKebler
quelle