新闻详情

新闻详情

首页 / 资讯中心 / 详情

Open vSwitch源码编译安装全流程:内核模块与OVSDB初始化实战

发布时间:2026/11/11 21:36:50来源:尧图网络
Open vSwitch源码编译安装全流程:内核模块与OVSDB初始化实战
搞网络虚拟化的同行应该都清楚Open vSwitch以下简称OVS这套开源虚拟交换机方案在整个云计算和容器网络里的地位有多重。不管是OpenStack的Neutron还是KVM虚拟机的桥接网络甚至一些SDN控制器的数据面都离不开它。编译安装这件事看起来只是“跑几条命令”但实际踩坑的地方相当多尤其是内核模块、数据库初始化和版本兼容性这三块。这篇文章我从自己实际动手的经历出发把OVS编译安装的完整流程、内核模块处理、数据库初始化、网桥配置以及两个实际使用案例和踩坑记录都梳理了一遍。不管是刚接触OVS的新手还是已经用OVS但想升级版本、或者需要定制编译参数的同行应该都能从中找到能直接用的东西。先说好了示例环境以Ubuntu 20.04为主CentOS/RHEL系列的差异我会单独标注别到时候命令跑不通又回来骂我。1. 为什么要从源码编译OVS而不是直接装软件包1.1 OVS的核心组成和工作原理在聊编译之前先把OVS到底是什么拆开看一眼。OVS是一套完整的虚拟交换机实现内核态负责数据面快速转发用户态负责控制面管理。它的核心组件包括ovs-vswitchd用户态守护进程负责转发逻辑、OpenFlow协议处理、流表管理是整个OVS的大脑。ovsdb-server轻量级数据库服务保存网桥、端口、VLAN等配置信息。OVS的配置不是像传统交换机那样写在conf文件里而是存在OVSDB里这一点和很多传统网络设备的习惯差异很大。ovs-vsctl管理命令行工具用来增删查改网桥、端口、隧道等对象是日常使用最频繁的命令。ovs-ofctl专门操作OpenFlow流表的工具调试SDN场景时基本离不开它。ovs-appctl和ovs-vswitchd进程通信的调试工具用于查看运行状态、日志级别调整等。内核模块openvswitch.ko负责快速路径转发。用户态下发流表后命中流表的数据包直接在内核态转发不经过用户态性能才能上来。知道这些组件之后你就能理解为什么编译安装OVS不能只编译一个可执行文件就完事而是要把内核模块、用户态程序、数据库schema、脚本工具链全部配套装好。任何一环版本对不上都会出幺蛾子。1.2 发行版自带软件包的局限各大Linux发行版确实都提供了OVS的软件包Ubuntu下执行apt install openvswitch-switchCentOS下执行yum install openvswitch装完就能用省心得很。但问题也恰恰藏在这“省心”里。第一版本滞后。Ubuntu 20.04自带的OVS是2.13.0Ubuntu 22.04带的是2.17.x而社区早已发布了2.18.x甚至3.x的开发版本。如果你需要新版本里的特性比如新增的隧道协议、更完善的DPDK支持只能自己编译。第二编译选项被锁死。发行版打包时用的是官方默认配置不会给你开DPDK、netdev、afxdp这类需要特殊依赖的加速路径。你想在用户态跑DPDK数据面自带的包基本做不到。第三内核模块版本和用户态版本容易错位。很多场景下发行版的openvswitch内核模块和用户态程序版本不一致结果就是ovs-vswitchd起来之后流表下发异常数据面完全不转发排查半天才发现是版本不匹配。第四离线环境和内网场景。企业生产环境经常是物理隔离的网络内网没有软件源不能用apt或yum在线安装。这时候手里有一份官方源码包本地编译本地装反而是最可靠的路径。1.3 什么情况下反而不建议自己编译说句实在话并不是所有场景都适合从源码编译。如果只是搭个测试环境或者只在两三台机器上做简单的虚拟机桥接直接用发行版的包省下的时间拿去多跑几个实验性价比更高。生产环境如果没有特殊需求也建议优先使用厂商长期维护的版本。自己编译意味着后续的安全补丁、小版本升级都要自己维护这个运维成本得算清楚。我见过不少团队一开始图新鲜全部源码编译到后来升级内核发现openvswitch.ko编译不过去整得焦头烂额。所以编译前先回答自己三个问题我需要新特性吗我需要特殊编译选项吗我能长期维护这个自建版本吗三个答案里只要有一个“是”源码编译就是合理的选择。2. 编译前的环境准备和依赖梳理2.1 工具链和依赖包清单OVS本质上是C语言项目编译它需要完整的GNU工具链。除此之外因为它要跟内核模块交互还需要内核头文件。最稳妥的方式是先更新软件包索引然后一次性把工具链和依赖装齐。Ubuntu/Debian系统下我常用的命令组合是sudo apt update sudo apt install -y build-essential flex bison automake autoconf libtool \ pkg-config python3 python3-pip python3-sphinx python3-dev \ libssl-dev libcap-ng-dev libunbound-dev libjemalloc-dev \ linux-headers-$(uname -r)CentOS/RHEL 7/8下的对应命令是sudo yum install -y gcc make automake autoconf libtool flex bison \ python3 python3-devel openssl-devel libcap-ng-devel \ libunbound-devel jemalloc-devel kernel-develCentOS上装完kernel-devel之后确认头文件路径存在即可ls /usr/src/kernels/$(uname -r)这里逐个解释一下每个依赖的作用。flex和bison是生成语法解析器用的OVS没有把它们随源码打包而是编译时现场生成缺失的话会在make阶段报错。libssl-dev是OpenSSL的开发库OVS的SSL连接和证书管理功能需要它configure阶段会检查找不到会直接中断。python3-sphinx是用来生成文档的如果只想编译安装不想要文档可以临时用--disable-sphinx参数绕过去。linux-headers是编译内核模块的必需品没有对应的头文件openvswitch.ko就别想编出来。2.2 源码获取和版本选择OVS官方源码可以从两个渠道获取一是官网下载正式发布的tarball压缩包二是从Git仓库clone最新的开发代码。我个人的建议非常明确在生产或准生产环境用正式tarball不要用Git仓库的master分支。开发代码可能引入新的bug也可能依赖更新的内核特性稳定性没保障。以2.17.0版本为例下载命令是wget https://www.openvswitch.org/releases/openvswitch-2.17.0.tar.gz tar -xzf openvswitch-2.17.0.tar.gz cd openvswitch-2.17.0从Git获取开发版的方式也不难但心情要准备好git clone https://github.com/openvswitch/ovs.git cd ovs无论是tarball还是Git仓库进入目录后先看一看README.rst和INSTALL.rst这两个文件。INSTALL.rst里写明了不同编译路径的说明包括普通编译、DPDK编译、带内核模块编译等。很多人拿到源码就急着跑./configure结果发现参数不知道填啥其实文档里都有。2.3 编译方式选型不带内核模块还是带内核模块编译OVS之前先想清楚一个关键问题内核模块怎么处理。这里有两条路一是编自己的内核模块加载OVS自带的openvswitch.ko二是完全依赖内核自带的openvswitch模块只编译用户态工具。从Linux 4.3开始openvswitch内核模块已经合并到内核主线里了很多现代发行版默认就启用了它。如果内核版本比较新完全可以用内核自带的模块只编译用户态组件这样可以大幅减少编译工作量。判断方法是看模块是否存在modprobe openvswitch lsmod | grep openvswitch如果模块能正常加载就说明当前内核已经支持。这种情况下编译OVS时可以考虑不编内核模块安装后直接使用系统内核模块。不过有个问题要注意内核自带模块的版本和用户态版本可能不完全一致某些新特性会提示不支持。如果对功能完整性要求高还是建议连内核模块一起编译毕竟OVS官方源码里的模块版本一定是配套的。我自己在Ubuntu 20.04上试过内核自带模块和2.17.0用户态一起用基本的网桥、VLAN、隧道功能都没问题但用到一些比较新的conntrack相关特性时偶尔会出现流表下发报错的情况。后来改回编译自带内核模块问题就消失了。3. OVS完整编译安装实操全流程3.1 configure配置和参数选择确认依赖都装好之后进入源码目录执行configure脚本。configure脚本会检查系统环境、生成Makefile是整个编译流程的起点。如果是从Git仓库clone的代码需要先执行boot.sh生成configure脚本./boot.sh如果是官方tarballconfigure已经存在直接执行就行。我常用的配置命令是./configure --prefix/usr --localstatedir/var --sysconfdir/etc \ --with-linux/lib/modules/$(uname -r)/build这里逐个解释参数的含义。--prefix/usr指定安装路径把可执行文件装到/usr/sbin和/usr/bin下和发行版的默认路径保持一致方便后续命令直接调用。如果不指定prefix默认是/usr/local那样的话ovs-vsctl这类命令会装到/usr/local/bin下不在默认的PATH里每次用还得写全路径麻烦得很。--localstatedir/var把运行时的状态数据放到/var下OVS的socket文件和PID文件默认在这里方便systemd管理。--sysconfdir/etc把配置文件放在/etc下。--with-linux参数指定内核源码树路径作用就是告诉编译系统去哪里找内核头文件来编openvswitch.ko模块。如果不需要编译内核模块就去掉--with-linux参数。如果明确知道系统的内核版本和运行版本不一致可以手动指定正确路径。DPDK支持是后来才加的需要单独下载DPDK源码并编译安装然后加--with-dpdkstatic或--with-dpdkshared参数这个涉及额外比较复杂的环境准备后面可以单独开一篇这里不展开。configure执行成功后系统会给出一个概要信息显示启用了哪些功能哪些功能因为依赖缺失被禁用。这个输出值得仔细看一眼特别是SSL、DPDK、sflow这些特性如果实际需要却发现被禁用了就说明依赖还没装全。3.2 编译和安装过程配置完成后就是常规的编译安装make -j$(nproc) sudo make install-j$(nproc)参数让make用CPU核数个并行任务编译能显著缩短编译时间。我手上一台8核的机器全量编译大概3分钟单核跑的话可能要15分钟以上差距还是很明显的。编译过程中如果出现error常见的有两类一类是缺头文件比如fatal error: openssl/ssl.h: No such file or directory说明libssl-dev没装另一类是语法错误多半是gcc版本太老不支持代码里用到的新特性。解决办法后面统一说。make install把文件安装到系统目录默认权限下需要root权限。安装完成后检查一下关键文件是否就位ls -l /usr/sbin/ovs-vswitchd /usr/sbin/ovsdb-server /usr/bin/ovs-vsctl ls -l /usr/lib/modules/$(uname -r)/extra/openvswitch/openvswitch.ko如果openvswitch.ko出现在extra目录下说明内核模块编译安装成功。3.3 内核模块加载验证安装完内核模块后第一步是加载它。如果之前已经加载过系统自带的openvswitch模块先得卸载掉否则会出现新旧模块冲突sudo modprobe -r openvswitch sudo modprobe openvswitch lsmod | grep openvswitch加载成功后lsmod输出里应该能看到openvswitch模块。如果modprobe报错Module openvswitch not found检查一下depmod是否已经刷新模块依赖关系sudo depmod -a sudo modprobe openvswitchdepmod是生成模块依赖关系的工具新模块安装后需要刷新才能被modprobe找到。3.4 数据库初始化和服务启动OVS启动之前必须先初始化OVSDB数据库。这一步没做或者做错后面ovs-vswitchd起不来ovs-vsctl也会报错。不同版本的初始化命令有差异2.12及之前版本和2.13之后版本的数据库schema路径不同。先创建数据库目录sudo mkdir -p /etc/openvswitch sudo ovsdb-tool create /etc/openvswitch/conf.db \ /usr/share/openvswitch/vswitch.ovsschema注意vswitch.ovsschema路径有的版本在/usr/share/openvswitch/下有的在源码目录的vswitchd/下找不到就全局搜一下。2.17.0版本安装后我这边路径是/usr/share/openvswitch/vswitch.ovsschema。数据库创建完成后启动ovsdb-serversudo ovsdb-server --remotepunix:/var/run/openvswitch/db.sock \ --remotedb:Open_vSwitch,Open_vSwitch,manager_options \ --pidfile --detach--remotepunix指定Unix socket路径ovs-vswitchd和ovs-vsctl都通过这个socket和数据库通信。--detach表示后台运行。需要先创建/var/run/openvswitch目录否则socket文件写不进去sudo mkdir -p /var/run/openvswitchovsdb-server起来之后第一次启动ovs-vswitchd前需要初始化一些默认配置sudo ovs-vsctl --no-wait init sudo ovs-vswitchd --pidfile --detach--no-wait参数的意思是init命令不需要等待ovs-vswitchd完全启动完成再返回因为此时ovs-vswitchd还没起来。init操作会在数据库里写入Open_vSwitch表的初始记录没有这一步ovs-vswitchd会不知道该从哪里读取配置。启动后分别检查两个进程是否在运行ps -ef | grep ovs ovs-vsctl showovs-vsctl show如果不报错并输出一个空的配置信息就说明整个编译安装链路已经通了。3.5 配置systemd服务让其开机自启手动起服务只适合临时测试生产环境肯定要配置成systemd服务开机自动拉起来。OVS源码包里带了systemd的unit文件在源码目录的rhel/目录下叫ovsdb-server.service和ovs-vswitchd.service还有对应的启动脚本。我习惯直接用这些官方文件把它拷贝到系统目录下sudo cp rhel/ovsdb-server.service /etc/systemd/system/ sudo cp rhel/ovs-vswitchd.service /etc/systemd/system/ sudo systemctl daemon-reload sudo systemctl enable ovsdb-server.service sudo systemctl enable ovs-vswitchd.service sudo systemctl start ovsdb-server.service sudo systemctl start ovs-vswitchd.service注意源码里rhel目录下可能还有ovs-vswitchd.service的预启动脚本路径配置需要检查一下unit文件里ExecStart和ExecStartPre指向的路径是否正确。如果路径不对编辑unit文件改掉就行。还有一点如果之前已经手动用命令方式启动了ovsdb-server和ovs-vswitchd再用systemctl启动会出现端口和PID文件冲突所以先用kill命令把旧进程杀干净sudo pkill ovsdb-server sudo pkill ovs-vswitchd sudo systemctl start ovsdb-server.service sudo systemctl start ovs-vswitchd.service4. 进入结构化配置网桥、端口、VLAN一个都不能少4.1 网桥创建和删除OVS启动之后第一步通常是创建一个虚拟网桥。网桥在OVS里的角色相当于传统交换机里的“交换机实例”所有的端口都必须归属于一个网桥。最常用的命令是sudo ovs-vsctl add-br br0 sudo ovs-vsctl list-brlist-br输出可以看到当前系统里所有网桥名称。删除网桥用del-brsudo ovs-vsctl del-br br0详细查看网桥配置信息sudo ovs-vsctl showshow命令会输出网桥、端口、接口、VLAN、状态等全部信息是日常排障的第一道工具。看具体某个网桥的所有属性可以用sudo ovs-vsctl list Bridge br04.2 端口添加和常见类型网桥本身是空的得加端口才能转发流量。OVS的端口类型主要包括普通端口挂载物理网卡或虚拟网卡比如eth0、ens33、tap0直接把流量桥接进网桥。内部端口由OVS自己创建的虚拟网络设备名字可以指定不依赖外部网卡常用于给虚拟机提供接入点或者给网桥配置IP地址。隧道端口封装VXLAN、GRE等隧道协议的端口用于跨主机组网。把物理网卡加入网桥的命令是sudo ovs-vsctl add-port br0 ens33创建内部端口sudo ovs-vsctl add-port br0 vnet0 -- set Interface vnet0 typeinternal创建内部端口之后这个vnet0就是一个虚拟网卡可以给它配置IP地址也可以把它作为VM的网卡后端。查看端口状态sudo ovs-vsctl list-ports br0 sudo ovs-vsctl get Interface vnet0 ofport4.3 给网桥配置管理IP网桥创建后默认没有IP地址外部无法通过它通信。最常用的做法是给内部端口配置IP当作管理地址。例如sudo ip addr add 192.168.100.10/24 dev br0 sudo ip link set br0 up这样br0就有一个192.168.100.10的IP。需要注意如果同一个网段里的流量之前是从物理网卡走现在把物理网卡加入网桥后原来的IP相当于被拔走了必须把IP配置到网桥上否则网络会断。这是个经常被忽略的细节很多人做完测试发现SSH断了就是没处理这个问题。4.4 VLAN隔离和Access/TrunkOVS对VLAN的处理方式在逻辑上和传统交换机一致但命令风格完全不同。OVS里端口默认是access口不带VLAN tag给端口设置VLAN tag这个端口就成了access口且属于指定VLANsudo ovs-vsctl set Port vnet0 tag100去掉tag就是恢复成trunk口sudo ovs-vsctl clear Port vnet0 tagtrunk口允许多个VLAN通过OVS里做trunk其实就是不加tag。如果想让某个端口成为特定VLAN的trunk口只能通过OpenFlow流表实现或者设置trunks属性sudo ovs-vsctl set Port br0 trunks100,2004.5 OpenFlow流表初体验OVS的转发行为由OpenFlow流表控制添加流表用ovs-ofctl命令。查看某个网桥的流表sudo ovs-ofctl dump-flows br0新创建的网桥默认没有流表规则行为是转发所有包。如果查看时发现流表为空说明所有流量都会走正常转发逻辑也就是按MAC地址学习和泛洪跟普通交换机一致。添加一条基础的流表规则把端口1的所有流量丢弃sudo ovs-ofctl add-flow br0 priority10,in_port1,actionsdrop删除流表sudo ovs-ofctl del-flows br0这些命令看着简单但实际调试SDN网络时流表才是核心。OVS的OpenFlow实现很复杂后续可以单独开一篇仔细讲。5. 案例一KVM虚拟机通过OVS网桥接入网络5.1 需求场景描述假设现在有一台宿主机运行Ubuntu 20.04上面装了KVM/QEMU希望让虚拟机通过OVS网桥接入物理网络。传统做法是直接用Linux bridge但Linux bridge功能简单做不了VLAN隔离、流量监控、QoS这些OVS擅长的功能。所以我用OVS来实现把物理网卡ens33和一台Windows虚拟机的虚拟网卡都接入同一个OVS网桥让虚拟机就像插在同一台交换机上一样。5.2 网桥与端口准备先创建网桥br0把物理网卡ens33加入sudo ovs-vsctl add-br br0 sudo ovs-vsctl add-port br0 ens33把ens33的IP配置迁移到br0上这里假设原来ens33的IP是192.168.100.10/24sudo ip addr del 192.168.100.10/24 dev ens33 sudo ip addr add 192.168.100.10/24 dev br0 sudo ip link set ens33 up sudo ip link set br0 up顺序不能乱先删除物理网卡的IP再配置网桥的IP不然网桥配置过程中网络会中断。配置完成后测试一下宿主机能否ping通网关ping -c 3 192.168.100.1能通就说明物理链路已经通过OVS网桥正常工作了。5.3 创建连接到OVS的虚拟机网卡创建一块网卡设备给虚拟机用。OVS的标准做法是创建内部端口再把它当作虚拟机网卡但更常见的实践是利用libvirt创建带virtualport typeopenvswitch的接口libvirt会自动帮忙创建端口并配置好OVS侧。用virsh给运行中的虚拟机添加网卡sudo virsh attach-interface --domain win10 --type bridge \ --source br0 --model virtio --config --live但上面这种方式用的是Linux bridge的参数接入OVS需要用带virtualport参数的XML定义。我先编辑一个XML文件interface typebridge source bridgebr0/ virtualport typeopenvswitch parameters interfaceidaaaaaaaa-bbbb-cccc-dddd-eeeeffff0000/ /virtualport model typevirtio/ /interface然后通过virsh附加sudo virsh attach-device win10 /tmp/ovs-interface.xml --config --liveinterfaceid是一个UUIDlibvirt和OVS用它建立对应关系每次给虚拟机添加OVS接口都要生成新的UUID。可以用uuidgen命令生成。attach成功后在宿主机侧查看OVS端口sudo ovs-vsctl show应该能看到br0下多了一个类似vnet0的端口名字是libvirt自动生成的。5.4 虚拟机内配置网络并验证连通性Windows虚拟机启动后把虚拟网卡配置成和物理网络同一网段的IP比如192.168.100.20/24网关设为192.168.100.1。配置完成后从虚拟机里ping宿主机br0的IP再ping网关和外部地址。能通就说明整个链路已经畅通。这一步如果ping不通优先查OVS端口状态sudo ovs-appctl fdb/show br0fdb/show命令显示网桥学习到的MAC地址表。如果虚拟机一直在发ARP请求但表里没有对应MAC条目说明虚拟机的数据包根本没到达OVS网桥问题多半出在虚拟化层而不是OVS。如果表里有MAC但业务不通再看流表是否有特殊规则影响转发。5.5 虚拟机网络隔离扩展上面的场景是所有虚拟机都接在同一个br0里互相之间二层互通。如果希望两台虚拟机之间二层隔离可创建的内部端口并设置不同的VLAN tag访问控制的灵活度比Linux bridge高一个量级。在下一个案例里我详细展开这部分。6. 案例二多网桥与VLAN隔离的综合配置6.1 需求场景描述这次模拟一个更接近实际的项目场景一台物理服务器部署了多个业务系统系统A和系统B之间要隔离但是它们各自需要访问物理网络。物理服务器上有一块物理网卡ens33接上行交换机还有一块物理网卡ens34预留扩展。我希望用OVS实现业务A下发的流量走VLAN 100业务B下发的流量走VLAN 200互不干扰且都能上联。6.2 创建多网桥和VLAN配置方案拆开来看我需要两个网桥分别承载两个业务也可以做一个网桥起四层的隔离。这里我选两个网桥配置清晰、故障隔离也更好sudo ovs-vsctl add-br br1 sudo ovs-vsctl add-br br2 sudo ovs-vsctl add-port br1 ens33 sudo ovs-vsctl set Port ens33 trunks100,200 sudo ovs-vsctl add-port br1 vnet1 -- set Interface vnet1 typeinternal tag100 sudo ovs-vsctl add-port br2 vnet2 -- set Interface vnet2 typeinternal tag200 sudo ip link set vnet1 up sudo ip link set vnet2 up这个设计里物理网卡ens33作为trunk口同时允许VLAN 100和200的流量通过。vnet1是access口属于VLAN 100vnet2是access口属于VLAN 200。这样vnet1收到的所有数据包都会被打上VLAN 100标签从ens33出去时携带该标签vnet2的流量打VLAN 200标签。上行交换机只要配置了对应的access口或trunk口两个业务就能各自通信互不干扰。给内部端口配置IP模拟两个业务网段sudo ip addr add 10.10.100.10/24 dev vnet1 sudo ip addr add 10.10.200.10/24 dev vnet26.3 验证VLAN隔离效果验证的关键点是确认两个VLAN之间是否真的隔离。标准的做法是用ping测试从vnet1 ping vnet2的IP应该不通因为OVS的VLAN tag过滤会直接丢弃跨VLAN的包。现实中如果承载业务的是两台VM就把VMA挂到vnet1VMB挂到vnet2然后互ping不通就说明隔离生效。同时从宿主机检查流表和端口信息sudo ovs-ofctl dump-ports br1 sudo ovs-ofctl dump-flows br1dump-ports能看每个端口的收发统计dump-flows看流表对应关系。这时候可以看出vnet1所在端口的in_port等配置确认没有异常流表把两个VLAN桥接起来。6.4 加一层流量监控OVS的另一个优势是每端口流量统计能力这在业务排查和计费场景里很实用。查看所有端口收发字节数sudo ovs-ofctl dump-ports br1如果需要对某个端口做更细粒度的监控可以用sFlow或NetFlow功能。sFlow配置在OVS里比较简单sudo ovs-vsctl -- --idsflow create sflow agentvnet1 target\192.168.100.100:6343\ header128 sampling512 polling10 -- set Bridge br1 sflowsflow这段命令的作用是创建sFlow配置并绑定到网桥br1采样率512表示每512个包采样一个polling10表示每10秒上报一次端口统计信息。配合sFlow collector比如sFlow-RT就能实时监控流量、识别大流量业务。这个功能生产环境里非常实用报障的时候一抓一个准。7. 编译安装高频问题和排查技巧实录7.1 configure阶段报错先整理几个我在configure阶段经常遇到的报错及其解法报错信息原因解决办法configure: error: SSL headers not found缺少OpenSSL开发头文件Ubuntu: apt install libssl-devCentOS: yum install openssl-develconfigure: error: Python headers not found缺少Python开发头文件Ubuntu: apt install python3-devCentOS: yum install python3-develchecking for flex... noflex未安装apt install flexchecking for bison... nobison未安装apt install bisonconfigure: error: Kernel source tree not found--with-linux指定路径不存在确认内核头文件包安装确认路径正确最坑的一种情况是内核头文件版本和当前运行内核版本不一致。比如系统更新后没有重启uname -r显示的还是旧内核但/usr/src/kernels下已经是新内核的头文件。解决办法是装回对应版本的kernel-devel或者重启系统让内核和头文件一致。7.2 make阶段报错make阶段的报错通常集中在几个点上。一个是fatal error: libelf.h: No such file or directory这是因为内核模块编译需要libelfUbuntu下执行apt install libelf-dev。另一个是undefined reference to rte_eal_init这种错多半是DPDK相关库路径没配置好如果不需要DPDK功能重新configure时把DPDK相关参数去掉即可。还有一个比较隐蔽的问题是gcc版本太老。OVS 2.17要求gcc 4.9以上Ubuntu 20.04自带的gcc 9.x没有任何问题但CentOS 7自带的gcc 4.8.5就会报错错误信息可能五花八门让人根本想不到是编译器版本问题。CentOS 7上想编译新版本OVS建议先安装scl的devtoolsetsudo yum install -y centos-release-scl sudo yum install -y devtoolset-9-gcc devtoolset-9-gcc-c scl enable devtoolset-9 bash进入新的shell环境后gcc版本就变成9.x再重新configure编译即可。7.3 ovsdb-server或ovs-vswitchd启动失败启动失败最常见的原因是数据库没初始化。如果直接启动ovs-vswitchd日志会报Failed to open database或database not initialized。解决方式就是严格按照前面的顺序先ovsdb-tool create建库再启动ovsdb-server再ovs-vsctl --no-wait init最后启动ovs-vswitchd。另一个高概率问题是socket目录不存在。ovsdb-server默认监听/var/run/openvswitch/db.sock这个目录要先创建否则进程崩溃。查看日志确认sudo tail -n 50 /var/log/openvswitch/ovs-vswitchd.log日志里出错了再去处理别瞎猜。7.4 内核模块加载失败或数据面不转发模块加载失败报错信息如果包含required key not available说明内核开启了Secure Boot外加模块没签名。处理办法有两个方向一个是在BIOS里关掉Secure Boot另一个是给模块签名。生产环境建议保留Secure Boot的话签名的流程比较麻烦需要自己生成密钥、注册到UEFI、再用sign-file签名模块详细步骤每个发行版都不同这里不展开。数据面不转发的情况优先看OVS日志。我遇到过的一种情况是ovs-vswitchd启动正常ovs-vsctl show也正常但虚拟机和外部通信不通。最后发现是流表被打上了vlan过滤规则另一部分原因是内核模块版本和用户态版本不匹配。定位方法是直接用ovs-ofctl dump-flows查看流表是否有异常drop规则再用ovs-appctl dpif/netdev-dpdk/check-dpdk等工具确认数据面状态。7.5 编译OVS时的通用经验编译其他开源软件也适用除了OVS本身我还有几个编译开源软件的通用体会适用于nginx、glusterfs等常见开源服务。这些经验在编译安装OVS时同样管用。第一养成先读README和INSTALL的习惯。别看这两个文件平淡无奇很多坑的答案都在里面。OVS的INSTALL.rst明确写了支持的平台、依赖版本和编译步骤花十分钟读一遍后面能少折腾半小时。第二保留configure阶段的config.log日志。一旦报错最直接的原因通常就藏在config.log末尾几行。我自己排查问题时第一件事就是打开config.log搜error关键字比看configure输出靠谱得多。第三编译参数要有意识地和系统默认路径对齐。很多人喜欢用默认的/usr/local前缀装完发现命令不在PATH里又得折腾环境变量。对齐系统路径后后续服务和脚本编写都轻松很多。安装路径问题在nginx、glusterfs等编译安装场景同样重要——编译安装glusterfs时如果prefix设成/usr/localsystemd的unit文件路径和服务启动脚本经常对不上导致开机自启失败这类问题我见过不止一次。第四做好版本记录和回滚预案。我把每次编译安装的configure参数、make版本、内核版本都记在文档里万一系统升级出问题能快速复现当时的编译环境。这个习惯在维护OVS这类底层网络组件时尤其重要因为它直接影响网络可用性出问题后恢复时间越短越好。8. 从编译到运维我给自己的几条守则OVS编译安装这件事其实只是整个虚拟化网络运维链条里的第一步比编译更重要的是后续的维护和升级思路。一路走下来我把自己沉淀的几条实操体会列出来。第一OVS的版本升级一定要走“先备份数据库、再停止服务、再替换二进制、再重启服务”的流程。OVSDB里保存了所有网桥和端口配置一旦升级出了意外没有备份就只能从头配工作量不小。备份命令很简单sudo ovsdb-tool backup /etc/openvswitch/conf.db /tmp/ovsdb-backup-$(date %F).db第二编译安装后千万别急着删源码目录。源码目录里的vswitchd/vswitch.ovsschema是数据库初始化必需的文件以后再删不迟。另外某些排障场景需要看源码实现留着源码也方便定位问题。第三建议在内核升级或者打补丁后重新编译一次openvswitch.ko。系统内核一旦升级旧的内核模块往往无法加载需要到新内核头文件环境下重新make。这就是为什么运维OVS要养成“内核升级后第一时间重新编译模块”的习惯不然下一次重启系统后网络起不来背上生产事故的锅那滋味可不好受。最后分享一个小技巧。OVS官方提供了Docker镜像和Ansible role不少团队直接用容器方式部署OVS这样避开了宿主机的内核模块依赖问题——但前提是宿主机内核本身得有openvswitch模块否则容器里的OVS数据面效率会打折。我个人的建议是物理机、裸金属场景直接编译安装虚拟机内做开发调试可以用容器方案。网络这块适合自己的业务形态的方案才是好方案不必盲目追新。
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

【外设】之大彩串口显示屏 2026/11/11 13:52:51

【外设】之大彩串口显示屏

大彩串口屏初步使用 1 .官网下载 STM32 屏幕 GUI 设计资料 http://www.gz-dc.com/category/typeid/4112 找到 STM32 Keil 工程,移植相关代码因项目而异进行移植,由于项目简单,本人只对用到的指令接口进行修改。 比如:注意事项&…

阅读更多 →
无法下载Windows系统iso文件 2026/11/10 19:42:40

无法下载Windows系统iso文件

当我遇到这个问题的时候,我打开了一个网站: 登录 然后我打算下载的时候: 突然那个官方的连接就可以下载了:

阅读更多 →
【清华代码熊】DeepSeek V4.1 Flash 后训练详解 2026/11/11 9:31:44

【清华代码熊】DeepSeek V4.1 Flash 后训练详解

📌 上期解析了 DeepSeek V4.1 Flash 模型架构改进,本期解析 DeepSeek V4.1 Flash 预训练/后训练技术: 🌟 预训练:45T 文本 多模态混合语料、直接训练 sparse attention(取消 DeepSeek V4 的 dense 冷启动&…

阅读更多 →
Shuffle-R1: Efficient RL framework for Multimodal Large Language Models via Data-centric Dynamic ... 2026/11/11 5:36:08

Shuffle-R1: Efficient RL framework for Multimodal Large Language Models via Data-centric Dynamic ...

文章主要内容和创新点 主要内容 本文聚焦于多模态大语言模型(MLLM)强化学习(RL)训练中的效率问题,提出了一个名为Shuffle-R1的框架。研究发现,当前RL训练存在两个关键缺陷: 优势值坍缩(Advantage Collapsing):批次中大多数优势值集中在零附近,导致有效梯度信号被淹…

阅读更多 →
PRvL: Quantifying the Capabilities and Risks of Large Language Models for PII Redaction 2026/11/11 15:37:39

PRvL: Quantifying the Capabilities and Risks of Large Language Models for PII Redaction

一、文章主要内容总结 本文聚焦于利用大型语言模型(LLMs)实现个人身份信息(PII)脱敏的研究,旨在解决传统脱敏方法(如基于规则的系统、领域特定命名实体识别(NER)模型)泛化能力差、跨格式/跨语境适应性弱的问题。 研究通过全面评估多种LLM架构(包括密集型LLM(D-LLM…

阅读更多 →
LLaVA-RE: Binary Image-Text Relevancy Evaluation with Multimodal Large Language Model 2026/11/10 17:14:10

LLaVA-RE: Binary Image-Text Relevancy Evaluation with Multimodal Large Language Model

文章主要内容和创新点 主要内容 本文聚焦于二进制图像-文本相关性评估任务(判断图像与文本“相关”或“不相关”),针对该任务中文本格式多样、相关性定义随场景变化等挑战,提出了基于多模态大语言模型(MLLM)的解决方案LLaVA-RE。 模型设计:LLaVA-RE基于LLaVA 1.5架构,…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉