inotifywait は、rsync と組み合わせて準リアルタイムでデータをバックアップ/同期するために一般的に使用されていますが、inotify の実装により、NAS ファイルシステムでは正しく機能しない可能性があります。

inotify のしくみ

inotify は Linux カーネルのサブモジュールで、inotifywait は inotify のユーザーモードインターフェイスです。 inotify は VFS 層で実現されます。 ファイル操作が VFS 層に達すると、inotify モジュールは操作タイプ (作成/削除/属性変更など) と操作オブジェクト (ファイル名) をユーザーモードに送信し、ユーザーモード inotifywait はその操作情報をユーザーへ出力します。

問題

inotify はカーネルの VFS 層で実装されているため、ローカルカーネルは NFS ファイルシステム上でリモートクライアントによって行われた操作を認識できません。 したがって、inotify はリモートクライアントではファイルの変更を認識できません。

クライアント A とクライアント B に同じ NAS ファイルシステムを同時にマウントし、クライアント A で inotifywait を有効にしてマウントされたディレクトリをモニターすると、次のようになります。
  • inotifywait は、クライアント A のマウントされたディレクトリ内のファイルに対する操作を認識します。
  • inotify は、クライアント B のマウントされたディレクトリ内のファイルに対する操作を認識できません。

解決方法

代わりの解決策は FAM を使用することです。

FAM はファイルやディレクトリをモニターするために使用されるライブラリで、完全にユーザーモードで実装されています。 バックグラウンドでデーモンを実行するだけで、定期的にディレクトリをスキャンしてファイルの変更を確認できます。

ただし、FAM を使用すると次のような問題があります。
  • FAM インターフェイス実装関数を呼び出すためのプログラムを書く必要があります。
  • 大量のファイルがあるシナリオでは、FAM を使用するとパフォーマンスが低下し、多くのリソースが消費される可能性があります。 さらに、FAM はリアルタイムモニタリングを保証することができません。