我想知道 Linux 内核中的“命名空间支持”功能到底是什么意思。我使用的是内核 3.11.1(目前最新的稳定内核)。
如果我决定禁用它,我会注意到我的系统有任何变化吗?
如果有人决定使用命名空间,只NAMESPACES=Y
在内核中编译就足够了,还是还需要用户空间工具?
答案1
简而言之,命名空间提供了一种在更大的 Linux 系统中构建虚拟 Linux 系统的方法。这与运行作为非特权进程运行的虚拟机不同:虚拟机在主机中显示为单个进程,而在命名空间内运行的进程仍然在主机系统上运行。
在较大系统内运行的虚拟系统称为容器。容器的想法是,在容器内运行的进程认为它们是系统中唯一的进程。特别是,容器内的 root 用户在容器外不具有 root 权限(请注意,这仅在足够新的内核版本中才是正确的)。
命名空间一次虚拟一个功能。命名空间类型的一些示例是:
- 用户命名空间——这允许进程的行为就像它们在命名空间内部和外部以不同的用户身份运行一样。特别是,在命名空间内以 UID 0 运行的进程仅对在同一命名空间中运行的进程具有超级用户权限。
从 Linux 内核 3.8 开始,非特权用户可以创建用户命名空间。这允许普通用户使用保留给 root 的功能(例如更改路由表或设置功能)。 - PID命名空间— PID 命名空间内的进程无法杀死或跟踪该命名空间外的进程。
- 挂载命名空间——这允许进程拥有自己的文件系统视图。该视图可以是部分视图,允许隐藏文件系统的某些部分并重新组合某些部分,以便目录树出现在不同的位置。挂载命名空间概括了传统的 Unix 功能chroot,它允许进程被限制到特定的子树。
- 网络命名空间— 允许分离网络资源(网络设备),从而增强进程的隔离。
命名空间依赖于内核来提供命名空间之间的隔离。解决这个问题相当复杂,因此可能仍然存在安全漏洞。安全漏洞的风险将是不启用该功能的主要原因。不启用它的另一个原因是当您为嵌入式设备制作小型内核时。在安装在典型服务器或工作站上的通用内核中,应该启用命名空间,就像任何其他成熟的内核功能一样。
使用命名空间的应用程序仍然很少。以下是一些:
看Michael Kerrisk 的 LWN 文章系列了解更多信息。
答案2
Linux 内核命名空间是一个概念,用于将一组进程与其他进程隔离,以访问系统资源。例如,两个不同的 PID 命名空间可能包含具有相同 PID 但进程映像完全不同的进程。它们通常用于操作系统级虚拟化,其中单个内核同时运行各种操作系统 - 所有操作系统都必须基于 Linux(显然,因为它们共享内核),但可能是不同的发行版和版本。参见示例LXC。
您可能会注意到在基于 systemd 的系统上禁用它,因为 systemd 能够为其使用命名空间容器特性。因此,很大程度上取决于您使用的发行版以及您打算用系统做什么。
与几乎每个内核功能一样,您肯定需要某种用户空间程序 - 即使您通过特殊文件与内核对话(我不确定您可以),依赖专用工具通常是更好的主意,因为它们提供前端友好的API。
答案3
举一个在启用 SELinux(MLS 或 Strict)的系统中命名空间使用的示例。命名空间通常用于为每个用户创建单独的/tmp
和/或目录。/home
这些目录仅对以下用户可见:用户、具有相同标签的用户、内核和具有特权访问权限的用户。命名空间/tmp
目录由 SELinux-MLS 标记,以匹配用户的 SELinux-MLS 标签。在这种情况下/tmp
,用户看到的目录实际上可能安装在/tmp
( /var/user-tmp
) 之外的其他位置。然而,用户只能看到/tmp
由于用户活动而创建的文件。用户永远不会看到/tmp
其他用户创建的任何文件。