Монтирование SSHFS, которое переживает разрыв соединения

57

Я использую SSHFS- монтирования с моего ноутбука на центральный сервер.

Очевидно, что монтирование SSHFS прерывается после более длительного отключения (например, во время приостановки), что приводит к превышению времени ожидания основного соединения SSH.

Есть ли способ получить монтирование SSHFS после длительных отключений (> 5 минут) или даже повторного набора с другим IP?

Bene
источник

Ответы:

63

использование -o reconnect,ServerAliveInterval=15,ServerAliveCountMax=3

Комбинация ServerAliveInterval=15,ServerAliveCountMax=3вызывает появление ошибок ввода-вывода после одной минуты простоя сети. Это важно, но в основном без документов. Если ServerAliveIntervalопция оставлена ​​по умолчанию (то есть без проверки живого состояния), процессы, которые испытывают зависание ввода-вывода, кажутся спящими бесконечно, даже после того, как sshfs получает reconnect'ed'. Я считаю это бесполезным поведением.

Другими словами, то, что происходит -o reconnectбез назначения, ServerAliveIntervalзаключается в том, что любой ввод-вывод будет либо успешным, либо зависнет на неопределенное время, если ssh переподключится внизу. Типичное приложение становится полностью зависшим в результате. Если вы хотите разрешить I / O вернуть ошибку и возобновить приложение, вам нужно ServerAliveInterval=1или больше.

В ServerAliveCountMax=3любом случае это значение по умолчанию, но мне нравится указывать его для удобства чтения.

kubanczyk
источник
Это сделало это для меня. Также вы можете использовать более короткий интервал, ведь это не должно вызывать особых проблем и делает все это более отзывчивым.
Manux
Я не читал документы, но видел, что другое решение, говорящее «ServerAliveCountMax = 0», означает, что оно будет пытаться бесконечно долго. Я полагаю, ваше решение дает 3 повторных попыток после каждой ошибки?
PJ Brunet
@PJBrunet man 5 ssh_configдля более подробной информации, но суть в том, что каждые 15 секунд ssh будет отправлять пинг «keep-alive» каждые 15 секунд, чтобы убедиться, что компьютеры все еще реагируют друг на друга. Если три последовательных эхо-запроса не выполняются (45 секунд), восстановите соединение.
Wyatt8740
@ Wyatt8740 Я изучил это больше и прочитал документацию, я думаю, ServerAliveCountMax=3что это имеет другое значение. Если произошел сбой, он попытается подключиться еще 3 раза и затем сдастся. В какой-то момент повторная попытка бесполезна, но это зависит от применения. Опять же, я думаю, что справочная страница может быть более конкретной, есть разные способы интерпретации того, как она сформулирована в IMO. FWIW моя конкретная проблема ушла после перехода на ProtonVPN. Я думаю, что также стоит проверить конфигурацию ssh на клиенте и сервере, у них есть отдельные опции, так что все, что вам действительно нужно,-o reconnect
PJ Brunet
1
Это должен быть принятый ответ.
Fl0v0
52

Спасибо за советы autossh и autofs.

Однако для моей непосредственной цели я нашел гораздо более простое решение, которое не было так хорошо задокументировано:

sshfs -o reconnect server:/path/to/mount
Bene
источник
Сладкий! Это заставляет меня очень хотеть разобраться в аутентификации при записи: serverfault.com/q/379728/96905
Джефф Берджес
12

Autossh автоматически переподключается к сеансам ssh, когда обнаруживает, что ssh умер или прекратил пропускать трафик. Так как это просто автоматизированный ssh, он будет работать с разных IP-адресов и с приостановки (даже если ноутбук просыпается на другой локальной сети).

kband
источник
Возможно, Mosh даже лучше для интерактивной сессии SSH.
Мартин Уединг
@MartinUeding Я посмотрел Mosh, но а) не работает с sshfs б) кажется, что вам нужно установить его и на сервере, что делает его менее привлекательным, IMO.
PJ Brunet
9

Одна вещь, которую вы могли бы сделать, это монтировать ваши файловые системы через autofs . Autofs - это инструмент, который монтирует файловую систему, когда вы используете что-то в каталоге, в который будет монтироваться файловая система. Когда он обнаруживает активность, файловая система монтируется. Когда в файловой системе ничего не происходит, она отключается.

Вот HOWTO я нашел на Google , чтобы достигнуть этого, там , где несколько других.

Zoredache
источник
2

Я подозреваю, что нет, потому что даже если вы можете настроить свой SSH-клиент так, чтобы он не прерывал соединение, сервер может быть настроен на это после определенного периода бездействия, и вы не сможете переопределить это. Даже если бы вы могли, если вы никогда не возобновите соединение, сервер останется зависшим, и со временем это может привести к значительному расходу ресурсов сервера.

Я думаю, что более эффективный способ - отключить файловую систему перед тем, как приостановить работу компьютера, и перемонтировать ее, когда компьютер снова проснется. Механизм для этого может зависеть от того, как именно вы зависаете на своем компьютере - я использую ядро ​​tuxonice, и чтобы сделать что-то подобное, у меня есть такая директива, как

Unmount /mnt/sshfs

в /etc/hibernate/common.conf.

Дэвид З
источник
0

Ответ kubanczyk велик. У меня была проблема с зависанием всего интерфейса из-за слишком жадных sshfs, теперь для легкого соединения, запускаемого скриптом, который переподключается при открытии ноутбука, и который не зависает при замедлении соединения, вы можете использовать скрипт bash вот так (возможно не очень безопасный, но удобный для многих веб-проектов, например):

#!/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
Тимофей Бугаевский
источник