Ubuntu P4编程环境搭建

ⅰ亾dé卋堺 提交于 2020-02-28 03:34:51

前言

最近由于科研的需要,搭建SDN的P4编程环境,但是这个过程比较麻烦。网上相关的资源较老,P4的库依赖众多,出现了很多库版本不对导致的错误。最后以GitHub上P4项目教程的实验环境的配置文档和一些相关的文档为参考而搭建成功。
下面对整个搭建环境过程进行一下总结。

系统环境

  • Ubuntu 16.04
  • Python 2.7
  • 内存 4G+
  • 内核 4.15
    系统内核版本一定要更新到4.15及以上的版本,不然在安装P4C的过程中会出现error。同时内存太小的情况下,执行脚本过程中系统容易崩溃。

环境组件

P4编程环境主要需要5个组件。

  • p4c是最新的p4编译器。
  • Bmv2是支持P4编程的软件交换机。
  • PI是P4 runtime的实现,用于Control Plane对数据平面的控制。
  • Mininet的功能是构建一个虚拟的网络拓扑。 它通过linux内核的一些特性(net命名空间),在一个主机上划分出多个虚拟网络空间,各个网络空间之间相互隔离,有自己的端口, ip等等。
  • p4 tutorials 提供了用于学习的实例代码,它提供了很多个带有方向性的实际场景,例如负载均衡,简单的隧道机制,源路由等。

搭建过程

1.安装依赖

sudo apt-get update

sudo apt-get upgrade
 
sudo apt-get install automake cmake libjudy-dev libpcap-dev libboost-dev libboost-test-dev libboost-program-options-dev libboost-system-dev libboost-filesystem-dev libboost-thread-dev libevent-dev libtool flex bison pkg-config g++ libssl-dev  -y
 
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 curl  -y
 
sudo apt-get install libreadline6 libreadline6-dev  python-pip  -y 
 
sudo pip install psutil

sudo pip install crcmod

分别执行这些语句,安装P4编程环境需要的依赖。

2.创建工作目录

在home目录下创建一个P4的工作目录,方便之后的使用,并且加入环境变量。

mkdir ~/P4

cd ~/P4

echo "P4_HOME=$(pwd)" >> ~/.bashrc

source ~/.bashrc

3.P4相关组件版本

截至本篇文章书写时间,P4项目教程的实验环境的配置文档中的各组件和依赖库的版本如下。

BMV2_COMMIT="b447ac4c0cfd83e5e72a3cc6120251c1e91128ab"   #August 10, 2019
PI_COMMIT="41358da0ff32c94fa13179b9cee0ab597c9ccbcc"     #August 10, 2019
P4C_COMMIT="69e132d0d663e3408d740aaf8ed534ecefc88810"   #August 10, 2019
PROTOBUF_COMMIT="v3.2.0"
GRPC_COMMIT="v1.3.2"

要注意各个组件的版本并安装文档中给出的版本,防止之后出现错误,或者无法运行新版tutorials中的实例。

4.Mininet安装

首先创建Mininet的安装脚本

cd $P4_HOME 
 
touch Ins_Mini.sh

chmod +x Ins_Mini.sh

然后把下面的内容,复制到Ins_Mini.sh中

#!/bin/bash

#Print script commands and exit on errors.
set -xe

git clone https://github.com/mininet/mininet mininet
sudo ./mininet/util/install.sh -nwv

然后运行Ins_Mini.sh,完成Mininet的安装。
安装完成后使用命令

mn --version

可以查看安装的Mininet的版本。
PS:这里及之后的步骤建议搭配梯子使用。

5.Protobuf安装

protobuf是谷歌的开源序列化协议框架,结构类似于XML,JSON这种,显著的特点是二进制的,效率高,主要用于通信协议和数据存储等方面,算是一种结构化数据的表示方法。
Protobuf是重点对象,一旦安装错误就会导致其他组件安装的报错。
首先创建Protobuf的安装脚本

cd $P4_HOME 
 
touch Ins_Proto.sh

chmod +x Ins_Proto.sh

然后把下面的内容,复制到Ins_Proto.sh中

#!/bin/bash

#Print script commands and exit on errors.
set -xe

#src
PROTOBUF_COMMIT="v3.2.0"

#Get the number of cores to speed up the compilation process
NUM_CORES=`grep -c ^processor /proc/cpuinfo`

 #--- Protobuf --- #
git clone https://github.com/google/protobuf.git
cd protobuf
git checkout ${PROTOBUF_COMMIT}
export CFLAGS="-Os"
export CXXFLAGS="-Os"
export LDFLAGS="-Wl,-s"
./autogen.sh
./configure --prefix=/usr
sudo make install
sudo ldconfig
unset CFLAGS CXXFLAGS LDFLAGS
 #Force install python module
cd python
sudo python setup.py install
cd ../..

然后运行Ins_Proto.sh,完成protobuf的安装。
这里一定要注意t安装P4推荐的版本。因为目前P4编译器所有的测试都是基于Protobuf 3.2.0版本进行的。
安装完成后使用命令

cd ~/P4/protobuf

sudo make check

这里要注意,make check的所有测试要一定pass,如果没有全部通过排除原因之后再继续安装。

可以使用命令

protoc --version

查看安装的protobuf版本。

6.grpc安装

首先创建grpc的安装脚本

cd $P4_HOME 
 
touch Ins_grpc.sh

chmod +x Ins_grpc.sh

然后把下面的内容,复制到Ins_grpc.sh中

#!/bin/bash

#Print script commands and exit on errors.
set -xe

#Src 
GRPC_COMMIT="v1.3.2"

#Get the number of cores to speed up the compilation process
NUM_CORES=`grep -c ^processor /proc/cpuinfo`

 #--- gRPC --- #
git clone https://github.com/grpc/grpc.git
cd grpc
git checkout ${GRPC_COMMIT}
git submodule update --init --recursive
export LDFLAGS="-Wl,-s"
make -j${NUM_CORES}
sudo make install
sudo ldconfig
unset LDFLAGS
cd ..
# Install gRPC Python Package
sudo pip install grpcio

然后运行Ins_grpc.sh,完成grpc的安装。

7.Bmv2依赖配置

这一步没有完全安装Bmv2。
先安装Bmv2的依赖,部分依赖在PI编译是需要,等待PI配置完成后再进行Bmv2的安装。
首先创建Bmv2的配置脚本

cd $P4_HOME 
 
touch Make_Bmv2.sh

chmod +x Make_Bmv2.sh

然后把下面的内容,复制到Make_Bmv2.sh中

#!/bin/bash

#Print script commands and exit on errors.
set -xe

#Src 
BMV2_COMMIT="b447ac4c0cfd83e5e72a3cc6120251c1e91128ab"   #August 10, 2019

#Get the number of cores to speed up the compilation process
NUM_CORES=`grep -c ^processor /proc/cpuinfo`

 #--- BMv2 deps (needed by PI) --- #
git clone https://github.com/p4lang/behavioral-model.git
cd behavioral-model
git checkout ${BMV2_COMMIT}
# From bmv2's install_deps.sh, we can skip apt-get install.
#Nanomsg is required by p4runtime, p4runtime is needed by BMv2...
tmpdir=`mktemp -d -p .`
cd ${tmpdir}
bash ../travis/install-thrift.sh
bash ../travis/install-nanomsg.sh
sudo ldconfig
bash ../travis/install-nnpy.sh
cd ..
sudo rm -rf $tmpdir
cd ..

然后运行Make_Bmv2.sh,完成Bmv2的依赖库配置。

8.PI安装

首先创建PI的安装脚本

cd $P4_HOME 
 
touch Ins_PI.sh

chmod +x Ins_PI.sh

然后把下面的内容,复制到Ins_PI.sh中

#!/bin/bash

#Print script commands and exit on errors.
set -xe

#Src 
PI_COMMIT="41358da0ff32c94fa13179b9cee0ab597c9ccbcc"    # August 10, 2019

#Get the number of cores to speed up the compilation process
NUM_CORES=`grep -c ^processor /proc/cpuinfo`

 #--- gRPC --- #
git clone https://github.com/grpc/grpc.git
cd grpc
git checkout ${GRPC_COMMIT}
git submodule update --init --recursive
export LDFLAGS="-Wl,-s"
make -j${NUM_CORES}
sudo make install
sudo ldconfig
unset LDFLAGS
cd ..
# Install gRPC Python Package
sudo pip install grpcio

然后运行Ins_PI.sh,完成PI的安装。

9.Bmv2安装

首先创建Bmv2的安装脚本

cd $P4_HOME 
 
touch Ins_Bmv2.sh

chmod +x Ins_Bmv2.sh

然后把下面的内容,复制到Ins_Bmv2.sh中

#!/bin/bash

#Print script commands and exit on errors.
set -xe

#Get the number of cores to speed up the compilation process
NUM_CORES=`grep -c ^processor /proc/cpuinfo`

 #--- Bmv2 --- #
cd behavioral-model
./autogen.sh
./configure --enable-debugger --with-pi
make -j${NUM_CORES}
sudo make install
sudo ldconfig
 #Simple_switch_grpc target
cd targets/simple_switch_grpc
./autogen.sh
./configure --with-thrift
make -j${NUM_CORES}
sudo make install
sudo ldconfig
cd ../../..

运行Ins_Bmv2.sh,完成Bmv2的安装。

10.P4C安装

P4C组件的安装十分重要。而且P4C的版本在GitHub上一直在更新,语法会有变化,所以在下载的时一定要注意安装Tutorials给的版本。
首先创建P4C的安装脚本

cd $P4_HOME 
 
touch Ins_P4C.sh

chmod +x Ins_P4C.sh

然后把下面的内容,复制到Ins_P4C.sh中

#!/bin/bash

#Print script commands and exit on errors.
set -xe

#src
P4C_COMMIT="69e132d0d663e3408d740aaf8ed534ecefc88810"    #August 10, 2019

#Get the number of cores to speed up the compilation process
NUM_CORES=`grep -c ^processor /proc/cpuinfo`

#--- P4C --- #
git clone https://github.com/p4lang/p4c
cd p4c
git checkout ${P4C_COMMIT}
git submodule update --init --recursive
mkdir -p build
cd build
cmake ..
make -j${NUM_CORES}
sudo make install
sudo ldconfig
cd ../..

运行Ins_P4C.sh,完成P4C的安装。
至此,P4编程环境已经搭建完成。

11.Tutorials 安装

Tutorials主要提供官方的P4开发的案例,如果没有需要可以不进行安装。
在P4路径下执行如下命令即可

sudo pip install crcmod

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

结果

安装完成之后,P4目录中文件如下

P4
├── behavioral-model ## BMv2 软件交换机
├── grpc ## 作为BMv2的依赖
├── mininet ## mininet 网络仿真
├── p4c ## p4c 编译器
├── PI ## PI P4 runtime库
├── protobuf ## 作为依赖
└── tutorials #### 教程目录,以及以后主要的学习,实验

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!