簡介
mininet是什麼?
Stanford 大學 Nick McKeown 教授領導的研究小組基於 Linux Container 架構,開發出了這套進程虛擬化的平臺。在 Mininet 的幫助下,你可以輕易的在自己的筆記本上測試一個軟件定義網絡 (Software-Defined Networks),對基於 Openflow、Open vSwitch 的各種協議等進行開發驗證,或者驗證自己的想法。
最令人振奮的是,所有的代碼幾乎可以無縫遷移到真實的硬件環境中。在實驗室裏,一行命令就可以創建一個支持 SDN 的任意拓撲的網絡結構,並可以靈活的進行相關測試,驗證了設計的正確後,又可以輕鬆部署到真實的硬件環境中。目前 Mininet 已經作爲官方的演示平臺對各個版本的 Openflow 協議進行演示和測試。
floodlight是什麼?
Floodlight是Apache授權並且基於JAVA開發的企業級OpenFlow控制器,它的穩定性、易用性已經得到SDN專業人士以及愛好者們的一致好評,並因其完全開源,這讓SDN網絡世界變得更加有活力。控制器作爲SDN網絡中的重要組成部分,能集中地靈活控制SDN網絡,爲核心網絡及應用創新提供了良好的擴展平臺。
簡言之,我們通過mininet對SDN網絡拓撲進行模擬,在通過floodlight(SDN控制器)對所模擬出的網絡進行控制。
本文介紹了在virtual box虛擬機中安裝mininet2.2.1+floodlight0.91仿真環境的過程,直接在Ubuntu中的環境搭建也可以參考本文。
安裝
系統安裝
Ubuntu14.04下載地址,獲取安裝鏡像選擇Ubuntu14.04.4(amd64,LiveCD)。
虛擬機中安裝64系統需要開啓主板vt,具體安裝過程不做贅述。
虛擬機的網絡連接模式可以選擇橋接模式,這樣在本機中也可以通過網頁瀏覽器觀察floodlight控制器的情況。
虛擬機擴展工具安裝:裝好的虛擬機無法全屏,是因爲在虛擬機系統裏沒有安裝VirtualBox的增強驅動。首先啓動虛擬機,點擊設備,選擇安裝增強功能即可。本段參考地址。
floodlight安裝
首先安裝1.7版本以上的java
sudo apt-get install openjdk-7-jkd
選擇我們剛剛安裝的java版本,如果是新系統,本步驟無需執行
sudo update-alternatives --config java
確認java版本
java -version
升級本地的更新源
sudo apt-get update
安裝java,python的運行和開發環境
sudo apt-get install build-essential defualt-jdk ant python-dev
安裝git
sudo apt-get install git
克隆floodlight
sudo git clone git://github.com/floodlight/floodlight.git
進入floodlight目錄
cd floodlight
查看floodlight版本情況
sudo git tag
選擇v2.2.1分支
git checkout -b v0.91 v0.91
編譯floodlight
sudo ant
運行floodlight
sudo java -jar target/floodlight.jar
查看虛擬機的ip地址
ifconfig
打開Firefox瀏覽器,輸入地址,即可在網頁中看到floodlight控制器中所得到的信息。本操作也可以在安裝此臺虛擬機的主機中執行。
http://*虛擬機IP*:8080/ui/index.html
mininet安裝
新建終端,用apt-get安裝mininet
sudo apt-get install mininet
升級mininet版本
sudo git-clone https://github.com/mininet/mininet
進入mininet目錄
cd mininet
查看mininet版本情況
sudo git tag
選擇v2.2.1分支
git checkout -b 2.2.1 2.2.1
完整安裝mininet VM以及其他依賴關係,以及openflow wireshark分離器和pox。
sudo ./util/install.sh -a
查看mininet版本號
mn --version
mininet與floodlight的連接
可選擇的,這裏選擇FatTree的SDN拓撲結構。
進入mininet的custom目錄
cd ~/mininet/custom
新建FatTree.py腳本
sudo gedit ./FatTree.py
腳本內容如下
"""Custom topology example
Adding the 'topos' dict with a key/value pair to generate our newly defined
topology enables one to pass in '--topo=mytopo' from the command line.
"""
from mininet.topo import Topo
class MyTopo( Topo ):
"Simple topology example."
def __init__( self ):
"Create custom topo."
# Initialize topology
Topo.__init__( self )
L1 = 2
L2 = L1 * 2
L3 = L2
c = []
a = []
e = []
# add core ovs
for i in range( L1 ):
sw = self.addSwitch( 'c{}'.format( i + 1 ) )
c.append( sw )
# add aggregation ovs
for i in range( L2 ):
sw = self.addSwitch( 'a{}'.format( L1 + i + 1 ) )
a.append( sw )
# add edge ovs
for i in range( L3 ):
sw = self.addSwitch( 'e{}'.format( L1 + L2 + i + 1 ) )
e.append( sw )
# add links between core and aggregation ovs
for i in range( L1 ):
sw1 = c[i]
for sw2 in a[i/2::L1/2]:
# self.addLink(sw2, sw1, bw=10, delay='5ms', loss=10, max_queue_size=1000, use_htb=True)
self.addLink( sw2, sw1 )
# add links between aggregation and edge ovs
for i in range( 0, L2, 2 ):
for sw1 in a[i:i+2]:
for sw2 in e[i:i+2]:
# self.addLink(sw2, sw1, bw=10, delay='5ms', loss=10, max_queue_size=1000, use_htb=True)
self.addLink( sw2, sw1 )
#add hosts and its links with edge ovs
count = 1
for sw1 in e:
for i in range(2):
host = self.addHost( 'h{}'.format( count ) )
self.addLink( sw1, host )
count += 1
topos = { 'mytopo': ( lambda: MyTopo() ) }
保存並退出,運行mininet並連接floodlight
sudo mn --custom ~/mininet/custom/FatTree.py --topo mytopo --controller=remote,ip=*虛擬機IP*,port=6653
在網頁中打開floodlight控制器,可以看到剛剛配置的FatTree拓撲。