NFSのローカルファイルロックはLinuxカーネルに依存します。

NFSのローカルファイルロックはLinuxカーネルに依存します。

NFS経由でファイルを処理する必要があるpython2アプリケーションがあります。残念ながら、アプリケーションは次のlock()ロックを使用します。

#!/usr/bin/env python2

import fcntl

print('Opening')
foo = open('file/on/NFS/share')
print('Locking')
fcntl.flock(foo, fcntl.LOCK_EX)
print('Closing')
foo.close()

失敗した:

Opening
Locking
Traceback (most recent call last):
  File "./flock_lock.py", line 8, in <module>
    fcntl.flock(foo, fcntl.LOCK_EX)
IOError: [Errno 9] Bad file descriptor

fcntl.flock()ロックに変更するとfcntl.fcntl()機能します。しかし、これは単なるテストコードです。私できない本番アプリケーションのコードを変更します。これはいいえコード問題なのでここに属すると思います。

nolockNFS共有を使用および/またはマウントしましたlocal_lock=all
~によるとネットワークファイルシステム(5):

nolockオプションを使用すると、アプリケーションはファイルをロックできますが、これらのロックは同じクライアントで実行されている他のアプリケーションに対してのみ除外機能を提供します。

(D10もご覧ください。ここ)

そして:

クラスターおよび POSIX ロック機構の一方または両方に対してローカルロックを使用するかどうかを指定します。 [...]Linux NFSクライアントはローカルでロックを実行する方法を提供します。つまり、アプリケーションはファイルをロックできますが、これらのロックは、同じクライアントで実行されている他のアプリケーションの除外のみを提供することを意味します。

違いは何であるかよくわかりませんが、これらのオプションを使用してローカル専用ロック(私には問題ありません)を有効にし、IOエラーを防ぐことはできませんか?

群れ(2)説明する:

2.6.11より前のLinuxカーネルでは、Flock()はNFSを介してファイルをロックしませんでした(つまり、ロックスコープはローカルシステムに制限されていました)。 [...] Linux 2.6.12以降、NFSクライアントはFCをファイル全体のバイト範囲ロックとしてエミュレートしてFlock()ロックをサポートします。

NFSサーバーとNFSクライアントの両方が実行されています。ScientificLinux7.4(CentOSによく似ています)、カーネル3.10。
カーネル 3.10 は fancy() を使って NFS ファイルをロックできませんか?

Ubuntu 16.04(カーネル4.4.0)ホストにNFS共有をマウントしようとしましたが、ロックが正しく機能しました!
その後、Scientific Linuxクライアントをカーネル4.4.91にアップデートしましたが、うまくいきました!
これは素晴らしいですが、私ははるかにストックカーネル3.10を使用して、本番クライアントを簡単に実行できます。

質問:機能するローカルロックを使用して共有をマウントする方法(いいえ既存のカーネル3.10でカーネルを更新)?

ボーナスnolocklocal_lock=all:なぜ、マウントオプションが言うように動作しないのですか?私はマンページを間違って理解したのでしょうか?マニュアルページには動作すると言われていますが、
なぜカーネル> 2.6.11では動作しないのですか?カーネル4.4にアップグレードすると、この問題が解決するのはなぜですか?flock()

ベストアンサー1

私はこの行動をRedHatに報告しました。これは実際にはRedHatカーネルのバグが原因で発生し、kernel-3.10.0-693.18.1.el7で修正されました。少なくともNFSv3の場合はそうです。 NFSv4の場合、これは望ましい動作のようです。

RedHat サブスクリプションがある場合は、チケットを見つけることができます。チケット 01951116

おすすめ記事