如何在 C 程序中临时在 chroot 环境中运行?

问题描述

我想要做的基本上如下:

some_function_1();
chroot("/some_other_root");
some_function_2();
//Get back to main root somehow...
some_function_3();

这样只有 some_function_2() 在 chroot 环境中运行,而其他代码在正常环境中运行。

这种事情可以在一个进程中完成吗?或者我是否需要分叉到一个新进程来执行此操作?

解决方法

根目录是进程的一个属性。每个进程,在用户区,有两个inode,用于启动文件搜索解析算法:

  • 根目录 inode 在以该目录为根 inode 的每个进程的用户区中的引用中维护。
  • 当前工作目录也作为用户区域中的参考进行维护。

两个 inode 都用作解析以 / 开头(来自根 inode)而不是以 / 开头(对于当前目录 inode)的文件名的起点。

当前目录的改变只需要用户对所有被导航的目录具有x权限(使用当前根目录或当前目录inode作为起点),但是chroot()系统调用需要用户root权限,所以在普通用户进程上是做不到的。

无论如何,正如您可能已经猜到的那样,作为进程的一个属性,该进程内的单个函数不能具有不同的根目录或当前目录 inode。所以在我看来,你的计划是不可能的。