浅谈Linux中的命名空间和控制组
一、命名空间Namespace
广义上说,命名空间是用来组织和重用代码的,为了解决不同库中函数或变量命名相同而引起的使用冲突问题。
namespace,命名空间,从名字上看,应该是类似于包含许多名字的空间,
打个比方,三年一班的小明和三年二班的小明, 虽说他们名字是一样的,但是所在班级不一样,那么,就可以通过班级+姓名来区分。
对于学校来说,每个班级就相当于是一个命名空间,这个空间的名称就是班级号。
1.Linux Namespace
Linux Namespace机制是一种轻量级的虚拟化形式,更加精细的资源分配管理机制,提供一种资源隔离方案,也即是用来隔离内核资源的方式。
在Namespace中,PID,IPC,Network等系统资源不再是全局性的,而是属于某个特定的Namespace。每个Namespace下的资源对于其他Namespace下的资源都是透明,不可见的。因此在操作系统层面上看,就可能出现多个相同pid的进程,因为属于不同的Namespace,所以它们之间并不冲突。而在用户层面上只能看到属于用户自己Namespace下的资源,例如使用ps命令只能列出自己Namespace下的进程。这样每个Namespace看上去就像一个单独的Linux系统。
目前,Linux内核里面实现了7种不同类型的namespace。
名称 宏定义 隔离内容
IPC CLONE_NEWIPC System V IPC, POSIX message queues (since Linux 2.6.19)
Network CLONE_NEWNET Network devices, stacks, ports, etc. (since Linux 2.6.24)
Mount CLONE_NEWNS Mount points (since Linux 2.4.19)
PID CLONE_NEWPID Process IDs (since Linux 2.6.24)
User CLONE_NEWUSER User and group IDs (started in Linux 2.6.23 and completed in Linux3.8)
UTS CLONE_NEWUTS Hostname and NIS domain name (since Linux 2.6.19)
Cgroup CLONE_NEWCGROUP Cgroup root directory (since Linux 4.6),目前还未被docker采用
不同类型的命名空间的作用:
IPC:用于隔离进程间通讯所需的资源,PID命名空间和IPC命名空间可以组合起来用,同一个IPC名字空间内的进程可以彼
此看见,允许进行交互,不同空间进程无法交互;
Network:为进程提供了一个完全独立的网络协议栈的视图。包括网络设备接口,IPv4和IPv6协议栈,IP路由表,防火墙规
则,sockets等等。一个Network Namespace提供了一份独立的网络环境,就跟一个独立的系统一样;
Mount:每个进程都存在于一个mount Namespace里面,mount Namespace为进程提供了一个文件层次视图。如果不设定这
个flag,子进程和父进程将共享一个mount Namespace,其后子进程调用mount或umount将会影响到所有该Namespace内的
进程。如果子进程在一个独立的mount Namespace里面,就可以调用mount或umount建立一份新的文件层次视图;
PID::linux通过命名空间管理进程号,同一个进程,在不同的命名空间进程号不同!进程命名空间是一个父子结构,子空
间对于父空间可见;
User:用于隔离用户;
UTS:用于隔离主机名;
/proc/[pid]/ns 目录下会包含进程所属的 namespace 信息,可以使用 ll /proc/$$/ns 命令查看当前进程所属namespace信息
2.相关的API
与命名空间相关的API主要有三个:clone,setns和unshare,这三个API都是针对一个进程来操作的。
clone方法会创建一个新的子进程,然后让子进程加入新的namespace,而当前进程保持不变;
setns方法用于将当前进程加入到已有的namespace中;
unshare方法使当前进程退出指定类型的namespace,并加入到新创建的namespace(相当于创建并加入新的namespace);
3.总结
Namespace的本质就是把原来所有进程全局共享的资源拆分成了很多个一组一组进程共享的资源;
当一个Namespace里面的所有进程都退出时,namespace也会被销毁,所以抛开进程谈namespace没有意义。
Linux Namespace机制为实现基于容器的虚拟化技术提供了很好的基础,LXC(Linux containers)就是利用这一特性实现了资源的隔离。
不同Container内的进程属于不同的Namespace,彼此透明,互不干扰。
二、控制组Cgroup
cgroup 和 namespace 类似,也是将进程进行分组,但它的目的和 namespace 不一样,namespace 是为了隔离进程组之间的资源,而 cgroup 是为了对一组进程进行统一的资源监控和限制。
Linux CGroup 全称Linux Control Group, 是Linux内核的一个功能,用来限制,控制与分离一个进程组群的资源(如CPU、内存、磁盘输入输出等)。
Linux CGroup 可让您为系统中所运行任务(进程)的用户定义组群分配资源 — 比如 CPU 时间、系统内存、网络带宽或者这些资源的组合。您可以监控您配置的 cgroup,拒绝 cgroup 访问某些资源,甚至在运行的系统中动态配置您的 cgroup。
主要功能:
限制资源使用,比如内存使用上限以及文件系统的缓存限制。
优先级控制,CPU利用和磁盘IO吞吐。
一些审计或一些统计,主要目的是为了计费。
挂起进程,恢复执行进程。
综上:
linux namespace是一种资源分配管理机制,用来实现隔离内核资源的机制或方案
PID 网络等资源专属于该namespace,各namespace之间互不可见
相当于一个单独的linux系统,本质是全局共享资源的拆分
为基于容器的虚拟化技术提供了基础
7种类型及代表隔离的是什么
cgroup也是将进程进行分组,但是为了对一组进程进行统一的资源监控和限制
我们可以通过cgroup对分组内的进程进行资源使用限制,如CPU、内存、网络带宽等
一句话总结:namespace是用来隔离内核资源,而cgroup是对资源使用进行限制和监控。