语境

语境

语境

我正在尝试设计一个工具,它或多或少会自动从标准 shell 脚本生成 Makefile。

这个想法是,对于脚本执行的每个命令:我注册读取和写入的文件,然后在 Makefile 中生成关联的依赖项以及关联的命令。我不想限制此类命令的范围,它们可能是:用深奥语言进行的编译器调用、测试套件、打包系统等......

实际上,Makefile 只是该工具的缓存。它提供了可以并行运行的命令的建议。第一次运行将假设完全顺序依赖,并观察哪个命令读取/写入了哪些文件。下面只运行需要重新运行的命令,有一个机制制作。微妙之处在于,如果命令尝试读取尚未最新的文件(新依赖项),则拦截的调用将停止,直到文件更新。

问题

我需要实时拦截对文件的访问,以检测哪个命令访问了哪些文件。

我确实考虑过使用LD_PRELOAD,但这假设所有命令都使用libc调用来执行系统调用。我考虑过实现我自己的内核模块来捕获这些系统调用,但我的工具将需要不适当的权限。

我看到两个解决方案:

  • 在调试模式下运行命令
  • 使用操作系统虚拟化功能在虚拟环境中运行命令

调试模式能否为我提供足够的控制来拦截这些调用?例如,它会与已经在调试模式下运行子进程的命令堆栈吗?

如果没有,有多少工作需要使用处理器的虚拟化功能?也就是说,虚拟化操作系统大部分是透明的(除了停顿行为),我是否需要实现很多不相关的系统调用?

假设

我只对用户空间命令访问的文件感兴趣,如果程序在特权模式下运行,我不希望能够“监视”它。我假设一个文件要么是由一个命令生成/更新的,要么是一个种子。

相关内容