在本文中我们将介绍基础知识:什么是 Linux 命名空间、它们的用途是什么以及如何创建 Linux 命名空间?...所有其它进程都从进程树中这个进程的下面开始。PID 命名空间允许我们用自己的 PID 1 进程分拆出一颗新的进程树。这样做的进程仍然保留在父命名空间的原始进程树中,但会使子进程成为其自身进程树的根。...进程命名空间创建一系列嵌套的子命名空间:一个进程在一个新的 PID 命名空间中启动一个子进程,该子进程又在一个新的 PID 命名空间中产生另一个进程,以此类推。...用户命名空间允许一个进程在命名空间中拥有 root 权限,但不允许进程访问命名空间外的进程。...要创建一个跨两个不同挂载命名空间的 UNIX 套接字,你需要先创建子进程,然后创建 UNIX 套接字,最后将子进程隔离到单独的挂载命名空间中。但是我们怎样才能先创建进程,然后再隔离它呢?
为了开始探究用户命名空间,我们将看一个小例子 demo_userns.c,该程序在新的用户空间中创建了一个子进程。该子进程仅展示其有效用户和组 ID 及 capabilities。...当一个用户命名空间被创建,其内的第一个进程将被赋予该命名空间中的所有权限。这允许该进程在命名空间内的其它进程创建之前,执行该命名空间内任意必需的初始化操作。 第二个有趣的地方是子进程的用户和组 ID。...最后一点是,命名空间可以嵌套;也就是说,每个用户命名空间(最初的用户命名空间除外)都有一个父用户命名空间,并且可以有 0 个或多个子用户命名空间。...(即运行 demo-userns 进程的父用户命名空间)中运行 shell 的终端,并在 demo-userns 创建的新用户命名空间中为子进程创建一个用户 ID 映射: $ ps -C demo_userns...此规则允许用户命名空间中的初始进程(即 clone() 创建的子进程)为自己的用户 ID(组 ID)写映射。
Linux 的命名空间机制提供了以下六种不同的命名空间,包括 pid 命名空间、net 命名空间、ip c命名空间、m n t命名空间、UTS 命名空间、user 命名空间,通过这六个选项我们能在创建新的进程时设置新进程应该在哪些资源上与宿主机器进行隔离...所有的 LXC 进程在 Docker 中的父进程为Docker进程,每个 LXC 进程具有不同的命名空间。同时由于允许嵌套,因此可以很方便的实现嵌套的 Docker 容器。...mnt 命名空间允许不同命名空间的进程看到的文件结构不同,这样每个命名空间 中的进程所看到的文件目录就被隔离开了。...主机上的一个进程 6、user 命名空间(用户) 每个容器可以有不同的用户和组 id, 也就是说可以在容器内用容器内部的用户执行程序而非主机上的用户。...在新的进程中创建隔离的挂载点命名空间需要在 clone 函数中传入 CLONE_NEWNS,这样子进程就能得到父进程挂载点的拷贝,如果不传入这个参数子进程对文件系统的读写都会同步回父进程以及整个主机的文件系统
每个子 PID 命名空间中都有 PID 为 1 的 init 进程,对应父命名空间中的进程,父命名空间对子命名空间运行状态是不隔离的,但是每一个子命名空间是互相隔离的。...实战 创建和管理命名空间 在 Linux 系统中提供了以下几种常用的创建和管理命名空间的 API: clone:使用 clone 系统调用创建一个新进程时可以通过指定一个或多个上面列出的命名空间标志参数来创建新的命名空间...,并且新进程的子进程也会默认被包含在新的命名空间内 unshare:使用 unshare 系统调用将一个已存在的进程放入新的命名空间。...它可以指定一个或多个上面列出的命名空间标志参数,创建具有指定类型的命名空间,并将当前进程或其他指定进程放入其中 setns: 使用 setns 系统调用允许进程将自己放入已经存在的命名空间中,而无需创建新的进程...Hierarchies 允许 Cgroup 在不同的 subsystem 中进行组合和嵌套,形成多层的资源管理结构。系统会默认为每个 subsystem 创建一个默认的 Hierarchy。
最后,就命名空间的使用方式而言,最近在用户命名空间实现方面的变化是一个规则的改变:从 Linux 3.8 开始,没有特权的进程可以创建用户命名空间,并在其内拥有全部特权,从而允许在用户命名空间内创建任何其它类型的命名空间...PID 命名空间还允许每个容器有自己的 init(PID 1),它是“所有进程的祖先”,管理各种系统初始化任务,并在孤儿进程终止时获取它们。...PID 命名空间可以嵌套:一个进程可从其所在的 PID 命名空间开始,一直到根 PID 命名空间,每层命名空间都有一个 PID。...一个进程只能看到(例如,通过 /proc/pid 查看并使用 kill() 发送信号)它自己的 PID 命名空间中包含的进程以及该 PID 命名空间下面嵌套的命名空间。...从 Linux 3.8 开始,无特权的进程可以创建用户命名空间,这为应用程序添加了许多有趣的可能性:因为在其他情况下,无特权的进程可以在用户命名空间中拥有 root 权限,所以无特权的应用程序现在可以访问之前仅限于
全局ID使得内核可以有选择地允许或拒绝某些特权。虽然UID为0的root用户基本上允许做任何事,但其他用户ID则会受到限制。例如UID为n 的用户,不允许杀死属于用户m的进程(m≠ n)。...但这不能防止用户看到彼此,即用户n可以看到另一个用户m也在计算机上活动。通常情况下,只要用户只能操纵他们自己的进程,这就没什么问题,因为没有理由不允许用户看到其他用户的进程。 ...(1) 在用fork或clone系统调用创建新进程时,有特定的选项可以控制是与父进程共享命名空间,还是建立新的命名空间。 ...在进程已经使用上述的两种机制之一从父进程命名空间分离后,从该进程的角度来看,改变全局属性不会传播到父进程命名空间,而父进程的修改也不会传播到子进 程,至少对于简单的量是这样。...这个术语不是描述性的(无法从名字看出要创建哪种命名空间),因为挂载命名空间是第一种命名空间,设计人员没有预料到还有其他命名空间。
终极目标是改进 2 个重要的安全特性: 将容器的root用户映射到本地主机上的非root用户,减轻容器和主机之间因权限提升而引起的安全问题; 允许Docker服务端在非root权限下运行,利用安全可靠的子进程来代理执行需要特权权限的操作...这些子进程将只允许在限定范围内进行操作,例如仅仅负责虚拟网络设定或文件系统管理、配置操作等。...pid命名空间 不同用户的进程就是通过pid命名空间隔离开的,且不同命名空间可以有相同的pid,所有的LXC进程在Docker中的父进程为Docker进程,每个LXC进程具有不同的命名空间,同时由于嵌套...mnt命名空间 类似chroot,将一个进程放到一个特定的目录执行,mnt命名空间允许不同命名空间的进程看到的文件结构不同,这样每个命名空间中的进程所看到的文件目录就被隔离开了,同chroot不同,每个命名空间的容器在...uts命名空间 UTS命名空间允许每个容器拥有独立的hostname和domain name,使其在网络上可以被视作一个独立的节点而非主机上的一个进程.
PID 命名空间展示了子进程的 PID:一个是调用 clone() 的命名空间,另一个是子进程所在的命名空间。...有两种方式可在父 PID 命名空间中,在不影响 /proc 挂载点的情况下达到该目的。第一种,如果一个子进程通过 CLONE_NEWS 标志创建,那么该子进程将在与系统中其余进程位于不同的挂载点中。...嵌套的 PID 命名空间 如前所述,在 PID 命名空间内,可能会看到位于同一命名空间的其他进程,也可以看到后代命名空间中的进程。...该程序在嵌套的 PID 命名空间中递归创建了一系列子进程。命令行参数展示了当运行该程序时,会创建多少个 PID 命名空间: # ....PID(即在最深的嵌套层中执行 sleep() 的进程),在所有可见的命名空间中: # grep -H 'Name:.
在Linux世界中,clone()系统调用通过复制调用进程创建一个新进程。新进程称为子进程,原始进程称为父进程。clone()系统调用有几个选项,允许我们控制父进程和子进程之间资源的共享。...Cloneflags是一个用于指定创建 Linux 命名空间的标志位, 是 Linux 内核中用于进程创建的参数之一,它用于控制新进程如何与父进程共享资源。...CLONE_NEWUSER:使新进程拥有一个新的、独立的用户命名空间,可以隔离用户和组 ID。 CLONE_FILES:使新进程共享打开的文件描述符表,但不共享文件描述符的状态(例如文件偏移量)。...nil { fmt.Println("Failed to create new UTS namespace:", err) return } // 创建新的用户命名空间...如果命名空间创建成功,我们就可以在新的命名空间中运行进程,并且该进程将只能访问新的命名空间中的资源,而不能访问主机上的资源。
另一方面,clone(CLONE_NEWUSER) 可创建一个新用户命名空间,并将创建的子进程放到该用户命名空间。...待会会看到,用户命名空间之间的亲缘关系很重要,因为这定义了一个进程在新的子命名空间的 capabilities。 每个进程都有三组相关的 capabilities:允许的,有效的和可继承的。...首先,在特定用户命名空间中有一个 capability,允许进程操作由该命名空间管理的资源。当我们讨论用户命名空间与其他类型命名空间的交互时,将进一步讨论这一点。...它在新用户命名空间中创建一个子进程,然后父(与启动 userns_setns_test 程序的 shell 在同一用户命名空间)进程和子进程都会试图通过 setns() 加入该命名空间;如上所述,setns...(本系列的前面几篇文章中,我们看到仅仅在父用户命名空间中的特权进程可以创建除了创建该命名空间的进程的有效用户和组 ID 以外的 ID 的映射,因此没有安全漏洞。) 另一方面,子进程不能挂载文件系统。
与KVM、XEN等虚拟化技术不同,所谓操作系统级虚拟化,也被称作容器化,是操作系统自身的一个特性,它允许多个相互隔离的用户空间实例的存在。这些用户空间实例也被称作为容器。...例如,在没有操作系统级虚拟化的Linux系统中,用户态进程从1开始编号(PID)。引入操作系统虚拟化之后,不同容器有着不同的PID命名空间,每个容器中的进程都可以从1开始编号而不产生冲突。...calls) 下面3个系统调用用来操作命名空间: clone() —— 用来创建新的进程及新的命名空间,新的进程会被放到新的命名空间中 unshare() —— 创建新的命名空间但并不创建新的子进程,...之后创建的子进程会被放到新创建的命名空间中去 setns() —— 将进程加入到已经存在的命名空间中 注意:这3个系统调用都不会改变调用进程(calling process)的pid命名空间,而是会影响其子进程的...unshare, 创建了一个新的命名空间, //但不会创建子进程.
CLONE_NEWUSER 和 CLONE_NEWUTS 在新的命名空间中创建一个子空间:clone() 通过 clone() 可创建一个命名空间。...下面,看一下程序的一些关键部分(忽略错误检查代码)。 示例程序中的参数来自于命令行。当程序运行时会创建一个子进程,该子进程在新的 UTS 命名空间中运行。...因为 CLONE_NEWUTS 是 flags 参数的一部分,所以子进程将会运行在新创建的 UTS 命名空间。 然后让主程序睡眠一会。...(用户命名空间除外),需使用特权(尤其是 CAP_SYS_ADMIN)来创建 UTS 命名空间。...如果允许一个非特权用户使用任意主机名在一个 UTS 命名空间中跑应用,会使得应用遭受各种攻击。最简单的,锁文件失效,会导致运行在不同 UTS 命名空间中的应用出错。
用户ID的管理方式类似,即各个用户是通过一个全局唯一的UID号标识。 全局ID使得内核可以有选择地允许或拒绝某些特权。虽然UID为0的root用户基本上允许做任何事,但其他用户ID则会受到限制。...例如UID为n 的用户,不允许杀死属于用户m的进程(m≠ n)。但这不能防止用户看到彼此,即用户n可以看到另一个用户m也在计算机上活动。...只要用户只能操纵他们自己的进程,这就没什么问题,因为没有理由不允许用户看到其他用户的进程。 但有些情况下,这种效果可能是不想要的。...虽然子容器不了解系统中的其他容器,但父容器知道子命名空间的存在,也可以看到其中执行的所有进程。图中子容器的进程映射到父容器中,PID为4到 9。...在进程已经使用上述的两种机制之一从父进程命名空间分离后,从该进程的角度来看,改变全局属性不会传播到父进程命名空间,而父进程的修改也不会传播到子进 程,至少对于简单的量是这样。
Linux Clone函数 之前某一次有过一次面试,问了内核中是怎么创建命名空间的? 下面就来扒一扒clone的精髓,以及如何通过它创建命名空间。...第一个表项定义了最深层嵌套的PID命名空间中的PID,后续的表项包含在相应的祖先PID名称空间中的PID。...set_tid_size定义了PID命名空间的数目,且不能大于当前嵌套的PID命名空间的数目。...保存操作会在clone调用返回控制到子进程的用户空间前完成。...如果设置了CLONE_NEWUSER ,则会在新的用户命名空间中创建进程。如果没有设置该标志,则新创建的进程与调用进程的用户命名空间相同。
具有足够权限的用户可以使用基本的 shell 命令或 libcgroup-tools 提供的高级实用程序轻松创建 cgroup、修改它们或将任务移动到它们的安装包。...默认情况下,Docker 会为这个容器创建一个 pid 命名空间,将进程与其他命名空间隔离开来;Java 进程在执行之前附加到这个新的 pid 命名空间,并由 Linux 内核分配 PID 1。...然而,这个进程并不完全与系统上的其他进程隔离开来。因为 PID 命名空间是嵌套的,所以除了初始根命名空间之外的每个命名空间都有一个父命名空间。...在命名空间中运行的进程可以看到子 pid 命名空间的所有进程。这意味着在根命名空间中运行的进程,例如我们的 shell,可以看到系统上运行的所有进程。...在最小的 CentOS 安装中,我们通常可以忽略系统服务和用户进程的影响。这将允许调度程序向 /docker 组提供与每个容器的份额成比例的几乎所有 CPU 时间。
我们先对这两项技术的作用做个概括: cgroup 的主要作用:管理资源的分配、限制; namespace 的主要作用:封装抽象,限制,隔离,使命名空间内的进程看起来拥有他们自己的全局资源; 本篇,我们重点来聊...唯一允许值为1,当值为1时,会将 cgroup 及其所有子节点中的 cgroup 杀死(进程会被 SIGKILL 杀掉)。...它将 cgroup 命名空间视为委托边界,这是两种委派 cgroup 的方式之一; 3.1.2 cgroup 的委派方式 设置挂载选项 nsdelegate ; 授权用户对目录及其 cgroup.procs...一旦被委派,用户就可以在目录下建立子层次结构,所有的资源分配都受父节点的制约。目前,cgroup 对委托子层次结构中的 cgroup 数量或嵌套深度没有任何限制(之后可能会受到明确限制)。...不保证此列表已排序或没有重复的 TGID,如果需要此属性,用户空间应排序/统一列表。
/ns_child_exec -p sh -c 'echo $$' 1 该命令行会在新 PID 命名空间中创建一个子进程,该子进程会打印 shell 的 PID。...我们(简单得多)的 simple_init 程序提供了一个简单的 shell 工具,允许用户手动执行初始化命名空间所需的任何 shell 命令;还允许我们自由执行 shell 命令,以便在命名空间中进行实验...然而,调用者所创建的子进程会被置于新的命名空间中;第一个子进程会成为命名空间中的 init 进程。...同 unshare(),setns() 也不会将调用者移到 PID 命名空间;但调用者所创建的子进程会被放到一个命名空间中。...关于 PID 命名空间的讨论至此结束;下篇文章中,我们将看一下用户命名空间。
Docker 守护进程 (Daemon)作为服务端接受来自客户端的请求,并处理这些请求(创建、运行、分发容器)。...pid 命名空间 不同用户的进程就是通过 pid 命名空间隔离开的,且不同命名空间中可以有相同 pid。...所有的 LXC 进程在 Docker 中的父进程为 Docker 进程,每个 LXC 进程具有不同的命名空间。同时由于允许嵌套,因此可以很方便的实现嵌套的 Docker 容器。...mnt 命名空间 类似 chroot,将一个进程放到一个特定的目录执行。mnt 命名空间允许不同命名空间的进程看到的文件结构不同,这样每个命名空间 中的进程所看到的文件目录就被隔离开了。...user 命名空间 每个容器可以有不同的用户和组 id, 也就是说可以在容器内用容器内部的用户执行程序而非主机上的用户。
我们先对这两项技术的作用做个概括: cgroup 的主要作用:管理资源的分配、限制; namespace 的主要作用:封装抽象,限制,隔离,使命名空间内的进程看起来拥有他们自己的全局资源; 本篇,我们重点来聊...唯一允许值为1,当值为1时,会将 cgroup 及其所有子节点中的 cgroup 杀死(进程会被 SIGKILL 杀掉)。...它将 cgroup 命名空间视为委托边界,这是两种委派 cgroup 的方式之一; cgroup 的委派方式 设置挂载选项 nsdelegate ; 授权用户对目录及其 cgroup.procs、cgroup.threads...一旦被委派,用户就可以在目录下建立子层次结构,所有的资源分配都受父节点的制约。目前,cgroup 对委托子层次结构中的 cgroup 数量或嵌套深度没有任何限制(之后可能会受到明确限制)。...不保证此列表已排序或没有重复的 TGID,如果需要此属性,用户空间应排序/统一列表。
它们允许Docker创建名为容器的隔离工作区。命名空间确保容器内的进程不能干扰容器外或主机系统上的进程。有几种类型的命名空间,如PID、NET、MNT和USER,每个命名空间负责隔离进程的不同方面。...命名空间命名空间是 Docker 用于提供容器之间隔离的核心技术之一。在本节中,我们将简要讨论命名空间是什么以及它们如何工作。命名空间是什么?...在 Linux 内核中,命名空间是一种功能,允许隔离各种系统资源,使得进程及其子进程能够看到与其他进程分离的系统子集。命名空间有助于创建抽象层,将容器化的进程与彼此和主机系统分开。...User (USER):在容器和主机之间映射用户和组标识符,因此可以为容器内的资源设置不同的权限。IPC (进程间通信):允许或限制不同容器中的进程之间的通信。...Docker 如何使用命名空间Docker 使用命名空间为容器创建隔离的环境。当容器启动时,Docker 会为该容器创建一组新的命名空间。
领取专属 10元无门槛券
手把手带您无忧上云