StepbystepS10Zoneのソース

#freeze
[[Solarisステップbyステップページに戻る>stepbystep]]

目次
#contentsx
----
** Solaris 10 Zone [#yc9ecd22]

***1.Zones 概要 [#y47c81ad]


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) [#n42edd77]

 
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) [#ab5f0544]

 
~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