所以我试图了解Linux的mount命名空间是如何工作的.所以,我做了一个小实验,打开了两个终端并运行了以下内容:

1号航站楼

root@goliath:~# mkdir a b
root@goliath:~# touch a/foo.txt
root@goliath:~# unshare --mount -- /bin/bash
root@goliath:~# mount --bind a b
root@goliath:~# ls b
foo.txt

2号航站楼

root@goliath:~# ls b
foo.txt

为什么在2号航站楼可以看到坐骑?由于它不是mount命名空间的一部分,我希望该目录在这里显示为空.我也试过传递-o shared = no和使用–make-private选项和mount,但我得到了相同的结果.


我错过了什么,我怎么能让它实际上是私人的?

解决方法:

如果您使用的util-linux版本低于2.27的基于systemd的发行版,您将看到这种不直观的行为.这是因为CLONE\_NEWNS根据内核中的设置传播诸如shared之类的标志.此设置通常是私有的,但systemd将此更改为共享.从util-linux 2.27开始,patch was made更改了unshare命令的默认行为,使用private作为默认传播行为,以便更直观.

如果您使用的是< 2.27 util-linux的systemd系统,则必须在运行unshare命令后重新安装根文件系统:

# unshare --mount -- /bin/bash
# mount --make-private -o remount /

如果您使用的是> = 2.27 util-linux的系统系统,它应该按照您在问题中提供的示例中的预期工作,不需要重新安装.如果不是:将–propagation private传递给unshare命令,以强制将mount命名空间传播为私有.

标签: linux, namespace, bind-mount

相关文章推荐

添加新评论,含*的栏目为必填