O bloqueio de arquivos NFS não está funcionando, estou entendendo mal?

2

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?

    
por user1902689 14.09.2015 / 22:52

1 resposta

3

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?

    
por 14.09.2015 / 23:06

Tags