最近の Trema では、仮想ネットワークに network namespace をつなげることができるようになりました。この機能を使うと、Trema の標準的な仮想ホスト (vhost) だけでなく iperf など任意のアプリケーションでコントローラをテストできるようになります。
Trema の仮想ネットワーク
Trema の仮想ネットワーク機能を使うと、開発マシン上に仮想ホスト、リンクを作り自由にトポロジを作ることができます。仮想ホストは簡単なパケット送受信機能とカウンタを備えているので、Trema で作ったコントローラをささっとテストするのに便利です。
ただしコントローラのベンチマークなど、仮想ホストだけでは機能が不十分な場合があります。たとえばコントローラの負荷テストなどで iperf や nmap を使いたい場合があると思います。
Network Namespace
最近 Trema に入った network namespace 機能では、こうした iperf や nmap などのベンチマークツールや自分で作ったプログラムといった「リアルな」アプリケーションを仮想ネットワークとつなげることができます。使い方は簡単です。設定ファイルに次のように書きます。
# network.conf vswitch { dpid 0x1 } netns( "netns0" ) { ip "192.168.0.1" } netns( "netns1" ) { ip 192.168.0.2" } link "0x1", "netns0" link "0x1", "netns0"
network namespace 部分の記述は vhost とほぼ一緒です。vhost を書くかわりに netns と書き、link で vswitch とつなげてください。こうすることで、netns0 と netns1 という network namespace が作成され、仮想スイッチ 0x1 につながります。設定ファイルは今までと同じく trema run の -c オプションに渡します。
% trema run learning-switch.rb -c network.conf
アプリの起動
作ったネームスペース上では任意のアプリケーションを起動できます。たとえば netns0 と netns1 でそれぞれ iperf のサーバとクライアントを起動するには次のようにします。
% trema netns netns0 # netns0 上でシェルを起動 % iperf -s --bind 192.168.0.1 # iperf のサーバを起動
別ターミナルを開き、
% trema netns netns1 # netns1 上でシェルを起動 % iperf -c 192.168.0.1 -u -b 100000000 --bind 192.168.0.2 # iperf のクライアントを起動
netns のオプション
netns がサポートする全オプションと記述例は次のとおりです。
netns("name") { ip "192.168.0.1" netmask "255.255.255.0" route :net => "192.168.1.0/24", :gw => "192.168.0.254" }
注意
今回紹介した netns 機能は内部的に Linux の最近のコマンドを使っているので、古い Linux では動作しません。Ubuntu だと 12.04 が必要です。