拦截文件系统系统调用

我正在写一个应用程序,我需要拦截一些文件系统系统调用,例如。 断开链接。 我想保存一些文件说abc。 如果用户删除该文件,那么我需要将其复制到其他地方。 所以我需要取消链接来删除abc之前调用我的代码,以便我可以保存它。 我已经通过拦截系统调用相关的线程,但LD_PRELOAD方法不会在我的情况下工作,因为我想这是安全的,并在内核中实现,所以这种方法不会有用。 在事件之后通知inotify,所以我不能保存它。 你能提出任何这样的方法。 我想在一个内核模块中实现而不是修改内核代码本身。 Graham Lee提出的另一种方法,我想到了这个方法,但是它有一些问题,我需要所有文件的硬链接镜像,它不会占用空间,但仍然可能是有问题的,因为我必须重复镜像驱动器来保持镜像date,也不会工作交叉分区和分区不支持链接,所以我想要一个解决scheme,我可以挂钩的文件/目录,然后观察变化,而不是反复扫描。 我也想添加对修改后的文件的支持,我不能使用硬链接。 我想拦截系统调用,通过replace系统调用,但我一直没有find任何方法在linux> 3.0。 请提出一些方法来做到这一点。

Solutions Collecting From Web of "拦截文件系统系统调用"

至于挂钩内核和拦截系统调用去,这是我在我写的安全模块中做的事情:

https://github.com/cormander/tpe-lkm

查看代码中的hijacks.c和symbols.c; 它们是如何在security.c中的hijack_syscalls函数中使用的。 我还没有在linux> 3.0上试过这个,但是同样的基本概念应该还是可以的。

这有点棘手,你可能需要编写大量的内核代码才能在解除链接之前进行文件复制,但在这里也是可以的。

你可以用inotify来观看unlink事件,虽然这可能会为你的目的发生得太晚(我不知道,因为我不知道你的目的,你应该试着找出答案)。 基于LSM(我的意思是SMACK,TOMOYO和朋友)的内核替代方案实际上是强制访问控制,因此可能不适合您的目的。

一个建议可能是用户空间中的文件系统(FUSE)。也就是说,写一个FUSE模块(这是在用户空间中授予的),拦截与文件系统相关的系统调用,执行你想要的任何任务,并且可能之后调用“默认”系统调用。

然后你可以用你的FUSE文件系统安装某些目录,对于大多数情况下,似乎不需要重写默认的系统调用行为。

如果你只想处理删除,你可以保留一个硬link的“影子”目录(通过link创建)到正在观看的文件(通过inotify ,由格雷厄姆·李建议)。

如果原始文件现在未链接,则仍然可以根据需要处理影子文件,而无需使用内核模块。