Solaris Containers 简介
Solaris Containers是Solaris平台上的一种基于容器的虚拟化技术。Solaris容器的正式定义是使用资源管理功能的Solaris区域(Solaris Zones)。因此,Solaris Containers的实现包括两部分:Solaris Zones和System Resource Controls。
Solaris Zones是作为一个服务器整合解决方案出现的。服务器整合允许在一台服务器上部署多个应用负载,可以提高服务器使用率,降低成本。Solaris Zones将一个系统划分为一个global zone和多个non-global zone,系统管理员通过global zone管理其他non-global zone,在non-global zones部署应用。这些zone彼此隔离,保证服务器整合后应用之间不会相互影响。
global zone就是一个经典的Unix用户环境,是系统默认的zone,一直存在。如果没有non-global zone被创建,系统中的所有的进程都在其中运行。global zone的管理员也是系统管理员,具有最高管理权限,可以控制所有的non-global zone。
Solaris Zones实现了命名空间隔离和安全访问控制。在non-global zone中的进程既不能看见该zone之外的进程,也不能与之通信。每个zone都有自己的逻辑网络接口,non-global zone中的应用只能使用该zone的网络资源,不能获取其他zone的网络信息。每个zone都有自己的文件系统层次,不同zone之间不能相互访问。当启动Zone时,内核会创建zsched进程,模拟了Unix经典的0号进程,从Zone内来看,zsched就是进程树的根。zsched创建init进程,并将其和Zone关联起来,init进程再初始化其他需要启动的服务,使得一个Zone就像一个独立的系统一样。
System Resource Controls实现了资源管理管理功能。Solaris Containers正是System Resource Controls和Solaris Zones结合的产物。Solaris Zones实现了命名空间的隔离,System Resource Controls则为Zone提供资源管理功能。System Resource Controls保证每个Zone能获得合适的系统资源,使得Zone中的进程不会出现饥饿(starve)的情况。System Resource Controls有三种形式:entitlements、limits、partitions。entitlements为Zone提供了最低服务水平的保证,limits定义了Zone能使用的资源边界,partitions允许将物理资源互斥地分配给Zone。这三种形式都可以应用到Zone上。其中resource partitioning是通过一种叫resource pool的机制实现,resource pool允许管理员将物理资源互斥地分配给一组进程。Zone可以绑定到resource pool,使得Zone中的进程只能使用该resource pool中的资源。跟其他两种形式相比,resource partition为Zone提供了一种彻底的资源隔离方案,Zone中的进程只能看到并使用该Zone绑定的pool中的资源。一个Zone之内的进程完全不会影响到其他Zone中的进程。
Solaris Zones的实现通过对Solaris内核各子系统做适当的虚拟化处理实现,主要包括以下方面[5]
(一)进程模型
Zones设计一项基本原则就是non-global Zone内的进程不能影响到其他Zone中的进程。进程的可见性也要做相应的扩展,non-global Zone 外的进程对该Zone内的进程应该是不可见的。要实现这些原则,一方面要限制通过/proc文件系统暴露的进程ID,另一面要对进程相关的系统调用做相应的修改。当调用进程在non-global Zone内时,进程只能看到或影响到该Zone内的进程,如果是其他Zone内的进程,进程会获得一个该进程不存在的错误信息。
(二)IPC机制
由于不同的Zone有彼此隔离的文件系统,一个Zone内的进程不能访问其他Zone的文件系统,利用文件系统作为媒介的IPC机制对于不同Zone内的进程是不可行的。使用System V IPC 机制通信也被做了相应的处理,以适应Zone。进程要通过System V IPC 机制通信,必须要创建相应的objects,而每个object都关联了一个Zone ID,non-global Zone中的进程只能访问有着相同Zone ID的object,因此不同Zone的进程也不能通过这种方式通信。
(三)网络
每个Zone都被配置了一个或多个IP地址,每分配一个IP地址,系统都在global Zone中创建一个逻辑网络接口。在系统内部,IP协议栈按Zone进行划分,就像不同的服务器一样。IP地址和其关联的逻辑网络接口都被分配到特定Zone上,只有Zone内的进程可以使用该IP地址和逻辑网络接口。根据配置,不同的逻辑网络接口可能使用同一个物理网络设备。不同Zone内的进程可以像不同的服务器上的进程一样进行网络通信。
(四)文件系统
每个Zone都以系统文件系统的某个目录作为根目录,这跟chroot机制有点类似,却避免chroot的安全漏洞,使得不能从Zone中逃脱。当Zone启动时,系统会根据配置为Zone挂载一系列的文件系统,包括storage-backed文件系统或伪文件系统。其中可以使用Solaris Loop back Filesystem将文件系统的某一部分挂载到同一命名空间内的其他位置,来节省存储空间。
更多介绍请参见oracle官方文档:http://docs.oracle.com/cd/E19044-01/sol.containers/817-1592/