让我尝试解释一下背景:
在主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
就别管它了。