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

时间:2010-08-04 14:48:47

标签: linux file-io glibc nfs

在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  ...

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

1 个答案:

答案 0 :(得分:7)

显然,NFS人声称 NFSv3 和Linux 2.6.5 上的任何内容都可以。

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

  • D10。我正在尝试使用flock()/ BSD锁来锁定多个客户端上使用的文件,但文件已损坏。怎么来的?
    • 甲。 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创建并期望原子行为。
    • ...