网站首页 > 技术文章 正文
ovs编译
git clone https://gitee.com/mirrors/ovs.git
cd ovs
git checkout v2.17.7
./boot.sh
./configure
make -j
make install
ovs默认安装在/usr/local/,/var/,/etc/目录下,./configure时可通过--prefix,--localstatedir,--sysconfdir指定安装和运行目录
ovs运行
启动ovsdb-server
ovsdb-server --remote=punix:/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
启动ovs-vswitchd
ovs-vswitchd --pidfile --detach --log-file
ovs port类型
原生ovs的port有四种类型:normal、internal、patch、tunnel(不包括dpdk类型端口,dpdk端口类型由dpdk实现)。
类型 | 功能 |
normal | 用户可以把操作系统上的网卡绑定到ovs上,ovs会生成一个普通的端口处理这块网卡进出的数据包。 |
internal | ovs会创建一块虚拟网卡,虚拟网卡会自动与Port绑定。当ovs创建一个新网桥时,默认会创建一个与网桥同名的port。 |
patch | 当ovs中有多个网桥时,可以使用patch port将两个网桥连接起来,patch port总是成对出现,分别连接在两个网桥上,相当于内核的veth pair。 |
tunnel | 隧道端口是一种虚拟端口,支持使用gre或vxlan等隧道技术与位于网络上其它位置的远程端口通讯。 |
ovs datapath类型
ovs的转发平面称为datapath,目前有三种实现方式:
1、内核层实现(dpif-netlink),也是默认的实现方式(openvswitch.ko)
2、用户层实现(dpif-netdev),实现方式一般为ovs+dpdk
3、硬件层实现,当前比较流行的dpu,将流表卸载到硬件网卡
ovs报文转发流程
该部分内容更加详细的参见:https://www.intel.cn/content/www/cn/zh/developer/articles/technical/ovs-dpdk-datapath-classifier.html
ovs的报文转发流程如下,共涉及三种类型的流表:
1、Ofproto Classifier(openflow),又称慢速路径,本质上是openflow流表在ovs中的存在形式,由Controller控制器通过openflow协议下发,或由ovs-ofctl命令手动下发。每个网桥都有自己的openflow流表,相关数据结构有struct classifier(openflow流表,位于struct oftable结构体中,包含若干个子表),struct cls_subtable(openflow子表,相同掩码的表项放在同一个子表里面),struct rule(openflow表项)
2、Datapath Classifier(dpcls),又称快速路径,datapath的一种缓存技术,每个(入)端口都有自己的dpcls表,相关的数据结构有struct dpcls(dpcls表,包含若干个子表),struct dpcls_subtable(dpcls子表,相同掩码的表项放在同一个子表中),struct dpcls_rule(dpcls表项)
3、Exact Match Cache(emc),精确匹配表,datapath的更加快速的一种缓存技术,每个pmd线程都有自己的emc表,相关的数据结构有struct emc_cache(emc表),struct emc_entry(emc表项)
需要注意的是:struct miniflow用于从报文中提取特征值,比如IP、MAC等,struct flow由miniflow扩展而来(包含报文的特征值),用于匹配openflow的struct rule,openflow的表项存放在struct rule中,不存放在struct flow中!!!
查表流程:
ovs action翻译与执行流程
一条openflow流表下发到ovs后,会存放在struct rule结构中,报文上送时,会翻译struct rule中的actions,并将action应用于报文。流程如下(以mod_nw_tos为例):
ovs 流表卸载流程
pmd_thread_main为dpdk的pmd线程,dp_netdev_flow_offload_main为ovs的流表卸载线程。二者为多对一的关系,通过mpsc(mutilple producer single consumer)队列联系在一起。
调用流程如下:
ovs-appctl常用命令
ovs-appctl list-commands // 列出ovs-appctl支持的所有命令,可以通过grep过滤。
ovs-appctl vlog/list // 列出所有支持记录日志的模块和它们当前的日志等级(日志方式:console/syslog/file,日志级别:off/emer/err/warn/info/dbg)。
ovs-appctl vlog/set info // 设置所有模块的日志级别为info。
ovs-appctl vlog/set vswitchd:file:warn // 设置vswitchd模块的file日志的日志级别为warn。
ovs-appctl vlog/disable-rate-limit // 默认情况下,ovs-vswitchd限制了日志的速率,该命令可以解除限制。
ovs-appctl vlog/enable-rate-limit // 限制日志的记录速率。
ovs-appctl tnl/arp/set <bridge> <ip> <mac> // 设置arp缓存
ovs-appctl tnl/arp/show // 查看arp缓存
ovs-appctl tnl/arp/flush // 清除arp缓存
ovs-ofctl常用命令
ovs-ofctl --version // 查询ovs的版本以及ovs支持的openflow的版本,“OpenFlow versions 0x1:0x6”表示支持OpenFlow1.1~OpenFlow1.6的版本
ovs-ofctl show br-ext // 查询br-ext网桥的流表相关信息
ovs-ofctl add-flow br-ext nw_src=1.1.1.1/24,dl_type=0x0800,in_port=dpdk0,action=output:dpdk1 // 在br-ext网桥上添加流表,从dpdk0进入的源IP为1.1.1.1/24的包,从dpdk1口出去
ovs-ofctl dump-flows br-ext --names // 查询br-ext网桥上的流表,--name使用端口名显示,--no-names使用端口号显示
ovs-ofctl del-flows br-ext // 删除br-ext网桥上的所有流表
ovs-ofctl dump-ports br-ext --names // 查询br-ext网桥上的ofproto端口,--name使用端口名显示,--no-name使用端口号显示
ovs-vsctl常用命令
ovs-vsctl show // 查询ovs的拓扑信息
ovs-vsctl add-br br-ext -- set bridge br-ext datapath_type=netdev -- set bridge fail-mode=secure // 添加一个网桥,datapath类型为netdev,fail-mode故障模式为secure
ovs-vsctl set-fail-mode br-int secure // 设置br-int网桥的故障模式为secure
ovs-vsctl get-fail-mode br-int // 获取br-int网桥的故障模式
注:ovs在连接不上控制器时会进入故障模式(fail_mode),fail_mode有两种状态:standlone,secure。如果配置了standlone模式,一旦无法连接控制器,ovs将清除控制器下发的流表,自己接管转发,此时ovs作为一个标准的MAC学习的二层交换机。如果配置了secure模式,一旦无法连接控制器,ovs将按照原来的流表继续转发。
ovs-vsctl del-br br-ext // 删除br-ext网桥
ovs-vsctl add-port br-ext dpdk0 -- set interface dpdk0 type=dpdk options:dpdk-devargs=net_virtio_user0,mac=11:22:33:44:55:66,path=/tmp/vhost0,queue=1 // 在br-ext网桥上添加一个dpdk0端口,options为dpdk端口的配置参数
ovs-vsctl del-port dpdk0 // 删除dpdk0端口
- 上一篇: OVS组件介绍(ovs主要功能)
- 下一篇: 虚拟化网络- 虚拟交换机ovs(虚拟交换机有什么用)
猜你喜欢
- 2024-11-17 吴谨言专访大反转!痛批耍大牌后竟翻红,六公主七连发力显真诚
- 2024-11-17 港股2月28日物业股涨幅榜:CHINAOVSPPT涨1.72%位居首位
- 2024-11-17 港股2月28日物业股午盘:CHINAOVSPPT涨1.72%位居首位
- 2024-11-17 港股3月2日物业股涨幅榜:CHINAOVSPPT涨1.03%位居首位
- 2024-11-17 港股3月2日物业股午盘:CHINAOVSPPT涨1.03%
- 2024-11-17 天赋与心痛的背后:邓鸣贺成长悲剧引发的深刻反思
- 2024-11-17 冯小刚女儿徐朵追星范丞丞 同框合照曝光惹人羡,回应网友尽显亲民
- 2024-11-17 “资本大佬”王冉:51岁娶小17岁童瑶,并承诺余生为娇妻保驾护航
- 2024-11-17 港股3月2日物业股午盘:CHINAOVSPPT涨1.03%位居首位
- 2024-11-17 「IT之家开箱」vivo S15 图赏:双镜云窗,盛夏风光
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- oraclesql优化 (66)
- 类的加载机制 (75)
- feignclient (62)
- 一致性hash算法 (71)
- dockfile (66)
- 锁机制 (57)
- javaresponse (60)
- 查看hive版本 (59)
- phpworkerman (57)
- spark算子 (58)
- vue双向绑定的原理 (68)
- springbootget请求 (58)
- docker网络三种模式 (67)
- spring控制反转 (71)
- data:image/jpeg (69)
- base64 (69)
- java分页 (64)
- kibanadocker (60)
- qabstracttablemodel (62)
- java生成pdf文件 (69)
- deletelater (62)
- com.aspose.words (58)
- android.mk (62)
- qopengl (73)
- epoch_millis (61)
本文暂时没有评论,来添加一个吧(●'◡'●)