Bal*_*cre 6 vim ssh scp sftp sshfs
我的大学提供了对学生大学帐户的 ssh 访问,我只是设置了一个 sshfs 来访问我远程帐户上的一些文件夹。
我在本地机器上运行 pop_os 并使用 systemd automount 和以下选项: noauto,x-systemd.automount,_netdev,user,idmap=user,follow_symlinks,workaround=rename,IdentityFile=/home/me/.ssh/identityfile,allow_other,default_permissions,uid=1000,gid=1000,ServerAliveInterval=15
Automount 工作正常,我可以浏览我的远程文件夹,但是我在替换文件和递归复制文件夹到远程文件夹时遇到了一些麻烦。
但是每次我尝试使用 vim 在远程 fs 上编辑文件时,编辑器都会在打开文件之前挂起 60 秒(非常准确,我猜这与连接超时参数有关)。当文件最终打开时,我收到错误说明E297: Write error in swap file并E72: Close error on swap file从 vim关闭。
但有时(特别是在我重新加载 dameon 并在更新 /etc/fstab 中的选项后重新启动自动挂载服务之后,文件会立即打开,没有错误。
我在 sshfs 上打开文件时运行了 strace,这里是问题似乎发生的日志示例:
0.000032 openat(AT_FDCWD, ".../myremotefile.c", O_RDONLY) = 3
0.041890 readlink(".../myremotefile.c", 0x7ffd99b19540, 4095) = -1 EINVAL (Invalid argument)
0.000302 openat(AT_FDCWD, ".../.myremotefile.c.swp", O_RDONLY) = -1 ENOENT (No such file or directory)
0.029883 openat(AT_FDCWD, ".../.myremotefile.c.swp", O_RDWR|O_CREAT|O_EXCL, 0600) = 4
0.103207 openat(AT_FDCWD, ".../.myremotefile.c.swx", O_RDONLY) = -1 ENOENT (No such file or directory)
0.074409 openat(AT_FDCWD, ".../.myremotefile.c.swx", O_RDWR|O_CREAT|O_EXCL, 0600) = 5
0.116541 fstat(4, {st_mode=S_IFREG|0600, st_size=0, ...}) = 0
0.000419 fstat(5, {st_mode=S_IFREG|0600, st_size=0, ...}) = 0
0.000318 close(5) = 0
0.000268 unlink(".../.myremotefile.c.swx") = 0
0.075053 close(4) = 0
0.000448 unlink(".../.myremotefile.c.swp") = 0
0.061916 stat(".../.myremotefile.c.swp", 0x7ffd99b1a4d0) = -1 ENOENT (No such file or directory)
0.077126 lstat(".../.myremotefile.c.swp", 0x7ffd99b1a660) = -1 ENOENT (No such file or directory)
0.041249 openat(AT_FDCWD, ".", O_RDONLY) = 4
0.000218 fchdir(4) = 0
0.000197 chdir(".../myremotefolder") = 0
0.000086 getcwd("/home/myhomefolder/.../myremotefolder", 4096) = 34
0.000029 fchdir(4) = 0
0.000025 close(4) = 0
0.000027 lstat(".../.myremotefile.c.swp", 0x7ffd99b1a9e0) = -1 ENOENT (No such file or directory)
0.043704 openat(AT_FDCWD, ".../.myremotefile.c.swp", O_RDWR|O_CREAT|O_EXCL|O_NOFOLLOW, 0600) = 4
0.127965 fcntl(4, F_GETFD) = 0
0.000331 fcntl(4, F_SETFD, FD_CLOEXEC) = 0
0.000347 openat(AT_FDCWD, ".", O_RDONLY) = 5
0.000221 fchdir(5) = 0
0.000145 chdir(".../myremotefolder") = 0
0.046751 getcwd("/home/myhomefolder/.../myremotefolder", 4096) = 34
0.000375 fchdir(5) = 0
0.000351 close(5) = 0
0.000262 lseek(4, 0, SEEK_SET) = 0
0.000082 write(4, "b0VIM 8.1\0\0\0\0\20\0\0\217\266\235]>\0\0\0\335\16\0\0balo"..., 4096) = 4096
0.000645 select(1, [0], [], [0], {tv_sec=0, tv_usec=0}) = 0 (Timeout)
0.000176 chmod("..../.myremotefile.c.swp", 0644) = -1 EIO (Input/output error)
60.064610 close(3) = -1 ENOTCONN (Transport endpoint is not connected)
Run Code Online (Sandbox Code Playgroud)
您可以看到该进程在关闭时挂起 60 秒。
这个问题似乎在 vim 尝试创建 .swp 文件时发生,但我不知道为什么,因为我在远程 fs 上手动创建或删除文件或文件夹没有问题。
我不了解 sshfs 并且足够融合以自己解决此问题。
我也可以提供 gcc 和 mv 的 strace 日志。问我是否需要精度。
预先感谢您的回答。
编辑:我directory在 vimrc 中设置了该选项,以便 vim 在我的本地 .vim 文件夹中创建它的交换文件,这解决了我遇到的交换文件错误。
但是我在执行其他操作时仍然遇到一些 I/O 错误,所以我相信 vim 发生的事情只是我将尝试调查的更复杂问题的征兆。
正如@roaima 所述,问题似乎是由连接意外关闭引起的,这是在 vim 尝试在远程 fs 中创建交换文件时发生的。
我最近注意到无论如何我都无法复制某些文件,我现在不能肯定,但我认为它可能是大于一定大小的文件,我需要做一些测试。
Edit2 :今天做了一些测试后,我注意到当我尝试通过 ssh 上传超过 MTU 大小(1500)的文件时(我尝试通过 sshfs、scp 和 sftp 会话上传文件),当这样做时ServerAliveInterval设置了 ssh选项, 连接在 60 秒后断开。
好吧,降低 MTU 大小似乎解决了我通过 SSHFS 的所有 I/O 问题。正如 @roaima 所指出的,问题可能是由于大学服务器的防火墙过于急切地阻止 ICMP 数据包引起的。
感谢@roaima 指导我解决该问题。感谢 @derobert 建议降低 MTU。