얼마 전, 파일이 NFS 마운트에 저장될 때와 로컬 파일 시스템에 저장될 때 inotify가 보고하는 이벤트가 다르다는 사실을 발견했습니다.
기본 VFS는 파일 작업에 대한 통합 보기를 제공하면 안 되나요?
다음은 Debian 7.1(Linux 3.2)에서 VIM 저장 파일의 궤적입니다.
NFS 마운트에서:
wd=1 mask = 32 (IN_OPEN)
wd=1 mask = 16 (IN_CLOSE_NOWRITE)
wd=1 mask = 2048 (IN_MOVE_SELF)
wd=1 mask = 4 (IN_ATTRIB)
wd=1 mask = 1024 (IN_DELETE_SELF)
wd=1 mask = 32768 )
로컬 파일 시스템에서
wd=1 mask = 32 (IN_OPEN)
wd=1 mask = 16 (IN_CLOSE_NOWRITE)
wd=1 mask = 2 (IN_MODIFY)
wd=1 mask = 32 (IN_OPEN)
wd=1 mask = 8 (IN_CLOSE_WRITE)
wd=1 mask = 4 (IN_ATTRIB)
EMACS를 사용하여 파일을 저장하면 다른 동작이 나타납니다.
NFS 마운트에서:
wd=1 mask = 32 (IN_OPEN)
wd=1 mask = 16 (IN_CLOSE_NOWRITE)
wd=1 mask = 2048 (IN_MOVE_SELF)
로컬 파일 시스템에서:
wd=1 mask = 32 (IN_OPEN)
wd=1 mask = 16 (IN_CLOSE_NOWRITE)
wd=1 mask = 2 (IN_MODIFY)
wd=1 mask = 32 (IN_OPEN)
wd=1 mask = 2 (IN_MODIFY)
wd=1 mask = 8 (IN_CLOSE_WRITE)
이러한 테스트는 다음을 사용하여 수행됩니다.inotify-touch.c
답변1
inotify NFS가 지원되나요?
웹을 둘러보면 inotify가 NFS를 지원할 수 있지만 매우 제한된 방식으로 지원됩니다.
전시 #1그 이유는 다음과 같은 StackOverflow Q&A에 설명되어 있습니다.Inotify에 NFS 사용.
에서 발췌수락된 답변
전시 #2inotify가 작동하려면 커널 지원이 필요합니다. 응용 프로그램이 디렉터리를 추적할 때 이러한 변경 사항이 발생할 때 이를 알리도록 커널에 요청합니다. 변경 사항이 발생하면 이러한 변경 사항을 디스크에 쓰는 것 외에도 커널은 모니터링 프로세스에 알립니다.
원격 NFS 시스템에서는 변경 사항이 커널에 전혀 표시되지 않습니다. NFS는 inotify보다 앞서며 NFS 또는 이와 유사한 것에 대한 네트워크 수준 지원은 없습니다.
보시면 좀 더 연구해 보세요자주 묻는 질문(FAQ)
Q: sysfs(procfs, nfs...)를 볼 수 있나요?
간단히 말해서 그렇습니다. 하지만 몇 가지 제한 사항이 있습니다. 이러한 제한은 커널 버전에 따라 다르며 더 작아지는 경향이 있습니다. 특정 파일 시스템에 대해 읽어 보십시오.
그렇게 지지해?
궁극적으로 여러분이 겪고 있는 문제는 NFS가 로컬로 마운트된 파일 시스템과 동일한 기능을 제공하지 않는다는 것입니다.
예를 들어에서리눅스 스레드nfs:
- CIFS에는 알림 기능(기회적 잠금)이 내장되어 있습니다.
- NFS는 "임대" 알림을 제공합니다.
여기서 중요한 점은 CIFS 및 NFS와 같은 대체 파일 시스템이 inotify에 대한 매우 기본적인(있는 경우) 직접 지원을 제공한다는 것입니다.
NFS v4 상태
에서 발췌NFS v4 상태에 대한 IBM 기사
NFS 버전 4는 클라이언트가 상태를 설정 또는 재설정하고 후속 서버 상태 저장 작업의 소유권을 이전에 설정된 상태와 연결할 수 있는 프로토콜을 제공합니다. 누락된 클라이언트를 해결하려면 NFS 버전 4 클라이언트는 서버에서 지정한 임대 시간 동안 주기적으로 상태를 새로 고쳐야 합니다. 임대가 만료된 후 서버는 클라이언트의 리소스를 해제하고 이를 다른 애플리케이션에서 사용할 수 있도록 할 수 있습니다.
- 클라이언트는 getattr 작업을 실행하여 서버에서 지정한 임대 시간 초과 속성을 얻습니다. getattr은 상태 저장 작업이 아니므로 이전 상태를 설정할 필요가 없습니다. getattr 작업은 setclientid 또는 setclientid_confirm 작업보다 먼저 수행될 수 있습니다.
- 임대 기간을 설정하고 조정하려면 NFS 서버의 임대 기간 사이트 속성을 참조하세요. *