Solaris 11 でかんたんゾーン作成

Solaris 10の途中から導入されたSolaris Zone(Solaris Container)は、Solaris 11においてOS標準の仮想化技術として重要な役割を担うようになりました。

Solaris 10時代にはグローバルゾーン(親)の設定に依存する箇所が目立ちましたが、そのほとんどがSolaris 11では各ゾーンで独立して設定できるようになりました。例えばSolaris 10では各ゾーンがNFSサーバーになれなかったため、ゾーン内でshareコマンドやZFS設定などを用いてNFS共有を作成することが出来ませんでした。Solaris 11ではそこが改善されNFSサーバー機能が追加されています(ただしZFSのSMBサーバー機能はまだグローバルゾーンでしか使用できません)。

Solaris 11のゾーンはオプションが多数存在するため、ここではごく簡単な例を挙げて構築手順をトレースしていきたいと思います。この手順だけでもハマりどころは結構多く、それなりに有益だと考えています。

まず、Solarisをインストールした直後は次のようにグローバルゾーン(親)だけが作成された状態になっています。

# zoneadm list -vc
  ID NAME             STATUS     PATH                 BRAND    IP
   0 global           running    /                    solaris  shared

Solaris 11からはOSがSolarisの場合のBRAND「native」でなく「solaris」となります。また、BrandZが廃止されLinux(Linux 2.4系列カーネル)のインストールが出来なくなりました。さらに同じSolarisでも、Solaris 11ネイティブの他に、後方互換のためSolaris 10、Solaris 8/9のゾーンが存在します(これらのゾーンをインストールするにはサポート契約が必要です)。
IPは、グローバルゾーンについては「shared」であり、他のゾーンと共用できることを示しています。

次にZFSの内容を見ていきます。Solaris 11のゾーンではZFSの利用が必須となるため、事前の情報収集が必要となるからです。


# zfs list
NAME                              USED  AVAIL  REFER  MOUNTPOINT
rpool                            10.8G  1.33T  39.5K  /rpool
rpool/ROOT                       4.70G  1.33T    31K  legacy
rpool/ROOT/solaris               4.70G  1.33T  3.36G  /
rpool/ROOT/solaris-backup-1       100K  1.33T  1.50G  /
rpool/ROOT/solaris-backup-1/var    45K  1.33T   737M  /var
rpool/ROOT/solaris/var           1.21G  1.33T   470M  /var
rpool/dump                       4.07G  1.33T  3.95G  -
rpool/export                     1.11M  1.33T    33K  /export
rpool/export/home                1.08M  1.33T    32K  /export/home
rpool/export/home/solaris        1.05M  1.33T  1.05M  /export/home/solaris
rpool/swap                       2.06G  1.33T  2.00G  -

このZFS上のどこかにゾーンのための領域を確保します。今回はrpool/zonesをゾーンのための領域として確保し、ファイルシステム上の/export/zonesにマウントすることにします。

# zfs create rpool/zones
# zfs set mountpoint=/export/zones rpool/zones

rpool/zones                        31K  1.33T    31K  /export/zones

さらに、作成するゾーンに直接割り当てる領域を確保します。名称は任意ですが、ゾーン名と一致させる、ゾーン名にプリフィックスまたはサフィックスを付けたものにする、などゾーンとの対応が明確になるように命名すると後々の管理が楽になります。ここではゾーン名(「sinope」を予定)と一致させることにしました。

# zfs create rpool/zones

rpool/zones                        63K  1.33T    31K  /export/zones
rpool/zones/sinope                 31K  1.33T    31K  /export/zones/sinope

実は、ゾーンのための領域には条件があり、rootが所有者で、かつ所有者以外のアクセスを禁止しなければなりません。ファイルシステム作成時はumaskに合わせて所有者以外にも何らかのアクセス権が与えられている可能性があるため、これを修正します。

# ls -l /export
total 6
drwxr-xr-x   3 root     root           3  3月 13日  04:46 home
drwxr-xr-x   3 root     root           3  3月 18日  22:09 zones

# chmod -R 700 /export/zones

# ls -l /export
total 6
drwxr-xr-x   3 root     root           3  3月 13日  04:46 home
drwx------   3 root     root           3  3月 18日  22:09 zones

今回の例では/export/zones以下に所有者以外に対する読み込み・実行権限が与えられていたため、これを禁止しました。これを行わないとゾーン作成ができません。

次にNICの準備を行います。Solaris 11では、dladmとipadmの2つのコマンドでNICを管理します。まず、dladm show-physコマンドで現在マシンに装備されているNICの構成情報を表示します。また、dladm show-linkコマンドで現在のNICのリンク状態を表示します。

# dladm show-phys
LINK              MEDIA                STATE      SPEED  DUPLEX    DEVICE
net0              Ethernet             up         1000   full      e1000g0

# dladm show-link
LINK                CLASS     MTU    STETE    OVER
net0                phys      1500   up       --

e1000g0がNICの物理名で、これはNICのドライバによって決まってきます。この例ではe1000gドライバ、すなわちIntel PRO/1000シリーズのギガビット・イーサネットカードであることを示しています。Solaris 11では物理名に対して任意の論理名を付加し、通常は論理名を用いてNICを識別します。

さて、ゾーンに割り当てるNICは、グローバルゾーンのNICを共有するか、仮想NICを作成してそれを用いることで用意します。前者はSolaris 10に近い構成となります。後者はSolaris 11のネットワーク仮想化機能を活用することができ、例えばゾーンの手前に仮想のファイアウォールを構築するようなことも可能になります。
今回は仮想NICを作成する方法を採ります(マニュアルでもこちらが第1選択肢となっています)。共有NICを使用する方法は他を参照してください。

てっとり早く仮想NICを作成するには、dladm create-vlanコマンドでホストNIC上に仮想LANを作成すれば良いです。Solaris 11のネットワーク仮想化機能ではこの後に仮想NICや仮想スイッチなどを組み合わせて仮想ネットワーク環境を構築するのですが、ゾーンに仮想NICを割り当てるだけであれば仮想LANをそのままNICとして使えばよいです。

# dladm create-vlan -l net0 -v 100 vnic1

dladm create-vlanコマンドの書式は、以下の通りです。
dladm create-vlan -l <リンク> -v <仮想LAN ID> <仮想LAN名>
上記の例では、net0とリンクするvnic1という仮想LANを作成します。仮想LAN ID省略時は自動的に設定されます。仮想LAN IDは未使用の番号を割り当てます(仮想LAN ID: 1 はnet0が予約していることから、小さな番号は物理NICが占有している可能性が高いです)。イメージとしてはホストのNICに直接つながるスイッチが作成され、そこからLANケーブルを1本引いてきた感じです。
本来であれば、この後にipadm create-ipコマンドでIPインタフェースとして設定し、ipadm create-addrでIPアドレス(およびサブネットマスク)を割り当てるのですが、ゾーンのNICとして使う場合には不要です。むしろ、ipadmコマンドで設定済みの仮想NICを使おうとするとゾーン構築時にエラーとなり、設定解除するよう促されます。

この後、dladm show-linkコマンドでNICのリンク状態を表示すると、先ほど作成したvnic1が追加されていることを確認できます。

root@pasiphae:~# dladm show-link
LINK                CLASS     MTU    STETE    OVER
net0                phys      1500   up       --
vnic1               vnic      1500   up       net0

これでゾーンを構築する準備は整いました。ゾーン構築後すぐ名前解決ができるように準備をしておきます。今回は/etc/hostsファイルにゾーンのIPアドレスとホスト名のエントリーを追加しました。

/etc/hostsファイルの内容
#
# Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
# Use is subject to license terms.
#
# Internet host table
#
::1 pasiphae localhost
127.0.0.1       localhost       loghost
192.168.1.8     pasiphae
192.168.1.9     sinope

まず、zonecfgコマンドで構成情報を準備します。

# zonecfg -z sinope
sinope: No such zone cofigured
Use 'create' to begin configuring a new zone.
zonecfg:sinope> create
create: Using system default template 'SYSdefault'
zonecfg:sinope> set zonepath=/export/zones/sinope
zonecfg:sinope> set ip-type=exclusive
zonecfg:sinope> add net
zonecfg:sinope:net> set physical=vnic1
zonecfg:sinope:net> end
zonecfg:sinope> verify
zonecfg:sinope> commit
zonecfg:sinope> exit
まず、zonecfg -z ゾーン名でコマンドを開始します。構成情報のないゾーンについてはこの例のように作成を促されるので、プロンプト上でcreateを発行します。以降、setやaddで必要なパラメーターを設定してゆきます。

必ず設定する項目はzonepathで、ゾーンを格納する領域のファイルシステム上でのパスを指定します。パスに問題がある場合、例えばroot以外にアクセス権が与えられていたりするとこの段階でエラーとなります。
また、通常はネットワークを設定するので、ip-typeも設定します。仮想NICの場合はゾーンで属船可能ですので、ip-type=exclusive (排他的IP)に設定します。この場合、add netでの設定項目は physical=仮想NIC名 だけとなり、後述のセットアップ画面でIPアドレスなどを設定します。ip-typeの設定で共有IPを選んだ場合は、ゾーン構成に関してはSolaris 10と同等のパラメーター設定となります(zonecfgでIPアドレスなどを設定する)。ただし、共有IPの場合はipadmコマンドで共有するNICの事前設定が必要になり、やってみると意外と厄介だったため、結果的には仮想NICを作成して排他的IPにしてしまったほうが手っ取り早いというのが筆者の所感です。

zonecfgでは上記以外にもリソース管理やファイルシステム設定(ZFSファイルシステムのゾーンへの委譲を含む)などSolaris 10から引き継ぎ、さらに強化されたパラメーター設定ができます。さらにゾーンに対して権限を与えることができ、グローバルゾーンとは異なる時計を設定したり、D-Traceをゾーン単位で使用するなど、きめ細かい制御が可能になっています。ただし、今回はてっとり早くゾーンを作成するのが目的であるため、それらの説明はすべて割愛します(明示的に設定したほうが良い項目も含めて)。

zonecfgで構成した直後のゾーンsinopeは以下のような「configured」状態になっています。

# zoneadm list -vc
  ID NAME             STATUS     PATH                           BRAND    IP
   0 global           running    /                    solaris  shared
   - sinope           configured /export/zones/sinope solaris  excl

ゾーンにOSをインストールします。

# zoneadm -z sinope install
Progress being logged to /var/log/zones/zoneadm.20120318T135214Z.sinope.install
       Image: Preparing at /export/zones/sinope/root

 Install Log: /system/volatile/install.16625/install_log
 Al Manifest: /tmp/manifest.xml.waaWCG
  SC Profile: /usr/share/auto_install/sc_profiles/enable_sci.xml
    Zonename: sinope
Installagion: Starting ...

              Creating IPS image
              Installing packages from:
                  solaris
                      origin:  http://pkg.oracle.com/solaris/release/


ダウンロード                     パッケージ ファイル  転送 (MB)
Completed                              167/167 32062/32062  175.8/175.8

フェーズ                             アクション
インストールフェーズ           44313/44313

フェーズ                                  項目
パッケージ状態の更新フェーズ     167/167
イメージ状態の更新フェーズ          2/2
Installation: Succeeded

        Note: Man pages can be obtained by installing pkg:/system/manual

 done.

        Done: Installation completed in 128.451 seconds.

  Next Steps: Boot the zone, then log into the zone console (zlogin -C

              to complete the configuration process.

Log saved in non-global zone as /export/zones/sinope/root/var/log/zones/zoneadm.20120318T135214Z.sinope.install

OSをインストールした後のゾーンは以下のような「installed」状態となります。

# zoneadm list -vc
  ID NAME             STATUS     PATH                           BRAND    IP
   0 global           running    /                    solaris  shared
   - sinope           installed  /export/zones/sinope solaris  excl

この後、ゾーンのセットアップ画面を開始するのですが、ここからの手順は注意が必要です。まず、新しいターミナルを開いてzloginコマンドでログイン操作を行います。この時点でゾーンはまだブートしていないので、このターミナルは待機状態となります。

# zlogin -C sinope

新しく開いたターミナルをそのままにして、元のターミナルからzoneadmコマンドでゾーンのブートを行います。

# zoneadm -z sinope boot

この後、新しく開いたターミナル(zloginの待機中)で「System Configuration Tool」と表示され、セットアップ画面が始まったら成功です。この後の手順はSolaris 11のテキストインストーラーとほぼ同じです。
現在のSolaris 11リリースでは、ここに挙げた順序でzloginコマンドを実行しないと、zloginコマンドが応答しなくなる場合があります(少なくとも筆者の環境ではすべての試行でzloginが応答しませんでした)。

Solaris Zoneにできること・できないこと
通常(グローバルゾーン)でできることのほとんどはゾーンで行うことができます。Solaris 10から引き継いだ強力なリソース制御は使い勝手が改善され、ベアメタル・ハイパーバイザーに匹敵するほどの細かなチューニングまで可能となっています。また、ゾーンに権限を与えることができるようになり、特に今回のようにネットワーク仮想化と組み合わせた場合、ゾーンの独立性はかなり高くなります。高い独立性を保ちつつ低いリソース負荷で運用できるのがゾーンのメリットです。
ゾーンの初期状態はSolaris 11のテキストインストール直後とほぼ同等で、インストールされているコマンドは限定されていますが、pkgコマンドを用いて必要なコマンドをインストールすることができます。

マニュアルにも記載がある既知の制限事項としては、ZFSに追加されたSMBサーバ機能がゾーン内では使えない(ゾーンをSMBサーバとすることができない)ことが挙げられます。また、マニュアルには記載がありませんが、ゾーン内ではGUIの制御を司るgdm(Gnome Desktop Manager)をSMF経由で起動できないという制限(というかOpenSolaris時代からのバグ)があります。この件に関する詳細はOracleのサポートから得られます。
※キーワードに「GDM」「ConsoleKit」「D-Bus」「non-global zone」などを含めると探し出せるかと思います。