实验一
从命名空间之外,cat /proc/self/mountinfo
给出
291 34 0:37 / /tmp/IMJUSTTMP rw,relatime shared:152 - tmpfs tmpfs rw,size=102400k
34 23 0:32 / /tmp rw,nosuid,nodev shared:16 - tmpfs tmpfs rw
然后我运行unshare -mU --map-root-user --propagation private /usr/bin/zsh
在命名空间内获取一个新外壳,但在新创建的挂载命名空间内,我不能 umount /tmp/IMJUSTTMP
,umount
只是告诉我它没有挂载。虽然我可以检查新创建的挂载命名空间cat /proc/self/mountinfo
,但它提供了私有挂载
290 263 0:32 / /tmp rw,nosuid,nodev - tmpfs tmpfs rw
302 290 0:37 / /tmp/IMJUSTTMP rw,relatime - tmpfs tmpfs rw,size=102400k
那为什么umount: /tmp/IMJUSTTMP: not mounted.
当我尝试/tmp/IMJUSTTMP
在命名空间内卸载时会得到呢?
我正在使用 5.0.9-arch1-1-ARCH,带有kernel.unprivileged_userns_clone = 1
.
实验二
之后unshare -mU --map-root-user --propagation private /usr/bin/zsh
,尝试创建 overlayfs 也失败了。
mkdir -p /tmp/IMJUSTTMP/work
mkdir /tmp/IMJUSTTEST
mount -t tmpfs -o size=100m tmpfs /tmp/IMJUSTTMP
mount -t tmpfs -o size=200M tmpfs /tmp/IMJUSTTEST
将按预期成功,而以下所有内容都将permission denied
进入命名空间。
mount -t overlay -o "lowerdir=/home/xtricman,upperdir=/tmp/IMJUSTTMP/,workdir=/tmp/IMJUSTTMP/work" overlay /home/xtricman
mount -t overlay -o "lowerdir=/tmp/IMJUSTTEST,upperdir=/tmp/IMJUSTTMP,workdir=/tmp/IMJUSTTMP/work" overlay /mnt
我的粗略猜测
我发现了这两个问题,在用户命名空间中,为什么不允许我重新挂载已挂载的文件系统?为什么我不能在用户命名空间内绑定挂载“/”?似乎因为我继承了/tmp/IMJUSTTMP
和/tmp
挂载,所以即使我在新创建的挂载命名空间的拥有用户命名空间中获得了全部功能,我也无法卸载它们。
问题
谁能解释这两个实验到底发生了什么?是否有任何文档提到在挂载命名空间内挂载和卸载的详细内核行为?这个内核提交中提到的“超级块所有者”是什么?为什么我不能在用户命名空间内绑定挂载“/”??
是的 :-)。这里有三个不同的点。
实验一:为什么
umount: /tmp/IMJUSTTMP: not mounted
我尝试umount /tmp/IMJUSTTMP
进入命名空间时会得到?http://man7.org/linux/man-pages/man7/mount_namespaces.7.html
实验 2:尝试创建一个 overlayfs 也失败了
2008 LWN 文章说,已被验证为“在用户命名空间中安全使用”的文件系统被标记为
FS_USERNS_MOUNT
. 所以我们可以很容易地搜索到哪些文件系统是允许的。请注意,此标志已添加到内核版本 5.11 的 OverlayFS 中。因此,您现在可以在特权用户和挂载命名空间内挂载一个。
这个内核提交中提到的“超级块所有者”是什么,以及“为什么我不能在用户命名空间内绑定挂载”/“?” ?
您链接到的内核提交中的源代码表示,每个超级块都被视为由特定的用户命名空间拥有。所有者是最初创建超级块的用户命名空间。