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 内核都可以,但是手册页更改日志(ca 后期内核 2.6.23)在 2.6.0 上线四年后开始显示有效性,并且网络上充斥着董事会用户在去年谴责这种使用或两个。我想在 RHEL 5 (2.6.18) 系统上使用这个设置,但是当它真正变得安全时我无法确定。有人有明确的答案吗?

4

1 回答 1

8

显然,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 客户端上并不是原子的。不要使用 O_EXCL 在多个 NFS 客户端之间创建并期望原子行为,除非您运行的内核比2.6.5更新。
    • ...
于 2010-08-04T17:59:19.633 回答