4、开发环境搭建:硬件平台准备、软件工具链安装、第一个Hello World程序

说实话,做DPU开发最怕什么?不是代码写不出来,而是环境搭了三天,最后发现板子没通电。我当年第一次接触SmartNIC时,就犯过这种低级错误。所以这一章,咱们踏踏实实把环境搞定。

4.1 硬件平台准备

先说说硬件。你手头需要两样东西:一台服务器,一块DPU卡。

服务器要求

别太老就行。我个人习惯用x86的机器,ARM的也行,但驱动兼容性上x86省心些。具体配置建议:

组件 最低要求 推荐配置
CPU 4核,2.0GHz 8核以上,3.0GHz
内存 8GB 32GB
PCIe插槽 Gen3 x8 Gen4 x16
硬盘 100GB SSD 500GB NVMe

DPU卡选型

市面上主流的有NVIDIA BlueField系列、Intel IPU、AMD Pensando等。我建议初学者用BlueField-2,文档全,社区活跃。嗯,这里要注意:买卡时问清楚是标准版还是AI版,两者固件不同。

⚠️ 避坑指南
我曾经遇到过PCIe链路协商失败的问题。原因是服务器插槽供电不足。解决办法:插到靠近CPU的x16槽,别用延长线。

4.2 软件工具链安装

硬件插好了,接下来装软件。说白了就是三件套:SDK、编译器、驱动。

第一步:安装DPU SDK

以BlueField为例,去NVIDIA官网下载DOCA SDK。我习惯用2.6 LTS版本,稳定。安装命令很简单:

# 下载DOCA SDK
wget https://content.mellanox.com/DOCA/DOCA_v2.6.0/doca-host_2.6.0-xxx.deb

# 安装
sudo dpkg -i doca-host_2.6.0-xxx.deb
sudo apt-get update
sudo apt-get install doca-tools doca-sdk

装完后验证一下:

doca_version
# 输出类似:DOCA 2.6.0

第二步:安装交叉编译器

DPU上的程序不能在x86上直接编译。你需要交叉编译器。DOCA SDK自带aarch64-linux-gnu-gcc,但版本可能旧。我建议自己装:

sudo apt-get install gcc-aarch64-linux-gnu g++-aarch64-linux-gnu

验证:

aarch64-linux-gnu-gcc --version
# 输出:aarch64-linux-gnu-gcc (Ubuntu 11.3.0-1ubuntu1~22.04) 11.3.0

第三步:安装DPU驱动

驱动分两部分:主机侧驱动和DPU侧驱动。主机侧驱动负责PCIe通信,DPU侧驱动负责板卡内部管理。

# 主机侧安装mlx5驱动
sudo apt-get install mlnx-ofed-kernel-dkms

# 加载驱动
sudo modprobe mlx5_core
sudo modprobe mlx5_ib

# 检查DPU是否识别
lspci | grep Mellanox
# 应该看到类似: Mellanox Technologies MT42822 BlueField-2
💡 小技巧
如果lspci看不到DPU,先检查PCIe热插拔状态。我遇到过BIOS里把PCIe slot disable了的情况,折腾了两小时。

4.3 第一个Hello World程序

环境搭好了,写个程序验证一下。你想想看,如果连Hello World都跑不通,后面那些复杂的数据平面程序就更别想了。

代码编写

在主机上创建一个文件 hello_dpu.c:

#include <stdio.h>
#include <doca_error.h>
#include <doca_log.h>

DOCA_LOG_REGISTER(HELLO_DPU);

int main(int argc, char *argv[]) {
    doca_error_t result;
    
    // 初始化DOCA框架
    result = doca_init();
    if (result != DOCA_SUCCESS) {
        DOCA_LOG_ERR("Failed to initialize DOCA: %s", 
                     doca_error_get_descr(result));
        return -1;
    }
    
    DOCA_LOG_INFO("Hello from DPU data plane!");
    printf("Hello World! DPU is ready.\n");
    
    // 清理资源
    doca_destroy();
    return 0;
}

交叉编译

用刚才装的aarch64编译器:

aarch64-linux-gnu-gcc -o hello_dpu hello_dpu.c \
    -I/opt/mellanox/doca/include \
    -L/opt/mellanox/doca/lib \
    -ldoca_common -lpthread

# 检查生成的可执行文件架构
file hello_dpu
# 输出: ELF 64-bit LSB executable, ARM aarch64

部署到DPU

把编译好的程序传到DPU上。我习惯用scp:

# 先找到DPU的IP地址
doca_dpu_ip
# 假设输出: 192.168.100.2

# 上传文件
scp hello_dpu root@192.168.100.2:/tmp/

# SSH登录DPU
ssh root@192.168.100.2

# 在DPU上运行
cd /tmp
./hello_dpu

预期输出

[HELLO_DPU] [INFO] Hello from DPU data plane!
Hello World! DPU is ready.
✅ 验证成功标志
看到这两行输出,说明你的开发环境完全OK了。第一行是DOCA日志,第二行是标准输出。两者都正常,证明SDK、编译器、驱动、硬件链路全部打通。

4.4 知识体系总览

这一章的内容其实就三块:硬件、软件、验证。我画了个图帮你理清关系:

DPU开发环境搭建 - 知识体系 硬件准备 服务器(x86/ARM) DPU卡(BlueField-2) PCIe插槽 & 供电 软件工具链 DOCA SDK 交叉编译器 mlx5驱动 Hello World验证 编写代码 交叉编译 部署 & 运行 核心流程:硬件就绪 → 软件安装 → 程序验证 → 环境可用 关键检查点 ✅ lspci识别DPU ✅ doca_version正常 ✅ Hello World输出

说白了,这三步走完,你的DPU开发环境就立起来了。后面写数据平面程序,都是在这个基础上搭积木。

📌 我的经验
第一次跑Hello World时,如果报错"cannot open shared object file",别慌。八成是LD_LIBRARY_PATH没设对。执行一下:
export LD_LIBRARY_PATH=/opt/mellanox/doca/lib:$LD_LIBRARY_PATH
然后再跑程序,基本就通了。

好了,环境搭好了,咱们下节课开始真正写数据平面程序。记住:环境是基础,基础不牢,地动山摇。


公众号:蓝海资料掘金营,微信deep3321