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コマンドの書式は、以下の通りです。
仮想LAN ID省略時は自動的に設定されます。仮想LAN IDは未使用の番号を割り当てます(仮想LAN ID: 1 はnet0が予約していることから、小さな番号は物理NICが占有している可能性が高いです)。イメージとしてはホストのNICに直接つながるスイッチが作成され、そこからLANケーブルを1本引いてきた感じです。
dladm create-vlan -l <リンク> -v <仮想LAN ID> <仮想LAN名>上記の例では、net0とリンクするvnic1という仮想LANを作成します。
本来であれば、この後に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」などを含めると探し出せるかと思います。