我写了一个小的C程序,它只是取消共享(CLONE_NEWNS),然后是系统(“bash”)。
手册页说该进程应该有自己的命名空间。所以,在shell中我试过unmount / cgroup(cgroup安装在原始机器上)。
当我在机器上的shell中进行挂载时,/ cgroup也会在那里卸载。我在这里错过了什么吗?我认为CLONE_NEWNS是让我从进程中卸载文件系统而不影响主系统。
答案 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=194388和https://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);
这个调用,可以从另一个命名空间看到命名空间操作