Verwenden von systemd zum Mounten von Remote-Dateisystemen im Benutzerbus

Verwenden von systemd zum Mounten von Remote-Dateisystemen im Benutzerbus

Ich möchte ein Verzeichnis von einem Remote-Rechner in meinem mounten /home/stew/shared. Nach der Installation sshfsund Verwendung ssh-copy-idauf meinem Remote-Rechner kann ich Folgendes tun:

stew@stewbian:~$ sshfs [email protected]:/path/to/remote-dir ~/shared

und dann unmounten mit

stew@stewbian:~$ umount ~/shared

oder

stew@stewbian:~$ fusermount -u ~/shared

Funktioniert super, aber ich möchte dies beim stewAnmelden automatisch mounten und beim stewAbmelden unmounten. Eine funktionierende Option ist die Verwendung eines systemd .serviceauf dem Benutzerbus:

# ~/.config/systemd/user/shared.service
[Unit]
Description=Mount ~/shared

[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=sshfs %[email protected]:/path/to/remote-dir %h/shared
ExecStop=umount %h/shared

[Install]
WantedBy=default.target

systemctl --user {start,stop} shared.servicefunktioniert auch super! Aber ich frage mich, ob .mountdie Einheiten robuster wären.


Ich habe versucht, eine Mount-Einheit wie diese zu verwenden:

# ~/.config/systemd/user/home-stew-shared.mount 
[Unit]
Description=~/shared

[Mount]
What=%[email protected]:/path/to/remote-dir
Where=%h/shared
Type=fuse.sshfs

[Install]
WantedBy=default.target

Das Starten dieser Mount-Einheit funktioniert einwandfrei, das Stoppen verursacht jedoch Folgendes:

$ systemctl --user status home-stew-shared.mount
● home-stew-shared.mount - ~/shared
     Loaded: loaded (/home/stew/.config/systemd/user/home-stew-shared.mount; static)
     Active: active (mounted) (Result: exit-code) since Mon 2021-05-24 16:49:40 CEST; 6min ago
     ...
May 24 16:49:40 stewbian systemd[1046]: Unmounting ~/shared...
May 24 16:49:40 stewbian umount[22256]: umount: /home/stew/shared: must be superuser to unmount.
May 24 16:49:40 stewbian systemd[1046]: home-stew-shared.mount: Mount process exited, code=exited, status=32/n/a
May 24 16:49:40 stewbian systemd[1046]: Failed unmounting ~/shared.

Ich kann $ umount ~/shareddas Verzeichnis aushängen und die Einheit zum Absturz bringen.


Fragen:

  1. Gibt es einen Grund, warum ich *.mountEinheiten Einheiten vorziehen sollte *.service?
  2. Wenn ich wirklich verwenden sollte *.mount, gibt es einen Trick, um dies auf dem Benutzerbus zum Laufen zu bringen, oder muss ich zum Systembus gehen und herausfinden, wie ich eine verzögerte Einbindung durchführe und UIDs und GIDs manuell festlege?

Einer der Vorteile bei der Verwendung von *.serviceist, dass ich diesen Dienst zu hinzufügen kann skel, sodass jeder Benutzer automatisch seine eigenen privaten freigegebenen Verzeichnisse bereitstellt, die effektiv zwischen allen Computern im Haus synchronisiert werden. Die *.mountDateien benötigen den Benutzernamen im Dateinamen, um auf das richtige Home-Verzeichnis zuzugreifen.

Antwort1

Ich habe dasselbe Problem unter Ubuntu 21.04 mit systemd 246.6 – wenn Sie versuchen, eine Mount-Einheit auszuhängen, versucht systemd zuerst, einen umount-Helfer unter zu finden /sbin/umount.<type>(d. h. für sshfs wäre es /sbin/umount.fuse.sshfs), und wenn das fehlschlägt, wird es aufgerufen umount2(<where>)– und das wird fehlschlagen, wenn es vom systemd des Benutzers ausgeführt wird.

Ich bin nicht sicher, warum das bei @fra-san funktioniert – ich glaube, sie haben möglicherweise einen Unmount-Helfer.

Zu diesen Fragen:

  1. Sie können mit einer Service-Unit alles machen, so wie Sie mit einem Init-Skript im SysV-Stil alles machen könnten, aber die Idee von systemd ist, dass wir allgemeine Systemverwaltungsaufgaben verstehen und die minimale beschreibende Syntax bereitstellen, um das zu erreichen, was Sie brauchen, ohne die Dinge übermäßig zu verkomplizieren (was die Wartung erschwert). Wenn Sie eine Mount-Unit zum Mounten von Dateisystemen verwenden können, ist das besser, als einfach ein Skript zu schreiben. Natürlich muss die Infrastruktur in der Lage sein, das zu unterstützen, was Sie tun müssen, und obwohl der aktuelle Status von Benutzer-Mount-Units viel besser ist als vor ein paar Jahren, ist er mit Ubuntu 21.04 für FUSE-Dateisysteme noch nicht zu 100 % vorhanden.
  2. Um fuse.sshfsBenutzer-Mount-Units zu stoppen (unmounten), habe ich einen umount-Helfer in /sbin/umount.fuse.sshfsas erstellt.
#!/bin/sh
/bin/fusermount -u "$1"

dann funktioniert das Stoppen der Mount-Einheit gut – systemd ruft den umount-Helfer auf und hängt das Dateisystem korrekt aus (rufen Sie nicht umountvom umount-Helfer auf, da dieser umountauch Helfer aufruft und Sie in eine Endlosschleife geraten würden, die alle PIDs verbraucht). Dies ist wahrscheinlich keine gute Lösung und systemd sollte das tun, was es umounttut, wenn Sie es als Benutzer aufrufen (was ich eigentlich nicht herausfinden kann), aber es funktioniert für mich.

verwandte Informationen