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
语言的学习环境的配置介绍,并不涉及 P4
语言本身。
另,物理机的配置也尝试了,但目前仍存在问题,预期会来一篇 experience。
这里是暂留的链接。
从我两天多的配置经验来看,如果仅为学习,可能还是虚拟机环境更加方便。
为了下次配置或其他不时之需,特别火速更新这篇文章。
使用虚拟机环境配置的最大难点在于网络的不稳定,可能导致浪费大量时间。
配置过程简述
参考资料与虚拟机来源:p4lang/tutorials
提前准备
配置服务器下载代理
warning
此部分仅供技术学习之用,其他情况笔者概不负责,请读者自觉遵守相关法律法规。
由于配置过程中,会频繁的使用 git
工具下载项目与自动配置依赖,因此国内的读者提前配置代理能够大大加快配置速度。
由于客观原因,现在常用的代理协议有 socks5
与 http(s)
。
Privoxy: socks5 -> http
部分软件的代理设置是不支持 socks5
协议的,因此需要将其转换为更通用的 http
协议。
这里引入新的工具 -- Privoxy。
sudo apt update
sudo apt install privoxy
我们的需要比较简单,将原本为 socks5
协议的某端口数据转换为 http
协议并转发至另一端口。
修改其配置文件 config,默认路径为 /etc/privoxy/config:
sudo vim /etc/privoxy/config
# 找到 listen-address 行,修改端口
# 该行表示 privoxy 监听的端口,即转换协议后使用的端口
# 建议 ip 设置为 0.0.0.0,后续环境虚拟机需要访问
listen-address [ip]:[http-port]
# 末尾加入转发设置,监听 socks5 协议的端口
# 注意后面有 '.'
forward-socks5 / [ip]:[socks5-port] .
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 至更新版本。
修改虚拟机目录下的配置文件 ./tutorials/vm-ubuntu-20.04/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 stop
与 make clean
。
最后
安装 p4
的学习环境总体来说,emmmm,有点因小失大。 但目前来看还是有用的。
这篇主要也就相当于手动存个档。