Linux文件系统的Hook函数

时间:2013-04-01 07:21:20

标签: linux linux-kernel filesystems hook

我想在将数据写入硬盘之前先做点什么。我不知道任何解决方案。为了避免编辑内核源代码,是否有任何可以将钩子函数用作可加载模块的位置?

更新:谢谢大家,LSM适用于API挂钩。但我想找到其他提供机制钩子读/写数据块的解决方案。更新文件后,可以避免重新加密所有文件。

我认为我可以在文件系统(ext2,ext3,...)和缓冲区缓存之间修改。

4 个答案:

答案 0 :(得分:2)

使用Linux Security Modules。这些是可加载的内核模块,它们提供钩子来调解对内核中各种内部对象的访问。您可以根据需要使用挂钩到文件系统或inode。一个神的起点是在LSM上阅读Greg Kroah Hartman的paper。然后,您可以访问此link,其中显示了如何使用LSM挂钩的示例。示例是仅在插入特定USB时调解对系统的访问,并且是如何开始使用LSM挂钩的良好参考点。

答案 1 :(得分:2)

嗯,这是一个有趣的问题。

不幸的是,甚至LSM也没有帮助。作为一种可能的解决方案,我建议使用address_space_operations表和钩子writepage函数。例如,请查看ext3_writeback_aops

1984 static const struct address_space_operations ext3_writeback_aops = {
1985         .readpage               = ext3_readpage,
1986         .readpages              = ext3_readpages,
1987         .writepage              = ext3_writeback_writepage,
1988         .write_begin            = ext3_write_begin,
1989         .write_end              = ext3_writeback_write_end,
1990         .bmap                   = ext3_bmap,
1991         .invalidatepage         = ext3_invalidatepage,
1992         .releasepage            = ext3_releasepage,
1993         .direct_IO              = ext3_direct_IO,
1994         .migratepage            = buffer_migrate_page,
1995         .is_partially_uptodate  = block_is_partially_uptodate,
1996         .error_remove_page      = generic_error_remove_page,
1997 };

因此,在ext3文件系统的情况下,我们需要在内存中找到这个结构,并将writepage指针替换为指向our_writepage包装器。另请注意,此表位于只读内存中,您需要正确处理它。

编辑:

使用LSM,可以挂钩inode打开操作并替换inode->i_mapping->a_ops inplace。

答案 2 :(得分:0)

尝试 FUSE https://github.com/libfuse/libfuse)。

这是用户空间中的文件系统。您可以在用户空间中编写文件I / O处理程序,只需将其作为应用程序的执行进行安装。

答案 3 :(得分:-3)

我不认为这是可能的。当用户空间调用文件I / O时,将从VFS调用文件系统实现或通用实现。 您需要的是将此函数指针更改为指向您的模块,该模块会对您的数据进行加密,然后调用文件系统函数。

我在大学里做过类似的事情,但这是一个旧内核,你必须设置一个特定的配置标志。如果我记得这个标志已经消失了,因为你不希望内核模块乱用其范围之外的函数指针。

无论如何,您可以在此处找到该模块:https://motzblog.wordpress.com/2007/10/27/linux-monitoring-module/

但请注意,这是一个大学项目,所以除了Linux内核代码之外,代码质量不是你的。