分类:
2008-09-02 16:58:26
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 and Zone 概念
Solaris Container是由Resource Manager 和 Zone共同构成。
什么是Resource Manager?
Resource Manager可以让客户在应用中合理地分配系统的资源,比如说CPU的使用时间,监控系统资源的利用率,必要时可以调整系统资源的分配。
什么是Zone?
同时,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实例中。
Global Zone和Non-global Zone的对比
每一台服务器上如果运行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进行删除,关机,启动等操作的。
Zone daemon
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里面的内核线程的活动的。
Zone File System
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里面完全独立拥有,这样做的好处是可以让用户更自由地定义自己的文件系统,具有更好地独立性。
Zone networking
我们说每个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地址。
Zone status
你可以用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 的文件系统
Non-global Zone 的硬件设备
名字,安装路径,网络都是比较好解决的,系统硬件资源的合理分布我们稍后讨论,我们来看看文件系统,通常地,如果我们采用sparse root model模式安装的话,大概需要100MB的空闲的文件系统空间来安装标准的Solaris Package, 在默认情况下,所有在Global Zone里面有的Package都会安装到Non-global Zone里面,所以文件系统空间需要加大,当然,你可以通过制定Inherit-pkg-dir来指定安装的Package.
二,安装sparse
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
(注释:设定test-zone使用的物理网卡)
zonecfg:test-zone:net> set address=129.158.163.232
(注释:设定test-zone IP地址)
zonecfg:test-zone:net> end
(注释:结束网络配置)
zonecfg:test-zone> verify
(注释:验证配置正确性)
zonecfg:test-zone> commit
(注释:提交test-zone配置)
zonecfg:test-zone> exit
(注释:退出配置)
现在test-zone已经配置好,可以下一步进行安装和使用.
你可以使用zonecfg来查看和检验你刚刚设好的test-zone的配置:
bash-3.00# zonecfg -z test-zone info
将会得到下面的信息:
zonepath: /export/home/test-zone
autoboot: true
pool: pool_default
inherit-pkg-dir:
dir: /lib
inherit-pkg-dir:
dir: /platform
inherit-pkg-dir:
dir: /sbin
inherit-pkg-dir:
dir: /usr
inherit-pkg-dir:
dir: /opt/sun
net:
address: 129.158.163.233
physical: bge0
这里大家可能会奇怪为什么我们没有选择/lib, /platform, /sbin, /usr这些目录,但却在test-zone里面包含了这些目录,对,因为在安装Non-global Zone的时候,默认是会有/lib, /platform, /sbin, /usr这些目录的安装,所以你看到新装的test-zone里面是带有这些目录的。
B)然后我们开始使用zoneadm命令来安装和启动Non-global Zone.
zoneadm -z test-zone install
屏幕显示以下结果:
Preparing to install zone
Creating list of files to copy from the global zone.
Copying <13496> files to the zone.
Initializing zone product registry.
Determining zone package initialization order.
Preparing to initialize <1086> packages on the zone.
Initialized <1086> packages on zone.
Zone
Installation of these packages generated errors:
Installation of <68> packages was skipped.
Installation of these packages generated warnings:
The file contains a log of the zone installation.
验证test-zone是否安装成功。
bash-3.00# zoneadm list –cv
屏幕显示结果:
bash-3.00# zoneadm list -cv
ID NAME STATUS PATH
0 global running /
- test-zone installed /export/home/test-zone
C)我们使用zoneadm命令启动Non-global Zone.
bash-3.00# zoneadm -z test-zone boot只需几秒时间,我们就可以启动了test-zone.
用zoneadm查看test-zone状态。
bash-3.00# zoneadm list –cv
ID NAME STATUS PATH
0 global running /
1 test-zone running /export/home/test-zone
D)使用zlogin命令进入Non-global Zone进行操作。
bash-3.00# zlogin test-zone
[已连接到区域 'test-zone' pts/3]
Sun Microsystems Inc. SunOS 5.10 Generic January 2005
用“ifconfig –a”确定test-zone IP是否被启动。
bash-3.00# ifconfig -a
lo0:2:flags=2001000849
inet 127.0.0.1 netmask ff000000
bge0:1: flags=1000843
inet 129.158.163.232 netmask ffffff00 broadcast 129.158.163.255
在Zone中配置资源池
系统的资源比如CPU,物理内存,硬盘都是可以让每个Zone来分享使用的. 每一个Zone的运行优先级都不同,有一些可能是稍低一些优先级的Zone, 比如说负责运行内部员工使用的信息浏览网站的Non-global Zone, 而另一些可能是优先级比较高的Zone,例如负责供应全省的记账系统的Non-global Zone,如果我们都使用同一个资源池来供应多个Zone的话,很可能造成彼此之间的影响和冲突,我们可以通过建立多个资源池来满足这些Zone实际的需 要。
不同的资源池里面可以有不同的CPU组,内存和其他资源。
在Global Zone里面有一个名为poold的daemon, 当客户启动资源池时,poold自动被启动,当客户关闭资源池时,poold自动地消失,而pooladm命令则是负责管理启动和关闭资源池的命令,如果 你想使用资源池的话,必须用pooladm –e来启动使用这种资源池的制度。
bash-3.00# pooladm –e
poolcfg是用来配置资源池的命令,你可以使用poolcfg命令创建,查看,修改现有的资源池配置文件。通常情况下,会有一个文件保存资源池的配置, 一般地,它是/etc/pooladm.conf文件。
默认情况下,/etc/pooladm.conf文件是不存在的,你可以使用“pooladm –s /etc/pooladm.conf” 命令创建,创建以后,如果使用“pooladm –c”来读取资源池配置文件,默认就是读取/etc/pooladm.conf文件。
bash-3.00# poolcfg -c info /etc/pooladm.conf
显示结果:
system bennyluo
string system.comment
int system.version 1
boolean system.bind-default true
int system.poold.pid 341
pool db-pool
int pool.sys_id 1
boolean pool.active true
boolean pool.default false
string pool.scheduler FSS
int pool.importance 1
string pool.comment
pset pset_default
pool pool_default
int pool.sys_id 0
boolean pool.active true
boolean pool.default true
int pool.importance 1
string pool.comment
pset pset_default
………
在这里对上面结果稍为作一些简单解释:上面的结果中,操作系统中有两个资源池,分别是db-pool, pool-default。
pool.sys_id -- 系统分配的资源池ID。
pool.active – 资源池的活动状态。
pool.default – 标记这个资源池是否为系统默认的池。
pool.scheduler – 资源池的调度制度。
pool.importance – 资源池的重要级别。
pool.comment – 资源池的注释。
pset_default – 标记这个CPU组为默认的CPU组
那么如何建立一个CPU组,资源池,并且将它们绑定到Zone里面呢?其实很简单,首先你要根据机器的CPU个数来创建CPU组,然后把CPU组分配到资源池里,最后再绑定到Zone,下面有一个简单的步骤供参考:
假设机器上有4个CPU,客户希望建立一个具有两个CPU数目的CPU组,你可以使用poolcfg命令来建立:
poolcfg -c 'create pset pset1 (uint pset.max=2)'
poolcfg -c 'modify pset pset1 (uint pset.min=1)'
这里定义了这个名为pset1的CPU组最少有一个CPU,最多有两个CPU,然后创建资源池:
poolcfg -dc 'create pool pool1'
这里定义了一个名为pool1的资源池。
然后把pset1和pool1关联起来。
poolcfg -dc 'associate pool pool1 (pset pset1) '
最后我们可以在Non-global Zone里面用zonecfg来配置相应的资源池。
zonecfg:test-zone> set pool= pool1
这样就可以完成CPU组,资源池,Zone的分配任务。
当然在我们可以用Solaris 10里面的Project概念来确定其他的资源比如说内存如何合理地分配给客户应用程序的进程所在的Zone,这一方面如果大家有兴趣的话可以提出相应的要求,我们可以出另外的一篇文章详细讲述以下这方面的内容
三,安装whole
範例一 設定完整 Root 模式 ( Whole Root Model ) 的 Non-global Zone
** Root 指的是根目錄 **
Sheel> zonecfg -z mysql5
zonecfg:mysql5> create
zonecfg:mysql5> set zonepath=/export/mysql5
zonecfg:mysql5> set autoboot=true
zonecfg:mysql5> set pool=pool_default
zonecfg:mysql5> add fs
zonecfg:mysql5:fs> set dir=/usr/local
zonecfg:mysql5:fs> set special=/opt/local
zonecfg:mysql5:fs> set type=lofs
zonecfg:mysql5:fs> end
zonecfg:mysql5> add inherit-pkg-dir
zonecfg:mysql5:inherit-pkg-dir> set dir=/opt/sfw
zonecfg:mysql5:inherit-pkg-dir> end
zonecfg:mysql5> remove inherit-pkg-dir dir=/lib
zonecfg:mysql5> remove inherit-pkg-dir dir=/platform
zonecfg:mysql5> remove inherit-pkg-dir dir=/sbin
zonecfg:mysql5> remove inherit-pkg-dir dir=/usr
zonecfg:mysql5> add net
zonecfg:mysql5:net> set address=192.168.30.97
zonecfg:mysql5:net> set physical=bge1
zonecfg:mysql5:net> end
zonecfg:mysql5> add rctl
zonecfg:mysql5:rctl> set name=zone.cpu-shares
zonecfg:mysql5:rctl> add value (priv=privileged,limit=1,action=none)
zonecfg:mysql5:rctl> end
zonecfg:mysql5> add attr
zonecfg:mysql5:attr> set name=comment
zonecfg:mysql5:attr> set type=string
zonecfg:mysql5:attr> set value="This is MySQL 5 work zone"
zonecfg:mysql5:attr> end
說明:
1.1 基本設定
1.1.1 設定 ZONE 路徑
zonecfg:mysql5> set zonepath=/export/mysql5
1.1.2 設定開機自動啟動
zonecfg:mysql5> set autoboot=true
1.1.3 設定資源池
zonecfg:mysql5> set pool=pool_defaul
1.2 設定檔案系統
zonecfg:mysql5> add fs
1.2.1 設定 Non-global Zone 檔案系統掛載點 /usr/local
zonecfg:mysql5:fs> set dir=/usr/local
1.2.2 掛載 Global Zone 的 /opt/local 作為 Non-global Zone 的
/usr/local 當作跟 Global Zone 的檔案交換目錄
zonecfg:mysql5:fs> set special=/opt/local
1.2.3 設定檔案系統交換類型為 lofs
zonecfg:mysql5:fs> set type=lofs
1.2.4 檔案系統設定結束
zonecfg:mysql5:fs> end
1.3 設定 mount Global Zone上 的檔案系統 但在 Non-Global Zone 裡卻是唯讀的
1.3.1 設定直接從 Global Zone 上繼承 mount 上來的檔案系統,
這些檔案系統在 Non-global Zone 裡面都是唯讀的
zonecfg:mysql5> add inherit-pkg-dir
1.3.2 /opt/sfw 直接從 Global Zone 繼承取得使用,
/opt/sfw 是 Golbal Zone 已安裝 package 的目錄
zonecfg:mysql5:inherit-pkg-dir> set dir=/opt/sfw
1.3.3 掛載唯讀目錄結束
zonecfg:mysql5:inherit-pkg-dir> end
1.4 移除預先安裝的目錄將 Non-global Zone 設為完整 Root 模式
( Whole Root Model )
zonecfg:mysql5> remove inherit-pkg-dir dir=/lib
zonecfg:mysql5> remove inherit-pkg-dir dir=/platform
zonecfg:mysql5> remove inherit-pkg-dir dir=/sbin
zonecfg:mysql5> remove inherit-pkg-dir dir=/usr
1.5 設定配發的 ip 跟指定的 NIC 介面
zonecfg:mysql5> add net
zonecfg:mysql5:net> set address=192.168.30.97
zonecfg:mysql5:net> set physical=bge1
zonecfg:mysql5:net> end
1.6 資源限制
zonecfg:mysql5> add rctl
zonecfg:mysql5:rctl> set name=zone.cpu-shares
zonecfg:mysql5:rctl> add value (priv=privileged,limit=1,action=none)
zonecfg:mysql5:rctl> end
1.7 註解說明
zonecfg:mysql5> add attr
zonecfg:mysql5:attr> set name=comment
zonecfg:mysql5:attr> set type=string
zonecfg:mysql5:attr> set value="This is MySQL 5 work zone"
zonecfg:mysql5:attr> end
** 也可以下列的範例設定快速建立完整 Root 模式 **
** ( Whole Root Model ) 的 Non-global Zone **
Sheel> zonecfg -z zone1
zone1: No such zone configured
Use 'create' to begin configuring a new zone.
zonecfg:zone1> create -b
zonecfg:zone1> set zonepath=/zones/zone1
zonecfg:zone1> exit
Sheel> time zoneadm -z zone1 install
四,出错处理
IMPORTANT:
root@b1000:/# zoneadm -z zone1 install
/zone/zone1 must not be group readable.
/zone/zone1 must not be group executable.
/zone/zone1 must not be world readable.
/zone/zone1 must not be world executable.
could not verify zonepath /zone/zone1 because of the above errors.
zoneadm: zone zone1 failed to verify
root@b1000:/# ls -ld /zone/zone1
drwxr-xr-x 2 root other 512 Dec 4 14:42 /zone/zone1
root@b1000:/# chmod 0700 /zone/zone1
root@b1000:/# ls -ld /zone/zone1
drwx------ 2 root other 512 Dec 4 14:42 /zone/zone1
root@b1000:/# zoneadm -z zone1 install
Preparing to install zone
Copying <2365> files to the zone.
Initializing zone product registry.
Determining zone package initialization order.
Preparing to initialize <994> packages on the zone.
Initializing package <57> of <994>: percent complete: 5%