P4语言环境快速安装配置

环境

观察发现,网上有关于 P4 环境的搭建都是在 Ubuntu 中进行的,所以我这次也准备从众,使用 Ubuntu 系统对 P4 语言的环境进行安装配置。 本来是准备在之前安好 Ubuntu 的 ChromeBook 中进行这次实验,但是由于最近国内长城城墙突然变高,GitHub 连接速度非常慢,而且容易超时,所以我在这里开了一台国际版 azure 虚拟机作为实验之用,如果是在国内使用,推荐挂载 VPN 或者 SS 之类的 socket5 代理进行操作。 我选择了 Ubuntu14.04 作为安装的系统环境。在安装之前,需要先下载 P4 的源码,这里直接使用 p4factory,而不是去分别安装每一个模块。

下载 P4factory

p4factory 的 Github 地址:https://github.com/p4lang/p4factory 在 Ubuntu 中直接使用 git 工具 clone 仓库即可。

1
2
3
4
mkdir ~/p4
cd ~/p4
git clone https://github.com/p4lang/p4factory.git
cd p4factory

安装/升级依赖模块

p4 运行环境需要依赖许多其他 github 上的模块,在官方的 Readme 中,推荐使用 git submodule update 将子模块升级到最新版,但是在升级某些项目的时候会被 github 禁止。解决的方法很简单,生成 SSH key,并且添加到 Github 中即可。

生成 SSH key

设置 git 的 username 和 password:

1
2
git config --global user.name "JasonBian"
git config --global user.email "Jason@xxx.com"

进入目录查看是否已经有 ssh key

1
cd ~/.ssh

如果有的话就备份一下然后删除,没有的话就不用去管。 接着就是生成 ssh key

1
ssh-keygen -t rsa -C "jason@xxx.com"

连续按三次回车,生成成功!然后可以在.ssh 目录看见两个文件:id_rsaid_rsa.pub,其中 id_rsa 是私钥,由自己保存,id_rsa.pub 是公钥,需要放在 Github 中去。 然后,把 id_rsa.pub 中的内容拷贝到 Github 中: 登陆 Github,点击头像进入 Settings,找到 SSH and GPG keys,点击 new SSH key,随便起一个 title,然后

1
cat id_rsa.pub

将输出内容复制到 key 的输入框中 Add 即可(此时 github 需要你再次输入密码,并且添加成功之后会有邮件通知)。 最后,测试一下有没有安装成功~

1
2
3
4
5
6
7
8
$ssh git@github.com
The authenticity of host 'github.com (192.30.253.113)' can't be established.
RSA key fingerprint is 16:27:ac:a5:76:28:2d:36:63:1b:56:4d:eb:df:a6:48.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'github.com,192.30.253.113' (RSA) to the list of known hosts.
PTY allocation request failed on channel 0
Hi imaginezz! You've successfully authenticated, but GitHub does not provide shell access.
Connection to github.com closed.

出现上述提示说明已经安装成功。另外,也可以看见 github 中刚刚添加的 sshkey 变成了绿色。

继续升级依赖模块

添加完 ssh key 以后,就可以放心升级依赖模块啦。

1
2
cd ~/p4/p4factory
git submodule update --init --recursive

安装环境依赖

p4 的源码非常复杂,主要由 python 和 c++开发,所以环境依赖就更是复杂。好在官方提供了 install_deps.sh 脚本,可以一键安装所有的环境依赖。执行方式很简单:

1
sudo ./install_deps.sh

接下来,脚本就会自动使用 apt 和 pip 安装所需要的依赖包,并且也会对一些依赖包进行编译安装。这个时间可以刚好去泡一壶茶。

不过我在安装 thrif 的时候出现了编译错误,大体上错误提示是:thrift ‘SSLv3_method’ was not declared in this scope。我 Google 了一下,发现了一些解决方法。具体可以参考 Github 中这个 issue:https://github.com/ptrkrysik/gr-gsm/issues/155

放在现在的环境中,在出现错误退出以后,会多一个 install_temp 的目录,先别急着删除,进入 thrift 的文件中

1
sudo vim install_tmp/thrift-0.9.2/lib/cpp/src/thrift/transport/TSSLSocket.cpp

搜索

1
ctx_ = SSL_CTX_new(SSLv3_method())

并改为

1
ctx_ = SSL_CTX_new(SSLv23_method())

然后退回 p4factory 文件夹,修改 install_deps.sh 文件。

1
2
cd -
sudo vim install_deps.sh

做如下修改:

1
2
3
4
5
6
7
8
9
69 行
mkdir install_tmp
修改为
#mkdir install_tmp

76 行
cd test/cpp ;ln -s . .libs ; cd ../..
修改为
test/cpp ;
1
2
#ln -s . .libs ;
cd ../..

然后执行

1
sudo ./install_deps.sh

重新安装环境依赖,这时候应该就可以正常跑完了。

最后,安装 veth(虚拟以太网)接口

1
sudo ./tools/veth_setup.sh

进行编译

1
2
sudo ./autogen.sh
sudo ./configure

编译过程没出现什么问题,现在应该已经可以正常使用整个环境了。

测试 basic_routing

安装完成以后可以跑一段官方 demo 验证是否可以跑起来。跟着文档走,选择测试 basic_routing。 首先对 P4 工程进行编译,然后运行 bm

1
2
3
cd p4factory/targets/basic_routing/
sudo make bm
sudo ./behavioral-model

紧接着,打开另一个终端,进入 basic_routing 文件夹

1
2
cd ~/p4/p4factory/targets/basic_routing/
sudo python run_tests.py --test-dir tests/ptf-tests/

当测试代码运行完成以后,可以看见之前启动 bm 的终端已经显示了在发包时候的具体操作,说明 P4 已经可以正常运行了。