SSHFS-Mount, der die Trennung überlebt


56

Ich verwende SSHFS- Mounts von meinem Laptop zu einem zentralen Server.

Offensichtlich ist der SSHFS-Mount nach einer längeren Unterbrechung (z. B. während des Suspendierens) unterbrochen, was zu einem Timeout der zugrunde liegenden SSH-Verbindung führt.

Gibt es eine Möglichkeit, SSHFS-Mounts zu erhalten, die lang anhaltende Verbindungsabbrüche (> 5 Minuten) oder sogar eine erneute Einwahl mit einer anderen IP-Adresse überstehen?

Antworten:


62

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

Die Kombination führt dazu, ServerAliveInterval=15,ServerAliveCountMax=3dass die E / A-Fehler nach einer Minute Netzwerkausfall angezeigt werden. Dies ist wichtig, aber weitgehend undokumentiert. Wenn die ServerAliveIntervalOption standardmäßig aktiviert ist (also ohne die Aktivitätsprüfung), scheinen Prozesse, bei denen E / A-Hänge auftreten, unbegrenzt zu ruhen, selbst nachdem der sshfs-Befehl ausgeführt wurde reconnect. Ich halte das für ein nutzloses Verhalten.

Mit anderen Worten, was -o reconnectohne Zuweisung geschieht , ServerAliveIntervalist, dass jede E / A erfolgreich ist oder die Anwendung auf unbestimmte Zeit hängt, wenn die SSH-Verbindung wiederhergestellt wird. Eine typische Anwendung hängt sich dadurch vollständig auf. Wenn Sie zulassen möchten, dass E / A einen Fehler zurückgibt und die Anwendung fortsetzt, benötigen Sie ServerAliveInterval=1oder höher.

Die ServerAliveCountMax=3ist sowieso die Standardeinstellung, aber ich möchte sie aus Gründen der Lesbarkeit angeben.


Das hat es für mich gemacht. Sie können auch ein kürzeres Intervall verwenden, es sollte nicht zu viel Ärger verursachen und das Ganze reaktionsschneller machen.
Manux

Ich habe die Dokumente nicht gelesen, aber ich habe eine andere Lösung gesehen: "ServerAliveCountMax = 0" bedeutet, dass es auf unbestimmte Zeit versucht wird. Ich nehme an, Ihre Lösung gibt es 3 Wiederholungen nach jedem Fehler?
PJ Brunet

@PJBrunet man 5 ssh_configfür weitere Details, aber das Wesentliche ist, dass ssh alle 15 Sekunden so etwas wie einen "Keep-Alive" -Ping alle 15 Sekunden sendet, um sicherzustellen, dass die Computer immer noch aufeinander reagieren. Wenn drei aufeinanderfolgende Pings fehlschlagen (45 Sekunden), stellen Sie die Verbindung wieder her.
Wyatt8740

@ Wyatt8740 ich habe das genauer studiert und die dokumentation gelesen, ich glaube ServerAliveCountMax=3hat eine andere bedeutung. Wenn ein Fehler auftritt, wird versucht, die Verbindung noch dreimal wiederherzustellen, und es wird aufgegeben. Irgendwann ist ein erneuter Versuch sinnlos, aber das hängt von der Anwendung ab. Andererseits denke ich, dass die Manpage spezifischer sein könnte. Es gibt verschiedene Möglichkeiten, die IMO-Formulierung zu interpretieren. FWIW mein spezifisches Problem verschwand nach dem Wechsel zu ProtonVPN. Ich denke, es lohnt sich auch, die SSH-Konfiguration auf dem Client und dem Server zu überprüfen. Sie haben separate Optionen. Alles, was Sie wirklich brauchen, ist-o reconnect
PJ Brunet,

1
Dies sollte die akzeptierte Antwort sein.
11.

52

Danke für die Tipps von autossh und autofs.

Für meinen direkten Zweck fand ich jedoch eine viel einfachere Lösung, die nicht so gut dokumentiert war:

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

Süss! Das bringt mich wirklich dazu, die Authentifizierung beim Schreiben zu klären
Jeff Burdges,

12

Autossh stellt die Verbindung zu SSH- Sitzungen automatisch wieder her, wenn es feststellt, dass SSH abgestorben ist oder keinen Datenverkehr mehr durchläuft. Da es sich nur um automatisiertes SSH handelt, funktioniert es von verschiedenen IP-Adressen und vom Suspend-Modus (auch wenn der Laptop in einem anderen LAN aufwacht).


Vielleicht ist Mosh sogar besser für eine interaktive SSH-Sitzung.
Martin Ueding

@MartinUeding Ich habe nachgeschlagen, Mosh, aber a) funktioniert nicht mit sshfs. B) Sie müssen es anscheinend auch auf dem Server installieren.
PJ Brunet

9

Eine Sache, die Sie tun könnten, ist, Ihre Dateisysteme über autofs einzuhängen . Autofs ist ein Tool, das ein Dateisystem bereitstellt, wenn Sie etwas in dem Verzeichnis verwenden, in das das Dateisystem bereitgestellt wird. Wenn Aktivität erkannt wird, wird das Dateisystem bereitgestellt. Wenn auf dem Dateisystem nichts passiert, ist es nicht gemountet.

Hier ist eine Anleitung, die ich auf Google gefunden habe, um dies zu erreichen, wo es mehrere andere gibt.


2

Ich vermute, dass dies nicht der Fall ist, denn selbst wenn Sie Ihren SSH-Client so konfigurieren können, dass die Verbindung nicht getrennt wird, wird der Server möglicherweise nach einer bestimmten Zeit der Inaktivität so konfiguriert, dass Sie dies nicht überschreiben können. Selbst wenn Sie dies könnten, würde der Server hängen bleiben, wenn Sie die Verbindung nie wieder herstellen, und dies könnte im Laufe der Zeit zu einer erheblichen Verschwendung von Serverressourcen führen.

Ich denke, eine bessere Technik ist es, das Dateisystem zu deaktivieren, bevor Sie Ihren Computer anhalten, und es erneut anzuhängen, wenn der Computer wieder aufwacht. Der Mechanismus dafür hängt möglicherweise genau davon ab, wie Sie Ihren Computer anhalten. Ich verwende den tuxonice-Kernel und habe dafür eine Direktive wie

Unmount /mnt/sshfs

in /etc/hibernate/common.conf.


0

Die Antwort von Kubanczyk ist großartig. Ich hatte ein Problem mit dem Einfrieren der gesamten Benutzeroberfläche, weil sshfs zu gierig ist. Jetzt wird die Verbindung für eine einfache Verbindung durch ein Skript hergestellt, das beim Öffnen des Laptops wieder hergestellt wird und nicht einfriert, wenn die Verbindung langsamer wird Nicht sehr sicher, aber praktisch für viele Webprojekte, zum Beispiel:

#!/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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.