flock (2) versus fcntl (2) über ein NFS


19

In der Perl 5.x-Dokumentation wird angegeben, dass für die Implementierung von flock (..) einer der folgenden systemeigenen Aufrufe verwendet wird, die bei 1 beginnen und bei Nichtverfügbarkeit bei 3 arbeiten:

  1. Herde (2)
  2. fcntl (2)
  3. Schloss (3)

Das ist gut. Möglicherweise haben Sie jedoch deren Haftungsausschluss bemerkt, dass flock (2) nicht über ein NFS verwendet werden sollte. Das Dokument schlägt vor, mit dem Flag -Ud_flock die Verwendung von flock (2) durch Perl zu erzwingen. Die Manpage von Flock (2) (auf RedHat) enthält einen ähnlichen Haftungsausschluss zu NFS-Problemen.

Meine Frage ist, warum!?!? Ich kann anscheinend keinen ausführlichen Artikel oder eine Erklärung dafür finden, warum flock (2) gegenüber einem NFS unsicher ist.

Ich habe mehrere Testskripte in C und Perl geschrieben, sowohl auf Redhat (wo flock (2) verwendet wird) als auch auf Solaris (wo fcntl (2) verwendet wird). Ich habe strace / truss ausgeführt, um sicherzustellen, dass Perl tatsächlich flock (2) und fcntl (2) verwendet. Ich konnte keine Probleme wiederholen, bei denen ein Schloss nicht beachtet wurde! Was gibt??

Antworten:


3

Lennart Pöttering hat sich kürzlich mit dem Sperrverhalten von Linux-Dateisystemen befasst, was kein besonders rosiges Bild für das Sperren über NFS ergibt (insbesondere das Follow-up, auf das er am Ende des Beitrags verweist).

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


1
Das ist genau die Art von Information, nach der ich gesucht habe. Vielen Dank! Nach einigen Wochen der Untersuchung ist es eine sehr ähnliche Lösung, zu der ich gekommen bin, aber es ist großartig, einen Artikel zu lesen, der meine Vermutungen bestätigt (und andere vorschlägt). Der Link aus , dass die Kommentare Seite war auch eine gute Referenz, und ein guter Artikel über POSIX und seine Geschichte): samba.org/samba/news/articles/low_point/tale_two_stds_os2.html
Jmoney38

15

Ich bin mir ziemlich sicher, dass Sie sich mit älteren Bedenken befassen. Erinnern Sie sich daran, dass das Perl5-Handbuch 1994 veröffentlicht wurde und dass es nur eine Bearbeitung des Perl4-Handbuchs von 1991 war. Damals konnte man wahrscheinlich über das oft genannte Nightmare-Dateisystem sagen, dass "es nicht so gut ist, wie der Bär das tanzt erstaunt, aber dass es überhaupt tanzt ".

In der Epoche 1991 kroch NFS2 langsam von Sun auf andere Plattformen und war relativ grob. Das Sicherheitsmodell war im Wesentlichen nicht vorhanden (Root auf einem Clientcomputer konnte den gesamten Inhalt eines NFS-Mounts lesen), und das Sperren über nfs.lockd war diese Seite des Experiments. Es wäre töricht gewesen, zu erwarten, dass die Flock-Semantik ordnungsgemäß funktioniert, wenn überhaupt zwischen zwei verschiedenen, angeblich interoperablen Implementierungen. Koax war zu der Zeit das vorherrschende Ethernet-PHY, das viele Netzwerkbenutzer noch nie benutzt haben (was heißt, Sie haben vergessen, den 50 to-Abschlusswiderstand aufzusetzen?), Wenn Sie dadurch den Zustand von Intranets besser im Griff haben.

Larry Wall und die Crew hatten allen Grund, pessimistische Annahmen über die Richtigkeit von NFS-Sperren zu machen. Dies ist die Art von defensiver Programmierung, die zukünftige Code-Jockeys nicht entfernen möchten, da es so schwer ist, das Fehlen eines Fehlers zu beweisen Entfernen von altem Code, der in Interoperabilität mit einem Legacy-System, von dem Sie noch nie gehört haben, wieder eingeführt wurde.

Seitdem hat sich NFS erheblich verbessert und lockd ist rechtzeitig auf ein Feature des Linux 2.6-Kernels umgestiegen. Bei einer Sammlung von Systemen ab 2003 kann die NFS-Dateisperrung wahrscheinlich als vertrauenswürdig eingestuft werden, insbesondere wenn sie in Ihrer Anwendung auf den vielen Plattformen, auf denen sie ausgeführt wird, gut getestet wurde.

Alles oben Genannte wurde aus dem Speicher entfernt und könnte wahrscheinlich durch Nachforschungen belegt werden (z. B. http://nfs.sourceforge.net/ ), aber der Beweis - wie sie sagen - liegt in der Sperre, und wenn Sie ihn nicht getestet haben Es wird vermutet, dass es kaputt ist.


Das ist eine großartige Analyse. Tatsächlich bin ich zu dem gleichen Schluss gekommen. Nachdem Sie diesen Link gepostet haben, habe ich die nfs sourceforge-Seite noch einmal durchgelesen, und ich habe endlich gefunden, wonach ich suche! Hier ist eine eingehende Analyse direkt aus dem Maul des Pferdes!
Jmoney38

2
Hoppla, ich drücke die Eingabetaste ... gehe zu nfs.sourceforge.net , Abschnitt D10 unten behandelt dieses Problem im Detail.
Jmoney38

3

Ein weiteres, direkt aus den Linux-NFS-FAQ: nfs.sf.net

Ich versuche, flock () / BSD-Sperren zu verwenden, um Dateien zu sperren, die auf mehreren Clients verwendet werden, aber die Dateien werden beschädigt. Woher? A. flock () / BSD-Sperren wirken nur lokal auf Linux-NFS-Clients vor 2.6.12. Verwenden Sie fcntl () / POSIX-Sperren, um sicherzustellen, dass Dateisperren für andere Clients sichtbar sind.

Es gibt einige Möglichkeiten, den Zugriff auf eine NFS-Datei zu serialisieren.

Verwenden Sie die fcntl () / POSIX-Sperr-API. Diese Art der Sperrung ermöglicht die Sperrung von Byte-Bereichen für mehrere Clients über das NLM-Protokoll oder über NFSv4. Verwenden Sie eine separate Sperrdatei und erstellen Sie feste Verknüpfungen dazu. Siehe die Beschreibung im Abschnitt O_EXCL der Manpage creat (2). Es ist erwähnenswert, dass O_EXCL-Erstellungen bis zu den frühen 2.6-Kerneln auf Linux-NFS-Clients nicht atomar waren. Verwenden Sie O_EXCL nicht, um atomares Verhalten zwischen mehreren NFS-Clients zu erzeugen und zu erwarten, es sei denn, Sie führen einen Kernel aus, der neuer als 2.6.5 ist.

Es ist ein bekanntes Problem, dass Perl standardmäßig flock () / BSD-Sperren verwendet. Dies kann Programme beschädigen, die von anderen Betriebssystemen wie Solaris portiert wurden und von denen erwarten, dass Flock- / BSD-Sperren wie POSIX-Sperren funktionieren.

Unter Linux hat die Verwendung der Dateisperrung anstelle einer festen Verbindung den zusätzlichen Vorteil, dass der Cache des Clients mit dem Server als Prüfpunkt festgelegt wird. Wenn eine Dateisperre aktiviert ist, leert der Client den Seitencache für diese Datei, sodass alle nachfolgenden Lesevorgänge neue Daten vom Server abrufen. Wenn eine Dateisperre aufgehoben wird, werden alle Änderungen an der Datei auf diesem Client vor dem Aufheben der Sperre an den Server zurückgespielt, damit andere Clients, die auf das Sperren dieser Datei warten, die Änderungen sehen können.

Der NFS-Client in 2.6.12 bietet Unterstützung für flock () / BSD-Sperren für NFS-Dateien, indem die BSD-artigen Sperren in Form von POSIX-Bytebereichssperren emuliert werden. Andere NFS-Clients, die denselben Emulationsmechanismus verwenden oder die fcntl () / POSIX-Sperren verwenden, sehen dann dieselben Sperren wie der Linux-NFS-Client.

Auf lokalen Linux-Dateisystemen sind POSIX-Sperren und BSD-Sperren für einander unsichtbar. Aufgrund dieser Emulation sehen Anwendungen, die auf einem Linux-NFS-Server ausgeführt werden, weiterhin Dateien, die von NFS-Clients gesperrt wurden, als mit einer fcntl () / POSIX-Sperre gesperrt, unabhängig davon, ob die Anwendung auf dem Client einen BSD-Stil oder einen POSIX-Stil verwendet. Stil sperren. Wenn die Serveranwendung flock () BSD-Sperren verwendet, werden die von den NFS-Clients verwendeten Sperren nicht angezeigt.


Sehen sich also zwei NFS-Clients, auf denen Kernel 3.13 ausgeführt wird, gegenseitig die flock () s?
Reinierpost

Wenn ich richtig verstehe, lautet die Antwort nein. Es sei denn, ich habe etwas verpasst, flockhat nicht, nicht und wird nicht über NFS-Mounts sperren.
Daniel Farrell

Zumindest auf NFS4.
rjh

3

Das ist jetzt veraltet. NFS4 unterstützt das Sperren innerhalb des Protokolls (kein lockd-Daemon oder RPC-Callback-Mechanismus erforderlich) und Perls flock()Methode funktioniert einwandfrei - wir verwenden sie in der Produktion.

Sehr alte Versionen des Kernels flock(der Syscall) wurden als No-Op auf NFS implementiert , und andere Dinge wie das Sperren von Bytebereichen wurden nicht richtig unterstützt. Hier kommt die Hysterie her.


Vielen Dank für den Hinweis. Das Mounten mit NFS4 hat mein Problem gelöst. Gefolgt access.redhat.com/documentation/en-us/red_hat_enterprise_linux/... fstab Konfiguration richtig zu machen.
Maraspin
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.