BigAdmin System Administration Portal
Solaris 10 新機能: Solaris ゾーン
Print-friendly VersionPrint-friendly Version

Solaris ゾーン

By Amy Rich

Solaris 10 オペレーティングシステムには、Solaris コンテナテクノロジという興味深い新機能があります。 このテクノロジによって、システムリソースを仮想化し、複数のソフトウェア区画を 1 つのインスタンスの OS で使用できます。 Solaris コンテナの機能は、主に Solaris ゾーン区分化テクノロジとリソース管理ツールの 2 つのコンポーネントから成り立っています。 Solaris ゾーン機能は、実行中のアプリケーション用の異なる環境を作成することを可能にし、リソース管理フレームワークは、CPU やメモリといったシステムリソースの割り当て、管理、アカウント処理を実現します。

Solaris コンテナの機能はハードウェアへの依存性がなく、Solaris 10 OS に対応しているものであれば、どのマシンでも使用できます。 Solaris コンテナの開発はまだ継続されています。 そのため、Solaris 10 OS の将来のビルドでは、柔軟性と機能の一層の強化が見込まれます。 詳細については、docs.sun.com にある System Administration Guide: Solaris Containers -- Resource Management and Solaris Zones を参照してください。 BigAdmin の Solaris Zones のページも参考にしてください。


Solaris ゾーンソフトウェアとは

Solaris ゾーン機能は、FreeBSD Jails と同じ基本概念に基づいています。 FreeBSD Jails と Solaris ゾーンのどちらでも、実行環境のそれぞれのビューはお互いに完全に隔離され、ある環境にあるプロセスは別の環境にあるプロセスにシグナルを送出できず、そのプロセスを参照することさえできません。 Jails とゾーンでは、1 つのインスタンスのオペレーティングシステムだけが共有されるため、CPU が 1 つしかないマシンでも、複数の実行環境が共存できます。

ゾーンには、グローバルゾーンと非グローバルゾーンの 2 種類があります。 Solaris ゾーン機能が有効になっているマシンには、1 つのグローバルゾーンと最大で 8191 の非グローバルゾーンがあります。 1 台のマシンで使用できる最大ゾーン数は、そのマシンのハードウェアリソースによって決まります。 それぞれのゾーンには、起動時に ID が割り当てられます。 グローバルゾーンの I D は常に 0 になり、起動可能な Solaris カーネルはグローバルゾーンだけに収容されます。 すべてのデバイス、ファイルシステム、他のゾーンを認識できるのはグローバルゾーンだけです。 また、グローバルゾーンは、非グローバルゾーンの設定、インストール、管理を行える唯一のゾーンでもあります。

非グローバルゾーンには、グローバルゾーンにインストールされた Solaris OS のサブセットが収容されます。 さらに、グローバルゾーンにインストールされていないパッケージも組み込むことができます。 それぞれの非グローバルゾーンには、そのゾーンに関連するインストール済みのソフトウェアパッケージを記録した専用のパッケージデータベースがあり、グローバルゾーンや他の非グローバルゾーンとの間でパッケージの情報は共有されません。 非グローバルゾーンには、ローカライズされた設定情報や、他のゾーン固有のファイルやディレクトリも含まれています。


非グローバルゾーンの設定

非グローバルゾーンを作成するには、グローバルゾーンの管理者が zonecfg コマンドと zoneadm コマンドを使用します。 zonecfg コマンドでは、グローバルゾーンのテンプレートをもとにして、ゾーンの設定情報を構築できます。 zonecfg コマンドと zoneadm コマンドの詳細については、BigAdmin にあるそれぞれのコマンドのマニュアルページを参照してください。 zonecfg コマンドの構文は次のとおりです。

zonecfg -z <ゾーン名>
zonecfg -z <ゾーン名> <サブコマンド>
zonecfg -z <ゾーン名> -f <コマンドファイル>
zonecfg help

zonecfg コマンドのサブコマンドは次のとおりです。

add <リソースタイプ>
	(グローバルスコープ)
add <プロパティ名> <プロパティ値>
	(リソーススコープ)
cancel
commit
create [-F] [ -b | -t <テンプレート> ]
delete [-F]
end
exit [-F]
export [-f <出力ファイル>]
help [commands] [syntax] [usage] [<コマンド名>]
info [<リソースタイプ> [<プロパティ名>=<プロパティ値>]*]
remove <リソースタイプ> { <プロパティ名>=<プロパティ値> }
	(グローバルスコープ)
remove <プロパティ名>=<プロパティ値>
	(リソーススコープ)
revert [-F]
select <リソースタイプ> { <プロパティ名>=<プロパティ値> }
set <プロパティ名>=<プロパティ値>
verify

基本的なゾーンを設定するには、zonecfg を対話モードで実行し、create ディレクティブと set zonepath ディレクティブを入力します。 export ディレクティブを使用すると、ファイルへの保存に適した形式で現在の設定情報を出力できます。 この時点では変更を行なっていないので、export ディレクティブを使用すると、次のようにデフォルトの設定情報が出力されます。

zonecfg -z myzone
zonecfg:myzone> create
zonecfg:myzone> export
create -b
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

この段階で、デフォルトのテンプレートを変更します。 ここでは、ゾーン myzone の自動起動を有効にし、IP アドレス 192.168.1.7 とネットマスク 255.255.255.0 (/24) を物理インタフェース hme0 に割り当て、/opt/sfw を読み取り専用のファイルシステムとしてマウントし、該当するパッケージメタデータをゾーンにコピーすることにします。 この例では、書き込み可能なループバックマウントを使用することにより、グローバルゾーンのディレクトリ /data/usr/local という名前でゾーン myzone にエクスポートしています。

zonecfg:myzone> set zonepath=/zones/myzone
zonecfg:myzone> set autoboot=true
zonecfg:myzone> add net
zonecfg:myzone:net> set address=192.168.1.7/24
zonecfg:myzone:net> set physical=hme0
zonecfg:myzone:net> end
zonecfg:myzone> add inherit-pkg-dir
zonecfg:myzone:inherit-pkg-dir> set dir=/opt/sfw
zonecfg:myzone:inherit-pkg-dir> end
zonecfg:myzone> add fs
zonecfg:myzone:fs> set dir=/usr/local
zonecfg:myzone:fs> set special=/data
zonecfg:myzone:fs> set type=lofs
zonecfg:myzone:fs> add options [nodevices]
zonecfg:myzone:fs> end
zonecfg:myzone> verify
zonecfg:myzone> export
create -b
set zonepath=/zones/myzone
set autoboot=true
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=/data
set type=lofs
add options nodevices
end
add net
set address=192.168.1.7/24
set physical=hme0
end
zonecfg:myzone> commit
zonecfg:myzone> export -f /tmp/myzone-zone.cfg
zonecfg:myzone> exit

これで、ゾーンの設定が完了し、設定を実行するためのテンプレートが /tmp/myzone-zone.cfg に保存されました。後でこのファイルを使用すると、同じゾーンを設定できます。また、ファイルの内容 (IP アドレスなど) を少し変更し、zonecfg -z secondzone -f /tmp/myzone-zone.cfg コマンドを実行すると、これと同様のゾーンを新しく構築できます。次に、zoneadm コマンドを使用して、ゾーンをインストールしてみましょう。zoneadm コマンドの構文は次のとおりです。

zoneadm -z <ゾーン名> <サブコマンド> [<オプション>]
zoneadm [-z <ゾーン名>] list [<オプション>]
zoneadm help

zoneadm コマンドのサブコマンドは次のとおりです。

boot
halt
help [subcommand]
install
list [-cipv]
ready
reboot
uninstall [-F]
verify

非グローバルゾーンのインストールと起動

ゾーンをインストールするには、次のコマンドを入力するだけで済みます。

zoneadm -z myzone install
Preparing to install zone <myzone>.
Creating list of files to copy from the global zone.
Initializing zone product registry.
Determining zone package initialization order.
Preparing to initialize <779> packages on the zone.
Initialized <779> packages on zone.
Successfully initialized zone <myzone>.

次に、ゾーンを起動して実行環境を立ち上げ、zlogin コマンドでゾーンのコンソールにログインします。 ゾーンのコンソールからログアウトするには、~. を入力します (チルド (~) キーとドット (.) キーをこの順に押す)。

zoneadm -z myzone boot
zlogin -C myzone

インストール後の初めての起動なので、内部的な命名規則が何もなく、コンソールを介して必要な情報の入力が要求されます。 デフォルトでは、ゾーンのホスト名はゾーン名と同じになります。 ホスト名を指定する場合、ゾーンの内部的なネームサービス (DNS、LDAP、ファイル、NIS、NIS+ など) に基づいて、ゾーンの IPv4 アドレスのいずれか 1 つに変換できるものを指定する必要があります。 ゾーンでは、グローバルゾーンとはまったく別のネームサービスを使用できます。 同じネームサービスを使用したとしても、そのサービスはグローバルゾーンのサービスとは完全に独立して動作します。

ゾーンでは、sysidcfg を使って設定が実行されます。 そのため、表示される画面は、sys-unconfig の実行後や OS の初期インストール中のものと同様になります。 この段階で必要になる情報のほとんどは、ゾーンを初めて起動する前に、ゾーンの /etc ディレクトリに sysidcfg ファイルを作成しておくことにより、あらかじめ指定できます。 ゾーンの設定を解除することもできます。 その場合は sys-unconfig コマンドを使用します。 詳細については、sysidtool(1M)sysidcfg(4) のマニュアルページを参照してください。

実行中のそれぞれのゾーンの状態は、次のコマンドによってグローバルゾーンから参照できます。

zoneadm list -v
   ID NAME             STATUS         PATH
    0 global           running        /
    2 myzone           running        /zones/myzone

この出力から、新しいゾーンが起動され、使用できる状態になっていることを確認できます。 非グローバルゾーンから zoneadm list -v コマンドを実行した場合は、そのゾーンの情報だけが表示されます。 ゾーンから zonename コマンドを実行すると、そのゾーンの名前を表示できます。

新しい起動されたゾーンは、新しくインストールされたマシンに似ています。 まだユーザーアカウントはなく、システムのデフォルト設定を除けば設定情報もありません。 したがって、新しいゾーンを本番で使用できるようにするには、まずアカウントを作成し、ソフトウェアを追加し、ゾーンの設定をカスタマイズする必要があります。 その後、グローバルゾーンの管理者は -l フラグを付けた zlogin コマンドを使用して、通常のユーザーとして非グローバルゾーンにログインできます。

zlogin -l <ユーザー> <ゾーン名>

zlogin コマンドをグローバルゾーンから非対話モードで実行し、指定したゾーンで特定のコマンドを実行させることもできます。 たとえば、myzonels -al / を実行するには、管理者としてグローバルゾーンから次のコマンドを実行します。

zlogin myzone ls -al /
total 126
drwxr-xr-x  19 root  other  512 Mar  8 12:45 .
drwxr-xr-x  19 root  other  512 Mar  8 12:45 ..
lrwxrwxrwx   1 root  root     9 Mar  8 12:03 bin -> ./usr/bin
drwxr-xr-x   2 root  other  512 Mar  8 12:02 data
drwxr-xr-x  10 root  other 1024 Mar  8 12:45 dev
drwxr-xr-x  51 root  sys   3584 Mar  8 13:36 etc
drwxr-xr-x   2 root  sys    512 Feb 12 11:42 export
dr-xr-xr-x   1 root  root     1 Mar  8 12:45 home
drwxr-xr-x   5 root  sys    512 Mar  8 12:03 kernel
drwxr-xr-x   4 root  bin   4608 Feb 12 12:17 lib
drwxr-xr-x   2 root  sys    512 Mar  8 12:04 mnt
dr-xr-xr-x   1 root  root     1 Mar  8 12:45 net
drwxr-xr-x   5 root  sys    512 Mar  8 12:03 opt
drwxr-xr-x  43 root  sys   1536 Feb 12 11:52 platform
dr-xr-xr-x  64 root  root 30400 Mar  8 16:27 proc
drwxr-xr-x   2 root  sys   1024 Feb 12 11:48 sbin
drwxrwxrwt   4 root  sys    314 Mar  8 16:19 tmp
drwxr-xr-x  38 root  other 1024 Jul 18  2003 usr
drwxr-xr-x  33 root  sys    512 Mar  8 12:45 var

非対話モードの zlogin は、非グローバルゾーンを管理するスクリプトを実行するときに特に役立ちます。 このコマンドにはフェイルセーフモード (-S) もあります。 このモードを使用すると、障害が発生し、ログインを受け付けなくなった非グローバルゾーンに接続できます。

ゾーン myzone を取り除くには、そのゾーンを停止させ、zoneadm uninstall コマンドでルートファイルシステムを取り除き、引数 delete を付けた zonecfg コマンドを実行します。

zlogin myzone shutdown -y -i0 -g0
zoneadm -z myzone uninstall -F
zonecfg -z myzone delete -F

グローバルゾーンからの非グローバルゾーンの情報の取得と設定
zonecfgzoneadmzonenamezlogin を使用できるだけでなく、さまざまな標準システムコマンドも、グローバルゾーンからゾーンの情報を参照・変更できるように修正されています。

プロセスの制御

ps コマンドに、書式設定オプション -o zone-o zoneid が追加されました。 これらのオプションを使用すると、プロセスのゾーン名やゾーン ID を出力できます。 その結果を grep に渡してゾーン名やゾーン ID を検索させると、特定のゾーンに含まれているプロセスだけを抽出できます。

/bin/ps -efo user,zone,pid,ppid,c,stime,tty,time,comm |grep myzone
  root myzone 18386     1  0 12:45:24 ?      00:00 /usr/sbin/syslogd
  root myzone 18527     1  0 12:47:04 ?      00:00 /usr/lib/ssh/sshd
  root myzone 18630 18527  0 13:38:26 ?      00:03 /usr/lib/ssh/sshd
  root myzone 18300     1  0 12:45:22 ?      00:00 init
  root myzone 18512     1  0 12:45:33 ?      00:01 /usr/sfw/sbin/snmpd
  root myzone 18399     1  0 12:45:24 ?      00:00 /usr/sbin/cron
  root myzone 18638 18634  0 13:38:31 pts/2  00:00 -sh
  root myzone 18523 18300  0 12:47:03 ?      00:00 /usr/lib/saf/sac
  root myzone 18401     1  0 12:45:25 ?      00:00 /usr/lib/autofs/automountd
daemon myzone 18324     1  0 12:45:23 ?      00:00 /usr/lib/crypto/kcfd
  root myzone 18656 18638  0 13:44:26 pts/2  00:00 tcsh
daemon myzone 18349     1  0 12:45:23 ?      00:00 /usr/sbin/rpcbind
  root myzone 18400     1  0 12:45:24 ?      00:00 /usr/sbin/nscd
  root myzone 18402     1  0 12:45:25 ?      00:00 /usr/sbin/inetd
 smmsp myzone 18435     1  0 12:45:29 ?      00:00 /usr/lib/sendmail
  root myzone 18434     1  0 12:45:29 ?      00:00 /usr/lib/sendmail
  root myzone 18442     1  0 12:45:29 ?      00:00 /usr/lib/utmpd
  root myzone 18297     1  0 12:45:09 ?      00:00 zsched
  root myzone 18618 18300  0 13:37:58 zoneconsole \
                                             00:00 /usr/lib/saf/ttymon
  root myzone 18496     1  0 12:45:31 ?      00:00 /usr/dt/bin/dtlogin
  root myzone 18526 18523  0 12:47:03 ?      00:00 /usr/lib/saf/ttymon

多くのコマンドが拡張され、ゾーンを基準にして出力をフィルタ処理したり、プロセスの所属先のゾーンを入力として指定できるようになりました。ipcspgreppkillptreeprstat の各コマンドでは、-z フラグを付けることでゾーンを指定できます。また、prstat では、-Z フラグを付けることで、全プロセスのリストに加えてゾーン ID ごとの概要情報を出力できます。この機能は、どのゾーンでリソースがもっとも多く使われているかを素早く特定するのに役立ちます。truss プログラムも、ゾーン固有の呼び出しを認識できるように修正されました。ただし、このプログラムはまだゾーンを認識できません。

Solaris OS では、coreadm を使ってコアファイル名のパターンを設定できます。このパターンに、ゾーン名を示す %z が組み込まれました。たとえば、グローバルゾーンでコアファイル名のパターンを /var/core/core.%f.%p.%z に設定した場合、ゾーン myzone で実行されている、PID が 123 の foo という名前のプログラムのコア名は、/var/core/core.foo.123.myzone になります。ゾーン管理者は、非グローバルゾーンで coreadm を実行し、そのゾーンだけの設定を制御することもできます。

ファイルシステム

グローバルゾーンから -Z フラグを付けた df を実行すると、すべてのゾーンのマウントを表示できます。このフラグを指定しなかった場合、現在のゾーンに存在しているマウントだけが表示されます。

df -Z
/                  (/dev/dsk/c0t1d0s0 ):      1881482 blocks   247016 files
/devices           (/devices          ):            0 blocks        0 files
/usr               (/dev/dsk/c0t1d0s3 ):       859490 blocks   271499 files
/proc              (proc              ):            0 blocks     1837 files
/etc/mnttab        (mnttab            ):            0 blocks        0 files
/dev/fd            (fd                ):            0 blocks        0 files
/var               (/dev/dsk/c0t1d0s4 ):      1889810 blocks   239530 files
/var/run           (swap              ):      2111168 blocks    15280 files
/tmp               (swap              ):      2111168 blocks    15280 files
/zones             (/dev/dsk/c0t1d0s5 ):     60468666 blocks  3681959 files
/zones/myzone/root/dev(/zones/myzone/dev  ): 60468666 blocks  3681959 files
/zones/myzone/root/lib(/lib               ):  1881482 blocks   247016 files
/zones/myzone/root/opt/sfw(/opt/sfw       ): 60468666 blocks  3681959 files
/zones/myzone/root/platform(/platform     ):  1881482 blocks   247016 files
/zones/myzone/root/sbin(/sbin             ):  1881482 blocks   247016 files
/zones/myzone/root/usr(/usr               ):   859490 blocks   271499 files
/zones/myzone/root/usr/local(/data        ):  1881482 blocks   247016 files
/zones/myzone/root/proc(proc              ):        0 blocks     1837 files
/zones/myzone/root/etc/mnttab(mnttab      ):        0 blocks        0 files
/zones/myzone/root/dev/fd(fd              ):        0 blocks        0 files
/zones/myzone/root/var/run(swap           ):  2111168 blocks    15280 files
/zones/myzone/root/tmp(swap               ):  2111168 blocks    15280 files

ネットワーキング

ifconfig ユーティリティが修正され、ゾーン別でもインタフェースの設定と参照ができるようになりました。ただし、インタフェースの plumb や unplumb はグローバルゾーンからしか行えません。グローバルゾーンから、ゾーンの内部に IP インタフェースを組み込むには、次のコマンドを使用します。

ifconfig <インタフェース> zone {<名前> | <数値>}
ifconfig hme0:3 plumb 192.168.1.8 netmask 255.255.255.0 zone myzone up

グローバルゾーンから、グローバルゾーンに限定された IP インタフェースのリストを出力するには、ifconfig -aZ を使用します。ifconfig -a を使用すると、すべてのゾーンのネットワークインタフェースが出力されます。

ifconfig -a
lo0: flags=1000849<UP,LOOPBACK,RUNNING,MULTICAST,IPv4> 
         mtu 8232 index 1 
         inet 192.168.1.7 netmask ff000000
lo0:1: flags=1000849<UP,LOOPBACK,RUNNING,MULTICAST,IPv4> 
         mtu 8232 index 1
         zone myzone
         inet 127.0.0.1 netmask ff000000
hme0: flags=1000843<UP,BROADCAST,RUNNING,MULTICAST,IPv4> 
         mtu 1500 index 2
         inet 192.168.1.4 netmask ffffff00 broadcast 192.168.1.255
         ether 8:0:20:9e:b5:40
hme0:1: flags=1000843<UP,BROADCAST,RUNNING,MULTICAST,IPv4> 
         mtu 1500 index 2
         zone myzone
         inet 192.168.1.7 netmask ffffff00 broadcast 192.168.1.255

ifconfig -aZ
lo0: flags=1000849<UP,LOOPBACK,RUNNING,MULTICAST,IPv4> 
         mtu 8232 index 1
         inet 192.168.1.7 netmask ff000000
hme0: flags=1000843<UP,BROADCAST,RUNNING,MULTICAST,IPv4> 
         mtu 1500 index 2
         inet 192.168.1.4 netmask ffffff00 broadcast 192.168.1.255
         ether 8:0:20:9e:b5:40

アカウンティング

拡張アカウンティング (exacct) を使用すると、それぞれのゾーンを個別に設定できます。レコードは、グローバルゾーンのアカウンティングファイルと、個々のゾーンのアカウンティングファイルの両方に書き込まれます。タスクとプロセスのアカウンティングレコードには、zonename というフィールドが新しく追加されます。このフィールドから、プロセスやタスクがどのゾーンに所属しているかが分かります。


参考情報

Unless otherwise licensed, code in all technical manuals herein (including articles, FAQs, samples) is provided under this License.


BigAdmin
  
 
BigAdmin Upgrade Hub