如何拦截对文件系统的调用
我有兴趣拦截与文件系统相关的所有系统调用,而不是让自己的代码运行。 例如,创建,写入,关闭,lseek,getcwd等的调用。我的目标是创建一个像execve这样的函数,用于捕获从生成的程序到调用进程管理的内存文件系统中的所有文件I / O。 这样调用程序就可以检查输出而不会造成文件系统开销。
我的使用案例正在处理大型数字模拟程序,它们没有API或库。 这些程序只能通过输入和输出文件进行通信。 如果这些文件很大,则只需执行大部分运行时即可完成I / O。 在有些超级用户权限的计算机上,可以设置一个驻留在RAM中的文件系统(例如Linux上的tmpfs),但是没有超级用户权限,或者以某种方式配置的计算机,这是不可能的。
据我所知,使用LD_PRELOAD可以调用自定义代码而不是libc中的函数。 但是,这仅适用于动态链接的程序,并且它不回答在调用程序(我想要托管内存文件系统)和被调用程序之间如何执行IPC的问题。 这种方法的问题是如何最好地执行IPC。 我应该使用管道,unix域套接字还是一些共享内存?
我也将ptrace视为拦截系统调用的一种方式。 这看起来可能有用,但我对这种方法有两个问题。 首先,我们如何防止实际的系统调用发生(而不是象我在一些例子中看到的那样仅仅修改系统调用的参数)。 其次,ptrace是否允许高性能地读取被调用者的内存空间?
使用LD_PRELOAD
,您可以让拦截代码在被调用程序的内存空间中运行。 使用一个库构造函数( __attribute__((constructor))
),你可以让你选择的代码在库启动时运行,例如mmap
虚拟文件系统并初始化它。
然后,当您用预加载的库拦截调用时,库的函数在目标进程中运行,并访问构建的文件系统 - 不需要IPC。
如果调用进程必须管理文件系统,则会引发与之通信的开销。 我建议在子进程中映射文件系统的重要部分(可能是作为共享内存区域),而是使用子进程中的监听器来监视父进程的文件系统更改(对文件系统操作进行适当的锁定)。 由于带宽要求较低,您可以使用简单的管道完成更改通知。
还可以通过提供修改后的Glibc来查看Plash,这是一个半虚拟化系统,通过沙箱对文件系统进行访问。
链接地址: http://www.djcxy.com/p/66371.html