名 前
fanotify − フ ァ イ ル シ ス テ ム イ ベ ン ト を 監 視 す る
説 明
fanotify API は フ ァ イ ル シ ス テ ム イ ベ ン ト の 通 知 と 横 取 り 機 能 (interception) を 提 供 す る 。 ユ ー ス ケ ー ス と し て は 、 ウ イ ル ス ス キ ャ ン や 階 層 型 ス ト レ ー ジ の 管 理 な ど が あ る 。 現 在 の と こ ろ 、 限 定 的 な イ ベ ン ト の み が サ ポ ー ト さ れ て い る 。 特 に 、 作 成 (create)、 削 除 (delete)、 移 動 (move) イ ベ ン ト が サ ポ ー ト さ れ て い な い (こ れ ら の イ ベ ン ト を 通 知 す る API の 詳 細 に つ い て は inotify(7) を 参 照 )。
inotify(7) API と 比 較 し て 追 加 さ れ て い る 機 能 と し て は 、 マ ウ ン ト さ れ た フ ァ イ ル シ ス テ ム の 全 オ ブ ジ ェ ク ト を 監 視 す る 機 能 、 ア ク セ ス 許 可 の 判 定 を 行 う 機 能 、 他 の ア プ リ ケ ー シ ョ ン に よ る ア ク セ ス の 前 に フ ァ イ ル を 読 み 出 し た り 変 更 し た り す る 機 能 が あ る 。 こ の API で は 以 下 の シ ス テ ム コ ー ル を 使 用 す る : fanotify_init(2), fanotify_mark(2), read(2), write(2), close(2)。
fanotify_init(),
fanotify_mark() と 通 知 グ ル
ー プ
fanotify_init(2) シ ス テ ム
コ ー ル は fanotify 通
知 グ ル ー プ を
作 成 、 初 期 化
し 、 こ の 通 知
グ ル ー プ を 参
照 す る フ ァ イ
ル デ ィ ス ク リ
プ タ ー を 返 す
。
fanotify 通 知 グ ル ー プ は カ ー ネ ル 内 部 の オ ブ ジ ェ ク ト で 、 イ ベ ン ト が 作 成 さ れ る フ ァ イ ル 、 デ ィ レ ク ト リ 、 マ ウ ン ト ポ イ ン ト の リ ス ト を 保 持 す る 。
fanotify 通 知 グ ル ー プ の 各 エ ン ト リ ー に は 2 つ の ビ ッ ト マ ス ク が あ る 。 mark マ ス ク と ignore マ ス ク で あ る 。 mark マ ス ク は ど の フ ァ イ ル 操 作 に つ い て イ ベ ン ト を 作 成 す る か を 定 義 す る 。 ignore マ ス ク は ど の 操 作 に つ い て イ ベ ン ト を 作 成 し な い か を 定 義 す る 。 こ れ ら の 2 種 類 の マ ス ク が あ る こ と で 、 マ ウ ン ト ポ イ ン ト や デ ィ レ ク ト リ に 対 し て イ ベ ン ト の 受 信 を mark し て お き つ つ 、 同 時 に そ の マ ウ ン ト ポ イ ン ト や デ ィ レ ク ト リ 配 下 の 特 定 の オ ブ ジ ェ ク ト に 対 す る イ ベ ン ト を 無 視 す る 、 と い っ た こ と が で き る 。
fanotify_mark(2) シ ス テ ム コ ー ル は 、 フ ァ イ ル 、 デ ィ レ ク ト リ 、 マ ウ ン ト を 通 知 グ ル ー プ に 追 加 し 、 ど の イ ベ ン ト を 報 告 (も し く は 無 視 ) す る か を 指 定 す る 。 ま た 、 こ の よ う な エ ン ト リ ー の 削 除 、 変 更 も 行 う 。
ignore マ ス ク の 考 え ら れ る 使 用 方 法 は フ ァ イ ル キ ャ ッ シ ュ に 対 し て で あ る 。 フ ァ イ ル キ ャ ッ シ ュ に 関 し て 興 味 の あ る イ ベ ン ト は 、 フ ァ イ ル の 変 更 と フ ァ イ ル の ク ロ ー ズ で あ る 。 そ れ ゆ え 、 キ ャ ッ シ ュ さ れ た デ ィ レ ク ト リ や マ ウ ン ト ポ イ ン ト は 、 こ れ ら の イ ベ ン ト を 受 信 す る よ う に マ ー ク さ れ る 。 フ ァ イ ル が 変 更 さ れ た と い う 最 初 の イ ベ ン ト を 受 信 し た 後 は 、 対 応 す る キ ャ ッ シ ュ エ ン ト リ ー は 無 効 化 さ れ る 。 そ の フ ァ イ ル が ク ロ ー ズ さ れ る ま で は 、 こ の フ ァ イ ル に 対 す る 変 更 イ ベ ン ト は 興 味 の な い 情 報 と な る 。 し た が っ て 、 変 更 イ ベ ン ト を ignore マ ス ク に 追 加 す る こ と が で き る 。 ク ロ ー ズ イ ベ ン ト を 受 信 す る と 、 変 更 イ ベ ン ト を ignore イ ベ ン ト か ら 削 除 し 、 フ ァ イ ル キ ャ ッ シ ュ エ ン ト リ ー を 更 新 す る こ と が で き る 。
fanotify 通 知 グ ル ー プ の エ ン ト リ ー は 、 フ ァ イ ル や デ ィ レ ク ト リ で は inode 番 号 経 由 で 参 照 さ れ 、 マ ウ ン ト で は マ ウ ン ト ID 経 由 で 参 照 さ れ る 。 フ ァ イ ル や デ ィ レ ク ト リ の 名 前 が 変 更 さ れ た り 、 移 動 さ れ た り し た 場 合 も 、 関 連 す る エ ン ト リ ー は そ の ま ま 残 る 。 フ ァ イ ル や デ ィ レ ク ト リ が 削 除 さ れ た り 、 マ ウ ン ト が ア ン マ ウ ン ト さ れ た り し た 場 合 に は 、 対 応 す る エ ン ト リ ー は 削 除 さ れ る 。 イ ベ ン ト キ ュ ー 通 知 グ ル ー プ に よ り 監 視 さ れ て い る フ ァ イ ル シ ス テ ム オ ブ ジ ェ ク ト で イ ベ ン ト が 発 生 す る と 、 fanotify シ ス テ ム は イ ベ ン ト を 生 成 し 、 そ の イ ベ ン ト は キ ュ ー に ま と め ら れ る 。 こ れ ら の イ ベ ン ト は 、 fanotify_init(2) が 返 し た fanotify フ ァ イ ル デ ィ ス ク リ プ タ ー か ら (read(2) な ど を 使 っ て ) 読 み 出 す こ と が で き る 。
2 種 類 の イ ベ ン ト が 生 成 さ れ る 。 notification (通 知 ) イ ベ ン ト と permission (ア ク セ ス 許 可 ) イ ベ ン ト で あ る 。 通 知 イ ベ ン ト は 単 な る 情 報 通 知 で あ り 、 イ ベ ン ト で 渡 さ れ た フ ァ イ ル デ ィ ス ク リ プ タ ー を ク ロ ー ズ す る 場 合 (下 記 参 照 ) を 除 き 、 受 信 し た ア プ リ ケ ー シ ョ ン で ア ク シ ョ ン を 取 る 必 要 は な い 。 ア ク セ ス 許 可 イ ベ ン ト は 、 受 信 し た ア プ リ ケ ー シ ョ ン が フ ァ イ ル ア ク セ ス の 許 可 を 承 認 す る か を 判 定 す る 必 要 が あ る 。 こ の 場 合 、 受 信 者 は ア ク セ ス が 許 可 さ れ た か 否 か を 決 定 す る 応 答 を 書 き 込 ま な け れ ば な ら な い 。 イ ベ ン ト は 、 読 み 出 さ れ る と 、 fanotify グ ル ー プ の イ ベ ン ト キ ュ ー か ら 削 除 さ れ る 。 読 み 出 さ れ た ア ク セ ス 許 可 イ ベ ン ト は 、 fanotify フ ァ イ ル デ ィ ス ク リ プ タ ー に ア ク セ ス 許 可 の 判 定 が 書 き 込 ま れ る か 、 fanotify フ ァ イ ル デ ィ ス ク リ プ タ ー が ク ロ ー ズ さ れ る ま で 、 fanotify グ ル ー プ の 内 部 の リ ス ト に 保 持 さ れ る 。
fanotify
イ ベ ン ト の 読
み 出 し
fanotify_init(2) が 返 し た
フ ァ イ ル デ ィ
ス ク リ プ タ ー
に 対 す る read(2) を
呼 び 出 し は 、
(fanotify_init(2) の 呼 び 出
し で フ ラ グ
FAN_NONBLOCK を 指 定 し
な か っ た 場 合 )
フ ァ イ ル イ ベ
ン ト が 起 こ る
か 、 呼 び 出 し
が シ グ ナ ル に
よ っ て 割 り 込
ま れ る (signal(7) 参
照 ) ま で 停 止 す
る 。
read(2) が 成 功 す る と 、 読 み 出 し バ ッ フ ァ ー に は 以 下 の 構 造 体 が 1 つ 以 上 格 納 さ れ る 。
struct
fanotify_event_metadata {
__u32 event_len;
__u8 vers;
__u8 reserved;
__u16 metadata_len;
__aligned_u64 mask;
__s32 fd;
__s32 pid; }; 性 能 上 の 理
由 か ら 、 複 数
の イ ベ ン ト を
一 度 の read(2) で 取
得 で き る よ う
に 大 き め の バ
ッ フ ァ ー サ イ
ズ (例 え ば 4096 バ イ
ト ) を 使 用 す る
こ と を 推 奨 す
る 。
read(2) の 返 り 値 は バ ッ フ ァ ー に 格 納 さ れ た バ イ ト 数 で あ る 。 エ ラ ー の 場 合 は −1 が 返 さ れ る (た だ し 、 バ グ も 参 照 )。
fanotify_event_metadata
構 造 体 の フ ィ
ー ル ド は 以 下
の と お り で あ
る 。
event_len こ れ は 、 こ
の イ ベ ン ト の
デ ー タ 長 で あ
り 、 バ ッ フ ァ
ー 内 の 次 の イ
ベ ン ト へ の オ
フ セ ッ ト で あ
る 。 現 在 の 実
装 で は 、 event_len
の 値 は 常 に
FAN_EVENT_METADATA_LEN で あ る
。 し か し な が
ら 、 API は 将 来 可
変 長 の 構 造 体
を 返 す こ と が
で き る よ う に
設 計 さ れ て い
る 。
vers こ の フ ィ ー ル ド に は 構 造 体 の バ ー ジ ョ ン 番 号 が 入 る 。 実 行 時 に 返 さ れ た 構 造 体 が コ ン パ イ ル 時 の 構 造 体 と 一 致 し て い る か を 検 査 す る に は 、 こ の 値 を |
FANOTIFY_METADATA_VERSION
を 比 較 す る こ
と 。 一 致 し な
い 場 合 、 ア プ
リ ケ ー シ ョ ン
は そ の fanotify フ ァ
イ ル デ ィ ス ク
リ プ タ ー を 使
用 す る の を 諦
め る べ き で あ
る 。
reserved こ の フ ィ ー
ル ド は 使 用 さ
れ な い 。
metadata_len こ の 構 造
体 の 長 さ で あ
る 。 こ の フ ィ
ー ル ド は 、 イ
ベ ン ト 種 別 単
位 の オ プ シ ョ
ン ヘ ッ ダ ー の
実 装 を 扱 う た
め に 導 入 さ れ
た 。 現 在 の 実
装 で は こ の よ
う な オ プ シ ョ
ン ヘ ッ ダ ー は
存 在 し な い 。
mask イ ベ ン ト を 示 す ビ ッ ト マ ス ク で あ る |
(下 記 参 照 ) 対 す る オ ー プ ン さ れ た フ ァ イ ル デ ィ ス ク リ プ タ ー で あ る 。 ま た は 、 キ ュ ー の オ ー バ ー フ ロ ー が 発 生 し た 場 合 に は FAN_NOFD が 入 る 。 フ ァ イ ル デ ィ ス ク リ プ タ ー は 監 視 対 象 の フ ァ イ ル や デ ィ レ ク ト リ の 内 容 に ア ク セ ス す る の に 使 用 で き る 。 読 み 出 し た ア プ リ ケ ー シ ョ ン は 責 任 を 持 っ て こ の フ ァ イ ル デ ィ ス ク リ プ タ ー を ク ロ ー ズ し な け れ ば な ら な い 。 fanotify_init(2) を 呼 び 出 す 際 、 呼 び 出 し 元 は こ の フ ァ イ ル デ ィ ス ク リ プ タ ー に 対 応 す る オ ー プ ン フ ァ イ ル 記 述 に セ ッ ト さ れ た 様 々 な フ ァ イ ル 状 態 フ ラ グ を (event_f_flags 引 き 数 を 使 っ て ) 指 定 す る こ と が で き る 。 さ ら に 、 (カ ー ネ ル 内 部 の ) FMODE_NONOTIFY フ ァ イ ル 状 態 フ ラ グ が オ ー プ ン フ ァ イ ル 記 述 に セ ッ ト さ れ る 。 こ の フ ラ グ は fanotify イ ベ ン ト の 生 成 を 抑 制 す る 。 し た が っ て 、 fanotify イ ベ ン ト の 受 信 者 が こ の フ ァ イ ル デ ィ ス ク リ プ タ ー を 使 っ て 通 知 さ れ た フ ァ イ ル や デ ィ レ ク ト リ に ア ク セ ス し た 際 に 、 こ れ 以 上 イ ベ ン ト が 作 成 さ れ な く な る 。
fanotify イ ベ ン ト を 監 視 し て い る プ ロ グ ラ ム は 、 こ の PID を getpid(2) が 返 す PID と 比 較 す る こ と で 、 イ ベ ン ト が 監 視 し て い る プ ロ グ ラ ム 自 身 か ら 発 生 し た か ど う か 、 別 の プ ロ セ ス に よ る フ ァ イ ル ア ク セ ス に よ り 発 生 し た か 、 を 判 定 で き る 。 mask の ビ ッ ト マ ス ク は 、 1 つ の フ ァ イ ル シ ス テ ム オ ブ ジ ェ ク ト に 対 し て ど の イ ベ ン ト が 発 生 し た か を 示 す 。 監 視 対 象 の フ ァ イ ル シ ス テ ム オ ブ ジ ェ ク ト に 複 数 の イ ベ ン ト が 発 生 し た 場 合 は 、 こ の マ ス ク に 複 数 の ビ ッ ト が セ ッ ト さ れ る こ と が あ る 。 特 に 、 同 じ フ ァ イ ル シ ス テ ム オ ブ ジ ェ ク ト に 対 す る 連 続 す る イ ベ ン ト が 同 じ プ ロ セ ス か ら 生 成 さ れ た 場 合 に は 、 一 つ の イ ベ ン ト に ま と め ら れ る こ と が あ る 。 例 外 と し て 、 2 つ の ア ク セ ス 許 可 イ ベ ン ト が 一 つ の キ ュ ー エ ン ト リ ー に ま と め ら れ る こ と は 決 し て な い 。 mask
で セ ッ ト さ れ
て い る 可 能 性
の あ る ビ ッ ト
は 以 下 の と お
り で あ る 。 FAN_CLOSE_WRITE | FAN_CLOSE_NOWRITE fanotify
フ ァ イ ル デ ィ
ス ク リ プ タ ー
か ら の read(2) が 返
し た fanotify イ ベ ン
ト メ タ デ ー タ
を 含 む バ ッ フ
ァ ー に 対 し て
繰 り 返 し を 行
う た め 、 以 下
の マ ク ロ が 提
供 さ れ て い る
。 fanotify
フ ァ イ ル デ ィ
ス ク リ プ タ ー
の イ ベ ン ト を
監 視 す る struct
fanotify_response {
ル デ ィ ス ク リ プ タ ー で あ る 。 response こ の フ ィ ー ル ド は ア ク セ ス 許 可 を 承 認 す る か ど う か を 示 す 。 値 は 、 こ の フ ァ イ ル 操 作 を 許 可 す る FAN_ALLOW か 、 こ の フ ァ イ ル 操 作 を 拒 否 す る FAN_DENY の い ず れ か で な け れ ば な ら な い 。 ア ク セ ス を 拒 否 し た 場 合 、 ア ク セ ス を 要 求 し た ア プ リ ケ ー シ ョ ン は EPERM エ ラ ー を 受 け 取 る こ と に な る 。 fanotify
フ ァ イ ル デ ィ
ス ク リ プ タ ー
の ク ロ ー ズ /proc/[pid]/fdinfo フ ァ イ ル /proc/[pid]/fdinfo/[fd] に は 、 プ ロ セ ス pid の フ ァ イ ル デ ィ ス ク リ プ タ ー fd の fanotify マ ー ク に 関 す る 情 報 が 格 納 さ れ る 。 詳 細 は カ ー ネ ル の ソ ー ス フ ァ イ ル Documentation/filesystems/proc.txt を 参 照 。 エ ラ ー通 常 の read(2) の エ ラ ー に 加 え 、 fanotify フ ァ イ ル デ ィ ス ク リ プ タ ー か ら 読 み 出 し を 行 っ た 際 に 以 下 の エ ラ ー が 発 生 す る こ と が あ る 。
の RLIMIT_NOFILE の 説 明 を 参 照 。
の /proc/sys/fs/file−max を 参 照 。 ETXTBSY fanotify_init(2) の 呼 び 出 し 時 に O_RDWR か O_WRONLY が event_f_flags 引 き 数 に 指 定 さ れ て お り 、 現 在 実 行 中 の 監 視 対 象 の フ ァ イ ル に 対 し て イ ベ ン ト が 発 生 し た 際 に 、 こ の エ ラ ー が read(2) か ら 返 さ れ る 。 通 常 の write(2) の エ ラ ー に 加 え 、 fanotify フ ァ イ ル デ ィ ス ク リ プ タ ー に 書 き 込 み を 行 っ た 際 に 以 下 の エ ラ ー が 発 生 す る こ と が あ る 。
|