StepbystepS10Zone

Solarisステップbyステップページに戻る

目次

Table of Contents

Solaris 10 Zone

1.Zones 概要

1)Zones の概念

Solaris Zonesは、物理的にひとつのserver上に、複数の仮想serverを実現する画期的な新機能です。

つまり、serverがひとつしかなくても、複数の仮想serverによって、複数のシステムを独立、分離した

状態で運用することが可能です。それぞれの仮想serverは、設定、セキュリティ、管理、システムリソース

を含め、お互いに影響を与え合うことなく動作します。この機能により、ユーザは、多数のマシンに対する

コストや管理の複雑さから解放され、より大規模でスケーラビリティを備えたserver machine上で、

複数のシステムを統合的に運用することが可能になるのです。

この仮想serverをzoneと呼びます。各zoneは、他のzoneから隔離されておりお互いを意識することは

ありません。各々のzoneは、異なるroot passwordを持ち、各zoneのroot userは、自分のzoneの

外側に対しては何もすることができません。

2)global zone と non-global zone

zoneには、"global zone"と "non-global zone"の2種類があります。

Solars10をインストールしたその環境がglobal zone、

その上に構築される仮想serverがnon-global zoneです。

  • 特徴
    • "global zone"

      non-global zoneを定義、インストール、管理、アンインストールし、

      ハードウェアのbootができる唯一の環境。

      すべてのzoneのプロセスやファイルにアクセスすることができます。

  • "non-global zone"

    他のzoneの存在を全く認識しません。non-global zone自身の、

    host name, file system,IP addressなどを持ちます。

    global zoneの上に、複数のnon-global zoneを作成することができます。

3)Zones 開発エピソード

Andrew Tucker -- Solaris Zones Architect のコメントより抜粋

「Zonesの元々のアイディアは、数年前に、我々がサーバの統合について
顧客と話をしていた時に始まりました。その時点で、Solaris OSには、いくつかの
リソース管理機能、例えば、管理者が異なるアプリケーションに対して、どのように
CPUを割当てるかを制御できるようにする、といった機能が追加されていました。
顧客は、自分たちのサーバの利用率を向上させることに、とても興味はあったのだど、
ひとつのマシン上で複数のアプリケーションを"stack"したり、統合することができな
かった。その原因のうちいくつかは、リソース割当てに関するものだったが、多くの
ところは、アプリケーションを、configuration, security, そして administrationの
点においても独立させる必要があったからでした。
これらの問題を解決するために、開発したのがZonesなのです。」

2.zoneの作成 (zonecfg)

non-global zoneを作成する手順を説明します。

<index> 設定項目、オペレーションは、次の順番になっています。

1.zone name                  2)		
2.create                     3)
3.zone path                  4)
4.inherit-pkg-dir            5)-7)
5.file system                8)-12)
6.autoboot value             13)
7.network virtual interface  14)-17)
8.resource pool              18)
9.zone-wide resource control 19)-22)
10.comment                   23)-27)
11.export                    28)
12.verify                    29)
13.commit                    30)
14.exit                      31)

<step by step>

説明を読みながら、ご自分の環境でオペレーションをお試しください。

準備)あらかじめ、superuserになるか、Primary Administrator roleになっておきます。

1)現在のzone設定について状況を確認します。

# zoneadm list -vc

次の表示より、ユーザーが何もしなくても、システムがglobal zoneとして 既に、稼働状態にあることがわかります。

 ID NAME             STATUS         PATH                          
  0 global           running        /                             

以下、この環境へ新たにnon-global zoneを作成する手順を説明します。

2)最初に、zone nameを登録します。

command lineに、次のように入力します。

ここでは、myzone という名前のnon-global zoneを登録します。

各zone nameはuniqueでなければなりません。

# zonecfg -z myzone 

新しいzoneを定義する都度、次のようなシステムメッセージが

表示されます。エラーメッセージではありません。

myzone: No such zone configured
Use 'create' to begin configuring a new zone.

3)新しいzone(ここでは myzone)の作成を行います。   プロンプトに作業対象となるzone nameが表示されます。

zonecfg:myzone> create

4)myzoneのzone pathを設定します。

zone pathには、各non-gloal zoneのrootとなるpathで、

global zoneに実存するpathを割り当てます。

ここでは、例として、/export/home/myzone に設定します。

zonecfg:myzone> set zonepath=/export/home/myzone

5) shared file system の設定を行います。

"inherit-pkg-dir"とは、packaged softwareを含むディレクトリを

non-global zoneでも使用できるよう、共有するためにmountする

shared file systemです。

ユーザが任意のディレクトリを設定できるようになっているほか、

default inherit-pkg-dir resources として、次の4つが、

あらかじめシステムにより設定されています。

         /lib
         /platform
         /sbin
         /usr

mount optionは、read-only loopback file system (LOFS)固定に

なっておりユーザが指定する必要はありません。

zonecfg:myzone> add inherit-pkg-dir

6) inherit-pkg-dirの設定プロンプトに変わります。

global zoneにある/opt/sfwを、read-onlyモードでmyzoneにmount

します。

zonecfg:myzone:inherit-pkg-dir> set dir=/opt/sfw

[注]zone's packaging databaseが、inherit-pkg-dirに登録された

packaged softwareを保持するので、zoneadmでnon-global zoneが

インストールされた後には、これらのpackaged softwareを修正したり、

削除することはできません。

7) shared file system の設定を終了します。

zonecfg:myzone:inherit-pkg-dir> end

[注]5)?7)までの設定は、shared file systemの数だけ、

繰り返し行うことができます。

  8)今度は、file systemを登録します。

"fs"とは、各non-global zoneで自由に設定できる仮想file systemで、

read-writeに用いられます。各non-global zoneは、複数のfsを持つことが

可能であり、他のnon-global zoneからは完全に独立しています。

global zoneに実在するpathをnon-global zoneの任意のmount point(path)に

設定し作成します。

fsには、loopback file system (LOFS)を始め、様々なoptionがあります。

zonecfg:myzone> add fs

9)file system設定のプロンプトに変わります。

myzone側のfile systemのmount pointとして、ここでは/usr/localを

指定します。(/usr/localはmyzoneのpathとなります。)

zonecfg:myzone:fs> set dir=/usr/local

10)9)で設定したmount point /usr/localへ、global zoneのfile systemに実存する/opt/localをmountします。

これで、myzoneにて、/usr/local file systeを読み書きできるようになります。

zonecfg:myzone:fs> set special=/opt/local

11)このfile systemの typeを指定します。

このように、global zoneに実在するfile systemを、新たに仮想file system

として、non-global zoneで利用する場合には、loopback file system(lofs)を

設定します。

zonecfg:myzone:fs> set type=lofs

12)file system の設定を終了します。

zonecfg:myzone:fs> end

endを実行するとfile systemの設定モードを抜けます。

[注]8)?12)までの設定は、file systemの数だけ、

繰り返し行うことができます。

13)autoboot valueの設定。

デフォルトはfalseですが、ここではglobal zoneがbootしたら

myzoneも自動的にbootするよう、trueに設定します。

zonecfg:myzone> set autoboot=true

14) network virtual interfaceを登録します。

[注]14)?17)の設定には、myzone専用として割り当て可能な新しい

IP addressが必要となります。

もし、利用可能なIP addressがあいていない場合は、

トライアルが目的のオペレーションなので、これらのステップは

省略しても構いません。

但し、実環境でzoneを使用する場合には、必ず設定を行ってください。

各々のzoneは、globalもnon-globalも、networkへの接続が必要で、

それぞれ専用のIP addressを持つ必要があります。 

zonecfg:myzone> add net

15) IPaddressを設定します。

(例)として、111.111.111.111を使用しました

zonecfg:myzone:net> set address=111.111.111.111

16) 15)で設定したIPaddressに対応する physical device typeをnetwork interfaceにセットします。

ここでは、hme0とします。

[注] physical device の確認の方法。

コマンドラインにて

     # ifconfig -a

    出力例: 

	lo0: flags=1000849<UP,LOOPBACK,RUNNING,MULTICAST,IPv4> mtu 8232 index 1
	        inet xxx.xxx.xxx.xxx netmask ffff0000 
	hme0: flags=1000863<UP,BROADCAST,NOTRAILERS,RUNNING,MULTICAST,IPv4> mtu 1500 index 2
	        inet xxx.xxx.xxx.xxx netmask ffff0000 broadcast xxx.xxx.xxx.xxx
zonecfg:myzone:net> set physical=hme0

17) network virtual interfaceの設定を終了します。

zonecfg:myzone:net> end

[注]14)?17)までの設定は、network interfaceの数だけ、

繰り返し行うことができます。

18)resource poolとの関連づけを行います。

(例)として、default poolと結びつけます。

[注]resource poolsは、Resource Managementのひとつで、

system resoureceを分割管理し、各々のworkloadがお互いに

影響を与え合わないようにする機能です。

詳細は、後日、このコーナーで紹介する予定です。

そのときに、zoneとの関連を明らかにしていきます。

zonecfg:myzone> set pool=pool_default

19) zone-wide resource controlを設定します。

zonecfg:myzone> add rctl

20) ここでは、CPU resourceを示すzone.cpu-sharesを登録します。

zonecfg:myzone:rctl> set name=zone.cpu-shares

21) zone.cpu-sharesに設定値を与えます。

()内のパラメータは順に、privilege, share limit, 負荷が、敷居値に

達したときのactionとなっています。

zonecfg:myzone:rctl> add value (priv=privileged,limit=20,action=deny)

22) resource controlの設定を終了します。

zonecfg:myzone:rctl> end

23) attrというresourece typeを使用してcommentの登録をします。

zonecfg:myzone> add attr

24) commentという名称をname設定します。

zonecfg:myzone:attr> set name=comment 

25) typeには、stringを設定します。

zonecfg:myzone:attr> set type=string

26) zoneの説明コメントのための値を設定します。

zonecfg:myzone:attr> set value="This is my work zone."  

27) commentの設定を終了します。

zonecfg:myzone:attr> end   

28) ここまでの設定を確認することができます。

当オペレーションは省略可能です。

zonecfg:myzone:attr> export  

次のように設定値が表示されます。(例)

zonecfg:myzone> export    
create -b
set zonepath=/export/home/myzone
set autoboot=true
set pool=pool_default
add inherit-pkg-dir
set dir=/lib
end
add inherit-pkg-dir
set dir=/platform
end
add inherit-pkg-dir
set dir=/sbin
end
add inherit-pkg-dir
set dir=/usr
end
add inherit-pkg-dir
set dir=/opt/sfw
end
add fs
set dir=/usr/local
set special=/opt/local
set type=lofs
end
add rctl
set name=zone.cpu-shares
add value (priv=privileged,limit=20,action=deny)
end
add attr
set name=comment
set type=string
set value="This is my work zone."
end

29) ここまでに登録した設定の整合性を、システムが検証します。

zonecfg:myzone> verify   

30) 設定をメモリからstable storageへ書き込みます。

zonecfg:myzone> commit  

31) zonecfgを終了します。

zonecfg:myzone> exit

これで一連の、non-global zone設定オペレーションが完了し、

zonecfgモードから抜けます。

32) command lineにて、1)で行ったzoneの状況確認

オペレーションを再度実行します。 

# zoneadm list -vc

1)と比較すると、myzoneという名称のnon-global zoneが

追加登録されていることが分かります。

 ID NAME             STATUS         PATH                          
  0 global           running        /                             
  - myzone           configured     /export/home/myzone           

以上が、non-global zone作成の為の基本的な流れです。

補足)今回作成したnon-global zone(myzone)は、次回の説明オペレーションで

   使用するので、このままの状態にしておいてください。

   ユーザは、logoutしても問題ありません。

   事情により、non-global zoneを削除したい場合は、次のオペレーション

   を行ってください。

   ここでは、確認を求めてから削除するオペレーションを紹介します。

# zonecfg -z myzone delete

 

   次の表示に対し、yを入力してください

Are you sure you want to delete zone myzone (y/[n])? y

32)のオペレーションで、myzoneが削除されていることが確認できます。

3.zoneの起動 (zoneadm)

non-global zoneをinstall,bootする手順を説明します。

<step by step>以下の

オペレーションは、global zoneのコマンドラインにて実行してください。

<index> この章の設定項目、オペレーションは、次の順番になっています。

1.Install a zone       1)-2)
2.Boot a zone          3)-4)
3.Reboot a zone        5)-7)
4.Halt a zone          8)-9)
5.Uninstall a zone     10)-11)

<step by step>

説明を読みながら、ご自分の環境でオペレーションをお試しください。

準備1)あらかじめ、superuserになるか、Primary Administrator roleに

    なっておきます。

準備2)前回作成したmyzoneで設定した次の4つのdirectoryが、

    global zoneに存在しなければ、作成しておきます。

/export/home/myzone (permission 700)
/opt/sfw
/opt/local
/usr/local
	

[注]既に存在すればこのステップは必要ありません。

# mkdir /export/home/myzone; mkdir /opt/sfw; mkdir /opt/local; mkdir /usr/local

 

# chmod 700 /export/home/myzone

 

復習)現在のzone設定について状況を確認します。

# zoneadm list -vc

前回作成したmyzoneというnon-global zoneが、configuredの状態に

なっています。

 ID NAME             STATUS         PATH                          
  0 global           running        /                             
  - myzone           configured     /export/home/myzone           

1)既にconfiguredの状態になっているmyzoneに、実際の環境を

  反映させるためにinstallを行います。

# zoneadm -z myzone install

次のようなメッセージが出力されます。

myzoneのroot pathの下に、zoneのroot file systemに必要なファイルと

ディレクトリが作成されます。

なお、このオペレーションが完了するのに、30分?1時間以上かかる

場合があります。

[注]'pool_default'は、現時点ではactiveになっていないので、

WARNINGメッセージが出力されます.

これ以降のオペレーションでも、同様のWARNINGが検出されますが

この章では無視してください。

zoneadm: zone 'myzone': WARNING: pools facility not active; 
zone will not be bound pool_default'.
Preparing to install zone <myzone>.
Creating list of files to copy from the global zone.
Copying <2397> files to the zone.
Initializing zone product registry.
Determining zone package initialization order.
Preparing to initialize <1016> packages on the zone.
Initializing package <527> of <1016>: percent complete: 51%   
===> install完了時に最後の2行は、次のように変わります。
Initialized <1016> packages on zone.                                 
Successfully initialized zone <myzone>.      

[注]もし、エラーメッセージが出力され、zoneのinstallに失敗した

  場合には、コマンドラインにて"zoneadm list -vc"を実行し、

  myzoneのSTATUSを確認します。もし、STATUSがconfiguredの

  ままならcommand実行中に不具合が発生した可能性があるので

  1)のオペレーションを再度行ってください。。

STATUSがincompleteの場合は次のオペレーションによりuninstallを

実行した後、installオペレーションで出力されたメッセージに

従って修正を行った後、再度1)のオペレーションを行います。

uninstallの方法は、下記10)を参照してください。

2)install後のzoneのSTATUSを確認します。

# zoneadm list -vc

前回作成したmyzoneというnon-global zoneが、installedの状態に

なっています。

 ID NAME             STATUS         PATH                          
  0 global           running        /                             
  - myzone           installed      /export/home/myzone           

3)bootすることにより、zoneをrunningの状態にします。

  zoneのbootはここで紹介したinstalled STATUSの他に

  ready STATUSからでも可能です。

# zoneadm -z myzone boot

4)boot後のzone設定について、状況を確認します。

# zoneadm list -vc

下記のように、表示されます。(例)

STATUSがinstalledからrunningの状態になっています。

また、myzoneに対して、固有のzoneID(ここでは1)がシステムにより

割り当てられます。

 ID NAME             STATUS         PATH                          
  0 global           running        /                             
  1 myzone           running        /export/home/myzone           

以上が、non-global zoneを起動するまでの基本的な流れです。

以降に、non-global zoneを必要に応じて、reboot, halt, uninstallするための

オペレーションを記します。

次章「4.zoneへのlogin」へ進む場合には、uninstallは実行しないでください。

もし、uninstallした場合には、再度install, bootオペレーションが必要となります。

5)rebootの方法。

  現状のSTATUSがrunningになっていることを確認します。

#  zoneadm list -vc
 ID NAME             STATUS         PATH                          
  0 global           running        /                             
  1 myzone           running        /export/home/myzone           

6)rebootを実行します。しばらくすると、コマンドプロンプトが戻ってきます。

#  zoneadm -z myzone reboot

7)現状のSTATUSが再びrunningになっていることを確認します。

#  zoneadm list -vc
 ID NAME             STATUS         PATH                          
  0 global           running        /                             
  2 myzone           running        /export/home/myzone           

[注]global zoneのIDは、常に0で固定ですが、non-global zoneは、

  bootの都度、新しいIDがシステムにより自動的に割り当てられます。

8)haltの方法。

# zoneadm -z myzone halt   

9)halt後のzone設定について、状況を確認します。

# zoneadm list -vc

下記のようにSTATUSがrunningからinstalledに戻っています。

また、zoneIDも取り消されています。

 ID NAME             STATUS         PATH                          
  0 global           running        /                             
  - myzone           installed      /export/home/myzone           

10)Uninstallの方法。

  必ず、zoneがinstalled STATUSの状態で実行してください。

(running のままだとエラーになります。)

#  zoneadm -z myzone uninstall -F

11)現在のzoneの状態を確認します。

#  zoneadm list -vc

次のように、install前の状態に戻っています。

 ID NAME             STATUS         PATH                          
  0 global           running        /                             
  - myzone           configured     /export/home/myzone