Fanotify linux что это

Fanotify linux что это

int fanotify_init(unsigned int flags, unsigned int event_f_flags);

ОПИСАНИЕ

Вызов fanotify_init() инициализирует новую группу fanotify и возвращает файловый дескриптор очереди событий, связанной с группой.

В файловом дескрипторе, используемом в fanotify_mark(2), задаются файлы, каталоги и точки монтирования, для которых должны создаваться события fanotify. Эти события можно получить с помощью чтения файлового дескриптора. Одни события носят уведомительный характер, показывая что к файлу был получен доступ. Другие события можно использовать для разрешения приложению доступа к файлу или каталогу. Доступ к объектам файловой системы разрешается посредством записи в файловый дескриптор.

Несколько программ могут использовать интерфейс fanotify к одним и тем же файлам одновременно.

В текущей реализации количество групп fanotify ограничено 128 на пользователя. Это значение нельзя изменить.

Для вызова fanotify_init() требуется мандат CAP_SYS_ADMIN. Это требование может быть облегчено в будущих версиях программного интерфейса. Поэтому ниже показаны определённые дополнительные проверки возможностей, которые были реализованы.

Аргумент flags содержит многобитовое поле, определяющее класс уведомления, запрашиваемый приложением, а также однобитовые поля, задающие поведение файлового дескриптора.

Если на события доступа зарегистрировалось несколько слушателей, то класс уведомления используется для установления порядка слушателей при получении событий.

В flags может быть указан только один из следующих классов уведомления:

FAN_CLASS_PRE_CONTENT Это значение позволяет принимать уведомляющие события об обращении к файлу, и события доступа, запрашивающие доступ к файлу. Он предназначен для слушателей событий, которым требуется доступ к файлам до того, как в них будут содержаться окончательные данные. Этот класс уведомления может быть использован, например, в программах управления иерархического хранения. FAN_CLASS_CONTENT Это значение позволяет принимать уведомляющие события об обращении к файлу, и события доступа, запрашивающие доступ к файлу. Он предназначен для слушателей событий, которым требуется доступ к файлам после того, как они содержат окончательные данные. Этот класс уведомления может быть использован, например, в программах обнаружения вредоносного кода. FAN_CLASS_NOTIF Значение по умолчанию. Его не нужно указывать. Это значение позволяет принимать только события о доступе к файлу. Право на доступ к файлу задать невозможно.

Слушатели с различными классами уведомлений будут принимать события в таком порядке: FAN_CLASS_PRE_CONTENT, FAN_CLASS_CONTENT, FAN_CLASS_NOTIF. Порядок уведомления слушателей в этом классе уведомления не определён.

Дополнительно в flags могут быть установлены следующие биты:

FAN_CLOEXEC Устанавливать флаг close-on-exec (FD_CLOEXEC) для нового файлового дескриптора. Смотрите описание флага O_CLOEXEC в open(2). FAN_NONBLOCK Включить неблокирующий флаг (O_NONBLOCK) для файлового дескриптора. Чтение из такого файлового дескриптора не вызовет блокирования. Если данные отсутствуют, то read(2) завершится с ошибкой EAGAIN. FAN_UNLIMITED_QUEUE Снять ограничение в 16384 события в очереди событий. Для использования этого флага требуется мандат CAP_SYS_ADMIN. FAN_UNLIMITED_MARKS Снять ограничение в 8192 метки. Для использования этого флага требуется мандат CAP_SYS_ADMIN.

В аргументе event_f_flags задаются флаги состояния файла, которые будут установлены на открытые файловые описатели, создаваемые для событий fanotify. Подробней об этих флагах смотрите описание значений flags в open(2). Аргумент event_f_flags включает многобитовое поле для режима доступа. Это поел может иметь следующие значения:

O_RDONLY Это значение разрешает доступ только на чтение. O_WRONLY Это значение разрешает доступ только на запись. O_RDWR Это значение разрешает доступ на чтение и запись.

В event_f_flags могут быть установлены дополнительные биты. Наиболее полезные значения:

O_LARGEFILE Включить поддержку файлов более 2 ГБ. Если не удастся установить этот флаг, то при попытке открыть большой файл, отслеживаемый группой fanotify на 32-битной системе, возвращается ошибка EOVERFLOW. O_CLOEXEC Включить флаг close-on-exec для нового открытого файлового дескриптора. Смотрите описание флага O_CLOEXEC в open(2) для того, чтобы узнать как это может пригодиться.

Читайте также:  Какая последняя версия ядра linux

Также доступны следующие флаги: O_APPEND, O_DSYNC, O_NOATIME, O_NONBLOCK и O_SYNC. Указание любых других флагов в event_f_flagsприводит к ошибке EINVAL (но смотрите ДЕФЕКТЫ).

Источник

как пользоваться fanotify?

Гуглю-гуглю, а ничего понять не могу. У этой поделки есть маны и доки? В системе не видно. Неужели смотреть сырцы и linux/fanotify.h?

В первых строка поиска статьи 2009 года от lwn, но они, похоже, нарабочие, http://git.kernel.org/?p=linux/kernel/git/agruen/fanotify-example.git;a=summary тоже не пашет.

Кто-нить этим вообще пользуется? Или все сидят на старомправославном inotify?

UP: похоже что оно родилось мёртвым, даже в lkml всем похер: https://lkml.org/lkml/2011/3/7/328 .

fanotify используют антивирусы. fanotify перпендикулярен inotify по назначению. fanotify не нужен потому, что он тормоз. может еще корневую фс через fuse подключать?

fanotify перпендикулярен inotify по назначению

fanotify не нужен потому, что он тормоз

inotify — ядро уведомляет пользовательский процесс об операции над файлом. fanotify — ядро просит разрешения у пользовательского процесса на операцию над файлом. Отсюда выводы: 1) абсолютно разное (я назвал это перпендикулярное, ну, да, жаргон, разговорная речь) назначение; 2) первый асинхронный, второй синхронный — при открытии файла я жду, пока fanotify отработает свой цикл с дополнительным переключением ядро -> user level -> ядро + какая-то работа в пользовательском процессе, возможно, с вводом выводом. Отсюда вывод — тормоз. Зачем здесь пруф? Достаточно подумать своей головой, а не разглядывать узоры на чужих диаграммах.

ядро просит разрешения у пользовательского процесса на операцию над файлом

затем что в inotify есть архитектурный косяк (по-моему, оно создаёт по дескриптору на каждый файл который мониторится, с ходу ссылку не найду) которого нет в fanotify.

Ну и на счёт синхронного мониторинга ты был не прав, поэтому тесты не помешают.

Оп! Ты прав. Я ошибся. Исправляюсь.

fanotify может заменить inotify в некоторых случаях.

fanotify используется в clamav (on-access scanner), systemd (readahead).

Еще одно интересное применение fanotify — иерархические хранилища файлов.

Обертка для сискола появилась в glibc-2.13 (2011-01-18): sys/fanotify.h.

В man-pages-3.33 (2011-09-16) fanotify_init() and fanotify_mark() добавлены в список сисколов (подчеркиваю!, в список, т.е. перечислены, а не документированы).

Документация бродит (от слова брожение) в почтовых рассылках: fanotify_init() fanotify_mark()

Источник

Fanotify linux что это

Дополнительные возможности по сравнению с программным интерфейсом inotify(7): способность отслеживать все объекты в смонтированной файловой системе, давать права на доступ и читать или изменять файлы перед тем как доступ получат другие приложения.

Вызовы fanotify_init(), fanotify_mark() и группы уведомлений

Группа уведомления fanotify — это внутренний объект ядра, в котором хранится список файлов, каталогов и точек монтирования, для которых должны создаваться события.

У каждой записи в группе уведомления fanotify есть две битовые маски: меток и игнорирования. В маске меток указывается для каких действий на файлами должны создаваться события. В маске игнорирования указывается для каких действий не должны создаваться события. Имея маски таких типов можно пометить точку монтирования или каталог для получения событий, и в тоже время игнорировать события для определённых объектов в этой точке монтирования или каталоге.

Системный вызов fanotify_mark(2) добавляет файл, каталог или точку монтирования в группу уведомления и задаёт какие события должны отслеживаться (или игнорироваться), или удаляет или изменяет нужную запись.

Возможное применение маски игнорирования — кэш файлов. Интересующие события для файлового кэша — изменение файла и закрытие. Для этого добавляем кэшируемый каталог или точку монтирования для приёма этих событий. После получения первого события об изменении файла, соответствующая запись кэша помечается как недействительная. Дальнейшие события об изменении файла нас не интересуют, пока файл не будет закрыт. Для этого событие об изменении можно добавить в маску игнорирования. При получении события о закрытии, событие об изменении можно удалить из маски игнорирования и запись файлового кэша можно обновить.

Записи в группе уведомления fanotify ссылаются на файл и каталог по номеру иноды (inode), а на точку монтирования — через ID монтирования. При переименовании или перемещении файла или каталога внутри той же точки монтирования соответствующая запись остаётся. Если файл или каталог удаляется или перемещается в другую точку монтирования, или если точка монтирования размонтируется, то соответствующая запись удаляется.

Читайте также:  Windows old его больше нет

Очередь событий

Генерируется два типа событий: события уведомления и события доступа. Уведомляющие события просто информируют и не требуют действия от принявшего приложения, за исключением закрытия файлового дескриптора, передаваемого в событии (смотрите далее). События доступа запрашивают получившее приложение о разрешении доступа к файлу. Для этих событий получатель должен написать ответ, давать ли доступ или нет.

Событие удаляется из очереди событий группы fanotify после прочтения. События доступа, которые были прочитаны, остаются во внутреннем списке группы fanotify до тех пор, пока решение о доступе не будет записано в файловый дескриптор fanotify, или файловый дескриптор fanotify не будет закрыт.

Чтение событий fanotify

После успешного выполнения read(2) буфер чтения содержит одну или более следующих структур:

Для увеличения производительности рекомендуется использовать буфер большого размера (например, 4096 байт) для того, чтобы получить несколько событий за один вызов read(2).

Возвращаемое read(2) значение — количество байт помещённых в буфер, или -1 в случае ошибки (но смотрите ДЕФЕКТЫ).

Поля структуры fanotify_event_metadata:

event_len Длина данных текущего события и смещение на следующее событие в буфере. В текущей реализации значение event_len всегда равно FAN_EVENT_METADATA_LEN. Однако, благодаря программному интерфейсу в будущем будут возвращаться структуры переменной длины. vers Номер версии структуры. Он должен сравниваться с FANOTIFY_METADATA_VERSION для проверки того, что структуры, возвращаемые во время выполнения, соответствуют структурам, определённым во время компиляция. В случае несоответствия приложение должно прекратить попытки использовать файловый дескриптор fanotify. reserved Не используется. metadata_len Длина структуры. Это поле было добавлено для облегчения реализации необязательных заголовков разных типов событий. В текущей реализации такие необязательные заголовки отсутствуют. mask Битовая маска, описывающая событие (смотрите далее). fd Файловый дескриптор отслеживаемого объекта или FAN_NOFD, если возникло переполнение очереди. Файловый дескриптор можно использовать для доступа к содержимому отслеживаемого файла или каталога. Читающее приложение ответственно за закрытие этого файлового дескриптора. Когда вызывается fanotify_init(2) вызывающий может указать (в аргументе event_f_flags) различные флаги состояния файла, которые будут установлены на открытом файловом дескрипторе, соответствующем этому файловому дескриптору. Также, на отрываемом файловом дескрипторе устанавливается (внутри ядра) флаг состояния файла FMODE_NONOTIFY. Этот флаг подавляет генерацию событий fanotify. Таким образом, когда получатель события fanotify обратится к отслеживаемому файлу или каталогу через этот файловый дескриптор, дополнительных событий создано не будет. pid Идентификатор процесса, из-за которого произошло событие. Программа, слушающая события fanotify, может сравнить этот PID с PID, возвращаемым getpid(2), для проверки, что событие не возникло из-за самого слушающего, а из-за доступа к файлу другого процесса.

В битовой маске mask указывают события, произошедшие с одиночным объектом файловой системы. В маске может быть установлено несколько бит, если было более одного события с отслеживаемым объектом файловой системы. В частности, возникшие друг за другом события с одним объектом файловой системы и произошедшие из-за одного процесса могут быть объединены в одно событие, за исключением того, что два события доступа никогда не объединяются в одном элементе очереди.

Биты маски mask:

FAN_ACCESS Доступ (на чтение) к файлу или каталогу (но смотрите ДЕФЕКТЫ). FAN_OPEN Файл или каталог открыт. FAN_MODIFY Файл изменён. FAN_CLOSE_WRITE Файл, открытый на запись (O_WRONLY или O_RDWR), закрыт. FAN_CLOSE_NOWRITE Файл или каталог, открытый только для чтения (O_RDONLY), закрыт. FAN_Q_OVERFLOW Очередь событий превысила ограничение в 16384 записи. Это ограничение можно изменить, указав флаг FAN_UNLIMITED_QUEUE при вызове fanotify_init(2). FAN_ACCESS_PERM Приложение хочет прочитать файл или каталог, например, с помощью read(2) или readdir(2). Читатель события должен написать ответ (описано далее) о разрешении доступа к объекту файловой системы. FAN_OPEN_PERM Приложение хочет открыть файл или каталог. Читатель события должен написать ответ о разрешении открытия объекта файловой системы.

Читайте также:  Windows script run command

Для проверки любого события закрытия может использоваться следующая битовая маска:

FAN_CLOSE Файл закрыт. Это синоним:

Следующие макросы позволяют обходить буфер с метаданными событий fanotify, возвращаемый read(2) из файлового дескриптора fanotify:

FAN_EVENT_OK(meta, len) Этот макрос сверяет оставшуюся длину len буфера meta с длиной структуры метаданных и полем event_len из первой структуры метаданных в буфере. FAN_EVENT_NEXT(meta, len) Этот макрос использует длину из поля event_len структуры метаданных, на которую указывает meta, для вычисления адреса следующей структуры метаданных, которая находится после meta. В поле len указано количество байт метаданных, оставшихся в буфере. Макрос возвращает указатель на следующую структуру метаданных после meta и уменьшает len на количество байт в структуре метаданных, которая была пропущена (т. е., вычитает meta->event_len из len).

FAN_EVENT_METADATA_LEN Этот макрос возвращает размер (в байтах) структуры fanotify_event_metadata. Это минимальный размер (и, в настоящее время, единственный) метаданных любого события.

Отслеживание событий через файловый дескриптор fanotify

Работа с событиями доступа

Поля этой структуры имеют следующее назначение:

fd Файловый дескриптор из структуры fanotify_event_metadata. response В этом поле указывает о разрешении доступа или запрещении. Данное значение должно быть равно FAN_ALLOW, чтобы разрешить операцию с файлом, или FAN_DENY для запрета.

Если доступ запрещается, то запрашивающее приложение получит ошибку EPERM.

Закрытие файлового дескриптора fanotify

Когда все файловые дескрипторы, указывающие на группу уведомления fanotify, закрыты, группа fanotify освобождается и её ресурсы становятся доступны ядру для повторного использования. После close(2) все оставшиеся непросмотренные события доступа будут разрешены.

/proc/[pid]/fdinfo

ОШИБКИ

Кроме обычных ошибок write(2) при записи в файловый дескриптор fanotify могут возникать следующие ошибки:

EINVAL Свойство для проверки прав доступа fanotify не включено в настройках ядра или некорректное значение response в структуре ответа. ENOENT Некорректный файловый дескриптор fd в структуре ответа. Это может происходить, когда ответ на право доступа уже был записан.

ВЕРСИИ

СООТВЕТСТВИЕ СТАНДАРТАМ

ЗАМЕЧАНИЯ

Ограничения и подводные камни

Программный интерфейс fanotify не сообщает о доступе и изменениях, которые могут произойти из-за mmap(2), msync(2) и munmap(2).

События для каталогов создаются только, если сам каталог открывается, читается и закрывается. Добавление, удаление и изменение потомков отслеживаемого каталога не приводит к возникновению событий.

Fanotify не следит за каталогами рекурсивно: чтобы следить за подкаталогами каталога, нужно их явно пометить (и, заметим, что программный интерфейс fanotify не позволяет отслеживать создание подкаталога, что затрудняет рекурсивное слежение). Отслеживание точек монтирования позволяет следить за всем деревом каталогов.

Очередь событий может переполниться. В этом случае события теряются.

ДЕФЕКТЫ

В Linux 3.17 существуют следующие дефекты:

* В Linux объект файловой системы может быть доступен через несколько путей, например, часть файловой системы может быть перемонтирована mount(8) с использованием параметра —bind. Ожидающий слушатель получит уведомления об объекте файловой системы только из запрошенной точки монтирования. О событиях из других точек уведомлений не поступит. * При генерации события не делается проверка, что пользовательскому ID получающего процесса разрешено читать или писать в файл перед передачей файлового дескриптора на этот файл. Это представляет некоторый риск безопасности, когда у программ, выполняющихся непривилегированными пользователями, есть мандат CAP_SYS_ADMIN. * Если вызов read(2) получает несколько событий из очереди fanotify и возникает ошибка, будет возвращена полная длина событий, которые были успешно скопированы в буфер пользовательского пространства до ошибки. Возвращаемое значение не будет равно -1, и в errno не записывается код ошибки. То есть читающее приложение не может обнаружить ошибку.

ПРИМЕР

Следующий вывод записан при редактировании файла /home/user/temp/notes. Перед открытием файла произошло событие FAN_OPEN_PERM. После закрытия файла произошло событие FAN_CLOSE_WRITE. Выполнение программы закончилось после нажатия пользователем клавиши ENTER.

Источник

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