我对这里发生的事情有点困惑。我遵循一个指南,在使用CLONE_NEWNS标志集调用clone后添加了一个新的挂载点。挂载点应该只存在于子进程。我正在尝试更改新的文件系统名称空间,它似乎影响了父名称空间。
我的c程序很简单。Main将调用clone
pid_t pid = clone(child_exec,c_stack, SIGCHLD | CLONE_NEWNS | CLONE_NEWPID ,args);
args是一个聊天数组,其中包含要执行的命令。
int child_exec(void *arg)
{
int err =0;
char **commands = (char **)arg;
mount("none", "/mytmp", "tmpfs", 0, "");
execvp(commands[0],commands);
return 0;
}
如果传递给execvp的命令是mount
,我希望输出包含/mytmp挂载点,并且在程序退出后再次运行命令mount
,不会看到/mytmp出现。这是不可能的。当我调用execvp时,在输出中看到它,当我运行mount时,在输出中看到它。
我尝试安装MS_PRIVATE标志并使用unshare(CLONE_FS);
我也有一个类似的问题,我试图从子进程卸载/proc和get资源忙错误。
这对我来说归结为两个问题。
首先,我使用的Ubuntu(16.04.1 LTS)或util-linux包的版本似乎共享/mount命名空间,CLONE_NEWNS传播该设置。我的/mount被共享了。我在/proc/self/mountinfo和/proc/1/mountinfo中验证了这一点。我从这个答案中尝试了sudo mount --make-private -o remount /
,并升级了提到的软件包。https://unix.stackexchange.com/questions/246312/why-is-my-bind-mount-visible-outside-its-mount-namespace。这使我能够在不影响父名称空间的情况下进行额外的挂载。
第二个问题是卸载/proc。这不起作用,因为我的系统安装了两次/proc/sys/fs/binfmt_misc
。这里的讨论激发了我去验证这一点。http://linux-kernel.vger.kernel.narkive.com/aVUicig1/umount-proc-after-clone-newns-in-2-6-25
最后的child_exec代码是
int child_exec(void *arg)
{
int err =0;
char **commands = (char **)arg;
printf("child...%sn",commands[0]);
// if(unshare(CLONE_NEWNS) <0)
// printf("unshare issue?n");
if (umount("/proc/sys/fs/binfmt_misc") <0)
printf("error unmount bin: %sn",strerror(errno));
if (umount("/proc/sys/fs/binfmt_misc") <0)
printf("error unmount bin: %sn",strerror(errno));
if (umount("/proc") <0)
printf("error unmount: %sn",strerror(errno));
if (mount("proc", "/proc", "proc",0, NULL) <0)
printf("error mount: %sn",strerror(errno));
execvp(commands[0],commands);
return 0;
}