Skip to main content

Linux 磁盘监控

使用 rust 实现一个 Linux 版本的磁盘监控, 调查看的话, 可能 fanotify 会更合适, 因为它会报告 pid 等额外信息.

参考

  1. IBM 文档
  2. inotify tools 仓库
  3. Linux 内核仓库
  4. inotify example.c
  5. rust inotify
  6. inotify man page

简介

如果用户需要高优先级地处理某些文件, 一个办法是使用 cron 来 poll 它. 但这样做效率不高, 可能造成太多的 polling 事件被高频率 fork.

Linux 有一个高效的办法: inotify 系统调用.

并且还有许多成熟的 shell 实用工具或 daemon 来注册文件系统监听然后报告文件系统改变事件. systemd 实际上也具有基础的 inotify 功能(基于 path units).

inotify 有一些限制:

  1. 不能监听远程/网络文件系统(NFS)
  2. 它也不能报告事件关联的 userid/pid 等, 如果需要 pid, 则需要使用 fanotify
  3. 它不能和 /proc 或其他的虚拟文件系统协作
  4. mmap 对文件的操作也不会触发它.

因此针对目前需求, 恰当的选择是 fanotify 相关的调用, 相见它的 man page

头文件

头文件中 linux 仓库中: inotify.h

和 fsevent 类似, 它也需要通过 ioctl 复制固定的文件描述符. 它也是通过读取特殊设备文件来完成监听的. 但获取描述符的时候不需要手动指定文件路径, 而是使用 inotify_init 获取文件描述符.

fanotify