使用CLONE_NEWNS设置效果父项后,使用clone()方法mount()

我对这里发生的事情有点困惑。 我正在按照一个指南 ,在CLONE_NEWNS标志设置后调用克隆之后添加了一个新的挂载点。 挂载点应该只存在于subprocess中。 我正在尝试改变新的文件系统命名空间,它似乎影响父母。

我的C程序非常简单。 主要会调用克隆

pid_t pid = clone(child_exec,c_stack, SIGCHLD | CLONE_NEWNS | CLONE_NEWPID ,args); 

args是一个包含exec命令的聊天数组。

 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);

我也有一个类似的问题,我试图从subprocess卸载/ proc和获取资源是繁忙的错误。 我认为这不应该发生在一个新的命名空间。

这对我来说有两个问题。

首先是Ubuntu(16.04.1 LTS)或者我使用的util-linux软件包共享/ mount命名空间,CLONE_NEWNS传播该设置。 我的/装载共享。 我在/ 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...%s\n",commands[0]); // if(unshare(CLONE_NEWNS) <0) // printf("unshare issue?\n"); if (umount("/proc/sys/fs/binfmt_misc") <0) printf("error unmount bin: %s\n",strerror(errno)); if (umount("/proc/sys/fs/binfmt_misc") <0) printf("error unmount bin: %s\n",strerror(errno)); if (umount("/proc") <0) printf("error unmount: %s\n",strerror(errno)); if (mount("proc", "/proc", "proc",0, NULL) <0) printf("error mount: %s\n",strerror(errno)); execvp(commands[0],commands); return 0; }