是否systemd-nspawn
在 a 内部做了特殊处理,chroot
或者它只是提供了一种不同的运行方法chroot
+ 适合 , 的 ro--bind
安装proc
。sys
这文档说,
与 chroot(1) 类似,但更强大,因为它完全虚拟化文件系统层次结构、进程树、各种 IPC 子系统以及主机和域名
我不确定其中任何一个是如何定义的,
虚拟化文件系统层次结构
这不就是
chroot
改变root的作用吗?以及进程树
我不确定这意味着什么。
各种IPC子系统
有哪些子系统?有人能准确地告诉我这意味着什么吗?
主机名和域名
我也不确定这意味着什么?这不就是
/proc/sys/kernel/domainname
,而且/proc/sys/kernel/hostname
我用过chroot
和mount --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 中再次运行它。