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.