# 前言
由于 P4 相关组件的升级,Python 支持从 2.x 升级为 3.x,本文基于 Ubuntu 20.04 + Python3.8 进行 P4 环境的搭建。
本教程安装脚本由 poohdang 提供,在 poohdang 脚本基础之上做了微调和补充。
# 系统环境
| 项目 | 详情 |
|---|---|
| 系统 | Ubuntu 20.04 |
| 内存 | 推荐 3G 以上 |
| 存储 | 推荐 25G 以上 |
| Python 版本 | 3.x |
请确保 python 命令可以访问 python3,使用如下命令绑定并检查:
ln -s /usr/bin/python3.x /usr/bin/python # 将 Python3.x 链接至 Python
# 检查 python 和 pip 是否可以正常使用
python -V
python -m pip -V
# 环境搭建
# 安装 Git
sudo apt update
sudo apt install git
# 设置工作目录并配置环境变量
# 以下目录可自定义
mkdir -p ~/P4 && echo "export P4_HOME=~/P4" >> ~/.bashrc
source ~/.bashrc
cd $P4_HOME # 该环境变量必须生效,后续脚本需要
git clone https://gitee.com/poohdang/p4-env.git
cd p4-env
# 安装依赖
sudo chmod 755 p4*.sh
./p4-deps.sh
# 下载 P4 组件源码
# 组件介绍
| 组件名 | 功能 | 版本 |
|---|---|---|
| mininet | 网络仿真工具 | Latest |
| bmv2 | 支持 P4 编程的软件交换机 | Latest |
| PI | P4 Runtime Server | Latest |
| p4c | P4 编译器 | Latest |
| tutorials | P4 官方提供的快速上手教程 | Latest |
| protobuf | 数据消息交换格式,grpc 的默认选项 | v3.12.2 |
| grpc | 谷歌开发的远程程序调用(RPC)框架,PI 基于此实现 | v1.30.0 |
# 直接下载(推荐)
./p4-git.sh
# 国内镜像加速
使用https://hub.fastgit.org加速的仓库。
./p4-git-china.sh
# 编译并安装
以下内容已失效
在运行安装脚本之前,我们需要手动修改 behavioral-model/install_deps.sh 文件。
BMV2 需要 Thrift 依赖作为支持, 而使用 Thrift 需要首先安装 libssl 。在 Ubuntu 18.04 中,libssl 的 apt 包名为 libssl1.0-dev,在 Ubuntu 20.04 (以及 18.04 之前的版本)中 apt 包名为 libssl-dev。但在 install_deps.sh 中,我们可以看到,开发组在 20.04 仍中使用 libssl1.0-dev ,对此我们进行简单的修改。
vim install_deps.sh
将 if [[ "${ubuntu_release}" > "18" ]] 的条件判断从 > 修改为 =:
ubuntu_release=`lsb_release -s -r`
if [[ "${ubuntu_release}" = "18" ]]
then
# This older package libssl1.0-dev enables compiling Thrift 0.9.2
# on Ubuntu 18.04. Package libssl-dev exists, but Thrift 0.9.2
# fails to compile when it is installed.
# TBD: whether using this package makes a difference for Ubuntu
# 18.04 and Thrift 0.11.0.
LIBSSL_DEV="libssl1.0-dev"
else
LIBSSL_DEV="libssl-dev"
fi
执行安装脚本,并耐心地进行等待。如果配置的内存过低,系统可能会在编译阶段失去响应。
./p4-install.sh
# 为 sudo python 添加模块搜索路径
由于安装过程中,一部分命令需要以 sudo 的权限执行,导致部分 Python 依赖被安装在了 root 用户的目录下,而另一部分被安装在了普通用户的目录下。而我们通常使用 sudo make 运行 P4 程序,在 sudo python 搜索路径中找不到 python 中安装的依赖。
在 /usr/local/lib/python3.8/dist-packages 下新建 xx.pth 文件,输入:
/home/用户名/.local/lib/python3.8/site-packages
/usr/local/lib/python3.8/site-packages
如果你完全使用以上脚本安装,将上述内容写入 xx.pth 中即可正常使用 P4。
可使用以下命令检查 sudo python 的搜索路径:
import sys
sys.path
附上可以正常使用的 path:
'',
'/usr/lib/python38.zip',
'/usr/lib/python3.8',
'/usr/lib/python3.8/lib-dynload',
'/usr/local/lib/python3.8/dist-packages',
'/usr/local/lib/python3.8/dist-packages/protobuf-3.12.2-py3.8-linux-x86_64.egg',
'/usr/local/lib/python3.8/dist-packages/thrift-0.11.0-py3.8-linux-x86_64.egg',
'/home/p4/.local/lib/python3.8/site-packages',
'/usr/local/lib/python3.8/site-packages',
'/usr/lib/python3/dist-packages'