分类:
2014-09-03 13:23:48
当你决定要建立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
(注释:设定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
系统的资源比如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,这一方面如果大家有兴趣的话可以提出相应的要求,我们可以出另外的一篇文章详细讲述以下这方面的内容。
Zones BigAdmin site:
Solaris Containers Blueprint:
Engineering/SE Weblogs
OpenSolaris
Administration guide: