【问题标题】:Intercepting disk write in Linux在 Linux 中拦截磁盘写入
【发布时间】: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


【解决方案1】:

我对这个问题进行了一些搜索,这些看起来很有希望: • Copyhook Handlers - 对于 MSDOS Shell,在 WinReg 中提供拦截 DLL • NtSetInformationFile • Minifilters - 我认为这些对于跨平台来说是可移植的 • 可安装的文件系统驱动程序 - 当然可以

文件共享类型:一些文件系统支持审计和保护强化,但可能只是“事后”。

CopyHook 看起来非常简单:在 Windows 中拦截 shell 文件操作调用:

https://msdn.microsoft.com/en-us/library/bb776048.aspx

驱动程序级的东西变得非常复杂,非常快......

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-23
    • 1970-01-01
    相关资源
    最近更新 更多