Montatura SSHFS che sopravvive alla disconnessione


57

Sto usando i montaggi SSHFS dal mio laptop a un server centrale.

Ovviamente, il montaggio SSHFS viene interrotto dopo una disconnessione più lunga (ad es. Durante la sospensione), causando il timeout della connessione SSH sottostante.

Esiste un modo per ottenere supporti SSHFS che sopravvivono a disconnessioni di lunga durata (> 5 min) o persino a una ricomposizione con un IP diverso?

Risposte:


63

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

La combinazione ServerAliveInterval=15,ServerAliveCountMax=3provoca la comparsa degli errori I / O dopo un minuto di interruzione della rete. Questo è importante ma ampiamente non documentato. Se l' ServerAliveIntervalopzione è lasciata di default (quindi senza il controllo attivo), i processi con esperienza di blocco I / O sembrano dormire indefinitamente, anche dopo che "sshfs reconnect" è stato modificato. Lo considero un comportamento inutile.

In altre parole, ciò che accade -o reconnectsenza assegnare ServerAliveIntervalè che qualsiasi I / O avrà esito positivo o bloccherà l'applicazione indefinitamente se l'ssh si riconnette al di sotto. Di conseguenza, un'applicazione tipica si blocca completamente. Se si desidera consentire l'I / O per restituire un errore e riprendere l'applicazione, è necessario ServerAliveInterval=1o maggiore.

Il ServerAliveCountMax=3valore predefinito è comunque, ma mi piace specificarlo per la leggibilità.


Questo l'ha fatto per me. Inoltre puoi usare un intervallo più breve, ma non dovrebbe causare troppi problemi e rendere il tutto più reattivo.
Manux,

Non ho letto i documenti, ma ho visto un'altra soluzione dire "ServerAliveCountMax = 0" significa che continuerà a provare indefinitamente. Presumo che la tua soluzione dia 3 tentativi dopo ogni errore?
PJ Brunet,

@PJBrunet man 5 ssh_configper maggiori dettagli, ma l'essenza è che ogni 15 secondi ssh invierà qualcosa come un ping 'keep-alive' ogni 15 secondi per assicurarsi che i computer si stiano ancora rispondendo. Se tre ping consecutivi falliscono (45 secondi), riconnettersi.
Wyatt8740,

@ Wyatt8740 Ho studiato di più e letto la documentazione, credo ServerAliveCountMax=3abbia un significato diverso. Se si verifica un errore, proverà a ricollegarsi altre 3 volte e poi si arrenderà. A un certo punto riprovare è inutile, ma dipende dall'applicazione. Inoltre, penso che la pagina man possa essere più specifica, ci sono diversi modi per interpretare il modo in cui è scritta IMO. FWIW il mio problema specifico è andato via dopo essere passato a ProtonVPN. Penso che valga la pena anche controllare la configurazione di ssh sul client e sul server, hanno opzioni separate, quindi tutto ciò di cui hai davvero bisogno è-o reconnect
PJ Brunet,

1
Questa dovrebbe essere la risposta accettata.
Fl0v0

52

Grazie per i suggerimenti di autossh e autofs.

Tuttavia, per il mio scopo diretto ho trovato una soluzione molto più semplice che non è stata documentata così bene:

sshfs -o reconnect server:/path/to/mount

Dolce! Questo mi fa venir voglia di risolvere l'autenticazione in scrittura: serverfault.com/q/379728/96905
Jeff Burdges,

12

Autossh ricollega automaticamente le sessioni ssh quando rileva che ssh è morto o ha smesso di passare il traffico. Dal momento che è solo automatizzato ssh, funzionerà da IP diversi e da sospendere (anche se il laptop si sveglia su una lan diversa).


Forse Mosh è ancora meglio per una sessione SSH interattiva.
Martin Ueding,

@MartinUeding Ho cercato Mosh ma a) non funziona con sshfs b) sembra che sia necessario installarlo anche sul server, il che lo rende meno attraente, IMO.
PJ Brunet,

9

Una cosa che potresti fare è montare i tuoi filesystem tramite autofs . Autofs è uno strumento che monterà un filesystem quando si usa qualcosa nella directory su cui verrà montato il filesystem. Quando rileva attività viene montato il filesystem. Quando non accade nulla sul filesystem viene smontato.

Ecco un howto che ho trovato su Google per ottenere questo risultato, là dove molti altri.


2

Sospetto che non lo sia, perché anche se puoi configurare il tuo client SSH in modo che non lasci cadere la connessione, il server potrebbe essere configurato per farlo dopo un determinato periodo di inattività, e non saresti in grado di sovrascriverlo. Anche se tu potessi, se non riprendessi mai la connessione, il server rimarrebbe sospeso e, nel tempo, ciò potrebbe comportare un significativo spreco di risorse del server.

Una tecnica migliore, credo, è quella di smontare il filesystem prima di sospendere il tuo computer e rimontarlo quando il computer si risveglia. Il meccanismo per farlo potrebbe dipendere esattamente da come sospendi il tuo computer: uso il kernel tuxonice e per fare qualcosa del genere ho una direttiva come

Unmount /mnt/sshfs

in /etc/hibernate/common.conf.


0

La risposta di kubanczyk è fantastica. Ho avuto un problema con il congelamento dell'intera interfaccia a causa di sshfs troppo avidi, ora per una facile connessione avviata da uno script che si riconnette quando il laptop viene aperto e che non si blocca quando la connessione diventa più lenta, puoi usare uno script bash come quello (forse non molto sicuro, ma conveniente per molti progetti web per esempio):

#!/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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.