如何升级Mininet的Open vSwitch版本

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何升级Mininet的Open vSwitch版本相关的知识,希望对你有一定的参考价值。

参考技术A   因为Mininet的方便且易用,以及实验条件及真实设备的不足,它已经被越来越多的SDN学习者使用。但在Mininet使用中,安装使用的内置Open vSwitch版本都比较低,使用者无法进行发布的新版本的使用及验证。因此,本文主要是将更新升级Mininet内置的Open vSwitch版本升级,通过重新下载安装Open vSwitch并进行配置,获取并使用Open vSwitch较高版本。
  1 环境准备
  主要使用ubuntu-13.10 64位操作系统,Mininet版本为2.1.0,内部已使用的Open vSwitch版本是1.10.2。 在Ubuntu13.10系统中安装Mininet-2.1.0版本简单提一下。
  1.1 安装Mininet

  sudo apt-get install mininet

  1.2 禁止Open VSwitch Controller开机自启动

  sudo service openvswitch-controller stop
  sudo update-rc.d openvswitch-controller disable

  1.3 测试Mininet安装

  sudo mn --test pingall

  Mininet安装并验证成功后检验Mininet环境:
  1、查看Mininet版本

  # mn --version
  2.1.0

  2、查看Open vSwitch版本

  # ovs-vsctl --version
  ovs-vsctl (Open vSwitch) 1.10.2
  Compiled Sep 23 2013 14:53:13

  2 操作步骤
  2.1 下载Open vSwitch
  我们升级Open vSwitch到目前最新的版本2.3.0(2014年8月14日发布),下载OpenvSwitch2.3.0(注:可下载自己需要安装的Open vSwitch版本)。

  
  cd /home
  mkdir openvswitch
  cd openvswitch
  wget http://openvswitch.org/releases/openvswitch-2.3.0.tar.gz
  tar -xzf openvswitch-2.3.0.tar.gz
  cd openvswitch-2.3.0

  注:为以防下文中生成的deb安装出现不必要的麻烦,建议新建目录openvswitch,在新建目录中下载Open vSwitch的包,以便后文生成的deb包在此目录下执行。
  2.2 安装依赖
  安装Open vSwitch需要如下依赖:

  
  # apt-get install build-essential fakeroot
  # apt-get install debhelper autoconf automake libssl-dev pkg-config bzip2 openssl python-all procps python-qt4 python-zope.interface python-twisted-conch

  执行下面命令检查依赖是否已全部安装,没有安装的继续安装:

  dpkg-checkbuilddeps

  2.3 编译Open vSwitch
  构建Debian包:

  
  fakeroot debian/rules binary

  执行此命令后,将生成用于安装Open vSwitch交换机的deb包。
  2.4 安装Open vSwitch
  (1)安装Open vSwitch:

  cd .. #即退出到新创建的openvswitch目录
  dpkg -i *.deb

  (2)禁止Open VSwitch Controller开机自启动

  # /etc/init.d/openvswitch-controller stop
  # update-rc.d openvswitch-controller disable

  (3)重启Open vSwitch

  /etc/init.d/openvswitch-switch restart

  2.5 验证安装
  检验OVS版本,版本已经由1.10.2升到到2.3.0:

  # ovs-vsctl --version
  ovs-vsctl (Open vSwitch) 2.3.0
  Compiled Nov 7 2014 09:38:44
  DB Schema 7.6.0

  检验Mininet版本,Mininet版本还是2.1.0,如查看结果显示:

  
  # mn --version
  2.1.0

  验证Mininet是否在正常使用:

  3 后语
  以上就是升级Mininet里面的Open vSwitch版本的方法,但是目前的Mininet版本还不支持OpenFlow版本的选择,有兴趣的同学可以参考本网站的技术文章《OpenDaylight氦版本支持OpenFlow1.3协议验证》中的关于Mininet的OpenFlow1.3协议进一步配置。

实验2:Open vSwitch虚拟交换机实践

一、实验目的

  1. 能够对Open vSwitch进行基本操作;
  2. 能够通过命令行终端使用OVS命令操作Open vSwitch交换机,管理流表;
  3. 能够通过Mininet的Python代码运行OVS命令,控制网络拓扑中的Open vSwitch交换机

二、实验环境

  1. 下载虚拟机软件Oracle VisualBox 或 VMware;
  2. 在虚拟机中安装Ubuntu 20.04 Desktop amd64,并完整安装Mininet;

三、实验要求

(一)基本要求

  1. 创建OVS交换机,并以ovs-switchxxx命名,其中xxx为本人在选课班级中的序号,例如ovs-switch001, ovs-switch088等。在创建的交换机上增加端口p0和p1,设置p0的端口号为100,p1的端口号为101,类型均为internal;为了避免网络接口上的地址和本机已有网络地址冲突,需要创建虚拟网络空间(参考命令netns)ns0和ns1,分别将p0和p1移入,并分别配置p0和p1端口的ip地址为190.168.0.100、192.168.0.101,子网掩码为255.255.255.0;最后测试p0和p1的连通性。

    根据要求,交换机创建代码略,ovs-vsctl show运行结果如下

    测试p0和p1的连通性:

    sudo p1 netns exec ns0 ping 192.168.0.101

  2. 使用Mininet搭建的SDN拓扑,如下图所示,要求支持OpenFlow 1.3协议,主机名、交换机名以及端口对应正确。

    • 使用miniedit生成如下拓扑,并保存为031902127.py

    • 勾选OpenFlow1.3

    • 修改生成的py文件

    • 运行拓扑文件,并查看网络结构

  3. 通过命令行终端输入“ovs-ofctl”命令,直接在s1和s2上添加流表,划分出所要求的VLAN。

    VLAN_ID Hosts
    0 h1 h3
    1 h2 h4
    • 先向s1、s2添加流表,并划分VLAN:
    • 查看流表
  4. 主机连通性要求:

  • h1 – h3互通
  • h2 – h4互通
  • 其余主机不通
    • 测试连通性:
    • 使用sudo wireshark命令打开wireshark,并且重新输入pingall命令:


      从图中可以看到,s1、s2在发送数据包时,会对host的数据分别打上对应的VLAN标记

(二)进阶要求

​ 阅读SDNLAB实验使用Mininet,编写Python代码,生成(一)中的SDN拓扑,并在代码中直接使用OVS令,做到可以直接运行Python程序完成和(一)相同的VLAN划分。

  • 在(一)中生成的拓扑代码的基础上加以修改:

    #!/usr/bin/env python
    
    from mininet.net import Mininet
    from mininet.node import Controller, RemoteController, OVSController
    from mininet.node import CPULimitedHost, Host, Node
    from mininet.node import OVSKernelSwitch, UserSwitch
    from mininet.node import IVSSwitch
    from mininet.cli import CLI
    from mininet.log import setLogLevel, info
    from mininet.link import TCLink, Intf
    from subprocess import call
    
    def myNetwork():
    
        net = Mininet( topo=None,
                       build=False,
                       ipBase=\'10.0.0.0/8\')
    
        info( \'*** Adding controller\\n\' )
        c0=net.addController(name=\'c0\',
                          controller=Controller,
                          protocol=\'tcp\',
                          port=6633)
    
        info( \'*** Add switches\\n\')
        s1 = net.addSwitch(\'s1\', cls=OVSKernelSwitch)
        s2 = net.addSwitch(\'s2\', cls=OVSKernelSwitch)
    
        info( \'*** Add hosts\\n\')
        h1 = net.addHost(\'h1\', cls=Host, ip=\'10.0.0.1\', defaultRoute=None)
        h2 = net.addHost(\'h2\', cls=Host, ip=\'10.0.0.2\', defaultRoute=None)
        h3 = net.addHost(\'h3\', cls=Host, ip=\'10.0.0.3\', defaultRoute=None)
        h4 = net.addHost(\'h4\', cls=Host, ip=\'10.0.0.4\', defaultRoute=None)
    
        info( \'*** Add links\\n\')
        net.addLink(h1, s1, 1, 1)
        net.addLink(h2, s1, 1, 2)
        net.addLink(h3, s2, 1, 1)
        net.addLink(h4, s2, 1, 2)
        net.addLink(s1, s2, 3, 3)
        
    
        info( \'*** Starting network\\n\')
        net.build()
        info( \'*** Starting controllers\\n\')
        for controller in net.controllers:
            controller.start()
    
        info( \'*** Starting switches\\n\')
        net.get(\'s1\').start([c0])
        net.get(\'s2\').start([c0])
    
        info( \'*** Post configure switches and hosts\\n\')
        
        s1.cmd("sudo ovs-ofctl -O OpenFlow13 add-flow s1 priority=1,in_port=1,actions=push_vlan:0x8100,set_field:4096-\\>vlan_vid,output:3")
        s1.cmd("sudo ovs-ofctl -O OpenFlow13 add-flow s1 priority=1,in_port=2,actions=push_vlan:0x8100,set_field:4097-\\>vlan_vid,output:3")
        s1.cmd("sudo ovs-ofctl -O OpenFlow13 add-flow s1 priority=1,dl_vlan=0,actions=pop_vlan,output:1")
        s1.cmd("sudo ovs-ofctl -O OpenFlow13 add-flow s1 priority=1,dl_vlan=1,actions=pop_vlan,output:2")
        
        s2.cmd("sudo ovs-ofctl -O OpenFlow13 add-flow s2 priority=1,in_port=1,actions=push_vlan:0x8100,set_field:4096-\\>vlan_vid,output:3")
        s2.cmd("sudo ovs-ofctl -O OpenFlow13 add-flow s2 priority=1,in_port=2,actions=push_vlan:0x8100,set_field:4097-\\>vlan_vid,output:3")
        s2.cmd("sudo ovs-ofctl -O OpenFlow13 add-flow s2 priority=1,dl_vlan=0,actions=pop_vlan,output:1")
        s2.cmd("sudo ovs-ofctl -O OpenFlow13 add-flow s2 priority=1,dl_vlan=1,actions=pop_vlan,output:2")
    
        CLI(net)
        net.stop()
    
    if __name__ == \'__main__\':
        setLogLevel( \'info\' )
        myNetwork()
    
    
    • 重新运行结果如下:

    • 查看流表:

    • 测试连通性,得到(一)中相同结果:

四、心得

实验难度:

  • 这一次实验涉及的内容不多,但是多是没有接触过的内容,也比较难以理解,难度较上次实验有明显的提高。

实验过程遇到的困难及解决办法:

  • 使用ovs-vsctl show 命令查看拓扑结构时,可能存在多个网桥结构,可以使用sudo mn --clean 清除所有网桥或者使用 ovs-vsctl del-br 网桥名 逐个删除
  • 在添加流表的过程中,显示:

    可以新开一个Terminal页面,重新运行031902127.py文件后保持拓扑网络运行即可。
  • (一)中拓扑网络p1端口ip地址应该为192.168.0.100,若如题目中使用190.168.0.100会导致ping不通,修改端口ip地址即可。

个人感想:

  • 最好要在理解的基础上编写代码,照抄材料提供的代码容易出现问题(比如端口号忘记改)。
  • 对于ovs的使用只是停留在表面,为了完成实验,查阅了很多网上的资料,对于一些方法的使用还是一知半解,还需要深入学习和掌握。

以上是关于如何升级Mininet的Open vSwitch版本的主要内容,如果未能解决你的问题,请参考以下文章

实验2:Open vSwitch虚拟交换机实践

Open vSwitch流表应用实战

Open vSwitch的VxLAN隧道网络实验

实验2:Open vSwitch虚拟交换机实践

实验2:Open vSwitch虚拟交换机实践

SDN实验2:Open vSwitch虚拟交换机实践