SSHFS/SFTP: sshfs를 통해 파일을 편집하려고 하면 Vim이 멈추고 sftp를 통해 MTU 크기보다 큰 파일을 업로드할 수 없습니다.

SSHFS/SFTP: sshfs를 통해 파일을 편집하려고 하면 Vim이 멈추고 sftp를 통해 MTU 크기보다 큰 파일을 업로드할 수 없습니다.

우리 대학에서는 학생 대학 계정에 대한 SSH 액세스를 제공합니다. 저는 원격 계정의 일부 폴더에 액세스하기 위해 SSHF를 설정했습니다.

내 로컬 컴퓨터에서 pop_os를 실행하고 다음 옵션과 함께 systemd를 사용하여 자동 마운트하고 있습니다.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

질문

자동 마운트가 제대로 작동하고 원격 폴더를 찾아볼 수 있지만 파일을 바꾸고 폴더를 원격으로 재귀적으로 복사하는 데 몇 가지 문제가 있습니다.

하지만 vim을 사용하여 원격 파일 시스템의 파일을 편집하려고 할 때마다 편집기는 파일을 열기 전에 60초 동안 멈춥니다(매우 정확합니다. 연결 시간 초과 매개변수와 관련이 있는 것 같습니다). 파일이 마침내 열리면 오류가 발생하고 E297: Write error in swap filevim에서 파일을 닫습니다.E72: Close error on swap file

그러나 경우에 따라(특히 /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)

프로세스가 종료되면서 60초 동안 정지되는 것을 볼 수 있습니다.

이 문제는 vim이 .swp 파일을 생성하려고 할 때 발생하는 것 같은데 원격 파일 시스템에서 파일이나 폴더를 수동으로 생성하거나 삭제하는 데 문제가 없기 때문에 이유를 알 수 없습니다.

나는 이 문제를 스스로 해결하기에는 sshfs와 fusion에 대해 충분히 알지 못합니다.

또한 gcc 및 mv의 strace 로그를 제공할 수도 있습니다. 정확성이 필요한지 물어보세요.

귀하의 답변에 미리 감사드립니다.

편집하다:vimrc에서 옵션을 설정 하여 directoryvim이 로컬 .vim 폴더에 스왑 파일을 생성하도록 했고, 이로 인해 발생한 스왑 파일 오류가 해결되었습니다.

하지만 다른 작업을 할 때 여전히 일부 I/O 오류가 발생하므로 vim에서 발생하는 문제는 내가 조사할 더 복잡한 문제의 증상일 뿐이라고 생각합니다.

@roaima가 말했듯이 vim이 원격 파일 시스템에서 스왑 파일을 생성하려고 할 때 발생하는 연결이 예기치 않게 닫혀서 문제가 발생한 것 같습니다.

최근에 무슨 일이 있어도 특정 파일을 복사할 수 없다는 사실을 발견했습니다. 지금은 확실하지 않지만 파일이 특정 크기보다 클 수 있으므로 몇 가지 테스트를 수행해야 할 수 있습니다.

편집 2:오늘 몇 가지 테스트를 해보니 MTU 크기(1500)를 초과하는 ssh를 통해 파일을 업로드하려고 할 때(sshfs, scp 및 sftp 세션을 통해 파일 업로드를 시도했습니다) ServerAliveIntervalssh 옵션을 설정할 때, 연결에 60초가 소요된 후 끊어졌습니다.

답변1

FUSE 파일 시스템 은 파일 전송 프로토콜 위에 파일 시스템을 제공하여 sshfs구현 됩니다. sftp따라서 모든 파일 액세스(예: 편집)를 수행하려면 하위 시스템이 먼저 파일을 로컬 파일 시스템의 캐시에 복사해야 vi[m]합니다 . sshfs파일이 특히 크거나 클라이언트와 서버 간의 네트워크가 특히 느린 경우 파일을 로컬로 액세스하기 전에 전송하는 데 상당한 시간이 걸릴 수 있습니다.

그것은 (매우) 대략 다음과 같습니다 (대신 사용하는 것을 제외 sftp하고 scp)

# Copy the remote file to a temporary local cache
scp -p remote:/path/to/file /tmp/file.tmp
checksum=$(cksum /tmp/file.tmp)

# Action on remote file is implemented by performing the action locally
vi /tmp/file.tmp

# Simplified; we would also need to handle local rm/mv -> remote rm/mv, etc.
[[ "$(cksum /tmp/file.tmp)" != "$checksum" ]] && scp -p /tmp/file.tmp remote:/path/to/file

gcc따라서 로컬에서 실행하는 것이 원격 서버에 로그인하여 실행하는 것보다 훨씬 느리다는 것을 알게 될 것입니다 . 솔직히 별로 놀랍지도 않다"원격 파일 시스템에서 파일을 컴파일하려고 하면 gcc가 충돌합니다.".물론 그러면 안 되지만, 그 배경에서 실제로 무슨 일이 벌어지고 있는지 생각해 보세요...

답변2

MTU 크기를 낮추면 SSHFS에서 겪었던 모든 I/O 문제가 해결된 것 같습니다. @roaima가 지적했듯이 대학 서버의 방화벽이 ICMP 패킷을 너무 열심히 차단하여 문제가 발생할 수 있습니다.

이 문제를 안내해 준 @roaima에게 감사드립니다. MTU를 낮추도록 제안한 @derobert에게 감사드립니다.

관련 정보