使用 fanotify 进行文件系统监控

文件系统错误报告

Fanotify 支持 FAN_FS_ERROR 事件类型,用于文件系统范围内的错误报告。 它旨在供文件系统健康状况监控守护程序使用,这些守护程序监听这些事件并在检测到文件系统问题时采取行动(通知系统管理员,启动恢复)。

按照设计,FAN_FS_ERROR 通知公开了足够的信息,以便监控工具了解文件系统中已发生问题。 它不一定为用户空间应用程序提供语义来验证 IO 操作是否已成功执行。 这超出了此功能的范围。 相反,它仅用作早期文件系统问题检测和报告恢复工具的框架。

当文件系统操作失败时,通常会在初始失败之后级联数十个内核错误,从而隐藏原始失败日志,这通常是解决问题最有用的调试数据。 出于这个原因,FAN_FS_ERROR 尝试仅报告自上次通知以来文件系统发生的第一个错误,并且它只是计算额外的错误。 这确保了最重要的信息永远不会丢失。

FAN_FS_ERROR 需要使用 FAN_REPORT_FID 标志设置 fanotify 组。

在撰写本文时,唯一发出 FAN_FS_ERROR 通知的文件系统是 Ext4。

FAN_FS_ERROR 通知具有以下格式

::

   [ Notification Metadata (Mandatory) ]
   [ Generic Error Record  (Mandatory) ]
   [ FID record            (Mandatory) ]

记录的顺序不能保证,将来可能会添加新记录。 因此,应用程序不得依赖顺序,并且必须准备好跳过未知记录。 请参考 samples/fanotify/fs-monitor.c 以获取示例解析器。

通用错误记录

通用错误记录提供了足够的信息,供与文件系统无关的工具了解文件系统中的问题,而无需提供有关该问题的任何其他详细信息。 此记录由设置为 FAN_EVENT_INFO_TYPE_ERROR 的 struct fanotify_event_info_header.info_type 标识。

struct fanotify_event_info_error {
     struct fanotify_event_info_header hdr;
    __s32 error;
    __u32 error_count;
};

error 字段使用 errno 值标识错误类型。 error_count 跟踪自上次通知以来发生并被抑制以保留原始错误信息的错误数量。

FID 记录

FID 记录可用于通过 fsid 和文件句柄的组合来唯一标识触发错误的 inode。 文件系统特定的应用程序可以使用该信息来尝试恢复过程。 与 inode 无关的错误会使用 FILEID_INVALID 类型的空文件句柄报告。