我对这里发生的事情感到有些困惑。我跟随guide后,在设置了CLONE_NEWNS标志的情况下调用clone后添加了新的挂载点。应该只为子进程存在挂载点。我正在尝试更改新的文件系统命名空间,它似乎影响了父文件系统。
我的c程序非常简单。 Main将调用clone
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);
我也有类似的问题,我试图从子进程中卸载/ proc并且get资源忙。我认为新命名空间不应该发生。
答案 0 :(得分:1)
这对我来说有两个问题。
首先,似乎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...%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;
}