所需环境: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,成功啦: