系统管理指南:Oracle Solaris Containers-资源管理和 Oracle Solaris Zones

配置、检验并提交区域

使用 zonecfg(1M) 手册页中所述的 zonecfg 命令可执行以下操作。

也可以使用 zonecfg 命令永久指定全局区域的资源管理设置。

当使用 zonecfg 实用程序配置区域时,您可以使用 revert 子命令来撤消资源设置。请参见如何恢复区域配置

在系统上配置多个区域的脚本在配置多个区域的脚本中提供。

有关如何显示非全局区域配置,请参见如何显示非全局区域的配置

Procedure如何配置区域

请注意,创建本地非全局区域的必需元素只有 zonenamezonepath 属性。其他资源和属性都是可选的。有些可选资源还需要在备选项之间进行选择,例如决定使用 dedicated-cpu 资源还是 capped-cpu 资源。有关可用的 zonecfg 属性和资源的信息,请参见区域配置数据

要执行此过程,您必须是全局区域中的全局管理员。

  1. 成为超级用户或承担主管理员角色。

    有关如何创建该角色并将其指定给用户,请参见《系统管理指南:基本管理》中的“使用 RBAC 和 Solaris 管理工具(任务图)”

  2. 用所选的区域名称来设置区域配置。

    此示例过程中使用名称 my-zone


    global# zonecfg -z my-zone
    

    如果是第一次配置该区域,则可以看到以下系统消息:


    my-zone: No such zone configured
    Use 'create' to begin configuring a new zone.
  3. 创建新的区域配置。

    此过程使用缺省设置。


    zonecfg:my-zone> create
    
  4. 设置区域路径,在此过程中为 /export/home/my-zone


    zonecfg:my-zone> set zonepath=/export/home/my-zone
    

    对于 Solaris 10 10/08 发行版之前的发行版,不要为 ZFS 设置 zonepath

  5. 设置自动引导值。

    如果设置为 true,则在引导全局区域时将自动引导该区域。请注意,要自动引导区域,还必须启用区域服务 svc:/system/zones:default。缺省值为 false


    zonecfg:my-zone> set autoboot=true
    
  6. 为区域设置持久引导参数。


    zonecfg:my-zone> set bootargs="-m verbose"
    
  7. 指定一个 CPU 专用于该区域。


    zonecfg:my-zone> add dedicated-cpu
    
    1. 设置 CPU 数量。


      zonecfg:my-zone:dedicated-cpu> set ncpus=1-2
      
    2. (可选)设置重要性。


      zonecfg:my-zone:dedicated-cpu> set importance=10
      

      缺省值为 1

    3. 结束指定。


      zonecfg:my-zone:dedicated-cpu> end
      
  8. 修改缺省权限集。


    zonecfg:my-zone> set limitpriv="default,sys_time"
    

    该行添加了将系统时钟设置为缺省权限集的功能。

  9. 将调度类设置为 FSS


    zonecfg:my-zone> set scheduling-class=FSS
    
  10. 添加内存上限。


    zonecfg:my-zone> add capped-memory
    
    1. 设置内存上限。


      zonecfg:my-zone:capped-memory> set physical=50m
      
    2. 设置交换内存上限。


      zonecfg:my-zone:capped-memory> set swap=100m
      
    3. 设置锁定内存上限。


      zonecfg:my-zone:capped-memory> set locked=30m
      
    4. 结束内存上限指定。


      zonecfg:my-zone:capped-memory> end
      
  11. 添加文件系统。


    zonecfg:my-zone> add fs
    
    1. 设置文件系统的挂载点,在此过程中为 /usr/local


      zonecfg:my-zone:fs> set dir=/usr/local
      
    2. 指定全局区域中的 /opt/zones/my-zone/local 将要在所配置的区域中挂载为 /usr/local


      zonecfg:my-zone:fs> set special=/opt/zones/my-zone/local
      

      在非全局区域中,/usr/local 文件系统是可读写的。

    3. 指定文件系统类型,在此过程中为 lofs


      zonecfg:my-zone:fs> set type=lofs
      

      此类型指明了内核与文件系统的交互方式。

    4. 结束文件系统指定。


      zonecfg:my-zone:fs> end
      

    可多次执行此步骤来添加多个文件系统。

  12. (可选)设置 hostid


    zonecfg:my-zone> set hostid=80f0c086
    
  13. 在存储池 tank 中添加一个名为 sales 的 ZFS 数据集。


    zonecfg:my-zone> add dataset
    
    1. 指定指向 ZFS 数据集 sales 的路径。


      zonecfg:my-zone> set name=tank/sales
      
    2. 结束 dataset 指定。


      zonecfg:my-zone> end
      
  14. (仅用于稀疏根区域)添加一个从全局区域回送挂载的共享文件系统。

    要执行此步骤来创建一个没有任何共享文件系统的完全根区域。请参见磁盘空间需求中对完全根区域的讨论。


    zonecfg:my-zone> add inherit-pkg-dir
    
    1. 指定在正在配置的区域中以只读模式挂载全局区域中的 /opt/sfw


      zonecfg:my-zone:inherit-pkg-dir> set dir=/opt/sfw
      

      注 –

      区域的打包数据库将更新,以反映软件包。使用 zoneadm 安装区域之后,便不能修改或删除这些资源。


    2. 结束 inherit-pkg-dir 指定。


      zonecfg:my-zone:inherit-pkg-dir> end
      

    可多次执行此步骤来添加多个共享文件系统。


    注 –

    如果要创建一个完全根区域,并且已经使用 inherit-pkg-dir 添加了缺省的共享文件系统资源,则必须使用 zonecfg 删除这些缺省的 inherit-pkg-dir 资源,才能安装区域:

    • zonecfg:my-zone> remove inherit-pkg-dir dir=/lib

    • zonecfg:my-zone> remove inherit-pkg-dir dir=/platform

    • zonecfg:my-zone> remove inherit-pkg-dir dir=/sbin

    • zonecfg:my-zone> remove inherit-pkg-dir dir=/usr


  15. (可选)如果要创建一个专用 IP 区域,请设置 ip-type


    zonecfg:my-zone> set ip-type=exclusive
    

    注 –

    add net 步骤中只会指定物理设备类型。


  16. 添加网络接口。


    zonecfg:my-zone> add net
    
    1. (仅共享 IP)设置网络接口的 IP 地址,在此过程中为 192.168.0.1


      zonecfg:my-zone:net> set address=192.168.0.1
      
    2. 设置网络接口的物理设备类型,在此过程中为 hme 设备。


      zonecfg:my-zone:net> set physical=hme0
      
    3. Solaris 10 10/08:(可选,仅共享 IP)在此过程中,为网络接口设置缺省路由器 10.0.0.1


      zonecfg:my-zone:net> set defrouter=10.0.0.1
      
    4. 结束指定。


      zonecfg:my-zone:net> end
      

    可多次执行此步骤来添加多个网络接口。

  17. 添加设备。


    zonecfg:my-zone> add device
    
    1. 设置设备匹配,在此过程中为 /dev/sound/*


      zonecfg:my-zone:device> set match=/dev/sound/*
      
    2. 结束设备指定。


      zonecfg:my-zone:device> end
      

    可多次执行此步骤来添加多个设备。

  18. 使用属性名称添加区域范围的资源控制。


    zonecfg:my-zone> set max-sem-ids=10485200
    

    可多次执行此步骤来添加多个资源控制。

  19. 使用 attr 资源类型来添加注释。


    zonecfg:my-zone> add attr
    
    1. 将名称设置为 comment


      zonecfg:my-zone:attr> set name=comment
      
    2. 将类型设置为 string


      zonecfg:my-zone:attr> set type=string
      
    3. 将值设置为说明区域的注释。


      zonecfg:my-zone:attr> set value="This is my work zone."
      
    4. 结束 attr 资源类型指定。


      zonecfg:my-zone:attr> end
      
  20. 检验区域的配置。


    zonecfg:my-zone> verify
    
  21. 提交区域的配置。


    zonecfg:my-zone> commit
    
  22. 退出 zonecfg 命令。


    zonecfg:my-zone> exit
    

    请注意,即使您没有在提示符下明确键入 commit,也会在键入 exit 或出现 EOF 时自动执行 commit

在命令行中使用多个子命令

提示 –

zonecfg 命令还支持通过同一个 shell 调用多条子命令,这些子命令放在引号中并用分号进行分隔。


global# zonecfg -z my-zone "create ; set zonepath=/export/home/my-zone"

下一步执行的操作

请参见安装和引导区域来安装已提交的区域配置。

配置多个区域的脚本

可以使用此脚本在系统中配置和引导多个区域。此脚本采用以下参数:

要执行此脚本,您必须是全局区域中的全局管理员。全局管理员在全局区域中拥有超级用户权限或承担主管理员角色。


#!/bin/ksh
#
# Copyright 2006 Sun Microsystems, Inc.  All rights reserved.
# Use is subject to license terms.
#
#ident	"%Z%%M%	%I%	%E% SMI"

if [[ -z "$1" || -z "$2" || -z "$3" ]]; then
		echo "usage: $0 <#-of-zones> <zonename-prefix> <basedir>"
		exit 2
fi

if [[ ! -d $3 ]]; then
		echo "$3 is not a directory"
		exit 1
fi

nprocs=`psrinfo | wc -l`
nzones=$1
prefix=$2
dir=$3

ip_addrs_per_if=`ndd /dev/ip ip_addrs_per_if`
if [ $ip_addrs_per_if -lt $nzones ]; then
		echo "ndd parameter ip_addrs_per_if is too low ($ip_addrs_per_if)"
		echo "set it higher with 'ndd -set /dev/ip ip_addrs_per_if <num>"
		exit 1
fi

i=1
while [ $i -le $nzones ]; do
	zoneadm -z $prefix$i list > /dev/null 2>&1
	if [ $? != 0 ]; then
		echo configuring $prefix$i
		F=$dir/$prefix$i.config
		rm -f $F
		echo "create" > $F
		echo "set zonepath=$dir/$prefix$i" >> $F
		zonecfg -z $prefix$i -f $dir/$prefix$i.config 2>&1 | \
		    sed 's/^/    /g' 
	else
		echo "skipping $prefix$i, already configured"
	fi
	i=`expr $i + 1`
done

i=1
while [ $i -le $nzones ]; do
	j=1
	while [ $j -le $nprocs ]; do
		if [ $i -le $nzones ]; then
			if [ `zoneadm -z $prefix$i list -p | \
			    cut -d':' -f 3` != "configured" ]; then
				echo "skipping $prefix$i, already installed"
			else
				echo installing $prefix$i
				mkdir -pm 0700 $dir/$prefix$i
				chmod 700 $dir/$prefix$i
				zoneadm -z $prefix$i install > /dev/null 2>&1 &
				sleep 1	# spread things out just a tad
			fi
		fi
		i=`expr $i + 1`
		j=`expr $j + 1`
	done
	wait
done

i=1
while [ $i -le $nzones ]; do
	echo setting up sysid for $prefix$i
	cfg=$dir/$prefix$i/root/etc/sysidcfg
	rm -f $cfg
	echo "network_interface=NONE {hostname=$prefix$i}" > $cfg
	echo "system_locale=C" >> $cfg
	echo "terminal=xterms" >> $cfg
	echo "security_policy=NONE" >> $cfg
	echo "name_service=NONE" >> $cfg
	echo "timezone=US/Pacific" >> $cfg
	echo "root_password=Qexr7Y/wzkSbc" >> $cfg  # 'l1a'
	i=`expr $i + 1`
done

i=1
para=`expr $nprocs \* 2`
while [ $i -le $nzones ]; do
	date
	j=1
	while [ $j -le $para ]; do
		if [ $i -le $nzones ]; then
			echo booting $prefix$i
			zoneadm -z $prefix$i boot &
		fi
		j=`expr $j + 1`
		i=`expr $i + 1`
	done
	wait
done

Procedure如何显示非全局区域的配置

要执行此过程,您必须是全局区域中的全局管理员。

  1. 成为超级用户或承担主管理员角色。

    有关如何创建该角色并将其指定给用户,请参见《系统管理指南:基本管理》中的“使用 RBAC 和 Solaris 管理工具(任务图)”

  2. 显示区域配置。


    global# zonecfg -z zonename info