我正在尝试使用flock()/ BSD锁来锁定多个客户端上使用的文件,但是这些文件已损坏。怎么来的?A. flock()/ BSD锁仅在2.6.12之前的Linux NFS客户端上本地起作用。使用fcntl()/ POSIX锁来确保文件锁对其他客户端可见。
以下是一些序列化对NFS文件的访问的方法。
使用fcntl()/ POSIX锁定API。这种锁定类型通过NLM协议或NFSv4在多个客户端之间提供字节范围锁定。使用一个单独的锁文件,并创建到它的硬链接。请参见creat(2)手册页的O_EXCL部分中的描述。值得注意的是,直到2.6早期的内核,O_EXCL才在Linux NFS客户端上创建。除非您运行的内核版本低于2.6.5,否则不要使用O_EXCL在多个NFS客户端之间创建并期望原子行为。
Perl默认使用flock()/ BSD锁定是一个已知问题。这可能会破坏从其他操作系统(例如Solaris)移植的程序,这些程序希望flock / BSD锁能够像POSIX锁一样工作。
在Linux上,使用文件锁定而不是硬链接具有将服务器的客户机缓存检查点确定为其他优点。获取文件锁后,客户端将刷新该文件的页面缓存,以便所有后续读取均从服务器获取新数据。释放文件锁后,对该客户端上文件的任何更改都将在释放该锁之前刷新回服务器,以便其他等待锁定该文件的客户端可以看到更改。
2.6.12中的NFS客户端通过根据POSIX字节范围锁模拟BSD样式锁来提供对NFS文件上的flock()/ BSD锁的支持。然后,使用相同仿真机制或使用fcntl()/ POSIX锁的其他NFS客户端将看到与Linux NFS客户端相同的锁。
在本地Linux文件系统上,POSIX锁和BSD锁彼此不可见。因此,由于这种模拟,无论客户端上的应用程序使用的是BSD样式还是POSIX-样式锁。如果服务器应用程序使用flock()BSD锁,它将看不到NFS客户端使用的锁。