打印

Solaris技术专题——zone详解(1)Zones的功能

本帖已经被作者加入个人空间

Solaris技术专题——zone详解(1)Zones的功能

Solaris Containers 技术是 Solaris 10 操作系统中一项有趣的新功能(最先出现在 Software Express for Solaris 6/04 中),它提供了一种虚拟化系统资源并在一个 OS 实例中使用多个软件分区的方法。Solaris Containers 功能有两个主要组件:Solaris Zones 分区技术资源管理工具。Solaris Zones 功能允许管理员创建独立环境以运行应用程序,而资源管理框架用于 CPU 和内存系统资源的分配、管理和记帐。

Solaris Containers 功能独立于硬件之外,可在支持 Solaris 10 OS 的任何计算机上使用。有关 Solaris Containers 的开发仍在继续,可以期待未来 Solaris 10 OS 内部版本会提供更多灵活性和功能。有关更多完整信息,请参阅 docs.sun.com 上的《系统管理指南:Solaris Containers-资源管理和 Solaris Zones》,也可以参阅 BigAdmin 的 Solaris Zones 部分。

Solaris Zones 软件简介

Solaris Zones 功能所依据的基本概念与 FreeBSD Jails 相同。在 FreeBSD Jails 和 Solaris Zones 中,运行时环境的每个虚拟视图都是完全隔离的,一个环境中的进程不能向另一环境中的进程发送信号,甚至无法查看另一环境中的进程。尽管 Jails 和 Zones 都只共享一个操作系统实例,但多个运行时环境可以共存在只有一个 CPU 的计算机中。

区域 (zone) 有两种类型:全局区域 (global zone) 和非全局区域 (non-global zone)。启用了 Solaris Zones 功能的计算机有一个全局区域和多达 8191 个非全局区域。一台计算机支持的区域最大数量取决于该计算机可用的硬件资源。每个区域在使用全局区域进行引导时系统都会为其分配一个 ID,通常列为区域 ID 0。只有全局区域包含可引导的 Solaris 内核,并可识别所有设备、文件系统和其他区域。全局区域也是唯一可配置、安装和管理非全局区域的区域。

非全局区域包含全局区域中安装的 Solaris OS 的一个子集,还可能包含全局区域中没有安装的附加软件包。每个非全局区域都有自己的软件包数据,其中列出了已安装的与该区域有关的各个软件包,并未与全局区域或其他非全局区域共享软件包信息。非全局区域还包含本地化配置信息,以及其他特定于区域的文件和目录。
|-- AI by Spruce Lab -- | Discover the Info. Tech. for Personal! && Powered by Solaris & Oracle

通告:即日起启用新MSN和Mail地址:aic.lab.sif@gmail.com 原来的最多1个月后停用!

TOP

配置非全局区域

非全局区域由全局区域管理员使用 zonecfg 和 zoneadm 命令创建。通过 zonecfg 命令,管理员可以根据全局区域的模板建立区域配置规范。有关 zonecfg 和 zoneadm 命令的完整信息,请参见 BigAdmin 上的相应手册页。zonecfg 命令的语法如下:

zonecfg -z zonename
zonecfg -z zonename subcommand
zonecfg -z zonename -f command_file
zonecfg help

zonecfg 命令的子命令包括:

add <resource-type>
        (global scope)
add <property-name> <property-value>
        (resource scope)
cancel
commit
create [-F] [ -b | -t <template> ]
delete [-F]
end
exit [-F]
export [-f output-file]
help [commands] [syntax] [usage] [<command-name>]
info [<resource-type> [property-name=property-value]*]
remove <resource-type> { <property-name>=<property-value> }
        (global scope)
remove <property-name>=<property-value>
        (resource scope)
revert [-F]
select <resource-type> { <property-name>=<property-value> }
set <property-name>=<property-value>
verify

要设置基本区域,请在交互模式下运行 zonecfg,并发出 create 和 set zonepath 指令。export 指令将按便于保存至文件的格式输出当前配置信息。由于此时没有进行任何修改,export 指令将列出缺省配置:

zonecfg -z myzone
zonecfg:myzone> create
zonecfg:myzone> export
create -b
set autoboot=false
add inherit-pkg-dir
set dir=/lib
end
add inherit-pkg-dir
set dir=/platform
end
add inherit-pkg-dir
set dir=/sbin
end
add inherit-pkg-dir
set dir=/usr
end

此时,可对缺省模板进行修改。在本例中,将区域 myzone 配置为自动引导,将 IP 地址 192.168.1.7 和 netmask 255.255.255.0 (/24) 与物理接口 hme0 相关联, 将 /opt/sfw 挂载为只读文件系统,然后将相应的打包元数据复制到该区域。本例使用可写回送挂载将全局区域目录 /data 导出到该区域的 /usr/local 下。

zonecfg:myzone> set zonepath=/zones/myzone
zonecfg:myzone> set autoboot=true
zonecfg:myzone> add net
zonecfg:myzone:net> set address=192.168.1.7/24
zonecfg:myzone:net> set physical=hme0
zonecfg:myzone:net> end
zonecfg:myzone> add inherit-pkg-dir
zonecfg:myzone:inherit-pkg-dir> set dir=/opt/sfw
zonecfg:myzone:inherit-pkg-dir> end
zonecfg:myzone> add fs
zonecfg:myzone:fs> set dir=/usr/local
zonecfg:myzone:fs> set special=/data
zonecfg:myzone:fs> set type=lofs
zonecfg:myzone:fs> add options [nodevices]
zonecfg:myzone:fs> end
zonecfg:myzone> verify
zonecfg:myzone> export
create -b
set zonepath=/zones/myzone
set autoboot=true
add inherit-pkg-dir
set dir=/lib
end
add inherit-pkg-dir
set dir=/platform
end
add inherit-pkg-dir
set dir=/sbin
end
add inherit-pkg-dir
set dir=/usr
end
add inherit-pkg-dir
set dir=/opt/sfw
end
add fs
set dir=/usr/local
set special=/data
set type=lofs
add options nodevices
end
add net
set address=192.168.1.7/24
set physical=hme0
end
zonecfg:myzone> commit
zonecfg:myzone> export -f /tmp/myzone-zone.cfg
zonecfg:myzone> exit

该区域现已配置完毕,所使用的模板保存至 /tmp/myzone-zone.cfg。以后可以使用此文件配置相同的区域,也可以通过 zonecfg -z secondzone -f /tmp/myzone-zone.cfg 略做修改(如 IP 地址)后,用来配置类似的区域。现在,可以使用 zoneadm 命令安装该区域。zoneadm 命令的语法如下:

zoneadm -z zonename subcommand [options]
zoneadm [-z zonename] list [options]
zoneadm help

zoneadm 命令的子命令包括:

boot
halt
help [subcommand]
install
list [-cipv]
ready
reboot
uninstall [-F]
verify
|-- AI by Spruce Lab -- | Discover the Info. Tech. for Personal! && Powered by Solaris & Oracle

通告:即日起启用新MSN和Mail地址:aic.lab.sif@gmail.com 原来的最多1个月后停用!

TOP

安装和引导非全局区域

要安装区域,只需发出以下命令:

zoneadm -z myzone install
Preparing to install zone <myzone>.
Creating list of files to copy from the global zone.
Initializing zone product registry.
Determining zone package initialization order.
Preparing to initialize <779> packages on the zone.
Initialized <779> packages on zone.
Successfully initialized zone <myzone>.

现在,对该区域进行引导,打开区域的运行时环境,通过 zlogin 登录该区域的控制台。要从区域控制台注销,请按组合键 ~.(波浪号-点)。

zoneadm -z myzone boot
zlogin -C myzone

由于这是该区域安装后的初始引导,还没有内部命名配置,系统会通过控制台提示输入必要的信息。缺省情况下,区域的主机名就是区域名称。选定的名称应根据区域内部命名服务(DNS、LDAP、文件、NIS、NIS+ 及其他),解析为区域的 IPv4 地址之一。该区域可以使用与全局区域完全不同的命名服务,即使配置了相同的命名服务,相互之间也是完全独立运行的。

该区域使用 sysidcfg 来执行配置,因此显示的屏幕应与执行 sys-unconfig 之后或初始安装 OS 期间显示的屏幕类似。此时所需的大多数信息可以在首次引导该区域之前预先配置,方法是在区域的 /etc 目录中创建文件 sysidcfg。也可以通过 sys-unconfig 命令取消该区域的配置。有关更多信息,请参见 sysidtool(1M) 和 sysidcfg(4) 手册页。

可以通过执行以下命令从全局区域中查看每个正在运行的区域的状态:

zoneadm list -v
   ID NAME             STATUS         PATH
    0 global           running        /
    2 myzone           running        /zones/myzone

此命令会验证该新区域是否已引导并可供使用。如果在非全局区域中运行 zoneadm list -v 命令,则只显示该非全局区域。可以在某个区域内运行 zonename 命令,显示当前正在运行的区域的名称。

新引导的区域与新安装的计算机相似。除了系统缺省值外,没有任何用户帐户或配置设置,因此准备新区域以供生产使用的第一步就是创建帐户、添加其他软件和定制该区域的配置。然后,全局区域管理员就可以通过为 zlogin 指定 -l 标志,以普通用户身份登录非全局区域:

zlogin -l user zonename

也可以在非交互模式下从全局区域运行 zlogin 命令,以便在特定区域中运行命令。要在 myzone 中执行 ls -al /,需要以全局区域管理员的身份执行以下操作:

zlogin myzone ls -al /
total 126
drwxr-xr-x  19 root  other  512 Mar  8 12:45 .
drwxr-xr-x  19 root  other  512 Mar  8 12:45 ..
lrwxrwxrwx   1 root  root     9 Mar  8 12:03 bin -> ./usr/bin
drwxr-xr-x   2 root  other  512 Mar  8 12:02 data
drwxr-xr-x  10 root  other 1024 Mar  8 12:45 dev
drwxr-xr-x  51 root  sys   3584 Mar  8 13:36 etc
drwxr-xr-x   2 root  sys    512 Feb 12 11:42 export
dr-xr-xr-x   1 root  root     1 Mar  8 12:45 home
drwxr-xr-x   5 root  sys    512 Mar  8 12:03 kernel
drwxr-xr-x   4 root  bin   4608 Feb 12 12:17 lib
drwxr-xr-x   2 root  sys    512 Mar  8 12:04 mnt
dr-xr-xr-x   1 root  root     1 Mar  8 12:45 net
drwxr-xr-x   5 root  sys    512 Mar  8 12:03 opt
drwxr-xr-x  43 root  sys   1536 Feb 12 11:52 platform
dr-xr-xr-x  64 root  root 30400 Mar  8 16:27 proc
drwxr-xr-x   2 root  sys   1024 Feb 12 11:48 sbin
drwxrwxrwt   4 root  sys    314 Mar  8 16:19 tmp
drwxr-xr-x  38 root  other 1024 Jul 18  2003 usr
drwxr-xr-x  33 root  sys    512 Mar  8 12:45 var

zlogin 的非交互模式在运行脚本以管理非全局区域时特别有用。zlogin 命令还提供一种故障安全模式 (-S),可在某个区域遭到损坏且无法接受登录时连接至非全局区域。

要删除 myzone 区域,请将其关闭,通过 zoneadm uninstall 删除根文件系统,并发出带有 delete 参数的 zonecfg 命令。

zlogin myzone shutdown -y -i0 -g0
zoneadm -z myzone uninstall -F
zonecfg -z myzone delete -F
|-- AI by Spruce Lab -- | Discover the Info. Tech. for Personal! && Powered by Solaris & Oracle

通告:即日起启用新MSN和Mail地址:aic.lab.sif@gmail.com 原来的最多1个月后停用!

TOP

从全局区域获取和设置非全局区域信息

除了使用 zonecfg、zoneadm、zonename 和 zlogin 之外,多种标准系统命令已经过修改,以便从全局区域查看或修改区域信息。

进程控制

ps 命令现在具有格式选项 -o zone 和 -o zoneid,用于输出进程的区域名称或区域 ID。然后,可以使用 grep 工具查找区域名称或区域 ID,以获取指定区域中相应进程的列表:

/bin/ps -efo user,zone,pid,ppid,c,stime,tty,time,comm |grep myzone
  root myzone 18386     1  0 12:45:24 ?      00:00 /usr/sbin/syslogd
  root myzone 18527     1  0 12:47:04 ?      00:00 /usr/lib/ssh/sshd
  root myzone 18630 18527  0 13:38:26 ?      00:03 /usr/lib/ssh/sshd
  root myzone 18300     1  0 12:45:22 ?      00:00 init
  root myzone 18512     1  0 12:45:33 ?      00:01 /usr/sfw/sbin/snmpd
  root myzone 18399     1  0 12:45:24 ?      00:00 /usr/sbin/cron
  root myzone 18638 18634  0 13:38:31 pts/2  00:00 -sh
  root myzone 18523 18300  0 12:47:03 ?      00:00 /usr/lib/saf/sac
  root myzone 18401     1  0 12:45:25 ?      00:00 /usr/lib/autofs/automountd
daemon myzone 18324     1  0 12:45:23 ?      00:00 /usr/lib/crypto/kcfd
  root myzone 18656 18638  0 13:44:26 pts/2  00:00 tcsh
daemon myzone 18349     1  0 12:45:23 ?      00:00 /usr/sbin/rpcbind
  root myzone 18400     1  0 12:45:24 ?      00:00 /usr/sbin/nscd
  root myzone 18402     1  0 12:45:25 ?      00:00 /usr/sbin/inetd
smmsp myzone 18435     1  0 12:45:29 ?      00:00 /usr/lib/sendmail
  root myzone 18434     1  0 12:45:29 ?      00:00 /usr/lib/sendmail
  root myzone 18442     1  0 12:45:29 ?      00:00 /usr/lib/utmpd
  root myzone 18297     1  0 12:45:09 ?      00:00 zsched
  root myzone 18618 18300  0 13:37:58 zoneconsole \
                                             00:00 /usr/lib/saf/ttymon
  root myzone 18496     1  0 12:45:31 ?      00:00 /usr/dt/bin/dtlogin
  root myzone 18526 18523  0 12:47:03 ?      00:00 /usr/lib/saf/ttymon

许多命令已得到增强,可以按区域对其输出的信息进行过滤,或在其输入中包括某个进程所属的区域。ipcs、pgrep、pkill、ptree 和 prstat 命令现在都包含一个 -z 标志,用于指定区域。此外,prstat 的 -Z 标志不但可以列出所有进程,还可以按区域 ID 列出摘要。这有助于快速确定使用资源最多的区域。Truss 程序也已经过修改,可以识别特定于区域的调用,但仍不能识别区域。

在 Solaris OS 中,可以使用 coreadm 来设置核心转储文件名称模式。该模式现在在区域名称中加入了 %z。例如,如果在全局区域中将核心转储文件名称模式设置为 /var/core/core.%f.%p.%z,则在区域 myzone 中运行的 PID 为 123 的名为 foo 的程序的核心转储文件为:/var/core/core.foo.123.myzone。区域管理员还可以在非全局区域中运行 coreadm,以控制该特定区域的设置。

文件系统

如果从全局区域运行带 -Z 标志的 df,可以显示所有区域中的挂载。缺省情况下,df 只显示当前区域内的挂载。

df -Z
/                  (/dev/dsk/c0t1d0s0 ):      1881482 blocks   247016 files
/devices           (/devices          ):            0 blocks        0 files
/usr               (/dev/dsk/c0t1d0s3 ):       859490 blocks   271499 files
/proc              (proc              ):            0 blocks     1837 files
/etc/mnttab        (mnttab            ):            0 blocks        0 files
/dev/fd            (fd                ):            0 blocks        0 files
/var               (/dev/dsk/c0t1d0s4 ):      1889810 blocks   239530 files
/var/run           (swap              ):      2111168 blocks    15280 files
/tmp               (swap              ):      2111168 blocks    15280 files
/zones             (/dev/dsk/c0t1d0s5 ):     60468666 blocks  3681959 files
/zones/myzone/root/dev(/zones/myzone/dev  ): 60468666 blocks  3681959 files
/zones/myzone/root/lib(/lib               ):  1881482 blocks   247016 files
/zones/myzone/root/opt/sfw(/opt/sfw       ): 60468666 blocks  3681959 files
/zones/myzone/root/platform(/platform     ):  1881482 blocks   247016 files
/zones/myzone/root/sbin(/sbin             ):  1881482 blocks   247016 files
/zones/myzone/root/usr(/usr               ):   859490 blocks   271499 files
/zones/myzone/root/usr/local(/data        ):  1881482 blocks   247016 files
/zones/myzone/root/proc(proc              ):        0 blocks     1837 files
/zones/myzone/root/etc/mnttab(mnttab      ):        0 blocks        0 files
/zones/myzone/root/dev/fd(fd              ):        0 blocks        0 files
/zones/myzone/root/var/run(swap           ):  2111168 blocks    15280 files
/zones/myzone/root/tmp(swap               ):  2111168 blocks    15280 files

联网

ifconfig 实用程序已经过修改,以便根据区域粒度配置和查看接口,但是,接口的检测或取消检测只能通过全局区域进行。要通过全局区域将一个 IP 接口放入某个区域,请执行以下操作:

ifconfig <interface> zone {<name> | <number>}
ifconfig hme0:3 plumb 192.168.1.8 netmask 255.255.255.0 zone myzone up

要在全局区域中只输出全局区域的 IP 接口列表,请使用 ifconfig -aZ。使用 ifconfig -a 可以显示所有区域的网络接口。

ifconfig -a
lo0: flags=1000849<UP,LOOPBACK,RUNNING,MULTICAST,IPv4>
         mtu 8232 index 1
         inet 192.168.1.7 netmask ff000000
lo0:1: flags=1000849<UP,LOOPBACK,RUNNING,MULTICAST,IPv4>
         mtu 8232 index 1
         zone myzone
         inet 127.0.0.1 netmask ff000000
hme0: flags=1000843<UP,BROADCAST,RUNNING,MULTICAST,IPv4>
         mtu 1500 index 2
         inet 192.168.1.4 netmask ffffff00 broadcast 192.168.1.255
         ether 8:0:20:9e:b5:40
hme0:1: flags=1000843<UP,BROADCAST,RUNNING,MULTICAST,IPv4>
         mtu 1500 index 2
         zone myzone
         inet 192.168.1.7 netmask ffffff00 broadcast 192.168.1.255

ifconfig -aZ
lo0: flags=1000849<UP,LOOPBACK,RUNNING,MULTICAST,IPv4>
         mtu 8232 index 1
         inet 192.168.1.7 netmask ff000000
hme0: flags=1000843<UP,BROADCAST,RUNNING,MULTICAST,IPv4>
         mtu 1500 index 2
         inet 192.168.1.4 netmask ffffff00 broadcast 192.168.1.255
         ether 8:0:20:9e:b5:40

记帐

使用扩展记帐 (exacct) 时,每个区域都是单独配置的。记录同时写入全局区域的记帐文件和单个区域的记帐文件。任务和进程记帐记录现在都有一个新字段,名为 zonename。这就可以确定进程或任务所属的区域。
|-- AI by Spruce Lab -- | Discover the Info. Tech. for Personal! && Powered by Solaris & Oracle

通告:即日起启用新MSN和Mail地址:aic.lab.sif@gmail.com 原来的最多1个月后停用!

TOP


感谢一直以来您对我们的支持!
当前时区 GMT+8, 现在时间是 2008-11-22 20:54 京ICP证060528 号

Designed By 17DST