目录
- 一、前言
- [二、 bmv2安装部署](#二、 bmv2安装部署)
-
- 1、系统环境
-
- [1.1 操作系统要求](#1.1 操作系统要求)
- [1.2 硬件要求](#1.2 硬件要求)
- [1.3 软件依赖](#1.3 软件依赖)
- 2、ubuntu中安装bmv2
-
- [1.1 初始化配置](#1.1 初始化配置)
- [1.2 执行安装 bmv2](#1.2 执行安装 bmv2)
- [三、 p4c安装部署](#三、 p4c安装部署)
- 四、Mininet部署安装
- [五、验证 bmv2 运行功能](#五、验证 bmv2 运行功能)
-
- [创建一个 test.p4 文件](#创建一个 test.p4 文件)
- 编译
一、前言
- bmv2(Behavioral Model version 2),是一个开源的软件交换机模拟器。
- 它允许研究人员和工程师编写、测试和调试网络数据包的处理程序进行自定义网络通信,是学习P4编程和验证网络的重要工具。
- 也就是说,通过bmv2,你可以看到硬件交换机内部是如何运行的。
- 接下来的内容,详细介绍了bmv2的部署方法。
二、 bmv2安装部署
1、系统环境
1.1 操作系统要求
-
推荐使用Ubuntu 18.04 LTS或20.04 LTS版本
lsb_release -a #ubuntu查看版本
1.2 硬件要求
- 最低配置:
- CPU:双核2.0GHz
- 内存:4GB
- 磁盘空间:20GB
- 推荐配置:
-
CPU:四核3.0GHz及以上
-
内存:8GB及以上
-
磁盘空间:50GB及以上
lscpu #ubuntu中查看CPU信息
free -h #ubuntu查看内存信息
df -H #ubuntu查看磁盘空间
-
1.3 软件依赖
- 必须:
- g++ (版本7.0及以上)
- CMake (版本3.10及以上)
- Python 3 (版本3.6及以上)
- pip3 (用于安装Python依赖包)
- 可选:
- Wireshark (用于数据包分析)
- Mininet (用于网络仿真测试)
- Git (用于源码管理)
2、ubuntu中安装bmv2
1.1 初始化配置
-
设置目标版本(强制使用 20.04 的仓库):
export TARGET_RELEASE="20.04" -
添加仓库源列表:
echo "deb https://download.opensuse.org/repositories/home:/p4lang/xUbuntu_${TARGET_RELEASE}/ /" | sudo tee /etc/apt/sources.list.d/home:p4lang.list -
下载并添加 GPG 密钥(:
curl -fsSL https://download.opensuse.org/repositories/home:/p4lang/xUbuntu_20.04/Release.key | sudo gpg --dearmor -o /etc/apt/trusted.gpg.d/home_p4lang.gpg

-
更新本地软件包列表
sudo apt update
1.2 执行安装 bmv2
-
安装命令
sudo apt install p4lang-bmv2 #命令会把 simple_switch、simple_switch_grpc 等核心程序以及必要的库文件一并安装好。

三、 p4c安装部署
p4c描述
- P4c是一款针对P4编程语言的编译器。
- P4编程语言(Programming Protocol-independent Packet Processors)是一种专为网络数据设计的语言
- p4语言用于自定义网络设备(如交换机、网卡)如何处理和转发数据包。
p4c安装
-
添加 P4 语言所需的第三方依赖仓库
sudo add-apt-repository ppa:frederic-loui/p4lang-3rd-party-focal
-
添加 P4 编译器主分支的每日构建版本仓库
sudo add-apt-repository ppa:frederic-loui/p4lang-master-focal-nightly
-
更新软件包列表
sudo apt update
-
安装 P4 编译器以及其他运行库
sudo apt install p4c p4lang-pi
验证安装
p4c --version
which simple_switch
simple_switch --version
which simple_switch_CLI
which bm_CLI
which runtime_CLI.py

四、Mininet部署安装
Mininet描述
- Mininet是一款强大的网络仿真(emulation)工具
- 可以在一台电脑上,用一条命令就能创建出包含交换机、主机和控制器的虚拟网络。
- Mininet是学习、开发和测试网络技术的利器。
Mininet部署安装
-
获取源码
git clone https://github.com/mininet/mininet.git -
安装完整工具链 (Mininet + Open vSwitch + Wireshark):
cd mininet sudo ./util/install.sh -n3v # -n 表示Mininet,-v表示Open vSwitch,-3表示Wireshark
-
验证安装
mn --version
五、验证 bmv2 运行功能
创建一个 test.p4 文件
cat > /myproject/test.p4 << 'EOF'
#include <core.p4>
#include <v1model.p4>
typedef bit<48> macAddr_t;
typedef bit<32> ipv4Addr;
header ethernet_t {
macAddr_t dstAddr;
macAddr_t srcAddr;
bit<16> etherType;
}
struct metadata { }
struct headers {
ethernet_t ethernet;
}
parser MyParser(packet_in packet, out headers hdr, inout metadata meta,
inout standard_metadata_t standard_metadata) {
state start {
packet.extract(hdr.ethernet);
transition accept;
}
}
control MyVerifyChecksum(inout headers hdr, inout metadata meta) {
apply { }
}
control MyIngress(inout headers hdr, inout metadata meta,
inout standard_metadata_t standard_metadata) {
apply {
// 简单转发:将包从端口 0 发出,并修改目的 MAC 地址为广播地址
hdr.ethernet.dstAddr = 0xFFFFFFFFFFFF;
standard_metadata.egress_spec = 0;
}
}
control MyEgress(inout headers hdr, inout metadata meta,
inout standard_metadata_t standard_metadata) {
apply { }
}
control MyComputeChecksum(inout headers hdr, inout metadata meta) {
apply { }
}
control MyDeparser(packet_out packet, in headers hdr) {
apply {
packet.emit(hdr.ethernet);
}
}
V1Switch(MyParser(), MyVerifyChecksum(), MyIngress(), MyEgress(),
MyComputeChecksum(), MyDeparser()) main;
EOF
编译
-
当前目录下会生成 test.json 文件
p4c --target bmv2 --arch v1model test.p4 -o test.json

- bmv2全功能部署成功。