・Solaris Containers

 Solaris Zones について解説する前に、Solaris Containers について簡単に
  説明する。
 Solaris 10 では、Solaris Containers と呼ばれる、「アプリケーション
 実行環境」が新機能として提供された。
 単に、「アプリケーション実行環境」と言ってしまうと、頭の中に「?」が
 駆け巡ると思うが、本稿を読み終える頃には納得して頂けることと思う。
 
 Solaris Containers を、構成する大きな要素として、次の 2 つの機能があ
 る。
 
 	・Solaris Zones
 	・Solaris 10 Resource Manager 
 
 Solaris Zones は、Zone/Zones とも呼ばれており、単一のシステム上に隔離
 された「アプリケーション実行環境」を提供する機能である。
 一方、Solaris 10 Resource Manager は、アプリケーションに必要なだけの資
 源を提供したり、制限をするなど resource utilization を提供する機能とな
 っている。
 
 Solaris 10 では、どちらも単体で利用できる機能として提供されているが、
 これら 2 つの機能を組み合わせて実現される「アプリケーション実行環境」
 が、Solaris Containers という概念で包括される。
 
 では、Solaris 10 では、アプリケーションを実行するために Solaris 
 Containers の知識が必要になるのか?それを把握しなければ、いままでのよ
 うにアプリケーションを動作させることはできなくなるのか?
 
 実は、Solaris 10 では Zones という概念が、それなりに重要となる。
 種を明かしてしまうと、ユーザ自身が、Solaris Zones を意識していなくて
 も、インストールされた環境は、すでに、zone として構成されている。
 後ほど解説するが それ自身は、「global zone」 と呼ばれ、全ての zone の
 基点となる zone として定義されており、今後、Solaris Zones を構築しよう
 と用意されたインストール完了直後のクリーンな Solaris 10 環境も、
 Solaris Zones と Solaris 10 Resource Manager で構成される一つの
 「アプリケーション実行環境」ということになる。

 ここまで、Solaris Containers について簡単に説明したが、では、
 Solaris 10 では、従来のように簡単にアプリケーションを動作させることは
 できないのではないか?と考えるかもしれない。
 だが、心配ない。
 Solaris Zones と Solaris 10 Resource Manager を意識しなくてもいままで
 どおり Solaris 10 を Solaris として利用できる。
 また、存在すら知らなくとも何の問題もないが、それでは、Solaris 10 の
 魅力が半減してしまうので、是非とも興味を持ってもらいたいと思う。
 
・Solaris Zones と Dynamic System Domain
 
 Solaris Zones については、2003年に「Project Kevlar」 として実装が発
 表され、すでに多くの読者が概要を掴んでいるかと思うが、ソフトウェアで
 論理パーティションを可能とする機能となっている。

 類似した機能としては、Sun は、すでに、「Dynamic System Domain」 と呼
 ばれている機能をハイエンドサーバと一部のミッドレンジサーバで提供して
 いるが、これは、筐体内に搭載されている複数の CPU や I/O ボードを物理
 的にグループ分けし、それぞれの区画を単一のシステムとして扱うことがで
 きる機能となっている。
 そのため、複数のバージョンが異なる Solaris 環境を同一筐体内に構築す
 ることが可能となっている。
 しかし、この、Dynamic System Domain を利用するには、それを前提に設計
 されたハードウェアが必要となり、もともとは、Sun Enterprise 10000
 (codename: Starfire)で実現された機能である。
 Dynamic System Domain では、物理的なパーティショニングが可能となる点
 が特徴となる。
 一方、Solaris Zones は、OS がソフトウェアのみで提供する機能であり、
 Solaris 10さえ動作していれば、同一筐体内に複数の Solaris 環境を構築
 することが可能となる。
 さらに、この機能を使うためにハードウェアリソースを新たに追加する必要
 はまったくなく、まさに、"lightweight Dynamic System Domain" と言って
  も過言ではないだろう。
 (ただし、Solaris Zones は、Dynamic System Domain を置き換えるものでは
  ないことに注意して頂きたい。)
 
 しかし、一つだけ気にしなければならないのは、Dynamic System Domain の
  物理的なパーティショニングとは異なり、論理的なパーティショニングであ
  るという点である。
 Solaris Zones の論理パーティショニングでは、CPU や I/O などのシステム
 リソースを共有するため、それなりの制限がある。
 Dynamic System Domain のように、分割された区画で、異なるバージョンの
 Solarisを動かすこともできないし、Solaris 以外の別な OS を動かすことも
 できない。
 このあたりの制限については、後ほど説明する。
 まずは、Solaris Zones から追って行こう。

・Solaris Zones 

 Solaris Zones では、「zone」という言葉の意味を踏まえておく必要がある。
 図(1)を参照して頂きたい。
 これが、Solaris Zones の概要となる。
 
 *図(1):serv-con-zones.epsi.gif
 
 「zone」 には、「global zone」と「non-global zone」の 2 種類が存在し
 ており、それぞれについては次のような意味を持つ。
 (図(1)では、apps zone, users zone, work zone が  non-global zone と
  なる)
 
 	・global zone
 	
 	 global zone は、non-globale zone が配置される、zone となる。
     冒頭にも書いたが、起動した Solaris 10 自体が、すでに 
     global zone として構成されており、Solaris Zones の基点となる
     zone である。
 	 次のコマンドを実行することで、動作しているしていないに関わ
     らず、存在している zone を確認できる。
 	 
 	 	$ zoneadm list -vc
 	 
 	 この結果から、Solaris 10 はすでに zone として構成されているこ
     とが理解できるだろう。
 	 
 	-----------------------------------------------
		$ zoneadm list -vc
		ID NAME             STATUS         PATH
		 0 global           running        /
 	-----------------------------------------------
 	
   そのため、システム内に存在できる global zone は、後にも先にも 1つ
   しかなく、複数存在させることはできない。
   また、global zone は、すべての non-global zone に干渉することが可能
   な zone であり、逆に non-global zone は、global zone に干渉すること
   はできない。
    (干渉できなければ、non-global zone の管理ができないということにな
 	るため、Solaris Zones 機能として成り立たないことになる)
 	 
 	・non-global zone 
 	
 	 global zone 内に作成した、zone を non-global zone と呼ぶ。
   この zone が、論理パーティションとして分割された区画となり、この区画
   で global zone とは別な Solaris 環境が動作することになる。
   global zone も含め、他の zone には一切干渉できない隔離された区画と
   なる。
      non-global zone から zone リストを表示してみると global zone や、
      その他の zone は見えない。
      
		--
		# zoneadm list -vc
		  ID NAME             STATUS         PATH                          
		   1 TestZone01       running        /                
		--

 	 non-global zone は、イメージ的には新しいシステムとして動作することに
 	 なる。よって、初期の環境設定等も global zone とは別に行う必要がある。
 	 作成した non-global zone の数だけ、新規システムが増えたと思ってよいだ
 	 ろう。
 	 
 	 また、そのようなことは考えないと思うが、non-global zone を基点とし、
 	 その中に non-global zone を作成することはできない。
 	 non-global zone を作成できるのは、global zone 上のみである点に注意
 	 する必要がある。
 	 当然、non-global zone を global zone にすることもできない。
 
 以上が、Solaris Zones で定義されている zone の種類となる。
 作成可能な non-global zone の最大値は、8192 となっているが、実際には資源
 の問題等もあるため実現不可能な数であるが、1 つや 2 つではないという安心
 感は得られただろう。
 筆者が確認して事例として、
 
 		・Sun labs での検証として UltraSPARC-III 750MHz 4CPU の
        システムに 500 個の non-global zone を作成

 		・Sun の Pre-Sales Systems Engineer である、
        John Clingan 氏の blog では、以下の数値を達成している
        ことが報告されている
		  (http://blogs.sun.com/roller/page/jclingan)
 		 
 		 Ultra 10 1 CPU/1GB RAM/31GB Disk の環境に 190 zone
 		 Sun Fire v880 4 CPUs/8GB RAM/342GB Disk の環境 600 zone
 	 
 ちなみに、non-global zone 1個につき 40MByte のメモリが必要(推奨)とな
 り、当然、動作させるプロセスにより増加してゆくことになる。

・non-global zone でできること、できないこと

 global zone でできることが、そのまま non-global zone で実行できるわけで
 わけではなく、それなりの制限がある点に注意して頂きたい。
 Solaris Zones は、あくまでアプリケーション実行環境を隔離するための仕組み
 という認識で利用するべきだろう。
 カーネルは、global zone で提供されるものを利用し、non-global zone 毎に
 提供されない。
 このため、カーネルパラメタのチューニングや、ドライバなどのカーネルモジュール
 をインストールなどが zone 毎に行えないので、動作可能なアプリケーションなど
 にもそれなりの制限があり注意が必要となる。
 物理的なデバイスに依存するようなものも利用できるものと利用できない
 ものがあるので注意が必要となる。
 また、NFS サーバとして構成できない、DHCP クライアントとして構成できない
 などの制限もある。

 
・zone 作成の準備

 まずは、最小の手順で zone を作成する手順を紹介する。
 実際、この方法で zone を構築してみるとよい。
 zone を利用するにあたり、次の 3 つのコマンドを把握しておく必要がある。
  
  	zoneadm	non-global zone 管理用のプログラム
  	zonecfg	non-global zone の構成を作成するプログラム
  	zlogin		non-global zone へログインするためのプログラム
  	
 これらのうち、zone 作成に必要となるのは、zoneadm と zonecfg である。
  
・zone 作成の流れ

  簡単に、zone 作成の流れを説明すると、次のようになる。
 
 	Step1.)# zonecfg -z ZONENAME
			新規 zone 作成の指示
				  ↓
 	Step2.)zonccfg の内部コマンドを利用して、zone の環境設定を実施
 			create コマンドの実行
 				    1. zonepath の設定
 				    2. 利用する network の設定
 				    3. ネットワークインターフェース登録
 			         ↓4. 設定内容の確認
 				    5. verify
 				    6. 設定内容の commit

 	Step3.)# zoneadm -z ZONENAME install
			zonecfg で作成した zone にシステムを install
					
				  ↓ 	
 	Step4.)# zoneadm -z ZONENAME boot
				zone の起動
				 	
  このような流れとなる。
  				
 では、各作業の詳細を順に追っていくことにする。	

 Step1.)
  zone を作成するために、最初に実行しなければならないのが次のコマンドである。
  
  	# zonecfg -z [Zone名]
  	
  zone名に指定された名前を持つ zone が存在しない場合は、次のようなメッセージ
  が表示され、指定された名前を持つ、新しい Zone としての設定が可能となる。
  本稿では、zone 名を TestZone01 として設定する。

		--
		# zonecfg -z TestZone01
		TestZone01: そのような構成済みゾーンはありません
		'create' を使用して、新しいゾーンの構成を開始します。
		zonecfg:TestZone01> 
		--
  
  また、すでに、指定した zone 名が存在する場合は、その zone のコンフィグレー
  ション・モードとなる。
  
  Step2.)
  Step2 では、TestZone01 の環境設定を行うため、作業内容を順を追って説明する。
  
    1. TestZone01 の作成することを示す create コマンドを実行する。
    create コマンドを実行することで、TestZone01 の環境設定が可能となる。

		--
		zonecfg:TestZone01> create
		--
				
	2.zone の / となるディレクトリを zonepath として指定する。
	 この時点で、指定するディレクトリは存在しなくても構わない。
	 zone 作成過程で、ディレクトリを自動的に作成してくれるからだ。
	
	global zone の /TestZone01 ディレクトリを non-globalzon である TestZone01
	の / (root) ファイルシステムとして利用するよう定義する。
      non-globalzone の / として利用されるディレクトリの配置場所については、
      特に明確な規約などはなく、管理者が管理しやすい場所に作成すれば良いだろう。
     (本稿では、説明を簡略化するため / 上に作成している)
	 
		--
		zonecfg:TestZone01> set zonepath=/TestZone01
		--

	ファイルシステムは、global zone 上のファイルシステムを利用する。
    non-global zone で / となる領域(ディレクトリ)を作成し、それを lofs 
    として、mount し利用することになる。
	
	3. ネットワークインターフェース登録

	 TestZone01 にネットワークインターフェースを設定する。

	 ネットワークの設定については、物理インターフェースが一つでもあればよい。
 	 non-global zone は、それを共有することで、複数のネットワークインター
         フェースを持つことができる。
        もちろん、zone 用に物理インターフェースを増設し、それに結びつけることも
         可能であるが、その場合でも、物理インターフェースを直接ではなく、論理イン
         ターフェースを作成して利用することになる。
        そのため、global zone <-> non-global zone 間や non-global zone <-> non
         global zone 間では、loopback インターフェースを利用した通信となるため
         snoop 等によるパケットが採取できない。

	 では、ネットワークインターフェースの作成方法を見ていこう。
	 add net コマンドで、ネットワーク情報を追加することを指示し
	 set address コマンドで、インターフェースに割り当てる IP address を
	 指定する。そして、指定された IP address をバインドさせる、物理インター
     フェース名を set physical コマンドで指定する。
	 
	 イメージ的には、次のようになる。
	 
	   eri0    → global zone で利用されている物理インターフェース
                           set physical コマンドで指定する。     
	    └ eri0:n → non-global zone で利用される論理インターフェース
                           このような形で論理インターフェースが作成される
              論理インターフェースの番号(n)は、自動適に採番さ
              れる。
	      └ 192.168.0.202 →割り当てられる IP アドレス
                                      set address コマンドで指定

	 問題がなければ、最後に end コマンドを実行し、ネットワーク設定の終了
	 を指示する。
	 
		--		
		zonecfg:TestZone01> add net
		zonecfg:TestZone01:net> set address=192.168.0.202
		zonecfg:TestZone01:net> set physical=eri0
		zonecfg:TestZone01:net> end
		--
 
 	 non globa-zone で利用される論理ネットワークインターフェースは、
      non-global zone 起動時に global zone に作成される。
	 この段階では、まだ、確認することはできないが、TestZone01 起動後に
	 global zone で ifconfig -a を実行してみると良いだろう。
	 global zone では、以下のように確認できる。
--
$ ifconfig -a
lo0: flags=1000849 mtu 8232 index 1
        inet 127.0.0.1 netmask ff000000
lo0:1: flags=1000849 mtu 8232 index 1
        zone TestZone01 
        inet 127.0.0.1 netmask ff000000
eri0: flags=1000843 mtu 1500 index 2
        inet 192.168.0.200 netmask ffffff00 broadcast 192.168.0.255
eri0:1: flags=1000843 mtu 1500 index 2
        zone TestZone01
        inet 192.168.0.202 netmask ffffff00 broadcast 192.168.0.255
--

	  lo0:1 および eri0:1 が、TestZone01 に割り当てられる論理インターフェース
	  となり、それぞれに zone TestZone01 と情報が付加され、 non-global zone の
	  zone 名が識別できるようになっている。
	  また、non-global zone である TestZone01 での ifconfig -a の実行結果は
   次のようになる。
	  当然、global zone のインターフェース情報は見えない。

--
# ifconfig -a
lo0:1: flags=2001000849 mtu 8232 index 1
        inet 127.0.0.1 netmask ff000000
eri0:1: flags=1000843 mtu 1500 index 2
        inet 192.168.0.202 netmask ffffff00 broadcast 192.168.0.255
--
 

	4. 設定内容の確認
	
	 最後に、設定の確認を実施する。
	 export コマンドでは、設定内容の一覧を参照することができる。
	 また、この内容をファイルに出力し、zonecfg コマンドの -f オプション
     コマンドを利用することで、簡単にインポートすることもできる。
     カスタマイズを必要とする複数の zone を作成する場合には、有効に利用
      できるだろう。
	 
		export コマンドの実行結果
		--
		zonecfg:TestZone01> export
		create -b
		set zonepath=/TestZone01
		set autoboot=false
		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 net
		set address=192.168.0.202
		set physical=eri0
		end
		--

	 また、export -f  を実行することで zone の定義を 
     で指定した任意のファイルに出力することが可能となる。
     このファイルを編集し、新たな non-global zone を作成する際に利用する
     ことで、作業を簡素化させることも可能となる。
	 (気をつけるのは zonepath と address)

	  TestZone02 という non-global zone を作成する場合は、ファイル中の
	 zonepath と address を目的の値に変更し、次のように実行することで
   インストール直前の定義までを簡単に作成できる。
   (例として、TestZone01 の定義内容を/usr/tmp/Zone_templat.txt という
   ファイルに出力し zonepath と address のみを変更している)

		# zonecfg -z TestZone02 -f /usr/tmp/Zone_template.txt
 

	 ちなみに、ここで「inherit-pkg-dir」というキーワードがでてくる。
	 inherit-pkg-dir は、inherit の言葉の意味が示すとおり、global zone 
   にあるディレクトリを non-global zone に継承するディレクトリを設定
   する。
	 設定されたディレクトリは、non-global zone において read-only 状態
   で、loopback mount されるので、書き込みが必要ないディレクトリは、
   inherit-pkg-dir を使って、global zone と共有するとディスクの節約や
   セキュリティ的にも良いだろう。
   デフォルトでは、/lib, /platform, /sbin, /usr の各ディレクトリが
   inherit-pkg-dir として設定されている。
	 このデフォルト値については、create 実行時のみ変更することが可能で
   ある。
   /lib, /platform, /sbin, /usr の何れかに、書き込みが必要な場合は
   該当する定義を削除しておくとよいだろう。
	 inherit-pkg-dir が設定されない場合は、zonpath 配下にファイル
   そのものを用意するため、その分容量が必要になり、non-global zone
   作成時間も長くなるが、書き込み可能になることで、いろいろなソフト
   ウェアをインストールしたりするなど、それなりに柔軟に設定できる
   ようになる。
	 (たとえば、Solaris 10 に含まれる Sun Java Directory Server を 
	  non-global zone 上で構成する場合は、/usr ディレクトリを書き込み
	  可能な状態にする必要があるため、inherit-pkg-dir の /usr 定義を
	  削除して構成する必要がある)

   また、non-global zone 起動後、global zone 上で  mount コマンドを
   実行すると、global zone, non-global zone の  mount 情報を確認できる。
   non-global zone で利用されているファイルシステムは、zone=TestZone01
   と zone 名が付加されていることがわかる。

 non-global zone が起動する前の global zone の mount 情報
--
# mount -p
/dev/dsk/c1t2d0s0 - / ufs - no rw,intr,largefiles,logging,xattr,onerror=panic
/devices - /devices devfs - no 
ctfs - /system/contract ctfs - no 
proc - /proc proc - no 
mnttab - /etc/mnttab mntfs - no 
swap - /etc/svc/volatile tmpfs - no xattr
objfs - /system/object objfs - no 
fd - /dev/fd fd - no rw
swap - /tmp tmpfs - no xattr
swap - /var/run tmpfs - no xattr
/export/home/kazus - /home/kazus lofs - no 
--
 
 
 non-global zone が起動した後の global zone の mount 情報
--
# mount -p
/dev/dsk/c1t2d0s0 - / ufs - no rw,intr,largefiles,logging,xattr,onerror=panic
/devices - /devices devfs - no 
ctfs - /system/contract ctfs - no 
proc - /proc proc - no 
mnttab - /etc/mnttab mntfs - no 
swap - /etc/svc/volatile tmpfs - no xattr
objfs - /system/object objfs - no 
fd - /dev/fd fd - no rw
swap - /tmp tmpfs - no xattr
swap - /var/run tmpfs - no xattr
/export/home/kazus - /home/kazus lofs - no 
/TestZone01/dev - /TestZone01/root/dev lofs - no zonedevfs
/lib - /TestZone01/root/lib lofs - no ro,nodevices,nosub
/platform - /TestZone01/root/platform lofs - no ro,nodevices,nosub
/sbin - /TestZone01/root/sbin lofs - no ro,nodevices,nosub
/usr - /TestZone01/root/usr lofs - no ro,nodevices,nosub
proc - /TestZone01/root/proc proc - no nodevices,zone=TestZone01
ctfs - /TestZone01/root/system/contract ctfs - no nodevices,zone=TestZone01
swap - /TestZone01/root/etc/svc/volatile tmpfs - no nodevices,xattr,zone=TestZone01
mnttab - /TestZone01/root/etc/mnttab mntfs - no nodevices,zone=TestZone01
fd - /TestZone01/root/dev/fd fd - no rw,nodevices,zone=TestZone01
swap - /TestZone01/root/tmp tmpfs - no nodevices,xattr,zone=TestZone01
swap - /TestZone01/root/var/run tmpfs - no nodevices,xattr,zone=TestZone01
--

    また、システムの起動時、すなわち global zone 起動と同時に、non-global 
    zone を自動起動させたい場合は、zonecfg コマンドで以下の設定を行う必要
    がある。
    default では false が設定され、自動起動は行われない。
 
		--
		set autoboot=true
		--

	 
	5. verify
	
	 verify コマンドで、設定に問題がないかチェックする。
	 何も表示されないことを確認する。
	 	--
	 	zonecfg:TestZone01> verify
	 	--
	 	
	6. 設定内容を commit する

	 設定した内容を反映するため commit を実行する。
	 設定内容はメモリ中に保存しているため、commit を実行しなければ、設定内容が
	 ファイルに反映されない。この操作は忘れずに実行する。
	 
		--
		zonecfg:TestZone01> commit
		zonecfg:TestZone01>
		--
 
 これらの設定は、commit を実行することで global zone の /etc/zones/ ディレクトリ
 配下に、"zone名.xml" として格納される。
 (本稿の設定では、/etc/zones/TestZones01.xml として構成情報が格納されている)

  参考:TestZone01.xml の内容
--
# cat TestZone01.xml




  
  
  
  
  

--

	7. zonecfg の終了
	
	 exit あるいは、Ctrl + D で、zonecfg を終了させる。

 ここまでが、non-global zone の定義作成方法となり、zone の基本的な構成設定は
 完了となる。
  
・non-global zone へのシステムインストール

 作成した non-global zone の定義を元に、システムをインストールする作業となる。
 システムのインストールといっても、Solaris 10 のメディアを用意する必要はない。
 global zone にインストールされたファイルを利用して non-global zone 上にシステム
 を作成する。
 また、global zone 上にインストールされたシステムタイプをそのまま引き継ぐため
 Developer 環境の non-global zone や、EndUser 環境の non-gloal zone を個別に
 作成することはできない。

 まず、global zone 上で、zoneadm list -vc を実行し、現在の zone 状態を確認する。

		--
		# zoneadm list -vc
		  ID NAME             STATUS         PATH
		   0 global           running        /
		   - TestZone01       configured     /TestZone01
		--

 ターゲットとなる TestZone01 が確認でき、STATUS が configured になっていれば問題
 ない。
 以下のコマンドでインストールが開始される。
 
		--
		# zoneadm -z TestZone01 install
		--

 作成中に、進行状況を示す以下のようなメッセージが出力される。
 最終行のメッセージが出力されインストールが完了するまでは、多少の時間を
 必要とする。
 
--
# zoneadm -z TestZone01 install
Preparing to install zone .
Creating list of files to copy from the global zone.
Copying <2606> files to the zone.
Initializing zone product registry.
Determining zone package initialization order.
Preparing to initialize <1109> packages on the zone.
Initialized <1109> packages on zone.
Zone  is initialized.
The file  contains a log of the zone installation.
--

 インストールログは、zonepath に指定したディレクトリ配下に作成され、本稿では、
 /TestZone01/root/var/sadm/system/logs/install_log となる。

 zone のインストール作業終了後、zoneadm で STATUS を確認し、"installed" に
 なっていることを確認する。
 この状態であれば、いつでも boot 可能な状態となる。 

		--
		# zoneadm list -vc
		  ID NAME             STATUS         PATH
		   0 global           running        /
		   - TestZone2        installed      /TestZone2
		--

・zone の boot

 作成した non-global zone を boot させる前に、zlogin コマンドを利用して
 TestZone01 のコンソールに接続しておく必要がある。
 これは、初回起動時に、ホスト名やタイムゾーン, ネーミングサービスの設定
 入力を行う必要があるため boot が一時停止してしまうためだ。
 non-global zone ログインする場合は、zlogin とよばれる、non-global zone 
  専用のログインコマンドを利用することになる。
 また、作成直後の non-global zone には、root アカウントが存在しているが、
 telnet や ssh などのネットワーク経由でのログインは global zone 同様、
 設定により禁止されている。

 zlogin を利用できるのは、root 権限を持つユーザだけであることに注意して
 頂きたい。
 また、zlogin コマンドは複数起動させることはできない。
 なお、zlogin を終了させる場合は、~ (チルダ) を入力し、Ctrl + D を実行
 することで可能である。
 (このシーケンスは、zlogin のオプションで変更できる)
  新しいターミナルから、以下のコマンドを実行する。


	# zlogin -C TestZone01

--
[ゾーン 'TestZone01' コンソールに接続しました]
--

 TestZone01 のコンソールに接続したことを示すメッセージが表示されるが、
 この段階では、まだ、TestZone01 が起動していないため何も入力することが
 できない。

 TestZone01 を boot するには、次のコマンドを実行する。
 
		--
		# zoneadm -z TestZone01 boot
		--

  そして、zlogin コマンドで接続した TestZone01 のコンソールには、次のような
 メッセージ表示され、boot が開始されたことがわかる
 
--
[NOTICE: Zone booting up]

SunOS Release 5.10 Version Generic 64-bit
Copyright 1983-2005 Sun Microsystems, Inc.  All rights reserved.
Use is subject to license terms.
Hostname: TestZone03
Loading smf(5) service descriptions:  14/100
--

  初回起動時は、smf service の読み込みがあり若干時間がかかる。
 その後、各種初期設定を行うが、Solaris 10 インストール時に設定される
 内容と同様のため、特に説明は必要ないだろう。
 この初期設定を省略したい場合は、sysidcfgと呼ばれるファイルを作成し、
 設定情報を書き込んでおくとよいが、この方法については、本稿で割愛させて
 頂く(興味があるならば、man -s 4 sysidcfg を参照して頂きたい)

 また、boot に問題なけれ、ばzoneadm コマンドを実行したほうのターミナルには、
 何も出力されずプロンプトが返ってくる。

 設定が完了すると、こちらも Solaris 10 インストール時と同様、NFS v4 の構成
 について問い合わせがあり、その後、再起動が行われる。

--
System identification is completed.


        This system is configured with NFS version 4, which uses a domain
        name that is automatically derived from the system's name services.
        The derived domain name is sufficient for most configurations. In a
        few cases, mounts that cross different domains might cause files to
        be owned by "nobody" due to the lack of a common domain name.

        Do you need to override the system's default NFS version 4 domain
        name (yes/no) ? [no] :

        For more information about how the NFS version 4 default domain
        name is derived and its impact, refer to the man pages for nfs(4)
        and nfsmapid(1m), and the System Administration Guide: Network
        Services.


rebooting system due to change(s) in /etc/default/init

[NOTICE: Zone rebooting]

--

 そして、zlogin を起動しているターミナルには、次のようなメッセージが表示されて
 いるはずである。

--
SunOS Release 5.10 Version Generic 64-bit
Copyright 1983-2005 Sun Microsystems, Inc.  All rights reserved.
Use is subject to license terms.
Hostname: TestZone01

TestZone03 console login: Feb 28 01:48:53 TestZone03 sendmail[8225]: My unqualified host name (TestZone03) unknown; sleeping for retry

--

 この状態を確認できたなら、zoneadm コマンドで、STATUS を確認する。
 STATUS が、running になっているはずである。
 これが、zone が起動していることを示す状態となる。

		--
		# zoneadm list -vc
		  ID NAME             STATUS         PATH
		   0 global           running        /
		   1 TestZone01       running        /TestZone01
		--


 ここまでの一通りの作業が non-global zone を作成するために必要なの基本的な内容
 となる。
 本稿の内容を参考に、複数の non-global zone を作成してみると良いだろう。 
 

・non-global zone へのログイン

 ここまでの作業で non-global zone 「TestZone01」を起動することができた。
 zlogin を終了せず、そのまま実行している場合は、ログインプロンプトが
 表示されていることを確認できるだろう。
 初回の non-global zone 起動時に設定した root パスワードを用いることで
 root アカウントでログインすることが可能となっているはずだ。 

 最初は、zlogin コマンドを利用してログインする方法しか提供されていない。
 まずは、non-global zone にログインし、リモートログインできるように、一般
 ユーザを登録し、しかるべき設定をするのもよいだろう。
 このあたりの設定は、non-global zone ということを意識する必要はない。
 global zone とは別な、Solaris 環境があるという認識を持っていれば十分である。
 
 また、zlogin コマンドは、global zone におけるroot ユーザが、non-global zone 
 へログインするために利用されるコマンドだが、ネットワーク経由による他のシステム
 に構築されたglobal zone および non-global zone へログインする機能は持っていない。
 
・non-global zone の再起動および停止

 再起動および停止については、2つの方法がある。
 一つは、zlogin コマンドで non-global zone にログインし、non-global zone 内で
 shutdown コマンドを実行する方法である。
 もう一つは、global zone から、zoneadm コマンドを用いて実行する方法となる。

	TestZone01 の再起動
	--
 	# zoneadm -z TestZone01 reboot
	--
 
	TestZone01 の停止
	--
 	# zoneadm -z TestZone01 halt 
	--

・non-glocal zone のアンインストールと削除

 作成した non globa-zone をアンインストールする方法について解説する。
 アンインストールとは、non-global zone の構成情報は残したまま、インストール
 直前の状態にすることを意味する。

 また、STATUS が running の場合、つまり動作中の場合は、アンインストールをする
 ことはできない。
 zoneadm から、halt か shutdown を実行し、STATUS を installed に移行させる必要
 がある。
  TestZone01 をアンインストールするには、次のコマンドを実行する。

	--
	# zoneadm -z TestZone01 uninstall
	--

 アンインストールが完了すると、zone の STATUS は、configured に設定され、
 インストール可能な状態となる。
 zonepath に設定したディレクトリは残るが、その中身はすべて削除される。
 non-global zone の構成情報まで消してしまいたい場合、つまり削除をおこないたい
 場合は、uninstall を実行しSTATUS が configured なのを確認してから zonecfg の
 delete コマンドを実行することで、完全に削除することが可能となる。
 
 	# zonecfg -z TestZone01 delete

・既存の non-global zone の zonepath を変更するには?

 non-global zone の / ファイルシステムは、任意のファイルシステム上に作成できる
 と説明したが、ファイルシステム容量の都合などで変更を迫られる場合があるかもし
 れない。
 そのような場合は、対象となる non-global zone を停止し、zonepath に設定されて
 いるディレクトリ配下を、あらたなファイルシステムに移動し、設定情報が格納され
 てい /etc/zones/TestZone01.xml ファイルのzonepath の値を新しいパスに変更する
 ことで対応できる。(TestZone01 は本稿の場合)
 ただし、この方法はイレギュラーな行為であることを認識しておく必要がある。
 	
 
・プロセスの確認について
 
 global zone と non-global zone では、プロセスの見え方に違いがある。
 どちらの zone でも、 ps コマンドで、プロセス一覧が取得できるが、
 global zone では、non-global zone のプロセスも見えてしまうため、混乱を招く
  恐れがある。
  (たとえば、global zone では、inetd が 2 つ起動しているように見える)
 そこで、Solaris express 5/04 から、ps コマンドに zone 用の新たなオプションが
  追加された。
 Solaris Zones を利用している場合、global zone で ps コマンドを実行する際には
 常に -Z をつけて実行する癖をつけたほうが良いだろう。
 
 	# ps -z [Zone name or ID] -Z 
 	
 		-z で、Zone name か、ID を指定
 		-Z は、出力に Zone 名を追加してくれる
 	
 また、プロセスを扱うコマンド郡には zone 関連のオプションが追加されている。
 できることなら、復習の意味も込めて、オンラインマニュアルにも再度、目を通して
 おくと良いだろう。。
 また、prstat -Z で、zones の統計情報も参照できるようになっている。
 
 
・non-global zone を孤立させる

 ここでは、non-global zone を筐体内で完全に孤立させてしまう方法を説明
 する。孤立させることで、筐体内の global zone および non-global zone 
 の間では、ネットワーク経由でのアクセスが一切できなくなり、global zone 
 からの zlogin でしかアクセスすることができなくなる。
 ただし、外部からのアクセスは問題なく行えるため、セキュリティを確保する
 という意味では有効だろう。

 先にも説明したとおり、non-global zone に割り当てられるネットワーク
 インターフェースは、物理インターフェースではなく、論理インターフェース
 であり、筐体内での global zone と non-global zone および non-global zone 
 同士の通信には、loopback interface が使われる。
 このため、Solaris IP filter などを利用したパケットフィルタリングを zone 間で
 実施することができない。
 
 そこで、route コマンドに新しく実装された -blackhole オプションを利用する。
 -blackhole が指定された経路を利用するパケットは、blackhole の名が示すとお
 り、なんの応答もなく破棄される。
 各 non-globalzone との経路を、ホスト間の経路として -blackhole オプション
 を指定し設定することで、non-globalzone および globalzone 間の通信を抑止
 することが可能となるわけだ。
 また、経路設定は、gloal-zone 上でしか実行できないことに注意して頂きたい。
 
 対象となる、zone の IP アドレスは、以下のものとする。
 
		global zone: 192.168.0.200
	non-global zone: 192.168.0.202

--
* 192.168.0.202 を gateway とし、192.168.0.200 へアクセスする経路  
# route add host 192.168.0.200 192.168.0.202 -interface -blackhole
add host 192.168.0.200: gateway 192.168.0.202

* 192.168.0.200 を gateway として 192.168.0.202 へアクセスする経路
# route add host 192.168.0.202 192.168.0.200 -interface -blackhole
add host 192.168.0.202: gateway 192.168.0.200
-- 
 -interface は、metric の代用となるため利用している。

 この設定は、netstat -nr の経路情報で blackhole が指定されていることが情報
 として参照できないことに注意して頂きたい。
 (確認方法をご存知の方は、ぜひとも教えて頂きたい)
 
 相手側に、ping 等を実行すると、応答がなくなることがわかるだろう。
 このような形で、内部からのアクセス方法を限定することにより、よりセキュリ
 ティを高めることが可能となる(この方法も、セキュリティを確保するための
 ひとつの手段である)
 
 また、手動設定となるため、システム起動時に自動的に実行するよう
 にしておくとよいだろう。

 
・最後に
 
 以上で、Solaris Zones の概要および作成方法について把握して頂けたかと思う。
 今回紹介したのは、non-gloal zone の基本的な作成方法であり、これを踏まえて
 ユーザ自身がカスタマイズした zones を作成して行く必要がる。

 しかし、リリースされたばかりの機能であるため、Solaris Zones を有効に活用
 するための資料が少ないのも事実である。
 いずれにせよ、いまのところzone 対応のアプリケーション情報がないに等しく
 ユーザ自信が動作確認を行いながら環境を整えていく必要がある。
 このあたりの情報については、Sun が積極的に公開してくれることを期待する。

 また、zone 内でサービスを実際に運用する方法や Solaris 10 Resource Manager
 との連携については、ページの都合上、本稿で取り上げることができなかった。
 これについては、本誌上で、あらためて取り上げる予定となっていることを先に
 お知らせしておく。


・参考情報

	BigAdmin System Administration Portal : Solaris Zones
	http://www.sun.com/bigadmin/content/zones/

	System Administration Guide: N1 Grid Containers, Resource Management, and Solaris Zones 
	http://docs.sun.com/db/doc/817-1592/

	Get in the Zone with Solaris 10 by Dennis Clarke
	http://www.blastwave.org/docs/Solaris-10-b51/DMC-0002/dmc-0002.html
	
	Solaris 10 オペレーティングシステム新機能紹介
	Solaris コンテナ 構築ガイド   - Zone の作成から管理までを簡潔に解説 
	http://sdc.sun.co.jp/solaris/solaris10/index.html