为什么我不能在用户命名空间内绑定挂载“/”?

sou*_*edi 13 mount namespace userns bind-mount

为什么这不起作用?

$ unshare -rm mount --bind / /mnt
mount: /mnt: wrong fs type, bad option, bad superblock on /, missing codepage or helper program, or other error.
Run Code Online (Sandbox Code Playgroud)

这些工作正常:

$ unshare -rm mount --bind /tmp /mnt
$ unshare -rm mount --bind /root /mnt
$
Run Code Online (Sandbox Code Playgroud)
$ uname -r  # Linux kernel version
4.17.3-200.fc28.x86_64
Run Code Online (Sandbox Code Playgroud)

sou*_*edi 16

不同之处在于/有子坐骑。在用户命名空间内,不允许将继承的挂载与其子挂载分开。一个更明显的例子是你不被允许umount /proc。否则,它可能会突然授予您访问隐藏在其他挂载下的文件的权限。有时会故意使用过载作为安全措施。

您可以改为创建递归绑定挂载,它保留所有子挂载:

$ unshare -rm mount --rbind / /mnt
Run Code Online (Sandbox Code Playgroud)