在将数据写入硬盘之前,我想做一些事情。 我不知道任何解决scheme。 为了避免编辑内核源代码,有没有可以使用钩子函数作为可加载模块的位置?
更新:谢谢大家,LSM是API钩子。 但是我想find其他解决scheme,提供机制钩读/写数据块。 它可以避免更新文件后重新encryption所有文件。
我认为我可以在文件系统(ext2,ext3,…)和缓冲区caching之间进行修改。
使用Linux安全模块 。 这些是可加载的内核模块,提供钩子来调解对内核中各种内部对象的访问。 您可以根据需要使用钩子到文件系统或inode。 开始的一个上帝的地方是阅读Greg Kroah Hartman关于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内核代码中除外的。