我正在使用带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 月)拥有的版本。