2015年2月11日 星期三

Set Ryu controller with Web-GUI and custom Mininet topology

下圖是利用ryu加上mininet建立的一個自訂網路拓樸,在利用ryu的gui patch顯示在web介面上

首先要將安裝好的ryu加上GUI的patch (安裝ryu可以參考先前的文章)

由於目前Ryu的gui功能還沒包含在官方的版本裡面
因此需要下載patch來完成這個功能

由此 gui-patch-v3-rebase 下載 ZIP 解壓縮後在路徑 /gui-patch-v3-rebase/ryu/gui 將 gui 整個資料夾複製到原官方 Ryu 專案相同位置的地方(/ryu/ryu/)。
或是直接解壓縮覆蓋ryu資料夾也可以
接著要到 /ryu/ryu/topology 修改 switches.py 45行-53行的地方註解掉。
(這邊還不太確定為什麼要註解)

下載並安裝RYU with GUI的所需套件。
sudo apt-get install python-dev
sudo pip install ryu flask gevent-websocket

開啟Ryu GUI所需的應用程式

ryu-manager --verbose --observe-links ryu.topology.switches ryu.app.rest_topology ryu.app.ofctl_rest ryu.app.simple_switch (2015/02/12註:加上這個simple_switch的話拓樸的連線沒辦法正常顯示,去掉就正常了)

開啟Ryu GUI server
./ryu/gui/controller.py

接著利用Mininet建立自己的網路拓樸
下面的mininet腳本描述了上面圖片所示的網路架構
可以寫在一個python 腳本裡面 (mytopo.py)

from mininet.topo import Topo

class MyTopo( Topo ):
    "Simple topology example."

    def __init__( self ):
        "Create custom topo."

        # Initialize topology
        Topo.__init__( self )

        # Add hosts and switches
        server = self.addHost( 'server' )
        client = self.addHost( 'client' )
        switch1 = self.addSwitch( 's1' )
        switch2 = self.addSwitch( 's2' )
  switch3 = self.addSwitch( 's3' )
        switch4 = self.addSwitch( 's4' )
  switch5 = self.addSwitch( 's5' )
        switch6 = self.addSwitch( 's6' )
switch7 = self.addSwitch( 's7' )

        # Add links
        self.addLink( server , switch1 )
self.addLink( switch1, switch2 )
self.addLink( switch1, switch3 )
self.addLink( switch2, switch4 )
self.addLink( switch3, switch4 )
self.addLink( switch3, switch5 )
self.addLink( switch4, switch7 )
self.addLink( switch5, switch6 )
self.addLink( switch6, switch7 )
self.addLink( switch7, client  )


topos = { 'mytopo': ( lambda: MyTopo() ) }

之後利用mininet建立我們創建的網路拓樸
mn --custom mytopo.py --topo mytopo --controller=remote
controller=remote預設是在本機的ip 若是controller在其他機器的話則在後面加上,ip=xxx.xxx.xx.xx
例如 --controller=remote,ip=192.168.10.11

之後開啟瀏覽器 網址輸入http://localhost:8000
應該就會看到我們建立的網路拓樸

如果controller在其他機器的話則ip也要跟著改


參考資料
How to set up Ryu controller with GUI component?
[RYU] Try the RYU Web GUI with Mininet
Ryu 3.18 documentation TOPOLOGY VIEWER
Ryu gui wiki

Ubuntu 14.04 安裝 Ryu

Ryu官方在介紹Ryu時並沒有把所有的相依套件清楚地列出來
看了滿多blog的教學,但有些安裝完之後還是會出現錯誤

主要會出錯的原因可能是blogger在寫教學時所用的ubuntu可能之前就有安裝過一些必要的套件
導致要在一個全新的ubuntu上安裝ryu時就會出現一些沒遇過的問題
於是特地用docker去新增了一個百分百乾淨的ubuntu來做測試
雖然因為docker架構的關係 有些lib會和host的共用,而不會安裝在container裡
所以導致需要安裝的東西變多
但至少可以確定按照這樣的流程是可以成功安裝Ryu的
(如果有遇到任何問題歡迎回覆)

----
2015/02/13
due to the need of new environment, I use the new ubuntu 14.04 to install ryu by following this tutorial. (only run apt-get upgrade before)
and this tutorial still works.
----

下載並安裝相依性軟體

$sudo apt-get install python-pip python-dev build-essential
$sudo apt-get install python-eventlet python-routes python-webob python-paramiko
$sudo apt-get install libxml2-dev libxslt1-dev python2.7-dev

$pip install msgpack-python
$pip install oslo.config
$pip install netaddr
$pip install lxml
(如果安裝lxml時出現錯誤 apt-get install libz-dev )
$pip install ecdsa
$apt-get install git

從github下載最新的ryu
$git clone https://github.com/osrg/ryu.git
$cd ryu
$python ./setup.py install

如果install過程出現six版本錯誤的話
$pip install -U six

之後可以用ryu-manager測試有沒有正確安裝



2015年2月10日 星期二

Ubuntu 14.04 安裝 Docker

這篇基本上是參考Docker裡的教學

安裝Ubuntu官方維護的Docker版本(可能不是最新發布的

$ sudo apt-get update
$ sudo apt-get install docker.io
會叫做docker.io是因為先前已經有個軟體叫做docker了

接著啟動Docker內的tab自動補完功能  (個人覺得好像沒甚麼用???)
$ source /etc/bash_completion.d/docker.io

下面的方法是安裝最新發布的Docker版本

讓apt-get能夠處理https協定的來源

[ -e /usr/lib/apt/methods/https ] || {
  apt-get update
  apt-get install apt-transport-https
}


新增Docker的來源金鑰
$ sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 36A1D7869245C8950F966E92D8576A8BA88D21E9

新增Docker的來源並安裝 lxc-docker
$ sudo sh -c "echo deb https://get.docker.com/ubuntu docker main\
> /etc/apt/sources.list.d/docker.list"
$ sudo apt-get update
$ sudo apt-get install lxc-docker

Note:
There is also a simple curl script available to help with this process.
$ curl -sSL https://get.docker.com/ubuntu/ | sudo sh

新增一個ubuntu的container來驗證功能
$ sudo docker run -i -t ubuntu /bin/bash
Which should download the ubuntu image, and then start bash in a container.