第三章:源码编译安装——从源码到可执行文件的完整旅程

说实话,很多朋友觉得源码编译安装很麻烦,总想找现成的二进制包。但我个人一直坚持:想真正理解 OVS,源码编译这关必须过。你想想看,生产环境里遇到奇奇怪怪的问题,最后往往得回到源码层面去排查。

3.1 下载OVS源码

源码去哪找?当然是官方仓库。我习惯直接从 GitHub 拉取,这样版本控制最清晰。

# 克隆官方仓库
git clone https://github.com/openvswitch/ovs.git
cd ovs

# 或者下载特定版本的压缩包
wget https://www.openvswitch.org/releases/openvswitch-2.17.0.tar.gz
tar -xzf openvswitch-2.17.0.tar.gz
cd openvswitch-2.17.0
我的小建议:别总追最新版。我踩过坑——2.15.0 某个 commit 有内存泄漏,后来回退到 2.14.2 才稳定。生产环境选 LTS 版本最靠谱。

3.2 安装编译工具

编译 OVS 需要一堆基础工具。嗯,这里我列个清单,省得你一个个去搜。

工具/库 用途 安装命令(Ubuntu/Debian)
gcc / g++ C 编译器 apt install build-essential
autoconf / automake 生成 configure 脚本 apt install autoconf automake
libtool 通用库支持 apt install libtool
pkg-config 管理编译链接参数 apt install pkg-config
libssl-dev SSL/TLS 支持 apt install libssl-dev
python3 / python3-sphinx 构建文档 apt install python3 python3-sphinx
注意:CentOS/RHEL 上包名不一样。比如 libssl-dev 对应 openssl-devel。我曾经在 CentOS 7 上漏装了 libcap-ng-devel,结果编译出来的 ovs-vswitchd 没有 capabilities 支持,折腾了半天。

3.3 配置编译选项

源码下载好、工具装齐了,接下来就是配置环节。说白了,就是告诉编译器:你要编译哪些功能、装到哪个目录。

# 生成 configure 脚本(如果是从 git 克隆的)
./boot.sh

# 配置编译选项
./configure --prefix=/usr/local --with-linux=/lib/modules/$(uname -r)/build

这里几个关键参数我解释一下:

  • --prefix:指定安装路径。我习惯用 /usr/local,这样不会污染系统目录。
  • --with-linux:指定内核源码路径。如果你要编译内核模块,这个必须配。不配的话,ovs.ko 就出不来。
  • --enable-ssl:开启 SSL 支持,远程管理时用得上。
  • --enable-shared:编译成动态库,节省磁盘空间。

避坑指南:我曾经在编译时忘了加 --with-linux,结果 ovs-vswitchd 启动后内核模块没加载,数据包全走用户态,性能直接掉到 1Gbps 以下。后来加上这个参数重新编译,瞬间恢复到 40Gbps。

3.4 编译与安装

配置完,就该动真格的了。编译过程其实很简单,就两条命令:

# 编译(-j 后面的数字是并行编译的线程数,建议设为 CPU 核心数)
make -j$(nproc)

# 安装
make install

等等,这里有个细节。我第一次编译 OVS 时,直接 make install 就完事了。后来发现这样不好——万一装坏了,想回退很麻烦。所以我现在的做法是:

# 先打包成 deb/rpm
make deb  # Ubuntu/Debian
# 或者
make rpm  # CentOS/RHEL

# 然后安装生成的包
dpkg -i openvswitch-*.deb

这样做的好处是:卸载干净、版本管理方便。你想想看,生产环境里回滚操作多重要。

3.5 验证安装结果

装完了,怎么知道装没装对?别急,我一般按这个顺序检查:

  1. 检查二进制文件
which ovs-vswitchd
ovs-vswitchd --version

如果能看到版本号,说明主程序装好了。

  1. 检查内核模块
lsmod | grep openvswitch
# 或者
modinfo openvswitch

如果没加载,手动加载一下:

modprobe openvswitch
注意:如果 modprobe 报错,八成是内核版本不匹配。我遇到过 Ubuntu 20.04 内核升级后,之前编译的 ovs.ko 加载不了,得重新编译。
  1. 启动服务并测试
# 启动 ovsdb-server(需要先创建数据库目录)
mkdir -p /usr/local/var/run/openvswitch
ovsdb-tool create /usr/local/etc/openvswitch/conf.db \
  /usr/local/share/openvswitch/vswitch.ovsschema

# 启动 ovsdb-server
ovsdb-server --remote=punix:/usr/local/var/run/openvswitch/db.sock \
  --remote=db:Open_vSwitch,Open_vSwitch,manager_options \
  --pidfile --detach

# 启动 ovs-vswitchd
ovs-vswitchd --pidfile --detach

# 验证
ovs-vsctl show

如果 ovs-vsctl show 返回一个空的 bridge 列表(没有报错),恭喜你,安装成功了!

我的经验:第一次启动时,我建议用 --log-file 参数把日志输出到文件,方便排查问题。比如:

ovs-vswitchd --pidfile --detach --log-file=/var/log/ovs-vswitchd.log

这样出错了直接看日志,不用猜。

3.6 常见问题与解决

编译安装过程中,我遇到过不少坑。这里列几个典型的:

问题 原因 解决方法
configure 报错 "C compiler cannot create executables" gcc 没装或版本太老 apt install build-essential
make 报错 "fatal error: openssl/ssl.h: No such file or directory" 缺少 libssl-dev apt install libssl-dev
modprobe 报错 "Module openvswitch not found" 内核模块没编译或路径不对 检查 --with-linux 参数是否正确
ovs-vswitchd 启动后立即退出 数据库未初始化或权限问题 检查 /usr/local/var/run/openvswitch 目录是否存在

好了,源码编译安装这部分就讲到这里。说白了,就是三步走:下载、配置、编译安装。但每一步都有细节,我尽量把踩过的坑都告诉你了。下一章我们聊聊运行环境配置,到时候见。