J'essaie d'utiliser des verrous flock () / BSD pour verrouiller les fichiers utilisés sur plusieurs clients, mais les fichiers sont corrompus. Comment venir? A. Les verrous flock () / BSD n'agissent que localement sur les clients NFS Linux avant 2.6.12. Utilisez les verrous fcntl () / POSIX pour vous assurer que les verrous de fichiers sont visibles pour les autres clients.
Voici quelques façons de sérialiser l'accès à un fichier NFS.
Utilisez l'API de verrouillage fcntl () / POSIX. Ce type de verrouillage fournit un verrouillage de plage d'octets sur plusieurs clients via le protocole NLM ou via NFSv4. Utilisez un fichier de verrouillage distinct et créez des liens physiques vers celui-ci. Voir la description dans la section O_EXCL de la page de manuel creat (2). Il convient de noter que jusqu'au début des noyaux 2.6, les créations O_EXCL n'étaient pas atomiques sur les clients Linux NFS. N'utilisez pas O_EXCL crée et attendez un comportement atomique entre plusieurs clients NFS, sauf si vous exécutez un noyau plus récent que 2.6.5.
C'est un problème connu que Perl utilise le verrouillage flock () / BSD par défaut. Cela peut interrompre les programmes portés à partir d'autres systèmes d'exploitation, tels que Solaris, qui s'attendent à ce que les verrous flock / BSD fonctionnent comme les verrous POSIX.
Sous Linux, l'utilisation du verrouillage de fichier au lieu d'un lien dur présente l'avantage supplémentaire de contrôler le cache du client avec le serveur. Lorsqu'un verrou de fichier est acquis, le client vide le cache de pages de ce fichier afin que toutes les lectures ultérieures obtiennent de nouvelles données du serveur. Lorsqu'un verrou de fichier est libéré, toutes les modifications apportées au fichier sur ce client sont renvoyées au serveur avant que le verrou ne soit libéré afin que les autres clients en attente de verrouiller ce fichier puissent voir les modifications.
Le client NFS dans 2.6.12 prend en charge les verrous flock () / BSD sur les fichiers NFS en émulant les verrous de style BSD en termes de verrous de plage d'octets POSIX. Les autres clients NFS qui utilisent le même mécanisme d'émulation, ou qui utilisent des verrous fcntl () / POSIX, verront alors les mêmes verrous que le client NFS Linux voit.
Sur les systèmes de fichiers Linux locaux, les verrous POSIX et BSD sont invisibles les uns aux autres. Ainsi, en raison de cette émulation, les applications exécutées sur un serveur Linux NFS verront toujours les fichiers verrouillés par les clients NFS comme étant verrouillés avec un verrou fcntl () / POSIX, que l'application sur le client utilise un style BSD ou un POSIX- serrure de style. Si l'application serveur utilise des verrous flock () BSD, elle ne verra pas les verrous utilisés par les clients NFS.