우리 대학에서는 학생 대학 계정에 대한 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 file
vim에서 파일을 닫습니다.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에서 옵션을 설정 하여 directory
vim이 로컬 .vim 폴더에 스왑 파일을 생성하도록 했고, 이로 인해 발생한 스왑 파일 오류가 해결되었습니다.
하지만 다른 작업을 할 때 여전히 일부 I/O 오류가 발생하므로 vim에서 발생하는 문제는 내가 조사할 더 복잡한 문제의 증상일 뿐이라고 생각합니다.
@roaima가 말했듯이 vim이 원격 파일 시스템에서 스왑 파일을 생성하려고 할 때 발생하는 연결이 예기치 않게 닫혀서 문제가 발생한 것 같습니다.
최근에 무슨 일이 있어도 특정 파일을 복사할 수 없다는 사실을 발견했습니다. 지금은 확실하지 않지만 파일이 특정 크기보다 클 수 있으므로 몇 가지 테스트를 수행해야 할 수 있습니다.
편집 2:오늘 몇 가지 테스트를 해보니 MTU 크기(1500)를 초과하는 ssh를 통해 파일을 업로드하려고 할 때(sshfs, scp 및 sftp 세션을 통해 파일 업로드를 시도했습니다) ServerAliveInterval
ssh 옵션을 설정할 때, 연결에 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에게 감사드립니다.