![创建挂载命名空间并隔离挂载点 redhat](https://linux22.com/image/793297/%E5%88%9B%E5%BB%BA%E6%8C%82%E8%BD%BD%E5%91%BD%E5%90%8D%E7%A9%BA%E9%97%B4%E5%B9%B6%E9%9A%94%E7%A6%BB%E6%8C%82%E8%BD%BD%E7%82%B9%20redhat.png)
尝试掌握所有命名空间,并遵循此文档https://www.redhat.com/sysadmin/mount-namespaces,在这里一切都很好,直到我到达创建我们的挂载命名空间部分并且迷失了。
首先命令
findmnt |grep mapper
就我而言,什么也没有返回。
其次,我不明白为什么我们尝试将文件夹本身作为挂载点
mount --bind ${CONTAINER_ROOT_FOLDER}/fakeroot ${CONTAINER_ROOT_FOLDER}/fakeroot
第三,我无法使 pivot root 命令工作,因为它总是返回无效参数。
因此,我试图找出本教程中缺少的内容,以及这与继续进行有什么区别
mkdir /tmp/mnt_namespace
sudo mount -t tmpfs none /tmp/mnt_namespace
sudo unshare --mount chroot /tmp/mnt_namespace /bin/bash
因为从我的理解来看,作者试图创建一个挂载命名空间而不附加父用户的挂载点?
这种方法是否仍然容易受到来自不同安装点的进程交互的影响?
提前感谢您的帮助,也许我的理解完全错误。
答案1
首先命令
findmnt |grep mapper
就我而言,什么也没有返回。
它不适用于您的系统。您不需要专门针对 进行 grep mapper
;本文告诉您针对您的根文件系统设备,由于使用 LVM,因此在 Red Hat 上恰好只包含单词“mapper”。
其次,我不明白为什么我们尝试将文件夹本身作为挂载点
mount --bind ${CONTAINER_ROOT_FOLDER}/fakeroot ${CONTAINER_ROOT_FOLDER}/fakeroot
其目的实际上是将该路径变成挂载点。正如文章中已经解释的那样,某些操作(例如pivot_root)需要提供挂载点根,并且在普通目录上不起作用。
(尽管如此,我不认为pivot_root是正确的函数——通常我看到这是使用mount --move <path> /
加上一些chroot-into- /
dance来完成的。)
因此,我试图找出本教程中缺少的内容,以及这与继续进行有什么区别
您错过的教程的一部分是,它在那个“fakeroot”目录中安装了整个第二个 Linux 根文件系统。它不仅仅是一个空白的 tmpfs 目录——如果只是这样,您就无法做到,chroot ... /bin/bash
因为……里面没有 /bin/bash。如果您想隐藏现有的操作系统文件系统,那么您必须提供一个新的(例如通过 debootstrap,或提取 Alpine tarball,或其他方式)。
本教程还创建了一个用户命名空间来隔离权限。它调用 unshare with -Ur
,这会使 root(UID 0)在内部和外部保持相同,但会分离所有其他 UID – 例如命名空间内的 UID 1000 将不是与命名空间外的 UID 1000 相同。您可以使用没有用户命名空间的挂载命名空间,事实上,chroot 和容器长期以来都是以这种方式工作的,但安全性明显较低。
请记住,有些 IPC 系统可以在文件系统之外工作。挂载命名空间可能会隔离 中的套接字/run
,但它才不是隔离“抽象”套接字(@
中的条目netstat -lx
)或环回 TCP 套接字 - 您需要一个“网络”命名空间来隔离它们 - 或具有自己的“ipc”命名空间的旧式 SysV IPC。
(例如,如果你有一个图形化 X11 环境,其中 Xorg 以用户 1000 身份运行(同时监听文件系统套接字和如果你已经将你的 Xorg 连接到一个抽象套接字,那么你可以通过挂载命名空间创建一个 chroot,在 chroot 内部以 UID 1000 运行的进程仍然能够通过抽象套接字连接到你的 Xorg。
我不确定教程是否遗漏了它,但您还需要使用--propagation private
取消共享的选项,因为默认情况下(即由于 systemd 默认标记/
为“共享”)挂载实际上会跨命名空间传播。