flock
não funciona no NFS. (Nunca foi, mesmo em sistemas UNIX.)
Veja flock vs lockf no Linux para uma comparação entre lockf
e flock
.
Aqui está uma possível solução Corrigir o bloqueio em scripts de shell?
Estou planejando ter uma configuração complicada de compartilhamento de arquivos e quero ter certeza de que não destroço o bloqueio de arquivos. (Desejando usar a montagem de ligação, nfs, nfs sobre rdma (compartilhamento de arquivos InfiniBand) e virtfs (compartilhamento de arquivos de passagem de máquina virtual kvm) nos mesmos dados.)
Estou no controle de integridade inicial, apenas testando o servidor nfs com um único cliente nfs. Arch atualizado em ambos os sistemas, nfs-utils 1.3.2-6, kernel 4.1.6-1.
Estou vendo resultados inesperados. No servidor 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)
Em / test, tenho um script chamado lockFile
com conteúdo:
#!/bin/bash
filename="lockedFile"
exec 200>$filename
flock -n 200 || exit 1
pid=$$
while true; do
echo $pid 1>&200
done
Se eu usar dois terminais no servidor nfs:
1: ./lockFile
2: ./lockFile
Em seguida, o terminal 1 preenche rapidamente um arquivo com seu pid e o terminal 2 sai imediatamente. Tudo como esperado.
Mas, se eu executar um terminal no servidor e cliente nfs:
server: ./lockFile
client: ./lockFile
Os dois correm felizes, muito inesperados.
Nesta configuração, meu servidor nfs está sendo executado como sync
, o que significa que o servidor apenas informa que os dados são gravados quando realmente são gravados. Meu cliente nfs está executando como async
, o que significa que o cliente só transmite as gravações quando o arquivo é fechado.
Eu podia ver o cliente executando async
talvez não obtendo um bloqueio até que ele realmente transmitisse as gravações, então testei isso, alterando o cliente para 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)
Ainda lockFile
felizmente é executado nas duas máquinas.
Eu estou entendendo mal como o bloqueio de arquivo NFS deve funcionar? Espera-se que ele manipule o acesso ao servidor versus o acesso do cliente? Ou é apenas para acesso do cliente versus acesso de cliente diferente?
flock
não funciona no NFS. (Nunca foi, mesmo em sistemas UNIX.)
Veja flock vs lockf no Linux para uma comparação entre lockf
e flock
.
Aqui está uma possível solução Corrigir o bloqueio em scripts de shell?