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

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

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

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

sudo umount -f /mnt/sshfs_folder

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

哦,我有 Ubuntu 14.04,但我认为这是 SSHFS 特有的。

答案1

我编写了一个 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

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

  • 如果服务器短暂消失,访问挂载的进程将挂起,直到服务器恢复
  • 如果服务器消失的时间过长(本例中约为 15 秒),则等待进程将收到 I/O 错误
  • 如果我们在服务器关闭时尝试再次访问挂载,我们会收到“传输端点未连接”错误或文件未找到(我希望只收到传输错误,但还没有弄清楚如何实现)
  • 一旦服务器恢复,我们无需干预即可再次访问挂载

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

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

答案2

更详尽的答案在这里:SSHFS-自动重新连接

简而言之,使用:

# 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

要卸载文件系统:

sudo umount ~/mnt/my_server

2022 年 7 月新增:

我不确定,但这可能很重要确保这件事双方sshfs安装了相同版本的sshfs。这意味着您正在运行的计算机您所连接的计算机应具有相同的版本。使用 检查版本sshfs -V。以下是在 Ubuntu 20.04 计算机上运行该命令的示例,例如,显示命令和输出:

$ sshfs -V
SSHFS version 3.7.1
FUSE library version 3.9.0
using FUSE kernel interface version 7.31
fusermount3 version: 3.9.0

您可以看到上面最后一行是命令的输出fusermount -V,对我来说它显示了以下内容:

$ fusermount -V
fusermount3 version: 3.9.0

我已在 Ubuntu 14.04、16.04、18.04 和 20.04 上使用过上述命令。我没有验证sshfs现在(2022 年 7 月)之前的版本,因此我无法说明我最初撰写此答案时(2017 年 8 月)拥有的版本。

相关内容