第三章 OVS安装与部署:源码编译安装、包管理器安装、OVS内核模块加载

好,咱们进入实操环节。说实话,安装OVS这件事,看着简单,但坑其实不少。我见过不少新手一上来就源码编译,结果折腾半天连个ovs-vsctl都跑不起来。也有老手图省事直接apt install,结果内核模块版本对不上,网络直接挂了。

这一章,我把三种安装方式都给你捋一遍。你根据自己的场景选就行。

3.1 包管理器安装(apt/yum)—— 最省心的方式

如果你只是想在测试环境快速搭一套Neutron网络,或者你的内核版本比较新,那我个人建议直接用包管理器。省时省力,而且依赖关系自动帮你搞定。

3.1.1 Ubuntu/Debian 系(apt)

# 更新源
sudo apt update

# 安装OVS相关包
sudo apt install -y openvswitch-switch openvswitch-common

# 验证安装
sudo ovs-vsctl --version

装完之后,你执行一下 ovs-vsctl show,如果能看到一个空的数据库信息,那就成了。嗯,这里要注意:Ubuntu 20.04 默认装的是 OVS 2.13,Ubuntu 22.04 是 2.17。版本不算新,但够用。

我的小技巧: 如果你需要特定版本,比如 OVS 2.15,可以加一个第三方 PPA。我在一次项目中就遇到过官方源版本太老,导致跟 Neutron 的某个特性不兼容,换了 PPA 源才搞定。

3.1.2 CentOS/RHEL 系(yum)

# 安装
sudo yum install -y openvswitch

# 启动服务
sudo systemctl start openvswitch
sudo systemctl enable openvswitch

# 检查状态
sudo systemctl status openvswitch

CentOS 7 默认的 OVS 版本是 2.11,CentOS 8 是 2.15。不过 CentOS 8 已经停止维护了,我建议你直接用 Rocky Linux 或者 AlmaLinux。

注意: 我曾经在 CentOS 7 上直接用 yum 装 OVS,结果发现内核模块没加载成功。原因是内核版本太老,跟 OVS 模块不兼容。解决办法是升级内核,或者用 DKMS 方式重新编译模块。

3.2 源码编译安装 —— 掌控一切

什么时候需要源码编译?说白了,就是你需要最新特性,或者你的内核版本太特殊,包管理器里的二进制包跑不起来。我个人的生产环境,大部分时候还是用源码编译,因为可以定制编译参数。

3.2.1 下载源码

# 从官网下载
wget https://www.openvswitch.org/releases/openvswitch-3.1.0.tar.gz

# 解压
tar -xzf openvswitch-3.1.0.tar.gz
cd openvswitch-3.1.0

你也可以直接从 GitHub 拉取最新代码,不过我个人习惯用稳定版,毕竟生产环境求稳。

3.2.2 安装依赖

# Ubuntu
sudo apt install -y build-essential libssl-dev libcap-ng-dev \
  python3 python3-pip python3-sphinx

# CentOS
sudo yum install -y gcc make openssl-devel libcap-ng-devel \
  python3 python3-pip python3-sphinx

这里有个坑:如果你漏了 libcap-ng-dev,编译时不会报错,但运行时会提示权限问题。我踩过这个坑,排查了半天才发现。

3.2.3 配置与编译

# 配置
./configure --prefix=/usr --localstatedir=/var --sysconfdir=/etc

# 编译(用-j参数加速)
make -j$(nproc)

# 安装
sudo make install

你想想看,--prefix=/usr 这个参数是什么意思?就是把 OVS 的可执行文件装到 /usr/bin 下,这样全局都能调用。如果不指定,默认装到 /usr/local,有时候 PATH 环境变量没配好,就会找不到命令。

3.2.4 初始化数据库

# 创建数据库目录
sudo mkdir -p /var/lib/openvswitch

# 初始化
sudo ovsdb-tool create /var/lib/openvswitch/conf.db \
  /usr/share/openvswitch/vswitch.ovsschema

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

# 启动 vswitchd
sudo ovs-vswitchd --pidfile --detach
核心要点: 源码编译安装后,OVS 不会自动启动。你需要手动初始化数据库,然后启动两个守护进程:ovsdb-server 和 ovs-vswitchd。顺序不能乱,先有数据库,再有交换机。

3.3 OVS内核模块加载 —— 性能的关键

OVS 有两种数据路径:用户态(慢路径)和内核态(快路径)。说白了,内核模块就是那个快路径,负责处理大部分数据包转发。没有它,所有流量都走用户态,性能会差很多。

3.3.1 检查内核模块状态

# 查看是否已加载
lsmod | grep openvswitch

# 查看模块信息
modinfo openvswitch

如果 lsmod 没有输出,说明模块没加载。为什么会这样?可能是你没装内核模块,也可能是模块版本跟内核不匹配。

3.3.2 加载内核模块

# 手动加载
sudo modprobe openvswitch

# 设置开机自动加载
echo "openvswitch" | sudo tee /etc/modules-load.d/openvswitch.conf

这里有个细节:如果你是用包管理器安装的,内核模块通常已经自动装好了。但如果是源码编译,你需要单独编译和安装内核模块。

3.3.3 源码编译内核模块

# 进入源码目录
cd openvswitch-3.1.0

# 编译内核模块
make modules

# 安装内核模块
sudo make modules_install

# 加载
sudo modprobe openvswitch
我曾经踩过的坑: 有一次我编译内核模块时,忘了安装内核头文件。结果 make modules 报了一堆错,说找不到 linux/kconfig.h。解决办法很简单:sudo apt install linux-headers-$(uname -r)。记住,内核模块必须跟当前运行的内核版本完全匹配。

3.3.4 验证内核模块是否生效

# 查看内核模块
lsmod | grep openvswitch

# 查看 OVS 版本(包括内核模块版本)
ovs-vsctl --version

# 测试数据路径
ovs-appctl dpctl/show

如果 ovs-appctl dpctl/show 能正常输出,说明内核模块已经加载成功,并且 OVS 正在使用内核态数据路径。

3.4 三种安装方式对比

安装方式 优点 缺点 适用场景
包管理器(apt/yum) 简单快速,依赖自动解决 版本可能较旧,定制性差 测试环境、快速部署
源码编译 版本最新,可定制编译参数 步骤多,依赖手动处理 生产环境、需要特定版本
内核模块加载 性能最优,支持内核态转发 需要匹配内核版本 高性能场景、生产环境

3.5 我的建议

如果你是初学者,先用包管理器装一遍,感受一下 OVS 的基本操作。等你熟悉了,再尝试源码编译,理解整个安装流程。至于内核模块,只要你的环境不是太老,包管理器装完一般会自动加载。

嗯,最后提醒一句:不管用哪种方式,装完之后一定要做一次连通性测试。创建一个 bridge,加一个端口,看看能不能 ping 通。别等到 Neutron 都配好了,才发现 OVS 根本没跑起来。

避坑指南: 我曾经在生产环境上直接用 apt upgrade 升级了内核,结果 OVS 内核模块没跟着升级,导致所有虚拟机网络中断。从那以后,我每次升级内核前都会先检查 OVS 模块的兼容性,或者干脆用 DKMS 自动重建模块。