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(连接跟踪)卸载。
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
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
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-server和ovs-vswitchd。如果只有数据库没有vswitchd,说明数据面没起来,网络功能是瘫痪的。
3.6 常见问题与避坑指南
最后,分享几个我实际项目中遇到的坑:
- 内核模块加载失败:检查内核版本是否支持,或者是否缺少依赖。用
dmesg | tail看内核日志,通常能找到原因。 - ovs-vswitchd启动后立即退出:八成是数据库没初始化。执行
ovs-vsctl --no-wait init后再启动。 - 升级OVS后配置丢失:升级前记得备份
/etc/openvswitch/conf.db。这个文件里存着所有Bridge、Port、Flow的配置。 - 编译时提示缺少Python模块:安装
python3-sphinx或python3-six。有些文档生成工具是可选依赖,但编译脚本会检查。
好了,OVS的安装部署就讲到这里。下一章我们聊聊Bridge的创建与管理——说白了,就是怎么用OVS搭出一张虚拟交换机网络。