在Linux中,在NFS上打开O_CREAT | O_EXCL?

10
在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(晚于内核2.6.23版本)中显示了该内核的有效性是在2.6.0发布四年后才开始的,并且网络上充斥着用户在过去一两年中对此使用的谴责。我想在RHEL 5(2.6.18)系统上使用这个设置,但是我无法确定何时它真正变得安全。有人有一个明确的答案吗?


有没有一个编程问题在那里? - Gabe
我在第一句话中的意图就是如此。既然人们可以针对 C++ 标准库中类似 std::fstream::fstream(char const *, ios_base::openmode) 的问题提问,我希望 C 标准库也是公开的,甚至是关于非 POSIX 选项的。 - Jeff
为了更好地表达原意,本文已经大幅简化。如果原来的问题是清晰度,那么现在应该更容易理解了。 - Jeff
6
离题关闭是完全错误的。如何在NFS上安全使用锁文件绝对是编程问题。 - caf
1个回答

8

据NFS团队称,从NFSv3和Linux2.6.5开始,一切都正常。

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

  • D10. 我试图使用flock()/ BSD锁定来锁定在多个客户端上使用的文件,但文件变得损坏。为什么?
    • A. flock()/ BSD锁定仅在Linux NFS客户端2.6.12之前本地操作。请使用fcntl()/ POSIX锁定以确保文件锁对其他客户端可见。
    • 以下是一些序列化访问NFS文件的方法。
      • 使用fcntl()/ POSIX锁定API。这种类型的锁定通过NLM协议或通过NFSv4提供跨多个客户端的字节范围锁定。
      • 使用单独的锁定文件,并创建硬链接。请参阅creat(2)手册页面中O_EXCL部分的描述。
    • 值得注意的是,在早期的2.6内核之前,Linux NFS客户端上的O_EXCL创建不是原子的。除非您运行新于2.6.5的内核,否则不要使用O_EXCL创建并期望多个NFS客户端之间的原子行为。
    • ...

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接