对于Linux文件系统钩子函数(Hook functions for Linux filesyste

2019-08-18 12:39发布

我想将数据写入硬盘前做一些事情。 我不知道任何解决方案。 为了避免编译内核源代码,是没有办法,我可以用钩子函数作为一个可加载模块的任何位置?

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

我觉得有东西,我可以的文件系统(ext2的,EXT3,...)和缓存之间进行修改。

Answer 1:

使用Linux安全模块 。 这些是可加载的内核模块,提供钩子介导访问内核中的各种内部的物体。 您可以使用挂钩文件系统或inode按您的要求。 一个神的地方开始是读葛雷格·克罗哈曼的纸张上LSM。 然后,你可以访问这个链接 ,它是用一个例子如何利用LSM钩子一起显示。 这个例子是为了调节访问仅在特定的USB插入系统,并且是如何与LSM钩子开始一个很好的参考点。



Answer 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就地。



Answer 3:

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

这是在用户空间文件系统。 你可以写文件I / O在用户空间处理程序,并简单地安装它作为应用程序的执行。



Answer 4:

我不认为这是可能的。 当用户空间调用文件I / O的文件系统实现或通用的实现将VFS调用。 你需要的是改变这个函数指针指向你的模块,该模块加密数据,然后调用文件系统功能。

我的确在大学这样的事情,但它是一个老的内核,你不得不设置一个特定的配置标志。 如果我记得这个标志已经消失了,你不想要的内核模块来惹他们的范围之外的功能指针周围。

:在任何情况下,你可以在这里找到模块https://motzblog.wordpress.com/2007/10/27/linux-monitoring-module/

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



文章来源: Hook functions for Linux filesystem