我想将数据写入硬盘前做一些事情。 我不知道任何解决方案。 为了避免编译内核源代码,是没有办法,我可以用钩子函数作为一个可加载模块的任何位置?
更新:感谢所有,LSM是良好的API钩子。 但我想找到其他的解决方案,提供数据的机制挂钩的读/写块。 它可避免重新加密更新文件后,所有的文件。
我觉得有东西,我可以的文件系统(ext2的,EXT3,...)和缓存之间进行修改。
我想将数据写入硬盘前做一些事情。 我不知道任何解决方案。 为了避免编译内核源代码,是没有办法,我可以用钩子函数作为一个可加载模块的任何位置?
更新:感谢所有,LSM是良好的API钩子。 但我想找到其他的解决方案,提供数据的机制挂钩的读/写块。 它可避免重新加密更新文件后,所有的文件。
我觉得有东西,我可以的文件系统(ext2的,EXT3,...)和缓存之间进行修改。
使用Linux安全模块 。 这些是可加载的内核模块,提供钩子介导访问内核中的各种内部的物体。 您可以使用挂钩文件系统或inode按您的要求。 一个神的地方开始是读葛雷格·克罗哈曼的纸张上LSM。 然后,你可以访问这个链接 ,它是用一个例子如何利用LSM钩子一起显示。 这个例子是为了调节访问仅在特定的USB插入系统,并且是如何与LSM钩子开始一个很好的参考点。
嗯,这是个有趣的问题。
不幸的是,即使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
就地。
尝试FUSE( https://github.com/libfuse/libfuse )。
这是在用户空间文件系统。 你可以写文件I / O在用户空间处理程序,并简单地安装它作为应用程序的执行。
我不认为这是可能的。 当用户空间调用文件I / O的文件系统实现或通用的实现将VFS调用。 你需要的是改变这个函数指针指向你的模块,该模块加密数据,然后调用文件系统功能。
我的确在大学这样的事情,但它是一个老的内核,你不得不设置一个特定的配置标志。 如果我记得这个标志已经消失了,你不想要的内核模块来惹他们的范围之外的功能指针周围。
:在任何情况下,你可以在这里找到模块https://motzblog.wordpress.com/2007/10/27/linux-monitoring-module/
但要注意,这是一所大学的项目,所以代码质量是不是你除了从Linux内核代码。