4. 网络启动协议入门

在嵌入式 Linux 与 U-Boot 的网络 OTA 部署中,设备往往需要在没有本地存储、没有完整操作系统的阶段,通过网络把内核、设备树、根文件系统或升级包拉取到内存中。这一过程依赖一组经典网络协议:TFTP、NFS、HTTP、DHCP 与 PXE。它们并非互相替代,而是分别解决“地址从哪来”“文件怎么传”“根文件系统怎么挂”“整机怎么自动引导”这几个不同层次的问题。理解它们的定位,比记住命令更重要。

一、核心原理:五个协议各管一段链路

从 U-Boot 视角看,一次网络启动大致经历四个阶段:链路与地址获取、引导文件传输、内核与设备树加载、根文件系统挂载或系统升级。DHCP 负责第一阶段,为网卡分配 IP、网关、DNS 以及 TFTP/PXE 服务器地址;TFTP 和 HTTP 负责第二阶段,把镜像文件搬到内存;NFS 负责第四阶段,把远端目录当作根文件系统;PXE 则是把 DHCP、TFTP 等组合成一套标准化的自动引导流程。

需要特别区分的是:TFTP 是 U-Boot 原生支持最完整的传输协议,实现简单、依赖少,适合小体积镜像;HTTP 在较新 U-Boot 中通过 wget 支持,适合大文件、可穿透部分防火墙、便于 CDN 分发;NFS 通常不用于 U-Boot 阶段传输镜像,而是内核启动后挂载根文件系统;DHCP 只负责参数下发,不传文件;PXE 是流程规范,不是单一协议。

嵌入式网络启动协议分工与数据流 嵌入式设备 U-Boot 网络栈 / 命令 Linux 内核 启动后运行 根文件系统 NFS / 本地 OTA 升级包 写入 Flash 协议层 DHCP 分配 IP / 网关 / 服务器地址 TFTP 小文件、U-Boot 原生支持 HTTP 大文件、可穿透防火墙 NFS 内核启动后挂载根文件系统 PXE DHCP + TFTP 自动引导流程 服务器端 DHCP Server dnsmasq / isc-dhcp TFTP Server tftpd-hpa HTTP Server nginx / python -m http NFS Server nfs-kernel-server DHCP 提供地址 → TFTP/HTTP 传输镜像 → NFS 挂载根文件系统 → PXE 组合自动引导

二、方法流程:从 U-Boot 命令行到系统启动

在 U-Boot 中,最典型的网络启动流程如下。首先通过 DHCP 获取地址,然后使用 TFTP 或 HTTP 加载内核与设备树,最后通过 bootargs 指定 NFS 根文件系统并启动。

# 1. 获取 IP 地址
dhcp

# 2. 通过 TFTP 加载内核与设备树
tftp 0x80008000 zImage
tftp 0x83000000 imx6ull-14x14-evk.dtb

# 3. 设置 NFS 根文件系统启动参数
setenv bootargs 'console=ttymxc0,115200 root=/dev/nfs rw \
  nfsroot=192.168.1.100:/nfsroot/rootfs \
  ip=192.168.1.50:192.168.1.100:192.168.1.1:255.255.255.0::eth0:off'

# 4. 启动内核
bootz 0x80008000 - 0x83000000

如果使用 HTTP 传输,则替换为 wget 命令,适合镜像较大或需要经过反向代理的场景:

wget 0x80008000 http://192.168.1.100/images/zImage
wget 0x83000000 http://192.168.1.100/images/imx6ull-14x14-evk.dtb

PXE 则把上述步骤标准化:DHCP 响应中携带 next-server 和 filename 字段,U-Boot 或网卡固件据此自动下载引导文件,无需人工输入命令。在嵌入式场景中,PXE 常用于产线批量烧录或实验室统一部署。

三、适用性对比:五种协议在嵌入式场景中的取舍

协议 主要作用 U-Boot 支持 适用场景 局限性
DHCP 自动分配 IP、网关、服务器地址 原生支持,dhcp 命令 实验室、产线、动态网络环境 依赖服务器,固定 IP 场景需静态配置
TFTP 传输内核、设备树、小镜像 原生支持,tftp 命令 U-Boot 阶段加载小文件 无认证、无断点续传、大文件慢
HTTP 传输大镜像、升级包 较新版本支持 wget 大文件、CDN、反向代理场景 旧版 U-Boot 不支持,需编译开启
NFS 挂载远端根文件系统 U-Boot 阶段不用于传镜像 内核启动后挂载 rootfs,开发调试 依赖内核 NFS 客户端,网络中断即挂起
PXE 标准化自动引导流程 部分平台支持,依赖网卡固件 产线批量部署、无人值守启动 配置复杂,嵌入式平台支持不统一

四、案例与误区复盘

某工业网关项目在实验室使用 TFTP 加载 8MB 内核,耗时约 6 秒,可接受;但量产升级包达到 120MB,TFTP 传输超过 3 分钟且偶发超时。团队改用 HTTP 后,配合 nginx 的 sendfile 与断点续传,升级时间降至 25 秒。这说明协议选择要随文件体积和网络环境变化,不能一套配置用到底。

常见误区一:把 NFS 当成 U-Boot 的镜像传输协议。NFS 挂载发生在内核启动之后,U-Boot 阶段通常没有 NFS 客户端。若在 U-Boot 中写 NFS 命令,多数平台会直接报错。

常见误区二:认为 DHCP 一定能拿到地址。若网络中存在多个 DHCP 服务器或交换机未放行广播,设备可能拿到错误网段。产线环境建议使用静态 IP 或 DHCP 绑定 MAC。

常见误区三:忽略 PXE 的固件依赖。PXE 需要网卡固件或 U-Boot 的 PXE 实现支持,并非所有 ARM 平台都完整可用。选型前应确认芯片手册与 U-Boot 配置。

实践建议:开发阶段用 DHCP + TFTP + NFS 组合,快速迭代内核与根文件系统;量产阶段用静态 IP + HTTP 传输升级包,减少对 DHCP 和 TFTP 的依赖;产线批量烧录再考虑 PXE 或厂商专用烧录工具。理解每种协议的边界,才能让网络 OTA 部署既稳定又高效。