4. U-Boot 网络基础:U-Boot 简介、网络命令 ping 与 dhcp、设置开发板 IP 与服务器 IP

这一章,我们正式进入网络部署的起点——U-Boot 的网络功能。

很多人觉得 U-Boot 就是个引导加载器,把内核从 Flash 里读出来就完事了。其实不然。U-Boot 的网络栈虽然精简,但五脏俱全。我当年第一次用 NFS 挂载根文件系统时,就是靠 U-Boot 的 ping 命令一步步排查出网线接触不良的。你想想看,如果 U-Boot 阶段网络就不通,后面所有网络部署方案都是空谈。

4.1 U-Boot 是什么?

U-Boot,全称 Das U-Boot,是嵌入式 Linux 世界最主流的 Bootloader。它负责初始化硬件、加载操作系统内核,并提供一个交互式命令行环境。

说白了,U-Boot 就是嵌入式系统的“BIOS”。但它比 PC 的 BIOS 灵活得多——你可以通过串口或网络与它交互,动态修改启动参数,甚至通过网络下载内核和文件系统。

U-Boot 的核心职责:

  • 硬件初始化:设置时钟、DDR、串口、网卡等外设
  • 引导内核:从 Flash、SD 卡或网络加载内核镜像
  • 传递启动参数:将内核需要的参数(如根文件系统路径)通过 bootargs 环境变量传递
  • 提供命令行:允许开发者调试、测试、修改启动配置

我个人习惯把 U-Boot 看作“嵌入式系统的瑞士军刀”。它不只是一个引导器,更是一个硬件调试工具。我在项目中遇到过一块开发板,Linux 内核死活起不来,最后在 U-Boot 命令行里用 md 命令读内存,发现是 DDR 时序配置错了——这种问题,没有 U-Boot 根本查不出来。

4.2 U-Boot 网络命令:ping 与 dhcp

U-Boot 的网络命令不多,但个个实用。今天重点讲两个:ping 和 dhcp。

4.2.1 ping 命令——网络连通性测试

ping 命令在 U-Boot 里用法很简单:

# 在 U-Boot 命令行中
=> ping 192.168.1.100

如果网络正常,你会看到类似这样的输出:

Using ethernet@2188000 device
host 192.168.1.100 is alive

如果不通,U-Boot 会一直等待直到超时:

Using ethernet@2188000 device
ping failed; host 192.168.1.100 is not alive

小技巧:U-Boot 的 ping 命令只发一次 ICMP 请求,不像 Linux 里会连续发。所以如果第一次没回应,别急着下结论——检查一下网线、IP 配置,再试一次。

我曾经遇到过一个问题:开发板 ping 服务器能通,但服务器 ping 开发板不通。排查了半天,发现是开发板的防火墙规则把 ICMP 回包过滤了。嗯,U-Boot 的 ping 只负责发请求,不负责处理回包——所以双向测试都要做。

4.2.2 dhcp 命令——自动获取 IP

dhcp 命令让开发板通过 DHCP 协议从网络中的 DHCP 服务器自动获取 IP 地址:

=> dhcp

执行后,U-Boot 会广播 DHCP 请求,服务器回应后,U-Boot 会自动配置 IP、子网掩码、网关,甚至 DNS。输出类似:

BOOTP broadcast 1
DHCP client bound to address 192.168.1.110

dhcp 命令还有一个隐藏功能:它会自动设置环境变量 ipaddr、netmask、gatewayip、dnsip。这意味着你不需要手动配置这些参数。

注意:dhcp 获取的 IP 是临时的,重启后就会丢失。如果你想让开发板固定使用某个 IP,建议手动设置环境变量并保存。

4.3 设置开发板 IP 与服务器 IP

手动设置 IP 是 U-Boot 网络配置的基础。你需要设置三个关键环境变量:

环境变量 含义 示例值
ipaddr 开发板 IP 地址 192.168.1.110
serverip 服务器(主机)IP 地址 192.168.1.100
netmask 子网掩码 255.255.255.0

设置命令如下:

=> setenv ipaddr 192.168.1.110
=> setenv serverip 192.168.1.100
=> setenv netmask 255.255.255.0
=> saveenv

saveenv 命令将环境变量保存到 Flash 或 EEPROM 中,这样重启后配置不会丢失。

关键点:

  • ipaddr 和 serverip 必须在同一网段,否则网络不通
  • 开发板 IP 不能与网络中其他设备冲突
  • 如果使用路由器,确保路由器 DHCP 地址池不包含开发板的静态 IP

我建议你养成一个好习惯:设置完 IP 后,立即用 ping 命令测试连通性。我曾经在项目中因为忘记设置 netmask,导致开发板和服务器虽然 IP 在同一网段,但子网掩码不匹配,ping 了半小时都没通——最后发现是 netmask 默认是 255.0.0.0,而服务器用的是 255.255.255.0。

4.4 本章知识结构

下面这张图帮你理清 U-Boot 网络基础的核心逻辑:

U-Boot 网络基础知识结构图 U-Boot 网络基础核心逻辑 U-Boot 网络栈 网络配置 连通性测试 自动获取 IP setenv ipaddr setenv serverip ping <服务器 IP> dhcp 命令 核心原则 1. ipaddr 与 serverip 必须在同一网段 2. 设置后必须 saveenv 保存,否则重启丢失 3. 每次修改网络配置后,立即用 ping 验证连通性

4.5 实战步骤:从零配置 U-Boot 网络

下面是一套我常用的标准流程,按顺序执行,基本不会出问题:

  1. 连接硬件:用网线将开发板与服务器(或路由器)连接
  2. 进入 U-Boot:上电后按任意键打断自动启动,进入命令行
  3. 查看当前网络配置:printenv ipaddr serverip netmask
  4. 设置 IP 地址:setenv ipaddr 192.168.1.110
  5. 设置服务器 IP:setenv serverip 192.168.1.100
  6. 设置子网掩码:setenv netmask 255.255.255.0
  7. 保存配置:saveenv
  8. 测试连通性:ping 192.168.1.100

避坑指南:我曾经在设置 IP 时忘记 saveenv,结果重启后 IP 恢复成默认值,导致后面所有网络操作都失败。所以记住:setenv 之后一定要 saveenv,这是 U-Boot 网络配置的铁律。

4.6 常见问题与排查

现象 可能原因 解决方法
ping 超时 网线松动、IP 不在同一网段 检查网线连接,确认 ipaddr 和 serverip 在同一网段
dhcp 获取不到 IP 网络中无 DHCP 服务器、网线未连接 检查路由器或 DHCP 服务是否开启
saveenv 后重启配置丢失 环境变量存储区域损坏或未正确分区 检查 mtdparts 分区表,确认环境变量分区可写
ping 开发板不通但服务器通 开发板防火墙或 ICMP 回包被过滤 检查 U-Boot 网络驱动配置,或换用其他开发板测试

嗯,这一章的内容就到这里。U-Boot 网络基础是后续所有网络部署操作的基石。你只要把 IP 配置和 ping 测试练熟了,后面 TFTP 下载、NFS 挂载就水到渠成。