Inotify

inotify (inode notify) とは、ファイルシステムへの変更を通知するようファイルシステムを拡張して、その変更をアプリケーションに報告するLinuxカーネルサブシステムである。inotifyに先行して存在し、類似の目標を持つdnotify(英語版)は、inotifyに取って代わられている。

inotifyはJohn McCutchanが作成し[1]、2005年8月29日にリリースされたLinuxカーネルのバージョン2.6.13で、inotifyはLinuxカーネルメインラインにマージされた[2]。以降のバージョンのLinuxカーネルでは、inotifyはさらに改良されている。GNU Cライブラリ (glibc) では、inotifyに必要なライブラリインタフェースは2006年3月にリリースされたバージョン2.4で追加され、2006年9月にリリースされたバージョン2.5でinotifyを完全にサポートした[3]

inotifyの主な用途の1つとしては、Beagleなどのデスクトップ検索ユーティリティが挙げられる。inotifyの機能により、数分おきにファイルシステム変更をスキャンするといった非常に効率が悪い作業をせずに、変更されたファイルの再インデックス化(英語版)が可能となる。

inotifyは、ディレクトリビューの自動更新、設定ファイルの再読み込み、ログの変更、バックアップ同期アップロードなどにも使える。

制限

inotifyにより課される制限は以下の通りである:

  • inotifyは再帰的なディレクトリ監視をサポートしていない。このため、inotifyによる監視はサブディレクトリ毎に個別に行う必要がある[4]
  • inotifyは、sysfsprocfsによるイベントは一部しか報告しない。
  • inotify経由の通知は、直近に発生したファイルシステムのイベントをカーネルが全て認識していることが前提となっているが、NFSなどのネットワーク接続されたファイルシステムに対してそれが常にできているとは限らない。NFSなどはあるクライアントによる変更をすぐには他のクライアントへブロードキャストしないからである。
  • inotifyは改名されたイベントを直接処理しない。つまりinotifyは改名前と改名後のそれぞれにおける2つのイベントを発行する。どの順序でイベントが通知されても良いように、イベントの内容を吟味・照合する必要がある。

歴史

  • 2004年7月 : 最初のリリースがアナウンス[1]
  • 2005年8月29日 : inotifyのコードがマージされた、Linuxカーネルのバージョン2.6.13がリリース[2]
  • 2006年3月 : 最初にinotifyのサポートをしたGNU Cライブラリ (glibc) バージョン2.4がリリース[3]
  • 2006年9月 : inotifyを完全にサポートした、glibcバージョン2.5がリリース[3]

dnotifyに対する利点

inotifyには先行して存在するdnotify(英語版) APIと比べて利点が多いため、dnotifyはinotifyに置き換えられている[5][6][7]。dnotifyを使う場合、プログラムは監視用としてディレクトリ毎に1つのファイル記述子を使う必要があるため、プロセス毎のファイル記述子制限に到達した場合にボトルネックとなってしまう。後にこの問題を克服したfanotifyが作られた。さらにリムーバブルメディア使用時にdnotifyがファイル記述子を使うと問題があることも判明した。ファイル記述子はリソースをビジー状態に維持するため、デバイスをアンマウントできないからである。

その他のdnotifyの欠点としては、dnotifyの粒状性レベルが挙げられる。プログラマはディレクトリレベルでしか変更を監視できない。通知メッセージが送られた場合に発生する環境の変更に対する詳細な情報にアクセスするためにはstat構造体を使う必要があるが、stat構造体の使用は必要悪とされる。新規に生成されたstat構造体とそれに対応するキャッシュされたstat構造体との比較が、stat構造体が新規生成される度に行われるからである。

inotify APIはプログラマに対し、dnotifyが使うシグナル通知システムではなく、定着したselectとpollインターフェイスを使えるようにしているため、inotify APIが使うファイル記述子はdnotifyが使うそれよりもはるかに少ない。これにより、inotify APIを(GLibなどの)既存のselectやpollベースのライブラリと統合しやすい。

関連項目

  • File Alteration Monitor(英語版)
  • Gamin(英語版)
  • DMAPI(英語版)
  • kqueue(英語版)
  • FSEvents(英語版)
  • inotail

脚注

  1. ^ a b “fa.linux.kernal post [RFC[PATCH] inotify 0.8]” (2004年7月29日). 2013年8月19日閲覧。
  2. ^ a b Linux 2.6.13, kernelnewbies.org
  3. ^ a b c inotify man page
  4. ^ Robert Love, Linux system programming. オライリー、p. 236
  5. ^ Michael Kerrisk(英語版) (2014年7月14日). “Filesystem notification, part 2: A deeper investigation of inotify”. LWN.net(英語版). 2017年3月26日閲覧。
  6. ^ Why inotify?
  7. ^ inotify README file

外部リンク

  • Kernel Korner  – Robert Loveによるinotifyの紹介(2005年)
  • LWN Article on Inotify – inotifyを使わないファイルシステム監視(一部古い説明あり)
  • IBM Article – inotifyを使わないLinuxファイルシステムイベントのモニタリング(2008年9月6日)
  • Filesystem notification, part 1: An overview of dnotify and inotify – Michael KerriskによるLWN.netの記事(2014年)
Linux
Linuxのマスコット、タックス
Linuxディストリビューション
GNU
Xウィンドウマネージャ
ユーザインタフェース
アプリケーション
人物
メディア
一覧
  • デバイス(英語版)
  • ディストリビューション(英語版)
  • Live CD(英語版)
  • Linux対応プロプライエタリソフトウェア(英語版)
システムの配置と
特徴
モバイル
セキュリティ
その他
  • カテゴリカテゴリ
  • ウィキブックスウィキブックス