3. OVS安装与部署:源码编译、包管理器安装、Docker部署

好,咱们进入实战环节。安装OVS,说白了就是给你的网络环境装上一把“瑞士军刀”。但怎么装,这里头门道不少。我个人习惯是,先搞清楚你要在什么场景下用,再选安装方式。别一上来就源码编译,那玩意儿费时费力,有时候还不一定适合你。

今天咱们聊三种主流方式:源码编译包管理器安装Docker部署。每种都有它的脾气,咱们一个一个捋。

3.1 源码编译安装:最灵活,也最折腾

为什么要源码编译?说白了,就是你要定制。比如你想打个补丁,或者想用最新的开发版特性,那包管理器里的版本肯定满足不了你。我在项目里遇到过,客户非要一个还没正式发布的bugfix,那没办法,只能源码编译。

嗯,这里要注意,源码编译对系统环境有要求。你想想看,编译工具链、依赖库,一个都不能少。我刚开始搞的时候,经常因为缺个库卡半天。

3.1.1 环境准备

先装基础工具。以Ubuntu为例,我建议你直接跑下面这条命令,省心:

sudo apt-get update
sudo apt-get install -y build-essential fakeroot debhelper \
                        autoconf automake bison flex libssl-dev \
                        libtool pkg-config python3 python3-pip

这里头,build-essential是编译必备,libssl-dev是OpenFlow安全连接用的。缺了它,你后面配SSL连接时会报错。我曾经就因为这个折腾了一下午,后来发现是依赖没装全。

3.1.2 下载与编译

去OVS官网或者GitHub拉源码。我个人习惯用GitHub,版本更新快:

git clone https://github.com/openvswitch/ovs.git
cd ovs
git checkout v2.17.0  # 选一个稳定版本

然后就是经典的“三件套”:

./boot.sh
./configure --prefix=/usr --localstatedir=/var --sysconfdir=/etc
make -j$(nproc)
sudo make install

这里有个坑:--prefix参数决定了OVS装到哪。如果你不指定,默认是/usr/local。但很多系统脚本默认去/usr找,所以建议像我这样指定一下,省得后面路径对不上。

避坑指南:我曾经在CentOS上编译,忘了装python3-sphinx,结果make到一半报文档生成错误。如果你不需要文档,可以加--disable-ssl跳过,但我不建议这么做——生产环境SSL几乎是必须的。

3.1.3 初始化与启动

编译完别急着用,先初始化数据库:

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

检查一下是否跑起来了:

sudo ovs-vsctl show

如果看到类似a4b6c7d8-... (ovn)的输出,恭喜你,成了。

3.2 包管理器安装:省心省力,适合快速上手

说实话,如果你只是学习或者做实验,包管理器安装是最省心的。你想想看,一条命令搞定所有依赖,多爽。

3.2.1 Ubuntu/Debian系

sudo apt-get install openvswitch-switch openvswitch-common

装完直接就能用:

sudo systemctl start openvswitch-switch
sudo systemctl enable openvswitch-switch

嗯,这里要注意,包管理器安装的版本通常比源码落后几个小版本。比如现在源码已经到2.17了,apt里可能还是2.15。但稳定性没问题,毕竟经过了发行版测试。

3.2.2 CentOS/RHEL系

sudo yum install -y openvswitch
sudo systemctl start openvswitch
sudo systemctl enable openvswitch

CentOS的包名简单,就叫openvswitch。但有个坑:默认的EPEL源里可能没有最新版。我建议你加一下RDO仓库:

sudo yum install -y centos-release-openstack-train
sudo yum install -y openvswitch
小技巧:装完后用ovs-vsctl --version看看版本号。如果版本太老,比如低于2.13,建议还是用源码编译。因为有些新特性(比如CT流表)在老版本里不支持。

3.3 Docker部署:隔离性好,适合微服务场景

现在Docker这么火,OVS当然也能容器化。我个人觉得,Docker部署最大的好处是干净——不会污染你的宿主机环境。我在做CI/CD流水线时,就喜欢用Docker跑OVS,用完就删,省心。

3.3.1 拉取镜像

官方镜像在Docker Hub上:

docker pull openvswitch/ovs:latest

或者指定版本:

docker pull openvswitch/ovs:2.17.0

3.3.2 启动容器

启动方式有点讲究。因为OVS需要操作内核模块,所以得给容器一些特权:

docker run -d --name ovs \
    --privileged \
    --network host \
    -v /var/run/openvswitch:/var/run/openvswitch \
    openvswitch/ovs:latest

这里几个参数解释一下:

  • --privileged:给容器操作内核的权限,不然OVS加载不了内核模块
  • --network host:使用宿主机网络,这样OVS能直接管理物理网卡
  • -v:挂载socket目录,方便宿主机上的其他工具(比如ovs-vsctl)与容器内的OVS通信
注意:如果你是在Mac或Windows上用Docker Desktop,--privileged可能不管用。因为Docker Desktop底层是虚拟机,不支持直接操作宿主机内核。这时候我建议你改用包管理器安装,或者用虚拟机跑Linux。

3.3.3 验证容器内的OVS

进入容器看看:

docker exec -it ovs bash
ovs-vsctl show

如果一切正常,你会看到空的OVS数据库。然后你就可以在容器里创建网桥、配置流表了。

不过要注意,容器重启后,你配置的流表会丢失。所以生产环境建议把配置持久化,或者写个启动脚本。

3.4 三种方式对比

最后,我整理了个表格,方便你根据场景选择:

安装方式 优点 缺点 适用场景
源码编译 版本最新、可定制、可打补丁 编译耗时、依赖多、升级麻烦 开发调试、特性验证、生产环境定制
包管理器 安装简单、依赖自动解决、升级方便 版本滞后、无法定制 学习实验、快速部署、生产环境标准版
Docker部署 环境隔离、部署快速、易于清理 需要特权模式、性能有损耗、配置不持久 CI/CD测试、微服务环境、临时实验

我个人建议:如果你是初学者,先用包管理器装一个,跑通基本功能。等熟悉了,再尝试源码编译,体验一下定制化的乐趣。至于Docker,适合你已经有了一定基础,想在隔离环境里做测试的时候用。

好了,这一章就到这。下一章咱们聊聊OVS的基本配置,包括创建网桥、添加端口、配置VLAN这些实战操作。到时候我会拿一个真实的网络拓扑来演示,保证你学完就能上手。