Gostaria de montar um diretório de uma máquina remota no meu arquivo /home/stew/shared
. Depois de instalar sshfs
e usar ssh-copy-id
minha 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 stew
fazer login e desmontá-lo ao stew
sair. Uma opção funcional é usar um systemd .service
no 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.service
também funciona muito bem! Mas estou me perguntando se .mount
as 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 ~/shared
desmontar o diretório e falhar na unidade.
Questões:
- Existe uma razão pela qual eu deveria preferir
*.mount
unidades em vez de*.service
unidades? - 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 *.mount
arquivos 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:
- 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.
- Para fazer com que
fuse.sshfs
as unidades de montagem do usuário parem (desmontem), criei um auxiliar umount em/sbin/umount.fuse.sshfs
as
#!/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 umount
do auxiliar umount porque umount
també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 umount
faz quando você o chama como usuário (o que não consigo descobrir o que faz), mas funciona para mim.