[Linux][Network]mininetをインストールしてみる

先の投稿でRyuをインストールしてみたわけなんだけど、いきなり実環境に適用するデータプレーンを持っていく勇気はなく、実験環境が構成できるmininetのインストールを試みました。

構成

いつもはCentOSを使うんですが、mininetインストール対象はUbuntuを使うことにしました。自宅に埋蔵されてたISOイメージを使っています。Ryuをインストールしたサーバとは別のサーバにmininetを導入する感じです。

アップグレードを仕掛ける

今回採用したOSはUbuntu 16.04 LTSだったのですが、アップグレードをどうやら行い、モジュールを更新したほうが良さそうです。

# apt-get upgrade

コレを行っておかないと以下の通りとなってビルドに失敗しました。

*** Error in `appstreamcli': double free or corruption (fasttop): 0x0000000000d77880 ***
======= Backtrace: =========
/lib/x86_64-linux-gnu/libc.so.6(+0x77725)[0x7f23e2490725]
/lib/x86_64-linux-gnu/libc.so.6(+0x7ff4a)[0x7f23e2498f4a]
         :
         :
7f23e3542000-7f23e3543000 rw-p 00000000 00:00 0 
7fffcd78b000-7fffcd7ac000 rw-p 00000000 00:00 0 [stack]
7fffcd7d8000-7fffcd7da000 r--p 00000000 00:00 0 [vvar]
7fffcd7da000-7fffcd7dc000 r-xp 00000000 00:00 0 [vdso]
ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0 [vsyscall]
Aborted (core dumped)

前提パッケージのインストール

# sudo apt-get install build-essential
# sudo apt-get install git

mininetのインストール

Quita等で2.2.1のインストールTipsがありますが、どうやらopenflowのダウンロード先がうまく合っておらず、こんなエラーが出てインストール出来ないようです。

Cloning into 'openflow'...
fatal: read error: 接続が相手からリセットされました

なので、最新である2.2.2を使用したほうがどうやら良さそうです。

# git clone git://github.com/mininet/mininet
# cd mininet
# git tag ←2.2.2の存在を確認
# git checkout -b 2.2.2 2.2.2
# mininet/util/install.sh -a

ビルドが始まり、暫く待つと以下表示になります。コレでインストールが完了したっぽい。

      :
      :
make[1]: ディレクトリ '/root/oflops/doc' に入ります
make[1]: 'install' に対して行うべき事はありません.
make[1]: ディレクトリ '/root/oflops/doc' から出ます
Enjoy Mininet!

mininetとryu-managerを接続する

まず、ryu-managerでsimple-switchとしてのコードを読み込ませてコントローラを起動します。

■サンプルコードのパスが長いので、ホームディレクトリにシンボリックリンク
# ln -s /usr/lib/python2.7/site-packages/ryu ~/ryu

■simple_switchとしてOpenFlowコントローラを起動
# ryu-manager ryu/app/simple_switch.py

こんなメッセージが出たら準備完了。

loading app ryu/app/simple_switch.py
loading app ryu.controller.ofp_handler
instantiating app ryu.controller.ofp_handler of OFPHandler
instantiating app ryu/app/simple_switch.py of SimpleSwitch

次に、mininetを導入したサーバににて以下コマンドを実行

# mn --controller=remote,ip=<ryu導入サーバのIP>,port=6633

すると、miminetがわが以下のような応答をします。

*** Creating network
*** Adding controller
*** Adding hosts:
h1 h2 
*** Adding switches:
s1 
*** Adding links:
(h1, s1) (h2, s1) 
*** Configuring hosts
h1 h2 
*** Starting controller
c0 
*** Starting 1 switches
s1 ...
*** Starting CLI:
mininet> pingall
*** Ping: testing ping reachability
h1 -> h2 
h2 -> h1 
*** Results: 0% dropped (2/2 received)
mininet>

同時に、ryu-manager側でこんな応答が帰ってきます。Macアドレスの処理を行っていることが確認できます。

packet in 1 7a:b4:83:0e:1b:73 33:33:00:00:00:16 2
packet in 1 ea:51:79:f4:57:49 33:33:00:00:00:16 1
packet in 1 ea:51:79:f4:57:49 33:33:ff:f4:57:49 1
packet in 1 7a:b4:83:0e:1b:73 33:33:ff:0e:1b:73 2
packet in 1 ea:51:79:f4:57:49 33:33:00:00:00:16 1
packet in 1 ea:51:79:f4:57:49 33:33:00:00:00:02 1
packet in 1 7a:b4:83:0e:1b:73 33:33:00:00:00:16 2
packet in 1 7a:b4:83:0e:1b:73 33:33:00:00:00:02 2
packet in 1 ea:51:79:f4:57:49 33:33:00:00:00:16 1
packet in 1 7a:b4:83:0e:1b:73 33:33:00:00:00:16 2
packet in 1 ea:51:79:f4:57:49 33:33:00:00:00:02 1
packet in 1 7a:b4:83:0e:1b:73 33:33:00:00:00:02 2
packet in 1 ea:51:79:f4:57:49 ff:ff:ff:ff:ff:ff 1
packet in 1 7a:b4:83:0e:1b:73 ea:51:79:f4:57:49 2
packet in 1 ea:51:79:f4:57:49 7a:b4:83:0e:1b:73 1
packet in 1 ea:51:79:f4:57:49 33:33:00:00:00:02 1
packet in 1 7a:b4:83:0e:1b:73 33:33:00:00:00:02 2

mininetで疎通できるかどうかを確認したら、疎通ができました。

mininet> pingall
*** Ping: testing ping reachability
h1 -> h2 
h2 -> h1 
*** Results: 0% dropped (2/2 received)
mininet>

性能テストなんかも出来るみたいです。

mininet> iperf h1 h2
*** Iperf: testing TCP bandwidth between h1 and h2 
*** Results: ['24.6 Gbits/sec', '24.6 Gbits/sec']
mininet>

終わりに

環境は出来上がったものの、私自身コーディングをする技術がなく、さてコレをどう実用化したもんかなーと悩んでいます。一生懸命Pythonの書き方を学ぶのもありなんですが、それだと少し時間がもったいない気もしたり。

OpenFlowコントローラの一つに「OpenDaylight」と言うプラットフォームもあるようなので、これと「Ryu」とで何が違うんだろう?と言う観点から理解を深めてみようかなーと思っています。

また、mininetはかなり色々できそうで面白そうです。これをもう少し使いこなせば色んなOpenFlowの挙動を確かめられるのかなと。そこで理解を深められたら、次に進むのはLagopus Switchなのかなーとか思いつつ。

あまりのめり込むと病状悪化するので良くないんですが、ボチボチのペースで勉強してみたいと思います。

タイトルとURLをコピーしました