如何通过脚本创建 Oracle Solaris 11 区域来实现一体化网络配置

2011 年 11 月

作者:Jeff McMeekin

通过这个“一体化网络”示例,了解如何通过克隆高效地创建 Oracle Solaris 区域以及如何使用脚本配置虚拟网络。


简介

本文说明如何通过脚本来创建 Oracle Solaris 区域,重点介绍网络配置。内容包括如何最高效地创建 Oracle Solaris 区域,即通过克隆方式,以及如何配置网络接口以实现最大的灵活性,以便 Oracle Solaris 区域可以在系统之间迁移。

OTN 旨在帮助您充分熟悉 Oracle 技术以便作出明智的决策。提供文章、软件下载、文档等。立即加入以获取完成工作所需的技术资源。

示例:一体化网络

Oracle Solaris 11 提供了新的网络虚拟化联网特性。网络虚拟化将服务器虚拟化带入更高层次:通过网络虚拟化提供的功能,无需任何额外的网络硬件投资,即可建立包括服务器、路由器、交换机和防火墙在内的在单个平台上运行的整个虚拟化网络拓扑结构。网络虚拟化可用于各种目的,从原型设计,到开发和测试,一直到服务部署。在下面的示例中,我们将逐步完成在单个系统内运行的整个网络拓扑结构的创建。

图 1 显示一个多层应用程序的示例。在该示例中,有两台 Web 服务器,运行在对外网开放的专用系统上;还有几台数据库服务器,运行在不直接与外网相连的专用系统上。

图 1

图 1. 将在一台服务器上虚拟化的网络

下面我们将在一个 Oracle Solaris 11 系统上配置实现此物理方案,作为此过程的一个良好开端,我们先对所有必须配置的实体进行命名。因此,我们将按照虚拟方案重新绘制此示意图,如图 2 所示,重点突出所有组件和接口的名称以及 IP 地址(在适用位置)。

图 2

图 2. 从物理拓扑结构转换成虚拟一体化网络拓扑结构

在图 2 中,Web 服务器共享一个名为 webswitch0 的后端 etherstub。从技术上讲,etherstub 不是虚拟交换机,但实际上它允许创建交换机。因此我们将 etherstub 标记为交换机,这让示意图更清晰,不需要添加额外的详细信息。

数据库服务器也共享一个后端 etherstub,标记为 dbswitch0。我们将对网络进行配置,让运行在专用 Oracle Solaris 区域(zdb1zdb2zdb3)中的数据库服务器不能直接访问物理网络,从而将它们与外部通信隔离开来以保障它们的安全。

在本示例中,单个物理接口表示为 net0。对于 vphys1vphys2 VNIC 地址,如果您在实际中要在 zweb1zweb2 区域中安装 Web 服务器,则应使用 vphys 子网 (129.200.9) 外部知道的地址。

第 1 步:创建 Etherstub

在此步骤中,我们将创建两个 etherstub,用于支持数据库区域之间以及 Web 服务器区域之间的通信,如图 2 所示。首先来看物理网络:

# dladm show-phys 
LINK   MEDIA      STATE    SPEED     DUPLEX   DEVICE 
net0   Ethernet   up       1000      full     bge0

对于此系统,只有一个物理接口 bge0。注意,其链路名称为 net0。默认情况下,Oracle Solaris 11 将为第一个物理接口创建一个名为 net0 的链路,为第二个物理接口创建一个名为 net1 的链路,以此类推。这是一个非常有用的简化,因为我们不必再担心用于各种硬件平台的实际物理 NIC 硬件和链路名称。当需要配置与此物理接口相关的任何内容时,我们将使用 net0

首先,按照前面所示架构,我们创建两个 etherstub 以支持虚拟交换:

# dladm create-etherstub webswitch0
# dladm create-etherstub dbswitch0

在 Oracle Solaris 11 中,每个 Oracle Solaris 区域本身已启用一个 VNIC,即另一个 net0。就本示例而言,我们对图 2 中的 VNIC 进行命名以反映其在整个架构中的位置。因此我们不是将示意图中的所有接口标记为 net0net1 等等,而是使用更具描述性的名称,如 vdb1vdb2 等等。

这里有一个更大的问题:是否在全局区域中定义 VNIC。在前一个 Oracle Solaris 11 Express 版本中,必须从全局区域定义所有 VNIC。在本例中,有 9 个 VNIC,因此将有 9 条 dladm create-vnic 语句。

不过,更好的创建 VNIC 的办法是在区域内部创建由该区域使用的 VNIC,其重点在于构建可在系统之间迁移 Oracle Solaris 区域的动态环境。当该区域消失时,VNIC 也一起消失。更重要的是,将该区域迁移到另一个系统时,该区域将携带有关其所期望接口的信息。

在我们的示例中,全局区域确实需要提供一些内容,例如,etherstub 是在全局区域中定义的。但网络配置的其余部分是动态的,因为这些配置是各个非全局区域而不是全局区域所带的。

配置所有 etherstub 之后,检查设置:

# dladm show-etherstub -Z
LINK                ZONE
dbswitch0           global
webswitch0          global

第 2 步:创建用于存储 Oracle Solaris 区域的 ZFS 池

我们将创建一个 Oracle Solaris 区域,然后,为缩短创建其他区域的时间,我们将克隆第一个区域以生成我们的示例所需的区域。克隆的区域需要共享一个 ZFS 数据集,因此第一步是创建该数据集:

# zfs create -o mountpoint=/zonefs rpool/zonefs 
# chmod 700 /zonefs

第 3 步:创建一个 Oracle Solaris 区域以便进行克隆

使用 Oracle Solaris 11,克隆 Oracle Solaris 区域比从头创建一个区域要快很多,因为从本质上来讲,从程序包构建映像所需的时间比复制一个现成的区域要长。在创建第一个区域的过程中,有一个 Oracle Solaris 11 优化,该优化使程序包缓存在本地系统上,因此创建后续区域时不必再与程序包信息库交互。即使有了该优化,克隆方法还是比重新创建更快。在本示例中,我们将使用克隆方法,我们首先创建一个 Oracle Solaris 区域,然后将其克隆 6 次。

首先,配置要克隆的 Oracle Solaris 区域 zclone,如下所示:

# zonecfg -z zclone
zclone: No such zone configured
Use 'create' to begin configuring a new zone.
zonecfg:zclone> create
create: Using system default template 'SYSdefault'
zonecfg:zclone> set zonepath=/zonefs/zclone
zonecfg:zclone> set ip-type=exclusive
zonecfg:zclone> exit

对 Oracle Solaris 11 来说,ip-type 的默认设置现在为 exclusive,意味着每个 Oracle Solaris 区域都有自己的 IP 堆栈。另一种设置 shared 仍然为系统所支持。这两种设置各有优点,但 exclusive 更接近地模拟了物理 NIC 布置,因此以它作为默认设置更有道理。

现在安装 zclone

# zoneadm -z zclone install
A ZFS file system has been created for this zone.
Progress being logged to /var/log/zones/zoneadm.20111007T223740Z.zclone.install
.
.
.
Done: Installation completed in 407.653 seconds.

  Next Steps: Boot the zone, then log into the zone console
              (zlogin -C) to complete the configuration process.

:根据网络和映像包管理系统 (IPS) 信息库的不同,安装时间有所不同。

现在启动 zclone

# zoneadm -z zclone boot; zlogin -C zclone
[Connected to zone 'zclone' console]
Loading smf(5) service descriptions: 112/112

我们将 zlogin 命令与 boot 命令放在同一行上,这样 zlogin 命令会立即执行,您会看到 zclone 区域启动,包括 Service Management Facility (SMF) 服务的初始配置。您需要完成这一步,这样,克隆该区域时就不必等待每个新区域配置所有 SMF 服务。

该输出最终会消失并转到 System Configuration Tool 的初始屏幕(参见图 3),在此可以进行最后的配置。

重要事项:请不要 使用该工具。此时不再进行其他配置,因此使用 ~.(按波浪号键加句点键)转到全局区域。


图 3

图 3. System Configuration Tool

然后停止 zclone

# zoneadm -z zclone halt

回顾一下,我们创建了一个 Oracle Solaris 区域 zclone(完成了初始安装和首次启动)并配置了 SMF 服务。此时,我们停止了这一过程,因为不需要进一步配置 zclone

可以看到,创建 zclone 将为我们节省初始供应区域的时间以及首次启动的很多时间。使用 zclone 时,我们只需让一个新的 Oracle Solaris 区域以它为基础,然后通过一个脚本化过程而不是手动过程为该新区域提供网络标识和其他配置信息。

第 4 步:创建示例的第一个 Oracle Solaris 区域

图 2 中,可以看到 6 个 Oracle Solaris 区域。为简化输入,我们采用这样的方法:完成建立一个 Oracle Solaris 区域作为范例的过程,然后使用附录中提供的一些脚本来自动执行建立其他区域的过程。

如果您不愿键入用于创建第一个 Oracle Solaris 区域的所有命令,可以阅读以下命令但实际上使用附录中的 createzone-1vnic.sh 脚本来完成这项工作。此方法可避免输入许多命令时难以避免的键入错误。有关如何获取和使用脚本的更多信息,请参见第 5 步

:如果您选择避免键入用于第一个 Oracle Solaris 区域的命令,可调用相应脚本(如下所示):

# sh createzone-1vnic.sh zdb1 vdb1 192.168.7.1 dbswitch0 192.168.7.254

如果使用脚本,您仍应读完本节其余部分以了解该脚本执行了哪些操作。


下面我们首先要在示例网络中创建一个将包含数据库的 Oracle Solaris 区域 zdb1。不过我们不会实际为该区域提供一个数据库服务器,因为此示例只是关于建立网络基础架构。

首先看看可以使用哪些方法来预先配置一个 Oracle Solaris 区域。对于 Oracle Solaris 10,配置文件为 sysidcfg,它包含网络设置、主机名、区域设置、时区等信息。对于 Oracle Solaris 11,该文件为 sc_profile.xml。我们有两种方法:

  • 可以使用新的 Oracle Solaris 11 工具创建系统配置文件。可以使用以下命令来轻松调用该工具:

    sysconfig create-profile -o sc_profile.xml 
    

    我们可以使用此方法创建 sc_profile.xml 文件,然后用变量名代替某些要更改的值。然后可以将其传递给脚本,进行一些合适的操作来创建自定义 sc_profile.xml 文件。.

  • 可以使用 Oracle Solaris 10 中的 sysidcfg 文件,稍做调整,通过新的 JumpStart to Automated Installer 转换实用程序 js2ai 运行该文件,然后将输出(新的 sc_profile.xml 文件)传递给其余区域创建过程。

我们将使用第二种方法,因为它更易于演示。sysidcfg 文件比 XML 文件小很多,更易于处理,且用于处理 sysidcfg 的方法同样可以用于 sc_profile.xml

尽管在许多情况下 sysidcfg 可能是一种很有用的快捷方法,但对于其他情况(例如,如果您想要创建 root 之外的其他用户或更高级的配置),直接使用 sc_profile.xml 可能更好办。有关 sc_profile.xml 的信息和示例,请参阅 Oracle Solaris 文档安装 Oracle Solaris 11 中的“配置客户端系统”一节。

目前,这两种方法都有一个限制:只能创建一个网络接口。稍后,我们将看看另一种方法,即使用 zonecfganet 子命令创建网络接口(1)。

表 1 的左栏是 sysidcfg 文件,我们可能在 Oracle Solaris 10 中使用了这个文件来配置 Oracle Solaris 区域。不过,在可以使用 js2ai 实用程序将其转换成 sc_profile.xml 之前,必须对 sysidcfg 文件做些修改。表 1 右栏显示了删除不支持的行并对语法稍作修改后的 sysidcfg 文件。

表 1. sysidcfg 文件修改前后的版本
示例 Oracle Solaris 10 sysidcfg 文件转换后将用于 js2ai 的文件
terminal=vt100
system_locale=C
timezone=US/Pacific
nfs4_domain=dynamic
security_policy=NONE
root_password=rJmv5LUXM1OcU
network_interface=PRIMARY {
hostname=zdb1
ip_address=192.168.7.1
netmask=255.255.255.0
protocol_ipv6=no 
default_route=192.168.7.254
}
name_service=NONE
terminal=vt100
system_locale=C
timezone=US/Pacific
security_policy=NONE
root_password=rJmv5LUXM1OcU
network_interface=vdb1 {primary
hostname=zdb1
ip_address=192.168.7.1
netmask=255.255.255.0
protocol_ipv6=no 
default_route=192.168.7.254
}
name_service=NONE

注意我们执行了以下操作:

  • 删除了 Oracle Solaris 11 中不需要的 nfs4 响应。
  • 稍微更改了 network_interface 项的语法。

重要事项:所有 Oracle Solaris 区域的口令均为 crossbow


该口令是这样创建的:在 Oracle Solaris 10 系统上创建一个口令为 crossbow 的用户,然后将加密口令从 /etc/shadow 复制到 sysidcfg 文件中的 root_password 设置。也可能使用 Oracle Solaris 11 加密口令。

然后,转到 /tmp 目录:

# cd /tmp

接下来,使用您常用的编辑器创建 sysidcfg 文件,将表 1 右栏中显示的所有 sysidcfg 设置(从 terminal=vt100 行开始)剪切并粘贴到新的 sysidcfg 文件中。

然后执行 js2ai 命令,它将 sysidcfg 转换为 sc_profile.xml 文件:

# js2ai -s

默认情况下,该命令将在当前目录中查找 sysidcfg 文件,并将 sc_profile.xml 输出到当前目录。

此时您可能愿意查看一下刚创建的 sc_profile.xml

下一步,从 zclone 区域创建 zdb1 区域:

# zonecfg -z zdb1 "create -t zclone"

然后指定建立区域文件的位置并添加 VNIC vdb1

# zonecfg -z zdb1 "set zonepath=/zonefs/zdb1" 
# zonecfg -z zdb1 "select anet linkname=net0; set linkname=vdb1; set lower-link=dbswitch0; end"

上面最后一条命令的根本意途是:选择自动创建的 VNIC net0,首先将其名称更改为 vdb1,然后通过 lower-link 属性将其与 etherstub dbswitch0 相关联。换言之,使配置与图 2 一致。

现在需要将先前创建的 /tmp/sc_profile.xml 配置文件应用于新的 zdb1 区域:

# zoneadm -z zdb1 clone -c /tmp/sc_profile.xml zclone

然后启动 zdb1 区域并确认它运行:

# zoneadm -z zdb1 boot 
# zoneadm list -cv
  ID  NAME    STATUS      PATH           BRAND    IP
  0   global running      /              solaris  shared
  78  zdb1   running      /zonefs/zdb1   solaris  excl
  -   zclone installed    /zonefs/zclone solaris  excl

第 5 步:创建其余 Oracle Solaris 区域

第 4 步中可以看到,生成配置需要输入不少内容。附录提供了简化创建(和清除)Oracle Solaris 区域的脚本。您应将这些脚本复制和粘贴到相应的文件名(如每个脚本中所示)。有关更多说明,请参见附录

如果将脚本放在 /opt/crossbowhowto/scripts 中,可以使用以下命令看到所有这些脚本:

# cd /opt/crossbowhowto/scripts 
# ls 
cleanupallzones.sh    cleanupzone.sh       createzone-2vnic.sh cleanupdladm.sh
createzone-1vnic.sh  new-zone-vnic.sh

您已经在第 4 步中创建了 zdb1 数据库区域,因此现在创建另外两个数据库区域 zdb2zdb3。有关参数说明,请参见附录

# sh createzone-1vnic.sh zdb2 vdb2 192.168.7.2 dbswitch0 192.168.7.254 
# sh createzone-1vnic.sh zdb3 vdb3 192.168.7.3 dbswitch0 192.168.7.254

接下来,需要为路由器创建一个 Oracle Solaris 区域 zrouter。为保持示例的简单明了,我们将使用默认的 Oracle Solaris 路由器来处理路由任务。如果路由更复杂或想要使用其他路由协议,可以使用开源 Quagga 项目,该项目可在 Oracle Solaris 11 程序包信息库中找到。参见 quagga(8)。

注意,zrouter 区域有两个 VNIC,但我们将使用脚本,该脚本只创建一个 VNIC。现在使用以下命令创建 zrouter 区域和它的一个接口。稍后,我们将配置第二个接口和路由。

# sh createzone-1vnic.sh zrouter vdb0 192.168.7.254 dbswitch0 NONE

最后,创建两个用于运行 Web 服务器的区域:zweb1zweb2。您需要用自己子网上的地址替换以下命令中的 129.200.9 地址,因为 vphys1vphys2 地址是外部系统看到的地址。

# sh createzone-2vnics.sh zweb1 vweb1 192.168.0.1 webswitch0 192.168.0.254 vphys1 129.200.9.1 net0
# sh createzone-2vnics.sh zweb2 vweb2 192.168.0.2 webswitch0 192.168.0.254 vphys2 129.200.9.2 net0

:我们并不实际安装 Web 服务器,如何开始在 Oracle Solaris 11 中创建 Oracle Solaris 区域一文将说明如何安装 Apache Web 服务器。然后可以使用 svcadm 轻松启动服务器。

回到本示例,验证配置:

# zoneadm list -cv
ID NAME    STATUS      PATH             BRAND    IP
0  global  running     /                solaris  shared
78 zdb1    running     /zonefs/zdb1     solaris  excl
81 zdb2    running     /zonefs/zdb2     solaris  excl
82 zdb3    running     /zonefs/zdb3     solaris  excl
83 zrouter running     /zonefs/zrouter  solaris  excl
84 zweb1   running     /zonefs/zweb1    solaris  excl
85 zweb2   running     /zonefs/zweb2    solaris  excl
- zclone   installed   /zonefs/zclone   solaris  excl

另一个有用的检查是显示使用 etherstub 的所有 VNIC。首先,看看哪些 VNIC 分配给了 dbswitch0

# dladm show-vnic -l dbswitch0 
LINK          OVER       SPEED  MACADDRESS      MACADDRTYPE   VID

zrouter/vdb0  dbswitch0    0    2:8:20:c2:d5:7    random       0
zdb1/vdb1     dbswitch0    0    2:8:20:c6:31:48   random       0
zdb2/vdb2     dbswitch0    0    2:8:20:79:62:95   random       0
zdb3/vdb3     dbswitch0    0    2:8:20:46:b1:c6   random       0

还可以检查 webswitch0,但由于您未为 zrouter 配置第二个接口,将不会看到 webswitch0 etherstub 的全部组件。

第 6 步:为 Oracle Solaris 区域配置路由

在完成 zrouter 的配置之前,必须解决 Oracle Solaris 11 第一版所独有的一个小问题。

我们必须重新启动我们使用 createzone-2vnics.sh 脚本创建的 zweb1zweb2 这两个区域。如果您查看为 zweb1zweb2 创建的两个接口的状态,您不会看到第二个网络接口处于活动状态。重新启动即可纠正此问题,随后的各次重启将始终启用这两个接口。

此错误与通过 zonecfganet 子命令的 allowed-address 属性指定 IP 地址有关。我们使用从 sysidcfg 文件生成的 sc_profile.xml 文件设置了第一个 VNIC 的 IP 地址。但第二个 IP 地址是通过 zonecfg 命令配置的(因为不能通过 sc_profile.xml 创建两个网络接口)。若想了解如何使用了 allowed-address 属性,请参见 createzone-2vnics.sh 脚本

因此,首先需要重新启动 zweb1。首次登录 Oracle Solaris 区域时请始终使用 -C 标志。这将调用配置工具来提示您输入。您已经通过 sysidcfg 文件在启动前提供了配置信息,因此这里不会提示您。但如果您对 sysidcfgsc_profile.xml 文件内容进行了任何更改,则可能触发提示。

# zlogin -C zweb1
[Connected to zone 'zweb1' console] 

如果您没有看到以下登录提示,请按 Enter 键。如果您仍然什么也没看到,则该区域很可能仍在启动过程中。

zweb1 console login: root 
Password: crossbow 

Oct 20 21:19:02 zweb1 login: ROOT LOGIN /dev/console
Oracle Corporation      SunOS 5.11      snv_175 September 2011
root@zweb1:~# 

重新启动 zweb1 区域。

# reboot
    zweb1 reboot: initiated by root on /dev/console

[NOTICE: Zone rebooting]

SunOS Release 5.11 Version 11.0 64-bit

Copyright (c) 1983, 2011, Oracle and/or its affiliates. All rights reserved.

Hostname: zweb1
[Connected to zone 'zweb1' console]
zweb1 console login:

使用 ~. 转到全局区域。

接下来,登录到 zweb2 并重新启动它。

zweb2 console login: root
Password:  crossbow
root@zweb2:~# reboot

再次使用 ~. 转到全局区域。

现在可以完成对 zrouter 的配置,该路由器应在 Web 服务器区域 zweb1zweb2 以及三个数据库区域 zdb1zdb2zdb3 之间路由数据包。这里的问题在于,如果我们使用脚本创建两个 VNIC,则第二个是通过 allowed-address 属性创建的,这意味着 VNIC 将仅使用该地址传输数据包。但我们需要它转发数据包以实现路由功能。因此要手动创建第二个接口而不使用 allowed-address 属性,如下所示。

首先从全局区域 执行以下操作以创建位于 webswitch0 etherstub 上的 vweb0 VNIC。

# zonecfg -z zrouter
zonecfg:zrouter> add anet
zonecfg:zrouter:anet> 
zonecfg:zrouter:anet> set linkname=vweb0
zonecfg:zrouter:anet> set lower-link=webswitch0
zonecfg:zrouter:anet> end
zonecfg:zrouter> exit

然后,重新启动 zrouter 区域并重新登入。

# zlogin -C zrouter

root@zrouter:~# reboot

zweb1 console login: root 
Password: crossbow 

现在必须为 zrouter 区域指定 IP 地址。如前所述,不能使用前面使用的方法,因为通过 allowed-address 分配 IP 地址具有太大的局限性。也不能使用 sc_profile.xml 方法,因为只能用该文件创建一个接口。这些是仅有的两种可以从全局区域向专用堆栈区域分配 IP 地址的办法,第三种方法是直接登录该区域并配置 IP 地址。

root@zrouter: ipadm create-ip vweb0 
root@zrouter: ipadm create-addr -T static -a 192.168.0.254/24 vweb0/web

最后一个手动配置是启用数据包转发。在启用之前,您可能有兴趣登录到 zdb1 并尝试 ping 所有其他 VNIC。您将能够 ping 通 vdb2vdb3,以及路由器接口 vdb0vweb0。在 zrouter 区域中启用数据包转发之后,您将可以从 zdb1 ping 通 vweb1,反之亦然。

不过,您不会 ping 通 vphys1vphys2,因为这两个都是通过 allowed-address 属性创建的。因此不会通过它们转发数据包。在本例中,由于我们不希望数据库区域可以访问外部网络,反之亦然,因此这一结果正如我们所愿。

要在 zrouter 区域中启用 IP 转发,执行以下操作:

root@zrouter: ipadm set-prop -p forwarding=on ipv4

完成该设置之后,查看为两个接口分配的地址:

root@zrouter: ipadm show-addr
ADDROBJ           TYPE     STATE        ADDR
lo0/v4            static   ok           127.0.0.1/8
vdb0/v4           static   ok           192.168.7.254/24
vweb0/web         static   ok           192.168.0.254/24
lo0/v6            static   ok           ::1/128

现在可以参照图 4 尝试各种试验。

图 4

图 4. 还是网络虚拟化示意图

在各区域之间使用 pingtraceroute 命令,如下所示:

  • 尝试从这些地址的同一子网(本例中为 129.200.1)上的外部系统到达 zweb1vphys1 地址。应该可以成功。
  • 尝试从外部系统到达 192.168.0 或 192.168.7 网络上的一个 IP 地址。应该不会 成功,如前所述。即使关闭 allowed-address,仍然需要启用 IP 转发,正如配置 zrouter 区域时所做的。
  • 尝试从 zweb1zweb2 到达以下数据库区域之一:zdb1zdb2zdb3(分别为 192.168.7.1、192.168.7.2 或 192.168.7.3)。因为 zrouter 已经启用了 IP 转发,所以这次应该可以成功。
  • 反过来试试。从 zdb1zdb2 或 zdb3 尝试到达 192.168.0.1 或 192.168.7.2。同样,因为 zrouter 配置,应该可以成功。

清理

有关可以用来清理(删除)区域和 VNIC 并将系统恢复到原始状态的三个脚本,请参见附录

总结

希望这一篇分步指导能够为您的未来实践提供一些启发。使用 Oracle Solaris 11 的功能,您可以轻松搭建相当复杂的环境。使用本文未讨论但通过 Oracle Solaris 11 信息库可用的其他工具,如 IP Filter 防火墙、quagga 路由程序包和新的负载平衡器,可以满足非常复杂的联网要求。

更多信息

下面是其他一些资源:

附录

本节提供了 6 个脚本。建议使用 gedit 将其内容复制并粘贴至建议的文件名,以便在 Oracle Solaris 11 上创建这些文件。

清单 1:创建具有一个 VNIC 的 Oracle Solaris 区域的脚本
#!/bin/sh
#
# FILENAME:    createzone-1vnic.sh
# Create a zone with a VNIC attached to an etherstub
# Usage:
# createzone-1vnic.sh <zone name> <VNIC> <IP address for VNIC> 
#                     <etherstub to which VNIC is attached> <default route>
if [ $# != 5 ]
then
    echo "Usage: createzone-1vnic.sh <zone name> <VNIC>"
    echo "       <IP address for VNIC> <etherstub to which VNIC is attached>"
    exit 1
fi

ZONENAME=$1

sh new-zone-vnic.sh $ZONENAME $2 $3 $4 $5

# Now create the new zone from the clone and apply the config file 
zoneadm -z $ZONENAME clone -c /tmp/sc_profile.xml zclone

zoneadm -z $ZONENAME boot

#END FILE createzone-1vnic.sh

清单 2:创建具有两个 VNIC 的 Oracle Solaris 区域的脚本
#!/bin/sh
#
# FILENAME: createzone-2vnics.sh
#
# Usage:
# create2zones.sh <zone name> <vnic1> <IP address for vnic1>
#                 <etherstub for vnic1> <default route> <vnic2> 
#                 <IP address for vnic2> <physical VNIC to associate with vnic2>

if [ $# != 8 ]
then
  echo "usage: createzone-2vnics.sh <zone name>  <vnic1>  <IP address for vnic1>"
  echo "                 <etherstub for vnic1>  <vnic2>  <IP address for vnic2>"
  echo "                 <physical VNIC or etherstub to associate with vnic2>"
  exit 1
fi
ZONENAME=$1
VNIC1=$2
VNIC1IP=$3
ETHERSTUB=$4
DEF_ROUTE=$5
VNIC2=$6
VNIC2IP=$7
PHYSNIC=$8

echo "Create zone $ZONENAME"
echo "  Interface $VNIC1, IP address $VNIC1IP on etherstub $ETHERSTUB," 
echo "  default route to $DEF_ROUTE"

sh new-zone-vnic.sh $ZONENAME $VNIC1 $VNIC1IP $ETHERSTUB $DEF_ROUTE

echo "  Interface $VNIC2, IP address $VNIC2IP on physical NIC $PHYSNIC"

zonecfg -z $ZONENAME "add anet; set linkname=$VNIC2;
set lower-link=$PHYSNIC; set allowed-address=$VNIC2IP; end" 

# Now create the new zone from the clone and apply the config file 
zoneadm -z $ZONENAME clone -c /tmp/sc_profile.xml zclone

zoneadm -z $ZONENAME boot

# END FILE   createzone-2vnics.sh

清单 3:前两个脚本所用的脚本
#!/bin/sh
#
# FILENAME:    new-zone-vnic.sh
# Create a zone with a VNIC attached to an etherstub.
# This script does most of the work for createzone-1vnic.sh and 
# createzone-2vnics.sh
# Usage:
# new-zone-vnic.sh <zone name> <VNIC> <IP address for VNIC> <etherstub to which VNIC is attached>
#                  <default route>
if [ $# != 5 ]
then
  echo "Usage: createzone-1vnic.sh <zone name> <VNIC> <IP address for VNIC>"
  echo "    <etherstub to which VNIC is attached> <default route>"
  exit 1
fi
ZONENAME=$1
VNIC=$2
VNICIP=$3
ETHERSTUB=$4
DEF_ROUTE=$5
#  We are using the Oracle Solaris 10 sysidcfg file to organize
#  all the config information for a zone, and then convert to Oracle 
#  Solaris 11 format via the js2ai utility.
#  Note that you cannot generate a root password under Oracle Solaris 11
#  and use that encrypted string for the root_password property
#  of the sysidcfg file (since sysidcfg is an Oracle Solaris 10 feature
#  not an Oracle Solaris 11 one). The recommended approach is to 
#  generate a password on an Oracle Solaris 10 system and grab it 
#  from the /etc/shadow file.
cat > /tmp/sysidcfg << _EOF_
system_locale=C
timezone=US/Pacific
security_policy=NONE
root_password=rJmv5LUXM1OcU
network_interface=$VNIC {primary
hostname=$ZONENAME
ip_address=$VNICIP
netmask=255.255.255.0
protocol_ipv6=no
default_route=$DEF_ROUTE
}
name_service=NONE
_EOF_
cd /tmp
#  Convert the sysidcfg file to sc_profile.xml
js2ai -s
if [ $? != 0 ]
then echo "Error converting sysidcfg file, see js2ai.log";exit 1
fi
zonecfg -z $ZONENAME "create -t zclone"
zonecfg -z $ZONENAME "set zonepath=/zonefs/$ZONENAME"
zonecfg -z $ZONENAME "select anet linkname=net0; 
set linkname=$VNIC; set lower-link=$ETHERSTUB; end" 
#END FILE new-zone-vnic.sh

清单 4:完全删除一个区域的脚本
#!/bin/sh 
#
# FILENAME: cleanupzone.sh 
# 
# Usage: cleanupzone.sh <zone name> 
#
# This will completely remove a zone from the system
# 
if [ $# != 1 ] 
then
      echo "Usage: cleanupzone <zone name>" 
      exit 1
fi 
echo 'zoneadm -z '$1' halt' 
zoneadm -z $1 halt 
echo 'zoneadm -z '$1' uninstall -F' 
zoneadm -z $1 uninstall -F 
echo 'zonecfg -z '$1' delete -F' 
zonecfg -z $1 delete -F
# 
# END FILE cleanupzone.sh

清单 5:删除所有区域的脚本
#!/bin/sh 
#
# FILENAME: cleanupallzones.sh 
# Usage: cleanupallzones.sh 
# 
# This will completely remove all the demo zones
sh cleanupzone.sh zweb1 
sh cleanupzone.sh zweb2 
sh cleanupzone.sh zrouter 
sh cleanupzone.sh zdb1
sh cleanupzone.sh zdb2
sh cleanupzone.sh zdb3 
sh cleanupzone.sh zclone
# 
# END FILE cleanupallzones.sh 

清单 6:删除两个 Etherstub 的脚本
#!/bin/sh 
# 
# FILENAME: cleanupdladm.sh 
# 
# Usage: cleanupdladm 
# 
# This will remove the etherstubs 
# 
dladm delete-etherstub webswitch0 
dladm delete-etherstub dbswitch0
#
# END FILE cleanupdladm.sh

修订版 1.1,2011 年 11 月 14 日