Linux 文件系统的钩子函数

问题描述 投票:0回答:4

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

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

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

linux linux-kernel filesystems hook
4个回答
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


2
投票

使用 Linux 安全模块。这些是可加载的内核模块,提供挂钩来协调对内核中各种内部对象的访问。您可以根据您的要求使用文件系统或索引节点的挂钩。阅读 Greg Kroah Hartman 关于 LSM 的论文是一个不错的起点。然后您可以访问此链接,其中显示了如何使用 LSM 挂钩的示例。该示例仅在插入特定 USB 时中介对系统的访问,并且是有关如何开始使用 LSM 挂钩的一个很好的参考点。


1
投票

尝试FUSEhttps://github.com/libfuse/libfuse)。

这是用户空间中的文件系统。您可以在用户空间中编写文件 I/O 处理程序,然后将其挂载为应用程序的执行。


1
投票

此示例演示了如何破解 libc 函数,例如 ope

© www.soinside.com 2019 - 2024. All rights reserved.