fanotify介绍
简介
Fanotify(Filesystem wide access notification)是Linux内核提供的一种文件系统事件通知机制,用于监控文件系统的变化。它是inotify的增强版本,提供了更强大的功能和更高的扩展性。
主要功能
-
文件系统事件通知
Fanotify可以监听文件系统中的各种事件,例如文件的读、写、打开、关闭等操作。当这些事件发生时,Fanotify会通知监听程序。 -
文件系统监控和管控
Fanotify支持对整个文件系统的监控,可以实现全文件系统的监测和控制。它支持三种模式:directed模式、per-mount模式和global模式。- Directed模式:类似于inotify,直接工作在被监控对象的inode上,一次只能监控一个对象。
- Per-mount模式:工作在挂载点上,例如监控挂载在/home目录下的所有文件系统变化。
- Global模式:监控整个文件系统,任何变化都会通知监听程序,适用于杀毒软件等应用。
-
访问控制
Fanotify 增加了访问控制功能,这是inotify所不具备的。它可以在文件打开或关闭之前进行权限判断,例如FAN_OPEN_PERM和FAN_CLOSE_PERM事件。程序员可以注册一个函数来判断是否允许打开或关闭文件,并将结果写入内核。 -
监听者级别划分
Fanotify允许多个监听者监听同一个文件对象,并可以设置监听者的级别。Fanotify将监听者分为三个级别:FAN_CLASS_PRE_CONTENT、FAN_CLASS_CONTENT和FAN_CLASS_NOTIF。- FAN_CLASS_PRE_CONTENT:用于需要在文件内容被访问之前获取文件操作权的应用程序。
- FAN_CLASS_CONTENT:适用于需要检查文件内容的应用程序,如杀毒软件。
- FAN_CLASS_NOTIF:用于纯粹的通知软件,不需要访问文件内容。
-
PID过滤
Fanotify可以过滤掉由监听程序自身触发的事件,避免进入死循环。这是通过在事件中包含监听程序的PID来实现的。 -
缓存机制
Fanotify具有缓存机制,可以避免对未修改的文件进行重复扫描。例如,如果对某个文件对象设置了ignore mask标志位,Fanotify只会对该对象进行一次扫描,之后如果文件没有修改,Fanotify会忽略访问控制事件,始终允许访问。
主要监听事件
-
文件读写事件:
- 文件被读取(fsnotify_access)
- 文件被写入(fsnotify_modify)
-
文件打开关闭事件:
- 文件被打开(fsnotify_open,FAN_OPEN_PERM)
- 文件被关闭(fsnotify_close,FAN_CLOSE_WRITE)
-
文件属性修改事件:
- 文件的扩展属性被修改(fsnotify_xattr)
- 文件被修改或原数据被修改(fsnotify_change)
-
文件创建和删除事件:
- 创建新文件(fsnotify_create,FAN_CREATE)
- 创建新目录(fsnotify_mkdir)
- 文件从目录中删除(fsnotify_nameremove)
- 文件自删除(fsnotify_inoderemove,FAN_DELETE)
-
文件系统卸载事件:
- 文件系统被卸载(inotify_unmount_inodes)
-
文件属性修改事件:
- 文件属性被修改(FAN_ATTRIB)
本文作者:505donkey
本文链接:https://www.cnblogs.com/505donkey/p/18250217
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步