21

fanotifyの上に構築された は、置き換えられfsnotifyた を置き換えることになっています。ファイルシステムの変更を監視するために使用する良いプログラミング例や既存のユーティリティはありますか? どの程度の詳細を提供しますか?inotifydnotifyfanotifyfanotify

4

3 に答える 3

19

この LWN 記事は、fanotify のドキュメントのソースとしてよく引用されます。しかし、そこにある説明は古くなっているようです。fanotify は、ソケット接続を使用して機能しなくなりました。代わりに、syscall をラップする 2 つの新しい libc 関数があり、sys/fanotify.h. 1 つは と呼ばれfanotify_init、もう 1 つは ですfanotify_mark。これを書いている時点では、これらのシステムコールはまだ見つからないマニュアル ページのリストに含まれています。ただし、これらのマニュアルページの下書きを含むメールがあります。これらのマニュアル ページを組み合わせて、問題のヘッダーを確認し、試行錯誤を繰り返すことで、これを実現できるはずです。

もともと fanotify で想定されていた機能の一部は、そのような形でサポートされなくなったようです。たとえば、LWN の記事では、FAN_GLOBAL_LISTENER部分が明示的にマーク解除されていない限り、ファイルシステム ツリー全体を暗黙的にマークするフラグについて説明しています。現在のインターフェイスにはそのような規定はありませんが、次のマークを使用して同様の結果を得ることができます。

fanotify_mark(fan,
              FAN_MARK_ADD | FAN_MARK_MOUNT,
              FAN_OPEN | FAN_EVENT_ON_CHILD,
              AT_FDCWD, "/")

inotify イベントがイベントの一部としてアクセスされたオブジェクトへのパスを提供する場合、fanotify はそのオブジェクトのファイル記述子を開きます。この記述子をパス名に変換するには、ここで説明されているように、proc ファイル システムの対応するエントリを使用できます。

これは、開いているすべてのファイルの名前を単純に出力する簡単な例です。

#include <fcntl.h>
#include <limits.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/fanotify.h>
#include <sys/stat.h>
#include <sys/types.h>
#define CHK(expr, errcode) if((expr)==errcode) perror(#expr), exit(EXIT_FAILURE)
int main(int argc, char** argv) {
  int fan;
  char buf[4096];
  char fdpath[32];
  char path[PATH_MAX + 1];
  ssize_t buflen, linklen;
  struct fanotify_event_metadata *metadata;
  CHK(fan = fanotify_init(FAN_CLASS_NOTIF, O_RDONLY), -1);
  CHK(fanotify_mark(fan, FAN_MARK_ADD | FAN_MARK_MOUNT,
                    FAN_OPEN | FAN_EVENT_ON_CHILD, AT_FDCWD, "/"), -1);
  for (;;) {
    CHK(buflen = read(fan, buf, sizeof(buf)), -1);
    metadata = (struct fanotify_event_metadata*)&buf;
    while(FAN_EVENT_OK(metadata, buflen)) {
      if (metadata->mask & FAN_Q_OVERFLOW) {
        printf("Queue overflow!\n");
        continue;
      }
      sprintf(fdpath, "/proc/self/fd/%d", metadata->fd);
      CHK(linklen = readlink(fdpath, path, sizeof(path) - 1), -1);
      path[linklen] = '\0';
      printf("%s opened by process %d.\n", path, (int)metadata->pid);
      close(metadata->fd);
      metadata = FAN_EVENT_NEXT(metadata, buflen);
    }
  }
}
于 2012-11-14T23:33:10.177 に答える
13

fanotify API のドキュメントは、Linux のマンページで入手できます。


以下にいくつかの例を示しますが、fatrace が最も精巧です。

Go と Python のバインディングが存在します。

于 2012-11-29T19:21:48.887 に答える
6

私は fanotify について学んだばかりで、とてもいいようです。とても素敵なインターフェース!

まだ Linus ツリーにはありませんが、テストのために Linux 2.6.33 以前に含まれると思います (今日、LKML にいくつかのパッチがあることに気付きました)。元のパッチでは GIT ツリーがアナウンスされているため、そこからテスト カーネルを構築できる可能性があります。git ツリーのテストも見つかるかもしれません。

それを使用するユーティリティは見つかりませんでしたが、すぐに登場すると思います。

電子メールの最後に、ここに例があります。

http://lwn.net/Articles/339253/

この新機能に本当に興味がある場合は、Linux カーネル メーリング リストを監視して、そこで対話することをお勧めします。ユーティリティがリリースされるまで待つか、独自のユーティリティを開発することもできます。

詳細については、fanotify は inotify よりもイベントが少ないようです。これは将来変更される可能性があると思いますが、これは開発中の新しい機能であるため、現時点で言えることはあまりありません。

于 2009-12-04T14:25:21.237 に答える