2013年7月23日
Oracle Solarisゾーンには、ゾーンを別サーバに移行する方法として、以下の二つがあります。
一つ目の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し、初期設定を行います。
これは通常のゾーンと同じ操作になります。
さて、ゾーンの構築ができましたので、このゾーンを別サーバに移行したいと思います。
まずは移行するゾーンを停止します。
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
ゾーンを作成したら移行元で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にて、ハッシュタグ #fjsparc までお願いします。