news 2026/9/8 6:15:42

P4开发环境搭建全攻略:p4c+bmv2+protobuf+thrift版本兼容实践

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
P4开发环境搭建全攻略:p4c+bmv2+protobuf+thrift版本兼容实践

简介:面向P4可编程数据平面开发者的环境配置安装包,针对P4工具链依赖复杂、安装步骤繁琐、版本兼容性差等问题,集成了多个核心组件。包内包含behavioral-model(即bmv2软件交换机)、p4c(P4编译器)、protobuf 3.2.0以及thrift 0.9.2等关键依赖,可支撑从P4源程序编写、编译到模拟运行的全流程,帮助开发者快速搭建可用的P4开发与实验环境。资源采用.gz格式压缩,整体大小约147.8MB,便于一次性下载部署。目前已有608人学习下载,适用于网络方向的高校学生、科研人员以及初步接触P4编程的技术爱好者。借助该资源包,可免去逐个寻找安装包、手工匹配版本与编译依赖的繁琐过程,显著提升环境搭建效率,从而更专注于P4数据平面编程与实验验证本身。 搭建P4开发环境这件事,说难不难,但确实烦。尤其是第一次接触P4的人,光是搞清楚p4c、behavioral-model、protobuf、thrift这一堆组件之间的关系,就得耗掉不少时间。我当初配置这套环境时,在版本兼容性上踩了不少坑,所以这次把一套亲测可用的安装包组合(behavioral-model + gmock-1.7.0 + p4c + protobuf-3.2.0 + thrift-0.9.2)完整梳理出来,希望能帮你省下那些无谓的折腾。

这套环境解决的核心问题,是让P4程序能够在本地完成“编写—编译—仿真运行”的闭环。P4本身是一门数据平面编程语言,写完的代码不能直接跑在真实交换机上,需要p4c把它编译成特定目标平台的配置,再由behavioral-model(也就是bmv2)提供一个软件交换机来模拟运行。而protobuf和thrift在这套体系里的角色,是负责RPC通信和数据序列化——简单说,就是让控制平面和BMv2之间能高效、规范地交换信息。gmock则是测试用的,在开发BMv2的C++代码时非常有用。

这套环境适合谁?如果你是做P4数据平面开发、SDN控制器与交换机联调、或者研究可编程网络协议解析的人,那这套配置几乎是必需品。哪怕是刚入门P4的新手,把这套环境跑通,也等于完成了最艰难的前50%。

1. 环境组件解析:每样东西为什么非它不可

在动手安装之前,我建议你先搞明白这些组件各自解决什么问题。这不是为了凑字数,而是因为P4的依赖关系比较绕,很多人装到一半卡住,往往就是没搞懂组件的边界和版本约束。

1.1 P4C:把P4代码翻译成目标配置的编译器

P4C是P4语言的前端编译器,也是整套环境里最核心的组件。它做的事情,是把你写的P4-16代码解析成中间表示(IR),然后再根据不同的后端目标,生成对应的JSON配置或特定硬件平台的表项配置。在bmv2这套软件交换机体系里,p4c生成的JSON文件就是behavioral-model运行时的“程序”。

p4c本身是基于C++开发的,编译它需要一整套工具链和依赖库。如果你在安装过程中碰到类似“Could not find a package configuration file provided by P4C”的错误,通常就是依赖没装全,或者是编译器版本过高导致兼容性问题。我建议在Ubuntu 18.04或20.04这类长期支持版本上操作,能减少很多不必要的麻烦。

1.2 Behavioral-Model:P4程序的家用模拟器

Behavioral-Model,俗称bmv2,是一个用C++实现的软件交换机,专门用来模拟P4定义的数据平面行为。它有点像一个虚拟机:你给它一个由P4程序编译出来的JSON配置,它就可以模拟报文从入口端口到出口端口经历的所有匹配-动作流程。

BMv2本身支持多种“目标”,比如simple_switch、simple_switch_grpc、psa_switch等。其中simple_switch是最基础的版本,适合学习调试;simple_switch_grpc则集成了gRPC和P4Runtime接口,适合做控制平面联调。你自己的需求,如果只是验证P4逻辑,用simple_switch就够;如果要做SDN控制器的对接实验,那建议加上grpc版本。

1.3 Protobuf和Thrift:通信与序列化的地基

这两个库经常被初学者忽略,但它们的版本选择直接决定整套环境能否编译通过。

Protobuf是Google的序列化库,BMv2的P4Runtime实现依赖它来定义和交换结构化数据。你给出的版本是protobuf-3.2.0,这是一个兼顾稳定性和兼容性的版本,比它更新的3.5以上版本会和某些旧版gRPC产生冲突,比它更旧的版本则缺少一些必要接口。

Thrift是Facebook开源的RPC框架,在BMv2里主要用于internal RPC的通信。thrift-0.9.2这个版本和BMv2的代码契合度很高,如果你擅自升级到0.11以上的版本,很可能会遇到函数签名变更导致的编译错误。所以这套组合里,thrift的版本不要轻易动。

1.4 GMock:测试框架里的辅助角色

GMock是Google Test配套的C++ mock框架,主要用于单元测试中对依赖对象的模拟。在BMv2的Utest目录下,不少测试用例需要链接GMock。如果你不打算跑BMv2的C++单测,其实可以不装它,但既然这套安装包里已经包含,那就顺手装上,后面做二次开发或跑自带测试时都用得上。

2. 环境准备与依赖安装:提前扫平90%的坑

这个环节我放在前面,是因为很多人在安装protobuf或p4c时才发现系统缺了一堆基础依赖,然后中途停下来去补装,打乱了节奏。按照下面这些步骤提前准备好,后续基本可以一路畅通。

2.1 系统要求与基础工具链

建议在64位Ubuntu 18.04 LTS或20.04 LTS上操作。其他发行版理论上也能跑,但如果你不太熟悉Linux编译环境,就老老实实用Ubuntu。

基础工具链,一句话执行即可:

sudo apt-get update sudo apt-get install -y build-essential cmake git python3 python3-pip

这里我要提醒一点:不要用系统自带的cmake旧版本。Ubuntu 18.04自带的是cmake 3.10,对于p4c的一些子模块来说版本偏低,建议用pip安装新版cmake:

pip3 install cmake

装完后确认一下cmake版本,最好是3.16以上。

2.2 P4C的专属依赖库

P4C的编译额外需要以下库:

sudo apt-get install -y g++ git automake libtool libgc-dev bison flex libfl-dev libgmp-dev libboost-dev libboost-iostreams-dev libboost-graph-dev llvm pkg-config python3-setuptools

这里面有几个值得单独说两句:libgc-dev是Boehm垃圾回收器,p4c在处理大型P4程序时靠它管理内存,不装会直接编译报错;bison和flex是生成解析器用的,版本太旧也会出问题。libboost系列则用来支持p4c中核心的数据结构,最好一次性装全。

3. 核心组件编译安装实录

下面进入真正的实操环节。我按照“先底层、后上层”的顺序来安装,即先装protobuf和thrift,再装p4c,最后装BMv2。这个顺序是经过多次失败后总结出来的——因为上层组件编译时依赖底层库的头文件和库文件,顺序反了会反复出现“找不到头文件”的尴尬。

3.1 编译安装protobuf-3.2.0

进入源码目录后,依次执行标准三步:

cd protobuf-3.2.0 ./autogen.sh ./configure --prefix=/usr make -j4 sudo make install sudo ldconfig

关于--prefix=/usr,我多说两句。默认安装路径是/usr/local,在大多数情况下这么装也没问题。但如果你后面编译p4c时出现找不到protobuf头文件的情况,就很可能是路径没被搜索到。直接装到/usr下,可以让/usr/include/usr/lib这两个默认搜索路径直接覆盖到,省去一堆环境变量配置。

编译时用-j4还是-j8,取决于CPU核心数。如果内存小于8G,建议老老实实用make -j2,否则编译过程中内存耗尽直接卡死,别再问我怎么知道的。

3.2 编译安装thrift-0.9.2

thrift的编译步骤与protobuf类似,但它默认会尝试编译所有语言绑定(包括Java、Python、PHP等),这不仅慢,而且某些绑定依赖额外库,导致编译失败。我建议只保留C++和Python绑定:

cd thrift-0.9.2 ./configure --prefix=/usr --without-java --without-php --without-perl --without-nodejs --without-lua --without-ruby --without-erlang --without-go --without-haskell make -j4 sudo make install sudo ldconfig

这里还有一个隐形坑:thrift编译依赖libssl-dev和libboost-dev,如果缺失会在make阶段报错。保险起见:

sudo apt-get install -y libssl-dev libboost-dev

thrift 0.9.2对编译器也比较挑,如果你用的是GCC 9及以上版本,可能会遇到“no matching function for call to”这类模板推导错误。遇到这种情况,最简单的办法是安装GCC 8并切换过去:

sudo apt-get install -y g++-8 sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-8 80 sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-8 80

3.3 编译安装p4c

p4c的编译依赖一个叫p4c-dpdk的子模块,而且对protobuf的版本很敏感。在开始编译前,先确保protobuf已经正确装好,并且能用以下命令验证:

protoc --version

正常情况下应显示libprotoc 3.2.0。确认无误后,继续:

cd p4c git submodule update --init --recursive mkdir build && cd build cmake .. make -j4 sudo make install

p4c的编译时间比较长,在性能一般的机器上可能要40分钟以上,建议准备好咖啡。如果编译中报错,最常见的集中在两个地方:一是protobuf头文件找不到,说明前面的安装路径有问题;二是Boost库版本不匹配,这通常是因为系统装了多个Boost版本导致链接错误,可以用sudo apt-get purge libboost-all-dev清理后重新安装。

另外注意,p4c编译完成后,可执行文件默认在build/p4c。为了方便调用,建议把它软链到/usr/local/bin

sudo ln -s /usr/local/bin/p4c /usr/local/bin/p4c

如果你的安装路径不是/usr/local,按实际路径调整。

3.4 编译安装behavioral-model

BMv2的编译是整个过程中最考验耐心的环节,因为它对依赖的齐全度要求特别高。先把系统依赖补齐:

sudo apt-get install -y libreadline-dev libgmp-dev libpcap-dev libevent-dev

然后进入BMv2源码目录,同样需要初始化子模块:

cd behavioral-model git submodule update --init --recursive ./autogen.sh ./configure --enable-debug --with-pi --with-thrift make -j4 sudo make install

--with-pi是启用P4Runtime支持的关键选项,如果你需要对接ONOS或Ryu这类控制器,一定得带上。如果不带这个参数,编译出来的simple_switch是无法接收P4Runtime下发流的。

编译成功后可以验证一下:

simple_switch --version

能输出版本号,说明BMv2的核心安装完成。完整安装还会在targets/simple_switch目录下生成二进制的simple_switch可执行文件。

3.5 安装gmock-1.7.0

GMock 1.7.0是一个比较老的版本,但BMv2的Utest测试用例就是按这个版本写的,用新版反而可能编译不过。编译链接方式如下:

cd gmock-1.7.0 ./configure make sudo make install

装完后需要在BMv2的configure阶段让它找到gmock头文件和库文件。通常默认路径就能找到,如果你自定义了安装路径,可以通过环境变量补充:

export CPLUS_INCLUDE_PATH=/usr/local/include:$CPLUS_INCLUDE_PATH export LIBRARY_PATH=/usr/local/lib:$LIBRARY_PATH

不过说句实在话,如果你只是跑业务逻辑而不是做BMv2二次开发,这步可以跳过。真到了需要运行BMv2自带单测时再补装也行。

4. 常见错误与避坑手册

这部分内容价值极高,但如果踩过坑,全都值回票价。我按出现频率排序,把几个典型的错误和对应解法列出来。

4.1 “fatal error: google/protobuf/xxx.h: No such file or directory”

这个错误几乎九成是因为protobuf安装路径不是/usr导致的。解法:第一优先,重新安装protobuf时指定--prefix=/usr;第二,也可以将/usr/local/include软链到/usr/include,但这不推荐,容易造成库混乱。

4.2 “Could not find a package configuration file provided by P4C”

这个多半是因为p4c没有正确安装完,或者安装路径并未纳入cmake搜索范围。最简单的检查方式:

find / -name "*p4c*" 2>/dev/null | head -20

如果cmake还是找到不,可以手动指定安装前缀,在BMv2的configure步骤中加上:

./configure CXXFLAGS="-I/usr/local/include" LDFLAGS="-L/usr/local/lib"

4.3 thrift编译报错“error: ‘uint32_t’ does not name a type”

这是个典型的版本兼容问题,clang或gcc新版才会出现。解决办法是在configure前加上环境变量:

CXXFLAGS="-std=c++11" ./configure ...

4.4 BMv2运行时报“RuntimeError: P4Runtime requires gRPC”

出现这个错,说明BMv2的运行时(PI)和gRPC库没有链接上。检查是否安装了gRPC以及protobuf的grpc插件:

sudo apt-get install -y libgrpc-dev libgrpc++-dev protobuf-compiler-grpc

如果已经安装并依旧报错,则需要在编译BMv2的configure阶段精确指定gRPC路径,同时确保--with-pi参数已启用。

4.5 环境配置临时变量:让一切变得顺手

安装全部完成后,每次打开新终端,可能需要刷新一下动态链接库以及PATH:

sudo ldconfig export PATH=/usr/local/bin:$PATH

为了避免反复输入,建议把这行加到~/.bashrc里。当然,如果你全部装到了/usr目录下,这一步基本可以省掉。

5. 一些值得尝试的验证用例

环境配好后,先用自带的示例程序验证一遍,别急着上手写代码。可以在p4c源码目录下找到testdata/examples,选一个简单例子编译运行:

p4c --target bmv2 --arch v1model --std p4-16 testdata/examples/simple_router.p4

如果生成出了simple_router.json,说明p4c工作正常。接着启动BMv2:

sudo simple_switch --log-console --dump-packet-data simple_router.json

看到Switch was started字样,就说明整套环境已经完全跑通。此时你可以用simple_switch_CLI手动下发表项,开始真正的P4实验。

写在最后

这套环境的搭建,本质上是在跟版本兼容性做博弈。放下来说,每个组件单独装都不难,难的是让它们协同工作。按我这套组合和顺序来操作,可以少走很多弯路。

我在多次配置中还发现一个小技巧:在编译BMv2前,先编译一次grpc和nlohmann/json库,可以显著减少后续报错。具体做法是:将nlohmann/json单头文件放入/usr/include/nlohmann/,并在系统安装libgrpc++后,重新执行./configure --with-pi --with-thrift并 make clean 后再 make,基本能一次通过。

这套环境跑通之后,你再回头去看P4的语法、v1model架构、P4Runtime的实现,会发现理解起来轻松很多。毕竟有了能实际跑的环境,很多概念才能真正落地。祝你配置顺利,早日用P4写出你的第一个自定义转发逻辑。

本文还有配套的精品资源,点击获取

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/8 6:15:08

MySQL单表查询实战:从基础语法到综合练习

MySQL 单表查询,其实是整个 SQL 学习路线里性价比最高的一块。从大学课程、培训机构、到面试题,单表查询都是最先考、最常考、也最容易出细节坑的部分。很多同学觉得"单表查询不就是 SELECT FROM WHERE",等真正面对一道带条件、排…

作者头像 李华
网站建设 2026/9/8 6:14:59

智能合约安全实战指南:从代码审计到经济博弈的攻防实践

区块链行业这几年最不缺的就是新闻,从DeFi的大起大落到NFT的一夜爆红,再到各种跨链桥被反复攻击,背后始终绕不开一个核心话题——智能合约安全。我自己在审计和开发一线摸爬滚打了不少年头,见过太多项目在代码细节上栽跟头&#x…

作者头像 李华
网站建设 2026/9/8 6:14:53

OTFS接收机低复杂度LMMSE-PIC均衡器:原理与工程实现

简介:面向正交时频空间调制(OTFS)通信体制的研究人员与高年级研究生,这份代码资源聚焦高移动性场景下的接收机均衡难题。由于OTFS符号在时频双选择性信道中会遭受二维干扰,传统线性均衡的矩阵求逆开销极大,…

作者头像 李华
网站建设 2026/9/8 6:14:17

SQL LIKE模糊查询的陷阱:从慢查询到索引优化与安全转义

我第一次意识到 SQL 里的 LIKE 不是“省事工具”,是在一次线上慢查询排查里。业务方想按订单号前缀查最近一批异常单据,SQL 写得很自然:SELECT * FROM orders WHERE order_no LIKE 202406%。查询条件看起来没问题,但执行计划显示它…

作者头像 李华
网站建设 2026/9/8 6:13:38

现在主流的AI写作辅助平台有哪些品牌?聊聊真实使用体验

每到期末、毕业答辩、课题申报阶段,很多学生都会陷入论文写作的困境:选题毫无头绪、大纲搭建逻辑混乱、正文撰写耗时长、参考文献格式出错、查重重复率偏高、AIGC检测告警、本校论文排版标准复杂。依靠纯人工从零开始撰写、一遍遍修改格式和降重&#xf…

作者头像 李华
网站建设 2026/9/8 6:11:46

2026年B站视频转笔记AI工具横评:五款主流工具实测对比

我现在下了一个判断:把B站视频变成结构化笔记这件事,2026年已经不算什么新鲜功能了,但“到底该用哪个工具”反倒成了最难回答的问题。过去两年我也没少折腾AI笔记工具,从最早拿语音转写软件硬怼视频音频,到现在随便一个…

作者头像 李华