Open vSwitch是Apache 2.0协议下,实现分布式虚拟多层网络交换机功能的产品级开源软件,其目的是为硬件虚拟化环境提供交换机堆栈,支持计算机网络中使用的多种协议和标准。其具体概念参考官方文档 。
Title: Open vSwitch安装与使用
Author: Yunyao Zhang(张云尧)
E-mail: aidaizyy@gmail.com
Last Modified: 2016-12-27
本文使用的服务器操作系统发行版本为CentOS 6.3,kernel版本为2.6.32-279.el6.x86_64,Open vSwitch版本为2.4.1。
下载源码
下载Open vSwitch,目前最新的版本为2.6.1(发布于2016.11.2),只支持kernel 3.10-4.7。因为服务器的kernel版本(2.6.32-279)较低,经测试2.4.1可以正常使用(支持kernel 2.6.32-4.0),更高的还有2.5.1(支持kernel 2.6.32-4.3)。
如需其他版本,把上面的2.4.1替换为2.6.1或者2.5.1或者更低的版本。
或者直接到官网http://openvswitch.org/download 下载。
准备环境
安装Open vSwitch需要准备的环境,可以参考https://github.com/openvswitch/ovs/blob/master/Documentation/intro/install/general.rst 的”Build Requirements”部分。
摘自官方文档:
需要的软件:
- GNU make
- 编译器:GCC 4.x/Clang 3.4
- libssl:可选,在需要连接ovs(Open vSwitch)到OpenFlows控制器时推荐安装
- libcap-ng:可选,在需要非root用户使用root权限运行ovs后台程序时推荐安装
- Pyhton 2.7
其他情况的软件及需要的内核模块自行参考官方文档。
如果要编译内核模块,需要与内核版本一致的内核源代码,通常位于/usr/src/kernels/<version>或者/usr/src/<versio>。
uname -r得到。
如果打印了一个目录列表,直接进行编译;
如果打印了No such file or directory error,执行以下操作:
或者为
重复上面的步骤验证是否生效。
编译安装
|
|
配置编译内核模块,如果不需要基于内核的交换机(可以只运行在用户态空间中),即直接./configure。
其他配置,参考上面链接的官方文档。
|
|
make modules_install编译内核模块,可以不用执行。
在编译内核模块的过程中,需要/lib/modules/<version>/build/include/generated/utsrelease.h,可能会遇到较低kenrel版本中的指定位置并没有文件utsrelease.h的错误,我们可以在<version>/build/include/linux/utsrelease.h找到该文件,把它复制到.../generated/utsrelease.h,重新编译。
加载模块
如果不需要基于内核的交换机,没有编译内核模块,可以跳过这一步。
因为openvswitch模块与linux的bridge模块冲突,所以如果发生冲突,不能加载ovs的内核模块时,先卸载掉bridge模块。
用lsmod查看已加载的所有模块,验证是否加载ovs的内核模块成功。
如果一直加载模块不成功,可以用命令modinfo openvswitch查看该模块的信息,内核版本以及依赖关系等。或者用dmesg | tail查看kernel的日志信息。
关于ovs的内核模块的作用,可以参考https://github.com/openvswitch/ovs/blob/master/Documentation/intro/why-ovs.rst 。
初始操作
遇到权限不够时,使用sudo命令或root用户,或者libcap-ng。
|
|
创建配置数据库vswitch.ovsschema是一个数据库模板,存放在openvswitch-2.4.1/vswitchd/vswitch.ovsschema。conf.db是数据库文件,是vswith.ovsschema的一份拷贝。
|
|
创建连接到上面创建的配置数据库的Unix domain socket,以便管理员能管理数据库。
如果不需要SSL支持,删除掉--private,--certificate,--bootstrap。
执行以上操作后,开启了进程ovsdb-server。
|
|
对数据库进行初始化。
|
|
开启ovs后台程序,连接到上面创建的Unix domain socket。一个后台程序可以管理和控制本机上任意数量的ovs交换机。--pidfile的意思是创建一个运行的进程文件,默认路径为/usr/local/var/run/openvswitch/,可以用ovs-appctl管理该后台程序。--detach的意思是在后台运行。--log-file的意思是创建一个日志文件,默认路径为/usr/local/var/log/openvswitch/,可以查看该后台程序的日志。
其他参数可通过man ovs-vswitchd查看。
|
|
用ps命令查看当前运行的ovs进程,一共有两个进程,分别是ovs-server和ovs-vswitchd。
这两个进程的pidfile都在/usr/local/var/run/openvswitch/中,可以用ovs-appctl管理。
应用举例
ovs-vsctl命令主要是把配置信息更新到数据库中。
添加网桥
创建ovs网桥br0
ovs网桥就表示以太网交换机(Switch)。
如果没有加载openvswitch内核模块,以上操作会报错,在日志文件中可以得到详情。如果想要ovs完全运行在用户态空间中,不使用内核模块,进行以下操作:
--替代ovs-vsctl命令,也可以拆成两个语句执行。
后面的操作表示把数据库中ovs网桥br0的datapath_type属性的值设为netdev,对br0的其他属性设置操作类似。
netdev表示用户态数据通路,system表示内核数据通路。
关于用户态空间ovs的更多资料,可以参考https://github.com/openvswitch/ovs/blob/master/Documentation/intro/install/userspace.rst 。
删除ovs网桥br0
添加端口
为br0添加端口p0
同样会报错,因为根本实际没有p0这个端口。
我们把p0的类型设置为虚拟端口可以解决这个问题。
interface是连接到port的网络接口设备,一对一关系,可以直接理解为port。
其他类型还有system、tap、geneve、gre、ipsec_gre、vxlan、lisp、stt、patch、null等。
删除端口p0
网桥接管以太网卡
br0接管以太网卡端口eth0
因为eth0是实际存在的端口,不需要特意设置类型为internal。
这时存在一个问题,以上操作执行后,eth0直接断网,不能连接到外网,如果使用ssh连接的服务器的就要小心了。
(实际使用中发现只有在内核模式下才会断网,用户态模式下不会断网。)
要解决这个问题,只需要把eth0的相同ip/子网掩码/网关等设置移植给br0即可。
比如eth0的ip为192.168.1.100,子网掩码为255.255.0.0,网关为192.168.0.254。
注意还要把eth0的ip清空后。
在清空eth0的ip之前,最好执行route -n命令,观察eth0现有的路由设置,避免br0的路由设置出错。
上面设置了默认网关,其他的路由设置自行查询route命令用法设置。
这时能ping通外网的话,表示设置成功。
ovs-vsctl show显示ovs交换机的信息。
虚拟端口连接外网
实际上这时p0在网桥中,已经连接到外网了,但还不能使用,因为p0还没有up。
同样设置ip和子网掩码,然后用混杂模式up。
混杂模式可以接收非本ip的数据包,如果不使用混杂模式,接收到非本ip的数据包直接丢弃,在交换机该场景下需要使用混杂模式。
这时通过指定ping外网,就可以验证是否成功。
这里可能会有疑问,为什么不直接创建一个tap设备来替代这个虚拟端口?关于这个问题,在https://github.com/openvswitch/ovs/blob/master/Documentation/faq/issues.rst 其中的“Q: I created a tap device tap0, configured an IP address on it, and add it to a bridge. I exacped that I counld then use this IP address to contract other hosts on the network, but it doesn’t work. Why not?”部分有解答。
除了ovs内部的虚拟端口,加入ovs的其他网络设备发送的数据包都会被丢弃。假如我们在tap设备上ping任意一个ip地址,tap设备将会发送ARP数据包,但是这些ARP数据包都会被丢弃,所以tap设备无法正常工作。在上面的场景中,只能用ovs内部的虚拟端口来实现。
参考资料
- Open vSwitch官网:http://openvswitch.org
- Github地址:https://github.com/openvswitch/ovs
转载请注明原作者和出处。
如果觉得这篇文章对您有帮助或启发,请随意打赏~
![]()
![]()
