Montaż SSHFS, który przetrwa rozłączenie

56

Używam mocowań SSHFS z laptopa do centralnego serwera.

Oczywiście podłączenie SSHFS zostaje zerwane po dłuższym rozłączeniu (np. Podczas zawieszenia), ponieważ przekroczono limit czasu dla połączenia SSH.

Czy istnieje sposób na to, aby wierzchowce SSHFS przetrwały długotrwałe rozłączenia (> 5 min), a nawet ponownie wybrały numer telefonu z innym adresem IP?

bene
źródło

Odpowiedzi:

62

Posługiwać się -o reconnect,ServerAliveInterval=15,ServerAliveCountMax=3

Ta kombinacja ServerAliveInterval=15,ServerAliveCountMax=3powoduje wyskakiwanie błędów we / wy po minucie przerwy w sieci. Jest to ważne, ale w dużej mierze nieudokumentowane. Jeśli ServerAliveIntervalopcja pozostanie domyślnie (więc bez sprawdzania aktywności), procesy, które zawieszają się we / wy wydają się spać w nieskończoność, nawet po sshfs reconnect. Uważam to za bezużyteczne zachowanie.

Innymi słowy, to, co dzieje się dalej -o reconnectbez przypisywania, ServerAliveIntervalpolega na tym, że dowolne we / wy albo zakończy się sukcesem, albo zawiesi aplikację na czas nieokreślony, jeśli ssh ponownie się połączy. W rezultacie typowa aplikacja zostaje całkowicie zawieszona. Jeśli chcesz zezwolić I / O na zwrócenie błędu i wznowienie aplikacji, potrzebujesz ServerAliveInterval=1lub więcej.

Jest ServerAliveCountMax=3to i tak domyślna wartość, ale chcę ją określić dla czytelności.

kubańczyk
źródło
To mi się przydało. Możesz także użyć krótszego interwału, ponieważ nie powinno to powodować zbyt dużych problemów i sprawia, że ​​cała sprawa jest bardziej responsywna.
Manux,
Nie czytałem dokumentów, ale widziałem inne rozwiązanie, w którym „ServerAliveCountMax = 0” oznacza, że ​​będzie próbował bez końca. Zakładam, że Twoje rozwiązanie daje 3 próby po każdej awarii?
PJ Brunet
@PJBrunet, man 5 ssh_configaby uzyskać więcej szczegółów, ale sedno jest takie, że co 15 sekund ssh będzie wysyłał coś w rodzaju „utrzymywania przy życiu” ping co 15 sekund, aby upewnić się, że komputery nadal reagują na siebie. Jeśli trzy kolejne pingi zawiodą (45 sekund), podłącz ponownie.
Wyatt8740,
@ Wyatt8740 Przestudiowałem to bardziej i przeczytałem dokumentację, uważam, że ServerAliveCountMax=3ma inne znaczenie. Jeśli wystąpi awaria, spróbuje połączyć się jeszcze 3 razy, a następnie zrezygnuje. W pewnym momencie ponawianie jest daremne, ale zależy to od zastosowania. Z drugiej strony, myślę, że strona podręcznika może być bardziej szczegółowa, istnieją różne sposoby interpretacji sposobu, w jaki została sformułowana jako IMO. FWIW mój konkretny problem zniknął po przejściu na ProtonVPN. Myślę, że warto również sprawdzić konfigurację ssh na kliencie i serwerze, mają one osobne opcje, więc wszystko, czego naprawdę potrzebujesz, to-o reconnect
PJ Brunet
1
To powinna być zaakceptowana odpowiedź.
Fl0v0
52

Dzięki za porady autossh i autofs.

Jednak dla mojego bezpośredniego celu znalazłem znacznie prostsze rozwiązanie, które nie zostało tak dobrze udokumentowane:

sshfs -o reconnect server:/path/to/mount
bene
źródło
Słodkie! To sprawia, że ​​naprawdę chcę uporządkować uwierzytelnianie przy zapisie: serverfault.com/q/379728/96905
Jeff Burdges
12

Autossh automatycznie łączy sesje ssh, gdy zauważy, że ssh zmarł lub przestał przekazywać ruch. Ponieważ jest to po prostu zautomatyzowany ssh, będzie działał z różnych adresów IP i z zawieszenia (nawet jeśli laptop budzi się na innej sieci LAN).

kband
źródło
Być może Mosh jest jeszcze lepszy do interaktywnej sesji SSH.
Martin Ueding
@MartinUeding Spojrzałem na Mosha, ale a) nie działa z sshfs b) wygląda na to, że musisz go również zainstalować na serwerze, co czyni go mniej atrakcyjnym, IMO.
PJ Brunet,
9

Jedną rzeczą, którą możesz zrobić, to zamontować systemy plików za pomocą autofs . Autofs to narzędzie, które zamontuje system plików, gdy chcesz użyć czegoś w katalogu, do którego system plików zostanie podłączony. Po wykryciu aktywności system plików jest montowany. Kiedy nic się nie dzieje w systemie plików, jest ono odmontowane.

Oto howto , które znalazłem w google, aby to osiągnąć, tam, gdzie kilka innych.

Zoredache
źródło
2

Podejrzewam, że tak nie jest, ponieważ nawet jeśli możesz skonfigurować klienta SSH, aby nie przerywał połączenia, serwer może być skonfigurowany tak, aby robił to po określonym czasie bezczynności i nie będziesz w stanie tego zastąpić. Nawet jeśli możesz, jeśli nigdy nie wznowisz połączenia, serwer pozostanie zawieszony, az czasem może to doprowadzić do znacznego marnowania zasobów serwera.

Myślę, że lepszą techniką jest odmontowanie systemu plików przed zawieszeniem komputera i ponowne zamontowanie go, gdy komputer ponownie się obudzi. Mechanizm tego może zależeć od tego, w jaki sposób zawieszasz komputer - używam jądra smokingu i robię coś takiego, mam dyrektywę taką jak

Unmount /mnt/sshfs

w /etc/hibernate/common.conf.

David Z
źródło
0

Odpowiedź kubanczyk jest wielki. Miałem problem z zawieszeniem całego interfejsu z powodu zbyt chciwego sshfs, teraz dla łatwego połączenia rozpoczętego przez skrypt, który łączy się ponownie po otwarciu laptopa i który nie zawiesza się, gdy połączenie się spowalnia, możesz użyć takiego skryptu bash (może niezbyt bezpieczne, ale wygodne np. w przypadku wielu projektów internetowych):

#!/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
źródło