了解取消共享CLONE_NEWNS的行为

时间:2011-06-06 22:19:08

标签: namespaces kernel

我写了一个小的C程序,它只是取消共享(CLONE_NEWNS),然后是系统(“bash”)。

手册页说该进程应该有自己的命名空间。所以,在shell中我试过unmount / cgroup(cgroup安装在原始机器上)。

当我在机器上的shell中进行挂载时,/ cgroup也会在那里卸载。我在这里错过了什么吗?我认为CLONE_NEWNS是让我从进程中卸载文件系统而不影响主系统。

4 个答案:

答案 0 :(得分:5)

(顺便说一下,你不需要编写程序 - 你可以使用unshare(1)实用程序。)

在新命名空间中卸载文件系统,并将其挂载到原始文件系统中 - 问题是mount使用/etc/mtab生成当前列表已安装的文件系统,这只是一个普通文件,可以通过新命名空间中的mount命令进行更新。这意味着/etc/mtab与实际发生的事情不同步(因为只有一个 /etc/mtab,但是有两个安装命名空间。)

请检查/proc/mounts,以查看当前名称空间中实际安装的内容。

答案 1 :(得分:1)

几乎可以肯定,这种行为是因为共享子树,其中/ cgroup(即/)的父挂载标记为"共享"将mount和unmount事件传播到其他名称空间中的对等体(/的其他实例)的mount。您可以通过查看/ proc / self / mountinfo中/ mount的状态来验证这一点。这种行为很可能是由systemd建立的,它会恢复内核默认的" private"安装到"共享"。获得私人"行为,你需要使用

进行/私人
mount --make-private /

另请参阅https://bbs.archlinux.org/viewtopic.php?id=194388https://lwn.net/Articles/689856/

答案 2 :(得分:0)

我在fedora 19内核3.10

上进行了取消共享的测试

unshare --mount / bin / bash

df -h / boot /

使用的文件系统大小可用

上使用%

/ dev / sda1 485M 238M 222M 52%/ boot

umount / boot /

在第二个shell上

grep boot / proc / mounts

echo $?

1

也许我错了,但结果是我的预期

答案 3 :(得分:0)

unshare在fedora中工作,而不是在ubuntu上工作,同时,如果你只尝试CLONE_NEWNS,它就无法工作,似乎与直接调用不一致

clone(child_main,child_stack + STACK_SIZE,       CLONE_NEWUTS | CLONE_NEWPID | CLONE_NEWNS | SIGCHLD,NULL);

这个调用,可以从另一个命名空间看到命名空间操作