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​