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开发环境就立起来了。后面写数据平面程序,都是在这个基础上搭积木。
第一次跑Hello World时,如果报错"cannot open shared object file",别慌。八成是LD_LIBRARY_PATH没设对。执行一下:
export LD_LIBRARY_PATH=/opt/mellanox/doca/lib:$LD_LIBRARY_PATH然后再跑程序,基本就通了。
好了,环境搭好了,咱们下节课开始真正写数据平面程序。记住:环境是基础,基础不牢,地动山摇。
公众号:蓝海资料掘金营,微信deep3321