OpenIndianaでCrossbow

NAISTにはプロジェクト実習と言うのがありまして、その実習で触る事になったCrossbowについて色々メモって行こうと思います。@chmod707にも頼まれた事だしw

OpenIndianaというのはOpenSolarisの後継無償OSです。現在Build 148で、Solaris 11との互換性があるとのこと。
DebianUbuntuでヌクヌクしてた私にとってSolarisは半端無く敷居が高く、VMに入れても使いこなせずじまい…今回はリベンジできるといいですが…

もう一つ、CrossbowというのはSolarisで利用出来るネットワーク仮想化技術です。仮想スイッチだろうがルータだろうが、なんでも作れちゃうらしいです。

作業環境は以下の通り。
Xen
Dom0 : Debian 6.0.2
DomU : OpenIndiana Build 148

作成するネットワークについて


三角形のトポロジで、ルータAがWANへの足を持っています。
ルータAとルータB, ルータCとはそれぞれvnic_a1, vnic_a2で接続されます。
ルータBとルータCはそれぞれにホストを持ちます。

準備:nwamデーモンを停止する

まずは、現在動いているネットワーク構成サービスの一覧を表示させます。

# svcs network/physical
STATE          STIME    FMRI
disabled       12:10:40 svc:/network/physical:default
online         12:10:50 svc:/network/physical:nwam

標準では、Network Auto-Magic(nwam)デーモンが動いています。
Crossbowを使う場合これは邪魔になるので、停止させます。
そして、NIC(e1000g0)をdefaultサービスでDHCPを利用する様に設定します。(NICの名前を事前にifconfig -aで確認しておきましょう)

# svcadm disable svc:/network/physical:nwam
# touch /etc/hostname.xnf0
# touch /etc/dhcp.xnf0

defaultサービスを使う準備が出来たので有効にします。

# svcadm enable svc:/network/physical:default
# svcs network/physical
STATE          STIME    FMRI
disabled       12:18:36 svc:/network/physical:nwam
offline*       12:18:36 svc:/network/physical:default
(しばらくすると、)
STATE          STIME    FMRI
disabled       12:18:36 svc:/network/physical:nwam
online         12:19:50 svc:/network/physical:default

NICの状態を確認します。

# ifconfig -a
lo0: flags=2001000849<UP,LOOPBACK,RUNNING,MULTICAST,IPv4,VIRTUAL> mtu 8232 index 1
	inet 127.0.0.1 netmask ff000000 
xnf0: flags=1004843<UP,BROADCAST,RUNNING,MULTICAST,DHCP,IPv4> mtu 1500 index 7
	inet 192.168.122.7 netmask ffffff00 broadcast 192.168.122.255
	ether
lo0: flags=2002000849<UP,LOOPBACK,RUNNING,MULTICAST,IPv6,VIRTUAL> mtu 8252 index 1

仮想スイッチ、仮想NICを追加する

VNIC(仮想NIC)を追加します。このVNICは、言わば各ネットワーク機器、ホストのポートに相当する物です。VNIC同士を繋げるには仮想スイッチを使用します。

# dladm create-etherstub vswadm0
# dladm create-etherstub vswadm1
# dladm create-etherstub vswadm2
# dladm create-etherstub vswadm3
# dladm create-etherstub vswadm4
# dladm create-etherstub vswadm5
# dladm show-etherstub
LINK
vswadm0
vswadm1
vswadm2
vswadm3
vswadm4
vswadm5

# dladm create-vnic -l vswadm0 vnic0
# dladm create-vnic -l vswadm0 vnic_a0
# dladm create-vnic -l vswadm1 vnic_a1
# dladm create-vnic -l vswadm2 vnic_a2
# dladm create-vnic -l vswadm1 vnic_b0
# dladm create-vnic -l vswadm3 vnic_b1
# dladm create-vnic -l vswadm4 vnic_b2
# dladm create-vnic -l vswadm2 vnic_c0
# dladm create-vnic -l vswadm3 vnic_c1
# dladm create-vnic -l vswadm5 vnic_c2
# dladm create-vnic -l vswadm4 vnic_host_b0
# dladm create-vnic -l vswadm5 vnic_host_c0
# dladm show-link
LINK        CLASS     MTU    STATE    BRIDGE     OVER
xnf0        phys      1500   up       --         --
vswadm0     etherstub 9000   unknown  --         --
vswadm1     etherstub 9000   unknown  --         --
vswadm2     etherstub 9000   unknown  --         --
vswadm3     etherstub 9000   unknown  --         --
vswadm4     etherstub 9000   unknown  --         --
vswadm5     etherstub 9000   unknown  --         --
vnic0       vnic      9000   up       --         vswadm0
vnic_a0     vnic      9000   up       --         vswadm0
vnic_a1     vnic      9000   up       --         vswadm1
vnic_a2     vnic      9000   up       --         vswadm2
vnic_b0     vnic      9000   up       --         vswadm1
vnic_b1     vnic      9000   up       --         vswadm3
vnic_b2     vnic      9000   up       --         vswadm4
vnic_c0     vnic      9000   up       --         vswadm2
vnic_c1     vnic      9000   up       --         vswadm3
vnic_c2     vnic      9000   up       --         vswadm5
vnic_host_b0 vnic     9000   up       --         vswadm4
vnic_host_c0 vnic     9000   up       --         vswadm5

Zonesの作成

まだこのネットワークに足りないのは、ルータとホストです。ルータやホストはSolarisのZones機能を用いて作成します。
参考:

Zones機能を用いると、各ゾーンに一つ一つ個別のIPアドレスを持たせ完全に隔離されたネットワークサービスを動作させる事ができます(同じport番号上で同時にサービスを動作させても競合しない、ルーティングテーブルも各ゾーンで持つ事が可能)。
Solarisには大域ゾーンと非大域ゾーンがありますが、非大域ゾーンは大域ゾーンからブートされます。大域ゾーンは言わばホストマシンで、非帯域ゾーンが行う通信の外への窓口となります。Zonesの作成には対話コマンドを用いる方法とテンプレートを作成しておく方法などがある様です。今回はテンプレートを作成してみます。

templateゾーンの作成

まずはZFSファイルシステムを作成し、マウントします。

# zfs create rpool/zones
# zfs set compression=on rpool/zones
# zfs set mountpoint=/zones rpool/zones
# zfs list
〜新しく作成したファイルシステムが表示される〜

次に、templateファイルを以下の内容で作成します。

# cat template 
create -b
set zonepath=/zones/template
set ip-type=exclusive
set autoboot=false
commit

templateファイルを作成したディレクトリで以下のコマンドを実行します。リポジトリからダウンロードする様なので、インターネットへ接続している必要があります。
この操作には私の環境で約20分かかりました。ゾーンのインストールに失敗した時は、一旦削除(参考サイト参照)してやり直します。

# zonecfg -z template -f template
# zoneadm -z template install
A ZFS file system has been created for this zone.
   Publisher: Using openindiana.org (http://pkg.openindiana.org/dev/ ).
   Publisher: Using opensolaris.org (http://pkg.openindiana.org/legacy/).
       Image: Preparing at /zones/template/root.
       Cache: Using /var/pkg/download. 
Sanity Check: Looking for 'entire' incorporation.
  Installing: Core System (output follows)
               Packages to install:     1
           Create boot environment:    No
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
        Note: Man pages can be obtained by installing SUNWman
 Postinstall: Copying SMF seed repository ... done.
 Postinstall: Applying workarounds.
        Done: Installation completed in 1317.167 seconds.

  Next Steps: Boot the zone, then log into the zone console (zlogin -C)
              to complete the configuration process.
各ルータ、ホストのゾーンコンフィグ作成

templateゾーンと同様に各ルータ、ホストのコンフィグファイルを作成します。
host_b

# cat host_b
create -b
set zonepath=/zones/host_b
set ip-type=exclusive
set autoboot=false
add net
set physical=vnic_host_b0
end
commit

host_c

# cat host_c
create -b
set zonepath=/zones/host_c
set ip-type=exclusive
set autoboot=false
add net
set physical=vnic_host_c0
end
commit

vrouter_a

# cat vrouter_a 
create -b
set zonepath=/zones/vrouter_a
set ip-type=exclusive
set autoboot=false
add net
set physical=vnic_a0
end
add net
set physical=vnic_a1
end
add net
set physical=vnic_a2
end
commit

vrouter_b, vrouter_cは同様に作成。

ここで、sysidcfg作成を行う事でより高速にゾーンの作成が可能ですが割愛します。
sysidcfgについてはこちらを参考にしてください。

Zonesの起動

準備が整いましたので、テンプレートゾーンをクローンして各ゾーンを起動していきます。(クローンに失敗する事がありましたが、普通にインストールして以降はクローン出来るようになりました。気持ち悪いですが…とりあえず放置)

# zonecfg -z host_b -f host_b
# zoneadm -z host_b clone template
# zoneadm -z host_b boot

起動出来たら、ログインして基本的な設定(IPアドレス等)を行います。
ログアウトするには、「~.」を入力します。

# zlogin -C host_b
What type of terminal are you using?
Type the number of your choice and press Return: 6
...
host-a console login: ~.
[Connection to zone 'host_a' console closed]

同様に各ホスト、ルータの分だけ繰り返します。

# zoneadm list -v

以上でゾーンの作成が終わりました。IPアドレス等を正しく設定すれば、隣のRouterまで通信が出来る事が確認出来ます。

参考文献