使用不同的根目录启动单独的进程,而不进行分支/克隆

时间:2015-04-06 16:04:34

标签: c linux-kernel posix systemd posix-api

就我而言,我需要每天从一个单独的文件系统启动一个进程,它的根目录位于子目录中。因为它是文件系统上唯一需要卸载它的东西 另一个问题是我不能fork() / clone()这个过程,因为它在特权环内运行。

我想到了以下解决方案:

char *argv [] = {"/path2/sbin/the_program_to_be_launched","-option","value of option",NULL};
char *envp [] = {"HOME=/","SHELL=no_shell_available","LC_ALL=C",NULL};
mount(name, "/path/", fs, flags, data);
chroot("/path/");
execve("/path2/sbin/the_program_to_be_launched",argv,envp); // would not work because the program won’t be able find his libraries
umount("/"); // would never be called if execve() would have been called correctly

如果没有执行这个过程,这样的事情也行不通。

mount(name, "/path/", fs, flags, data);
chroot("/path/path2/"):
umount("/"); // would not work since "/" is not the root of the device.

那么如何使用不同的根目录启动不同的子进程而不更改父进程呢?

2 个答案:

答案 0 :(得分:0)

crom可以启动启动实际程序的shell脚本。

在Linux中,' /' directory是所有文件系统的根目录。所以你绝对不想卸下它。请阅读mount / unmount上的手册页。

您可以在fstab中为可安装用户的文件系统放置一个适当的条目。然后安装/卸载它会相对简单。

你可以创建一个限制性的'脚本登录/注销的用户。

该用户可用于运行目标程序并执行mount / unmount操作。

由crom运行的shell可以执行所有CD等

使应用程序能够执行而无法看到它的'图书馆,也许链接它'静态'。也许有用户' .profile包括开发$ PATH变量以包含库的路径。

用户登录可以使用busybox版本,该版本只包含用户运行目标程序所需的命令。

答案 1 :(得分:0)

在类Unix系统上,创建新进程的唯一方法是系统调用forkclone,而execv.系列是启动可执行文件的唯一方法。确实有其他功能,如system,但他们确实称这两个系统调用。

当然,在另一个系统上,它可能会有所不同。例如,在Windows上,启动à新流程的API为CreateProcess

但是在Unix或Linux上,您必须clonefork。您可以使用chroot更改根文件系统,并将privilèges删除setuid或其替换(提供的调用过程为privilèges)。