2007年 4月 24日 火曜日
やっぱり Sun がスキ!
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)
・excl (exclusive-IP)
従来のネットワークインターフェース共有型で、shared-IP zone であることを示す。
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=exclusiveIP Instance 機能の実装により、ip-type というオプションが追加されました。non-global zone を作成する際に、set ip-type=exclusive オプションを指定することで、機能が有効となります。(設定しない場合は、shared-IP zoneとなります)
zonecfg:kazusZone> add net
zonecfg:kazusZone:net> set physical=e1000g1
zonecfg:kazusZone:net> end
また、利用するネットワークインターフェースを追加する際に、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 コマンドで確認すると、次のようになっています。
作成した non-global zone である、kazusZone が持つ、IP 項目には、excl が 設定され、この non-global zone は、exclusive-IP を利用するよう設定されていることがわかります。# zoneadm list -vc ID NAME STATUS PATH BRAND IP 0 global running / native shared ー kazusZone installed /export/Zones/test native excl
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
また、global zone には、割り当てられた network interface の情報は表示されず、non-global zone が、その情報を持つこととなります。 (kstat コマンドでは、見えますが・・・ )
また、global zone からは、dladm show-linkprop コマンドを実行することとで、ネットワークインターフェースが、どんな non-global zone で利用されているかを確認することができます。(dladm コマンドは、non-global zone では動作しません。)
exclusive-IP が設定された non-global zone で、snoop コマンドでパケットを採取したり、ルーティング情報を設定することもできます。 ndd コマンドを使って /dev/tcp, ip のパラメータを設定することも可能になります。また、DHCP client にもなれます。# dladm show-linkprop
LINK PROPERTY VALUE DEFAULT POSSIBLE
e1000g0 zone -- -- --
e1000g1 zone kazusZone -- --
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 仮想インターフェースが利用可能となるため、デメリットがさらに少なくなります。
Crossbow プロジェクトの完成が楽しみですね。
Posted at 01:36午後 4 24, 2007 by noriho in Sun | 投稿されたコメント[0]