分类:
2009-08-21 13:52:43
Solaris Container以前的名字叫N1网格容器,允许一个Solaris系统内划分多个分区,每个分别独立运行 Solaris实例,这样的Solaris实例可多达8000个. 和硬件分区不同,Solaris Containor则是纯粹的软件实现。 在一个机器上划分的多个分区的Solaris系统,彼此相互隔离,就好像同时拥有多个机器一样,企业可藉此省下可观的硬件 建置及管理成本, 使硬件得到最有效的利用。
简介
Solaris Container and Zone 概念
Zone daemon
Zone file system
Zone network
Zone status
配置Zone
在Zone中配置资源池
资源
Solaris Container是由Resource Manager 和 Zone共同构成。
Resource Manager可以让客户在应用中合理地分配系统的资源,比如说CPU的使用时间,监控系统资源的利用率,必要时可以调整系统资源的分配。
同时,Solaris Container可在同一部机器上包含多达8000个Solaris实例,这样的Solaris 实例叫做Zone.每个独立的Zone拥有独立进程虚拟空间、资源分配、用户. Zone的理想环境,把一些复杂的应用整合在单一Zone里面,令到应用的管理和复杂性,都大大减小。
在充分利用服务器方面,在市场上有很多办法. 用户可以选择三种解决方案服务器合并:
Domains and Partitions -- 这些都是基于硬件的解决方案合并. 这些领域包括IBM LPARs等等。
Virtual Machines -- 基于应用层的解决方案合并,包括IBM VM、VMware.
Operating System Partitions -- 操作系统间隔,这是操作系统级别的解决方案. 其中包括FreeBSD Jails 和 Linux Vservers.
Solaris Zone是第三种基于操作系统级别的解决方案。
Solaris Zone提供虚拟操作系统,就像有不同用户和应用的多个独立的Solaris实例.
Solaris Zone有Global Zone和 Non-global Zone之分,Non-global zone 是由 Global Zone负责建立和管理,每个Solaris Non-global Zone都有自己的root用户的密码和其他用户的资料,可以有自己文件系统空间,网络资源,以及只能看见自己的Zone里面的进程,这样的一种分离制度令到操作系统环境更为安全。通过这种方式,以前需要运行在多部机器上的分布式应用或着是其他的多个应用现在就可以直接运行在同一部机器,不同的Solaris实例中。
每一台服务器上如果运行Solaris 10, 都必须有一个Global Zone, Global Zone 包含两个功能:一,它是系统默认的Zone, 也就是当Solaris 10刚刚建立在服务器上,默认就有和使用的Solaris实例;二,它负责全局资源的分配以及配置,安装,管理和卸载Non-global Zone。只有Global Zone是由硬件直接启动,而其他的Non-global Zone是由Global Zone负责启动。Global Zone提供了一个包含所有硬件组件的完整的数据库,另外在这个数据库中,同时还包含了某些特定给Global Zone使用的信息,比如说Global Zone的主机名和文件系统表,而Global Zone是唯一一个可以看到所有设备和文件系统的Zone.
每一个Zone, 包括Global Zone, 都有自己的名字和唯一的数字,这个是Zone ID,Global Zone通常使用Global的名字,而Non-Global Zone可以由用户自行定义。当Zone启动时,系统会自动派发一个唯一的数字Zone ID给Zone, Global Zone通常是0,而Non-global Zone通常是非零的数值,但这些数值可以在你启动Non-global Zone时改变。
Non-global Zone可以包含从Global Zone里面分享出来的Package, 同时,它也可以有自己独立的不是通过Package方式安装的附加的软件, 如果是在Global Zone里面对Non-global Zone里面进行 Package 安装的话,则在Global Zone里面就必须要同时拥有这个Package。如果在Non-global Zone里面进行安装的话,是可以做到Package只在Non-global Zone里面存在的,只需要在Non-global Zone环境里面用 ”pkgadd –G” 命令来加Package。 Non-global Zone和Global Zone是共同分享一个Solaris内核的,但Non-global Zone彼此之间不会知道互相的存在,在一个Non-global Zone里面是不可以对另一个Non-global Zone进行删除,关机,启动等操作的。
Solaris 10 用两个daemon来对Zone进行操作:一是zoneadmd, 另外一个是zsched.
Zoneadmd是主要的对zone进行监管的进程,它运行在Global Zone里面,对每一个Non-global Zone进行监控,包括运行状态,启动,关机等等。
当Non-global Zone启动后,系统会有相应的zoneadmd这样的进程,除非系统原来已经在运行zoneadmd。
而每一个活动的Non-global Zone里面都有一个相关的zsched内核进程,它主要是用来跟踪Non-global Zone里面的内核线程的活动的。
Solaris 10中采用两种通用方式实现Non-global Zone的根文件系统,一种是Sparse Root Model, 另一种是Whole Root Model.
Sparse Root Model是Non-global Zone的最小化的文件安装模式,在这种模式下,只有部分的Root Package会安装到Non-global Zone里面,当然,这里包括了让系统启动所必须的Package, 其他的Package是否安装可以由系统管理员自行确定,部分的文件系统以只读共享的模式并存在Global Zone和Non-global Zone里面,比如说/lib, /platform, /sbin, /usr. 在这种模式下,如果一个关键的文件在Non-global Zone里面被删除,那么只有这个Non-global Zone被影响,但是,如果这个关键文件是从Global Zone里面被删除,而导致Global Zone的操作系统失败的话,那么每个Non-global Zone的操作系统也会失败,不过还有第三种情况,如果Global Zone在删除文件后操作系统依然正常,而且Non-global Zone操作系统也不需要这个文件的话,Non-global Zone也能同时健在。
Whole Root Model是Non-global Zone的最大化的文件安装模式,在这种模式下,所有Solaris Packages都安装到Non-global Zone下,一但安装完,它们不会受到Global Zone影响,而文件系统也是在Non-global Zone里面完全独立拥有,这样做的好处是可以让用户更自由地定义自己的文件系统,具有更好地独立性。
我们说每个Solaris 10的Non-global Zone在外界看来都是一台独立的服务器,那么自然每一个Solaris 10的Non-global Zone都有自己独立的逻辑IP地址。那么,如果一台机器上它本来具备多张物理网卡的话,我们就可以把每张物理网卡单独地分配给每个Non-global Zone里面,这样是比较方便容易的,但是如果当机器上只有一张物理网卡,我们是否又可以做到分配不同的逻辑IP地址给不同的Non-global Zone呢?答案是肯定的,比如说你的机器上只有一张物理网卡, 它在Global Zone里面是ce0, 那么当你建立Non-global Zone时启动逻辑IP地址时,系统可以自动为你分配ce0:1给这个Non-global Zone, 然后启动相应逻辑IP地址,而当你建立其他的Non-global Zone时,系统又可以为你建立ce0:2, ce0:3 。。。以此类推下去,那么,你的多个Non-global Zone就可以拥有不同的逻辑IP地址,只不过它们所有的物理网络traffic都是发生在同一张物理网卡上。
你可以用zonecfg配置Non-global zone在启动时自动plumb网卡和启动逻辑IP地址,如果你不想这样做的话,你可以选择用ifconfig命令在Non-global zone运行时启动或改动逻辑IP地址。
你可以用zoneadm来查看每个zone的状态,这里要注意的是,Non-global基本上和Global Zone的行为是一致的,但它们没有power-on self-test (POST)和OpenBoot Programmable Read-Only Memory (OBP),这个我想应该也是Non-global Zone启动时非常快速的其中一个原因吧。
那么用zoneadm可以打印出zone的哪些状态呢,它们包括:
Undefined – 当Non-global Zone的配置还没有完成或者还没放置到数据库时的状态。
Configured – Non-global Zone配置完成并且放置到数据库中
Incomplete -- Non-global Zone 过渡状态,在安装或卸载进行状态中。
Installed -- Non-global Zone安装完毕。
Ready – Non-global Zone可以随时被启动,zsched进程被启动,网卡已经被plumb, 文件系统被Mount上。
Running – Non-global Zone 正在正常运行,相应的Non-global Zone里面的进程都已经被启动。
Shutting down and Down – Non-global Zone 正在关机和呈现关机状态。
当你决定要建立Non-global Zone更好地利用硬件资源时,你应该详细地制作计划和考虑所有涉及的因素和部件,它们包括:
Non-global Zone的名字
Non-global Zone的安装路径
Non-global Zone 的网络资源
Non-global Zone 的文件系统
Non-global Zone 的硬件设备
名字,安装路径,网络都是比较好解决的,系统硬件资源的合理分布我们稍后讨论,我们来看看文件系统,通常地,如果我们采用sparse root model模式安装的话,大概需要100MB的空闲的文件系统空间来安装标准的Solaris Package, 在默认情况下,所有在Global Zone里面有的Package都会安装到Non-global Zone里面,所以文件系统空间需要加大,当然,你可以通过制定Inherit-pkg-dir来指定安装的Package.
好,知道这些后,我们来开始建立Non-global Zone,以下是做好的一个例子, 基本上建立Non-global Zone都需要使用Global Zone root用户的权限:
A)首先我们要用zonecfg命令来配置Non-global Zone, zonecfg是一个交互式的命令,我们在Solaris操作系统中的终端开始操作。
当你决定要建立Non-global Zone更好地利用硬件资源时,你应该详细地制作计划和考虑所有涉及的因素和部件,它们包括:
Non-global Zone的名字
Non-global Zone的安装路径
Non-global Zone 的网络资源
Non-global Zone 的文件系统
Non-global Zone 的硬件设备
名字,安装路径,网络都是比较好解决的,系统硬件资源的合理分布我们稍后讨论,我们来看看文件系统,通常地,如果我们采用sparse root model模式安装的话,大概需要100MB的空闲的文件系统空间来安装标准的Solaris Package, 在默认情况下,所有在Global Zone里面有的Package都会安装到Non-global Zone里面,所以文件系统空间需要加大,当然,你可以通过制定Inherit-pkg-dir来指定安装的Package.
好,知道这些后,我们来开始建立Non-global Zone,以下是做好的一个例子, 基本上建立Non-global Zone都需要使用Global Zone root用户的权限:
A)首先我们要用zonecfg命令来配置Non-global Zone, zonecfg是一个交互式的命令,我们在Solaris操作系统中的终端开始操作。
bash-3.00# zonecfg -z test-zone
(注释:我们希望建立一个名为test-zone的Non-global Zone,得到下面的显示)
test-zone: 没有配置此类区域
使用 'create' 开始配置新区域。
zonecfg:test-zone> create
zonecfg:test-zone> set zonepath=/export/home/test-zone(注释:这个test-zone是建立在Global Zone的/export/hom/test-zone目录下)
zonecfg:test-zone> set autoboot=true(注释:当硬件平台重新启动时一起test-zone一起启动)
zonecfg:test-zone> set pool=pool_default(注释:指定默认的资源池分配给test-zone, 启动时自动绑定给test-zone, 当然你可以自己制定合理的资源池,这个稍后讨论)
(注释:结束文件系统配置)
zonecfg:test-zone> add inherit-pkg-dir
(注释:开始配置直接从Global Zone上继承mount上来的文件系统,这些文件系统在Non-global Zone里面都是只读的)
zonecfg:test-zone:inherit-pkg-dir> set dir=/opt/sun
(注释:设定/opt/sun直接从Global Zone继承取得使用, /opt/sun 是Golbal Zone已安装package的目录)
zonecfg:test-zone:inherit-pkg-dir> end
(注释:结束inherit-pkg-dir配置)
zonecfg:test-zone> add net
(注释:开始配置网络)
zonecfg:test-zone:net> set physical=bge0
(注释:设定