Montagem SSHFS que sobrevive à desconexão

57

Estou usando montagens SSHFS do meu laptop em um servidor central.

Obviamente, a montagem SSHFS é interrompida após uma desconexão mais longa (por exemplo, durante a suspensão), pois o tempo limite da conexão SSH subjacente é excedido.

Existe uma maneira de obter montagens SSHFS sobrevivendo a desconexões duradouras (> 5 min) ou até mesmo uma re-discagem com um IP diferente?

bem
fonte

Respostas:

63

Usar -o reconnect,ServerAliveInterval=15,ServerAliveCountMax=3

A combinação ServerAliveInterval=15,ServerAliveCountMax=3faz com que os erros de E / S apareçam após um minuto de interrupção da rede. Isso é importante, mas em grande parte não documentado. Se a ServerAliveIntervalopção for deixada no padrão (portanto, sem a verificação ativa), os processos que experimentam travamento de E / S parecem adormecer indefinidamente, mesmo após o sshfs ser reconnecteditado. Eu considero isso um comportamento inútil.

Em outras palavras, o que acontece -o reconnectsem atribuir ServerAliveIntervalé que qualquer E / S terá êxito ou interromperá o aplicativo indefinidamente se o ssh se reconectar por baixo. Um aplicativo típico fica totalmente paralisado como resultado. Se você deseja permitir que a E / S retorne um erro e retome o aplicativo, você precisa ServerAliveInterval=1ou mais.

O ServerAliveCountMax=3é o padrão de qualquer maneira, mas eu gosto de especificá-lo para facilitar a leitura.

kubanczyk
fonte
Isso fez para mim. Além disso, você pode usar um intervalo mais curto, caso contrário não deve causar muitos problemas e torna tudo mais responsivo.
Manux
Não li os documentos, mas vi outra solução dizer "ServerAliveCountMax = 0" significa que continuará tentando indefinidamente. Suponho que sua solução oferece três tentativas após cada falha?
PJ Brunet
@PJBrunet man 5 ssh_configpara mais detalhes, mas o essencial é que a cada 15 segundos o ssh enviará algo como um ping 'keep-alive' a cada 15 segundos para garantir que os computadores ainda estejam respondendo uns aos outros. Se três pings consecutivos falharem (45 segundos), reconecte.
Wyatt8740
@ Wyatt8740 Estudei isso mais e li a documentação, acredito que ServerAliveCountMax=3tem um significado diferente. Se houver uma falha, ele tentará se reconectar mais três vezes e desistirá. Em algum momento, a nova tentativa é inútil, mas isso depende do aplicativo. Então, novamente, acho que a página de manual pode ser mais específica, existem diferentes maneiras de interpretar a maneira como está escrita como IMO. FWIW, meu problema específico desapareceu depois de mudar para o ProtonVPN. Eu acho que é também de configuração ssh vale a pena conferir no cliente e no servidor, eles têm opções diferentes, então tudo que você precisa realmente é-o reconnect
PJ Brunet
11
Essa deve ser a resposta aceita.
Fl0v0 11/09
52

Obrigado pelas dicas de autossh e autofs.

No entanto, para meu objetivo direto, encontrei uma solução muito mais simples que não estava tão bem documentada:

sshfs -o reconnect server:/path/to/mount
bem
fonte
Doce! Isto faz-me realmente quer resolver autenticar-on-write: serverfault.com/q/379728/96905
Jeff Burdges
12

O Autossh reconecta automaticamente as sessões ssh quando percebe que o ssh morreu ou parou de passar o tráfego. Uma vez que é apenas ssh automatizado, funcionará a partir de IPs diferentes e de suspensão (mesmo que o laptop acorde em uma LAN diferente).

kband
fonte
Talvez Mosh seja ainda melhor para uma sessão SSH interativa.
Martin Ueding
@ MartinUeding procurei o Mosh, mas a) não funciona com sshfs b) parece que você precisa instalá-lo também no servidor, o que o torna menos atraente, IMO.
PJ Brunet
9

Uma coisa que você pode fazer é montar seus sistemas de arquivos via autofs . Autofs é uma ferramenta que monta um sistema de arquivos quando você usa algo no diretório em que o sistema de arquivos será montado. Quando detecta atividade, o sistema de arquivos está montado. Quando nada está acontecendo no sistema de arquivos, ele é desmontado.

Aqui está um howto que eu encontrei no google para fazer isso, lá onde vários outros.

Zoredache
fonte
2

Eu suspeito que não exista, porque mesmo que você possa configurar seu cliente SSH para não interromper a conexão, o servidor poderá ser configurado para fazê-lo após um período especificado de inatividade e você não poderá substituí-lo. Mesmo que você pudesse, se nunca retomasse a conexão, o servidor seria interrompido e, com o tempo, isso poderia levar a um desperdício significativo de recursos do servidor.

Uma técnica melhor, eu acho, é desmontar o sistema de arquivos antes de suspender o computador e remontá-lo quando o computador acordar novamente. O mecanismo para fazer isso pode depender exatamente de como você suspende o computador - eu uso o kernel do tuxonice e, para fazer algo assim, tenho uma diretiva como

Unmount /mnt/sshfs

no /etc/hibernate/common.conf.

David Z
fonte
0

A resposta de kubanczyk é ótima. Eu tive um problema com o congelamento de toda a interface por causa de sshfs gananciosos, agora para facilitar a conexão iniciada por um script que reconecta quando o laptop é aberto e que não congela quando a conexão fica mais lenta, você pode usar um script do bash assim (talvez não muito seguro, mas conveniente para muitos projetos da web, por exemplo):

#!/bin/bash
echo PWD | sshfs USER@SERVER:/ MOUNT_PATH -o password_stdin,reconnect,ServerAliveInterval=15,ServerAliveCountMax=3 -p PORT -C -oStrictHostKeyChecking=no
if xhost >& /dev/null ; then
    pcmanfm MOUNT_PATH
fi
Timofey Bugaevsky
fonte