Linux 子进程和父进程共享挂载点不一致

Linux 子进程和父进程共享挂载点不一致

让我尝试解释一下背景:

在主bash中:

我们用

mount --bind /tmp/source /tmp/target
mount --make-shared /tmp/target

创建这个共享挂载点target

然后我们使用

unshare -m /bin/bash

开始一场儿童狂欢。到目前为止,一切看起来都很正常。

然后在主bash中,我们target成功卸载了。

umount /tmp/target

根据这个内核文档:共享子树target尽管子线程是通过CLONE_NEWNS(unshare -m)启动的,但子 bash 也应该看到已经卸载。但现在问题出现了:

在child bash中,我们猫/proc/self/mountinfo,发现target仍然存在!

78 48 8:3 /tmp/source /tmp/target rw,relatime shared:1 - ext4 /dev/disk/by-uuid/98708f21-a59d-4b80-a85c-27b78c22e316 rw,errors=remount-ro,data=ordered

这是上述文档中不匹配的行为。在主bash中,我们cat/proc/self/mountinfo并发现taregt已经卸载了。现在我们无法 rmdirtarget文件夹,因为子 bash 仍然保留着这个共享安装点。

rm -rf /tmp/target
rm: cannot remove ‘/tmp/target’: Device or resource busy

我们在 Ubuntu 14.04 和 CentOS 6.6 上进行了测试。这是内核错误吗?或者我误解了linux的共享挂载。

答案1

默认情况下,最新版本的 heunshare命令将挂载传播设置为私有。过去--propagation unchanged就别管它了。

相关内容