VIM을 사용하여 저장된 파일은 짧은 시간 내에 손실됩니다.

VIM을 사용하여 저장된 파일은 짧은 시간 내에 손실됩니다.

VIM, Linux VFS 캐시, ecryptfs 및/또는 파일 시스템과 관련된 것으로 인해 발생하는 것으로 보이는 이상한 문제가 발생했습니다.

  1. VIM에서 파일을 열고 수정한 후 저장합니다.
  2. 파일에 접근하려고 합니다.

예상되는 동작

:w보고서 파일이 작성되면 파일에 액세스할 수 있어야 합니다 .

실제 행동

파일이 존재하지 않습니다.

잠시(보통 1초 미만) 기다리면 파일이 나타납니다.

이는 Python 코드 및 레거시 pyc파일로 작업할 때 특히 문제가 됩니다. 새 py파일이 아직 준비되지 않았기 때문에 종종 이전 코드를 실행하게 됩니다. 최근에 export PYTHONDONTWRITEBYTECODE=1코드를 추가했기 .bashrc때문에 이전 코드를 실행하는 대신 의미 있는 오류 메시지가 나타납니다. 내가 변경한 파일이 짧은 시간 내에 손실되기 때문에 자동 다시 로드 코드(예: Django의 코드)가 5~10회마다 다시 로드되지 않기 때문에 여전히 어색합니다. 파일이 pyc제 위치에 있으면 자동 다시 로더가 때때로 이전 파일을 로드하게 되지만 , 파일이 수정되었는지 pyc확인하지 못하고 또 다른 다시 로드를 트리거합니다.py

시스템 세부정보 및 구성

내 컴퓨터에는 충분한 RAM(32GiB)과 SSD가 있으며 대부분 유휴 상태입니다. 따라서 느린 I/O가 이 문제의 원인이라고 생각하지 않습니다. 파일은 매우 작으며(1KiB 미만) 빈 파일에서도 이런 현상이 발생합니다. 암호화를 위해 ecryptfs를 사용하고 있으므로 $HOME이것이 문제의 일부일 수 있습니다. 파일 시스템을 /tmp사용하여 설치하면 이 문제를 재현할 수 없습니다 .tmpfs

VIM 설정

파일이 이동되고 새 파일로 교체된 이유는 VIM 설정 때문이었습니다.

set backup
set backupskip=
set backupdir=$HOME/.vimbackup
set writebackup

newVIM이 파일이 작성되었다고 보고하는 즉시 파일에 액세스할 수 있기를 원합니다 . 지연된 쓰기에 대한 힌트가 있는지 VIM 문서를 확인했지만 아무 것도 찾지 못했습니다. 쉘 명령을 사용하여 이를 재현할 수 없으므로 VIM mv이 다른 작업을 수행하는 cprm같습니다.


또 무엇이 이 문제를 일으킬 수 있습니까? 이 문제를 어떻게 해결할 수 있습니까?

답변1

이것은 버그이지만 Aaron이 링크한 버그와는 아무런 관련이 없습니다. 현재는 재현할 수 없으므로 여기에 새 버그를 제출할 수 있습니다.https://bugs.launchpad.net/ecryptfs/+filebug

위의 설명을 복사하여 붙여넣을 수 있지만 사용 중인 Linux 배포판과 커널 버전에 대해서도 자세히 알아야 합니다. 감사해요!

답변2

이는 ecryptfs의 버그/설계 결함일 수 있습니다. 이것 좀 봐런치패드 오류 보고.

즉, ecryptfs는 파일을 디스크에 즉시 쓰지 않습니다. 나는 이것이 암호화 오버헤드 때문이라고 추측합니다(파일 시스템은 아마도 백그라운드 스레드의 데이터를 암호화하고 완료되었을 때만 씁니다).

이 버그는 2009년에 발생했으며 우선순위가 "위시리스트"("낮음"보다 낮음)입니다. 어떻게 해야 할지 조금 걱정이 됩니다.”기업” 그리고 발견한 바와 같이 동작이 혼합되어 있으며 많은 코드에서는 파일을 저장한 후 즉시 사용할 수 있을 것으로 기대합니다.

사용해 보세요진정한 비밀대신에.

답변3

내 생각엔 당신이 보고 있는 동작은 단지 Vim 백업 프로세스가 느리기 때문이라고 생각합니다. 내 기본 Ext4 시스템에서 이 문제는 컴파일러의 "파일이 비어 있습니다" 오류로 나타납니다.

시간을 확인하기 위해 다음 Bash 시퀀스를 사용했습니다.

strace -tt -o /dev/stdout gvim --nofork main.cxx | grep 'main.cxx\|close'

백업을 연 후 파일이 사라지는 것과 최종 저장 사이에 200밀리초의 간격이 있음을 발견했습니다.

09:06:49.587341 rename("main.cxx", "main.cxx~") = 0
09:06:49.668654 open("main.cxx", O_WRONLY|O_CREAT|O_TRUNC, 0644) = 12
09:06:49.755454 close(12)               = 0

set nowritebackup내 에서 이것을 사용하면 .vimrc파일 이름이 바뀌지 않고 열리고 닫히기만 합니다.

09:19:45.731416 open("main.cxx", O_WRONLY|O_CREAT|O_TRUNC, 0644) = 12
09:19:45.815763 close(12)               = 0

이것이 당신이 겪고 있는 문제에 대한 좋은 설명입니까?


추신: 온라인에서 이 문제에 대한 다른 언급을 찾을 수 없습니다.Vim 이슈 추적기, 또는 Vim에서개발자/사용자메일링 리스트에 없기 때문에 Vim 팀이 백업 시스템 호출 순서 변경을 고려할지 여부는 알 수 없습니다.

관련 정보