我正在使用一个依赖于引用源文件等的绝对路径的构建系统。当我想使用不同的工具链测试构建时,我将 src 目录挂载在 VM 或 chroot 中。问题是我的主机上的 src 目录的路径非常复杂 - 比方说 /a/b/c/d/src - 并且它必须与安装的路径匹配。
我希望能够将我的 src 目录挂载在 /mnt/src 之类的地方,但我总是最终需要创建一个符号链接 /a/b/c/d/src 到 /mnt/src,或者只是将挂载点设置为直接/a/b/c/d/src。
文件系统中包含 /a/b/c/d 感觉很脏,通常您甚至可能没有在 /a/b/c/d (或任何父目录)中创建文件的权限。有没有办法伪造这条路径来安抚我的构建系统?
答案1
最好的解决方案是告诉构建系统源路径和安装路径不是同一件事,但我假设你不能这样做。
最直接的方法是将源路径安排为可以轻松复制的路径,例如/var/tmp/mybuild
.如果构建系统不是太令人讨厌,那么将其作为文件所在位置的符号链接就足够了。如果构建系统坚持规范化符号链接,您应该能够通过使用绑定挂载反而。使用bindfs,您不需要root权限,您只需要对要让文件出现的位置具有写权限。
如果您无法对源系统进行操作,另一种方法是预加载重定向某些文件访问的动态库。这假设将运行的所有可执行文件都是动态链接的。链接示例中的代码演示了如何从特定文件执行此操作;可以对其进行调整以重定向路径以特定前缀开头的所有文件。代替
if (!strcmp(path, FROM)) {
path = TO;
}
…
return ret;
通过类似的东西(未经测试)
char *other_path = NULL;
if (!strncmp(path, FROM, strlen(FROM))) {
other_path = malloc(strlen(path) - strlen(FROM) + strlen(TO) + 1);
if (other_path == NULL) return -ENOENT; // return NULL in fopen
memcpy(other_path, TO, strlen(TO));
memcpy(other_path + strlen(TO), path + strlen(FROM), strlen(path) - strlen(FROM) + 1);
path = other_path;
}
…
free(other_path);
return ret;
答案2
如果您的目标是避免测试构建的残留物污染“主机”,那么在firejail
具有持久覆盖层的内部构建应该是一个不错的选择。通过这种方法,它可以像真实的一样构建并可能安装,但文件最终会出现在覆盖层中,而不是污染“真实的”文件系统。
缺点是您需要在覆盖层中找到测试构建结果,但同时这可能具有保留连续测试构建结果的优点,例如,用于比较它们,或您可能需要的任何其他后续取证做。