복잡한 파일 공유 설정을 계획하고 있으며 파일 잠금이 깨지지 않도록 하고 싶습니다. (동일한 데이터에 대해 rdma(InfiniBand 파일 공유) 및 virtfs(kvm 가상 머신 패스스루 파일 공유)를 통해 바인드 마운트, nfs, nfs를 사용하고 싶습니다.)
방금 온전성 검사를 시작했고 단일 nfs 클라이언트를 사용하여 nfs 서버를 테스트했습니다. 두 시스템 모두 nfs-utils 1.3.2-6, 커널 4.1.6-1에 최신 Arch를 설치하십시오.
예상치 못한 결과를 보았습니다. nfs 서버에서:
server exports with: /test 192.168.0.0/16(rw,sync,no_subtree_check,
no_root_squash)
client mount shows: 192.168.1.2:/test on /test type nfs4 (rw,noatime,vers=4.2,
rsize=524288,wsize=524288,namlen=255,hard,proto=tcp,port=0,timeo=600,
retrans=2,sec=sys,clientaddr=192.168.1.3,local_lock=none,addr=192.168.1.2)
/test에는 content라는 스크립트가 있습니다 lockFile
.
#!/bin/bash
filename="lockedFile"
exec 200>$filename
flock -n 200 || exit 1
pid=$$
while true; do
echo $pid 1>&200
done
nfs 서버에서 두 개의 터미널을 사용하는 경우:
1: ./lockFile
2: ./lockFile
그런 다음 터미널 1은 해당 pid로 파일을 빠르게 채우고 터미널 2는 즉시 종료됩니다. 모든 것이 예상대로 작동합니다.
그러나 nfs 서버와 클라이언트에서 터미널을 실행하면 다음과 같습니다.
server: ./lockFile
client: ./lockFile
두 사람은 예상외로 행복하게 달렸다.
이 구성에서 내 nfs 서버는 다음과 같이 실행됩니다 sync
. 즉, 서버는 데이터가 실제로 기록될 때만 데이터가 기록되었다고 말합니다. 내 nfs 클라이언트가 실행 중입니다 async
. 이는 클라이언트가 파일이 닫힐 때만 쓰기를 전송한다는 의미입니다.
쓰기가 실제로 전송되기 전에 실행 중인 클라이언트가 잠금을 획득하지 못할 수도 있다는 것을 알 수 있었기 async
때문에 클라이언트를 sync
.
client mount now shows: 192.168.1.2:/test on /test type nfs4 (rw,noatime,sync,
vers=4.2,rsize=524288,wsize=524288,namlen=255,hard,proto=tcp,port=0,timeo=600,
retrans=2,sec=sys,clientaddr=192.168.1.3,local_lock=none,addr=192.168.1.2)
여전히 lockFile
두 컴퓨터 모두에서 행복하게 실행됩니다.
NFS 파일 잠금이 작동하는 방식을 오해하고 있습니까? 서버 액세스와 클라이언트 액세스를 처리할 것으로 예상하십니까? 아니면 단지 클라이언트 액세스용인가요, 아니면 다른 클라이언트 액세스용인가요?
답변1
flock
NFS에서는 작동하지 않습니다. (UNIX 시스템에서도 절대 그렇지 않습니다.)
바라보다Linux의 클러스터링 및 lockflockf
비교하고 flock
.
이것이 가능한 해결책이다쉘 스크립트의 잠금이 정확합니까?