我遇到了一个关于 Linux 上挂载命名空间的奇怪问题。我有两个系统,都是 X86_64,在 Fedora 16 下运行内核 3.2.3-2。我尝试tmpfs
在使用以下命令创建的子命名空间中挂载文件系统unshare
:
unshare -m /bin/bash
从手册页:
mount namespace
mounting and unmounting filesystems will not affect rest of the
system (CLONE_NEWNS flag),
在一个系统上,这可以按预期工作。也就是说,如果我从这个开始:
# ls /mnt
file1 file2 file3
然后在子命名空间中挂载tmpfs
文件系统:/mnt
# PS1="child# ' unshare -m /bin/bash
child# mount -t tmpfs tmpfs /mnt
的内容/mnt
在子命名空间中被屏蔽:
child# ls /mnt
child#
但在父级中继续可见:
# ls /mnt
file1 file2 file3
在第二个系统上,完全相同的命令序列将导致挂载在父命名空间和子命名空间中都可见。换句话说,该unshare
命令似乎实际上并没有导致单独的挂载命名空间。
我不知道这两个系统之间有任何实质性差异。一个正在运行桌面环境,另一个则不是。 SELinux 在两个系统上均被禁用。
我正在寻找有关可能导致这种行为差异的任何建议。
答案1
检查沙盒服务是否正在运行。
systemctl status sandbox.service
如果是这样,请将其关闭,重新启动,然后重试。这对我有用。
答案2
@John 得到了答案,但我想在这里提供一些额外的文档来反映为什么两个系统的行为不同。
脚本sandbox
( )通过运行以下命令递归地在系统上的所有安装上/etc/rc.d/init.d/sandbox
设置标志:shared
mount --make-rshared /
脚本中的评论sandbox
如下:
描述:沙箱、xguest 和其他想要使用 pam_namespace 的应用程序需要在启动时运行此脚本。该服务脚本实际上并不运行任何服务,而是设置: / 被启动单独命名空间的任何应用程序共享。 如果您不使用沙箱、xguest 或 pam_namespace,则可以关闭此服务。
因为这里引用的工具都是 GUI 应用程序,所以该sandbox
脚本仅针对运行级别 5 启用。在我正在使用的两个系统中,其中一个是桌面 - 因此它在运行级别 5 中启动并sandbox
默认获取脚本 - 而另一个是启动到运行级别 3 的无头服务器。
答案3
我一直看到同样的问题。尝试一个
mount --make-private /mnt
之前
mount -t tmpfs tmpfs /mnt
另请查看 seunshare 命令的源代码以了解它们是如何执行的。