検索
連載

1台のPCでできるOpenFlow開発環境TremaでSDNを手のひらに(2)(1/2 ページ)

今回は、実際にTremaの環境を導入し、リピータハブとして動作する簡単なOpenFlowコントローラを作成する方法を紹介します。

Share
Tweet
LINE
Hatena

 前回「SDNの基本動作とアジャイルな開発が可能なSDN実装、『Trema』」ではSDN/OpenFlowの概要と、OpenFlowのプログラミングフレームワーク「Trema」の特徴を中心に紹介しました。今回は、実際にTremaを利用し、簡単なOpenFlowコントローラを作成する方法を紹介します。

1台のPCでできるOpenFlow開発環境

 これから「アジャイルなOpenFlowプログラミングフレームワーク環境」を、種も仕掛けもないPC1台だけで本当に開発してみます。

 まず初めに、PCを1台用意してください。もちろん、普段利用しているPCでも構いません。Tremaを動作させるOSはLinuxですが、用意できるPCがWindowsマシンならば仮想PC環境(VMwareやVirtualBoxなど)を利用すればいいでしょう。

前提〜Ubuntu環境の準備

 TremaはLinux上で動作し、本家サイトではUbuntuやDebian環境への導入方法がガイドされています。ここでも、無用なトラブルを避けるため、Ubuntu Server 12.04.2 LTS(32bit)環境をベースに手順を説明します(Desktop Editionでもよいのですが、コンパクトなServer Editionを利用します)。

 Ubuntu 12.04の導入構成は標準構成で問題ありません。必要なパッケージについては後ほど、apt-getコマンドで導入します。

【関連リンク】

Ubuntuのダウンロードサイト

http://www.ubuntu.com/download/server


Tremaの導入方法

 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

Tremaの起動方法〜nullコントローラを作ってみる

 では早速、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.

       | 次のページへ
ページトップに戻る