使用 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 以获取示例解析器。

通用错误记录

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

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 类型的空文件句柄。