Montaje SSHFS que sobrevive a la desconexión

57

Estoy usando montajes SSHFS de mi computadora portátil a un servidor central.

Obviamente, el montaje SSHFS se rompe después de una desconexión más larga (por ejemplo, durante la suspensión), ya que la conexión SSH subyacente se agotó.

¿Hay alguna manera de obtener monturas SSHFS que sobrevivan a desconexiones duraderas (> 5 min) o incluso una remarcación con una IP diferente?

bene
fuente

Respuestas:

63

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

La combinación ServerAliveInterval=15,ServerAliveCountMax=3hace que los errores de E / S salgan después de un minuto de interrupción de la red. Esto es importante pero en gran medida indocumentado. Si la ServerAliveIntervalopción se deja en el valor predeterminado (por lo tanto, sin la verificación activa), los procesos que experimentan bloqueo de E / S parecen permanecer inactivos indefinidamente, incluso después de que se edita el sshfs reconnect. Considero que este es un comportamiento inútil.

En otras palabras, lo que sucede -o reconnectsin asignar ServerAliveIntervales que cualquier E / S tendrá éxito o bloqueará la aplicación indefinidamente si el ssh se vuelve a conectar debajo. Una aplicación típica queda completamente colgada como resultado. Si desea permitir que E / S devuelva un error y reanude la aplicación, necesita ServerAliveInterval=1o más.

El ServerAliveCountMax=3es el valor predeterminado de todos modos, pero me gusta especificarlo para facilitar la lectura.

kubanczyk
fuente
Esto lo hizo para mí. También puede usar un intervalo más corto, afaik no debería causar demasiados problemas y hace que todo sea más receptivo.
Manux
No leí los documentos, pero vi que otra solución decía "ServerAliveCountMax = 0" significa que seguirá intentándolo indefinidamente. ¿Supongo que su solución le da 3 reintentos después de cada falla?
PJ Brunet
@PJBrunet man 5 ssh_configpara más detalles, pero lo esencial es que cada 15 segundos ssh enviará algo así como un ping de 'mantener vivo' cada 15 segundos para asegurarse de que las computadoras aún se respondan entre sí. Si fallan tres pings consecutivos (45 segundos), vuelva a conectar.
Wyatt8740
@ Wyatt8740 Estudié esto más y leí la documentación, creo que ServerAliveCountMax=3tiene un significado diferente. Si hay una falla, intentará reconectarse 3 veces más y luego se dará por vencido. En algún momento volver a intentarlo es inútil, pero eso depende de la aplicación. Por otra parte, creo que la página del manual podría ser más específica, hay diferentes formas de interpretar la forma en que está redactada en la OMI. FWIW mi problema específico desapareció después de cambiar a ProtonVPN. Creo que también vale la pena verificar la configuración de ssh en el cliente y el servidor, tienen opciones separadas, por lo que todo lo que realmente necesita es-o reconnect
PJ Brunet
1
Esta debería ser la respuesta aceptada.
Fl0v0
52

Gracias por los consejos de autossh y autofs.

Sin embargo, para mi propósito directo, encontré una solución mucho más simple que no estaba bien documentada:

sshfs -o reconnect server:/path/to/mount
bene
fuente
¡Dulce! Esto realmente me da ganas de resolver la autenticación en escritura: serverfault.com/q/379728/96905
Jeff Burdges
12

Autossh vuelve a conectar automáticamente las sesiones ssh cuando se da cuenta de que ssh ha muerto o ha dejado de pasar el tráfico. Dado que es solo ssh automatizado, funcionará desde diferentes IP y desde suspensión (incluso si la computadora portátil se activa en un LAN diferente).

kband
fuente
Quizás Mosh sea ​​aún mejor para una sesión SSH interactiva.
Martin Ueding
@MartinUeding Busqué a Mosh pero a) no funciona con sshfs b) parece que también necesitas instalarlo en el servidor, lo que lo hace menos atractivo, IMO.
PJ Brunet
9

Una cosa que podría hacer es montar sus sistemas de archivos mediante autofs . Autofs es una herramienta que montará un sistema de archivos cuando use algo en el directorio en el que se montará el sistema de archivos. Cuando detecta actividad, el sistema de archivos está montado. Cuando no sucede nada en el sistema de archivos, se desmonta.

Aquí hay un tutorial que encontré en Google para lograr esto, allí donde hay muchos otros.

Zoredache
fuente
2

Sospecho que no, porque incluso si puede configurar su cliente SSH para que no pierda la conexión, el servidor podría estar configurado para hacerlo después de un período específico de inactividad, y no podría anular eso. Incluso si pudiera, si nunca reanuda la conexión, el servidor quedaría colgado, y con el tiempo eso podría ocasionar una pérdida significativa de recursos del servidor.

Creo que una mejor técnica es desmontar el sistema de archivos antes de suspender su computadora y volver a montarla cuando la computadora se despierte nuevamente. El mecanismo para hacerlo puede depender exactamente de cómo suspendas tu computadora: uso el kernel de tuxonice y para hacer algo como esto tengo una directiva como

Unmount /mnt/sshfs

en /etc/hibernate/common.conf.

David Z
fuente
0

La respuesta de kubanczyk es genial. Tuve un problema con la congelación de toda la interfaz debido a sshfs demasiado codiciosos, ahora para una conexión fácil iniciada por un script que se reconecta cuando se abre la computadora portátil y que no se congela cuando la conexión se vuelve más lenta, puede usar un script bash como ese (tal vez no muy seguro, pero conveniente para muchos proyectos web, por ejemplo):

#!/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
fuente