
Linux的命名空间模式提供了一种资源隔离的解决方案。PID,IPC,Network等平台资源不再是全局性的linux 命名空间,而是属于特定的Namespace。Linux Namespace机制为推动基于容器的虚拟化技术提供了很高的基础linux 命名空间,LXC(Linux containers)就是利用这一特点实现了资源的隔离。不同Container内的进程属于不同的Namespace,彼此透明,互不干扰。
Namespace是对全局系统资源的一种封装隔离,使得进入不同namespace的进程拥有独立的全局系统资源,改变一个namespace中的平台资源只会制约当前namespace里的进程,对其它namespace中的进程没有影响。

linux_namespace.PNG
目前,Linux内核里面实现了7种不同类型的namespace。
名称 宏定义 隔离内容
Cgroup CLONE_NEWCGROUP Cgroup root directory (since Linux 4.6)
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 Linux 3.8)
UTS CLONE_NEWUTS Hostname and NIS domain name (since Linux 2.6.19)

下面详细介绍一个以上不同类型的命名空间的作用:
与命名空间相关的API主要有三个:clone,setns和unshare,这三个API都是针对一个进程来操作的。
clone方法会构建一个新的子进程,然后让子进程加入新的namespace,而当前进程保持不变。

int clone(int (*child_func)(void *), void *child_stac, int flags, void *arg);
这儿的flag用于指明将要创建的新的namespace的类别。 关于clone的详细举例请参考文章:
setns方法用于将当前进程加入至已有的namespace中。

int setns(int fd, int nstype);
fd:
指向/proc/[pid]/ns/目录里相应namespace对应的文件,
表示要加入哪个namespace
nstype:
指定namespace的类型(上面的任意一个CLONE_NEW*):
1. 如果当前进程不能根据fd得到它的类型,如fd由其他进程创建,
并通过UNIX domain socket传给当前进程,
那么就需要通过nstype来指定fd指向的namespace的类型
2. 如果进程能根据fd得到namespace类型,比如这个fd是由当前进程打开的,
那么nstype设置为0即可
unshare方法让当前进程退出指定类别的namespace,并加入至新组建的namespace(相当于创建并加入新的namespace)
int unshare(int flags);
flags:
指定一个或者多个namespace的类型
关于unshare的详细举例请参考:
米鼠网是一家专注于硬件开发、软件外包的高新技术企业,致力于为用户提供全方位的IT服务和行业解决方案,在硬件研发方面有丰富经验,更有的项目主管带队保证工程进度,可对项目进行远程异地多点进行掌控,做软件就上米鼠网!
本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/jisuanjixue/article-142255-1.html
中国几十年前就打过3--4次好不好
打
大总裁咩