【发布时间】:2017-06-21 05:04:53
【问题描述】:
我想拦截 Linux 服务器中的每个磁盘写入操作。详细地说,我想在每个磁盘写入操作发生时立即捕获它,并能够确定哪个进程发起了调用,它试图写入的位置等等。为简单起见,目前我只专注于 ext3。我知道 auditfs 和其他“观察者”只会在操作发生后通知您。如前所述,我想在发生时进行拦截,并能够检索有关操作的所有信息(进程信息、目标位置、正在写入的内容)。如果有一种中断/回调机制(例如接收进程、进程组或会话的任何写操作的通知 - pid、pgid、sid),那就更好了。
谢谢
【问题讨论】:
-
你想拦截
write()系统调用,还是在数据实际发送到磁盘时拦截?因为后者可能会因为缓冲而延迟。并且 Unix 使用共享缓冲区缓存,因此多个进程可能是“负责的”。如果进程使用内存映射,则没有write()。 -
感谢巴尔玛的快速回复。我想在其他地方复制写入(可能还有删除)操作。我希望在磁盘写入期间进行拦截可能是正确的。我不明白
multiple processes may be responsible。我对执行写入的高级进程感兴趣。请建议我最好的选择。谢谢。 -
两个进程都在同一个文件上使用
mmap()。他们每个人都通过这个共享内存对文件的同一页面进行一些更新。最终页面被刷新到磁盘——应该返回哪些进程信息? -
举个例子。如果我从 gedit 保存文件,其他进程将写入同一个文件是什么?在这种情况下,我只对我希望是高级进程的 gedit 感兴趣(或者第二个进程是否具有与 gedit 相同的 pgid 和/或 sid?在这种情况下,我对具有相同 pgid 的进程感兴趣/sid)。
-
我只是想指出,事情可能比您的简单示例更复杂。大多数时候只有一个进程写入文件,但有时多个进程写入。无论如何,要做你想做的事,你可能需要编写一个内核驱动程序或某种扩展。
标签: linux filesystems