第二章:环境搭建——源码编译安装OVS、内核模块加载、启动ovsdb-server与ovs-vswitchd、验证安装

好,咱们直接进入正题。环境搭建这事儿,说难不难,说简单也不简单。我见过太多人卡在这一步,不是缺依赖就是内核版本不匹配。说白了,OVS 是个跟内核深度绑定的东西,环境没搭好,后面排查问题就是空中楼阁。

我个人习惯,生产环境用包管理器安装,但学习阶段一定要走一遍源码编译。为什么?因为只有亲手编译过,你才知道 OVS 的组件是怎么拼起来的,出了问题才知道去哪翻日志、看代码。

2.1 准备工作:依赖安装与内核版本确认

先确认你的内核版本。OVS 对内核有要求,太老的内核可能不支持某些特性。我建议用 4.19 以上的内核,比较稳。

# 查看内核版本
uname -r

然后安装编译依赖。不同发行版命令不一样,我以 CentOS 7/8 和 Ubuntu 20.04 为例:

发行版 安装命令
CentOS/RHEL yum install -y gcc make python3-devel openssl-devel kernel-devel graphviz autoconf automake rpm-build redhat-rpm-config libtool
Ubuntu/Debian apt-get install -y build-essential fakeroot debhelper dh-python python3-all python3-sphinx libssl-dev graphviz autoconf automake libtool
注意:kernel-devel 的版本必须跟你当前运行的内核版本一致。我曾经遇到过 kernel-devel 装错了版本,编译内核模块时报了一堆 undefined symbol,折腾了半天才发现是版本没对上。

2.2 源码下载与编译

去 OVS 官网或者 GitHub 拉源码。我习惯用稳定版,比如 2.17 或者 3.0 系列。别追最新版,除非你想当小白鼠。

# 下载源码
wget https://www.openvswitch.org/releases/openvswitch-3.0.0.tar.gz
tar -xzf openvswitch-3.0.0.tar.gz
cd openvswitch-3.0.0

编译分两步:用户态工具和内核模块。先配置:

./configure --with-linux=/lib/modules/$(uname -r)/build
make -j$(nproc)

这里 --with-linux 指定内核源码路径,编译内核模块时会用到。如果没报错,继续:

make install
make modules_install
小技巧:编译时加 -j$(nproc) 能利用多核加速。我第一次编译时没加,单核跑了快20分钟,后来加了参数,5分钟搞定。

2.3 内核模块加载

编译完内核模块后,需要手动加载。先看看模块有没有装对位置:

ls /lib/modules/$(uname -r)/extra/openvswitch.ko

如果文件存在,加载它:

modprobe openvswitch
lsmod | grep openvswitch

看到输出里有 openvswitch 就说明加载成功了。如果报错,多半是内核版本不匹配或者依赖模块没加载。我遇到过一种情况:modprobe 提示 Unknown symbol,查了半天发现是 libcrc32c 模块没加载。先加载它就好了:

modprobe libcrc32c
modprobe openvswitch
避坑指南:我曾经在生产环境升级内核后忘了重新编译 OVS 内核模块,结果重启后网桥全挂了,流量全断。嗯,从那以后我每次升级内核都会重新编译一遍 OVS 模块。

2.4 启动 ovsdb-server 与 ovs-vswitchd

OVS 的架构里,ovsdb-server 负责存储配置,ovs-vswitchd 负责转发。必须先启动数据库,再启动交换机守护进程。

先创建数据库文件:

mkdir -p /usr/local/etc/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 的配置:

ovs-vsctl --no-wait init

最后启动 ovs-vswitchd:

ovs-vswitchd --pidfile --detach
提示:启动时加 --detach 会让进程后台运行。如果调试阶段,我建议不加这个参数,直接前台运行,日志直接打屏幕上,方便看错误。

2.5 验证安装

安装完别急着走,先验证一下。我最常用的三板斧:

  1. 检查进程:看看两个守护进程是否在跑
  2. 检查内核模块:确认 openvswitch 模块已加载
  3. 创建测试网桥:验证功能是否正常
# 检查进程
ps -ef | grep ovs

# 检查模块
lsmod | grep openvswitch

# 创建测试网桥
ovs-vsctl add-br test-br
ovs-vsctl show

如果 ovs-vsctl show 能正常输出,并且能看到 test-br 这个网桥,说明安装成功了。记得删掉测试网桥:

ovs-vsctl del-br test-br

你想想看,如果这一步都走不通,后面做 VLAN、隧道、QoS 什么的根本没法玩。所以环境搭建这块,宁可多花点时间,也别凑合。

2.6 常见问题与解决

问题 可能原因 解决方法
编译时报错 configure: error: Linux kernel in ... is not supported 内核版本太老或太新,OVS 不支持 换一个 OVS 版本,或者升级/降级内核
modprobe: FATAL: Module openvswitch not found 内核模块没安装到正确路径 检查 make modules_install 是否执行成功,或者手动复制 .ko 文件到 /lib/modules/$(uname -r)/extra/
ovsdb-server: error while loading shared libraries 动态库路径没更新 执行 ldconfig 刷新库缓存
ovs-vswitchd: cannot connect to ovsdb-server ovsdb-server 没启动,或者 socket 路径不对 检查 /usr/local/var/run/openvswitch/db.sock 是否存在,确认 ovsdb-server 已启动

嗯,环境搭建就这些。别嫌麻烦,这一步走扎实了,后面学起来会顺很多。下一章咱们开始玩真正的网络功能——创建网桥、添加端口、配置流表。