第二章:环境搭建——源码编译安装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 |
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
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 验证安装
安装完别急着走,先验证一下。我最常用的三板斧:
- 检查进程:看看两个守护进程是否在跑
- 检查内核模块:确认 openvswitch 模块已加载
- 创建测试网桥:验证功能是否正常
# 检查进程
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 已启动 |
嗯,环境搭建就这些。别嫌麻烦,这一步走扎实了,后面学起来会顺很多。下一章咱们开始玩真正的网络功能——创建网桥、添加端口、配置流表。