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 命令行到系统启动
在 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 部署既稳定又高效。