所需環境:ubuntu 14.04
1 安裝openvswitch(ovs)
方法一:如果你的系統已將安裝了mininet,由於mininet自帶了ovs,此步可以跳過
mininet的安裝方法:http://mininet.org/download/
方法二:從官網下載源碼進行編譯,編譯過程容易出現各種錯誤,因此該方法不適用於新手,
源碼編譯的參考網址:http://www.sdnlab.com/3166.html
2 安裝SDN控制器
控制器可以選擇的種類很多,比如odl, floodlight,pox,ryu等等,樓主用的是odl,因為odl可以很方便的看到SDN網絡的topo結構,以便驗證你的網絡搭建是否成功。
不同種類控制器的安裝方法也不一樣,可以到各自的官網去找安裝教程,這里提供一個odl的安裝方法
方法一:源碼編譯:https://wiki.opendaylight.org/view/Install_On_Ubuntu_14.04
我用該方法嘗試過,源碼編譯沒有報錯,但是最后無法和mininet連接,因此放棄了。
方法二:二進制代碼安裝:http://www.open-open.com/lib/view/open1427258312449.html
該版本是安裝的He版本,大家可以從官網下載最新的Li版本按照此法進行安裝
注意:控制器安裝好了以后,記得先和mininet連接,進行一下測試,看控制器是否可以發現mininet的網絡結構,如果可以一般說明控制器安裝成功。
3 SDN網絡環境搭建
3.1 構建物理機和物理機相互連接的網絡
在安裝open vswitch的主機上有兩塊網卡,分別為eth0、eth1,把這兩塊網卡掛接到open vswitch的網橋上,然后有兩台物理機host1、host2分別連接到eth0和eth1上,實現這兩台物理機的通信。構建結果圖如下:

執行命令如下:
#ovs-vsctl add-br br0 //建立一個名為br0的open vswitch網橋
#ovs-vsctl add-port br0 eth0 //把eth0掛接到br0中
#ovs-vsctl add-port br0 eth1
//把eth1掛接到br0中
然后打開odl控制器,使用ovs-vsctl set-controller br0 tcp:192.168.122.100:6633命令使得ovs與控制機建立tcp連接
其中192.168.122.100為控制器所在系統的IP地址,6633為監聽端口號,br0為剛剛建立的ovs網橋
在瀏覽器中輸入192.168.122.100:8181/index.html登陸odl的基於karaf控制台,用戶名和密碼都為admin,然后就可以查看網絡拓撲結構(注:剛剛開始只能看到ovs交換機,host互相ping通之后控制器才能發現host的拓撲,因為ping的過程過觸發hostEvent事件后,控制器的hostTrack模塊才能發現主機)
若硬件條件不夠,可以使用虛擬機化的環境,具體如下:
3.2 構建虛擬機與虛擬機相連的網絡(推薦先使用此方法進行構建,成功之后再到物理機平台進行搭建)
在安裝open vswitch的主機上安裝兩個虛擬機,把兩個虛擬機的網卡都掛接在open vswitch的網橋上,實現兩台虛擬機的通信,構建結果圖如下:

在安裝虛擬機的時候,可以選擇的方法很多,目前ovs支持的虛擬化平台很多,比如xen,kvm, virtualbox和proxmox VE。
注意:很多童鞋可能第一反應是用vmware創建虛擬機,遺憾的是vmware 貌似不支持ovs,樓主當時就是為了偷懶用了vmware,結果折騰了很久也沒有成功,自己猜測應該是vmware未開源的問題,后來換了全虛擬化kvm,當然也可以用半虛擬化(xen),效率會更高一點,不是迫不得已別用qemu,qemu是純軟件模擬的,效率太低。安裝之前最好進入bios 把虛擬化支持(Intel virtualization)打開。
1)安裝kvm虛擬化環境
這個很簡單,直接給參考網址:http://my.oschina.net/wenhaowu/blog/197985
2)網絡配置
執行以下命令:
# ovs-vsctl add-br br0 //建立一個名為br0的open vswitch網橋
如果使用vbox或virt-manager把bridge設置為br0即可,如果使用cli kvm則先創建兩個文件,用於虛擬網卡的添加與刪除。假設這兩個文件分別為/etc/ovs-ifup和/etc/ovs-ifdown,則向這兩個文件中寫入以下內容
/etc/ovs-ifup
--------------------------------------
#!/bin/sh
switch='br0'
/sbin/ifconfig $1 0.0.0.0 down
ovs-vsctl add-port ${switch} $1
---------------------------------------------
/etc/ovs-ifdown
------------------------------------------------
#!/bin/sh
switch='br0'
/sbin/ifconfig $1 0.0.0.0 down
ovs-vsctl del-port ${switch} $1
---------------------------------------------
注意:switch='br0'等號兩邊千萬別加空格,因為很多寫慣了C語言的程序猿都有加空格的習慣,所以提醒下,不然執行會報錯。
而且這兩個文件都要chmod a+x 修改權限,讓它們可執行
虛擬機網卡添加和刪除的腳本寫好后,就可以寫腳本啟動虛擬機,我這里兩個虛擬機的虛擬磁盤鏡像文件分別是disk1.img和disk2.img。兩個虛擬機的啟動腳本分別是
vm1_start.sh
------------------------------------------------------------
kvm -m 1024 -net nic,macaddr=00:11:22:33:44:55 -net tap,script=/etc/ovs-ifup,downscript=/etc/ovs-ifdown -drive file=/root/images/test/disk1.img,boot=on
------------------------------------------------------------
vm2_start.sh
--------------------------------------------------------------
kvm -m 1024 -net nic,macaddr=00:11:22:33:44:66 -net tap,script=/etc/ovs-ifup,downscript=/etc/ovs-ifdown -drive file=/root/images/test/disk2.img,boot=on
--------------------------------------------------------------
然后這個兩個腳本chmod a+x修改權限,就可以執行啟動虛擬機啦
執行命令:
#./vm1_start.sh
#./vm2_start.sh
啟動之后,將連個vm的IP地址配在通一個網段,然后開啟odl控制,使用ovs-vsctl set-controller br0 tcp:192.168.122.100:6633命令使得ovs與控制機建立tcp連接
其中192.168.122.100為控制器所在系統的IP地址,6633為監聽端口號,br0為剛剛建立的ovs網橋
在瀏覽器中輸入192.168.122.100:8181/index.html登陸odl的基於karaf控制台,然后兩個虛擬機互相ping一下,就可一看到topo了。
當然很多時候,我們搭建的網絡不會這么簡單,可能需要多個ovs,具體步驟如下:
3.3 多個ovs互聯的SDN網絡搭建
注意一個ovs網橋就代表一個SDN交換機,剛剛我們創建了br0 現在我們用同樣的命令創建網橋br1
#ovs-vsctl add-br br1 //建立一個名為br1的open vswitch網橋
現在就有兩個ovs了,然后我們來搭建如下網絡結構:

網橋創建好了以后,首先網橋需要連接,我們使用如下命令:

這樣另個ovs就通過patch-br0和patch-br1這兩個port連接起來了,然后開啟虛擬機。注意:由於此時vm1和vm2已經不連接同一個ovs上面了,因此虛擬網卡的添加與刪除的文件也得作修改,另外再建立兩個文件,/etc/ovs1-ifup和/etc/ovs1-ifdown,則向這兩個文件中寫入以下內容:
/etc/ovs1-ifup
--------------------------------------
#!/bin/sh
switch='br1'
/sbin/ifconfig $1 0.0.0.0 down
ovs-vsctl add-port ${switch} $1
---------------------------------------------
/etc/ovs1-ifdown
------------------------------------------------
#!/bin/sh
switch='br1'
/sbin/ifconfig $1 0.0.0.0 down
ovs-vsctl del-port ${switch} $1
---------------------------------------------
其他的內容沒有變化,就把br0改成了br1,然后文件名改了一下而已。
然后vm2_start.sh的內容修改如下:
vm2_start.sh
--------------------------------------------------------------
kvm -m 1024 -net nic,macaddr=00:11:22:33:44:66 -net tap,script=/etc/ovs1-ifup,downscript=/etc/ovs1-ifdown -drive file=/root/images/test/disk2.img,boot=on
--------------------------------------------------------------
OK,最后啟動虛擬機,打開控制器,建立連接,就可以啦。
PS:kvm 啟動guest虛擬機后,如何讓guest可以訪問Internet,一般是通過給虛擬機網卡virbr0添加tap設備實現,具體如下:
執行命令:
sudo tunctl -t vnet0
sudo brctl addif virbr0 vnet0
sudo ifconfig vnet0 0.0.0.0 up
然后虛擬機的啟動腳本為:
kvm -m 1024 -net nic -net tap, ifname-vnet0, script=no -drive file=/root/images/test/disk3.img,boot=on
虛擬機啟動后,配置網絡如下
vim /etc/network/interface

注意:網關一定要為virbr0的IP地址,然后address一定要和virbr0同一個網段即可,
最后vim /etc/resolv.conf配置dns
加入 nameserver 114.114.114.114
nameserver 8.8.8.8
然后ping www.baidu.com,成功啦:
