systemd-nspawn 与 chroot 和绑定挂载?

systemd-nspawn 与 chroot 和绑定挂载?

是否systemd-nspawn在 a 内部做了特殊处理,chroot或者它只是提供了一种不同的运行方法chroot+ 适合 , 的 ro--bind安装procsys文档说,

与 chroot(1) 类似,但更强大,因为它完全虚拟化文件系统层次结构、进程树、各种 IPC 子系统以及主机和域名

我不确定其中任何一个是如何定义的,

  • 虚拟化文件系统层次结构

    这不就是chroot改变root的作用吗?

  • 以及进程树

    我不确定这意味着什么。

  • 各种IPC子系统

    有哪些子系统?有人能准确地告诉我这意味着什么吗?

  • 主机名和域名

    我也不确定这意味着什么?这不就是/proc/sys/kernel/domainname,而且/proc/sys/kernel/hostname

我用过chrootmount --bind脚本。看起来这更令人信服,但我对任何附加功能都很模糊。这给我带来了什么新的东西?

答案1

  • 虚拟化文件系统层次结构

它使用挂载命名空间。它的功能更强大,chroot因为您可以在命名空间下挂载和卸载文件系统,并且这些文件系统将从外部或其他挂载命名空间中隐藏。

看一眼本文Linux 命名空间(特别是挂载命名空间)上的内容,以概述它们的作用。

  • 以及进程树

这意味着您将在命名空间内获得新的 PID 号。命名空间内的 PID 1 可能是其外部的 PID 12001,其内部的 PID 40 可能是其外部的 PID 13987,依此类推。特别是,并非所有 PID 都映射到命名空间内部,因此,如果您使用诸如ps -ef内部之类的命令,您将只能看到该命名空间中的进程,而看不到来自外部或其他 pid 命名空间的进程。

上面提到的文章还很好地概述了 PID 命名空间。

  • 各种IPC子系统

共享内存、信号量...命令显示的东西ipcs。再说一次,我指出的那篇文章对此有更多内容。 (如果您还没有听说过 SysV IPC 或该ipcs命令,您可能可以忽略这一点。)

  • 主机名和域名

这实际上是 UTS 命名空间,该文章再次提供了更多详细信息。

它虚拟化uname命令返回的内容(您可以查看uname -a容器内部)。此外,hostname还有domainname命令。是的,你提到的两个/proc文件也是如此。

简而言之,这告诉您systemd-nspawn正在使用 Linux 命名空间来为您提供容器隔离。这也是其他容器技术(例如 Docker)所采用的。

答案2

systemd-nspawn 还有一个重要的限制:您在任何时候只能拥有一个实例,而 chroot 允许您多次 chroot 到同一目录。

这意味着,如果您使用 systemd-nspawn “chroot”到某个目录,则在第一个实例退出之前,您无法从另一个 shell 中再次运行它。

相关内容