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:
- Herde (2)
- fcntl (2)
- 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??
quelle
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.
quelle
Ein weiteres, direkt aus den Linux-NFS-FAQ: nfs.sf.net
quelle
flock
hat nicht, nicht und wird nicht über NFS-Mounts sperren.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.quelle