« Trema の仮想ネットワーク機能には『OpenFlow実践入門』に書いてない強力な機能がありました。 | トップページ | OpenFlowスイッチ(Open vSwitch)の性能測定 »

2013年2月10日 (日)

2万円で OpenFlow スイッチを自作しよう

ソフトウェア寄りのことばかりしていたので少しだけハード寄りのことをしたくなりました。そこで目に付いたのが、去年の10月に衝動買いで買った中古のノートPC。
買ったものの遊んでいたので OpenFlow スイッチにしました。作業記録を残しておきます。参考までに、構想、見積もりも書いておきます。

■ OpenFlow スイッチの作り方概要

Open vSwitch という OpenFlow にも対応した仮想スイッチのソフトウェアがあるのでこれを使います。ちなみに、OpenFlowフレームワーク Trema の仮想ネットワーク機能の仮想 OpenFlow スイッチもこの Open vSwitch を使っているとのこと(書籍『OpenFlow実践入門』(初版、「仮想ネットワーク」P.195)。

ハード側での悩みどころは、複数のLANポートをどうやって用意するかです。複数ポートを持つLANカードは非常に高価だったり、かといって複数のカードを刺すとしても物理的に増設できるスロットが限られます。そこは、USB LAN アダプタで解決できると考えました。USB なら USB ハブで接続できる個数を容易に増やせます。価格も100Mイーサで USB 2.0 のものなら安いのだと 1000円程度で手に入ります。

まとめると、
(1) Open vSwitch をインストールし、OpenFlow スイッチとして設定する。
(2) USB LAN アダプタを使って複数ポート用意して OpenFlow 専用のポートとする。
で、OpenFlow スイッチが作れる。

用意するもの:
  ・USB LAN アダプタ を数個
  ・Open vSwitch が動き、USB LAN アダプタが使える OS (Linux)
  ・その OS が動く PC
     (USB LAN アダプタが使えれば良いので、実は VMwarePlayer や VMwareWorkstation 上の仮想マシンでも構いません。)
  ・インターネット接続環境 (インストール時のみ)
  ・必要に応じて USB ハブ(ACアダプタ付きが安心)
  ・LAN ケーブル(クロス) (ストレートでなくクロスです。注意!)

■懸案あれこれ

その USB LAN アダプタが Linux で使えるかどうかが心配な点。インターネットで検索して動作実績の報告があるものを選んだほうが良いでしょう。

また、入手のしやすさという点で、LAN ケーブルがストレートケーブルではなくクロスケーブルでつなぐ必要があることがちょっとやっかいかもしれません。あまり取り扱いがなくて店舗では在庫ありませんって言われる可能性も。

USB ハブで増やせるとはいっても、USB 2.0 は高速モードで 480Mbps です。100Mbps の USB LAN アダプタを5つ接続すると単純計算で 100Mbps × 5 = 500Mbps なので 480 を超えてしまいます。ピーク性能を考えると4つまでにしておいた方が良さそう。

また、LAN で通信するのでUSB LAN アダプタの消費電流も心配。ググってみて見つけた I-O DATA のETX3-US2 のスペックを見てみると最大 250mA と書いてあります。USB 2.0 が供給できるは 500mA ですから、AC アダプタを使わないバスパワーの USB ハブにつなぐとすると最大2つまで。USB ハブはACアダプタ付きがよさそうです。 

■概算見積もり

2ポートの場合:
中古ノートPC(LAN内蔵)   ... 約 10,000 円
USB LANアダプタ          ... 約  4,000 円 (1個2000円を2個)
LANケーブル(クロス)       ... 約  1,200 円 (1本600円を2本)
USB HUB(ACアダプタ付) ... 約 3,000 円
----------------------------------------
合計                              18,200 円

高めに設定しているので、LAN アダプタ+ケーブルをもう1つ増やして3ポートにできると思います。

実際に購入した金額:
 中古ノートPC1台 10,500円  (内蔵: LANポート×1、USB 2.0ポート×3)
  USB LAN アダプタ1個680円を4個 (ノーブランドだが、Linux で動作すると記載有り)
  クロスケーブル1m 100円を4本(ノーブランド。たまたま特価で購入)
 概算では2ポートとしたが今後の拡張に備えて4ポート分を購入。
  USB HUB は無しにして0円(内蔵で3つあるのでとりあえず不要)
合計:
  10500 + (680 + 100)×4 = 13,620円

ちなみに、VMwarePlayer や VMwareWorkstation にはホストOSのUSBをうばって仮想マシンにつなぐ機能があるので、これを使って仮想マシンですませれば1万円以下!。


■ 今回実際に用意した環境
・本体
  Panasonic Let's Note CF-T7
    CPU: Core Duo U7500 (1.06GHz)
    USB 2.0 ポートが3つ。
    100Mbps イーサネットポートが1つ。
・OS
  Lubuntu 12.04 Desktop (i386)
・USB LAN アダプタを2個 (もう2個あるが未使用)
  ノーブランドの USB 2.0 の 100/10Mbps LAN アダプタ
 (型名らしきもの: JP208B NO:88772A)

上記環境にて Lubuntu 12.04 がインストール済で、インターネットに接続されている状態まで準備が完了したところから書いていきます。

Photo_4

■ステップ1. USB LAN アダプタを接続する

接続すると自動で認識してくれます。
ifconfig コマンドで確認して増えていれば OK。
以下の出力結果は、eth0 が内蔵LAN で、eth1, eth2 が追加したものです。

$ ifconfig
eth0	  Link encap:イーサネット  ハードウェアアドレス 00:0b:97:51:1e:3b
	  inetアドレス:192.168.42.17  ブロードキャスト:192.168.42.255  マスク:255.255.255.0
	  inet6アドレス: fe80::20b:97ff:fe51:1e3b/64 範囲:リンク
	  UP BROADCAST RUNNING MULTICAST  MTU:1500  メトリック:1
	  RXパケット:26401 エラー:0 損失:0 オーバラン:0 フレーム:0
	  TXパケット:16068 エラー:0 損失:0 オーバラン:0 キャリア:0
	  衝突(Collisions):0 TXキュー長:1000
	  RXバイト:35715361 (35.7 MB)  TXバイト:1346516 (1.3 MB)
	  割り込み:16

eth1	  Link encap:イーサネット  ハードウェアアドレス 00:0e:c6:f0:4b:26
	  UP BROADCAST MULTICAST  MTU:1500  メトリック:1
	  RXパケット:0 エラー:0 損失:0 オーバラン:0 フレーム:0
	  TXパケット:0 エラー:0 損失:0 オーバラン:0 キャリア:0
	  衝突(Collisions):0 TXキュー長:1000
	  RXバイト:0 (0.0 B)  TXバイト:0 (0.0 B)

eth2	  Link encap:イーサネット  ハードウェアアドレス 00:0e:c6:f0:2e:32
	  UP BROADCAST MULTICAST  MTU:1500  メトリック:1
	  RXパケット:0 エラー:0 損失:0 オーバラン:0 フレーム:0
	  TXパケット:0 エラー:0 損失:0 オーバラン:0 キャリア:0
	  衝突(Collisions):0 TXキュー長:1000
	  RXバイト:0 (0.0 B)  TXバイト:0 (0.0 B)

lo	  Link encap:ローカルループバック
	  inetアドレス:127.0.0.1  マスク:255.0.0.0
	  inet6アドレス: ::1/128 範囲:ホスト
	  UP LOOPBACK RUNNING  MTU:16436  メトリック:1
	  RXパケット:953 エラー:0 損失:0 オーバラン:0 フレーム:0
	  TXパケット:953 エラー:0 損失:0 オーバラン:0 キャリア:0
	  衝突(Collisions):0 TXキュー長:0
	  RXバイト:88680 (88.6 KB)  TXバイト:88680 (88.6 KB)

■ステップ2. ネットワークマネージャからはずす

新しく追加したものは、OpenFlow 専用としたいので余計なことをされたくありません。
ネットワークマネージャの設定にて「自動接続する」のチェックをはずしておきます。
腕に覚えがある方なら、ネットワークマネージャ自体を削除しておくのも良いと思います。

1) [設定]-[ネットワーク接続]で「ネットワーク接続」ウィンドウを起動。
2) 「有線」タブから、それっぽいのを選んで「編集」ボタンを押す。
3) MACアドレスが追加した USB LAN アダプタのものであることを確認した上で「自動接続する」のチェックをはずす。
Autoconnection

先ほどの ifconfig コマンドの結果で「ハードウェアアドレス」の箇所が MAC アドレスです。

4) 「保存...」ボタンを押す。

■ステップ3. OpenVSwitch のインストール

以下のコマンドでインストールします:

$ sudo apt-get install openvswitch-switch

以下がその後に表示されるメッセージです。途中でエラーらしきメッセージ(bad exit status: 2)が2つ出ますが、その後、動作に問題は見つかっていません。無視できるメッセージのようです。

パッケージリストを読み込んでいます... 完
依存関係ツリーを作成しています... 完
状態情報を読み取っています... 完
以下の特別パッケージがインストールされます:
  binutils dkms fakeroot gcc gcc-4.6 libc-dev-bin libc6-dev libgomp1
  libquadmath0 linux-libc-dev make manpages-dev openvswitch-common
  openvswitch-datapath-dkms
提案パッケージ:
  binutils-doc gcc-multilib autoconf automake1.9 libtool flex bison gdb
  gcc-doc gcc-4.6-multilib libmudflap0-4.6-dev gcc-4.6-doc gcc-4.6-locales
  libgcc1-dbg libgomp1-dbg libquadmath0-dbg libmudflap0-dbg binutils-gold
  glibc-doc make-doc ethtool
以下のパッケージが新たにインストールされます:
  binutils dkms fakeroot gcc gcc-4.6 libc-dev-bin libc6-dev libgomp1
  libquadmath0 linux-libc-dev make manpages-dev openvswitch-common
  openvswitch-datapath-dkms openvswitch-switch
アップグレード: 0 個、新規インストール: 15 個、削除: 0 個、保留: 0 個。
22.0 MB のアーカイブを取得する必要があります。
この操作後に追加で 66.5 MB のディスク容量が消費されます。
続行しますか [Y/n]? Y

     【途中省略】

openvswitch-datapath-dkms (1.4.0-1ubuntu1.3) を設定しています ...

Creating symlink /var/lib/dkms/openvswitch/1.4.0/source ->
		 /usr/src/openvswitch-1.4.0

DKMS: add completed.

Kernel preparation unnecessary for this kernel.  Skipping...

Building module:
cleaning build area....(bad exit status: 2)
./configure --with-linux=/usr/src/linux-headers-3.2.0-37-generic ; make -C datapath/linux.................
cleaning build area....(bad exit status: 2)

DKMS: build completed.

openvswitch_mod:
Running module version sanity check.
 - Original module
   - No original module exists within this kernel
 - Installation
   - Installing to /lib/modules/3.2.0-37-generic/updates/dkms/

brcompat_mod.ko:
Running module version sanity check.
 - Original module
   - No original module exists within this kernel
 - Installation
   - Installing to /lib/modules/3.2.0-37-generic/updates/dkms/

depmod........

DKMS: install completed.
openvswitch-switch (1.4.0-1ubuntu1.3) を設定しています ...
 * Inserting openvswitch module
 * /etc/openvswitch/conf.db does not exist
 * Creating empty database /etc/openvswitch/conf.db
 * Starting ovsdb-server
 * Configuring Open vSwitch system IDs
 * Starting ovs-vswitchd
 * Enabling gre with iptables
libc-bin のトリガを処理しています ...
ldconfig deferred processing now taking place

サービスのステータスを確認してみると起動しています

$ service openvswitch-switch status
ovsdb-server is running with pid 8980
ovs-vswitchd is running with pid 8989

■ステップ4. Open vSwitch にブリッジ設定を追加する

新規にブリッジをつくります。ここでは、br0 という名前にしています。

$ sudo ovs-vsctl add-br br0

作ったブリッジに OpenFlow のポートとして使うインタフェースを追加します:

$ sudo ovs-vsctl add-port br0 eth1
$ sudo ovs-vsctl add-port br0 eth2

追加されていることを確認してみます:

$ sudo ovs-vsctl show
94f17419-c73c-4592-9ee9-539f90d1057b
    Bridge "br0"
	Port "eth1"
	    Interface "eth1"
	Port "eth2"
	    Interface "eth2"
	Port "br0"
	    Interface "br0"
		type: internal
    ovs_version: "1.4.0+build0"

■ステップ5. OpenFlowコントローラの LAN セグメントに接続

このステップはご使用の環境によって色々なやり方があると思います。

今回の環境では OpenFlow コントローラはインターネット接続できる LAN とは別の独立した LAN としており、OpenFlow スイッチ側の IPアドレスは192.168.2.20 として設定します。
まず、LAN ケーブルを引き抜きます。

次に、内蔵 LAN である eth0 をネットワークマネージャの設定画面で「手動」として192.168.2.20 に固定のIPアドレスで設定します。
これで、インターネットとは通信できなくなりますが、必要な時はまた設定を DHCP に戻してインターネットにつなげれば良いだけなので問題ありません。

設定後、LAN ケーブルを OpenFlow コントローラ側の LAN セグメントにつないで、OpenFlow コントローラの IP アドレスに対して ping するなどして通信確認をしておきます。

■ステップ6. OpenFlow コントローラを指定する

今回は OpenFlow コントローラは、IPアドレス 192.168.2.10、ポートはデフォルト、TCP での接続として設定しています。

コントローラの設定を表示させても最初は何も表示されません:

$ sudo ovs-vsctl get-controller br0

設定を追加します:

$ sudo ovs-vsctl set-controller br0 tcp:192.168.2.10

追加後に再度コントローラの情報を表示させた結果:

$ sudo ovs-vsctl get-controller br0
tcp:192.168.2.10

Open vSwitch の情報を表示させるとコントローラの設定も確認できます:

$ sudo ovs-vsctl show
94f17419-c73c-4592-9ee9-539f90d1057b
    Bridge "br0"
	Controller "tcp:192.168.2.10"
	Port "eth1"
	    Interface "eth1"
	Port "eth2"
	    Interface "eth2"
	Port "br0"
	    Interface "br0"
		type: internal
    ovs_version: "1.4.0+build0"

■ステップ7. OpenFlow コントローラとの接続確認

ここでは OpenFlow コントローラ用に、OpenFlow フレームワークの Trema を用意しました。
以前の記事で紹介した5行で書いたリピーターハブ を用いました。

Trema 起動前で未接続のときのフローエントリは空っぽです:

$ sudo ovs-ofctl dump-flows br0
NXST_FLOW reply (xid=0x4):

Trema を起動し接続後のときのフローエントリの表示:

$ sudo ovs-ofctl dump-flows br0
NXST_FLOW reply (xid=0x4):
 cookie=0x1, duration=1.037s, table=0, n_packets=0, n_bytes=0, priority=65535 actions=FLOOD

■ステップ8. ホストと LAN ケーブルでつなぐ

クロスケーブルをつかって、USB LAN アダプタとホストを直接つなぎます。

今回は、Lubuntu 12.04 を入れた PC を2台用意して接続しました。IPアドレスは、192.168.0.1 と 192.168.0.2 としました。

オートネゴシエーションやLINK状態の変化を確認したかったので両ホストとも起動した状態でケーブルを接続します。変化したところを赤字にしてあります。

接続前の状態:

$ sudo ovs-ofctl show br0
OFPT_FEATURES_REPLY (xid=0x1): ver:0x1, dpid:0000000ec6f02e32
n_tables:255, n_buffers:256
features: capabilities:0xc7, actions:0xfff
 1(eth1): addr:00:0e:c6:f0:2e:32
     config:	 0
     state:	 LINK_DOWN
     current:	 10MB-HD AUTO_NEG
     advertised: 10MB-HD 10MB-FD 100MB-HD 100MB-FD COPPER AUTO_NEG
     supported:  10MB-HD 10MB-FD 100MB-HD 100MB-FD COPPER AUTO_NEG
 2(eth2): addr:00:0e:c6:f0:4b:26
     config:	 0
     state:	 LINK_DOWN
     current:	 10MB-HD AUTO_NEG
     advertised: 10MB-HD 10MB-FD 100MB-HD 100MB-FD COPPER AUTO_NEG
     supported:  10MB-HD 10MB-FD 100MB-HD 100MB-FD COPPER AUTO_NEG
 LOCAL(br0): addr:00:0e:c6:f0:2e:32
     config:	 PORT_DOWN
     state:	 LINK_DOWN
OFPT_GET_CONFIG_REPLY (xid=0x3): frags=normal miss_send_len=0

2台のホストを OpenFlowスイッチに接続後の状態:

$ sudo ovs-ofctl show br0
OFPT_FEATURES_REPLY (xid=0x1): ver:0x1, dpid:0000000ec6f02e32
n_tables:255, n_buffers:256
features: capabilities:0xc7, actions:0xfff
 1(eth1): addr:00:0e:c6:f0:2e:32
     config:	 0
     state:	 0
     current:	 100MB-FD AUTO_NEG
     advertised: 10MB-HD 10MB-FD 100MB-HD 100MB-FD COPPER AUTO_NEG
     supported:  10MB-HD 10MB-FD 100MB-HD 100MB-FD COPPER AUTO_NEG
 2(eth2): addr:00:0e:c6:f0:4b:26
     config:	 0
     state:	 0
     current:	 100MB-FD AUTO_NEG
     advertised: 10MB-HD 10MB-FD 100MB-HD 100MB-FD COPPER AUTO_NEG
     supported:  10MB-HD 10MB-FD 100MB-HD 100MB-FD COPPER AUTO_NEG
 LOCAL(br0): addr:00:0e:c6:f0:2e:32
     config:	 PORT_DOWN
     state:	 LINK_DOWN
OFPT_GET_CONFIG_REPLY (xid=0x3): frags=normal miss_send_len=0

接続前後で、state の箇所が変わって、LINK Up/Down を認識しています。また、100MB-FD つまり 100MB 全二重(Full Duplex)で接続できています。

■ステップ9. ホスト間での ping 確認

2台のホストで互いに相手めがけて ping を実行し応答があることを確認します。

これで完了!
さて、どれくらい性能が出るのか気になるところ。次回は測定結果を書いてみたいと思います。

■補足
(1) ovs-vsctl での設定はOS起動後も残っています。
(2) インターネット未接続で使うなら Lubuntu の設定をこうしたら良いということがあるかもしれません。気がついたら追記しておきます。

■おまけ: 安上がりにすませるには

この記事を見てやってみたいなと思った人がいたとして、マシンの確保が困ると思い代替案を考えてみました。

1) OpenFlow コントローラ用のPC。これは、別マシンにしなくてもOpenFlow スイッチ側に Trema をインストールしてしまえば不要です。その場合、Open vSwitch に OpenFlow コントローラを設定をする箇所で tcp:127.0.0.1 とローカルループバックを指定すれば良い。

2) 残るは、ホスト2台を用意するところ。このホストも仮想マシンで動かしてしまえば良い。ホスト用に2つ USB LAN アダプタを用意しておき、VMwarePlayer か VMwareWorkstation で仮想マシンをつくり、その USB LAN アダプタを割り当てる。軽量 Linux を使えばメモリの使用量もおさえられて複数起動も困らないでしょう。

...

と、そこまでするなら OpenFlow スイッチの作成も USB LAN アダプタは使わず、すべてVMware のなかだけですませてしまうという方法もありですね...

« Trema の仮想ネットワーク機能には『OpenFlow実践入門』に書いてない強力な機能がありました。 | トップページ | OpenFlowスイッチ(Open vSwitch)の性能測定 »

OpenFlow」カテゴリの記事

コメント

コメントを書く

(ウェブ上には掲載しません)

トラックバック


この記事へのトラックバック一覧です: 2万円で OpenFlow スイッチを自作しよう:

« Trema の仮想ネットワーク機能には『OpenFlow実践入門』に書いてない強力な機能がありました。 | トップページ | OpenFlowスイッチ(Open vSwitch)の性能測定 »

最近のトラックバック

無料ブログはココログ