やっぱり Sun がスキ! : Weblog やっぱり Sun がスキ!

やっぱり Sun がスキ!

http://blogs.sun.com/yappri/date/20070424 2007年 4月 24日 火曜日

IP Instances and Exclusive Zones

現状の Solaris Zones は、データリンクを global zone と共有しているため、ネットワーク構成が制約されてしまい、困った経験をお持ちの方も多いかと思います。

まず、global zone とデータリンクを共有することで、どのようなデメリットがあるのでしょうか?
少なくとも、現状、non-global zone では、以下の制約があります。

・ルーティング情報の設定ができない
・IP Filter による、packet filtering ができない
・snoop コマンドによるパケット情報の採取ができない
・論理インターフェースの作成ができない
・DHCP による IP アドレスの割り当て(DHCP クライアント)ができない
・IPsec による通信ができない

特に、ルーティング情報を個別に設定できない為、異なるネットワークへ接続することができなかったり、snoop コマンドによるパケット解析ができないことなどは、大きな不満となっていることでしょう。
そのような、制限を覆すために、IP Instance と呼ばれる機能が実装されました。

IP Instance 機能は、個々の Zone を異なるネットワークや VLAN に接続可能とするために、IP レベルでのアイソレーションを実現させるものです。

今回は、そんな制約を打ち破る、IP Instance Project についてご紹介したいと思います。

この機能は、Nevada build 57 (Nevada:次期 Solaris の開発中のバージョンのコードネーム)
で実装され、Solaris 10 Update 4 にて利用可能となる予定ですので、しばし、お待ち頂ければと思います。
Solaris Express, Community Release (最新は、Nevada build 62) では、すでに利用可能となっていますので、今すぐに、お試し頂くことも可能です。

IP Instance 機能により、データリンクを共有することなく、個々の non-global zone において、IP stack を持つことが可能となる、exclusive-IP と呼ばれる設定が追加されました。
exclusive と名から察することができるかと思いますが、利用していない物理ネットワーク・インターフェースが必要となります。これを、non-global zone に割り当てることで実現しているため、ソフトウェアのみによる解決ではありませんが、物理ネットワークインターフェースを捧げることで、制約がなくなるな らば、決して高くはない代償かとも思います。
一方、従来の方式は、shared-IP と呼ばれますが、もちろん、この機能も利用可能であることを付け加えておきます。

では、この IP Instance 機能をどのように利用するか、具体的に見てみましょう。
IP Instance は、いまのところ Solaris Zones に特化した機能となっているため、設定は、zonecfg コマンドで行うことになります。
試しに、non-global zone がない状況で、zoenadm コマンドを実行し、global zone の状況を確認してみましょう。

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

末尾に IP という項目が増え、その値は、shared となっています。
これが、IP Instance 機能の状況を示す項目となり、次の二種類があります。

・shared (shared-IP)
従来のネットワークインターフェース共有型で、shared-IP zone であることを示す。

・excl (exclusive-IP)
IP Instance 機能による、ネットワークインターフェース非共有型で、exclusive-IP zone であることを示す。

global zone は、shared に固定のため、特に気にする必要はありません。 shared か excl かは、non-global zone に設定する項目となります。

それでは、exclusive-IP zone である non-global zone を作成してみましょう。
zonecfg コマンドの手順は、次のようになります。

# zonecfg -z kazusZone
zonecfg:kazusZone> create
zonecfg:kazusZone> set zonepath=/export/Zones/test
zonecfg:kazusZone> set ip-type=exclusive
zonecfg:kazusZone> add net
zonecfg:kazusZone:net> set physical=e1000g1
zonecfg:kazusZone:net> end

zonecfg:kazusZone> export
create -b
set zonepath=/export/Zones/test
set autoboot=false
set ip-type=exclusive
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 physical=e1000g1
end
zonecfg:kazusZone> commit
zonecfg:kazusZone>
zonecfg:kazusZone> exit
上記の手順にある、赤字部分に、注目してください。
以下に抜粋します。
zonecfg:kazusZone> set ip-type=exclusive
zonecfg:kazusZone> add net
zonecfg:kazusZone:net> set physical=e1000g1
zonecfg:kazusZone:net> end

IP Instance 機能の実装により、ip-type というオプションが追加されました。non-global zone を作成する際に、set ip-type=exclusive オプションを指定することで、機能が有効となります。(設定しない場合は、shared-IP zoneとなります)
また、利用するネットワークインターフェースを追加する際に、physical オプションには、割り当てる物理ネットワークインターフェースを指定しますが、必ず、利用していない物理ネットワークインターフェースを割り当てる必要があります。

設定は、これだけで、非常に簡単です。
次に、作成した non-global zone を起動できるように、作業を進めます。
# zoneadm -z kazusZone install

Preparing to install zone <kazusZone>.
Creating list of files to copy from the global zone.
Copying <6745> files to the zone.
Initializing zone product registry.
Determining zone package initialization order.
Preparing to initialize <1188> packages on the zone.
Initialized <1188> packages on zone.                                
Zone <kazusZone> is initialized.
The file </export/Zones/test/root/var/sadm/system/logs/install_log> contains a log of the zone installation.

手順的には、新しい操作は一切ありません。
これで準備は、整いました。 zoneadm コマンドで確認すると、次のようになっています。

# zoneadm list -vc
  ID NAME             STATUS     PATH                            BRAND        IP   
   0 global                running    /                                  native       shared
   ー  kazusZone        installed    /export/Zones/test         native       excl 
作成した non-global zone である、kazusZone が持つ、IP 項目には、excl が 設定され、この non-global zone は、exclusive-IP を利用するよう設定されていることがわかります。

non-global zone の作成経験を持つ方などは、「IP アドレスの設定などは zonecfg で行わないの?」という疑問を持つかもしれません。zonecfg コマンドの add net サブコマンドによる IP アドレスの設定(set address=) は必要なく、global zone 同様、non-global zone の中でおこないます。
zlogin コマンドを起動し、作成した non-global Zone に接続し、boot することで、設定可能となります。
このあたりは、Solaris のインストール時と同様の感覚になりますので、ご安心を。

exclusive-IP zone に割り当てられた、ネットワークインターフェースは、global zone と同様に、物理インターフェースとして見えます。

# zonename
kazusZone

# zoneadm list -cv                                                          
  ID NAME             STATUS     PATH                           BRAND    IP   
   2 kazusZone       running        /                                native     excl

# ifconfig -a
lo0: flags=2001000849<UP,LOOPBACK,RUNNING,MULTICAST,IPv4,VIRTUAL> mtu 8232 index 1
        inet 127.0.0.1 netmask ff000000
e1000g1: flags=201000803<UP,BROADCAST,MULTICAST,IPv4,CoS> mtu 1500 index 2
        inet 192.168.1.1 netmask ffffff00 broadcast 192.168.1.255
        ether 0:c:29:5a:50:e7

従来の shared-IP zone では、global zone に存在する物理インターフェースから、論理インターフェースを作成することで、non-global zone に割り当てを行っていました。
また、global zone には、割り当てられた network interface の情報は表示されず、non-global zone が、その情報を持つこととなります。 (kstat コマンドでは、見えますが・・・ )

また、global zone からは、dladm show-linkprop コマンドを実行することとで、ネットワークインターフェースが、どんな non-global zone で利用されているかを確認することができます。(dladm コマンドは、non-global zone では動作しません。)

# dladm show-linkprop                                                       
LINK         PROPERTY        VALUE          DEFAULT        POSSIBLE            
e1000g0      zone                --                 --                     --                  
e1000g1      zone               kazusZone     --                     --             

exclusive-IP が設定された non-global zone で、snoop コマンドでパケットを採取したり、ルーティング情報を設定することもできます。 ndd コマンドを使って /dev/tcp, ip のパラメータを設定することも可能になります。また、DHCP client にもなれます。

より柔軟に non-global zone を構成することが可能となりますね。

IP Instance 機能の詳細については、下記 OpenSolaris project ページにてドキュメントが公開されていますので、ぜひ、参照して頂ければと思います。

http://opensolaris.org/os/project/crossbow/Docs/

URL からもわかりますが、この IP Instance 機能、実は、Multithreaded 10 Gig E のエントリでもご紹介した、Crossbow プロジェクトのサブセットとなっています。Crossbow プロジェクトとしてのフル実装では、IP Instance 機能に加え、ネットワークインターフェースに仮想化機能を提供する VNIC 機能、VNIC 仮想インターフェースを接続するための仮想スイッチを提供する、vSwitch 機能などが利用できるようになります。

特に、VNIC 機能が実装されると、exclusive-IP において物理ネットワークインターフェース以外に、VNIC 仮想インターフェースが利用可能となるため、デメリットがさらに少なくなります。

(たとえば、e1000g1 を VNIC 機能で仮想化し、個々の VNIC インターフェースと exclusive-IP が設定された non-global zone を紐付けることで、物理的な制約からも解放されます。)

Crossbow プロジェクトの完成が楽しみですね。