Как предотвратить зависание монтирования SSHFS после изменения соединения после приостановки?

Я использую SSHFS с reconnect приписывать. Он работает нормально, когда я приостанавливаю ноутбук и запускаю его снова. Но проблема в том, что когда я беру ноутбук куда-то, имея в виду другой IP и другое соединение (может быть, Wifi или Ethernet).

Установленная папка SSHFS просто зависает, а также замораживает все приложения, которые ее использовали. И единственное решение, которое у меня есть, это использовать

sudo umount -f /mnt/sshfs_folder

Которое еще далеко от того, чтобы быть хорошим решением, но пока единственное, которое работает. Есть ли способ, как заставить SSHFS, казалось бы, позаботиться об этой проблеме, чтобы смена сетевого подключения после приостановки не вызывала проблем?

Да, и у меня Ubuntu 14.04, но я полагаю, что это специфично для SSHFS.

1 ответ

Я написал сценарий оболочки под названием sshfs-reconnect со следующим:

while true
do
    sshfs -f -o ConnectTimeout=3,ConnectionAttempts=1,ServerAliveInterval=5,ServerAliveCountMax=3 $@
    echo "disconnected from $@"
    sleep 3
    echo "retry $@ ..."
done

Если я оставлю это в фоновом режиме, у него будет большинство желаемых поведений:

  • Если сервер ненадолго исчезнет, ​​процессы, обращающиеся к монтированию, будут зависать, пока сервер не вернется.
  • Если сервер исчезает слишком долго (в данном случае около 15 секунд), ожидающие процессы получат ошибку ввода-вывода.
  • Если мы попытаемся снова получить доступ к монтированию, пока сервер отсутствует, мы либо получим ошибку "конечная точка транспорта не подключена", либо файл не найден (я бы предпочел получить только ошибку транспорта, но не понял, как чтобы добиться этого)
  • Как только сервер вернется, мы снова сможем получить доступ к монтированию без какого-либо вмешательства.

Подробности об этом решении:

  • я не пользуюсь -o reconnectздесь, потому что я не хочу, чтобы sshfs пыталась повторно подключиться бесконечно, поскольку это приводит к тому, что любой процесс, ожидающий в смонтированной файловой системе, зависает навсегда. Вместо этого я позволяю sshfs отключаться по истечении определенного времени ожидания и позволяю этим ожидающим процессам корректно завершаться сбоем.
  • Варианты ServerAliveInterval=5,ServerAliveCountMax=3скажем, что ssh каждые 5 секунд проверяет, отвечает ли еще удаленный сервер. Если он не получает ответа после 3 таких проверок, он автоматически отключается. Таким образом, любой процесс, ожидающий этого монтирования, должен зависнуть не более 15 секунд.
  • Варианты ConnectTimeout=3,ConnectionAttempts=1 необходимы, потому что в противном случае ssh будет ждать очень долго при попытке восстановить соединение, что снова приведет к зависанию других процессов, если они попытаются получить доступ к монтированию в это время.

Более подробный ответ здесь: SSHFS - автоматическое переподключение.

Короче говоря, используйте:

sshfs -o reconnect,ServerAliveInterval=15,ServerAliveCountMax=3 server:/path/to/mount`
Другие вопросы по тегам