今回は、実際にTremaの環境を導入し、リピータハブとして動作する簡単なOpenFlowコントローラを作成する方法を紹介します。
前回「SDNの基本動作とアジャイルな開発が可能なSDN実装、『Trema』」ではSDN/OpenFlowの概要と、OpenFlowのプログラミングフレームワーク「Trema」の特徴を中心に紹介しました。今回は、実際にTremaを利用し、簡単なOpenFlowコントローラを作成する方法を紹介します。
これから「アジャイルなOpenFlowプログラミングフレームワーク環境」を、種も仕掛けもないPC1台だけで本当に開発してみます。
まず初めに、PCを1台用意してください。もちろん、普段利用しているPCでも構いません。Tremaを動作させるOSはLinuxですが、用意できるPCがWindowsマシンならば仮想PC環境(VMwareやVirtualBoxなど)を利用すればいいでしょう。
TremaはLinux上で動作し、本家サイトではUbuntuやDebian環境への導入方法がガイドされています。ここでも、無用なトラブルを避けるため、Ubuntu Server 12.04.2 LTS(32bit)環境をベースに手順を説明します(Desktop Editionでもよいのですが、コンパクトなServer Editionを利用します)。
Ubuntu 12.04の導入構成は標準構成で問題ありません。必要なパッケージについては後ほど、apt-getコマンドで導入します。
Tremaの導入には大きく分けて2種類の方法が存在します。1つはRubyGemsを使ってインストールする方法。もう1つはgitリポジトリからソースを入手し、自分でビルドする方法です。
今回は、RubyGemsを使ってインストールを行います。
まず、Tremaに必要な依存パッケージ一式を導入します。Ruby 1.9ではTremaビルドに失敗するため、明示的に1.8を指定します。
$ sudo apt-get install -y git gcc make ruby1.8 ruby1.8-dev libpcap-dev libsqlite3-dev rubygems1.8
RubyGemsのコマンドでTremaを導入します。
$ sudo gem install trema
たったこれだけです。Tremaの導入自体は以上で完了ですが、ついでにTrema/Appsからサンプルアプリを入手しておきましょう。ここには、OpenFlowコントローラを記述していく上で参考になるコードがあふれています。皆さんも今回の記事を読み終われば、これらのコードも読みたくなっているに違いありません。
$ git clone git://github.com/trema/apps.git
では早速、OpenFlowコントローラを作成してみましょう。
初めに、Tremaで作成したOpenFlowコントローラの起動方法を確認するため、何も処理を行わないnullコントローラを描いてみます。
まずnull.rbという名前でファイルを作成します。以下のコードでは「NullController」という名前のOpenFlowコントローラを作成しています。
#null OpenFlow Controller class NullController < Controller end
このOpenFlowコントローラを起動するには、以下のように入力します。
$ trema run null.rb
netstatコマンドによって、プロセス起動中は、作成したOpenFlowコントローラが6633ポートでLISTENしていることが分かると思います。
$ netstat -ln Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN tcp 0 0 0.0.0.0:6633 0.0.0.0:* LISTEN tcp6 0 0 :::22 :::* LISTEN udp 0 0 0.0.0.0:68 0.0.0.0:*
このコントローラを終了するには、[CTRL]+cでプログラムを終了するか、別コンソールで以下のコマンドを実行します(今回引数として指定しているNullControllerは、ソースにあったクラス名になります)。
$ trema kill NullController
Tremaには前回紹介したとおり、OpenFlowコントローラのデバッグが可能なシミュレータが搭載されています。このシミュレータの起動方法も確認しておきましょう。
シミュレータのネットワーク構成として、以下のようなものを作成してみましょう。
シミュレータファイルをsim_ofn.confとして作成します。
vswitch("01") { datapath_id "0x01" } vhost("host1") vhost("host2") link "01", "host1" link "01", "host2"
行数 | 内容 |
---|---|
1行目 | OpenFlowスイッチの定義です。datapath_idは、OpenFlowスイッチを一意に識別する64ビットの任意の整数値です。 |
3〜4行目 | OpenFlowスイッチに接続されている端末の定義です。 |
6〜7行目 | ネットワーク接続の定義です。スイッチの“01”と端末“host1”、スイッチの“01”と端末“host2”を結線しています。 |
シミュレータの起動は以下のようにして行います。sudoコマンドを使わず起動した場合でも、後からsudoを求められる動作を取るため実用上は問題ありません。しかし、複数のプログラムを組み合わせて起動した際にちょっと面倒なので、trema起動時にsudoしてしまいます。
$ sudo trema run -c sim_ofn.conf null.rb
起動後プロセスを見ると、OpenFlowスイッチとしてOpen vSwitchが、端末としてphostが起動していることが分かります。
$ ps -ef root 27143 11243 0 11:38 pts/1 00:00:00 sudo trema run -c test.conf test.rb root 27144 27143 0 11:38 pts/1 00:00:00 ruby /var/lib/gems/1.8/gems/trema-0.3.19/././bin/trema run -c test.conf root 27150 1 0 11:38 ? 00:00:00 /var/lib/gems/1.8/gems/trema-0.3.19/objects/switch_manager/switch_manage root 27211 1 3 11:38 ? 00:00:17 /var/lib/gems/1.8/gems/trema-0.3.19/objects/phost/phost -i trema0-1 -p / root 27216 1 3 11:38 ? 00:00:17 /var/lib/gems/1.8/gems/trema-0.3.19/objects/phost/phost -i trema1-1 -p / root 27221 1 0 11:38 ? 00:00:00 /var/lib/gems/1.8/gems/trema-0.3.19/objects/openvswitch/bin/ovs-openflow root 27225 1 0 11:38 ? 00:00:00 switch.127.0.0.1:49224 --name=switch.127.0.0.1:49224 --socket=3 --daemon root 27230 27144 2 11:38 pts/1 00:00:13 HubController
インターフェイスとして、以下のように仮想インターフェイスが作成される形になり、これは、作業しているLinuxホストOSからも見ることができます。Open vSwitchに触れたことがある方ならばあまり違和感はないのではないでしょうか。
もやっとした状態とはいえ、これでとりあえずOpenFlowな仮想ネットワークができていると想像できれば問題ないでしょう。
openflow@ubuntu:~/apps/routing_switch$ ifconfig trema0-0 Link encap:Ethernet HWaddr b6:cc:fc:43:e5:33 UP BROADCAST RUNNING PROMISC MULTICAST MTU:1500 Metric:1 RX packets:0 errors:0 dropped:0 overruns:0 frame:0 TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:0 (0.0 B) TX bytes:0 (0.0 B) trema0-1 Link encap:Ethernet HWaddr e6:dc:26:55:63:81 UP BROADCAST RUNNING PROMISC MULTICAST MTU:1500 Metric:1 RX packets:0 errors:0 dropped:0 overruns:0 frame:0 TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:100000 RX bytes:0 (0.0 B) TX bytes:0 (0.0 B) trema1-0 Link encap:Ethernet HWaddr 8a:c3:a5:29:1f:8e UP BROADCAST RUNNING PROMISC MULTICAST MTU:1500 Metric:1 RX packets:0 errors:0 dropped:0 overruns:0 frame:0 TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:0 (0.0 B) TX bytes:0 (0.0 B) trema1-1 Link encap:Ethernet HWaddr 62:fa:93:43:be:f9 UP BROADCAST RUNNING PROMISC MULTICAST MTU:1500 Metric:1 RX packets:0 errors:0 dropped:0 overruns:0 frame:0 TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:100000 RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
Copyright © ITmedia, Inc. All Rights Reserved.