Openvswitch原理与代码分析(1):总体架构⼀、Opevswitch总体架构
Openvswitch的架构⽹上有如下的图表⽰:
半乳糖每个模块都有不同的功能
双眼台风ovs-vswitchd 为主要模块,实现交换机的守护进程daemon 在Openvswitch 所在的服务器进⾏ps aux 可以看到以下的进程
1995年高考语文第一题
root 1008 0.1 0.8 242948 31712 ? S<Ll Aug06 32:17 ovs-vswitchd unix:/var/run/openvswitch/db.sock -
vconsole:emer -vsyslog:err -vfile:info --mlockall --no-chdir --log-file=/var/log/openvswitch/ovs-vswitchd.log --
pidfile=/var/run/openvswitch/ovs-vswitchd.pid --detach --monitor
注意这⾥ovs-vswitchd监听了⼀个本机的db.sock⽂件
智能卡阅读器openvswitch.ko为Linux内核模块,⽀持数据流在内核的交换
我们使⽤lsmod列举加载到内核的模块:
~# lsmod | grep openvswitch
openvswitch 66901 0
gre 13808 1 openvswitch
vxlan 37619 1 openvswitch
libcrc32c 12644 2 btrfs,openvswitch
既有Openvswitch.ko,也有应用系统集成
ovsdb-server 轻量级数据库服务器,保存配置信息,ovs-vswitchd通过这个数据库获取配置信息 通过ps aux可以看到如下进程
root 985 0.0 0.0 21172 2120 ? S< Aug06 1:20 ovsdb-server /etc/openvswitch/conf.db -vconsole:emer -vsyslog:err -
vfile:info --remote=punix:/var/run/openvswitch/db.sock --private-key=db:Open_vSwitch,SSL,private_key --
certificate=db:Open_vSwitch,SSL,certificate --bootstrap-ca-cert=db:Open_vSwitch,SSL,ca_cert --no-chdir --log-
file=/var/log/openvswitch/ovsdb-server.log --pidfile=/var/run/openvswitch/ovsdb-server.pid --detach –monitor
可以看出,ovsdb-server将配置信息保存在conf.db中,并通过db.sock提供服务,ovs-vswitchd通过这个db.sock从这个进程读取配置信息。/etc/openvswitch/conf.db是json格式的,可以通过命令ovsdb-client dump将数据库结构打印出来。
数据库结构包含如下的表格。
数据库结构如下:
通过ovs-vsctl创建的所有的⽹桥,⽹卡,都保存在数据库⾥⾯,ovs-vswitchd会根据数据库⾥⾯的配置创建真正的⽹桥,⽹卡。ovs-dpctl ⽤来配置switch内核模块。
ovs-vsctl 查询和更新ovs-vswitchd的配置。
ovs-appctl 发送命令消息,运⾏相关daemon。 ovs-ofctl 查询和控制OpenFlow交换机和控制器。
⼆、Openvswitch的代码结构
Openvwitch进⾏数据流交换的主要逻辑都是在ovs-vswitchd和openvswitch.ko⾥⾯实现的。
ovs-vswitchd会从ovsdb-server读取配置,然后调⽤ofproto层进⾏虚拟⽹卡的创建或者流表的操作。Ofproto是⼀个库,实现了软件的交换机和对流表的操作。
Netdev层抽象了连接到虚拟交换机上的⽹络设备。 Dpif层实现了对于流表的操作。
对于OVS来讲,有以下⼏种⽹卡类型
1). netdev: 通⽤⽹卡设备 eth0 veth
接收: ⼀个nedev在L2收到报⽂后回直接通过ovs接收函数处理,不会再⾛传统内核协议栈.
发送: ovs中的⼀条流指定从该netdev发出的时候就通过该⽹卡设备发送
2). internal: ⼀种虚拟⽹卡设备
接收: 当从系统发出的报⽂路由查通过该设备发送的时候,就进⼊ovs接收处理函数
发送: ovs中的⼀条流制定从该internal设备发出的时候,该报⽂被重新注⼊内核协议栈
3). gre device: gre设备. 不管⽤户态创建多少个gre tunnel, 在内核态有且只有⼀个gre设备
接收: 当系统收到gre报⽂后,传递给L4层解析gre header, 然后传递给ovs接收处理函数
云南巧家泥石流发送: ovs中的⼀条流制定从该gre设备发送, 报⽂会根据流表规则加上gre头以及外层包裹ip,查路由发送