第三章:源码编译安装——从源码到可执行文件的完整旅程
说实话,很多朋友觉得源码编译安装很麻烦,总想找现成的二进制包。但我个人一直坚持:想真正理解 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
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 |
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 验证安装结果
装完了,怎么知道装没装对?别急,我一般按这个顺序检查:
- 检查二进制文件
which ovs-vswitchd
ovs-vswitchd --version
如果能看到版本号,说明主程序装好了。
- 检查内核模块
lsmod | grep openvswitch
# 或者
modinfo openvswitch
如果没加载,手动加载一下:
modprobe openvswitch
modprobe 报错,八成是内核版本不匹配。我遇到过 Ubuntu 20.04 内核升级后,之前编译的 ovs.ko 加载不了,得重新编译。
- 启动服务并测试
# 启动 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 目录是否存在 |
好了,源码编译安装这部分就讲到这里。说白了,就是三步走:下载、配置、编译安装。但每一步都有细节,我尽量把踩过的坑都告诉你了。下一章我们聊聊运行环境配置,到时候见。