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を使用しないでください。2.6.5より新しいカーネルを実行している場合を除き、複数のNFSクライアント間でアトミックな動作を作成し、予期しません。
Perlがデフォルトでflock()/ BSDロックを使用することは既知の問題です。これにより、flock / BSDロックがPOSIXロックのように機能することを期待するSolarisなどの他のオペレーティングシステムから移植されたプログラムが破損する可能性があります。
Linuxでは、ハードリンクの代わりにファイルロックを使用すると、クライアントのキャッシュをサーバーにチェックポイントするという追加の利点があります。ファイルロックが取得されると、クライアントはそのファイルのページキャッシュをフラッシュし、その後の読み取りでサーバーから新しいデータが取得されるようにします。ファイルのロックが解除されると、そのクライアント上のファイルへの変更は、ロックが解除される前にサーバーにフラッシュバックされるため、そのファイルのロックを待機している他のクライアントが変更を確認できます。
2.6.12のNFSクライアントは、POSIXバイト範囲ロックに関してBSDスタイルのロックをエミュレートすることにより、NFSファイルのflock()/ BSDロックをサポートします。同じエミュレーションメカニズムを使用する、またはfcntl()/ POSIXロックを使用する他のNFSクライアントは、Linux NFSクライアントが表示するのと同じロックを表示します。
ローカルLinuxファイルシステムでは、POSIXロックとBSDロックは互いに見えません。したがって、このエミュレーションにより、Linux NFSサーバーで実行されているアプリケーションは、クライアント上のアプリケーションがBSDスタイルまたはPOSIX-スタイルロック。サーバーアプリケーションがflock()BSDロックを使用する場合、NFSクライアントが使用するロックは表示されません。