所以我试图了解 Linux 的挂载命名空间是如何工作的。因此,我做了一个小实验,打开两个终端并运行以下命令:
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 号航站楼中可以看到该安装座?由于它不是挂载命名空间的一部分,我希望该目录在此处显示为空。我也尝试通过 传递-o shared=no
和使用--make-private
选项mount
,但得到了相同的结果。
我错过了什么以及如何将其真正设为私有?
答案1
util-linux
如果您使用的是版本低于 2.27 的基于 systemd 的发行版,您将看到这种不直观的行为。这是因为CLONE_NEWNS
传播标志,例如shared
取决于内核中的设置。此设置是正常的private
,但 systemd 将其更改为shared
。自util-linux
2.27 起,补丁已制作unshare
更改命令的默认行为以用作private
默认传播行为,以便更加直观。
解决方案
如果您使用的是 2.27 版本之前的 systemd 系统util-linux
,则必须重新挂载根文件系统后运行unshare
命令:
# unshare --mount -- /bin/bash
# mount --make-private -o remount /
如果您使用的是版本 2.27 或更高版本的 systemd 系统util-linux
,它应该按您在问题中给出的示例中逐字地工作,而不需要重新安装。如果不是,请传递--propagation private
到unshare
命令以强制挂载命名空间的传播为私有。
答案2
这在 ubuntu(15.04 和 14.04)中不起作用。它适用于软呢帽。和软呢帽。无论你是否需要--make-private,你也可以检查
猫 /proc/self/mountinfo | grep 共享
如果共享,则意味着其他名称空间仍然可以看到该挂载。然后是systemd相关的问题。您可以使用 --make-private 使其工作
答案3
在 Debian 9 util-linux
2.27 之前的版本中,戴夫的解决方案对我不起作用。然而,这有效:
mount --make-rprivate -o remount /
请注意,有一个前缀r
,这意味着递归地。