目录
- 一、前言
- 二、windows下部署ubuntu
-
- [启用并安装 WSL 2 环境](#启用并安装 WSL 2 环境)
- [Ubuntu (WSL) 中安装依赖](#Ubuntu (WSL) 中安装依赖)
- [编译与安装 bmv2](#编译与安装 bmv2)
- [安装 P4 编译器](#安装 P4 编译器)
- bmv2使用方法
一、前言
- bmv2(Behavioral Model version 2),是一个开源的软件交换机模拟器,通过bmv2,你可以看到硬件交换机内部是如何处理数据的,是网络工程师和网络开发人员学习和测试的重要工具。
- 我们平时使用的抓包工具与其它流量分析工具,只能从交换机的接口数据,来间接的分析交换机的内部行为,没有bmv2直观真实。
- bmv2默认部署在linux平台,但在办公和学习中,大多数人的电脑使用的是windows操作系统,所以,今天我们就说说bmv2在windows10平台的部署与使用方法。

二、windows下部署ubuntu
启用并安装 WSL 2 环境
- WSL 2(Windows Subsystem for Linux 2)是微软为 Windows 10 和 Windows 11
用户提供的虚拟化方案,它可以在 Windows 上运行 Linux 。是 Windows 下进行 Linux 开发、容器化部署及 AI
训练的首选环境。
1、 启用 WSL:
-
以管理员身份打开 PowerShell 或命令提示符,运行以下命令并重启电脑:
Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux
2、安装 Ubuntu:
-
从 Microsoft Store 搜索并安装 "Ubuntu 20.04" 或 "Ubuntu 22.04"。安装完成后启动,并设置用户名和密码。

Ubuntu (WSL) 中安装依赖
-
在 WSL 终端中,需要先更新软件源并安装 bmv2 所需的编译工具和库。
sudo apt update sudo apt install -y git build-essential cmake libgmp-dev libpcap-dev \ libboost-all-dev libssl-dev python3 python3-pip
编译与安装 bmv2
1、 克隆代码:
```
git clone https://github.com/p4lang/behavioral-model.git
```
2、安装 Python 依赖:
-
高版本的ubuntu可能启用了保护机制,禁止直接使用 pip3 在系统级安装 Python 包,所以,我们需要在虚拟环境中安装
-
安装虚拟环境工具:
sudo apt install python3-venv python3-full -y -
在 behavioral-model 目录下创建虚拟环境
cd ~/behavioral-model python3 -m venv venv -
激活虚拟环境
source venv/bin/activate -
安装依赖
sudo apt update sudo apt install -y autoconf automake libtool cmake libgmp-dev libpcap-dev libboost-all-dev libssl-dev libevent-dev libthrift-dev thrift-compiler libnanomsg-dev
3、编译安装bmv2
-
生成配置并编译
./autogen.sh ./configure --enable-debugger make -j$(nproc) sudo make install sudo ldconfig
4、验证安装
-
退出虚拟环境
deactivate -
检查 simple_switch 是否可用
simple_switch --version -
如果 simple_switch --version 正常输出版本信息,说明安装成功

安装 P4 编译器
1、安装 p4c
-
bmv2 需要由 p4c 编译器生成的 JSON 文件来驱动
-
确认你的 Ubuntu 版本
lsb_release -a
-
克隆 P4c 源码
git clone --recursive https://github.com/p4lang/p4c.git -
编译安装p4c
2、验证p4c安装情况
-
如果p4c --version 正常输出版本信息,说明安装成功
p4c --version
bmv2使用方法
1、编写P4程序:
-
bmv2 需要一个 JSON 格式的配置文件,这个文件由 p4c 编译器从 P4 源代码生成。以下是一个实现交换机透传功能的p4程序。可以验证你的 bmv2 环境是否正常。
#include <core.p4> #include <v1model.p4> header ethernet_t { bit<48> dstAddr; bit<48> 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->1, 1->0 if (standard_metadata.ingress_port == 0) { standard_metadata.egress_spec = 1; } else if (standard_metadata.ingress_port == 1) { standard_metadata.egress_spec = 0; } else { standard_metadata.egress_spec = 9; // drop } } } 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; -
编译p4文件为json文件
p4c --target bmv2 --arch v1model --std p4-16 pass.p4 -o pass.json
2、创建虚拟接口:
-
为了让数据能进出 bmv2 这个"软件 交换机",你需要创建一对虚拟网卡作为连接端口。
# 创建一对名为 veth0 和 veth1 的虚拟网卡 sudo ip link add veth0 type veth peer name veth1 sudo ip link set veth0 up sudo ip link set veth1 up
3、启动交换机:运行 simple_switch(bmv2的一个具体实现),加载你写好的P4程序。
-
使用 simple_switch 命令启动,将虚拟网卡绑定为交换机的端口
# -i 0@veth0 表示将交换机的端口 0 绑定到 veth0 接口 # --nanolog 用于指定事件记录器的 IPC 地址 sudo simple_switch -i 0@veth0 -i 1@veth1 \ --nanolog ipc:///tmp/bm-log.ipc \ pass.json
4、打开"观察窗口"开始观察:
-
事件记录器:打开一个新的终端,运行下面的命令。之后,只要有任何数据包经过交换机,这个窗口就会实时打印出内部处理过程,比如数据包从哪个端口进来、匹配了哪张表、执行了什么动作、又从哪个端口转发出去等。
sudo nanomsg_client.py --thrift-port 9090 -
抓包工具:你也可以像监控真实网卡一样,在 veth0 或 veth1 上使用 tcpdump 抓包,从外部观察数据包的原始样子。
sudo tcpdump -i veth0 -vvv -e
5、发送一个ping包,观察事件记录器
-
这时候,你应该能在观察窗口中看到数据的处理过程了
ping -I veth0 192.168.100.2 -c 3