我正在使用从笔记本电脑到中央服务器的SSHFS挂载。
显然,SSHFS 挂载在较长时间断开后(例如在挂起期间)被破坏,导致底层 SSH 连接超时。
有没有办法让 SSHFS 挂载在长期断开连接(> 5 分钟)甚至使用不同 IP 的重新拨号中幸存下来?
我正在使用从笔记本电脑到中央服务器的SSHFS挂载。
显然,SSHFS 挂载在较长时间断开后(例如在挂起期间)被破坏,导致底层 SSH 连接超时。
有没有办法让 SSHFS 挂载在长期断开连接(> 5 分钟)甚至使用不同 IP 的重新拨号中幸存下来?
利用
-o reconnect,ServerAliveInterval=15,ServerAliveCountMax=3
这种组合
ServerAliveInterval=15,ServerAliveCountMax=3
会导致 I/O 错误在网络中断一分钟后弹出。这很重要,但在很大程度上没有记录。如果ServerAliveInterval
选项默认保留(因此没有活动检查),经历 I/O 挂起的进程似乎无限期地休眠,即使在 sshfs 被reconnect
'ed 之后也是如此。我认为这是一种无用的行为。换句话说,
-o reconnect
如果没有分配ServerAliveInterval
,任何 I/O 要么成功,要么如果 ssh 在下面重新连接,则无限期挂起应用程序。结果,一个典型的应用程序完全挂起。如果您希望允许 I/O 返回错误并恢复应用程序,则需要ServerAliveInterval=1
或更高。无论如何,这
ServerAliveCountMax=3
是默认值,但我喜欢指定它以提高可读性。感谢 autossh 和 autofs 的提示。
但是,出于我的直接目的,我发现了一个更简单的解决方案,但没有很好地记录:
当Autossh 发现ssh 已死亡或停止通过流量时,它会自动重新连接 ssh 会话。由于它只是自动 ssh,它可以在不同的 IP 和挂起状态下工作(即使笔记本电脑在不同的局域网上唤醒)。
您可以做的一件事是通过autofs挂载您的文件系统。Autofs 是一个工具,当您使用文件系统将被挂载到的目录中的某些内容时,它将挂载文件系统。当它检测到活动时,文件系统就会被挂载。当文件系统上什么都没有发生时,它会被卸载。
这是我在谷歌上找到的一个方法来完成这个,还有其他几个。
我怀疑没有,因为即使您可以将 SSH 客户端配置为不断开连接,服务器也可能会在指定的不活动时间段后配置为这样做,您将无法覆盖它。即使你可以,如果你从不恢复连接,服务器就会挂起,随着时间的推移,这可能会导致服务器资源的大量浪费。
我认为,一种更好的技术是在挂起计算机之前卸载文件系统,并在计算机再次唤醒时重新挂载它。这样做的机制可能取决于您暂停计算机的确切方式 - 我使用 tuxonice 内核并执行类似的操作,我有一个类似的指令
在
/etc/hibernate/common.conf
.kubanczyk的答案很棒。由于过于贪婪的 sshfs,我在冻结整个界面时遇到了问题,现在为了通过一个脚本启动连接,该脚本在打开笔记本电脑时重新连接并且在连接变慢时不会冻结,您可以使用这样的 bash 脚本(也许不是很安全,但对于许多网络项目来说很方便,例如):