Ubuntu16.04安装P4语言以及遇到的问题

前言

P4语言是一种用于SDN数据平面可编程语言,主要内容是一种协议无关的包转发控制高级语言,最早在2014年的《ACM SIGCOMM Communication Review》中的《P4:Programming Protocol-Independent Packet Processors》文章上被提出。

P4语言主要的特征是:

(1)协议无关性:使用P4语言描述任何网络数据平面协议和数据包处理行为,网络设备不与任何特定的网络协议绑定;

(2)目标无关性:用户不需要关心底层硬件的细节就可实现对数据包的处理方式的编程描述;

(3)可重构性:用户随时改变包解析和处理的程序,并在编译后配置交换机。

目前,P4语言的相关研究并不多,如果一些原本的SDN功能基于P4实现,则是一大创新:一方面,已有的很多SDN研究或者服务都是基于控制器的全局控制,而并不倾向于在数据平面上直接解决转发问题;另一方面如果将网络功能用P4部署在数据平面上,则可以节省很多的控制链路通信开销。

【安装P4】本文主要参考了:https://blog.csdn.net/qq_34039018/article/details/88843937,感谢前辈大佬的详细教程。本文主要在此基础上做一些增改说明。

总览

一个完整的P4开发环境应当有6个文件夹(必须),分别是:

protobuf——协议数据交换格式工具库,p4依赖项

behavior-model(bvm2)——bvm2软件交换机

p4c——p4语言核心

PI——p4 runtime

grpc——基于gRPC和protobuf的p4 runtime

tutorials——官方教程和练习题

其他内容可选:

网络仿真器mininet

至少一个SDN控制器

本文环境:Ubuntu 16.04.06

步骤和问题解决

1、安装依赖项

sudo apt-get install g++ git automake libtool libgc-dev bison flex libfl-dev libgmp-dev libboost-dev libboost-iostreams-dev pkg-config python python-scapy python-ipaddr curl wget tcpdump cmake
sudo apt-get install cmake g++ git automake libtool libgc-dev bison flex libfl-dev libgmp-dev libboost-dev libboost-iostreams-dev libboost-graph-dev llvm pkg-config python python-scapy python-ipaddr python-ply tcpdump
sudo apt-get install autoconf automake g++ curl libtool make unzip

可以自行参考官网内容:https://github.com/p4lang/tutorials/blob/master/vm/user-bootstrap.sh

2、安装gmock

git clone git://github.com/paulsapps/gmock-1.7.0
cd gmock-1.7.0
cd make
make
./gmock_test

注意事项:

(1)./gmock_test会显示测试结果,必须全部测试通过才可以下一步

(2)安装完成后将gmock-1.7.0改名为gmock,下一步下载好protobuf源码包之后,将gmock复制到protobuf/下。

3、安装protobuf

protobuf安装较老的稳定版本。

如果下载了最新版,经过测试(2021年7月),make无法通过。

wget https://github.com/protocolbuffers/protobuf/archive/v3.2.0.zip
unzip v3.2.0.zip
(此时,重命名解压后的文件夹为protobuf)
cd protobuf
./autogen.sh
./configure
make
make check
sudo make install
sudo ldconfig
protoc --version

注意事项:

(1)此处安装为p4的六大组件之一,在安装protobuf之前,请尽量创建一个文件夹p4,以后所有的p4组件都安装在该目录下;

(2)make check的结果应当是7个测试全部pass,如果没有全过,请继续查找问题,绝对不能sudo make install;

(3)最新版本的安装指令为(可能会make或check不通过,慎用):

git clone https://github.com/google/protobuf.git

(4)安装完毕后查看版本(最后一条指令),如果安装成功则会显示版本信息。

4、安装p4c

现在安装p4语言的核心部分:

git clone --recursive https://github.com/p4lang/p4c.git
(如果太慢,可以使用国内镜像,即url改成:github.com.cnpmjs.org,后续步骤同)
cd p4c
./bootstrap.sh
cd build
cmake ..
make -j4
make check -j4
sudo make install
p4c --version

注意事项:

此步骤make check -j4很可能会不全部通过,如果安装p4c时出现了check不通过的情况,多数是由于依赖未安装导致的。虽然前面已经安装好了依赖,但是由于很多情况下python2和3的管理是十分混乱的,导致安装的依赖并不是软件安装想要的那个。

解决的方法是:打开p4c/build/Testing/Temporary中的LastTest.log,查看check错误的信息,安装好缺失的包(如果不放心,pip和pip3都安装一遍)。

同样,在check没有全通过的时候,不要进行下一步install操作。

5、安装PI

PI是p4 runtime的实现。

git clone https://github.com/p4lang/PI.git
cd PI
git submodule update --init --recursive
./autogen.sh
./configure
make
sudo make install
sudo ldconfig

注意事项:

这一步里面会出现submodule的更新,如果github主站太慢,可以在clone的项目文件夹中vim .gitmodules,将里面的url全部改成国内镜像。

6、安装bvm2

bvm2是可以兼容p4的软件交换机环境,是实验部分的核心。

git clone git://github.com/p4lang/behavioral-model.git
cd behavioral-model
./install_deps.sh
./autogen.sh
./configure
make
sudo make install -j4
make check -j4
VERSION

注意事项:

这一步对pip的安装要求较高,所以一定要保证pip和pip3是最新版的。如果出现了:

pip ImportError: No module named _internal.cli.main

类似的错误,并无法打印

pip --version

则不妨先卸载pip,即:

sudo apt-get remove python-pip

这样做的目的是防止pip重复安装。

7、安装grpc

grpc是另一种p4软件交换机的实现方式,即通过google的远程调用框架。

git clone https://github.com/google/grpc.git
cd grpc
git checkout tags/v1.xx.x
git submodule update --init --recursive
make
sudo make install
sudo ldconfig

注意事项:

(1)关于git checkout的版本:不要使用最新版的,因为后续make会出现错误,显示make已经out of date了。我的建议是,选择v1.19.0及以下的版本(我用的是1.16.0)。

(2)安装grpc中,这一步中submodule update会出现严重的错误。对于v1.16.0以上部分依赖于libFuzzer的grpc版本,根本无法从googlesource网站下载资源,其原因是bei网络链接qiang会出现问题。对于其他版本也有类似的问题。

那么,为了解决gitbuh或者google source网站上面无法连接资源的下载问题,我的建议是,配置ScIeN-TiFIcShAng机的网waNG络代理,参考:https://blog.csdn.net/weixin_45467056/article/details/105956782

然后就能update了。

8、安装tutorial

p4的官方教程和练习题。

git clone https://github.com/p4lang/tutorials

参考资料

https://www.bilibili.com/read/cv8150020

https://github.com/alibaba/euler/issues/69

https://www.cnblogs.com/pullself/p/10346300.html

https://blog.csdn.net/songforest1/article/details/109659604

上一篇:P4 简介


下一篇:2.3.8银行家算法