C语言 mount()后克隆()与CLONE_NEWNS设置父效果



我对这里发生的事情有点困惑。我遵循一个指南,在使用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;
}

相关内容

  • 没有找到相关文章

最新更新