Oracle Solaris: Zones on Shared Storage

Jeff Victor著

システム間でゾーンを迅速かつ簡単に移行できるように、共有ストレージにOracle Solarisゾーンを格納する方法


2013年1月公開(Jeff Victorのブログから転載)

Oracle Solaris 11.1には、さまざまな新機能があります。 oracle.comで新機能の詳細なリストを参照できます。

このような技術記事を電子メールで受信する場合は、システム管理者と開発者向けの技術情報のみを提供する、Systems Community Newsletterをご購読ください

重要な新機能の1つであり、またOracle Solarisゾーンに関連するもっとも重要な新機能は、簡単に"Zones on Shared Storage"または短くZOSS("moss"と同じリズムで)と呼ばれています。 ZOSSを使用すると、Oracle Solarisゾーンを共有ストレージに格納でき(これは驚くべきことです)、そのため1つのシステムから別のシステムにゾーンを迅速かつ簡単に移行できるようになり、非常に柔軟性が高くなります。 この記事では、ZOSSの使用法の説明と、そのデモをします。

ZOSSでは、"共有ストレージ"に格納されているOracle Solarisゾーンが完全にサポートされます。 もうこの場合、"共有ストレージ"はファイバ・チャネル(FC)デバイスまたはiSCSIデバイスのことです。これには1つだけ例外があります。これについてはすぐ後でデモします。 おもな目的は、FCまたはiSCSIストレージにゾーンを格納できるようにして、1つのホスト・コンピュータから別のホスト・コンピュータに以前よりもさらに簡単かつ安全にゾーンを移行できるようにすることです。

この記事では、個々のユーザーが自分で移行を簡単に行えるようにしました。 幸いなことに、個々のユーザーに使用できるSANがあることを前提にはできませんでした。私にも使用できるSAN環境がないためです! 代わりに、何を使用できるでしょうか。 (また同じような展開ですね)。

この記事の作成で、ラボのすべての問題を解決するのはOracle VM VirtualBoxであるという教訓がさらに強固なものになりました。Oracle VM VirtualBoxは、今回もいくつかの重要な点で役立っています。 Oracle VM VirtualBoxを使用すると、Oracle Solarisの複数のコピーを一般的なシステム(Microsoft Windows、Mac OS、Oracle Solaris、Oracle Linux、その他のバージョンのLinuxなど)にゲストとして簡単にインストールできます。 また、論理ハード・ディスクとしてゲストに表示される、個別の仮想ディスク・ドライブ(VDI)も作成できます。 この仮想ディスクをゲスト間で非常に簡単に移動できます。 つまり、ラップトップでも大規模なx86システムでも、以下の手順を実行できます。

ZOSSを使用してローカル・ディスクにゾーンを格納する機能は、ラボ環境で非常に役立ちますが、本番環境ではそれほど役立ちません。 コンピュータ間で定期的にディスク・ドライブを移動させることを提案しているのではありません。

以下で説明する方法では、仮想ハード・ディスクに(仮想)ホスト間で移行するゾーンを格納します。 本番環境では、代わりにFC LUNやiSCSI LUNを使用します。 これらの3つのタイプの各デバイスの構文については、zonecfg(1M)manページを参照してください。

移行する理由

仮想サーバーの移行は、なぜ重要なのでしょうか。 もっとも一般的な理由として、次のようなものがあります。

  • 詳細なメンテナンスを行うために元のコンピュータの電源を切ることができるよう、別のコンピュータにワークロードを移動する必要があります。
  • ワークロードが元のシステムの容量を超えたために、さらに規模の大きいシステムにワークロードを移動する必要があります。
  • 共有ストレージに格納されている環境(Oracle Solarisゾーンなど)でワークロードを実行している場合、元のコンピュータに障害が発生して再起動できないときには、代替のコンピュータでワークロードのサービスをリストアできます。
  • ワークロードをラップトップで開発し、準備できたらテスト・プラットフォームに移行し、最終的に本番システムに移動すれば、ワークロードのライフ・サイクル管理を簡素化できます。

コンセプト

ZOSSの新しい重要なコンセプトの名前は、rootzpoolです。 rootzpoolについて、詳しくはzonecfg(1M)manページを参照してください。簡単に説明すると、rootzpoolは、ゾーンを保持するZFS zpoolを作成するために使用するバッキング・ストア(ハード・ディスクまたはLUN)です。 このzpoolは、次のようなものです。

  • ゾーンのOracle Solarisのコンテンツ、つまりルート・ファイル・システムが格納されます。
  • 該当するゾーンに関連しないコンテンツは格納されません。
  • 一度に1つのOracle Solarisインスタンスでのみマウントできます。

方法の概要

ここでは、共有ストレージにゾーンを作成して移行する手順について、概要を説明します。 次の項で、詳細なコマンドと出力を示します。

  1. ホスト・システムにx86 CPU(少なくとも2~3のCPUコアが理想的です)と2GB以上のRAMが搭載されており、25GB以上の空きディスク領域があることを確認します (この手順では、実際には25GBのディスク領域は使用しませんが、"HDDがいっぱいで、うまくいくかどうか分からない"という結果にならないようにしておく必要があります)。
  2. 両方のシステムでゾーンを構成し、両方で使用するrootzpoolを指定します。 一方のシステムで構成してから、zonecfgの入力として使用するよう、もう一方のシステムにzonecfg exportの出力をコピーすることをお勧めします。 この方法で、パイロット・エラーの可能性が少なくなります (ゾーンを作成する前に、両方のシステムでゾーンを構成する必要はありません。 該当するシステムすべてに共有ストレージへのアクセス権がある限りは、このゾーンは必要な複数の場所で構成でき、それらの場所のいずれかにいつでも移行できます)。
  3. 共有ストレージを使用して、ゾーンを1つのシステムにインストールします。
  4. ゾーンをブートします。
  5. ゾーンにシステム構成情報を指定します。 (本当のところ、実環境では通常、この手順を自動化します)。
  6. ゾーンをシャットダウンします。
  7. 元のシステムからゾーンを切り離します。
  8. ゾーンを新しい"ホーム"システムに接続します。
  9. ゾーンをブートします。

ゾーンは正常に使用でき、元のシステムに戻したり、別のシステムに移行したりすることもできます。

詳細

この記事の残りの部分では、コマンドと出力を示します。 2つのホストの名前は、sysAsysBです。

: Oracle Solarisの各ゲストで、共有するVDIに異なるデバイス名が使用されることがあります。 ここでは以下に示すデバイス名を使用しましたが、ユーザーは、各ゲストをブートした後でデバイス名を検出する必要があります。 本番環境でも、まずデバイス名を検出してから、そのデバイス名を使用してゾーンを構成します。 コマンドzpool importまたはformatを使用すれば、ゾーンの"新しい"ホストでデバイスを検出できます。

最初の手順で、Oracle VM VirtualBoxゲストと共有ディスク・ドライブを作成します。 以下に、デモなしの手順を示します。

  1. Oracle VM VirtualBoxをダウンロードし、ホストOSの標準の方法を使ってインストールします。 完全な手順を確認します。
  2. それぞれがOracle Solaris 11.1を実行する、2つのOracle VM VirtualBoxゲストを作成します。 各ゲストでは、独自のVDIをルート・ディスクとして使用します。
  3. 各ゲストにOracle Solaris 11.1をインストールします。 Oracle Solaris 11.1ゲストをインストールするには、ビルトインのOracle VM VirtualBoxゲストをダウンロードしてインポートするか、"テキスト・インストール"メディアからOracle Solaris 11.1をインストールします。 2つ目の方法を使用する場合、ブート後にウィンドウ・システムは表示されません。 GUIおよびその他の重要な内容をインストールするには、ログインしてpkg install solaris-desktopを実行し、これらの重要な内容がインストールされている間、待機します。
  4. VirtualBox Guest Additionsをインストールすると、ホストとゲスト間でコピーアンドペーストなどを行えるようになるため、通常、操作が容易になります。 Guest Additionsは、使用しているOracle VM VirtualBoxのバージョンに対応するフォルダにあります。 Guest Additionsのインストール手順も参照できます。
  5. Oracle VM VirtualBoxにゾーンの共有VDIを作成するには、2つのゲストのいずれかのストレージ構成を開いて、SATAコントローラを選択し、横にある「Add Hard Disk」アイコンをクリックします。 「Create New Disk」を選択して、VDIが含まれるファイルの適切なパス名を指定します。 共有VDIは、1.5GB以上である必要があります。 これを行うには、ゲストを停止させる必要があります。
  6. 実行中に各ゲストがアクセスできるように、各ゲストのストレージ構成を使用してこのVDIを他のゲストに追加します。 手順は、「Create New Disk」の代わりに「Choose Existing 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) リスト3に示すように、sysAzone1を構成します。

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に示すように、ゾーンをインストールします。この手順にもっとも時間がかかるため、その間、軽食をとったり、ジムで2~3周走ったり、この両方 (同時にするのでなければ)をするのも良いでしょう。

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) 結果を確認し、sysBで共有ディスクを使用できるように、リスト6に示すようにsysAをシャットダウンします。

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のパラメータを使用してゾーンを構成します (前述の「方法の概要」で説明したように、sysAzonecfg ... exportを使用するのがもっとも安全な方法です)。 1つ異なるのが、前提のリストで示したrootzpoolストレージ・デバイスの名前です。sysBをブートし、formatコマンドまたはzpool 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) リスト11に示すように、ゾーンをsysAに再接続します。

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に2つ目のストレージ・デバイスを追加して、ゾーンに領域を追加する。 2つ目のストレージ・デバイスは、両方のゾーンの構成に追加するようにしてください。
  • 新しいゾーンを作成して、最初にゾーンを構成するときにrootzpoolに2つのディスクを指定する。 このゾーンをインストールするか、別のゾーンからゾーンをクローニングするときに、zoneadmにより、この2つのディスクを使用してミラー化プールを作成します (3つのディスクでは3方向ミラー、などとなります)。

結論

Oracle Solarisゾーンをシステム間で移動するのは簡単だと思ってもらえれば幸いです。

参照

著者について

Jeff VictorはOracle CorporationのPrincipal Sales Consultantで、書籍『Solaris 10 System Virtualization Essentials』の主要執筆者です。 約30年間に渡るUNIXの経験に基づいた、オペレーティング・システム、仮想化、およびリソース管理におけるJeffの専門知識には、主要企業から常に要請があります。 Oracle SolarisゾーンのFAQや、Oracle Solaris 10用のオープン・ソース・プログラムzonestatも作成しました。

頻繁に著作や寄稿を行ったり、企業イベントや業界イベントで講演を行ったりしています。 Jeffのブログは、http://blogs.oracle.com/jeffvで閲覧できます。 ニューヨーク州トロイのレンセラー工科大学で理学士号を取得しています。

リビジョン1.0、08.01.13