第三章 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。版本不算新,但够用。
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。
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
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
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 根本没跑起来。