云计算和SDN中的开源交换机介绍以及使用

之前关于SDN的开发工作都是在控制器层面上(以ryu为主),现在开始了新的工程项目,需要同时修改控制器和交换机的源码,如果后续项目需要,还可能需要加中间层——网络虚拟层,这部分的知识已经在前面读过了相关论文,有了了解。以前不论是硬件交换机和Mininet中都是用的CPqD,所以在这次首选的交换机是CPqD,读了两天源码之后发现自己的选择错了,对自己的想法也有了很大的改变。

网上能找到的CPqD相关源码的资料非常少非常少(我没有找到),我很晦涩的看了两天(C语言真的不好读),只是对代码有了大概的了解,并不能达到自己的要求,在第二天晚上,突然觉得自己走了冤枉路,被习惯的力量束缚了自己,所以立马转战OpenvSwitch,网上的源码资料相当多,所以学习了两天,基本可以上手该代码了。所以,时刻告诫自己,不要忘了出发时候的目的,克服习惯的束缚,选择最优的路径。

下面的两个交换机都是我实际用过的,没有好坏比较,都是杰出团队的大作,如果需要改写交换机源码,暂时推荐OpenvSwitch,因为他的资料多!不过如果以后有时间我还是打算读读CPqD代码的。个人感觉CPqD是比OpenvSwitch简单和轻量一点,毕竟他只实现了OpenFlow1.3协议,更多的用于实验目的,而OpenvSwitch内核模块是可以替换掉linux网桥的,支持OpenFlow协议只是他的一部分功能。

下面简单的介绍下CPqD和OpenvSwitch

一. CPqD

CPqD的github源码上面已经详细的讲解了他的安装和使用。之前我已经安装和使用了好多次,所以不再赘述

不过有个问题需要注意

  1. 在ubuntu13.10以上的版本CPqD无法正确编译
    原因:CPqD的编译依赖于netbee库,而如果bison版本大于2.5,这个库就不能编译,而ubuntu13.10以上的版本的bison库的版本都高于2.5
    解决办法:卸载系统的bison,安装符合要求的bison版本。github上面已经添加了解决办法。也可以参加下面两个连接:链接1链接2

二. OpenvSwitch

第一次用OpenvSwitch,所以很有必要自己详细总结过程,为以后提供方便,ubuntu用的是14.04LTS版本,内核版本为3.19.8

OpenvSwitch的官网里面有很详细的资料,可以现在源码解读和学习。

  1. 进入官网,下载自己所需要的OpenvSwitch版本,我下载了LTS版本2.3.2,后来发现有问题(问题1),重新下载了2.4版本
  2. 解压安装包: 
    tar -xzf openvswitch-2.4.0.tar.gz
  3. 构建基于Linux内核的交换机,uname -r用来得到自己linux内核版本号,用反引号(键盘上数字1左边)括起来,其中aptitude和apt-get一样,是Debian及其衍生系统中功能极其强大的包管理工具,但是aptitede在处理依赖问题上更佳一些,在删除一个包时,会删除本身所依赖的包,使系统更为干净。
    ./configure部分可以用--prefix=参数,可以让OVS完全安装在该目录底下。
  4. cd openvswitch-2.4.0
    aptitude install dh-autoreconf libssl-dev openssl #预先安装一些库 ./configure --with-linux=/lib/modules/'uname -r'/build
  5. 编译并安装OVS2.4.0
    make
    make install
  6. 安装并加载构建的内核模块
    modprobe gre
    insmod datapath/linux/openvswitch.ko
    make modules_install
    modprobe openvswitch

    此时可以通过lsmod |grep openvswitch来查看已载入系统的模块,发现有OpenvSwitch

  7. 使用ovsdb工具初始化配置数据库
    ovsdb-tool create /usr/local/etc/openvswitch/conf.db /usr/local/share/openvswitch/vswitch.ovsschema

如果顺利进行到这里,则表明OVS已经成功安装,下面介绍如何在Mininet中使用OVS

  1. 开启ovsdb-server配置数据库:有两种方式,如果要使用ssl连接,务必在编译前安装好libssl-dev以及openssl。之后可以在/usr/local/var/log/openvswitch中查看日志ovsdb-server.log
    1. no ssl
      ovsdb-server --remote=punix:/usr/local/var/run/openvswitch/db.sock 
      --remote=db:Open_vSwitch,Open_vSwitch,manager_options 
      --pidfile --detach --log-file
    2. ssl
      ovsdb-server --remote=punix:/usr/local/var/run/openvswitch/db.sock 
      --remote=db:Open_vSwitch,Open_vSwitch,manager_options 
      --private-key=db:Open_vSwitch,SSL,private_key 
      --certificate=db:Open_vSwitch,SSL,certificate 
      --bootstrap-ca-cert=db:Open_vSwitch,SSL,ca_cert 
      --pidfile --detach --log-file
  2. 开启ovs-vsctl
    ovs-vsctl --no-wait init
  3. 开启ovs-switchd功能,即主进程
    ovs-vswitchd --pidfile --detach

    至此,OVS启动完毕,可以在Mininet里面使用了

  4. 启动Mininet,交换机选成OVS
    sudo mn --controller=remote --switch=ovsk

这样完成了一次的安装和配置,可以如果重启机器会发现数据库什么的都得重新开始,所以我们可以继续配置,设置为开机自动启动

  1. 开机自动加载内核模块
    echo "openvswitch " >> /etc/modules
    echo "gre" >> /etc/modules
    echo "libcrc32c" >> /etc/modules
  2. 开机自动启动
    首先新建一个文件
    vim /etc/init.d/openvswitch

    文件内容为:

  3. #!/bin/sh
    start-stop-daemon -q -S -x /usr/local/sbin/ovsdb-server -- --remote=punix:/usr/local/var/run/openvswitch/db.sock --remote=db:Open_vSwitch,Open_vSwitch,manager_options --pidfile --detach --log-file
    sleep 3 # waiting ovsdb-server 
    start-stop-daemon -q -S -x /usr/local/bin/ovs-vsctl -- --no-wait init
    start-stop-daemon -q -S -x /usr/local/sbin/ovs-vswitchd -- --pidfile --detach --log-file

    接着改变文件权限,执行开机启动命令

    chmod +x /etc/init.d/openvswitch
    updata-rc.d -f openvswitch defaults

安装过程中遇到的问题:

  1. 问题:error:linux kernel in /lib/modules/3.19.0-25-generic/build is version 3.19.8, but version newer than 3.14.x is not supported
    原因:所用的OpenvSwitch的版本不支持linux内核版本高于3.14
    解决办法:最简单的版本就是下载和自己内核版本号对应的OpenvSwitch版本,下面列出OpenvSwitch和Linux内核的版本支持关系
    Open vSwitchLinux kernel
    1.4.x 2.6.18 to 3.2
    1.5.x 2.6.18 to 3.2
    1.6.x 2.6.18 to 3.2
    1.7.x 2.6.18 to 3.3
    1.8.x 2.6.18 to 3.4
    1.9.x 2.6.18 to 3.8
    1.10.x 2.6.18 to 3.8
    1.11.x 2.6.18 to 3.8
    2.0.x 2.6.32 to 3.10
    2.1.x 2.6.32 to 3.11
    2.3.x 2.6.32 to 3.14
    2.4.x 2.6.32 to 4.0
    2.5.x 2.6.32 to 4.3
     
  2. 问题:I/O error: /usr/local/etc/openvswitch/conf.db: failed to lock lockfile(Resource temporarily unavailable)
    原因:写conf.db文件所在的目录需要管理员权限
    解决办法:加上sudo即可,因此建议在安装初期直接切换到管理员sudo su
  3. 问题:Private key specified but OpenvSwitch was built without SSL support
    原因:没有安装SSL
    解决办法:在编译前安装好libssl-dev以及openssl。

三. openvswitch的简单使用(下文提到的网桥即OpenFlow交换机)

  1. 添加一个名为s的网桥
    ovs-vsctl add-br s
  2. 列出所有的网桥:
    ovs-vsctl list-br
  3. 查看交换机s的信息:
    ovs-ofctl show s
  4. 查看s交换机的端口的状态:
    ovs-ofctl dump-ports s
  5. 查看s交换机的流表:
    ovs-ofctl dump-flows s

四. openvswitch和CPqD的比较

经过我的实验,发现OVS比CPqD性能好太多!!!以前自己写的ryu拓扑发现模块包括ryu自带的模块用在CPqD上发现拓扑数量十分有限,今天安装好OVS后重新跑了下我的代码,相同的机器,性能简直好了太多太多! 

附上OVS2.4.0的主要最新特性和改进:

  1. 支持快速生成树协议
  2. 支持多播窥探
  3. 进行了连接词匹配OpenFlow扩展,在构建流的时候不会引入笛卡尔积数量爆炸
  4. 对许多CLI命令增加了bash命令行的完成
  5. 支持通过OpenFlow1.4协议进行事务更新
  6. 增加了最新OpenFlow的特征
  7. 增加了一个脚本——ovs-docker,可以很方便的把OVS集成在docker容器里面
  8. 支持linux内核中的STT和基本的Geneve隧道
  9. 支持VXLAN组策略扩展

说明:

  1. 上文中的CPqD均指的是CPqD/ofsoftswitch13交换机
  2. OpenvSwitch简称OVS
原文地址:https://www.cnblogs.com/cotyb/p/5042072.html