NFSマウントでInotifyイベントが異なるのはなぜですか?

NFSマウントでInotifyイベントが異なるのはなぜですか?

しばらく前に、ファイルがNFSマウントに保存されたときとローカルファイルシステムに保存されたときにinotifyが報告するイベントが異なることがわかりました。

デフォルトのVFSはファイル操作の統合ビューを提供しないのですか?

以下は、Debian 7.1(Linux 3.2)のVIMストレージファイルの軌跡です。

NFSマウントから:

wd=1 mask = 32 (IN_OPEN)
wd=1 mask = 16 (IN_CLOSE_NOWRITE)
wd=1 mask = 2048 (IN_MOVE_SELF)
wd=1 mask = 4 (IN_ATTRIB)
wd=1 mask = 1024 (IN_DELETE_SELF)
wd=1 mask = 32768 )

ローカルファイルシステムで

wd=1 mask = 32 (IN_OPEN)
wd=1 mask = 16 (IN_CLOSE_NOWRITE)
wd=1 mask = 2 (IN_MODIFY)
wd=1 mask = 32 (IN_OPEN)
wd=1 mask = 8 (IN_CLOSE_WRITE)
wd=1 mask = 4 (IN_ATTRIB)

EMACSを使用してファイルを保存すると、他の動作が表示されます。

NFSマウントから:

wd=1 mask = 32 (IN_OPEN)
wd=1 mask = 16 (IN_CLOSE_NOWRITE)
wd=1 mask = 2048 (IN_MOVE_SELF)

ローカルファイルシステムでは:

wd=1 mask = 32 (IN_OPEN)
wd=1 mask = 16 (IN_CLOSE_NOWRITE)
wd=1 mask = 2 (IN_MODIFY)
wd=1 mask = 32 (IN_OPEN)
wd=1 mask = 2 (IN_MODIFY)
wd=1 mask = 8 (IN_CLOSE_WRITE)

これらのテストは、以下を使用して実行されます。inotify-touch.c

ベストアンサー1

inotify NFSはサポートされていますか?

Webを見回すと、inotifyはNFSをサポートできますが、非常に限られた方法でサポートされます。

展示#1

その理由は、次のStackOverflow Q&Aで説明されています。InotifyでNFSを使用する

から抜粋受け入れられた回答

inotifyが機能するにはカーネルサポートが必要です。アプリケーションがディレクトリを追跡するときに、これらの変更が発生したときに通知するようにカーネルに要求します。変更が発生すると、これらの変更をディスクに書き込むことに加えて、カーネルは監視プロセスに通知します。

リモートNFSシステムでは、変更はカーネルにまったく表示されません。 NFS は inotify に先んじており、NFS などのネットワークレベルのサポートはありません。

展示#2

ご覧になればもう少し勉強してみてくださいよくある質問(FAQ)

Q:sysfs(procfs、nfs ...)を見ることはできますか?

簡単に言えばそうです。しかし、いくつかの制限があります。これらの制限はカーネルのバージョンによって異なり、より小さくなる傾向があります。特定のファイルシステムについてお読みください。

そんなに支持してる?

最終的にあなたが経験している問題は、NFSがローカルにマウントされたファイルシステムと同じ機能を提供しないことです。

例えばからLinuxスレッドnfs:

  • CIFSには通知機能(機会ロック)が組み込まれています。
  • NFSは「リース」通知を提供します。

ここで重要なのは、CIFSやNFSなどの代替ファイルシステムがinotifyの非常に基本的な(存在する場合)直接サポートを提供することです。

NFS v4ステータス

から抜粋NFS v4 ステータスに関する IBM 記事

NFSバージョン4は、クライアントが状態を設定またはリセットし、後続のサーバー状態保存操作の所有権を以前に設定された状態に関連付けることができるプロトコルを提供します。欠落しているクライアントを解決するには、NFSバージョン4クライアントは、サーバーによって指定されたリース期間中に定期的に状態を更新する必要があります。リースが期限切れになった後、サーバーはクライアントのリソースを解放し、それを他のアプリケーションで使用できるようにすることができます。

  • クライアントは getattr ジョブを実行し、サーバーによって指定されたリースタイムアウト属性を取得します。 getattr はステートフル操作ではないため、以前の状態を設定する必要はありません。 getattr操作は、setclientidまたはsetclientid_confirm操作の前に実行できます。
  • リース期間を設定して調整するには、NFSサーバーのリース期間サイトのプロパティを参照してください。 *

おすすめ記事