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


10

しばらく前に、ファイルが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で実行されました

回答:


4

NFSサポートをinotifyしますか?

ネットを見回すと、inotifyはNFSをサポートしているように見えますが、その方法は非常に限られています。

展示#1

理由は、このStackOverflowのQ&Aというタイトルの「inotify with NFS」で説明されています

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

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

リモートNFSマシンでは、変更はカーネルからは見えません。それは完全にリモートで発生します。NFSはinotifyよりも古く、NFSでのネットワークレベルのサポートや同等のサポートはありません。

展示#2

inotifyのFAQを調べたら、もう少し調べてください。

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

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

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

最終的にあなたが経験しているのは、ローカルにマウントされたファイルシステムと同じすべての機能に相当するアップルからアップルへのNFSは提供していないということです。

たとえばnfs linuxスレッドから

  • CIFSには通知機能が組み込まれています(oplock)
  • NFSは通知用の「リース」を提供します

ここでのポイントは、CIFSやNFSなどの代替ファイルシステムは、直接サポートする場合でも、非常に基本的なサポートを提供するということです。

NFS v4の状態

NFS v4の状態に関するIBMの記事からの抜粋

NFSバージョン4は、クライアントが状態を確立または再確立するためのプロトコルを提供し、後続のサーバーのステートフル操作の所有権を以前に確立された状態に関連付けます。クライアントの不在の問題を解決するには、NFSバージョン4クライアントは、サーバーが指定したリース時間内に状態を定期的に更新する必要があります。リースのタイムアウト時に、サーバーはクライアントのリソースを解放し、他のアプリケーションで利用できるようにする場合があります。

  • クライアントは、getattr操作を発行して、サーバー指定のリースタイムアウト属性を取得します。getattrはステートフルな操作ではないため、事前に状態を確立する必要はありません。getattr操作は、setclientidまたはsetclientid_confirm操作の前に実行できます。
  • リース期間の設定とチューニングについては、NFSサーバーのリース時間サイト属性を参照してください。*

3
OPはNFSでイベントを表示しているように見えますが、それらはローカルファイルシステムで表示されるイベントとはまったく異なります。リンクされている質問と回答はinotify、NFS にイベントがないことを示しているようです。
iruvar 2013
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.