Me gustaría montar un directorio desde una máquina remota en mi /home/stew/shared
. Después de instalar sshfs
y usar ssh-copy-id
en 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 stew
inicio sesión y desmontarlo cuando stew
cierre sesión. Una opción que funciona es utilizar un systemd .service
en 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 .mount
las 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 ~/shared
desmontar el directorio y fallar la unidad.
Preguntas:
- ¿Hay alguna razón por la que debería preferir
*.mount
unidades a*.service
unidades? - 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 *.service
es 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 *.mount
archivos 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:
- 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.
- Para que
fuse.sshfs
las unidades de montaje del usuario se detengan (desmonten), creé un asistente de montaje/sbin/umount.fuse.sshfs
como
#!/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 umount
desde el asistente de desmontaje porque umount
tambié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 umount
que hace cuando lo llamas como usuario (lo cual en realidad no puedo entender qué hace), pero funciona para mí.