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 | mkdir ~/p4 |
安装/升级依赖模块
p4 运行环境需要依赖许多其他 github 上的模块,在官方的 Readme 中,推荐使用 git submodule update 将子模块升级到最新版,但是在升级某些项目的时候会被 github 禁止。解决的方法很简单,生成 SSH key,并且添加到 Github 中即可。
生成 SSH key
设置 git 的 username 和 password:
1 | git config --global user.name "JasonBian" |
进入目录查看是否已经有 ssh key
1 | cd ~/.ssh |
如果有的话就备份一下然后删除,没有的话就不用去管。 接着就是生成 ssh key
1 | ssh-keygen -t rsa -C "[email protected]" |
连续按三次回车,生成成功!然后可以在.ssh 目录看见两个文件:id_rsa
和 id_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 | $ssh [email protected] |
出现上述提示说明已经安装成功。另外,也可以看见 github 中刚刚添加的 sshkey 变成了绿色。
继续升级依赖模块
添加完 ssh key 以后,就可以放心升级依赖模块啦。
1 | cd ~/p4/p4factory |
安装环境依赖
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 | cd - |
做如下修改:
1 | 69 行 |
1 | #ln -s . .libs ; |
然后执行
1 | sudo ./install_deps.sh |
重新安装环境依赖,这时候应该就可以正常跑完了。
最后,安装 veth(虚拟以太网)接口
1 | sudo ./tools/veth_setup.sh |
进行编译
1 | sudo ./autogen.sh |
编译过程没出现什么问题,现在应该已经可以正常使用整个环境了。
测试 basic_routing
安装完成以后可以跑一段官方 demo 验证是否可以跑起来。跟着文档走,选择测试 basic_routing。 首先对 P4 工程进行编译,然后运行 bm
1 | cd p4factory/targets/basic_routing/ |
紧接着,打开另一个终端,进入 basic_routing 文件夹
1 | cd ~/p4/p4factory/targets/basic_routing/ |
当测试代码运行完成以后,可以看见之前启动 bm 的终端已经显示了在发包时候的具体操作,说明 P4 已经可以正常运行了。