3. DPU 启动流程与固件管理

BlueField DPU 本质上是一台“藏在网卡里的服务器”:它拥有独立的 ARM 多核处理器、DDR、eMMC、网络接口和 PCIe 端点,因此它的上电启动过程与普通 x86 服务器类似,却又因为要同时承担主机侧 PCIe 设备与独立 SoC 双重角色而更加复杂。理解这条启动链,是后续做固件升级、故障定位和版本兼容性判断的基础。

一、从复位向量到内核:五级启动链

BlueField-2/BlueField-3 的 ARM 侧启动遵循 ARM Trusted Firmware 标准分层模型,从上电到操作系统接管大致经过五个阶段:

  • BootROM(BL1):芯片内固化的只读代码,上电后从 eMMC 或 QSPI 的固定偏移读取第一阶段引导程序,负责最基础的时钟、DDR 初始化和信任根校验。
  • ATF(BL2/BL31):ARM Trusted Firmware,运行在 EL3 安全态,负责建立安全世界与非安全世界的隔离、配置 PSCI 电源管理、并把控制权交给 BL33。
  • OP-TEE(BL32):可信执行环境,运行在安全态 EL1,提供安全存储、密钥管理和可信应用服务。它与 ATF 通过 SMC 调用交互,是 DPU 上做安全启动和密钥保护的关键组件。
  • U-Boot(BL33):非安全态引导加载程序,负责加载内核、设备树和 initramfs,并提供 UEFI 兼容的启动服务。
  • UEFI / GRUB / Linux Kernel:U-Boot 可以以 UEFI 模式启动,随后由 GRUB 或直接由 U-Boot 加载 Linux 内核,最终由 systemd 或 init 接管用户空间。

这五级并非简单串联,ATF 在 BL31 阶段会常驻内存,OP-TEE 也长期驻留,二者与后续的 U-Boot、内核形成“安全态常驻 + 非安全态接力”的结构。下图展示了这一启动链的层级与交接关系。

BlueField DPU ARM 侧启动链与固件分区 BootROM (BL1) 芯片固化 · 信任根 ATF (BL2 / BL31) EL3 安全态 · PSCI OP-TEE (BL32) 安全 EL1 · 密钥/TA U-Boot (BL33) 非安全态 · UEFI 服务 UEFI / GRUB 启动项管理 Linux Kernel + RootFS eMMC / QSPI 固件分区 boot0: BL1 + ATF boot1: OP-TEE U-Boot + 环境变量 UEFI 变量 / 启动项 Kernel + DTB RootFS (A/B 双分区) Golden Image 备份 版本兼容性检查 BSP 版本 bf-bundle-2.x.y 含 ATF/OP-TEE/U-Boot 固件版本 NIC / BMC / ATF 需与 BSP 匹配 内核 / DTB 与 U-Boot 引导协议 需一致 主机驱动 DOCA / MLNX_OFED 与 DPU 固件对齐 不匹配 → 启动失败/降级

二、固件更新工具与操作方式

BlueField 的固件更新主要通过 NVIDIA 提供的 bfb-install 和 mlxbf-bootctl 两类工具完成。前者用于整机 BFB 镜像烧录,后者用于运行时查询和切换启动分区。

典型的 BFB 烧录流程如下(示例参数,实际以官方文档为准):

# 1. 在主机侧确认 DPU 处于可烧录状态
sudo mlxbf-bootctl --query

# 2. 使用 bfb-install 烧录 BFB 镜像到 eMMC
sudo bfb-install -d /dev/rshim0/boot -i bf-bundle-2.7.0-12345.bfb

# 3. 烧录完成后重启 DPU
sudo mlxbf-bootctl --reboot

# 4. 重启后验证固件版本
cat /etc/mlnx-release
mlxbf-bootctl --query | grep -i version

其中 mlxbf-bootctl --query 会输出当前 boot0/boot1 分区状态、ATF 版本、OP-TEE 版本以及 U-Boot 版本。若输出中 ATF version 与 BSP 发布说明不一致,说明烧录未完整覆盖或分区切换未生效。

提示:BlueField 支持 A/B 双分区启动。更新时先写入备用分区,验证通过后再切换启动标志,这样即使新固件启动失败,也能回退到旧分区。切换命令为 mlxbf-bootctl --boot-partition=1(示例,具体编号以实际分区布局为准)。

三、版本兼容性检查的四个维度

固件版本不匹配是 DPU 启动异常最常见的原因之一。建议从以下四个维度做交叉检查:

检查维度检查对象不匹配的典型现象
BSP 与固件bf-bundle 版本 vs ATF/OP-TEE/U-Boot 版本BL31 阶段卡死,串口无输出
内核与 DTB内核版本 vs 设备树兼容字符串内核 panic,外设无法枚举
主机驱动与 DPU 固件DOCA/MLNX_OFED vs DPU 固件版本PCIe 设备可见但功能异常
BMC 与 DPUBMC 固件 vs DPU 固件带外管理失效,无法远程恢复

实际操作中,最可靠的做法是:在升级前记录当前 mlxbf-bootctl --query 的完整输出,升级后逐项比对;同时保留一份 Golden Image 分区,确保任何一级启动失败都能回退。对于生产环境,建议把 BSP 版本、固件版本、内核版本和主机驱动版本写入一份版本矩阵表,作为变更管理的依据。

注意:不要跳过 ATF 和 OP-TEE 的版本检查。这两个组件运行在安全态,一旦版本与 U-Boot 或内核不匹配,往往不会给出明确错误信息,而是表现为启动挂起或随机重启,排查成本很高。

四、启动失败的快速定位思路

当 DPU 无法正常启动时,可以按启动链从后往前排查:先看串口是否有 U-Boot 输出,若有则问题在内核或根文件系统;若 U-Boot 无输出,则检查 ATF/OP-TEE 是否加载成功;若连 BL1 都没有输出,则可能是 eMMC 分区损坏或 BootROM 校验失败,此时需要进入恢复模式重新烧录 BFB。串口日志是这条链路上最重要的观测点,建议在调试阶段始终保留串口连接。

掌握这条启动链和版本检查方法后,后续做 DPU 模式切换、网络卸载配置和故障恢复时,就能快速判断问题出在固件层、引导层还是操作系统层,而不是盲目重刷整机镜像。