Dateisperren auf einem NFS?

18

Mein Server verwendet NFS (Network File System) und ich kann die flock () -Funktion von PHP nicht verwenden. Gibt es eine Möglichkeit, Dateien auf einem NFS zu sperren, oder muss dies getan werden?

rFactor
quelle

Antworten:

11

Die Handbuchseite flock(2)war lange nicht mehr aktuell, wurde aber seitdem aktualisiert, um Folgendes zu sagen (Hervorhebung meiner):

Seit Linux 2.6.12 unterstützen NFS-Clients flock () -Sperren, indem sie sie als Bytebereichsperren für die gesamte Datei emulieren. Dies bedeutet, dass die Sperren fcntl (2) und flock () über NFS miteinander interagieren. Seit Linux 2.6.37 unterstützt der Kernel einen Kompatibilitätsmodus, mit dem flock () -Sperren (und auch fcntl (2) -Byte-Regionssperren) als lokal behandelt werden können. Siehe die Diskussion der Option local_lock in nfs (5).

Das ist von der offiziellen Hilfeseiten-Website http://man7.org/linux/man-pages/man2/flock.2.html, die die neue Version von Hilfeseiten 4.00 zeigt

Linux 2.6.12 wurde 2005 veröffentlicht.

Dies sollte ursprünglich ein Kommentar zu Jannebs Antwort sein, aber ich hatte zu diesem Zeitpunkt keinen guten Ruf. Die Aktualisierung des Dokuments erfolgte 2014: http://git.kernel.org/cgit/docs/man-pages/man-pages.git/commit/man2/flock.2?id=e449654fdb3f19aafc569df47d12bffdf6276236

Josip Rodin
quelle
11

Ich weiß nicht, wie die PHP- flock()Funktion implementiert ist, aber wenn es sich um eine Schnittstelle zum flock()Syscall handelt, funktioniert sie über NFS überhaupt nicht. Aus der flock()Manpage:

flock (2) sperrt keine Dateien über NFS. Verwenden Sie stattdessen fcntl (2): Dies funktioniert über NFS, wenn eine ausreichend aktuelle Linux-Version und ein Server vorhanden sind, der das Sperren unterstützt.

Und natürlich ist alles, was eine Manpage sagt, egal wie veraltet, die ultimative Wahrheit.

Janneb
quelle
+1, Sarkasmus! Punkt D10 in der NFS-FAQ wird näher ausgeführt.
Themel
8

flock()Funktioniert gut unter Linux NFS, auch von PHP. Wir verwenden es ausgiebig und haben es gründlich getestet, um sicherzustellen, dass es wie gewünscht funktioniert. Überprüfen Sie, ob Sie alle erforderlichen Dienste sowohl auf dem Client als auch auf dem Server ausführen. Suchen Sie nach "portmapper" und "rpc.statd". Wenn sie nicht ausgeführt werden, müssen Sie herausfinden, welches Init-Skript sie auf Ihrer Distribution startet. In Debian-basierten Distributionen ist es " /etc/init.d/portmap" und " /etc/init.d/nfs-common".

Führen Sie vom Client aus " rpcinfo -u $NFSSERVER status" aus und prüfen Sie, ob Sie eine Antwort erhalten. Bei meinem Setup erhalte ich als Ergebnis "Programm 100024 Version 1 bereit und wartet".

Denken Sie auch daran, dass NFS und statd unter bestimmten Umständen verärgert sein können, wenn sowohl der Client als auch der Server keine zuverlässigen Hostnameneinträge für einander haben. Überprüfen Sie /etc/hostsbeide Maschinen.

Insyte
quelle
1
Ich bin nicht wirklich in der Lage, serverspezifische Details zu ändern. Die flock () -Funktion ist in der php.ini sogar deaktiviert, weil es nicht funktionieren würde, zumindest wurde mir das so gesagt.
rFactor
3

Ich wollte nur auf mich selbst antworten. Die Lösung finden Sie hier: http://us3.php.net/manual/en/function.flock.php#82521

rFactor
quelle
3
Die zweite aufgelistete Option ist genau das, was ich beschreibe: Verwenden des integrierten Sperrservers in Linux NFS. Die Schritte zur Fehlerbehebung wurden entwickelt, um festzustellen, warum es (anscheinend) nicht funktionierte ...
Insyte