Solaris コンテナ Zone の導入

2010 年 1 月 21 日 | カテゴリー: 環境構築

OpenSolaris on VMware Workstation

OpenSolaris 2009.06 を VMware Workstation 上に乗せて、Solaris コンテナ Zone を導入してみました。

zfs の snapshot も強力だけど、zone もなかなか。
Solaris のお作法を覚えるのが少し大変かな・・・?

zone の管理コマンドは主に zonecfg, zoneadm, zlogin の3つです。


1. zone 用ファイルシステムの作成

zfs create

1.1. ファイルシステムの作成

zone 用のファイルシステムを作成します。「/rpool/zones」に各コンテナを置くことにして、「test001」というコンテナを置くファイルシステムを作成します。

root@opensolaris131:~# zfs create rpool/zones
root@opensolaris131:~# zfs create rpool/zones/test001
1.2. パーミッションの変更

zone 環境は他の環境から見られないようにパーミッションを設定する必要があるため、700 に変更します。

root@opensolaris131:~# chmod 700 /rpool/zones/test001

パーミッションが正しく設定されていない場合、後のインストール作業時にエラーが発生します。

root@opensolaris131:~# zoneadm -z test001 install
/rpool/zones/test001 must not be group readable.
/rpool/zones/test001 must not be group executable.
/rpool/zones/test001 must not be world readable.
/rpool/zones/test001 must not be world executable.
could not verify zonepath /rpool/zones/test001 because of the above errors.
zoneadm: zone test001 failed to verify
1.3. マウント状態の確認

作成したファイルシステムを df で確認します。作成したファイルシステムがマウントされていれば成功です。

root@opensolaris131:~# /usr/gnu/bin/df -hT
Filesystem    Type    Size  Used Avail Use% Mounted on
rpool/ROOT/opensolaris
               zfs     15G  3.4G   11G  25% /
swap         tmpfs    939M  312K  938M   1% /etc/svc/volatile
/usr/lib/libc/libc_hwcap1.so.1
              lofs     15G  3.4G   11G  25% /lib/libc.so.1
swap         tmpfs    938M   16K  938M   1% /tmp
swap         tmpfs    938M   72K  938M   1% /var/run
rpool/export   zfs     11G   21K   11G   1% /export
rpool/export/home
               zfs     11G   21K   11G   1% /export/home
rpool/export/home/kei
               zfs     11G  203M   11G   2% /export/home/kei
rpool          zfs     11G   80K   11G   1% /rpool
rpool/zones    zfs     11G   19K   11G   1% /rpool/zones
rpool/zones/test001
               zfs     11G   19K   11G   1% /rpool/zones/test001

2. zone の作成

zonecfg

2.1. 構成情報の設定

新しい zone として test001 を作成します。構成情報が存在しないため、create で作成するように促されます。

root@opensolaris131:~# zonecfg -z test001
test001: No such zone configured
Use 'create' to begin configuring a new zone.
2.2. 構成情報の作成

構成情報を新規作成します。空の構成情報に対話で設定を追記していきます。

zonecfg:test001> create
2.3. パスの指定

zone 用に作成したファイルシステムを指定します。

zonecfg:test001> set zonepath=/rpool/zones/test001
2.4. ネットワークインターフェースの追加

NIC と IP アドレスを指定します。Solaris は NIC に複数の IP アドレスを持たせることができます。物理 NIC e1000g0 を指定した場合、 e1000g0:1 に IP アドレスが登録されます。DHCP は使用できません。

zonecfg:test001> add net
zonecfg:test001:net> set physical=e1000g0
zonecfg:test001:net> set address=10.11.161.83
zonecfg:test001:net> end
2.5. 構成情報の確認

info で構成情報を確認できます。最低限の情報は記述されました。

zonecfg:test001> info
zonename: test001
zonepath: /rpool/zones/test001
brand: ipkg
autoboot: false
bootargs:
pool:
limitpriv:
scheduling-class:
ip-type: shared
hostid:
net:
	address: 10.11.161.83
	physical: e1000g0
	defrouter not specified
2.6. 構成情報のコミット

verify で構成情報を確認し、commit でコミットします。

zonecfg:test001> verify
zonecfg:test001> commit
2.7. 構成情報設定の終了

exit で構成情報の設定を終了します。

zonecfg:test001> exit
2.8. 構成情報の所在

/etc/zones/ 配下に構成情報が保存されます。

root@opensolaris131:~# ls /etc/zones/
SUNWblank.xml    SUNWipkg.xml  index
SUNWdefault.xml  SUNWlx.xml    test001.xml

構成情報を編集する場合は、XML ファイルは直接編集せずに zonecfg を使用します。
XML は以下のようになっています。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE zone PUBLIC "-//Sun Microsystems Inc//DTD Zones//EN" "file:///usr/share/lib/xml/dtd/zonecfg.dtd.1">
<!--
    DO NOT EDIT THIS FILE.  Use zonecfg(1M) instead.
-->
<zone name="test001" zonepath="/rpool/zones/test001" autoboot="false" brand="ipkg">
  <network address="10.11.161.83" physical="e1000g0"/>
</zone>

3. zone のインストール

zone install

3.1. インストール

インストールを開始すると、ダウンロードからインストールまで行われます。

root@opensolaris131:~# zoneadm -z test001 install
   Publisher: Using opensolaris.org (http://pkg.opensolaris.org/release/).
       Image: Preparing at /rpool/zones/test001/root.
Sanity Check: Looking for 'entire' incorporation.
  Installing: Core System (output follows)
DOWNLOAD                                    PKGS       FILES     XFER (MB)
Completed                                  20/20   3021/3021   42.55/42.55
 
PHASE                                        ACTIONS
Install Phase                              5747/5747
  Installing: Additional Packages (output follows)
DOWNLOAD                                    PKGS       FILES     XFER (MB)
Completed                                  37/37   5598/5598   32.52/32.52
 
PHASE                                        ACTIONS
Install Phase                              7329/7329
 
        Note: Man pages can be obtained by installing SUNWman
 Postinstall: Copying SMF seed repository ... done.
 Postinstall: Applying workarounds.
        Done: Installation completed in 476.938 seconds.
 
  Next Steps: Boot the zone, then log into the zone console
             (zlogin -C) to complete the configuration process
3.2. 起動

起動するとサブネットの設定がされていないため警告が出ますが、エラーではありません。

root@opensolaris131:~# zoneadm -z test001 boot
zone 'test001': WARNING: e1000g0:1: no matching subnet found in netmasks(4): 10.11.161.83; using default of 255.0.0.0.
3.3. コンソール接続

コンソール接続を行うと初回設定が開始されます。

root@opensolaris131:~# zlogin -C test001
[Connected to zone 'test001' console]
3.4. 初回設定

zone コンソールログイン

コンソール接続を行うと初回設定が開始されます。
まずは使用しているターミナルを選択します。
X 上で動作確認しているので、 X Terminal Emulator (xterms) を選択しました。

zone hostname 設定

F2 キーで次の画面へいくことになっていますが、F2 キーが入力できないときがあります。
そのときは Esc キーを押してから 2 キーを押すと次の画面へ進めますし、そのように画面にも表示されます。

zone hostname 確認

ホスト名を入力して次の画面へ進みます。

zone kerberos 設定

kerberos の設定です。

zone kerberos 確認

特に設定せず次へ進めました。

zone dns 設定

ネームサービスの設定です。

zone dns 確認

None にして次へ進めました。

zone nfs 設定

NFS の設定です。

zone nfs 確認

標準のまま次へ進めました。

zone timezone asia

タイムゾーンの設定です。

zone timezone japan

Asia を選択して次の画面で Japan を選択します。

zone timezone 確認

次の画面へ進めます。

zone root password 設定

root のパスワードを設定します。

zone コンソールログアウト

設定が終わると元の画面に戻り、root でログインできます。
コンソールログアウトする場合には ~. と入力します。

4. zone の削除

zone delete

4.1. 状態の確認

zoneadm で zone の状態を確認できます。
test001 が running 状態です。削除する前に停止処理を行います。

root@opensolaris131:~# zoneadm list -cv
  ID NAME             STATUS     PATH                           BRAND    IP
   0 global           running    /                              native   shared
   1 test001          running    /rpool/zones/test001           ipkg     shared
4.2. 停止

halt で zone を停止します。状態を確認すると、STATUS が installed になります。

root@opensolaris131:~# zoneadm -z test001 halt
root@opensolaris131:~# zoneadm list -cv
  ID NAME             STATUS     PATH                           BRAND    IP
   0 global           running    /                              native   shared
   - test001          installed  /rpool/zones/test001           ipkg     shared
4.3. アンインストール

uninstall で zone 環境をアンインストールします。状態を確認すると、STATUS が configured になります。/etc/zones/ 以下に構成が記述された xml が残っていることを確認できます。

root@opensolaris131:~# zoneadm -z test001 uninstall
Are you sure you want to uninstall zone test001 (y/[n])? y
root@opensolaris131:~# zoneadm list -cv
  ID NAME             STATUS     PATH                           BRAND    IP
   0 global           running    /                              native   shared
   - test001          configured /rpool/zones/test001           ipkg     shared
root@opensolaris131:~# ls /etc/zones/
SUNWblank.xml  SUNWdefault.xml  SUNWipkg.xml  SUNWlx.xml  index  test001.xml
4.4. 構成情報の削除

delete で zone 構成情報を削除します。リストからも削除され、構成情報ファイルも削除されます。

root@opensolaris131:~# zonecfg -z test001 delete
Are you sure you want to delete zone test001 (y/[n])? y
root@opensolaris131:~# zoneadm list -cv
  ID NAME             STATUS     PATH                           BRAND    IP
   0 global           running    /                              native   shared
root@opensolaris131:~# ls /etc/zones/
SUNWblank.xml  SUNWdefault.xml  SUNWipkg.xml  SUNWlx.xml  index
4.5. アンマウントの確認

df で zone 用ファイルシステムが削除されアンマウントされていることを確認します。

root@opensolaris131:/rpool/zones# df -h
Filesystem             size   used  avail capacity  Mounted on
rpool/ROOT/opensolaris
                        16G   3.4G    11G    25%    /
/devices                 0K     0K     0K     0%    /devices
/dev                     0K     0K     0K     0%    /dev
ctfs                     0K     0K     0K     0%    /system/contract
proc                     0K     0K     0K     0%    /proc
mnttab                   0K     0K     0K     0%    /etc/mnttab
swap                   947M   312K   947M     1%    /etc/svc/volatile
objfs                    0K     0K     0K     0%    /system/object
sharefs                  0K     0K     0K     0%    /etc/dfs/sharetab
/usr/lib/libc/libc_hwcap1.so.1
                        14G   3.4G    11G    25%    /lib/libc.so.1
fd                       0K     0K     0K     0%    /dev/fd
swap                   947M    16K   947M     1%    /tmp
swap                   947M    72K   947M     1%    /var/run
rpool/export            16G    21K    11G     1%    /export
rpool/export/home       16G    21K    11G     1%    /export/home
rpool/export/home/kei
                        16G   203M    11G     2%    /export/home/kei
rpool                   16G    79K    11G     1%    /rpool
rpool/zones             16G    19K    11G     1%    /rpool/zones

5. non-global zone の管理

ps -z zone -Z

プロセス管理

global zone から non-global zone のプロセスを見られるように、ps コマンドが拡張されているようです。
zone を指定して -Z をつけると、指定した zone のプロセスが表示されます。

ps -z test001 -Z
サービス管理

global zone から non-global zone を操作するには、zlogin の後にコマンドを入れるようです。ssh と同じような使い方ですね。
SMF サービスの状態を確認する svcs を渡して non-global zone のサービスの状態を取得します。

zlogin test001 svcs -a
dtrace

dtrace も zone 環境に対して使えるようです。

知りたいこと

global-zone からどこまで non-global zone を扱えるのかということ。
/proc 配下は見えるものの、Linux と違い複雑な構成になっているので扱い方が分かりません。
また SNMP 等で global-zone に問い合わせるだけで non-global zone の状態を知ることなどは可能なのでしょうか?

などなど。Solaris 勉強会などにも顔を出しながら調べていけたらと考え中です。識者、歓迎です。

  1. 梅蔵
    2010 年 1 月 21 日 01:07

    この長さになると目次が欲しい。

  2. kei
    2010 年 1 月 21 日 13:35

    確かに。追加しときま。
    # google sites とかの自動目次生成が欲しい。