« Trema を改造して仮想ネットワーク機能にポート番号指定を追加 | トップページ | ◆ Linux のネットワークネームスペース機能と Open vSwitch で仮想ネットワーク »

2013年4月 9日 (火)

Trema のコントローラと仮想ネットワークをそれぞれ別々に動かす

[2013/04/13 追記: 間違い訂正しました。誤った記載箇所を取消線で消して青字で新しく書き直しています。試そうとしてうまく動かなかった方、すみません m(_ _)m]
[2013/04/13 22:00 追記: 書き直し箇所でまた訂正 orz。誤: class Empty.rb、正: class Empty]

OpenFlow フレームワーク Trema を、コントローラと仮想ネットワークそれぞれ別々に動かすと便利そうだと思い調べてみたらできたのでやり方を書いておきます。

確認は、Trema 0.3.16 と 0.3.19 でしています。

■やりたいこと
Trema はコントローラの起動・停止で、仮想ネットワークも同時に起動・停止します。
それをあえて、Trema コントローラと Trema の仮想ネットワークを別々に起動・停止したい。

■背景
Trema コントローラの開発中は頻繁にバグで停止してしまうことがあります。
Trema の仮想ネットワーク設定ファイルのネットワークネームスペースの機能は非常に便利ですが、そのネットワークネームスペースでサーバープロセスを動かしているときは、Trema コントローラが停止しても動き続けて欲しい(再起動が面倒なので)。また、ネットワークネームスペースで動いているプロセスが残っていると Trema 終了時にネットワークネームスペースの削除に失敗してしまい、次の起動がおかしくなることもあります。

過去に書いた関連記事:
「Trema の仮想ネットワーク機能には『OpenFlow実践入門』に書いてない強力な機能がありました。」
「ネットワークネームスペース機能使用時の Trema 停止エラー軽減方法」

■解決案
2つOSを用意して、片方はコントローラ用、もう片方は仮想ネットワーク用と役割を分けて用いる。

■コントローラを動かす側
何もする必要はありません。
普通に trema run でコントローラを起動するだけです。

■仮想ネットワークを動かす側
(1)何もしないコントローラを用意する。
(1)空のファイルを用意してコントローラとして用いる。
(2)仮想ネットワーク設定ファイルにおいて、vswitch に ip アドレスとしてコントローラを動かす側の OS の IP アドレスを指定する。

■仮想ネットワーク側の例
コントローラ側が IPアドレス 192.168.83.156 とします。

・仮想ネットワーク設定ファイル vnet.conf

  vswitch("swtich0") {
    datapath_id "0x1"
    ip "192.168.83.156"
  }
  vhost("host1") {
    ip "192.168.0.1"
    netmask "255.255.255.0"
  }
  vhost("host2") {
    ip "192.168.0.2"
    netmask "255.255.255.0"
  }
  link "host1", "switch0"
  link "host2", "switch0"

・何もしないコントローラ empty.rb

   class Empty < Controller
   end

・空のコントローラ empty.rb
  空ファイルは以下のようにすれば作れます:

   touch empty.rb        # (empty.rb が存在しない場合のみ使える方法)

     または

   cp /dev/null emtpy.rb

・起動方法

   trema run empty.rb -c vnet.conf

trema dump_flows や trema send_packet など仮想ネットワークに対する操作は普通に実行できます。

■おまけ

vswitch を複数書くときにそれぞれに同じ IP アドレスを書くのは保守性に欠けます。仮想ネットワーク設定ファイルが実は ruby のプログラムであることを利用して関数化してみてはどうでしょう。

  def config_vswitch( name, dpid )
    vswitch("#{ name }") {
      datapath_id "#{ dpid }"
      ip "192.168.83.156"
    }
  end
  config_vswitch "switch1", "0x1"
  config_vswitch "switch2", "0x2"
  config_vswitch "switch3", "0x3"

もっと?

  def config_vswitch( name, dpid )
    vswitch("#{ name }") {
      datapath_id "#{ dpid }"
      ip "192.168.83.156"
    }
  end
  1.upto(3) do | each |
    config_vswitch "switch#{ each }", "#{ each }"
  end

« Trema を改造して仮想ネットワーク機能にポート番号指定を追加 | トップページ | ◆ Linux のネットワークネームスペース機能と Open vSwitch で仮想ネットワーク »

OpenFlow」カテゴリの記事

Trema」カテゴリの記事

コメント

コメントを書く

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

トラックバック

この記事のトラックバックURL:
http://app.f.cocolog-nifty.com/t/trackback/1776113/51162828

この記事へのトラックバック一覧です: Trema のコントローラと仮想ネットワークをそれぞれ別々に動かす:

« Trema を改造して仮想ネットワーク機能にポート番号指定を追加 | トップページ | ◆ Linux のネットワークネームスペース機能と Open vSwitch で仮想ネットワーク »

最近のトラックバック

無料ブログはココログ