Skip to main content

P4 语言虚拟机学习环境部署

· 9 min read
IceyBlackTea

If you are starting this tutorial at one of the proctored tutorial events, then we've already provided you with a virtual machine that has all of the required software installed.

Otherwise, to complete the exercises, you will need to either build a virtual machine or install several dependencies.

p4 logo
主体内容 2021-09-14

虚拟机学习环境

首先提前声明,本篇文字仅为 P4 语言的学习环境的配置介绍,并不涉及 P4 语言本身。

另,物理机的配置也尝试了,但目前仍存在问题,预期会来一篇 experience。

这里是暂留的链接。

从我两天多的配置经验来看,如果仅为学习,可能还是虚拟机环境更加方便。

为了下次配置或其他不时之需,特别火速更新这篇文章。

使用虚拟机环境配置的最大难点在于网络的不稳定,可能导致浪费大量时间。

配置过程简述

参考资料与虚拟机来源:p4lang/tutorials

提前准备

配置服务器下载代理

warning

此部分仅供技术学习之用,其他情况笔者概不负责,请读者自觉遵守相关法律法规。

由于配置过程中,会频繁的使用 git 工具下载项目与自动配置依赖,因此国内的读者提前配置代理能够大大加快配置速度。

由于客观原因,现在常用的代理协议有 socks5http(s)

Privoxy: socks5 -> http

部分软件的代理设置是不支持 socks5 协议的,因此需要将其转换为更通用的 http 协议。

这里引入新的工具 -- Privoxy。

sudo apt update
sudo apt install privoxy

我们的需要比较简单,将原本为 socks5 协议的某端口数据转换为 http 协议并转发至另一端口。

修改其配置文件 config,默认路径为 /etc/privoxy/config:

打开配置文件 config
sudo vim /etc/privoxy/config
修改配置文件 config
# 找到 listen-address 行,修改端口
# 该行表示 privoxy 监听的端口,即转换协议后使用的端口
# 建议 ip 设置为 0.0.0.0,后续环境虚拟机需要访问
listen-address [ip]:[http-port]

# 末尾加入转发设置,监听 socks5 协议的端口
# 注意后面有 '.'
forward-socks5 / [ip]:[socks5-port] .
重启 Privoxy 服务,应用设置
sudo systemctl restart privoxy

# 可查看服务状态
systemctl status privoxy

你已经完成了整个实验最难的一步!

现在,在原本仅有 socks5 协议的基础上,新增了 http 协议。

对于各工具代理的设置,以下内容仅供参考,亦可自行查阅。

git proxy
# 协议视情况可使用 socks 或 http
git config --global http.proxy '[protocol]://[ip]:[port]'
git config --global https.proxy '[protocol]://[ip]:[port]'
curl proxy
# open file
$ vim ~/.curlrc

# wirte in
[protocol] = "[ip]:[port]"
wget proxy

wget 不支持 socks5 协议。

# open file
$ vim ~/.wgetrc

# write in
http_proxy = http://[ip]:[port]/
https_proxy = http://[ip]:[port]/
note

其他代理可视需要自行添加。

下载虚拟机镜像

虚拟机镜像不算特别大,但也不小,可以另行下载以节省时间。

教程选用的虚拟机版本为 ubuntu-20.04,虚拟机命名为 bento/ubuntu-20.04

官方下载链接为vagrant/ubuntu-20.04

下载教程项目

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

下载虚拟机依赖

教程的虚拟机使用了 Vagrant,并依赖于 VitualBox

sudo apt update
sudo apt install vagrant
sudo apt virtualbox

安装虚拟机并配置

添加镜像

若选择在线安装镜像,可跳过该步骤。

下载的虚拟机镜像,可以采用离线安装。

在该教程中,虚拟机名为 bento/ubuntu-20.04

vagrant box add --name [box-name] ./[box-path]

设置虚拟机配置

若不需要代理,可跳过设置代理部分,但仍需检查配置文件。

由于虚拟机开机后会首先配置相关项目代码与依赖,同样有代理的下载与配置步骤,因此配置代理可大大加速并防止因网络问题导致配置失败。

另,vagrant 虚拟机代理不支持 socks5 协议。

首先,下载 vagrant 的代理插件 vagrant-proxyconf:

vagrant plugin install vagrant-proxyconf
important

ubuntu 16.04 的物理机,默认 apt 安装的 vagrant(version: 2.0.2) 会因版本问题产生一个bug,或将导致无法安装 vagrant 插件。请手动升级 vagrant 至更新版本。

可参考 vagrant-vbguest/issues

修改虚拟机目录下的配置文件 ./tutorials/vm-ubuntu-20.04/Vagrantfile:

Vagrantfile
Vagrant.configure(2) do |config|
# 可在此处添加代理相关设置
# 特别的,ip地址 10.0.2.2 将被 vagrant 视为物理机地址
if Vagrant.has_plugin?("vagrant-proxyconf")
config.proxy.http = "http://10.0.2.2:[port]"
config.proxy.https = "http://10.0.2.2:[port]"
config.proxy.no_proxy = "localhost,127.0.0.1,.example.org"
end
#

config.vm.box = "bento/ubuntu-20.04"
config.vm.define "p4-tutorial" do |tutorial|
end
config.vm.provider "virtualbox" do |vb|
vb.name = "P4 Tutorial" + Time.now.strftime(" %Y-%m-%d")
vb.gui = false # 如果是非图形界面一定要改为 false !
vb.memory = 2048
vb.cpus = 2
vb.customize ["modifyvm", :id, "--cableconnected1", "on"]
vb.customize ["storageattach", :id,
"--storagectl", "IDE Controller",
"--port", "0", "--device", "0",
"--type", "dvddrive",
"--medium", "emptydrive"]
vb.customize ["modifyvm", :id, "--vram", "32"]

end

# 之后的内容省略,正常情况无需修改

启动虚拟机并等待

启动虚拟机后,其将会参照 P4 教程设定的脚本自行配置环境,期间涉及下载、编译等步骤,预计时间较长,大概率将会超过 1 个小时。

# 建议使用 root 权限避免其他问题
# 但要注意 vagrant 虚拟机是跟随用户的
sudo vagrant up

特别的,如果你的虚拟机在配置或使用过程中存在问题,可以考虑清空虚拟机并重新安装。

sudo vagrant halt    # poweroff
sudo vagrant destroy # delete vms

进入虚拟机测试

使用命令可类似 ssh 控制虚拟机。

sudo vagrant ssh

虚拟机的默认账户为 vagrant (密码一致),实验的账户为 p4 (密码一致)。

切换用户为 p4 后,可进入文件夹的 ~/tutorials/exercises/basic 运行测试。

su p4
cd tutorials/exercises/basic
cp solution/basic.p4 basic.p4
make run

运行成功后,将会进行 mininet 程序,可输入 h1 ping h2 指令查看。

mininet> h1 ping p2
important

如果 make run 出现类似 status = StatusCode.UNAVAILABLE, details = "Socket closed" 的报错,可能是 Vagrant 代理设置与虚拟机网络配置冲突,可将 Vagrantfile 的代理部分删去并重启 Vagrant 测试。

再次 make run 之前,请使用 make stopmake clean


最后

安装 p4 的学习环境总体来说,emmmm,有点因小失大。 但目前来看还是有用的。

这篇主要也就相当于手动存个档。

喜欢就点个赞吧~