创建挂载命名空间并隔离挂载点 redhat

创建挂载命名空间并隔离挂载点 redhat

尝试掌握所有命名空间,并遵循此文档https://www.redhat.com/sysadmin/mount-namespaces,在这里一切都很好,直到我到达创建我们的挂载命名空间部分并且迷失了。

  1. 首先命令

    findmnt |grep mapper
    

    就我而言,什么也没有返回。

  2. 其次,我不明白为什么我们尝试将文件夹本身作为挂载点mount --bind ${CONTAINER_ROOT_FOLDER}/fakeroot ${CONTAINER_ROOT_FOLDER}/fakeroot

  3. 第三,我无法使 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 默认标记/为“共享”)挂载实际上会跨命名空间传播。

相关内容