Oracle Solaris:共享存储上的区域

作者:Jeff Victor

如何将 Oracle Solaris 区域存储在共享存储上,以便快速、轻松地将区域从一个系统迁移到另一个系统。


2013 年 1 月发布(转载自 Jeff Victor 的博客

Oracle Solaris 11.1 有几个新特性。oracle.com 上提供了详细清单

想要自动接收类似本文的技术文章?请订阅系统社区新闻快讯 — 专门面向系统管理员和开发人员的技术内容。

其中一个重要的新特性,也是与 Oracle Solaris 区域有关的最重要的新特性,俗称“共享存储上的区域”,简称为 ZOSS(与“moss”押韵)。ZOSS 提供了更高的灵活性,因为您可以在共享存储上存储 Oracle Solaris 区域(真是一个惊喜!),这样就可以快速、轻松地将区域从一个系统迁移到另一个系统。本文介绍并演示 ZOSS 的使用。

ZOSS 为“共享存储”上存储的 Oracle Solaris 区域提供全面的支持。在这种情况下,“共享存储”指的是光纤通道 (FC) 或 iSCSI 设备,但是还有一个特例,我稍后会介绍到。其主要目的是让您能够将区域存储在 FC 或 iSCSI 存储上,这样就可以将区域从一台主机迁移到另一台主机上,远比过去更轻松、更安全。

在本文中,我想进行一些简化,以便您自行尝试。我不能假定您已经有可用的 SAN(这当然很好),因为我也没有!那用什么来替代呢?[又来预示了……-编者]

撰写本文的过程再次验证了 Oracle VM VirtualBox 可以解决每个实验室问题,它在本文的多个方面提供了重要帮助。它支持在主流系统(如 Microsoft Windows、Mac OS、Oracle Solaris、Oracle Linux 和其他版本的 Linux)上轻松安装多个 Oracle Solaris 来宾操作系统。它还支持创建一个单独的虚拟磁盘驱动器 (VDI),对来宾操作系统显示为本地硬盘。这个虚拟磁盘可以非常轻松地从一个来宾操作系统移至另一个来宾操作系统。换句话说,您可以在一台笔记本电脑上或一台较大型 x86 系统上完成以下步骤。

请注意,对实验室环境来说,能够使用 ZOSS 将区域存储在本地磁盘上是非常有用的,但对于生产环境来说,就没那么有效了。建议不要经常在计算机间移动磁盘驱动器。

在下述方法中,虚拟硬盘将包含将在(虚拟)主机间迁移的区域。在生产环境中,将使用 FC 或 iSCSI LUN 代替。zonecfg(1M) 手册页详细介绍了这三种设备的语法。

为何要迁移?

虚拟服务器的迁移为何如此重要?以下是一些最常见的原因:

  • 为了关闭计算机进行全面维护,需要将负载从原计算机转移到另外一台计算机。
  • 因为负载已超出原系统承载能力,需要将其转移到一个更大的系统。
  • 如果负载运行在一个存储在共享存储上的环境(如 Oracle Solaris 区域)中,当原来的计算机发生故障不能重启时,可以在备用计算机上恢复负载的服务。
  • 可以通过以下方式简化负载的生命周期管理:在笔记本电脑上开发,准备就绪后迁移到测试平台,最后迁移到生产系统。

概念

ZOSS 的重要新概念是 rootzpool。可以查阅手册页 zonecfg(1M),以下是其简化版本:它是一种后备存储(硬盘或 LUN),将用于建立一个 ZFS zpool 来容纳区域。此 zpool

  • 包含区域的 Oracle Solaris 内容,即根文件系统
  • 不包含与区域无关的任何内容
  • 一次只能由一个 Oracle Solaris 实例挂载

方法概述

这里简要概述在共享存储上创建和迁移区域的步骤。下一节将介绍详细的命令和输出。

  1. 确保主机系统有一个 x86 CPU(理想情况下,至少要有一对 CPU 内核),至少 2GB 的 RAM,至少 25GB 的可用磁盘空间。(以下步骤实际上不会用到 25GB 的磁盘空间,但是我不希望给您指了一条路,却止步于“HDD 已满。祝您好运!”)
  2. 配置两个系统上的区域,指定二者都会用到的 rootzpool。最好的办法是先在一个系统上配置区域,然后将 zonecfg export 输出复制到另一个系统,用作 zonecfg 的输入。此方法减少了测试出错的几率。(创建区域之前,没有必要在两个系统上都配置区域。您可以随时在多个地方配置此区域,随时将其迁移到其中一处 — 只要这些系统都可以访问该共享存储。)
  3. 使用共享存储将区域安装到一个系统。
  4. 启动区域。
  5. 向区域提供系统配置信息。(在 Real World(tm) 中,通常会自动执行此步骤。)
  6. 关闭区域。
  7. 将区域与原系统分离。
  8. 将区域连接到新的“主”系统。
  9. 启动区域。

至此,该区域可以正常使用,甚至可以迁移回去或者迁移到另外一个系统。

详细信息

本文其余部分将介绍这些命令及其输出。两个主机名为 sysAsysB

:每个 Oracle Solaris 来宾操作系统可能对其共享的 VDI 使用不同的设备名。我使用如下所示的设备名,但您必须在启动每个来宾操作系统之后发现实际的设备名。在生产环境中,也要先发现设备名,然后再使用该名称配置区域。幸运的是,可以使用命令 zpool importformat 发现区域的“新”主机上的设备。

首先要创建 Oracle VM VirtualBox 来宾操作系统和共享磁盘驱动器。在此只介绍这些步骤,并不演示。

  1. 下载 Oracle VM VirtualBox使用适合您主机操作系统的常规方法进行安装。您可以阅读完整说明
  2. 创建两个 Oracle VM VirtualBox 来宾操作系统,每个都运行 Oracle Solaris 11.1。每个来宾操作系统将使用自己的 VDI 作为根磁盘。
  3. 在每个来宾上安装 Oracle Solaris 11.1。要安装 Oracle Solaris 11.1 来宾操作系统,可以下载预构建的 Oracle VM VirtualBox 来宾操作系统导入,或者从“文本安装”介质安装 Oracle Solaris 11.1。如果采用后一种方法,启动后将看不到窗口系统。要安装 GUI 及其他重要组件,请登录并运行 pkg install solaris-desktop,等待系统安装这些重要组件。
  4. 如果安装 VirtualBox Guest Additions,一切通常会变得更简单,因为您可以在主机和来宾操作系统之间复制和粘贴等等。您可以在与您使用的 Oracle VM VirtualBox 版本匹配的文件夹中找到 Guest Additions。您还可以阅读 Guest Additions 安装说明
  5. 要在 Oracle VM VirtualBox 中创建区域的共享 VDI,您可以打开两个来宾操作系统中一个的存储配置,选择 SATA 控制器,并单击旁边的 Add Hard Disk 图标。选择 Create New Disk,为将包含该 VDI 的文件指定适当的路径名。共享 VDI 必须至少有 1.5 GB。请注意,操作时必须停止来宾操作系统的运行。
  6. 将该 VDI 添加到另一个来宾操作系统(使用其存储配置),这样每个来宾操作系统都可以在运行时访问它。开始的步骤相同,只是要选择 Choose Existing Disk 而不是 Create New Disk。因为磁盘在两个来宾操作系统上都进行了配置,Oracle VM VirtualBox 会阻止您同时运行两个来宾操作系统。
  7. 在每个来宾操作系统中,识别该 VDI 的设备名称。Oracle Solaris 根据现有设备选择名称。名称可以相同,也可以彼此不同。此步骤如下面的第 1 步所示。

假设

在下面的示例中,我们进行以下假设:

  • 最初拥有区域的来宾操作系统名为 sysA
  • 第一次迁移之后拥有该区域的来宾操作系统名为 sysB
  • sysA 上,共享磁盘名为 /dev/dsk/c7t2d0
  • sysB 上,共享磁盘名为 /dev/dsk/c7t3d0

(最终!)步骤

第 1 步)确定将在系统间来回移动的磁盘的名称,如清单 1 所示。

root@sysA:~# format
Searching for disks...done

AVAILABLE DISK SELECTIONS:
       0. c7t0d0 
          /pci@0,0/pci8086,2829@d/disk@0,0
       1. c7t2d0 
          /pci@0,0/pci8086,2829@d/disk@2,0
Specify disk (enter its number): ^D

清单 1. 确定磁盘名称

第 2 步)首先要对磁盘进行分区和标记,如清单 2 所示。写 EFI 标签所需的技巧并不太复杂。

root@sysA:~# format -e c7t2d0
selecting c7t2d0
[disk formatted]

FORMAT MENU:
...
format> fdisk
No fdisk table exists. The default partition for the disk is:

  a 100% "SOLARIS System" partition

Type "y" to accept the default partition,  otherwise type "n" to edit the
 partition table. n
SELECT ONE OF THE FOLLOWING:
...
Enter Selection: 1
...
  G=EFI_SYS    0=Exit? f
SELECT ONE...
...
6

format> label
...
Specify Label type[1]: 1
Ready to label disk, continue? y

format> quit

root@sysA:~# ls /dev/dsk/c7t2d0
/dev/dsk/c7t2d0

清单 2. 磁盘分区和标记

第 3 步)sysA 上配置 zone1,如清单 3 所示。

root@sysA:~# zonecfg -z zone1
Use 'create' to begin configuring a new zone.
zonecfg:zone1> create
create: Using system default template 'SYSdefault'
zonecfg:zone1> set zonename=zone1
zonecfg:zone1> set zonepath=/zones/zone1
zonecfg:zone1> add rootzpool
zonecfg:zone1:rootzpool> add storage dev:dsk/c7t2d0
zonecfg:zone1:rootzpool> end
zonecfg:zone1> exit
root@sysA:~# zonecfg -z zone1 info
zonename: zone1
zonepath: /zones/zone1
brand: solaris
autoboot: false
bootargs:
file-mac-profile:
pool:
limitpriv:
scheduling-class:
ip-type: exclusive
hostid:
fs-allowed:
anet:
...
rootzpool:
        storage: dev:dsk/c7t2d0

清单 3. 在 sysA 上配置 zone1

第 4 步)安装区域,如清单 4 所示。此步骤用时最长,您可以离开去吃些点心或跑上几圈,两者都做也可以!(只要不是同时……)

root@sysA:~# zoneadm -z zone1 install
Created zone zpool: zone1_rpool
Progress being logged to /var/log/zones/zoneadm.20121022T163634Z.zone1.install
       Image: Preparing at /zones/zone1/root.

 AI Manifest: /tmp/manifest.xml.RXaycg
  SC Profile: /usr/share/auto_install/sc_profiles/enable_sci.xml
    Zonename: zone1
Installation: Starting ...

              Creating IPS image
Startup linked: 1/1 done
              Installing packages from:
                  solaris
                      origin:  http://pkg.us.oracle.com/support/
DOWNLOAD                                PKGS         FILES    XFER (MB)   SPEED
Completed                            183/183   33556/33556  222.2/222.2  2.8M/s

PHASE                                          ITEMS
Installing new actions                   46825/46825
Updating package state database                 Done
Updating image state                            Done
Creating fast lookup database                   Done
Installation: Succeeded

        Note: Man pages can be obtained by installing pkg:/system/manual

 done.

        Done: Installation completed in 1696.847 seconds.


  Next Steps: Boot the zone, then log into the zone console (zlogin -C)

              to complete the configuration process.

Log saved in non-global zone as /zones/zone1/root/var/log/zones/zoneadm.20121022T163634Z.zone1.install

清单 4. 安装区域

第 5 步)启动区域:

root@sysA:~# zoneadm -z zone1 boot

第 6 步)登录区域控制台,填写系统信息说明:

root@sysA:~# zlogin -C zone1

回答常规问题,等待登录提示。然后可以使用常规神奇魔咒“~.”结束控制台会话。

第 7 步)关闭区域,这样才可以“移动”:

root@sysA:~# zoneadm -z zone1 shutdown

第 8 步)分离区域,如清单 5 所示,这样原始全局区域就无法再使用它。

root@sysA:~# zoneadm list -cv
  ID NAME             STATUS     PATH                           BRAND    IP
   0 global           running    /                              solaris  shared
   - zone1            installed  /zones/zone1                   solaris  excl
root@sysA:~# zpool list
NAME          SIZE  ALLOC   FREE  CAP  DEDUP  HEALTH  ALTROOT
rpool        17.6G  11.2G  6.47G  63%  1.00x  ONLINE  -
zone1_rpool  1.98G   484M  1.51G  23%  1.00x  ONLINE  -
root@sysA:~# zoneadm -z zone1 detach
Exported zone zpool: zone1_rpool

清单 5. 分离区域

第 9 步)检查结果并关闭 sysA,如清单 6 所示,以便 sysB 可以使用共享磁盘。

root@sysA:~# zpool list
NAME    SIZE  ALLOC   FREE  CAP  DEDUP  HEALTH  ALTROOT
rpool  17.6G  11.2G  6.47G  63%  1.00x  ONLINE  -
root@sysA:~# zoneadm list -cv
  ID NAME             STATUS     PATH                           BRAND    IP
   0 global           running    /                              solaris  shared
   - zone1            configured /zones/zone1                   solaris  excl
root@sysA:~# init 0

清单 6. 关闭 sysA

第 10 步)现在启动 sysB,使用前面第 1 步中所示参数配置区域。(同样,最安全的方法是对 sysA 使用 zonecfg ... export,如前面的“方法概述”一节所述。)唯一的区别在于 rootzpool 存储设备的名称,如假设清单中所示,必须启动 sysB 并使用 formatzpool import 命令来确定。

完成之后,应查看清单 7 所示输出。(在本示例中,我使用相同的区域名 zone1,但您可以选择自己希望的任何有效区域名称。)

root@sysB:~# zoneadm list -cv
  ID NAME             STATUS     PATH                     BRAND    IP
   0 global           running    /                        solaris  shared
   - zone1            configured /zones/zone1             solaris  excl
root@sysB:~# zonecfg -z zone1 info
zonename: zone1
zonepath: /zones/zone1
brand: solaris
autoboot: false
bootargs:
file-mac-profile:
pool:
limitpriv:
scheduling-class:
ip-type: exclusive
hostid:
fs-allowed:
anet:
        linkname: net0
...
rootzpool:
        storage: dev:dsk/c7t3d0

清单 7. 启动 sysB 并配置区域后的输出

第 11 步)连接区域,如清单 8 所示,这将自动导入 zpool。

root@sysB:~# zoneadm -z zone1 attach
Imported zone zpool: zone1_rpool
Progress being logged to /var/log/zones/zoneadm.20121022T184034Z.zone1.attach
    Installing: Using existing zone boot environment
      Zone BE root dataset: zone1_rpool/rpool/ROOT/solaris
                     Cache: Using /var/pkg/publisher.
  Updating non-global zone: Linking to image /.
Processing linked: 1/1 done
  Updating non-global zone: Auditing packages.
No updates necessary for this image.

  Updating non-global zone: Zone updated.
                    Result: Attach Succeeded.
Log saved in non-global zone as /zones/zone1/root/var/log/zones/zoneadm.20121022T184034Z.zone1.attach

root@sysB:~# zoneadm -z zone1 boot
root@sysB:~# zlogin zone1
[Connected to zone 'zone1' pts/2]
Oracle Corporation      SunOS 5.11      11.1    September 2012

清单 8. 连接区域

第 12 步)现在我们将区域迁移回 sysA。如清单 9 所示,在 zone1 中创建一个文件,以便在将区域迁移回来之后验证该文件是否存在,然后开始移回区域。

root@zone1:~# ls /opt
root@zone1:~# touch /opt/fileA
root@zone1:~# ls -l /opt/fileA
-rw-r--r--   1 root     root           0 Oct 22 14:47 /opt/fileA
root@zone1:~# exit
logout

[Connection to zone 'zone1' pts/2 closed]
root@sysB:~# zoneadm -z zone1 shutdown
root@sysB:~# zoneadm -z zone1 detach
Exported zone zpool: zone1_rpool
root@sysB:~# init 0

清单 9. 在 zone1 中创建文件

第 13 步)返回 sysA,检查状态,如清单 10 所示。

root@sysA:~# zoneadm list -cv
  ID NAME             STATUS     PATH                     BRAND    IP
   0 global           running    /                        solaris  shared
   - zone1            configured /zones/zone1             solaris  excl
root@sysA:~# zpool list
NAME    SIZE  ALLOC   FREE  CAP  DEDUP  HEALTH  ALTROOT
rpool  17.6G  11.2G  6.47G  63%  1.00x  ONLINE  -

清单 10. 检查 sysA 状态

第 14 步)将区域重新连回 sysA,如清单 11 所示。

root@sysA:~# zoneadm -z zone1 attach
Imported zone zpool: zone1_rpool
Progress being logged to /var/log/zones/zoneadm.20121022T190441Z.zone1.attach
    Installing: Using existing zone boot environment
      Zone BE root dataset: zone1_rpool/rpool/ROOT/solaris
                     Cache: Using /var/pkg/publisher.
  Updating non-global zone: Linking to image /.
Processing linked: 1/1 done
  Updating non-global zone: Auditing packages.
No updates necessary for this image.

  Updating non-global zone: Zone updated.
                    Result: Attach Succeeded.
Log saved in non-global zone as /zones/zone1/root/var/log/zones/zoneadm.20121022T190441Z.zone1.attach

root@sysA:~# zpool list
NAME          SIZE  ALLOC   FREE  CAP  DEDUP  HEALTH  ALTROOT
rpool        17.6G  11.2G  6.47G  63%  1.00x  ONLINE  -
zone1_rpool  1.98G   491M  1.51G  24%  1.00x  ONLINE  -
root@sysA:~# zoneadm -z zone1 boot
root@sysA:~# zlogin zone1
[Connected to zone 'zone1' pts/2]
Oracle Corporation      SunOS 5.11      11.1    September 2012
root@zone1:~# zpool list
NAME    SIZE  ALLOC   FREE  CAP  DEDUP  HEALTH  ALTROOT
rpool  1.98G   538M  1.46G  26%  1.00x  ONLINE  -

清单 11. 重新连接区域

第 15 步)检查先前在 sysB 上创建的文件。

root@zone1:~# ls -l /opt
total 1
-rw-r--r--   1 root     root           0 Oct 22 14:47 fileA

后续步骤

下面简要列出接下来您可以尝试的一些有趣的操作。

  • 通过向 rootzpool 再添加一个存储设备来增大区域空间。确保同时在两个区域的配置中添加此空间!
  • 新建一个区域,首次配置区域时在 rootzpool 中指定两个磁盘。安装该区域或从其他区域克隆时,zoneadm 将使用这两个磁盘创建一个镜像池。(三个磁盘的结果是三路镜像,依此类推。)

总结

我希望您已经看到现在可以非常轻松地将 Oracle Solaris 区域从一个系统迁移到另一个系统。

另请参见

关于作者

Jeff Victor 是 Oracle Corporation 首席销售顾问,也是《Solaris 10 System Virtualization Essentials》一书的主要作者。凭借近 30 年的 UNIX 经验,他在操作系统、虚拟化和资源管理方面拥有丰富的专业知识,经常受邀为各大公司提供帮助。他编写了 Solaris 区域常见问题解答和适用于 Oracle Solaris 10 的 zonestat 开源程序。

Jeff 经常著书、撰稿并在公司或行业活动中发表演讲。他的博客地址为 http://blogs.oracle.com/jeffv。他从纽约州特洛伊市伦斯勒理工学院获得理学学士学位。

修订版 1.0,2013 年 1 月 8 日

 


facebook 横幅广告 twitter 横幅广告