Skip to main content

Fujitsu

Japan

まっちーの仮想化講座
第18回:共有ディスクを使ったゾーンの移行

2013年7月23日


 

Oracle Solarisゾーンには、ゾーンを別サーバに移行する方法として、以下の二つがあります。

  • ゾーンのdetach/attach
  • ゾーンを共有ストレージに作成するrootzpool

一つ目のdetach/attachは、Oracle Solaris 10から実装されている機能で、基本的にOracle Solaris 11上にOracle Solaris 10ゾーンを作る方法と同じです。この方法の詳細は第14回でご紹介していますので、こちらをご参照ください。
二つ目のrootzpoolは、ゾーンを共有ディスク上に作成する機能で、Oracle Solaris 11.1より追加されました。今回はこのrootzpoolを用いたゾーンの移行方法をご紹介したいと思います。

なお、今回ご紹介する環境もOracle VM Server for SPARCを用いたゲストドメイン上に構築しています。そのため、ディスクにはターゲットID(tX)が表示されません。

概要

今回は以下のような流れでrootzpool機能を確認したいと思います。

基本編:通常運用時

ゾーンの作成から移行までの手順をご紹介します。

応用編:緊急時のゾーン移行

サーバに障害が発生したときに、別サーバに切り替えてゾーンをbootする手順をご紹介します。

基本編

移行元サーバでのゾーン作成

通常、ゾーンを作成する場合には、ゾーンのroot(/)ディレクトリであるzonepathを指定します。このzonepathはglobal zone上のディレクトリを指定します。
rootzpoolを用いるときはzonepathの指定に加えて、zonepathを作成するデバイス(ディスク)も指定します。
まずは、デバイスの確認をします。今回はzonepathを作成するデバイスとしてc2d3を使用します。
なお、使用するデバイスがSMIラベルのディスクの場合、ディスクスライスを指定する必要があります。ディスクスライスはゾーンを作成する前に設定します。

Sol11-1# format
Searching for disks...done

AVAILABLE DISK SELECTIONS:
       0. c2d0 
          /virtual-devices@100/channel-devices@200/disk@0
       1. c2d1 
          /virtual-devices@100/channel-devices@200/disk@1
       2. c2d3 
          /virtual-devices@100/channel-devices@200/disk@3

Specify disk (enter its number):

ディスクの確認とスライスの設定ができたら、ゾーンを作成していきたいと思います。今回はzone02を作成します。

Sol11-1# zoneadm list -vc
  ID NAME             STATUS     PATH                           BRAND    IP
   0 global           running    /                              solaris  shared
   6 zone01           running    /tank1/zone01                  solaris  excl
Sol11-1# zonecfg -z zone02
Use 'create' to begin configuring a new zone.
zonecfg:zone02> create
create: Using system default template 'SYSdefault'
zonecfg:zone02> set zonepath=/zones/zone02
zonecfg:zone02> add rootzpool
zonecfg:zone02:rootzpool> add storage dev:/dev/dsk/c2d3s0
zonecfg:zone02:rootzpool> end

zonecfg:zone02> verify
zonecfg:zone02> commit
zonecfg:zone02> exit

今回はゾーンを作成するために必要最小限の設定をしました。必要に応じて、poolの設定などしてくださいね。

ゾーンの作成が終わったら状態を確認します。zone02がconfiguredであることを確認してください。

Sol11-1# zoneadm list -vc
  ID NAME             STATUS     PATH                           BRAND    IP
   0 global           running    /                              solaris  shared
   6 zone01           running    /tank1/zone01                  solaris  excl
   - zone02           configured /zones/zone02                  solaris  excl

ゾーンのインストール

ゾーンの作成が終わったらインストールします。Solaris 11ゾーンのインストールは、global zoneに設定したリポジトリサーバからパッケージをインストールします。
詳細は「Oracle Solaris 11ゾーンを使ってみよう」を参照してください。

Sol11-1#  zoneadm -z zone02 install
Created zone zpool: zone02_rpool
Progress being logged to /var/log/zones/zoneadm.20130604T042222Z.zone02.install
       Image: Preparing at /zones/zone02/root.

 AI Manifest: /tmp/manifest.xml.16aibm
  SC Profile: /usr/share/auto_install/sc_profiles/enable_sci.xml
    Zonename: zone02
Installation: Starting ...

              Creating IPS image
開始 linked: 1/1 done
              Installing packages from:
                  solaris
                      origin:  http://localhost/
ダウンロード                 パッケージ  ファイル  転送 (MB)  速度
完了                               185/185   34338/34338  247.2/247.2  1.4M/s

フェーズ                                  項目
新しいアクションをインストールしています 48160/48160
パッケージ状態データベースを更新しています      完了
イメージ状態を更新しています      完了
スピード検索データベースを作成しています      完了
Installation: Succeeded

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

 done.

       Done: Installation completed in 610.142 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/zone02/root/var/log/zones/zoneadm.20130604T042222Z.zone02.install

ゾーンをインストールすると、最初にゾーン作成時に設定したrootzpoolプロパティに従って、自動でそのゾーン専用のストレージプール(今回の場合、zone02_rpool)が作成されます。
なお、ゾーン作成時のrootzpoolプロパティでadd storageを複数設定すると、ゾーン専用のストレージプールがミラー構成になります。

インストール後のゾーンとストレージプールを確認しましょう。

Sol11-1# zoneadm list -vc
  ID NAME             STATUS     PATH                           BRAND    IP
   0 global           running    /                              solaris  shared
   6 zone01           running    /tank1/zone01                  solaris  excl
   - zone02           installed  /zones/zone02                  solaris  excl
Sol11-1# zpool status zone02_rpool
  pool: zone02_rpool
 state: ONLINE
  scan: none requested
config:

        NAME      STATE     READ WRITE CKSUM
        zone02_rpool  ONLINE       0     0     0
          c2d3s0  ONLINE       0     0     0

errors: No known data errors

インストールが終わったら、ゾーンをbootし、初期設定を行います。
これは通常のゾーンと同じ操作になります。

ゾーンの切り離し(detach)と構成情報の保存

さて、ゾーンの構築ができましたので、このゾーンを別サーバに移行したいと思います。
まずは移行するゾーンを停止します。

Sol11-1# zoneadm -z zone02 shutdown
Sol11-1# zoneadm list -vc

  ID NAME             STATUS     PATH                           BRAND    IP
   0 global           running    /                              solaris  shared
   6 zone01           running    /tank1/zone01                  solaris  excl
   - zone02           installed  /zones/zone02                  solaris  excl

移行対象のゾーンを切り離します。(detach)
ゾーンをdetachすると、そのゾーンのSTATUSが「configured」に変わります。

Sol11-1# zoneadm -z zone02 detach
Exported zone zpool: zone02_rpool
Sol11-1# zoneadm list -vc
  ID NAME             STATUS     PATH                           BRAND    IP
   0 global           running    /                              solaris  shared
   6 zone01           running    /tank1/zone01                  solaris  excl
   - zone02           configured /zones/zone02                  solaris  excl

detachした時点でゾーン専用のストレージプール(zone02_rpool)がexportされています。
ストレージプールを確認してみましょう。zone02_rpoolが存在しません。

Sol11-1# zpool list
NAME    SIZE  ALLOC   FREE  CAP  DEDUP  HEALTH  ALTROOT
rpool  14.8G  10.7G  4.07G  72%  1.00x  ONLINE  -
tank1  14.9G   607M  14.3G   3%  1.00x  ONLINE  -

exportされたストレージプールは、zpool importコマンドで確認できます。
zpool importに何もオプションを指定しない場合、import可能な(exportされた)ストレージプールが確認できます。

Sol11-1# zpool import
  pool: zone02_rpool
    id: 12728710966993426570
 state: ONLINE
action: The pool can be imported using its name or numeric identifier.
config:

        zone02_rpool  ONLINE
          c2d3s0  ONLINE

移行先のサーバでゾーンを構築するために、ゾーンの構成情報を保存します。

Sol11-1# zonecfg -z zone02 export > /tank1/share/zone02.conf

ゾーンの構築と移行元サーバでの作業はこれで終わりです。以降は移行先サーバでの作業になります。

移行先サーバ環境の確認

ここからは移行先サーバでの作業です。まずは、共有ディスクを確認しましょう。

<参考>

今回は移行元サーバ、移行先サーバともに、同一物理サーバ内のゲストドメイン環境で実施しています。Oracle VM Server for SPARCで仮想ディスクをゲストドメイン間で共有する場合には、どちらか一方をRead Onlyに設定する必要がありますが、移行後に移行先サーバでも書き込める必要があります。そこで今回は仮想ディスクを移行元サーバから移行先サーバへ付け替えることによって、共有ディスクを再現しています。
実際の環境では、外部ストレージを使用することがほとんどだと思います。外部ストレージを用いる場合は、そのストレージのマニュアルなどをご確認ください。
もちろん、お勧めの外部ストレージはETERNUSですね。

Sol11-2# format
Searching for disks...done

AVAILABLE DISK SELECTIONS:
       0. c2d0 
          /virtual-devices@100/channel-devices@200/disk@0
       1. c2d1 
          /virtual-devices@100/channel-devices@200/disk@1
       2. c2d2 
          /virtual-devices@100/channel-devices@200/disk@2

Specify disk (enter its number):

移行先サーバの共有ディスクの論理デバイス名はc2d2になります。

移行先サーバでのゾーン作成

移行元で作成したゾーンの構成情報からゾーンを作成します。ここでは移行元のディレクトリをNFSマウントして、ゾーンの構成情報を確認します。
FTPなど任意の方法で移行先サーバにゾーンの構成情報を送信しても可能です。

Sol11-2# mount -f nfs 移行元IPアドレス:/tank1/share /mnt
Sol11-2# ls -lh /mnt

-rw-r--r--   1 root     root         285 Jun  4 15:29 zone02.conf

必要に応じて、移行元の環境に合わせてゾーンの構成情報を更新します。
今回の場合は、移行元と移行先でrootzpoolのディスクID(dX)が異なるので、更新します。

Sol11-2# vi /mnt/zone02.conf
create -b
set brand=solaris
set zonepath=/zones/zone02
set autoboot=false
set ip-type=exclusive
add anet
set linkname=net0
set lower-link=auto
set configure-allowed-address=true
set link-protection=mac-nospoof
set mac-address=auto
end
add rootzpool
add storage dev:/dev/dsk/c2d2s0      ←「c2d3s0」から変更
end

この構成情報を使用してゾーンを作成します。

Sol11-2# zonecfg -z zone02 -f /mnt/zone02.conf
Sol11-2# zoneadm list -vc

  ID NAME             STATUS     PATH                           BRAND    IP
   0 global           running    /                              solaris  shared
   - zone02           configured /zones/zone02                  solaris  excl

ゾーンの組み込み(attach)

ゾーンを作成したら移行元でdetachしたゾーンを組み込みます(attach)。これまでのケースでは、移行元で作成したアーカイブを指定してattachしていましたが、rootzpoolを用いる場合には、アーカイブの指定は必要ありません。

Sol11-2#  zoneadm -z zone02 attach
Imported zone zpool: zone02_rpool
Progress being logged to /var/log/zones/zoneadm.20130604T063023Z.zone02.attach
    Installing: Using existing zone boot environment
      Zone BE root dataset: zone02_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/zone02/root/var/log/zones/zoneadm.20130604T063023Z.zone02.attach

attachすると、ゾーン専用のストレージプール(zone02_rool)もimportされます。

ゾーンとストレージプールの状態を確認します。

Sol11-2# zoneadm list -vc
  ID NAME             STATUS     PATH                           BRAND    IP
   0 global           running    /                              solaris  shared
   - zone02           installed  /zones/zone02                  solaris  excl
Sol11-2# zpool status zone02_rpool
  pool: zone02_rpool
 state: ONLINE
  scan: none requested
config:

        NAME      STATE     READ WRITE CKSUM
        zone02_ rpool  ONLINE       0     0     0
          c2d2s0  ONLINE       0     0     0

errors: No known data errors

ゾーンがインストールされて、ストレージプールもimportできていることが確認できました。
では、このゾーンをbootします。boot後にSTATUSが「running」になっていることを確認します。

Sol11-2# zoneadm -z zone02 boot
Sol11-2# zoneadm list -vc

  ID NAME             STATUS     PATH                           BRAND    IP
   0 global           running    /                              solaris  shared
   1 zone02           running    /zones/zone02                  solaris  excl

このように、rootzpool機能を用いることによって、従来までのdetach/attachで必要だったdetach後のアーカイブ作成が不要になりますね。

さて、rootzpool機能は、共有ストレージ上にゾーンを作成しますので、サーバが壊れたときに別サーバに切り替えてゾーンがbootできるのではないかという期待があります。
そこで、移行先サーバ(Sol11-2)が壊れたことを想定して、移行元サーバ(Sol11-1)へ再度ゾーンを移行してみたいと思います。

応用編

緊急時のゾーン移行

サーバが壊れたことを想定して、ゾーンをdetachせずにSol11-2を停止します。
この状態でSol11-1からストレージプールがimportできるか確認します。

Sol11-1# zpool import
  pool: zone02_rpool
    id: 12728710966993426570
 state: ONLINE
status: The pool was last accessed by another system.
action: The pool can be imported using its name or numeric identifier and
        the '-f' flag.
   see: http://support.oracle.com/msg/ZFS-8000-EY
config:

        zone02_rpool  ONLINE
          c2d3s0  ONLINE

ストレージプールは認識されていますが、別システムで使われていたというメッセージが表示されています。
この状態でattachしてみます。

Sol 11-1# zoneadm list -vc
  ID NAME             STATUS     PATH                           BRAND    IP
   0 global           running    /                              solaris  shared
   - zone01           configured /tank1/zone01                  solaris  excl
   - zone02           configured /zones/zone02                  solaris  excl
Sol11-1# zoneadm -z zone02 attach
cannot import 'zone02_rpool': pool may be in use from other system,
it was last accessed by sol11-2 (hostid: 0x84fb6a19) on Fri Jun  7 10:31:20 2013
: pool may already be in use
zoneadm: zone 'zone02': failed to verify and/or setup all required zone zpool resources
zoneadm: zone 'zone02': Use the '-x force-zpool-import' option of zoneadm(1M) 'attach' to forcibly re-use zpool resources
zoneadm: zone 'zone02': attach not done
Manuall y correct the problem(s) reported above and attach the zone with:

        zoneadm -z zone02 attach
or uninstall the zone with:
        zoneadm -z zone02 uninstall

予想通りではありますが、失敗しました。
失敗はしましたが、メッセージをよく見るとヒントが書かれています。「-x force-zpool-import」オプションを指定すればattachできそうです。
再度チャレンジしたいところですが、zone02のSTATUSが「incomplete」になっていますので、このままではattachできません。まずはuninstallして、「configured」の状態に戻します。

Sol11-1# zoneadm -z zone02 uninstall
Are you sure you want to uninstall zone zone02 (y/[n])? y
Progress being logged to /var/log/zones/zoneadm.20130607T013355Z.zone02.uninstall

「configured」の状態に戻ったら、再度attachします。今度は-xオプションを指定します。

Sol11- 1# zoneadm -z zone02 attach -x force-zpool-import
Imported zone zpool: zone02_rpool
Progress being logged to /var/log/zones/zoneadm.20130607T013609Z.zone02.attach
    Installing: Using existing zone boot environment
      Zone BE root dataset: zone02_rpool/rpool/ROOT/solaris
                     Cache: Using /var/pkg/publisher.
  Updating non-global zone: Linking to image /.
処理中 linked: 1/1 done
  Updating non-global zone: Auditing packages.
このイメージは更新の必要はありません。

  Updating non-global zone: Zone updated.
                    Result: Attach Succeeded.
Log saved in non-global zone as /zones/zone02/root/var/log/zones/zoneadm.20130607T013609Z.zone02.attach

今度は成功しました。
ゾーンとストレージプールの状態を確認しましょう。

Sol11-1# zoneadm list -vc
  ID NAME             STATUS     PATH                           BRAND    IP
   0 global           running    /                              solaris  shared
   - zone01           configured /tank1/zone01                  solaris  excl
   - zone02           installed  /zones/zone02                  solaris  excl
Sol11-1# zpool status zone02_rpool
  pool: zone02_rpool
 state: ONLINE
  scan: none requested
config:

        NAME      STATE     READ WRITE CKSUM
        zone02_rpool  ONLINE       0     0     0
          c2d3s0  ONLINE       0     0     0

errors: No known data errors

ストレージプールもimportされていますね。
ゾーンがbootできることも確認します。

Sol11-1# zoneadm -z zone02 boot
Sol11-1# zoneadm list -vc

  ID NAME             STATUS     PATH                           BRAND    IP
   0 global           running    /                              solaris  shared
  13 zone02           running    /zones/zone02                  solaris  excl
   - zone01           configured /tank1/zone01                  solaris  excl

このように、事前にゾーンの構成を作成しておけばサーバが壊れた場合でも別サーバでゾーンがbootできますので、もしものときに備えて、複数のサーバに分散してゾーンを構築しておくと安心ですね。
ただ、この方法はあくまで緊急時の対応ですので、通常の移行時には必ずdetachするようにしてください。また、ストレージ側の障害なども考えられますので、必ずバックアップも取得するようにしてくださいね。


応援メッセージはtwitterにて、ハッシュタグ #fjsparcOpen a new window までお願いします。