打开O_CREAT | Linux上的NFS上的O_EXCL?

Jef*_*eff 9 linux file-io nfs glibc

什么时候在Linux 2.6内核和NFSv3中确实open("fname", O_CREAT|O_EXCL)有效?当前的规范open(2)系统调用文档(http://www.kernel.org/doc/man-pages/online/pages/man2/open.2.html)说一切都很好:

  - O_EXCL  
   - ...  
      On NFS, O_EXCL is only supported when using NFSv3 or later on kernel  
      2.6 or later.  In NFS environments where O_EXCL support is not  
      provided, programs that rely on it for performing locking tasks will  
      contain a race condition.  Portable programs that want to perform  
      atomic file locking using a lockfile, and need to avoid reliance on NFS  
      support for O_EXCL, can  ...
Run Code Online (Sandbox Code Playgroud)

这看起来好像所有2.6内核都没问题,但是手册页面更改日志(ca late kernel 2.6.23)开始显示2.6.0上线四年后的有效性,并且网络充斥着董事会用户在去年内谴责这种用法或两个.我想在RHEL 5(2.6.18)系统上使用这个设置,但是当它真正变得安全时我无法确定.有没有人有明确的答案?

Jef*_*eff 7

显然,NFS人声称任何来自NFSv3和Linux 2.6.5的东西都可以.

来自http://nfs.sourceforge.net/#faq_d10:

  • D10.我正在尝试使用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更新的内核,否则不要在多个NFS客户端之间使用O_EXCL创建并期望原子行为.
    • ...