为什么我的绑定挂载在其挂载命名空间之外可见?

为什么我的绑定挂载在其挂载命名空间之外可见?

所以我试图了解 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-linux2.27 起,补丁已制作unshare更改命令的默认行为以用作private默认传播行为,以便更加直观。

解决方案

如果您使用的是 2.27 版本之前的 systemd 系统util-linux,则必须重新挂载根文件系统运行unshare命令:

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

如果您使用的是版本 2.27 或更高版本的 systemd 系统util-linux,它应该按您在问题中给出的示例中逐字地工作,而不需要重新安装。如果不是,请传递--propagation privateunshare命令以强制挂载命名空间的传播为私有。

答案2

这在 ubuntu(15.04 和 14.04)中不起作用。它适用于软呢帽。和软呢帽。无论你是否需要--make-private,你也可以检查

猫 /proc/self/mountinfo | grep 共享

如果共享,则意味着其他名称空间仍然可以看到该挂载。然后是systemd相关的问题。您可以使用 --make-private 使其工作

答案3

在 Debian 9 util-linux2.27 之前的版本中,戴夫的解决方案对我不起作用。然而,这有效:

mount --make-rprivate -o remount /

请注意,有一个前缀r,这意味着递归地

相关内容