 完整流程)
一、环境准备1.1 系统要求推荐使用Ubuntu 22.04 LTS内核版本5.15 或更高Soft-RoCE 驱动自 Linux 4.8 起已合入内核。普通以太网卡即可无需专用 RDMA 硬件。建议内存至少 4GB。# 确认系统与内核版本lsb_release-auname-r1.2 安装编译依赖从源码编译rdma-coreSoft-RoCE 用户态库和工具的主要来源需要以下依赖sudoapt-getupdatesudoapt-getinstall-y\build-essentialgitcmake ninja-build pkg-config\gcc gmakeautoconf automake libtool\libnl-3-dev libnl-route-3-dev libudev-dev\valgrind python3-dev cython3 python3-docutils pandoc\libibverbs-dev librdmacm-dev ibverbs-utils rdmacm-utils\ibacm infiniband-diags perftest各关键依赖的作用libnl-3-dev和libnl-route-3-dev用于网络接口管理ninja-build是推荐的构建后端valgrind支持内存调试注解perftest提供性能测试工具如ibv_rc_pingpong。1.3 克隆 rdma-core 源码gitclone https://github.com/linux-rdma/rdma-core.gitcdrdma-core建议检查可用的发布版本标签gittag-l|tail-10# 如需切换到特定稳定版本例如 v50.0# git checkout v50.0二、Release 版源码编译安装Release 构建会启用优化-O2并定义NDEBUG适合生产环境和性能测试但会剥离大量调试信息。2.1 标准 Release 构建流程rdma-core使用 CMake 构建系统。其buildlib/RDMA_BuildType.cmake将默认构建类型设为RelWithDebInfo带调试信息的优化构建而Release是专为打包者保留的类型语义上与默认的RelWithDebInfo相同使用-O2 -DNDEBUG。从源码构建 Release 版并安装到系统cdrdma-core# 创建独立构建目录保持源码树干净mkdir-pbuild-releasecdbuild-release# 配置指定 Release 构建类型安装前缀为 /usrcmake-GNinja\-DCMAKE_BUILD_TYPERelease\-DCMAKE_INSTALL_PREFIX/usr\..# 编译使用 ninja 并行构建ninja# 安装到系统sudoninjainstall-DCMAKE_INSTALL_PREFIX/usr确保库文件安装到/usr/lib/x86_64-linux-gnu/头文件到/usr/include/可执行工具到/usr/bin/与系统包管理器安装的路径一致避免库搜索路径冲突。2.2 使用 build.sh 脚本简化构建rdma-core提供了build.sh脚本封装 CMake 流程。它会在当前目录创建build/子目录编译产物位于build/bin/和build/lib/中cdrdma-corebashbuild.sh# 产物路径# build/bin/ -- 可执行工具如 ibv_devinfo, ibv_rc_pingpong# build/lib/ -- 共享库注意build.sh默认使用RelWithDebInfo构建类型。如需强制 Release需通过环境变量传入额外 CMake 标志见下一节。默认情况下build.sh不自动安装到系统适合在构建目录中直接运行工具进行快速验证。三、Debug 版源码编译安装Debug 构建的主要目的是保留完整的调试符号、关闭优化并启用额外的调试代码路径以便使用 GDB 跟踪 rdma-core 的用户态实现或通过日志观察 RXE 驱动的行为。3.1 Debug 构建的 CMake 配置在rdma-core的构建系统中当CMAKE_BUILD_TYPE设置为Debug时会触发以下行为if (CMAKE_BUILD_TYPE STREQUAL Debug OR CMAKE_BUILD_TYPE STREQUAL RelWithDebInfo) add_definitions(-DVERBS_DEBUG) endif()这意味着VERBS_DEBUG宏被定义rdma-core 源码中所有#ifdef VERBS_DEBUG保护下的调试日志、断言和额外检查代码都会被编译进二进制。同时Debug类型默认使用-O0 -g生成完整的 DWARF 调试信息。从源码直接进行 Debug 构建cdrdma-coremkdir-pbuild-debugcdbuild-debug cmake-GNinja\-DCMAKE_BUILD_TYPEDebug\-DCMAKE_INSTALL_PREFIX/usr\-DCMAKE_C_FLAGS-O0 -g3\-DCMAKE_CXX_FLAGS-O0 -g3\..ninjasudoninjainstall-g3比默认的-g包含更多调试信息如宏定义对深入分析实现细节有帮助。3.2 使用 EXTRA_CMAKE_FLAGS 环境变量如果你使用build.sh脚本可以通过EXTRA_CMAKE_FLAGS环境变量传递 Debug 构建标志。这是 rdma-core 官方推荐的覆盖构建类型的方式cdrdma-coreexportEXTRA_CMAKE_FLAGS-DCMAKE_BUILD_TYPEDebug -DENABLE_WERROR1bashbuild.sh-DENABLE_WERROR1将警告视为错误有助于在调试构建中捕捉潜在问题。编译产物位于build/bin/和build/lib/中包含完整的调试符号可直接用 GDB 加载。3.3 验证 Debug 构建是否生效cdrdma-core/build-debug# 检查编译标志grep-rCMAKE_BUILD_TYPECMakeCache.txt# 应输出CMAKE_BUILD_TYPE:STRINGDebug# 确认调试符号存在filebin/ibv_devices# 应包含 with debug_info 或 not stripped# 使用 GDB 验证符号可加载gdb-batch-exinfo sourcesbin/ibv_devices21|head-53.4 Debug 与 Release 构建的差异对比特性ReleaseDebug优化级别-O2-O0调试符号有RelWithDebInfo默认Release 可剥离完整 DWARF-g3更丰富NDEBUG定义关闭assert未定义assert生效VERBS_DEBUG未定义定义启用调试日志和检查适合场景性能测试、生产部署源码阅读、GDB 调试、日志分析四、加载 RXE 内核模块Soft-RoCE 的内核驱动rdma_rxe在现代内核中已内置无需额外编译内核模块。# 加载 RDMA 核心子系统sudomodprobe rdma# 加载 Soft-RoCE 驱动sudomodprobe rdma_rxe# 确认模块已加载lsmod|greprdma_rxe预期输出类似rdma_rxe 163840 0 ib_uverbs 163840 0 rdma_cm 163840 0 ib_core 450560 6 rdma_cm,rdma_rxe,ib_uverbs,...如果rdma_rxe加载失败检查内核配置是否启用了CONFIG_RDMA_RXEgrepCONFIG_RDMA_RXE /boot/config-$(uname-r)# 应输出 CONFIG_RDMA_RXEm五、创建和配置 RXE 设备5.1 使用 rdma link 命令创建 RXE 设备现代推荐方式# 查看网络接口名称假设为 ens33 或 eth0iplinkshow# 创建 RXE 设备绑定到指定以太网接口sudordmalinkaddrxe_ens33typerxe netdev ens33# 验证设备已创建rdmalinkshow成功输出中会显示rxe_ens33设备link rxe_ens33/1 state ACTIVE physical_state LINK_UP netdev ens335.2 使用 rxe_cfg 脚本传统方式rxe_cfg是 rdma-core 自带的 RXE 配置脚本# 查看当前配置状态sudorxe_cfg status# 启动 RXE 并添加设备sudorxe_cfg startsudorxe_cfgaddens33# 查看设备rdmalinkshow5.3 验证 RDMA 设备可见ibv_devices# 输出应包含 rxe_ens33 或 rxe0ibv_devinfo-drxe_ens33# 查看设备详细信息GID 表、端口状态、MTU 等如果使用源码编译安装的rdma-core工具的路径可能为rdma-core/build-debug/bin/ibv_devinfo如果未执行ninja install。六、功能测试与验证6.1 使用 rping 测试 RDMA CM 连接rping是 RDMA CM通信管理器的基本连通性测试工具适合验证 RXE 设备的基本通信能力。服务端假设 IP 为 192.168.1.100rping-s-a192.168.1.100-v客户端在同一主机上测试时服务端用回环 IP127.0.0.1rping-c-a127.0.0.1-v客户端会持续输出滚动字母序列表示 RDMA Read 操作成功。按CtrlC终止。6.2 使用 ibv_rc_pingpong 测试 RC 传输ibv_rc_pingpong通过 Reliable Connected 传输进行 ping-pong 测试。服务端ibv_rc_pingpong-drxe_ens33-g0客户端连接同一主机的服务端ibv_rc_pingpong-drxe_ens33-g0127.0.0.1输出示例local address: LID 0000 QPN 0x0011 PSN 0x... GID: 00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00 remote address: LID 0000 QPN 0x0012 PSN 0x... 8192000 bytes in 0.01 seconds 6553.60 Mbit/sec 1000 iters in 0.01 seconds 10.00 usec/iter6.3 使用 perftest 进行性能测试可选# 服务端ib_send_bw-drxe_ens33-g0# 客户端ib_send_bw-drxe_ens33-g0127.0.0.1预期性能参考Soft-RoCE 在 10G 网络下吞吐量可达线速的 90% 左右延迟约 100 微秒量级。七、使用 GDB 调试 Debug 构建的 rdma-coreDebug 构建保留了完整的符号和源码映射可以用 GDB 直接跟踪用户态 RDMA 库的执行流程。以下以跟踪ibv_devices的启动过程为例cdrdma-core/build-debug# 加载 ibv_devices 并设置断点gdb bin/ibv_devices# 在 GDB 中(gdb)breakibv_get_device_list(gdb)run(gdb)bt# 查看调用栈(gdb)list# 显示源码(gdb)step# 逐步跟踪由于VERBS_DEBUG宏在 Debug 构建中被定义rdma-core 源码中相关调试日志会输出到stderr。如果你需要逐行阅读 RXE 用户态实现源码位于rdma-core/providers/rxe/目录如果存在以及libibverbs的通用实现中。注意Soft-RoCE 的内核态实现位于 Linux 内核的drivers/infiniband/sw/rxe/目录用户态 rdma-core 主要负责 libibverbs 抽象层和rdma_rxe设备的配置接口。八、清理与卸载# 删除 RXE 设备sudordmalinkdelete rxe_ens33# 卸载内核模块可选sudomodprobe-rrdma_rxe# 如果通过源码安装到了系统卸载 rdma-corecdrdma-core/build-release# 或 build-debugsudoninja uninstall九、常见问题排查rdma link add报错 “Operation not supported”检查内核是否启用了CONFIG_RDMA_RXE以及rdma_rxe模块是否已加载。ibv_devinfo找不到 rxe 设备确认rdma link show中设备状态为ACTIVE且netdev对应的以太网接口处于 UP 状态。编译时 CMake 找不到libnl确认已安装libnl-3-dev和libnl-route-3-dev然后清除构建目录重新运行 CMake。Debug 构建后工具运行变慢或输出异常这是预期的——VERBS_DEBUG启用了额外检查和日志-O0也降低了执行效率。调试完成后应切换回 Release 或 RelWithDebInfo 构建。十、其他工具说明如果从apt 安装的话需要安装如下几个软件sudoaptupdatesudoaptinstall-y\rdma-core\libibverbs-dev\ibverbs-utils\infiniband-diags\rdmacm-utils\perftest\librdmacm-dev\iproute2其中rdma-core只是 Soft-RoCE 用户态核心栈的一部分而且它本身并不是 Soft-RoCE 的“实现”。Soft-RoCE 真正的核心是 Linux 内核里的rdma_rxe模块它通常由内核包提供不在你列出的这些 apt 包里。从rdma-core源码编译并安装会提供libibverbs-dev和librdmacm-dev这两个包里的核心内容头文件和库但它不会生成同名的 Debian/Ubuntu 软件包。 核心结论源码编译产出的是“文件”不是“软件包”libibverbs-dev和librdmacm-dev是Debian/Ubuntu 的软件包命名。它们由发行版的维护者基于rdma-core的源码根据打包规则如debian/control文件拆分和构建而来。当你直接从rdma-core的 Git 仓库克隆源码并编译时你执行的是项目自身的构建系统CMake。这个过程会直接编译出所有库、工具和头文件但不会自动把它们打包成.deb文件。 源码编译实际会提供什么rdma-core的 CMake 构建系统会生成并安装以下内容功能上覆盖了开发包的需求核心库文件libibverbs对应libibverbs-dev中的库文件部分。librdmacm对应librdmacm-dev中的库文件部分。开发头文件安装过程会将verbs.h、rdma_cma.h等头文件复制到系统的 include 目录通常是/usr/include/这正是-dev包的核心作用。运行时工具与 Provider 插件会生成ibv_devices、ibv_devinfo等工具以及 RXE 等驱动程序的 Provider 插件。上述 apt 列出的包可以分成几类包名来源/类别作用是否 Soft-RoCE 必需rdma-corerdma-core 项目用户态 RDMA 核心提供libibverbs、librdmacm运行库、守护进程、rxe_cfg等用户态核心必需iproute2独立网络工具提供rdma命令如rdma link add ... type rxe创建 RXE 设备常用且必需ibverbs-utilsrdma-core 项目拆出的工具ibv_devices、ibv_devinfo、ibv_rc_pingpong等测试/诊断非运行必需rdmacm-utilsrdma-core 项目拆出的工具rping、ucmatose等 RDMA CM 测试工具测试非必需perftest独立项目ib_send_bw、ib_write_bw、ib_read_lat等性能测试性能测试非必需infiniband-diags独立项目ibstat、iblinkinfo、perfquery等 IB 子网诊断对 RXE 用处有限非必需libibverbs-devrdma-core 项目开发包verbs.h等头文件编译 libibverbs 程序开发才需要librdmacm-devrdma-core 项目开发包rdma_cma.h等头文件编译 librdmacm 程序开发才需要更准确地说Soft-RoCE 由两部分组成内核态rdma_rxe模块位于 Linux 内核drivers/infiniband/sw/rxe/通常由linux-modules-extra-$(uname -r)或内核本身提供。检查/安装modprobe rdma_rxe# 如果失败sudoaptinstalllinux-modules-extra-$(uname-r)用户态rdma-core提供的库和工具rdma-core包运行库、rxe_cfg、ibacm等iproute2包rdma命令用来rdma link add ... type rxeibverbs-utils/rdmacm-utils测试工具-dev包开发头文件所以运行 Soft-RoCE 的最小集合大致是sudoaptinstallrdma-core iproute2然后加载内核模块sudomodprobe rdma_rxe如果要测试再加sudoaptinstallibverbs-utils rdmacm-utils perftest如果要自己写程序编译再加sudoaptinstalllibibverbs-dev librdmacm-devinfiniband-diags主要面向真正的 InfiniBand 子网管理Soft-RoCE 下很多命令不适用可以不装。总结rdma-core是 Soft-RoCE 用户态核心的一部分但不是 Soft-RoCE 的全部也不是内核实现。iproute2提供了创建 RXE 设备的关键rdma命令。其余包是测试、诊断、开发工具不属于 Soft-RoCE 本身但调试和验证时很有用。