Usando o systemd para montar sistemas de arquivos remotos no barramento do usuário

Usando o systemd para montar sistemas de arquivos remotos no barramento do usuário

Gostaria de montar um diretório de uma máquina remota no meu arquivo /home/stew/shared. Depois de instalar sshfse usar ssh-copy-idminha máquina remota, posso fazer isso:

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

e depois desmontar com

stew@stewbian:~$ umount ~/shared

ou

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

Funciona muito bem, mas gostaria de montá-lo automaticamente ao stewfazer login e desmontá-lo ao stewsair. Uma opção funcional é usar um systemd .serviceno barramento do usuário:

# ~/.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.servicetambém funciona muito bem! Mas estou me perguntando se .mountas unidades seriam mais robustas.


Eu tentei usar uma unidade de montagem assim:

# ~/.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 unidade de montagem funciona muito bem, mas interrompê-la causa o seguinte:

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

Posso $ umount ~/shareddesmontar o diretório e falhar na unidade.


Questões:

  1. Existe uma razão pela qual eu deveria preferir *.mountunidades em vez de *.serviceunidades?
  2. Se eu realmente deveria usar *.mount, existe algum truque para fazer isso funcionar no barramento do usuário ou preciso ir ao barramento do sistema e descobrir como fazer a montagem lenta e definir UIDs e GIDs manualmente?

Uma das coisas boas de usar o *.serviceé que posso adicionar esse serviço ao skel, para que cada usuário monte automaticamente seus próprios diretórios compartilhados privados, que são efetivamente sincronizados entre todas as máquinas da casa. Os *.mountarquivos precisam do nome de usuário no nome do arquivo para acessar a página inicial correta.

Responder1

Eu tenho o mesmo problema no Ubuntu 21.04 com systemd 246.6 - quando você tenta desmontar uma unidade de montagem, o systemd primeiro tenta encontrar um auxiliar umount em /sbin/umount.<type>(ou seja, para sshfs seria /sbin/umount.fuse.sshfs), e quando isso falhar - ele chamará umount2(<where>)- e isso falhará quando for executado pelo systemd do usuário.

Não sei por que isso funciona para @fra-san - acho que eles podem ter um auxiliar de desmontagem.

Quanto a essas questões:

  1. Você pode fazer qualquer coisa com uma unidade de serviço, como faria com um script de inicialização no estilo SysV, mas a ideia do systemd é que entendamos as tarefas comuns de gerenciamento do sistema e forneçamos a sintaxe descritiva mínima para alcançar o que você precisa sem complicar demais as coisas ( isso torna mais difícil de manter). Se você puder usar uma unidade de montagem para montar sistemas de arquivos, é preferível basicamente escrever um script. É claro que a infraestrutura deve ser capaz de suportar o que você precisa fazer e embora o status atual das unidades de montagem do usuário seja muito melhor do que era há alguns anos, no Ubuntu 21.04 - ainda não está 100% disponível para o arquivo FUSE sistemas.
  2. Para fazer com que fuse.sshfsas unidades de montagem do usuário parem (desmontem), criei um auxiliar umount em /sbin/umount.fuse.sshfsas
#!/bin/sh
/bin/fusermount -u "$1"

então parar a unidade de montagem funciona bem - o systemd chamará o auxiliar umount e desmontará corretamente o sistema de arquivos (não chame umountdo auxiliar umount porque umounttambém chama auxiliares e você entrará em um loop infinito que consumirá todos os pids). Provavelmente esta não é uma ótima solução e o systemd deve fazer o que umountfaz quando você o chama como usuário (o que não consigo descobrir o que faz), mas funciona para mim.

informação relacionada