Usando systemd para montar sistemas de archivos remotos en el bus de usuario

Usando systemd para montar sistemas de archivos remotos en el bus de usuario

Me gustaría montar un directorio desde una máquina remota en mi /home/stew/shared. Después de instalar sshfsy usar ssh-copy-iden mi máquina remota, puedo hacer esto:

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

y luego desmontar con

stew@stewbian:~$ umount ~/shared

o

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

Funciona muy bien, pero me gustaría montarlo automáticamente cuando stewinicio sesión y desmontarlo cuando stewcierre sesión. Una opción que funciona es utilizar un systemd .serviceen el bus del usuario:

# ~/.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.service¡También funciona muy bien! Pero me pregunto si .mountlas unidades serían más robustas.


Intenté usar una unidad de montaje así:

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

Iniciar esta unidad de montaje funciona muy bien, pero detenerla causa esto:

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

Puedo $ umount ~/shareddesmontar el directorio y fallar la unidad.


Preguntas:

  1. ¿Hay alguna razón por la que debería preferir *.mountunidades a *.serviceunidades?
  2. Si realmente debería usar *.mount, ¿existe algún truco para que esto funcione en el bus de usuario, o necesito ir al bus del sistema y descubrir cómo realizar un montaje diferido y configurar manualmente los UID y GID?

Una de las cosas buenas de usar *.servicees que puedo agregar este servicio a skel, por lo que cada usuario montará automáticamente sus propios directorios privados compartidos que se sincronizarán efectivamente entre todas las máquinas de la casa. Los *.mountarchivos necesitan el nombre de usuario en el nombre del archivo para acceder a la casa correcta.

Respuesta1

Tengo el mismo problema en Ubuntu 21.04 con systemd 246.6: cuando intentas desmontar una unidad de montaje, systemd primero intenta encontrar un asistente de desmontaje en /sbin/umount.<type>(es decir, para sshfs sería /sbin/umount.fuse.sshfs), y cuando eso falla, llamará umount2(<where>), y eso fallará cuando lo ejecute el systemd del usuario.

No estoy seguro de por qué esto funciona para @fra-san; creo que pueden tener un asistente de desmontaje.

En cuanto a esas preguntas:

  1. Puede hacer cualquier cosa con una unidad de servicio, como podría hacer cualquier cosa con un script de inicio estilo SysV, pero la idea de systemd es que entendemos las tareas comunes de administración del sistema y brindamos la sintaxis descriptiva mínima para lograr lo que necesita sin complicar demasiado las cosas ( eso hace que sea más difícil de mantener). Si puede utilizar una unidad de montaje para montar sistemas de archivos, es preferible a escribir básicamente un script. Por supuesto, la infraestructura tiene que ser capaz de soportar lo que usted necesita hacer y, si bien el estado actual de las unidades de montaje del usuario es mucho mejor que hace unos años, a partir de Ubuntu 21.04, todavía no está al 100% para el archivo FUSE. sistemas.
  2. Para que fuse.sshfslas unidades de montaje del usuario se detengan (desmonten), creé un asistente de montaje /sbin/umount.fuse.sshfscomo
#!/bin/sh
/bin/fusermount -u "$1"

luego, detener la unidad de montaje funciona bien: systemd llamará al asistente de desmontaje y desmontará correctamente el sistema de archivos (no llame umountdesde el asistente de desmontaje porque umounttambién llama a los asistentes y entrará en un bucle infinito que consumirá todos los pids). Probablemente esta no sea una gran solución y systemd debería hacer lo umountque hace cuando lo llamas como usuario (lo cual en realidad no puedo entender qué hace), pero funciona para mí.

información relacionada