简介
搭建SDN环境少不了SDN交换机,SDN交换机跟普通交换机最大的区别就是将普通交换机的数据平面和控制平面相分离,SDN交换机只负责数据的转发,而控制指令则由更上一级的控制器下发。
Open vSwitch(下面简称OVS)是一个高质量的、多层虚拟交换机。OVS遵循开源Apache2.0许可,通过可编程扩展,OVS可以实现大规模网络的自动化(配置、管理、维护),同时支持现有标准管理接口和协议(比如NetFlow、sFlow、SPAN、RSPAN、CLI、LACP、802.1ag等)。此外OVS支持多种linux虚拟化技术,包括Xen/XenServer, KVM,和 VirtualBox等。
本文通过Ubuntu平台安装部署OVS,并介绍OVS上的一些常用操作,让读者进一步了解OpenFLow交换机。
实验环境
1. 本文基于下列环境安装:
- 虚拟机Vmware Workstation 10.0.3;
- Ubuntu13.10(内核版本3.11);
- OVS选择截稿前最新的Open vSwitch 2.3.0版本(2014年8月14日发布)。
2. OVS2.3.0版本最新特性及改进如下:
- OpenFlow 1.1,1.2,和1.3协议现在在OVS vswitchd中默认启用。
- Linux内核数据面现在提供一个优化的流匹配过程的精确匹配缓存。
- 数据面流现在有部分通配符tranport端口匹配字段。这减少了用户空间的向上调用,但会增加数据面中不同的掩模数。
- 提供megaflows在Linux内核下数据平面的操作。
- 添加IPFIX支持SCTP流和模板ICMPv4 / V6流。
- Linux内核支持到3.14。
- 添加dpdk实验支持。
3. OVS各版本支持的Linux内核如下,可以根据下表选择适合的Linux系统安装。
表1. OVS与Linux内核版本对应关系
4. OVS各模块简要介绍如下:
- ovs-vswitchd:主要模块,实现switch的daemon,包括一个支持流交换的Linux内核模块;
- ovsdb-server:轻量级数据库服务器,提供ovs-vswitchd获取配置信息;
- ovs-dpctl:用来配置switch内核模块;
- 一些Scripts and specs 辅助OVS安装在Citrix XenServer上,作为默认switch;
- ovs-vsctl:查询和更新ovs-vswitchd的配置;
- ovs-appctl:发送命令消息,运行相关daemon。
此外,OVS也提供了支持OpenFlow的特性实现,包括:
- ovs-ofctl:查询和控制OpenFlow交换机和控制器;
- ovs-pki:OpenFlow交换机创建和管理公钥框架;
- ovs-tcpundump:tcpdump的补丁,解析OpenFlow的消息。
准备工作
在正式下载安装OVS之前我们需要安装一些系统组件及库文件以作为OVS正确运行的环境依赖。请切换至root用户进行操作。
# apt-get update
# apt-get install -y build-essential
注:正常运行使用OVS只需要安装上述依赖即可,如果需要进一步开发OVS可能需要其他环境依赖,可以自行度娘。
部署Open vSwitch 2.3.0
1.下载OVS 2.3.0安装包。
2. 解压OVS 2.3.0安装包。
# wget http://openvswitch.org/releases/openvswitch-2.3.0.tar.gz
# tar -xzf openvswitch-2.3.0.tar.gz
3. 构建基于Linux内核的交换机。
# cd openvswitch-2.3.
# make clean
# ./configure --with-linux=/lib/modules/`uname -r`/build >/dev/null
4. 编译并安装OVS 2.3.0。
# make && make install
5. 如果需要OVS支持VLAN功能,还需要加载openvswitch.ko模块,如果不需要,此步可以忽略。
# modprobe gre
# insmod datapath/linux/openvswitch.ko
6. 我们需要安装并加载构建的内核模块。
# make modules_install
# /sbin/modprobe openvswitch
注:若重启机器导致openvswitch没有启动(lsmod |grep openvswitch),如果重新加载。
7. 使用ovsdb工具初始化配置数据库。
# mkdir -p /usr/local/etc/openvswitch
# ovsdb-tool create /usr/local/etc/openvswitch/conf.db vswitchd/vswitch.ovsschema
注:vswitchd/vswitch.ovsschema 指的是当前openvswitch工程目录下的。
至此,如果没有报错的话OVS的部署已经成功完成。如果中间步骤出现问题,请仔细检查是否按步骤进行或有无单词拼写错误。
启动Open vSwitch 2.3.0
1.在启动OVS之前,我们需要先启动ovsdb-server配置数据库。注意后面的命令大部分是由两个短“-”组成的。
# ovsdb-server -v --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.首次用ovsdb-tool创建数据库时需用ovs-vsctl命令初始化下数据库。
# ovs-vsctl --no-wait init
3. 启动OVS主进程
# ovs-vswitchd --pidfile --detach --log-file
4. 查看OVS进程是否启动。
root@ubuntu:/home/chulk/sdn/openvswitch-2.3.# ps aux|grep ovs
root 0.0 0.2 ? Ss : : ovsdb-server -v --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
root 0.3 0.2 ? Ssl : : ovs-vswitchd --pidfile --detach --log-file
root 0.0 0.0 ? S<s : : ovsdb-server: monitoring pid (healthy)
5. 我们可以通过如下命令查看所安装OVS的版本号。
# ovs-vsctl --version
如果到这步你都没有问题,那么恭喜,你已经成功安装并启动了OVS 2.3.0。下面我们会介绍一些常用的操作命令。
Open vSwitch基本操作
1. OVS连接控制器
如果我们想让启动好的OVS连接一个控制器,我们可以按如下步骤做。相关控制器的安装部署可以参考之前的技术专栏相关文章:《常用SDN控制器安装部署之Floodlight篇》,《SDN常用控制器安装部署之POX篇》,《OpenDaylight与Mininet应用实战之基本环境搭建(一)》。这里我们以Floodlight控制器为例。
首先添加一个名为br0的网桥。
# ovs-vsctl add-br br0
列出所有网桥。
# ovs-vsctl list-br
启用该网桥。
# ifconfig br0 up
此时再用ifconfig命令能在网络设备列表里看到名为br0的网桥即启动成功。
root@ubuntu:/home/chulk/sdn/openvswitch-2.3.# ifconfig -a
br0 Link encap:Ethernet HWaddr a6:0c:7f:2e:0a:
BROADCAST MULTICAST MTU: Metric:
RX packets: errors: dropped: overruns: frame:
TX packets: errors: dropped: overruns: carrier:
collisions: txqueuelen:
RX bytes: (0.0 B) TX bytes: (0.0 B) eth0 Link encap:Ethernet HWaddr :::2c:4f:1d
inet addr:172.16.26.136 Bcast:172.16.26.255 Mask:255.255.255.128
inet6 addr: fe80:::56ff:fe2c:4f1d/ Scope:Link
UP BROADCAST RUNNING MULTICAST MTU: Metric:
RX packets: errors: dropped: overruns: frame:
TX packets: errors: dropped: overruns: carrier:
collisions: txqueuelen:
RX bytes: (3.5 MB) TX bytes: (536.8 KB) lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::/ Scope:Host
UP LOOPBACK RUNNING MTU: Metric:
RX packets: errors: dropped: overruns: frame:
TX packets: errors: dropped: overruns: carrier:
collisions: txqueuelen:
RX bytes: (1.9 MB) TX bytes: (1.9 MB) ovs-system Link encap:Ethernet HWaddr fa:6e:dd:da:2e:a7
BROADCAST MULTICAST MTU: Metric:
RX packets: errors: dropped: overruns: frame:
TX packets: errors: dropped: overruns: carrier:
collisions: txqueuelen:
RX bytes: (0.0 B) TX bytes: (0.0 B)
我们可以用下面的命令将br0网桥连接至一个指定的控制器。
# ovs-vsctl set-controller br0 tcp:<controller IP>:<port>
这里本文使用的控制器地址为172.16.26.136,端口为6653。即:
# ovs-vsctl set-controller br0 tcp:172.16.26.136:
查看OVS是否连接上控制器。
root@ubuntu:/home/chulk/sdn/openvswitch-2.3.1# ovs-vsctl show
b784c584-f000-49c9-9c54-3b599cc8ad41
Bridge "br0"
Controller "tcp:172.16.26.136:6653"
is_connected: true
Port "br0"
Interface "br0"
type: internal
ovs_version: "2.3.1"
2. 交换机相关操作
查看虚拟交换机的信息。
root@ubuntu:/home/chulk/sdn/openvswitch-2.3.# ovs-ofctl show br0
OFPT_FEATURES_REPLY (xid=0x2): dpid:0000a60c7f2e0a47
n_tables:, n_buffers:
capabilities: FLOW_STATS TABLE_STATS PORT_STATS QUEUE_STATS ARP_MATCH_IP
actions: OUTPUT SET_VLAN_VID SET_VLAN_PCP STRIP_VLAN SET_DL_SRC SET_DL_DST SET_NW_SRC SET_NW_DST SET_NW_TOS SET_TP_SRC SET_TP_DST ENQUEUE
LOCAL(br0): addr:a6:0c:7f:2e:0a:
config: PORT_DOWN
state: LINK_DOWN
speed: Mbps now, Mbps max
OFPT_GET_CONFIG_REPLY (xid=0x4): frags=normal miss_send_len=
查看br0上各交换机端口的状态。
root@ubuntu:/home/chulk/sdn/openvswitch-2.3.1# ovs-ofctl dump-ports br0
OFPST_PORT reply (xid=0x2): 1 ports
port LOCAL: rx pkts=0, bytes=0, drop=0, errs=0, frame=0, over=0, crc=0
tx pkts=0, bytes=0, drop=0, errs=0, coll=0
查看br0上所有的流规则
root@ubuntu:/home/chulk/sdn/openvswitch-2.3.# ovs-ofctl dump-flows br0
NXST_FLOW reply (xid=0x4):
cookie=0xb, duration=.374s, table=, n_packets=, n_bytes=, idle_age=, priority=,dl_dst=::::: actions=LOCAL
cookie=0x0, duration=.020s, table=, n_packets=, n_bytes=, idle_age=, priority=,dl_dst=::::: actions=drop
cookie=0xa, duration=.457s, table=, n_packets=, n_bytes=, idle_age=, priority=,dl_dst=::::: actions=LOCAL
cookie=0x9, duration=.981s, table=, n_packets=, n_bytes=, idle_age=, priority=,ip,nw_proto= actions=CONTROLLER:
cookie=0x0, duration=.097s, table=, n_packets=, n_bytes=, idle_age=, priority= actions=drop
cookie=0x0, duration=.981s, table=, n_packets=, n_bytes=, idle_age=, priority=,dl_src=::::: actions=drop
cookie=0x0, duration=.981s, table=, n_packets=, n_bytes=, idle_age=, priority=,dl_src=ff:ff:ff:ff:ff:ff actions=drop
cookie=0x0, duration=.061s, table=, n_packets=, n_bytes=, idle_age=, priority= actions=drop
3. 网桥管理
之前已经添加了一个名为br0的网桥。
现在可以将网络接口eth0挂接到网桥br0上。
ovs-vsctl add-port br0 eth0
列出挂接到网桥br0上的所有网络接口。
ovs-vsctl list-ports br0
查看结果,如图所示:
ovs-vsctl show
删除网桥br0上挂接的eth0网络接口。
ovs-vsctl del-port br0 eth0
删除名为br0的网桥。
ovs-vsctl del-br br0
4. OVS其它常用命令及选项如下表所示:
表2. ovs-vsctl常用命令及选项
表3. ovs-ofctl常用命令及选项
参考:http://www.sdnlab.com/3166.html
编译安装或升级 :源代码目录 INSTALL
ubuntu apt-get 安装及操作: http://blog.csdn.net/sdnexplorer/article/details/26053713