web-dev-qa-db-fra.com

FLOCK (2) VERSUS FCNTL (2) sur un NFS

La documentation Perl 5.x stipule que sa mise en œuvre de FLOCK (..) utilisera l'un des appels indigènes suivants, à partir de 1 et qui fonctionne vers 3 si indisponible:

  1. troupeau (2)
  2. fcntl (2)
  3. lockf (3)

C'est très bien. Toutefois, vous avez peut-être remarqué que leur avertissement que FLOCK (2) ne doit pas être utilisé sur une NFS. Le DOC suggère d'utiliser un drapeau A -UD_FLOCK pour forcer Perl à utiliser Flock (2). La page d'homme de Flock (2) (sur RedHat) indique un dénonciation similaire sur les problèmes de NFS.

Ma question est pourquoi!?!? Je n'arrive pas à trouver un article approfondi ou une explication de la raison pour laquelle FLOCK (2) est dangereux sur une NFS.

J'ai écrit plusieurs scripts de test en C et Perl, sur les deux Redhat (où le troupeau (2) est utilisé) et sur Solaris (où FCNTL (2) est utilisé). J'ai Ran Strace/Trass pour que Perl utilisait effectivement le troupeau (2) et le FCNTL (2) respectivement. Je ne pouvais pas reproduire aucun problème dans lequel un verrou n'était pas honoré! Ce qui donne??

21
Jmoney38

Lennart Poettering a récemment fait creuser un comportement de verrouillage du système de fichiers Linux, qui ne peint pas une image particulièrement rose pour verrouiller sur NFS (en particulier le suivi qu'il relie au bas de la poste).

http://0pointer.net/blog/projects/locking.html

3
Ivatar

Je suis à peu près sûr que vous envisagez des préoccupations héritées. Rappelez-vous que le manuel PERL5 a été publié en 1994 et qu'il ne s'agissait que d'une édition du manuel de Perl4 à partir de 1991. À cette époque, on pourrait probablement dire au sujet du système de fichiers Nightmare OFT nommé que "ce n'est pas dans quelle mesure les danses des ours étonnantes, mais qu'elle danse du tout ".

NFS2 dans l'époque de 1991 rampait lentement sur le soleil dans d'autres plates-formes et était relativement brut. Le modèle de sécurité était essentiellement inexistant (la racine sur une machine client pourrait lire tout le contenu d'une monture NFS) et de verrouillage - via nfs.lockd - était ce côté de l'expérience expérimentale. Vous auriez été stupide de vous attendre à ce que la sémantique du troupeau fonctionne correctement si elle se situe entre deux différentes implémentations prétendument interopérables. Coax était le PHY Ethernet dominant à l'époque que de nombreux utilisateurs de réseau n'ont jamais eu le mécontentement de l'utilisation (que voulez-vous dire que vous avez oublié de mettre la résistance de terminaison de 50 ???? sur?) Si cela vous donne une meilleure adhérence sur l'état d'intranets alors.

Larry Wall and Crew a eu toutes les raisons de faire des hypothèses pessimistes sur l'exactitude des verrous NFS à l'époque, et c'est le genre de programmation défensive que les futurs jockeys de code sont détestés pour supprimer, car il est si difficile de prouver l'absence de défaut par Supprimer l'ancien code qui est réintroduit dans l'interopérabilité avec un système hérité que vous n'avez jamais entendu parler.

Depuis lors, NFS s'est considérablement amélioré et Lockd a migré à temps sur une caractéristique du noyau Linux 2.6. Pour une collection de systèmes de 2003+, le verrouillage du fichier NFS peut probablement être approuvé, surtout si vous avez été testé dans votre application sur les nombreuses plateformes.

Tout ce qui précède a été cracelé de la mémoire et pourrait probablement être justifié par la recherche (par exemple http://nfs.sourceforge.net/ ) mais la preuve - comme on dit - est dans le verrouillage, et Si vous ne l'avez pas testé, il est présumé cassé.

16
msw

Un autre, directement de Linux-NFS FAQ: nfs.sf.net

J'essaie d'utiliser des verrous FLOCK ()/BSD pour verrouiller des fichiers utilisés sur plusieurs clients, mais les fichiers deviennent corrompus. Comment venir? A. FLOCK ()/BSD Serrures Acte uniquement sur les clients Linux NFS avant le 2.6.12. Utilisez des verrous FCNTL ()/POSIX pour vous assurer que les serrures de fichier 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 d'octet sur plusieurs clients via le protocole NLM ou via NFSV4. Utilisez un verrouillage séparé et créez des liens difficiles. Voir la description dans la section O_EXCL de la page Cree (2) Man. Il convient de noter que jusqu'à ce que les premiers noyaux 2.6, O_EXCL crée n'étaient pas atomiques sur les clients NFS Linux NFS. N'utilisez pas O_EXCL crée et attendez-vous au comportement atomique parmi plusieurs clients NFS, à moins que vous n'oubliez pas de noyau plus récent que 2,6.5.

C'est un problème connu que Perl utilise FLOCK ()/BSD Verrouillage par défaut. Cela peut casser des programmes portés à partir d'autres systèmes d'exploitation, tels que Solaris, qui s'attendent à ce que FLOCK/BSD serrure fonctionne comme des serrures de POSIX.

Sur Linux, l'utilisation de verrouillage du fichier au lieu d'une liaison matérielle présente l'avantage supplémentaire de la chèque de contrôle du cache du client avec le serveur. Lorsqu'un verrouillage de fichier est acquis, le client affluera le cache de page pour ce fichier afin que toutes les lectures ultérieures obtiennent de nouvelles données sur le serveur. Lorsqu'un verrouillage de fichier est publié, toutes les modifications apportées au fichier sur ce client sont revenues sur le serveur avant que le verrouillage soit publié, de sorte que d'autres clients en attente de verrouiller ce fichier peuvent voir les modifications.

Le client NFS in 2.6.12 prend en charge les verrous FLOCK ()/BSD sur les fichiers NFS en émulant les verrous de style BSD en termes de serrures de plage d'octets POSIX. D'autres clients NFS utilisant le même mécanisme d'émulation, ou qui utilisent des verrous FCNTL ()/POSIX, verront ensuite les mêmes serrures que le client Linux NFS voit.

Sur les systèmes de fichiers Linux locaux, les serrures de POSIX et les verrous BSD sont invisibles les uns aux autres. Ainsi, en raison de cette émulation, les applications exécutées sur un serveur NFS Linux ne verront toujours que des fichiers verrouillés par NFS Clients comme étant verrouillés avec une serrure FCNTL ()/POSIX, que l'application sur le client utilise un style BSD ou un posx. Serrure de style. Si l'application Server utilise des verrous FLOCK () BSD, il ne verra pas les serrures utilisées par les clients NFS.

3
Nikhil Mulley