一、环境准备
1.1 系统要求
推荐使用 Ubuntu 22.04 LTS ,内核版本 5.15 或更高(Soft-RoCE 驱动自 Linux 4.8 起已合入内核)。普通以太网卡即可,无需专用 RDMA 硬件。建议内存至少 4GB。
bash
# 确认系统与内核版本
lsb_release -a
uname -r
1.2 安装编译依赖
从源码编译 rdma-core(Soft-RoCE 用户态库和工具的主要来源)需要以下依赖:
bash
sudo apt-get update
sudo apt-get install -y \
build-essential git cmake ninja-build pkg-config \
gcc g++ make autoconf 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 源码
bash
git clone https://github.com/linux-rdma/rdma-core.git
cd rdma-core
建议检查可用的发布版本标签:
bash
git tag -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 版并安装到系统:
bash
cd rdma-core
# 创建独立构建目录(保持源码树干净)
mkdir -p build-release && cd build-release
# 配置:指定 Release 构建类型,安装前缀为 /usr
cmake -G Ninja \
-DCMAKE_BUILD_TYPE=Release \
-DCMAKE_INSTALL_PREFIX=/usr \
..
# 编译(使用 ninja 并行构建)
ninja
# 安装到系统
sudo ninja install
-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/ 中:
bash
cd rdma-core
bash build.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 时,会触发以下行为:
cmake
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 构建:
bash
cd rdma-core
mkdir -p build-debug && cd build-debug
cmake -G Ninja \
-DCMAKE_BUILD_TYPE=Debug \
-DCMAKE_INSTALL_PREFIX=/usr \
-DCMAKE_C_FLAGS="-O0 -g3" \
-DCMAKE_CXX_FLAGS="-O0 -g3" \
..
ninja
sudo ninja install
-g3 比默认的 -g 包含更多调试信息(如宏定义),对深入分析实现细节有帮助。
3.2 使用 EXTRA_CMAKE_FLAGS 环境变量
如果你使用 build.sh 脚本,可以通过 EXTRA_CMAKE_FLAGS 环境变量传递 Debug 构建标志。这是 rdma-core 官方推荐的覆盖构建类型的方式:
bash
cd rdma-core
export EXTRA_CMAKE_FLAGS="-DCMAKE_BUILD_TYPE=Debug -DENABLE_WERROR=1"
bash build.sh
-DENABLE_WERROR=1 将警告视为错误,有助于在调试构建中捕捉潜在问题。编译产物位于 build/bin/ 和 build/lib/ 中,包含完整的调试符号,可直接用 GDB 加载。
3.3 验证 Debug 构建是否生效
bash
cd rdma-core/build-debug
# 检查编译标志
grep -r "CMAKE_BUILD_TYPE" CMakeCache.txt
# 应输出:CMAKE_BUILD_TYPE:STRING=Debug
# 确认调试符号存在
file bin/ibv_devices
# 应包含 "with debug_info" 或 "not stripped"
# 使用 GDB 验证符号可加载
gdb -batch -ex "info sources" bin/ibv_devices 2>&1 | head -5
3.4 Debug 与 Release 构建的差异对比
| 特性 | Release | Debug |
|---|---|---|
| 优化级别 | -O2 |
-O0 |
| 调试符号 | 有(RelWithDebInfo 默认),Release 可剥离 |
完整 DWARF(-g3 更丰富) |
NDEBUG |
定义(关闭 assert) |
未定义(assert 生效) |
VERBS_DEBUG |
未定义 | 定义(启用调试日志和检查) |
| 适合场景 | 性能测试、生产部署 | 源码阅读、GDB 调试、日志分析 |
四、加载 RXE 内核模块
Soft-RoCE 的内核驱动 rdma_rxe 在现代内核中已内置,无需额外编译内核模块。
bash
# 加载 RDMA 核心子系统
sudo modprobe rdma
# 加载 Soft-RoCE 驱动
sudo modprobe rdma_rxe
# 确认模块已加载
lsmod | grep rdma_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_RXE:
bash
grep CONFIG_RDMA_RXE /boot/config-$(uname -r)
# 应输出 CONFIG_RDMA_RXE=m
五、创建和配置 RXE 设备
5.1 使用 rdma link 命令创建 RXE 设备(现代推荐方式)
bash
# 查看网络接口名称(假设为 ens33 或 eth0)
ip link show
# 创建 RXE 设备,绑定到指定以太网接口
sudo rdma link add rxe_ens33 type rxe netdev ens33
# 验证设备已创建
rdma link show
成功输出中会显示 rxe_ens33 设备:
link rxe_ens33/1 state ACTIVE physical_state LINK_UP netdev ens33
5.2 使用 rxe_cfg 脚本(传统方式)
rxe_cfg 是 rdma-core 自带的 RXE 配置脚本:
bash
# 查看当前配置状态
sudo rxe_cfg status
# 启动 RXE 并添加设备
sudo rxe_cfg start
sudo rxe_cfg add ens33
# 查看设备
rdma link show
5.3 验证 RDMA 设备可见
bash
ibv_devices
# 输出应包含 rxe_ens33 或 rxe0
ibv_devinfo -d rxe_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.100):
bash
rping -s -a 192.168.1.100 -v
客户端 (在同一主机上测试时,服务端用回环 IP 127.0.0.1):
bash
rping -c -a 127.0.0.1 -v
客户端会持续输出滚动字母序列,表示 RDMA Read 操作成功。按 Ctrl+C 终止。
6.2 使用 ibv_rc_pingpong 测试 RC 传输
ibv_rc_pingpong 通过 Reliable Connected 传输进行 ping-pong 测试。
服务端:
bash
ibv_rc_pingpong -d rxe_ens33 -g 0
客户端(连接同一主机的服务端):
bash
ibv_rc_pingpong -d rxe_ens33 -g 0 127.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/iter
6.3 使用 perftest 进行性能测试(可选)
bash
# 服务端
ib_send_bw -d rxe_ens33 -g 0
# 客户端
ib_send_bw -d rxe_ens33 -g 0 127.0.0.1
预期性能参考:Soft-RoCE 在 10G 网络下吞吐量可达线速的 90% 左右,延迟约 100 微秒量级。
七、使用 GDB 调试 Debug 构建的 rdma-core
Debug 构建保留了完整的符号和源码映射,可以用 GDB 直接跟踪用户态 RDMA 库的执行流程。以下以跟踪 ibv_devices 的启动过程为例:
bash
cd rdma-core/build-debug
# 加载 ibv_devices 并设置断点
gdb bin/ibv_devices
# 在 GDB 中:
(gdb) break ibv_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 设备的配置接口。
八、清理与卸载
bash
# 删除 RXE 设备
sudo rdma link delete rxe_ens33
# 卸载内核模块(可选)
sudo modprobe -r rdma_rxe
# 如果通过源码安装到了系统,卸载 rdma-core
cd rdma-core/build-release # 或 build-debug
sudo ninja 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 安装的话,需要安装如下几个软件:
bash
sudo apt update
sudo apt install -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-core |
rdma-core 项目,用户态 RDMA 核心 | 提供 libibverbs、librdmacm 运行库、守护进程、rxe_cfg 等 |
用户态核心,必需 |
iproute2 |
独立网络工具 | 提供 rdma 命令,如 rdma link add ... type rxe |
创建 RXE 设备常用且必需 |
ibverbs-utils |
rdma-core 项目拆出的工具 | ibv_devices、ibv_devinfo、ibv_rc_pingpong 等 |
测试/诊断,非运行必需 |
rdmacm-utils |
rdma-core 项目拆出的工具 | rping、ucmatose 等 RDMA CM 测试工具 |
测试,非必需 |
perftest |
独立项目 | ib_send_bw、ib_write_bw、ib_read_lat 等性能测试 |
性能测试,非必需 |
infiniband-diags |
独立项目 | ibstat、iblinkinfo、perfquery 等 IB 子网诊断 |
对 RXE 用处有限,非必需 |
libibverbs-dev |
rdma-core 项目开发包 | verbs.h 等头文件,编译 libibverbs 程序 |
开发才需要 |
librdmacm-dev |
rdma-core 项目开发包 | rdma_cma.h 等头文件,编译 librdmacm 程序 |
开发才需要 |
更准确地说,Soft-RoCE 由两部分组成:
-
内核态 :
rdma_rxe模块位于 Linux 内核
drivers/infiniband/sw/rxe/,通常由linux-modules-extra-$(uname -r)或内核本身提供。检查/安装:
bashmodprobe rdma_rxe # 如果失败: sudo apt install linux-modules-extra-$(uname -r) -
用户态 :
rdma-core提供的库和工具rdma-core包:运行库、rxe_cfg、ibacm等iproute2包:rdma命令,用来rdma link add ... type rxeibverbs-utils/rdmacm-utils:测试工具-dev包:开发头文件
所以,运行 Soft-RoCE 的最小集合大致是:
bash
sudo apt install rdma-core iproute2
然后加载内核模块:
bash
sudo modprobe rdma_rxe
如果要测试,再加:
bash
sudo apt install ibverbs-utils rdmacm-utils perftest
如果要自己写程序编译,再加:
bash
sudo apt install libibverbs-dev librdmacm-dev
infiniband-diags 主要面向真正的 InfiniBand 子网管理,Soft-RoCE 下很多命令不适用,可以不装。
总结:
rdma-core是 Soft-RoCE 用户态核心的一部分,但不是 Soft-RoCE 的全部,也不是内核实现。iproute2提供了创建 RXE 设备的关键rdma命令。- 其余包是测试、诊断、开发工具,不属于 Soft-RoCE 本身,但调试和验证时很有用。