论文部分内容阅读
摘 要: Linux实现了六种不同类型的名字空间。每个名字空间的目的是将特定的全局系统资源封装在抽象中,使名字空间中的进程拥有全局资源的独立实例。名字空间的总体目标是支持基于容器的轻量级的虚拟化工具,它为一组进程提供了一种错觉,认为它们是操作系统上唯一的进程。
关键词: 名字空间
【中图分类号】 TP393.08 【文献标识码】 A【文章编号】 2236-1879(2018)14-0013-01
1.MNT名字空間
早期的Linux就实现了MNT名字空间,MNT名字空间用于隔离一组进程所看到的文件系统挂载点集。不同MNT名字空间中的进程可以有不同的文件系统层次结构视图。这使得不同的容器拥有不同的文件系统层次结构视图,添加了MNT名字空间后,mount()和umount()系统调用只对调用进程关联的MNT名字空间进行操作【1】,而不是在操作系统上所有进程可见的全局挂载点集合上进行操作。
MNT名字空间的一种用途是创建类似于chroot Jails的环境。但是,与使用chroot()系统调用相比,MNT名字空间是一个更安全和灵活的工具,例如,可以在主从关系中设置单独的MNT名字空间,以便挂载事件自动从一个名字空间传播到另一个名字空间,安装在主名字空间中的硬件设备将会自动出现在其他从名字空间中。这对于多容器之间共享设备提供了可能。
2.UTS名字空间
UTS名字空间隔离了主机名和域名,通过sethostname()和setdomainname()系统调用可以改变主机名和域名。在容器的上下文中,UTS名字空间允许每个容器都有自己的主机名和域名【1】,这对于初始化和配置脚本非常有用,这些脚本针对不同的主机名和域名进行不同的操作。通过主机名和域名的隔离,一台主机中的多个容器在网络上拥有唯一的主机名和域名。
3.IPC名字空间
隔离某些进程间通信(IPC)资源,包括SystemV IPC对象和POSIX消息队列。每个IPC名字空间都有自己的SystemV IPC标识符集和自己的POSIX消息队列。由于IPC对象是文件系统中的特殊文件【1】,无法通过文件系统的路径名称标识,这就意味无法通过MNT名字空间来隔离IPC对象。
4.PID名字空间
PID名字空间隔离进程ID的编号空间。不同PID名字空间中的进程可以具有相同的PID。PID名字空间的主要优点之一是可以在主机之间迁移容器,同时为容器中的进程保留已有的进程ID。显然,容器的跨主机迁移使得容器可以在网络任何位置的任何主机上执行,而不用PID的变换【2】。PID名字空间还允许每个容器都有自己的名字空间。容器中,PID为1的进程是一种特殊进程,它可以fork()出其他的子进程,这些子进程继承了父进程的名字空间,PID为1的进程还管理各种系统初始化任务,并在终止时捕获孤立的子进程,从功能上看,PID为1的进程非常类似于Linux INIT进程【3】,但它在容器中的进程名不一定是INIT。
从PID名字空间的角度来看,每个进程有两个PID:名字空间内的PID和主机系统上初始PID名字空间中的PID。PID名字空间可以嵌套:进程将对层次结构的每个层(通常称为Level)都有一个PID【1】,从其所在的PID名字空间开始到根PID名字空间。一个进程只能看到两类进程,一类是本进程对应的PID名字空间中的进程,另一类是本进程对应的PID名字空间之下的名字空间中的进程。
5.网络名字空间
网络名字空间提供与网络相关的系统资源隔离。因此,每个网络名字空间都有自己的网络设备、IP地址、IP路由表、/proc/net目录、端口号等【1】。
从网络的角度上看,网络名字空间使容器实用化:每个容器可以有自己虚拟的网络设备和自己的应用程序,这些应用程序绑定到每个名字空间中的端口空间;主机系统中可以配置与网络名字空间相关联的路由,这些路由可以将网络数据包转发到与容器相关联的正确的网络设备上。因此,在同一个主机系统上部署多个容器化的Web服务器是可能的,每个服务器都绑定到其容器网络名字空间中的80端口。
6.用户名字空间
用户名字空间隔离用户和组ID编号空间。换句话说,进程的用户和组ID可以在用户名字空间内和外部不同。一个进程可以在用户名字空间之外有一个正常的非特权用户ID,同时在名字空间中却是root用户(用户ID为0)。这意味着该进程对用户名字空间内的操作具有完全的root权限,但对于名字空间外的操作则不具有特权。
非特权进程可以创建用户名字空间,一个本来没有特权的进程可以在用户名字空间内持有root权限【3】,所以非特权应用程序现在可以使用root权限对应的功能。显然潜在的安全问题在未来仍有待发现和修复。
结束语
名字空间的概念已经扩展为通用的框架,用于隔离系统的全局资源。名字空间以容器的形式为一个完整的轻量级虚拟化系统提供了基础。随着原生的轻量级虚拟化系统将逐步取代重量级的虚拟机,Linux名字空间将会发挥更大的作用。
参考文献
[1] 《深入Linux内核架构》 郭旭译 人民邮电出版社 2010年6月第一版
[2] 《Docker容器与容器云》 浙江大学SEL实验室 人民邮电出版社 2016年10月第二版
[3] 《Docker进阶与实战》 华为Docker实践小组 机械工业出版社 2016年7月第一版
关键词: 名字空间
【中图分类号】 TP393.08 【文献标识码】 A【文章编号】 2236-1879(2018)14-0013-01
1.MNT名字空間
早期的Linux就实现了MNT名字空间,MNT名字空间用于隔离一组进程所看到的文件系统挂载点集。不同MNT名字空间中的进程可以有不同的文件系统层次结构视图。这使得不同的容器拥有不同的文件系统层次结构视图,添加了MNT名字空间后,mount()和umount()系统调用只对调用进程关联的MNT名字空间进行操作【1】,而不是在操作系统上所有进程可见的全局挂载点集合上进行操作。
MNT名字空间的一种用途是创建类似于chroot Jails的环境。但是,与使用chroot()系统调用相比,MNT名字空间是一个更安全和灵活的工具,例如,可以在主从关系中设置单独的MNT名字空间,以便挂载事件自动从一个名字空间传播到另一个名字空间,安装在主名字空间中的硬件设备将会自动出现在其他从名字空间中。这对于多容器之间共享设备提供了可能。
2.UTS名字空间
UTS名字空间隔离了主机名和域名,通过sethostname()和setdomainname()系统调用可以改变主机名和域名。在容器的上下文中,UTS名字空间允许每个容器都有自己的主机名和域名【1】,这对于初始化和配置脚本非常有用,这些脚本针对不同的主机名和域名进行不同的操作。通过主机名和域名的隔离,一台主机中的多个容器在网络上拥有唯一的主机名和域名。
3.IPC名字空间
隔离某些进程间通信(IPC)资源,包括SystemV IPC对象和POSIX消息队列。每个IPC名字空间都有自己的SystemV IPC标识符集和自己的POSIX消息队列。由于IPC对象是文件系统中的特殊文件【1】,无法通过文件系统的路径名称标识,这就意味无法通过MNT名字空间来隔离IPC对象。
4.PID名字空间
PID名字空间隔离进程ID的编号空间。不同PID名字空间中的进程可以具有相同的PID。PID名字空间的主要优点之一是可以在主机之间迁移容器,同时为容器中的进程保留已有的进程ID。显然,容器的跨主机迁移使得容器可以在网络任何位置的任何主机上执行,而不用PID的变换【2】。PID名字空间还允许每个容器都有自己的名字空间。容器中,PID为1的进程是一种特殊进程,它可以fork()出其他的子进程,这些子进程继承了父进程的名字空间,PID为1的进程还管理各种系统初始化任务,并在终止时捕获孤立的子进程,从功能上看,PID为1的进程非常类似于Linux INIT进程【3】,但它在容器中的进程名不一定是INIT。
从PID名字空间的角度来看,每个进程有两个PID:名字空间内的PID和主机系统上初始PID名字空间中的PID。PID名字空间可以嵌套:进程将对层次结构的每个层(通常称为Level)都有一个PID【1】,从其所在的PID名字空间开始到根PID名字空间。一个进程只能看到两类进程,一类是本进程对应的PID名字空间中的进程,另一类是本进程对应的PID名字空间之下的名字空间中的进程。
5.网络名字空间
网络名字空间提供与网络相关的系统资源隔离。因此,每个网络名字空间都有自己的网络设备、IP地址、IP路由表、/proc/net目录、端口号等【1】。
从网络的角度上看,网络名字空间使容器实用化:每个容器可以有自己虚拟的网络设备和自己的应用程序,这些应用程序绑定到每个名字空间中的端口空间;主机系统中可以配置与网络名字空间相关联的路由,这些路由可以将网络数据包转发到与容器相关联的正确的网络设备上。因此,在同一个主机系统上部署多个容器化的Web服务器是可能的,每个服务器都绑定到其容器网络名字空间中的80端口。
6.用户名字空间
用户名字空间隔离用户和组ID编号空间。换句话说,进程的用户和组ID可以在用户名字空间内和外部不同。一个进程可以在用户名字空间之外有一个正常的非特权用户ID,同时在名字空间中却是root用户(用户ID为0)。这意味着该进程对用户名字空间内的操作具有完全的root权限,但对于名字空间外的操作则不具有特权。
非特权进程可以创建用户名字空间,一个本来没有特权的进程可以在用户名字空间内持有root权限【3】,所以非特权应用程序现在可以使用root权限对应的功能。显然潜在的安全问题在未来仍有待发现和修复。
结束语
名字空间的概念已经扩展为通用的框架,用于隔离系统的全局资源。名字空间以容器的形式为一个完整的轻量级虚拟化系统提供了基础。随着原生的轻量级虚拟化系统将逐步取代重量级的虚拟机,Linux名字空间将会发挥更大的作用。
参考文献
[1] 《深入Linux内核架构》 郭旭译 人民邮电出版社 2010年6月第一版
[2] 《Docker容器与容器云》 浙江大学SEL实验室 人民邮电出版社 2016年10月第二版
[3] 《Docker进阶与实战》 华为Docker实践小组 机械工业出版社 2016年7月第一版