使用 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 型別的空檔案控制代碼報告。