4. OVS源码编译与安装:下载OVS源码、配置DPDK支持、编译OVS、安装OVS、验证安装
好,咱们进入正题。这一章讲的是怎么把OVS从源码里“生”出来,并且让它跟DPDK“联姻”。说白了,就是让你亲手打造一个高性能的数据平面。
我见过不少新手,直接apt-get install就完事了。嗯,这样确实省事,但你拿到的只是一个“阉割版”的OVS,没有DPDK加速,性能差一大截。所以,咱们还是老老实实从源码编译吧。
4.1 下载OVS源码
第一步,当然是拿到源码。我个人习惯去官网或者GitHub上拉。
推荐方式:使用git clone,方便后续切换版本和查看历史。
# 克隆OVS官方仓库
git clone https://github.com/openvswitch/ovs.git
cd ovs
# 我建议切到一个稳定的版本,比如2.17.x
git checkout branch-2.17
为什么我建议切分支?因为master分支可能正在开发新功能,稳定性没保障。我在项目里吃过这个亏,编译出来跑着跑着就崩了,查了半天发现是某个新提交的bug。从那以后,我就老老实实用稳定分支了。
4.2 配置DPDK支持
这是最关键的一步。OVS默认是不带DPDK的,你得手动告诉它:“嘿,我要用DPDK!”
首先,你得确保DPDK已经安装好了。如果你还没装,可以参考上一章的内容。这里假设DPDK已经安装在/usr/local/dpdk目录下。
注意:DPDK的版本要和OVS兼容。我遇到过版本不匹配导致编译失败的情况,浪费了半天时间。建议去OVS的文档里查一下支持的DPDK版本列表。
配置命令如下:
# 生成configure脚本
./boot.sh
# 配置,启用DPDK支持
./configure --with-dpdk=/usr/local/dpdk
这里有个小细节:--with-dpdk后面跟的是DPDK的安装路径。如果你是用默认路径安装的,那可能就是/usr/local。如果不确定,可以用find / -name "libdpdk.pc"找一下。
小技巧:配置完成后,可以检查一下输出日志,看看有没有“DPDK support: yes”的字样。如果没有,说明配置没生效,得回头检查。
4.3 编译OVS
配置没问题,接下来就是编译。这一步相对简单,但耗时较长,尤其是第一次编译。
# 编译,使用多核加速
make -j $(nproc)
-j $(nproc)的意思是使用所有CPU核心并行编译。我刚开始用的时候,傻乎乎地只写make,结果等了好久。后来发现加个-j参数,速度能快好几倍。
编译过程中可能会报错,常见的有:
- 缺少依赖库:比如libssl、libcap-ng等。解决办法就是安装对应的开发包。
- DPDK路径不对:检查一下
--with-dpdk的路径是否正确。 - 编译器版本太低:OVS需要C11支持,gcc版本最好在4.9以上。
我曾经在一个老旧的CentOS 7上编译,gcc版本才4.8,死活过不去。最后升级了gcc才搞定。所以,环境准备真的很重要。
4.4 安装OVS
编译成功之后,就是安装。这一步会把编译好的二进制文件、库文件、配置文件等复制到系统目录中。
# 安装
make install
默认情况下,OVS会安装到/usr/local目录下。如果你想指定安装路径,可以在configure的时候加上--prefix参数。
重要:安装完成后,需要加载内核模块。OVS依赖几个内核模块,比如openvswitch、vport_*等。
# 加载内核模块
modprobe openvswitch
如果提示找不到模块,可能是模块没编译或者没安装。可以检查一下/lib/modules/$(uname -r)/目录下有没有openvswitch.ko文件。
4.5 验证安装
安装完了,怎么知道它好不好使?别急,咱们来验证一下。
首先,启动OVS的核心组件——ovsdb-server和vswitchd。
# 启动ovsdb-server
ovsdb-server --remote=punix:/usr/local/var/run/openvswitch/db.sock \
--remote=db:Open_vSwitch,Open_vSwitch,manager_options \
--pidfile --detach
# 初始化数据库
ovs-vsctl --no-wait init
# 启动vswitchd
ovs-vswitchd --pidfile --detach
然后,用ovs-vsctl show命令查看状态:
ovs-vsctl show
如果输出类似下面这样,说明安装成功:
7e8b3b7a-1c2d-4e3f-8a9b-0c1d2e3f4a5b
Bridge "br0"
Port "br0"
Interface "br0"
type: internal
Port "dpdk0"
Interface "dpdk0"
type: dpdk
options: {dpdk-devargs="0000:00:08.0"}
ovs_version: "2.17.0"
看到type: dpdk了吗?这说明DPDK已经成功集成进来了。
验证小技巧:还可以用ovs-appctl dpctl/dump-flows查看数据流表,或者用ovs-ofctl dump-ports查看端口统计。这些都能帮你确认OVS-DPDK是否正常工作。
嗯,到这里,OVS的源码编译与安装就完成了。你可能会觉得步骤有点多,但相信我,亲手编译一次,你对OVS的理解会深很多。下次遇到问题,你也能更快地定位和解决。
下一章,咱们会聊聊如何配置OVS-DPDK的桥接和端口,让数据真正跑起来。敬请期待!