clone()之后的mount()与CLONE_NEWNS设置效果parent

时间:2016-10-05 02:03:12

标签: c linux containers linux-namespaces

我对这里发生的事情感到有些困惑。我跟随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资源忙。我认为新命名空间不应该发生。

1 个答案:

答案 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;
}