内核:命名空间支持

Mar*_*ter 15 linux linux-kernel namespace

我想知道 Linux 内核中的“命名空间支持”功能到底是什么意思。我正在使用内核 3.11.1(目前最新的稳定内核)。

如果我决定禁用它,我会注意到我的系统有任何变化吗?

如果有人决定使用命名空间,仅NAMESPACES=Y在内核中编译就足够了,还是他还需要用户空间工具?

Gil*_*il' 22

简而言之,命名空间提供了一种在更大的 Linux 系统中构建虚拟 Linux 系统的方法。这与运行作为非特权进程运行的虚拟机不同:虚拟机在主机中显示为单个进程,而在命名空间内运行的进程仍在主机系统上运行。

在更大的系统中运行的虚拟系统称为容器。容器的概念是运行在容器内的进程认为它们是系统中唯一的进程。特别是,容器内的 root 用户在容器外没有 root 权限(请注意,这仅适用于足够近的内核版本)。

命名空间一次虚拟化一个功能。命名空间类型的一些示例是:

  • 用户命名空间——这允许进程的行为就像它们作为命名空间内外的不同用户运行一样。特别是,在命名空间内以 UID 0 运行的进程仅对在同一命名空间中运行的进程具有超级用户权限。
    从 Linux 内核 3.8 开始,非特权用户可以创建用户命名空间。这允许普通用户使用保留给 root 的功能(例如更改路由表或设置功能)。
  • PID 命名空间——PID 命名空间内的进程不能终止或跟踪该命名空间外的进程。
  • 挂载命名空间——这允许进程拥有自己的文件系统视图。该视图可以是局部视图,允许隐藏文件系统的某些部分并重组部分,以便目录树出现在不同的位置。挂载命名空间概括了传统的 Unix 特性chroot,它允许将进程限制在特定的子树中。
  • 网络命名空间——允许分离网络资源(网络设备),从而增强进程的隔离。

命名空间依赖于内核来提供命名空间之间的隔离。要做到这一点非常复杂,因此可能仍然存在安全漏洞。安全漏洞的风险将是不启用该功能的主要原因。另一个不启用它的原因是当您为嵌入式设备制作小内核时。在安装在典型服务器或工作站上的通用内核中,应该启用命名空间,就像任何其他成熟的内核功能一样。

仍然很少有应用程序使用命名空间。以下是一些:

  • LXC已经很成熟了。它依赖于cgroups来提供容器。
  • virt-sandbox是一个更新的沙盒项目。
  • 最新版本的Chromium还在可用的情况下使用命名空间进行沙盒处理。
  • 用于集群应用程序的uWSGI框架使用命名空间来改进沙箱。

有关更多信息,请参阅Michael Kerrisk 的 LWN 文章系列


pet*_*rph 6

Linux 内核命名空间是用于将一组进程与其他进程在访问系统资源方面隔离的概念。例如,两个不同的 PID 命名空间可能包含具有相同 PID 但进程映像完全不同的进程。它们通常用于操作系统级虚拟化,其中单个内核同时运行各种操作系统——所有操作系统都必须基于 Linux(因为它们显然共享内核),但可能是不同的发行版和版本。参见例如LXC

例如,您可能会注意到在基于 systemd 的系统上禁用它,因为 systemd 能够为其容器功能使用命名空间。因此,很大程度上取决于您使用的是什么发行版以及您打算对系统做什么。

与几乎所有内核功能一样,您肯定需要某种用户空间程序 - 即使您通过特殊文件与内核进行通信(我不确定您是否可以),依赖专用工具通常是更好的主意,因为它们提供最友好的 API。