Linux 命名空间

2020/09/01 操作系统

暂时没那个水平。以下内容摘自《Docker技术入门与实战》。

今天在回顾 Docker 时看到了容器的实质是进程,但与直接在宿主执行的进程不同,容器进程运行于属于自己的独立的命名空间,这里有一个以前自己不理解的知识点,其实也听说过的很多次了,但是之前基础不够,最后不了了之。最近在补基础,于是就想深挖一下。查了下维基百科,到 Linux 5.6 为止,命名空间有以下八种:

  1. Mount (mnt)

    Mount 命名空间用来控制挂载点。MNT 命名空间将进程的根文件系统限制在一个特定的目录下,它允许不同命名空间的进程看到的本地文件位于宿主机中不同的路径下,每个命名空间中进程所看到的文件目录是彼此隔离的。例如,不同命名空间中的进程,都认为自己独占了一个完整的根文件系统(rootfs),但实际上,不同命名空间中的文件彼此隔离,不会造成影响。

  2. Process ID (pid)

    Linux 通过进程命名空间管理进程号,对于同一个进程,在不同的命名空间中,看到的进程号不同。进程命名空间是一个父子关系的结构。新 fork 出的进程,在父命名空间和子命名空间分别对应不同的进程号。

  3. Network (net)

    网络命名空间是网络栈的虚拟化。在创建网络命名空间时只包含 lookback 接口。每一个网络接口(物理或者虚拟)都在一个命名空间中,并可以在命名空间中移动。每一个命名空间都有自己的一系列 IP 地址、路由表、socket 列表、连接跟踪表、防火墙和其它相关的网络资源。当破坏一个网络空间时,就会破坏它其中的所有虚拟接口并且它的所有物理接口都会回到初始化的网络空间中。

  4. Interprocess Communication (ipc)

    IPC 命名空间将进程从 SysV 网络的进程间通信中隔离开。这禁止了进程在不同的 IPC 命名空间中使用。在同一个 IPC 命名空间内的进程可以彼此可见,允许交互;不同 IPC 命名空间的进程无法交互。

  5. UTS (UNIX Time-Sharing)

    UTS 命名空间允许每个容器拥有独立的主机名和域名,从而可以虚拟出一个有独立主机名和网络空间的环境,就跟网络上一台独立主机一样。

  6. User ID (user)

    从内核 3.8 开始,用户命名空间给多个进程提供了权限隔离和用户标识隔离。每个容器可以有不同的用户和组 ID,可以在容器内使用特定的内部用户执行程序,而非本地系统上存在的用户。每个容器都可以有最高权限的 root 账号,但跟宿主主机不在一个命名空间。通过使用隔离的用户命名空间,可以提高安全性,避免容器内的进程获取到额外的权限。

  7. Control group (cgroup) Namespace

    cgroup 是 Linux 内核的一个特性,主要用来对共享资源进行隔离、限制、审计等。只有将分配到容器的资源进行控制,才能避免多个容器同时运行时对宿主机系统的资源竞争。控制组提供如下功能:

    • 资源限制(resource limiting):可将组设置一定的内存限制。
    • 优先级(prioritization):通过优先级让一些组优先得到更多的 CPU 等资源。
    • 资源审计(accounting):用来统计系统实际上把多少资源用到适合的目的上,可以使用 cpuacct 子系统记录某个进程组使用的 CPU 时间。
    • 隔离(isolation):为组隔离命名空间,这样使得一个组不会看到另一个组的进程、网络连接和文件系统。
    • 控制(control):执行挂起、恢复和重启动等操作。
  8. Time Namespace

    跟 UTS 命名空间类似,允许进程查看到不同的系统时间。这是在 2018 年的建议,并且在 Linux 5.6 中实现。

Proposed namespaces: syslog namespace。这个是建议的命名空间,也就是暂未实现。

其实大部分都还挺熟悉的,有没有?我还从中看到了cgroup,这个单词我也是见过很多次了,当然也是只停留在见过的层面上。

Search

    Table of Contents