3、OVS安装与部署:在Ubuntu/CentOS上安装OVS、源码编译安装、验证安装是否成功、启动与停止OVS服务

好,咱们进入实操环节。这一章我带你亲手把OVS装起来。你可能会想:「装个软件而已,apt install不就完事了?」嗯,OVS确实可以这么装,但生产环境里,我建议你掌握源码编译安装。为什么?因为有些内核模块的版本、补丁、性能调优选项,包管理器给不了你。

我在项目里遇到过好几次,用apt装的OVS版本太老,跟内核不兼容,结果数据面跑起来疯狂丢包。从那以后,我养成了「先看内核版本,再选OVS版本」的习惯。

3.1 环境准备:先看看你的底子

不管用哪种方式装,第一步都是检查操作系统和内核。你想想看,OVS本质上是个内核模块加用户态进程,内核版本不对,后面全是坑。

# 查看系统版本
cat /etc/os-release

# 查看内核版本
uname -r

# 查看是否已有OVS
ovs-vsctl --version 2>/dev/null || echo "OVS未安装"

我个人习惯用Ubuntu 20.04/22.04 LTS或CentOS 7/8做实验。内核建议4.19以上,太老的内核有些特性不支持,比如CT(连接跟踪)卸载。

我的建议:如果你刚入门,先用Ubuntu 22.04 + OVS 3.0以上版本。这个组合最稳,社区支持也最好。

3.2 方式一:apt/yum包管理器安装(快速上手)

这是最快的方式,适合测试环境。说白了就是一行命令的事。

Ubuntu/Debian系

# 更新源
sudo apt update

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

# 验证安装
dpkg -l | grep openvswitch

装完你会发现,openvswitch-switch包含了ovs-vswitchd和ovsdb-server,openvswitch-common提供了ovs-vsctl等命令行工具。

CentOS/RHEL系

# 安装EPEL源(CentOS 7需要)
sudo yum install -y epel-release

# 安装OVS
sudo yum install -y openvswitch

# 验证
rpm -qa | grep openvswitch
注意:CentOS 7默认源里的OVS版本可能比较老(比如2.10)。如果你需要新特性,建议用源码编译或添加第三方源。

3.3 方式二:源码编译安装(生产环境首选)

这才是重头戏。我在生产环境里从来不用包管理器装OVS,因为我要控制编译选项,比如开启DPDK支持、关闭某些调试日志、打上特定补丁。

源码编译分三步:下载、配置、编译安装。咱们一步步来。

3.3.1 安装依赖

# Ubuntu
sudo apt install -y build-essential autoconf automake libtool \
    pkg-config python3 python3-sphinx libssl-dev libcap-ng-dev \
    libnuma-dev

# CentOS
sudo yum install -y gcc make autoconf automake libtool \
    python3 python3-sphinx openssl-devel libcap-ng-devel \
    numactl-devel

嗯,这里要注意:如果你要编译DPDK版本,还得装DPDK开发库。这个我们后面单独讲。

3.3.2 下载源码

# 从官网下载(推荐)
wget https://www.openvswitch.org/releases/openvswitch-3.2.0.tar.gz

# 或者从GitHub拉取最新代码
git clone https://github.com/openvswitch/ovs.git
cd ovs

我个人习惯用稳定版,比如3.2.0或3.1.0。GitHub上的master分支虽然新,但可能不稳定,不适合生产。

3.3.3 配置与编译

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

# 生成configure脚本
./boot.sh

# 配置(这里可以加很多选项)
./configure --prefix=/usr --localstatedir=/var --sysconfdir=/etc

# 编译(-j后面跟CPU核心数,加快速度)
make -j$(nproc)

# 安装
sudo make install

你可能会问:「为什么指定--prefix=/usr?」因为这样二进制文件会装到/usr/bin,不用额外配PATH。如果装到/usr/local,后面启动服务时容易找不到命令。

关键配置选项:
  • --with-dpdk:开启DPDK加速
  • --enable-ssl:开启SSL支持(远程管理用)
  • --enable-shared:编译成动态库
  • --with-linux=/lib/modules/$(uname -r)/build:编译内核模块

3.3.4 加载内核模块

OVS的数据面依赖内核模块。编译安装后,需要手动加载:

# 加载OVS内核模块
sudo modprobe openvswitch

# 确认加载成功
lsmod | grep openvswitch

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

我曾经踩过一个坑:编译时忘了加--with-linux,结果内核模块没编译出来,ovs-vswitchd启动时报错「openvswitch_mod: Unknown symbol」。嗯,从那以后我每次编译都会检查内核模块是否生成。

3.4 验证安装是否成功

装完了,怎么知道它能不能用?别急,我有一套标准验证流程。

3.4.1 检查版本

# 查看OVS版本
ovs-vswitchd --version
ovsdb-server --version
ovs-vsctl --version

输出应该类似:

ovs-vswitchd (Open vSwitch) 3.2.0
ovsdb-server (Open vSwitch) 3.2.0
ovs-vsctl (Open vSwitch) 3.2.0

3.4.2 检查内核模块

# 查看内核模块信息
modinfo openvswitch

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

3.4.3 创建测试Bridge

这是最直观的验证方式:

# 创建一个测试Bridge
sudo ovs-vsctl add-br test-br

# 查看Bridge列表
sudo ovs-vsctl show

# 删除测试Bridge
sudo ovs-vsctl del-br test-br

如果ovs-vsctl show能正常返回,说明OVS的核心组件都在正常工作。

小技巧:你可以用ovs-appctl查看OVS内部状态,比如ovs-appctl dpctl/show查看数据路径信息。这个命令在排查性能问题时特别有用。

3.5 启动与停止OVS服务

OVS有两个核心服务:ovsdb-server(配置数据库)和ovs-vswitchd(数据面守护进程)。启动顺序有讲究:先启动数据库,再启动交换机。

3.5.1 使用systemd管理(推荐)

# 启动OVS服务
sudo systemctl start openvswitch-switch

# 设置开机自启
sudo systemctl enable openvswitch-switch

# 查看服务状态
sudo systemctl status openvswitch-switch

# 停止服务
sudo systemctl stop openvswitch-switch

# 重启服务
sudo systemctl restart openvswitch-switch

在Ubuntu上,服务名是openvswitch-switch;在CentOS上,可能是openvswitch。你可以用systemctl list-units | grep ovs确认。

3.5.2 手动启动(调试用)

有时候systemd起不来,或者你想看详细日志,可以手动启动:

# 第一步:启动数据库服务
sudo ovsdb-server /etc/openvswitch/conf.db \
    --remote=punix:/var/run/openvswitch/db.sock \
    --pidfile --detach

# 第二步:初始化数据库(首次启动需要)
sudo ovs-vsctl --no-wait init

# 第三步:启动vswitchd
sudo ovs-vswitchd --pidfile --detach

# 停止时,先停vswitchd,再停数据库
sudo killall ovs-vswitchd
sudo killall ovsdb-server
重要:手动启动时,一定要先启动ovsdb-server,再启动ovs-vswitchd。顺序反了,vswitchd连不上数据库,会直接退出。我刚开始学OVS时就犯过这个错,查了半天日志才发现。

3.5.3 检查服务是否正常运行

# 查看进程
ps aux | grep ovs

# 查看监听端口(ovsdb-server默认监听6640)
sudo netstat -tlnp | grep 6640

# 查看日志
sudo journalctl -u openvswitch-switch -n 50

# 或者直接看日志文件
tail -f /var/log/openvswitch/ovs-vswitchd.log

正常运行时,你应该看到两个进程:ovsdb-serverovs-vswitchd。如果只有数据库没有vswitchd,说明数据面没起来,网络功能是瘫痪的。

3.6 常见问题与避坑指南

最后,分享几个我实际项目中遇到的坑:

  • 内核模块加载失败:检查内核版本是否支持,或者是否缺少依赖。用dmesg | tail看内核日志,通常能找到原因。
  • ovs-vswitchd启动后立即退出:八成是数据库没初始化。执行ovs-vsctl --no-wait init后再启动。
  • 升级OVS后配置丢失:升级前记得备份/etc/openvswitch/conf.db。这个文件里存着所有Bridge、Port、Flow的配置。
  • 编译时提示缺少Python模块:安装python3-sphinxpython3-six。有些文档生成工具是可选依赖,但编译脚本会检查。

好了,OVS的安装部署就讲到这里。下一章我们聊聊Bridge的创建与管理——说白了,就是怎么用OVS搭出一张虚拟交换机网络。