mininet+floodlight搭建sdn环境并创建简单topo
第一步:安装git
sudo apt-get update
sudo apt-get install git
测试git是否安装成功:
git
第二步:安装mininet
1.获取mininet最新源码树
git clone git://github.com/mininet/mininet 会在当前目录下创建mininet文件夹
2.安装mininet
cd mininet/util 进入mininet目录
安装:【一定要加-a,这样才能保证mininet所有的组件和依赖都能安装上】
./install.sh -a
若出现以下错误,正确的解决办法应该是重装mininet,也就是执行rm -rf mininet,将mininet整个文件夹都删除,然后再执行上面的重装命令
3.测试mininet
如果mininet正确安装会出现enjoy mininet字样,即
则说明安装成功
再次打开mininet,可发现已成功安装如下:
执行命令pingall可以查看连接情况。
sudo mn就是默认进入mininet自带拓扑结构的网络环境。
备注:在mininet中为什么没有添加流表的时候两台主机会ping通,原因在于控制器中的二层自学习功能,因为这是控制器可以通过下发流表的方式来使交换机产生流表,从而两台机器ping通,这时如果你关闭了控制器,你会发现两台主机就ping不同了。
第三步:安装floodlight
1.
sudo apt-get update
2.安装jdk和eclipse
sudo apt-get install build-essential default-jdk ant python-dev eclipse
3.下载最新floodlight源码树
git clone git://github.com/floodlight/floodlight.git
4.进入floodlight目录
git submodule init
git submodule update
ant
第一次执行以上命令结果如下:
5.首次运行floodlight需执行如下命令
sudo mkdir /var/lib/floodlight
sudo chmod 777 /var/lib/floodlight
6.运行floodlight
sudo java -jar target/floodlight.jar
运行成功后在浏览器输入localhost:8080/ui/pages/index.html,会出现如下界面
第四步:mininet和floodlight都在虚拟机内搭建拓扑
1.运行floodlight
sudo java -jar target/floodlight.jar 打开floodlight正常运行
2.创建简单topo并运行
执行sudo mn --topo single,3 --mac --switch ovsk --controller remote,ip=127.0.0.1,port=6653,这里是创建了3个主机,一个交换机,一个控制器,ip是谁的ip?还未解。。。这个ip是floodlight控制器所在的主机的ip地址,也就是ipconfig后得到的ip地址,port是控制器的端口号,这里在打开floodlight后,可以看到这样一条信息
floodlight控制器会在0.0.0.0:6653监听Openflow的switch。
发现floodlight会以6653端口号来监听交换机,所以这里端口号一定要是6653,否则会显示下面的连不上控制器的信息:
在正常连接后会是下面的信息:
正常之后执行ping可以正常连接如上。
3.利用python创建topo并运行
简单topo.py格式:
1 from mininet.topo import Topo 2 from mininet.net import Mininet 3 from mininet.util import dumpNodeConnections 4 from mininet.log import setLogLevel,info 5 from mininet.node import CPULimitedHost 6 from mininet.node import RemoteController 7 from mininet.link import TCLink 8 from mininet.cli import CLI 9 10 class MyTopo( Topo ): 11 12 def __init__( self ): 13 "Create custom topo." 14 15 # initilaize topology 16 Topo.__init__( self ) 17 18 # add hosts and switches 19 host1 = self.addHost( 'h1' ) 20 host2 = self.addHost( 'h2' ) 21 switch1 = self.addSwitch( 's1' ) 22 switch2 = self.addSwitch( 's2' ) 23 24 25 # add links 26 self.addLink(host1,switch1) 27 self.addLink(host2,switch2) 28 self.addLink(switch1,switch2) 29 30 31 if __name__=='__main__': 32 setLogLevel('info') 33 info( '*** Creating network\n' ) 34 35 topo=MyTopo() 36 net=Mininet(topo=topo,controller=None,host=CPULimitedHost,link=TCLink) 37 net.addController('c0',controller=RemoteController,ip='192.168.80.1',port=6653) 38 net.start() 39 CLI(net)
其中ip应该改成本机ip。
在topo.py的目录下执行python topo.py,如果正确的话能看到以下信息:
exit退出之后再执行python topo.py会出现如下错误:
原因:因为在开启topo的时候mininet还会开启其他的一些组件,导致退出topo的时候仍在占用。
解决办法是:
1.执行sudo mn,会出现如下问题:
执行pkill -9 -f "sudo mnexec",再次执行python topo.py,发现正确运行。
2.退出topo后执行mn -c,再次执行python topo.py,就可以正确运行。
第五步:mininet和floodlight分在两个主机上运行
1.将floodlight源码放进eclipse工程中
2.打开Main主函数,run as以java se的方式运行
正确运行结果如下:
3.打开虚拟机,建一个topo,【ip地址一定是当前floodlight所在主机的ip】,正确创建topo并ping通之后结果如下:
IP地址127.0.0.1和本机IP的选择:
1.如果在虚拟机的mininet中创建topo时使用127.0.0.1,在本机中运行floodlight,会发现创建topo时出现如下无法连接控制器的信息:
此时再在虚拟机中跑floodlight,【此时本机和虚拟机同时在跑floodlight,发现两者是互不干扰的,虽然监听端口相同,我觉得原因应该是他俩相当于在两个不同的主机上跑】,然后再次运行刚才的topo,发现正确创建。
2.如果在虚拟机的mininet中创建topo时使用本机IP,在本机中运行floodlight,会发现topo正确创建,且本机floodlight可以获取到topo的相关信息。
综上所述,127.0.0.1是回环地址,也就是只在当前主机中有效,无论是虚拟主机还是实际主机,都只能在本主机中有效,要想虚拟主机认识实际主机,需要设置实际主机的IP地址。