OVS组成
ovs-vswitchd:ovs守护进程,实现基于流的交换,实现内核datapath upcall 处理以及ofproto 查表,同时是dpdk datapath处理程序。与ovsdb-server通信使用OVSDB协议,与内核模块使用netlink机制通信,与controller通信使用OpenFlow协议。
ovsdb-server:OVS轻量级的数据库服务器的服务程序,用于保存整个OVS的配置信息。数据库服务程序, 使用目前普遍认可的ovsdb 协议。
ovs-vsctl:网桥、接口等的创建、删除、设置、查询等。
ovs-dpctl:配置vswitch内核模块
ovs-appctl:发送命令消息到ovs-vswithchd, 查看不同模块状态
ovs-ofctl:下发流表信息。该命令可以配置其他openflow 交换机(采用openflow 协议)
datapath: Datapath把流的match和action结果缓存,避免后续同样的流继续upcall到用户空间进行流表匹配。
ovs-db:开放虚拟交换机数据库是一种轻量级的数据库,它是一个JSON文件,默认路径:/etc/openvswitch/conf.db;
可以通过命令ovsdb-client dump将数据库结构打印出来。OVSDB中包含一系列记录网桥、端口、QoS等网络配置信息的表,这些表均以JSON格式保存。
每一个ovs交换机中,数据库中存在的表如下:
Open vSwitch 内部分为用户态和内核态。
用户层(态)
为守护程序实现了交换机和流表
,是 Open vSwitch 的核心,提供了一些组件去管理交换机,实现数据库,对内核进行直接管理。
内核态
openvswitch_mod.ko 是内核态(kernel)的主要模块,完成数据包的查找、转发、修改等操作
,一条 flow 的后续数据包到达 OVS 后将直接交由内核态,使用 openvswitch_mod.ko 中的处理函数对数据包进行处理。
数据包处理流程
处理流程:
数据流(flow) 通过 Open vSwitch 转发的流程。
每收到一个包之后,OVS Kernel Module 将检查它是否能能命中内核模块的缓存(flow cache)
如果命中缓存则交由 kernel 处理;
如果不能命中缓存则先发送到用户空间(ovs-vswitchd process )进行转发决策 ——— 基于一系列已经安装配置的规则库(OpenFlow rules);如果没有命中任何一条规则,则将包发送给 OpenFlow 控制器处理。
一旦做出转发决策,这个包和转发动作将传回 OVS Kernel Module 缓存起来。
这条 flow 接下来的包就将命中缓存并直接由 kernel 转发处理。
核心概念
Bridge
:网桥,对应一个以太网交换机(Switch),一个主机中可以创建一个或者多个 Bridge 设备。Port
:Port 与物理交换机的端口概念类似, 每个 Port 都属于一个特定的 Bridge - 端口类型:Normal、Internal、Patch、Tunnel。Interface
:接口,对应网卡,即可以是 ovs 生成的虚拟网卡,也可能是挂载在 ovs 的物理网卡。在通常情况下,Port 和 Interface 是一对一的关系, 只有在配置 Port 为 bond 模式后,Port 和 Interface 是一对多的关系。datapath
: 在 OVS 中,datapath 负责执行数据交换,也就是把从接收端口收到的数据包在流表中进行匹配,并执行匹配到的动作。Flow table
: 每个 datapath 都和一个“flow table”关联,当 datapath 接收到数据之后, OVS 会在 flow table 中查找可以匹配的 flow,执行对应的操作, 例如转发数据到另外的端口。
在网络中,交换机和桥都是同一个概念,OVS实现了一个虚拟机的以太交换机,换句话说,OVS也就是实现了一个以太桥。那么,在OVS中,给一个交换机,或者说一个桥,用了一个专业的名词,叫做DataPath!
命令行
两种运行模式:
standalone
: 有控制器切换为openflow switch,没有控制器为破铜switchsecure
: 一直为openflow switch
OpenvSwitch的操作命令有若干个,其中比较重要的有
ovsdb-tool
对ovsdb数据库操作,不经过ovsdb-server模块
ovs-vsctl
用来查询和配置ovs-vswitchd
ovs-ofctl
管理配置openflow switch,操作交换机流表
ovs-vsctl
# 1. 查看网桥,查看所有的网桥的信息
ovs