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 カーネルに問題がないかのように見えますが、man ページの変更ログ(ca late kernel 2.6.23) は、2.6.0 が公開されてから4 年後に有効性を示し始めており、Web には、この 1 年以内にこの使用を非難するボード ユーザーがあふれています。または2つ。このセットアップを RHEL 5 (2.6.18) システムで使用したいのですが、本当に安全になったかどうかを特定できませんでした。誰も決定的な答えを持っていますか?

4

1 に答える 1

8

どうやら、NFSの連中は、 NFSv3Linux2.6.5以降は何でも問題ないと主張しています。

http://nfs.sourceforge.net/#faq_d10から:

  • D10。flock()/ BSDロックを使用して、複数のクライアントで使用されているファイルをロックしようとしていますが、ファイルが破損しています。どうして?
    • A. flock()/ BSDロックは、2.6.12より前のLinuxNFSクライアントでのみローカルに機能します。fcntl()/ POSIXロックを使用して、ファイルロックが他のクライアントに表示されるようにします。
    • NFSファイルへのアクセスをシリアル化するいくつかの方法があります。
      • fcntl()/POSIXロッキングAPIを使用します。このタイプのロックは、NLMプロトコルまたはNFSv4を介して複数のクライアント間でバイト範囲のロックを提供します。
      • 別のロックファイルを使用して、それにハードリンクを作成します。creat(2)のマニュアルページのO_EXCLセクションの説明を参照してください。
    • 2.6の初期のカーネルまで、O_EXCLの作成はLinuxNFSクライアントではアトミックではなかったことは注目に値します。2.6.5より新しいカーネルを実行している場合を除き、O_EXCLを使用して、複数のNFSクライアント間でアトミックな動作を作成および期待しないでください。
    • ..。
于 2010-08-04T17:59:19.633 に答える