挂起后更改连接后如何防止SSHFS挂载冻结?

Fro*_*dik 10 mount suspend networking sshfs

我正在使用带有reconnect属性的SSHFS 。当我暂停笔记本并重新启动它时,它工作正常。但问题是当我把笔记本带到某个地方时 - 意味着不同的 IP 和不同的连接(可能是 Wifi 或以太网)。

挂载的 SSHFS 文件夹只会冻结,还会冻结所有使用它的应用程序。到目前为止我唯一的解决方案是使用

sudo umount -f /mnt/sshfs_folder
Run Code Online (Sandbox Code Playgroud)

这远不是很好的解决方案,但到目前为止唯一有效的解决方案。有没有办法让 SSHFS 无缝地处理这个问题,这样挂起后改变网络连接就不会引起任何问题?

哦,我有 Ubuntu 14.04,但我想这是特定于 SSHFS 的。

Luk*_*uke 7

我写了一个 shell 脚本,调用sshfs-reconnect如下:

while true
do
    sshfs -f -o ConnectTimeout=3,ConnectionAttempts=1,ServerAliveInterval=5,ServerAliveCountMax=3 $@
    echo "disconnected from $@"
    sleep 3
    echo "retry $@ ..."
done
Run Code Online (Sandbox Code Playgroud)

如果我让它在后台运行,它就会具有大多数所需的行为:

  • 如果服务器短暂消失,访问挂载的进程将挂起,直到服务器恢复
  • 如果服务器消失时间太长(本例中大约 15 秒),则等待进程将出现 I/O 错误
  • 如果我们在服务器消失时尝试再次访问挂载,我们要么收到“传输端点未连接”错误,要么收到文件未找到(我更愿意只收到传输错误,但还没有弄清楚如何来实现这一点)
  • 一旦服务器恢复,我们就可以再次访问挂载而无需干预

有关此解决方案的详细信息:

  • 我不在-o reconnect这里使用,因为我不希望 sshfs 尝试无限期地重新连接,因为这会导致等待已安装文件系统的任何进程永远挂起。相反,我让 sshfs 在一定的超时后断开连接,并让那些等待的进程正常失败。
  • 该选项ServerAliveInterval=5,ServerAliveCountMax=3表示 ssh 每 5 秒检查一次以查看远程服务器是否仍在响应。如果在 3 次检查后仍未收到响应,则会自动断开连接。因此,在此挂载上等待的任何进程最多应挂起约 15 秒。
  • 这些选项ConnectTimeout=3,ConnectionAttempts=1是必要的,因为否则 ssh 在尝试重新建立连接时将等待很长时间,如果其他进程在此期间尝试访问挂载,这将再次导致挂起。


Gab*_*les 6

更彻底的答案在这里:SSHFS - auto reconnect

简而言之,使用:

# create local folder to mount into
mkdir -p ~/mnt/my_server

# now mount your SSH File System
sshfs -o reconnect,ServerAliveInterval=15,ServerAliveCountMax=3 \
username@server_hostname:/path/on/server/to/mount ~/mnt/my_server
Run Code Online (Sandbox Code Playgroud)

要卸载文件系统:

sudo umount ~/mnt/my_server
Run Code Online (Sandbox Code Playgroud)

  • 我和@pindakaas有同样的经历——使用这个解决方案会导致任何试图访问挂载的进程无限期挂起。我想知道这是否是由于 sshfs 版本的差异造成的。 (4认同)
  • 这并不能回答问题,reconnect,ServerAliveInterval=15,ServerAliveCountMax=3 并不能解决如果远程文件系统由于某种原因不可用,sshfs 会冻结整个文件系统的问题。 (2认同)