4、OVS安装与部署:源码编译安装、包管理器安装(apt/yum)、OVS内核模块加载

好,咱们进入实战环节的第一关——把OVS装起来。

说实话,OVS的安装方式有好几种。我最早接触OVS时,图省事直接apt install了事。后来在生产环境踩了坑,才发现不同场景得选不同方式。今天我把三种主流方法都讲透,你根据自己情况选就行。

4.1 包管理器安装(apt/yum)—— 最快上手

如果你只是想快速体验,或者搭建测试环境,用包管理器装最省心。

Ubuntu/Debian 系(apt)

# 更新源
sudo apt update

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

# 验证安装
sudo ovs-vsctl show

CentOS/RHEL 系(yum)

# 安装依赖
sudo yum install -y epel-release

# 安装OVS
sudo yum install -y openvswitch

# 启动服务
sudo systemctl start openvswitch
sudo systemctl enable openvswitch
我的经验:apt装完直接就能用,yum装完记得手动启动服务。我曾在CentOS 7上忘了这一步,折腾了半小时才发现服务没起来。

包管理器安装的好处是依赖自动解决,升级也方便。但缺点也很明显——版本通常比较老。比如Ubuntu 20.04默认源里是2.13,而最新版已经到3.x了。如果你需要新特性,比如VXLAN的某些优化,就得考虑源码编译。

4.2 源码编译安装 —— 定制化最强

我个人习惯在生产环境用源码编译。虽然步骤多几步,但你能拿到最新特性,还能按需裁剪模块。

第一步:安装编译依赖

# Ubuntu
sudo apt install -y build-essential fakeroot debhelper \
                    autoconf automake libtool libssl-dev \
                    pkg-config python3 python3-sphinx

# CentOS
sudo yum install -y gcc make python3-devel openssl-devel \
                    kernel-devel graphviz autoconf automake \
                    libtool

第二步:下载源码

# 从官网下载
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

第三步:编译配置

# 生成configure文件
./boot.sh

# 配置编译选项
./configure --prefix=/usr --localstatedir=/var --sysconfdir=/etc

这里有个坑——--prefix参数决定了安装路径。我建议用/usr,这样二进制文件直接在PATH里,省得配环境变量。

第四步:编译与安装

# 编译(-j4表示4核并行,根据你CPU核心数调整)
make -j4

# 安装
sudo make install
注意:编译过程可能报错缺少依赖。我曾经在最小化安装的Ubuntu上编译,缺了十几个包,一个个补装很痛苦。建议先装好build-essential全家桶。

第五步:初始化配置

# 创建OVS数据库
sudo ovsdb-tool create /etc/openvswitch/conf.db \
    /usr/share/openvswitch/vswitch.ovsschema

# 启动OVSDB服务
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

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

OVS有两种数据路径:用户态和内核态。内核态性能更好,但需要加载内核模块。

检查当前状态

# 查看内核模块是否加载
lsmod | grep openvswitch

# 如果没输出,说明没加载

加载内核模块

# 加载模块
sudo modprobe openvswitch

# 验证
lsmod | grep openvswitch
# 应该看到类似输出:
# openvswitch            ext4     ...

开机自动加载

# 编辑配置文件
echo "openvswitch" | sudo tee /etc/modules-load.d/openvswitch.conf

为什么要加载内核模块?

说白了,内核模块让OVS的数据转发在内核空间完成,避免了用户态和内核态之间的上下文切换。我在测试中发现,加载内核模块后,小包转发性能能提升30%-50%。

常见问题排查

现象 原因 解决
modprobe报错 内核头文件未安装 安装对应内核版本的headers包
加载后ovs-vswitchd报错 内核模块版本不匹配 重新编译内核模块
性能没提升 数据包走了用户态路径 检查流表是否匹配到内核态转发
避坑指南:我曾经在升级内核后忘了重新编译OVS内核模块,结果ovs-vswitchd一直报"module version mismatch"。解决办法是重新执行make modules_install,然后重启。

4.4 三种方式怎么选?

我总结一下我的选择逻辑:

  • 学习测试:apt/yum装,5分钟搞定
  • 生产环境:源码编译,版本可控,性能可调
  • 性能敏感场景:必须加载内核模块,同时考虑DPDK(后面章节会讲)

嗯,到这里OVS就装好了。你可以用ovs-vsctl show看一眼,应该能看到一个空的OVS实例。下一章咱们开始创建第一个网桥和端口,真正玩起来。

验证安装是否成功:

# 查看版本
ovs-vsctl --version

# 查看运行状态
sudo ovs-vsctl show

# 如果输出类似:
# 5a4e3f7c-1b2d-4e8f-9a6b-3c2d1e0f8a7b
#     ovs_version: "3.1.0"
# 说明安装成功

最后提醒一句:无论用哪种方式装完,都建议重启一下系统,确保所有服务正常自启。我见过太多人装完就跑,结果重启后OVS没起来,排查半天才发现是systemd服务没配好。