Linux события файловой системы

1. Обзор механизма Inotify

В повседневном процессе эксплуатации и обслуживания часто необходимо создавать резервные копии определенных файлов или отслеживать определенные файлы системы, например важные файлы конфигурации. Если вам нужно выполнить синхронизацию или мониторинг в реальном времени, вам нужно использовать механизм inotify ядра
Inotify основан наinodeТехнология мониторинга файловой системы на уровне уровня является мощным, детализированным, асинхронным механизмом, который удовлетворяет различным потребностям мониторинга файлов, не ограничиваясь безопасностью и производительностью.

  • Inotify не нужно открывать файловый дескриптор для отслеживаемой цели, и если отслеживаемая цель находится на съемном носителе, то после размонтирования файловой системы на носителе часы, соответствующие отслеживаемой цели, будут автоматически удалены, и первостепенное событие.
  • Inotify может контролировать как файлы, так и каталоги.
  • Inotify использует системные вызовы вместо SIGIO для уведомления о событиях файловой системы.
  • Inotify использует файловый дескриптор в качестве интерфейса, поэтому вы можете использовать обычные операции ввода-вывода файлов select и poll для отслеживания изменений в файловой системе.

1.2 События файловой системы, которые Inotify может отслеживать

  • IN_ACCESS: доступ к файлу
  • IN_MODIFY: файл был написан
  • IN_ATTRIB: атрибуты файла изменены, такие как chmod, chown, touch и т. Д.
  • IN_CLOSE_WRITE: записываемые файлы закрыты
  • IN_CLOSE_NOWRITE: недоступные для записи файлы закрываются
  • IN_OPEN: файл открыт
  • IN_MOVED_FROM: файл был удален, например, mv
  • IN_MOVED_TO: файл был перемещен, например, mv, cp
  • IN_CREATE: создать новый файл
  • IN_DELETE: файл удален, например, rm
  • IN_DELETE_SELF: самоудаление, то есть исполняемый файл удаляет себя при запуске
  • IN_MOVE_SELF: самодвижущийся, то есть исполняемый файл перемещается сам во время выполнения
  • IN_UNMOUNT: файловая система хоста размонтирована
  • IN_CLOSE: файл закрыт, эквивалентно (IN_CLOSE_WRITE | IN_CLOSE_NOWRITE)
  • IN_MOVE: файл перемещен, что эквивалентно (IN_MOVED_FROM | IN_MOVED_TO)

Примечание: упомянутые выше файлы также включают в себя каталоги

1.3 Inotify поддержка версии ядра

  • отkernel 2.6.13Сначала Inotify был официально объединен с ядром, и RHEL5 уже поддерживал его.
  • Посмотрите, есть ли каталог / proc / sys / fs / inotify /, чтобы определить, поддерживает ли ядро ​​inotify
[[email protected] Rsync]# ls -l /proc/sys/fs/inotify/ total 0 -rw-r--r-- 1 root root 0 Oct 9 09:36 max_queued_events -rw-r--r-- 1 root root 0 Oct 9 09:36 max_user_instances -rw-r--r-- 1 root root 0 Oct 9 09:36 max_user_watches

1.4 Inotify параметры ядра по умолчанию

  • / proc / sys / fs / inotify / max_queued_events По умолчанию: 16384 Значение в этом файле — максимальное количество событий, которые могут быть помещены в очередь в экземпляре inotify при вызове inotify_init. Превышение этого стоящего события отбрасывается, но событие IN_Q_OVERFLOW инициируется
  • / proc / sys / fs / inotify / max_user_instances default: 128 указывает максимальное количество экземпляров inotify, которые могут быть созданы для каждого реального идентификатора пользователя
  • / proc / sys / fs / inotify / max_user_watches по умолчанию: 8192 указывает верхний предел часов, связанных с каждым экземпляром inotify
Читайте также:  Свой сервер майнкрафт линукс

Примечание: max_queued_events — это максимальная длина очереди, управляемой Inotify. Чем чаще меняется файловая система, тем больше должно быть это значение.
Если вы видите в журналеEvent Queue OverflowОписаниеmax_queued_eventsСлишком маленький, нужно настроить параметры и использовать снова.

2. Inotify используется в системе

2.1 Использование inotify под оболочкой linux

  • Скачать и установитьисходный код inotify-toolsпакет rhel5 / centos5 об / мин
    • inotifywaitВыполните только блокировку и дождитесь событий inotify. Вы можете отслеживать любой набор файлов и каталогов или контролировать все дерево каталогов (каталог, подкаталог, подкаталог подкаталога и т. Д.)
      Используйте inotifywait в сценариях оболочки.
    • inotifywatchСоберите статистические данные об отслеживаемой файловой системе, в том числе о том, сколько раз происходит каждое событие inotify.
    [[email protected] ]# cat /tmp/test.sh #!/bin/bash inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w%f %e' --event modify,delete,create,attrib /home/admin | while read date time file event do case $event in MODIFY|CREATE|MOVE|MODIFY,ISDIR|CREATE,ISDIR|MODIFY,ISDIR) echo $event'-'$file ;; MOVED_FROM|MOVED_FROM,ISDIR|DELETE|DELETE,ISDIR) echo $event'-'$file ;; esac done
    [[email protected]]# /tmp/test.sh DELETE-/home/admin/cronolog-1.6.2.bak/COPYING DELETE-/home/admin/cronolog-1.6.2.bak/doc/cronolog.info DELETE-/home/admin/cronolog-1.6.2.bak/doc/cronolog.texi DELETE-/home/admin/cronolog-1.6.2.bak/doc/Makefile.am DELETE-/home/admin/cronolog-1.6.2.bak/doc/Makefile.in DELETE-/home/admin/cronolog-1.6.2.bak/doc/texinfo.tex DELETE-/home/admin/cronolog-1.6.2.bak/doc/cronosplit.1m DELETE-/home/admin/cronolog-1.6.2.bak/doc/Makefile DELETE-/home/admin/cronolog-1.6.2.bak/doc/cronolog.1m DELETE,ISDIR-/home/admin/cronolog-1.6.2.bak/doc DELETE-/home/admin/cronolog-1.6.2.bak/TODO DELETE-/home/admin/cronolog-1.6.2.bak/src/cronotest.c DELETE-/home/admin/cronolog-1.6.2.bak/src/cronolog.c DELETE-/home/admin/cronolog-1.6.2.bak/src/cronoutils.h DELETE-/home/admin/cronolog-1.6.2.bak/src/cronoutils.c DELETE-/home/admin/cronolog-1.6.2.bak/src/Makefile.am DELETE-/home/admin/cronolog-1.6.2.bak/src/Makefile.in DELETE-/home/admin/cronolog-1.6.2.bak/src/cronosplit.in DELETE-/home/admin/cronolog-1.6.2.bak/src/Makefile DELETE-/home/admin/cronolog-1.6.2.bak/src/cronosplit DELETE-/home/admin/cronolog-1.6.2.bak/src/config.h DELETE,ISDIR-/home/admin/cronolog-1.6.2.bak/src DELETE-/home/admin/cronolog-1.6.2.bak/lib/getopt1.c DELETE-/home/admin/cronolog-1.6.2.bak/lib/getopt.h DELETE-/home/admin/cronolog-1.6.2.bak/lib/Makefile.am DELETE-/home/admin/cronolog-1.6.2.bak/lib/Makefile.in DELETE-/home/admin/cronolog-1.6.2.bak/lib/localtime_r.c DELETE-/home/admin/cronolog-1.6.2.bak/lib/getopt.c DELETE-/home/admin/cronolog-1.6.2.bak/lib/Makefile DELETE-/home/admin/cronolog-1.6.2.bak/lib/strptime.c DELETE,ISDIR-/home/admin/cronolog-1.6.2.bak/lib DELETE-/home/admin/cronolog-1.6.2.bak/config.cache DELETE-/home/admin/cronolog-1.6.2.bak/install-sh DELETE-/home/admin/cronolog-1.6.2.bak/Makefile.am DELETE-/home/admin/cronolog-1.6.2.bak/README DELETE-/home/admin/cronolog-1.6.2.bak/AUTHORS DELETE-/home/admin/cronolog-1.6.2.bak/Makefile.in DELETE-/home/admin/cronolog-1.6.2.bak/testsuite/Makefile.am DELETE-/home/admin/cronolog-1.6.2.bak/testsuite/README DELETE-/home/admin/cronolog-1.6.2.bak/testsuite/Makefile.in DELETE-/home/admin/cronolog-1.6.2.bak/testsuite/Makefile DELETE,ISDIR-/home/admin/cronolog-1.6.2.bak/testsuite DELETE-/home/admin/cronolog-1.6.2.bak/cronolog.spec DELETE-/home/admin/cronolog-1.6.2.bak/NEWS DELETE-/home/admin/cronolog-1.6.2.bak/configure DELETE-/home/admin/cronolog-1.6.2.bak/ChangeLog DELETE-/home/admin/cronolog-1.6.2.bak/missing DELETE-/home/admin/cronolog-1.6.2.bak/config.log DELETE-/home/admin/cronolog-1.6.2.bak/aclocal.m4 DELETE-/home/admin/cronolog-1.6.2.bak/Makefile DELETE-/home/admin/cronolog-1.6.2.bak/INSTALL DELETE-/home/admin/cronolog-1.6.2.bak/config.status DELETE-/home/admin/cronolog-1.6.2.bak/configure.in DELETE-/home/admin/cronolog-1.6.2.bak/mkinstalldirs DELETE,ISDIR-/home/admin/cronolog-1.6.2.bak

    2.2 Использование incron для мониторинга важных файлов конфигурации

    Incron — это система cron inotify. Как и сама система cron, она включает в себя фоновый демон (incrond) и редактор событий (incrontab).
    Разница с самим os cron заключается в том, что время запуска — это операция os над файлом (папкой) вместо времени, механизм, запускаемый системными событиями. Почти в реальном времени.

    • Пример конфигурации:
      • /home/admin/a.txt IN_MODIFY echo «$ @ $ #» означает, что после изменения файла abc он будет выполненecho «$@ $#»
      • / home / admin / IN_ALL_EVENTS echo «$ @ $ # $%» означает, что любое событие файлов в каталоге будет запущено и выполненоecho «$@ $#»
      Mar 23 14:05:19 localhost incrond[6857]: (root) CMD (echo "/home/admin = = IN_OPEN,IN_ISDIR") Mar 23 14:05:19 localhost incrond[6857]: (root) CMD (echo "/home/admin = = IN_CLOSE_NOWRITE,IN_ISDIR") Mar 23 14:05:20 localhost incrond[6857]: (root) CMD (echo "/home/admin = = IN_OPEN,IN_ISDIR") Mar 23 14:05:20 localhost incrond[6857]: (root) CMD (echo "/home/admin = = IN_CLOSE_NOWRITE,IN_ISDIR") Mar 23 14:05:20 localhost incrond[6857]: (root) CMD (echo "/home/admin = ssss = IN_DELETE")

      В целом, мониторинг файлов и каталогов в режиме реального времени все еще очень эффективен: его можно комбинировать с другими инструментами для унифицированных решений, такими как syslog-ng для унифицированного сбора. Конечно, самое важное — иметь сцену.

      2.3 linux API

      Существуют следующие ключевые шаги для использования API inotify:

      Используйте inotify_init () для создания экземпляра inotify, а возвращенный дескриптор файла используется для ссылки на экземпляр в последующих операциях.

      Используйте inotify_add_watch для добавления записей в список мониторинга экземпляра inotify, то есть добавления файлов или каталогов, представляющих интерес для приложения. Каждый элемент мониторинга содержит имя пути и связанную битовую маску, которая указывает на событие, подлежащее мониторингу. inotify_add_watch вернет дескриптор мониторинга для последующих операций для ссылки на элемент мониторинга (inotify_rm_watch удаляет элемент мониторинга).

      Приложению необходимо выполнить операцию read () для дескриптора файла inotify для получения уведомлений о событиях. Вызов read () вернет одну или несколько структур inotify_event для записи произошедших событий.

      Закройте дескриптор inotify в конце приложения, который автоматически очистит все элементы мониторинга, связанные с экземпляром inotify.

      Inotify может использоваться для мониторинга файлов или каталогов. При мониторинге каталога приложение уведомляется о событиях, связанных с самим путем и файлами, которые он содержит.

      Inofity не является рекурсивным. Если вы хотите отслеживать все дерево каталогов в каталоге, вам нужно инициировать вызов inotify_add_watch для каждого каталога в дереве каталогов.

      2.3.1、API

      int inotify_add_watch(int fd, const char *pathname, uint32_t mask);

      int inotify_rm _watch(int fd, uint32_t wd);

      2.3.2, сообщить событие

      При использовании inotify_add_watch для добавления или изменения элемента мониторинга маска параметра битовой маски идентифицирует событие, которое будет отслеживаться для данного имени пути. В столбце «in» в таблице ниже перечислены биты событий, которые можно определить в маске.

      2.3.3, прочитать событие inotify

      После добавления элементов мониторинга в список мониторинга приложение может использовать чтение для чтения событий из дескриптора файла inotify, чтобы определить, какие события произошли. Если во время чтения событие не происходит, чтение блокируется до тех пор, пока событие не произойдет (если не установлен флаг O_NONBLOCK).

      После события каждый вызов read возвращает буфер, который содержит один или несколько следующих типов структур:

      è¿éåå¾çæè¿°

      #include #include #include "tlpi_hdr.h" static void /* Display information from inotify_event structure */ displayInotifyEvent(struct inotify_event *i) < printf(" wd =%2d; ", i->wd); if (i->cookie > 0) printf("cookie =%4d; ", i->cookie); printf("mask = "); if (i->mask & IN_ACCESS) printf("IN_ACCESS "); if (i->mask & IN_ATTRIB) printf("IN_ATTRIB "); if (i->mask & IN_CLOSE_NOWRITE) printf("IN_CLOSE_NOWRITE "); if (i->mask & IN_CLOSE_WRITE) printf("IN_CLOSE_WRITE "); if (i->mask & IN_CREATE) printf("IN_CREATE "); if (i->mask & IN_DELETE) printf("IN_DELETE "); if (i->mask & IN_DELETE_SELF) printf("IN_DELETE_SELF "); if (i->mask & IN_IGNORED) printf("IN_IGNORED "); if (i->mask & IN_ISDIR) printf("IN_ISDIR "); if (i->mask & IN_MODIFY) printf("IN_MODIFY "); if (i->mask & IN_MOVE_SELF) printf("IN_MOVE_SELF "); if (i->mask & IN_MOVED_FROM) printf("IN_MOVED_FROM "); if (i->mask & IN_MOVED_TO) printf("IN_MOVED_TO "); if (i->mask & IN_OPEN) printf("IN_OPEN "); if (i->mask & IN_Q_OVERFLOW) printf("IN_Q_OVERFLOW "); if (i->mask & IN_UNMOUNT) printf("IN_UNMOUNT "); printf("\n"); if (i->len > 0) printf(" name = %s\n", i->name); > #define BUF_LEN (10 * (sizeof(struct inotify_event) + NAME_MAX + 1)) int main(int argc, char *argv[]) < int inotifyFd, wd, j; char buf[BUF_LEN] __attribute__ ((aligned(8))); ssize_t numRead; char *p; struct inotify_event *event; if (argc < 2 || strcmp(argv[1], "--help") == 0) usageErr("%s pathname. \n", argv[0]); inotifyFd = inotify_init(); /* Create inotify instance */ if (inotifyFd == -1) errExit("inotify_init"); /* For each command-line argument, add a watch for all events */ for (j = 1; j < argc; j++) < wd = inotify_add_watch(inotifyFd, argv[j], IN_ALL_EVENTS); if (wd == -1) errExit("inotify_add_watch"); printf("Watching %s using wd %d\n", argv[j], wd); >for (;;) < /* Read events forever */ numRead = read(inotifyFd, buf, BUF_LEN); if (numRead == 0) fatal("read() from inotify fd returned 0!"); if (numRead == -1) errExit("read"); printf("Read %ld bytes from inotify fd\n", (long) numRead); /* Process all of the events in buffer returned by read() */ for (p = buf; p < buf + numRead; ) < event = (struct inotify_event *) p; displayInotifyEvent(event); p + = sizeof (struct inotify_event) + event->len; // event-> len Длина измененного имени файла. > > exit(EXIT_SUCCESS); > 

      Источник

Оцените статью
Adblock
detector