
。该软件交换机采用C++11编写,以P4编译器(如https://github.com/p4lang/p4c%EF%BC%89%E7%94%9F%E6%88%90%E7%9A%84JSON%E6%96%87%E4%BB%B6%E4%BD%9C%E4%B8%BA%E8%BE%93%E5%85%A5%EF%BC%8C%E9%80%9A%E8%BF%87%E8%A7%A3%E9%87%8A%E8%AF%A5%E6%96%87%E4%BB%B6%E6%9D%A5%E5%AE%9E%E7%8E%B0P4%E7%A8%8B%E5%BA%8F%E6%89%80%E6%8C%87%E5%AE%9A%E7%9A%84%E6%95%B0%E6%8D%AE%E5%8C%85%E5%A4%84%E7%90%86%E8%A1%8C%E4%B8%BA%E3%80%82
本仓库包含多种行为模型变体的代码,例如simple_switch、simple_switch_grpc、psa_switch等。有关这些变体的差异详情,请参见此处。
bmv2并非生产级软件交换机,其设计目的是作为开发、测试和调试P4数据平面及相关控制平面软件的工具。因此,bmv2在吞吐量和延迟等性能指标上显著低于Open vSwitch等生产级软件交换机。有关bmv2性能的更多信息,请参考此文档。
在Ubuntu 16.04上,需要安装以下软件包:
还需从源码安装以下依赖(可使用travis/目录下的安装脚本):
若要使用CLI,需安装https://github.com/nanomsg/nnpy Python包,可使用travis/install-nnpy.sh脚本。
为简化操作,我们提供了install_deps.sh脚本,可在Ubuntu 14.04上安装所有所需依赖。
Travis回归测试当前在Ubuntu 14.04上运行。
在MacOS上,可使用tools/macos/bootstrap_mac.sh脚本通过homebrew安装上述所有依赖。注意,编译代码需XCode 8或更高版本。
bash1. ./autogen.sh 2. ./configure 3. make 4. [sudo] make install # 如需安装bmv2
此外,在Linux上,安装bmv2后可能需要运行sudo ldconfig以刷新共享库缓存。
默认启用调试日志。若出于性能考虑需禁用,可在configure脚本中传递--disable-logging-macros参数。
在"调试模式"下,建议禁用编译器优化并启用二进制符号:
bash./configure 'CXXFLAGS=-O0 -g'
可通过向configure传递--enable-debugger参数启用新的bmv2调试器。
要运行单元测试,只需执行:
bashmake check
若运行测试(make check)时出现nanomsg错误,请尝试以sudo权限运行
要在bmv2中运行自定义P4程序,需先将P4代码编译为软件交换机可解析的JSON表示,该表示将告知bmv2需初始化哪些表、如何配置解析器等。
目前p4lang上有2个支持bmv2的P4编译器:
simple_switch二进制文件执行,为PSA编写的程序可通过psa_switch执行。有关这些变体的差异详情,请参见此处。假设已安装p4c编译器,可通过以下命令为P4_16 v1model程序生成JSON文件:
bashp4c --target bmv2 --arch v1model --std p4-16 <prog>.p4
这将创建<prog>.json输出文件,可将其提供给bmv2的simple_switch二进制文件:
bashsudo ./simple_switch -i 0@<iface0> -i 1@<iface1> <prog>.json
在此示例中,<iface0>和<iface1>是绑定到交换机的接口(分别作为端口0和1)。
CLI代码位于tools/runtime_CLI.py,使用方法如下:
bash./runtime_CLI.py --thrift-port 9090
CLI连接到每个交换机进程中运行的Thrift RPC服务器。9090是默认端口,若在同一台机器上运行多个设备,需为每个设备提供不同端口。一个CLI实例只能连接一个交换机设备。
CLI基于Python的cmd模块实现,支持自动补全。查看代码可了解支持的命令列表,包括:
CLI包含用于配置组播引擎的命令。由于提供了2种不同引擎(SimplePre和SimplePreLAG),启动CLI时需使用*--pre选项指定目标使用的引擎,可接受值为:None、SimplePre(默认值)和SimplePreLAG*。l2_switch目标使用SimplePre引擎,simple_switch目标使用SimplePreLAG引擎。
可查看l2_switch和simple_router的commands.txt文件了解CLI使用示例。
要启用调试器,需确保在configure时传递--enable-debugger标志。启动交换机时还需使用--debugger命令行标志。
交换机运行时,可使用tools/p4dbg.py附加调试器:
bashsudo ./p4dbg.py [--thrift-port <port>]
启动交换机时,使用*--nanolog命令行选项启用事件日志。例如,使用ipc地址ipc:///tmp/bm-log.ipc*:
bashsudo ./simple_switch -i 0@<iface0> -i 1@<iface1> --nanolog ipc:///tmp/bm-log.ipc <JSON文件路径>
交换机运行时,使用tools/nanomsg_client.py:
bashsudo ./nanomsg_client.py [--thrift-port <port>]
该脚本将显示每个数据包的重要事件(表命中/未命中、解析器转换等)。
部分目标(simple_switch和simple_switch_grpc)允许用户在运行时动态加载共享库,通过目标特定的命令行选项--load-modules实现,该选项接受逗号分隔的共享对象列表作为参数。此功能当前仅在支持dlopen的系统上可用。确保共享对象对动态加载器可见(例如在Linux上适当设置LD_LIBRARY_PATH)。配置bmv2时可使用--enable-modules/--disable-modules控制此功能,默认在支持dlopen的系统上启用。
我们将在单独文档中提供更多信息,但可立即使用simple_router目标测试Mininet集成。
在第一个终端中,执行:
bash- cd mininet - sudo python 1sw_demo.py --behavioral-exe ../targets/simple_router/simple_router --json ../targets/simple_router/simple_router.json
在第二个终端中:
bash- cd targets/simple_router - ./runtime_CLI < commands.txt
此时交换机已运行且表已填充。可在Mininet中运行pingall,或在主机h1和h2之间使用iperf启动TCP流。
若使用simple_switch运行P4程序(而非上述示例中的simple_router),只需通过--behavioral-exe向1sw_demo.py提供相应的simple_switch二进制文件。
bmv2并非生产级软件交换机。有关bmv2性能的更多信息,请参考此文档。
首先可查看targets/目录。我们还开始编写一些doxygen文档,专门针对希望使用bmv2构建块实现自定义交换机模型的程序员。若已安装doxygen,可通过运行doxygen Doxyfile生成文档,输出位于doxygen-out目录下,也可在线浏览。
目前,已知以下P4_14功能不受支持:
若发现更多缺失功能或希望添加特定功能,请发送邮件至***,或在https://github.com/p4lang/behavioral-model/issues%E4%B8%8A%E6%8F%90%E4%BA%A4%E5%B8%A6%E6%9C%89%E9%80%82%E5%BD%93%E6%A0%87%E7%AD%BE%E7%9A%84issue%E3%80%82%E6%AC%A2%E8%BF%8E%E8%B4%A1%E7%8C%AE%E4%BB%A3%E7%A0%81%EF%BC%81
请在https://github.com/p4lang/behavioral-model/issues%E4%B8%8A%E6%8F%90%E4%BA%A4%E5%B8%A6%E6%9C%89%E9%80%82%E5%BD%93%E6%A0%87%E7%AD%BE%E7%9A%84issue%E3%80%82
参见CONTRIBUTING.md。
您可以使用以下命令拉取该镜像。请将 <标签> 替换为具体的标签版本。如需查看所有可用标签版本,请访问 标签列表页面。
探索更多轩辕镜像的使用方法,找到最适合您系统的配置方式
通过 Docker 登录认证访问私有仓库
无需登录使用专属域名
Kubernetes 集群配置 Containerd
K3s 轻量级 Kubernetes 镜像加速
VS Code Dev Containers 配置
Podman 容器引擎配置
HPC 科学计算容器配置
ghcr、Quay、nvcr 等镜像仓库
Harbor Proxy Repository 对接专属域名
Portainer Registries 加速拉取
Nexus3 Docker Proxy 内网缓存
需要其他帮助?请查看我们的 常见问题Docker 镜像访问常见问题解答 或 提交工单
docker search 限制
站内搜不到镜像
离线 save/load
插件要用 plugin install
WSL 拉取慢
安全与 digest
新手拉取配置
镜像合规机制
不支持 push
manifest unknown
no matching manifest(架构)
invalid tar header(解压)
TLS 证书失败
DNS 超时
域名连通性排查
410 Gone 排查
402 与流量用尽
401 认证失败
429 限流
D-Bus 凭证提示
413 与超大单层
来自真实用户的反馈,见证轩辕镜像的优质服务