4. OpenWrt固件烧录与启动
OpenWrt系统的部署始于固件烧录,而烧录方式的选择直接决定了开发调试的效率与风险等级。对于基于ARM、MIPS或RISC-V架构的物联网网关,Bootloader(通常为U-Boot)是硬件初始化的第一站,也是固件恢复的最后防线。本章将围绕三种主流烧录路径——U-Boot命令行烧录、TFTP网络烧录、Web界面(LuCI或厂商Bootloader Web)烧录——展开详细操作,并深入讲解首次启动时的分区布局、串口登录与会话管理、SSH密钥配置等关键环节。理解这些底层机制,是后续进行内核定制、驱动移植和根文件系统裁剪的必备前提。
上图展示了从主机PC到物联网网关的三种烧录路径以及启动流程。在实际工程中,U-Boot是硬件初始化的核心,它负责建立内存映射、初始化串口和网卡,并最终将OpenWrt内核镜像加载到RAM中执行。理解这条链路,有助于在设备变砖时快速定位故障层级。
4.1 核心原理:Bootloader与固件分区布局
OpenWrt设备通常采用NOR Flash(存放U-Boot)与NAND Flash(存放固件)或单颗SPI NOR Flash(存放全部内容)的存储方案。U-Boot作为Bootloader,其首要任务是初始化DDR内存、时钟、串口和以太网控制器,然后根据环境变量bootcmd决定从何处加载内核。固件分区布局在编译时通过DTS(Device Tree Source)文件定义,常见的分区包括:u-boot、u-boot-env、factory(存放ART校准数据)、kernel、rootfs以及overlay(用于存储配置修改)。
烧录的本质是将编译产物(如openwrt-ramips-mt7621-device_xxx-squashfs-sysupgrade.bin)写入到正确的分区偏移地址。如果写入位置错误,轻则无法启动,重则损坏Bootloader导致永久变砖。因此,在烧录前必须确认固件类型:factory.bin用于从原厂系统刷入,sysupgrade.bin用于OpenWrt系统内升级或U-Boot下刷写。
factory.bin,因为该镜像包含完整的固件头,会覆盖U-Boot分区。务必使用sysupgrade.bin或经过解包后的kernel.bin与rootfs.bin。
4.2 判断方法与操作流程:三种烧录方式实战
选择烧录方式取决于设备当前状态:若设备已启动到OpenWrt,优先使用Web界面或SSH下的sysupgrade命令;若设备无法正常启动但U-Boot完好,则使用TFTP或串口命令行;若U-Boot已损坏,则需要使用编程器或JTAG,这不在本章讨论范围内。
4.2.1 U-Boot命令行烧录(救砖首选)
通过串口连接设备,上电后迅速按下Ctrl+C或任意键进入U-Boot提示符U-Boot>。操作步骤如下:
- 设置IP地址:
setenv ipaddr 192.168.1.1 setenv serverip 192.168.1.100 saveenv - 测试TFTP连接:
确保主机TFTP服务器已启动,且固件文件位于TFTP根目录。ping 192.168.1.100 - 擦除并写入固件:以NAND为例:
对于SPI NOR,使用tftp 0x82000000 openwrt-sysupgrade.bin nand erase.chip nand write 0x82000000 0x0 ${filesize}sf probe和sf erase、sf write命令。 - 重启设备:
reset
md5sum 0x82000000 ${filesize}校验内存中的固件哈希,与主机端MD5比对一致后再写入Flash,避免因网络丢包导致固件损坏。
4.2.2 TFTP网络烧录(无需串口)
部分U-Boot支持从网络启动内核(bootp或dhcp),但更常见的场景是设备已运行OpenWrt,通过SSH执行sysupgrade命令配合TFTP服务器进行恢复。操作流程:
- 在主机启动TFTP服务器(如tftpd-hpa),将固件放入
/srv/tftp目录。 - SSH登录设备,执行:
其中sysupgrade -n -r 192.168.1.100:/openwrt-sysupgrade.bin-n表示不保留配置,-r指定远程文件。 - 等待设备自动重启,期间切勿断电。
4.2.3 Web界面烧录(LuCI)
适用于设备已正常启动且网络可达的场景。登录LuCI(默认http://192.168.1.1),进入系统 → 备份/升级,选择sysupgrade.bin文件,点击“刷写固件”。LuCI会先校验镜像校验和,并提示是否保留配置。建议取消勾选“保留配置”,以避免旧配置与新固件不兼容。
| 烧录方式 | 适用场景 | 风险等级 | 关键命令/操作 |
|---|---|---|---|
| U-Boot命令行 | 设备无法启动、救砖 | 高(需精确操作) | tftp、nand write、sf write |
| TFTP + sysupgrade | 系统崩溃但U-Boot完好 | 中 | sysupgrade -r |
| Web界面 (LuCI) | 系统正常运行 | 低 | 浏览器上传固件 |
4.3 案例拆解:从U-Boot救砖到系统启动的完整闭环
背景:某工业物联网网关(MT7621方案,NAND Flash)在升级过程中断电,导致内核分区损坏,设备反复重启,无法进入系统。串口输出显示U-Boot正常启动,但加载内核时出现Bad magic number错误。
初始现象:串口日志最后几行为:
U-Boot 1.1.3 (Apr 12 2023 - 10:00:00)
...
## Booting image at 84000000 ...
Bad Magic Number
分析判断:U-Boot尝试从NAND的kernel分区读取镜像,但镜像头损坏。由于U-Boot环境变量bootcmd指向nand read 0x84000000 0x200000 0x400000; bootm 0x84000000,因此需要重新写入完整的sysupgrade固件。
操作步骤:
- 连接串口,进入U-Boot命令行。
- 设置网络:
setenv ipaddr 192.168.1.1; setenv serverip 192.168.1.100; saveenv - 从TFTP下载固件到内存:
tftp 0x82000000 openwrt-ramips-mt7621-device_xxx-squashfs-sysupgrade.bin - 校验MD5:
md5sum 0x82000000 ${filesize},与主机端比对一致。 - 擦除NAND:
nand erase.chip - 写入固件:
nand write 0x82000000 0x0 ${filesize} - 执行
reset重启。
结果对比:重启后,串口输出正常显示内核解压、挂载rootfs,最终进入OpenWrt登录提示符。设备恢复时间约3分钟,相比返厂维修节省了大量时间。
风险与代价:擦除整个NAND芯片会同时清除U-Boot环境变量和ART校准数据。若ART丢失,无线信号强度将异常。因此,在救砖前应备份factory分区:nand read 0x82000000 0x40000 0x10000; tftp 0x82000000 factory.bin 0x10000。
bootcount功能,当内核连续启动失败N次后自动回退到备份分区,避免因固件损坏导致现场服务中断。
4.4 首次启动配置与登录方式
固件烧录成功后,首次启动OpenWrt会进行以下初始化:创建overlay文件系统、生成默认SSH主机密钥、启动防火墙和DHCP服务。默认LAN IP为192.168.1.1,子网掩码255.255.255.0。此时可通过串口或SSH登录。
4.4.1 串口登录与会话管理
串口是访问设备的最后手段,尤其在网络未配置时。使用minicom或PuTTY连接,参数为115200 8N1,无流控。登录后建议立即设置root密码:
passwd
同时,为了远程管理,需要开启SSH服务。OpenWrt默认使用dropbear作为SSH服务器,首次启动时已自动生成主机密钥。通过串口确认SSH状态:
/etc/init.d/dropbear status
4.4.2 SSH密钥认证配置
为了提升安全性,建议禁用密码登录,改用密钥认证。操作如下:
- 在主机生成密钥对:
ssh-keygen -t ed25519 - 将公钥复制到设备:
ssh-copy-id root@192.168.1.1 - 编辑
/etc/config/dropbear,设置option PasswordAuth 'off'。 - 重启服务:
/etc/init.d/dropbear restart
4.4.3 网络配置与连通性验证
首次启动后,通过串口执行ifconfig查看接口状态。默认LAN接口为br-lan,包含物理端口eth0和eth1。若需修改IP,编辑/etc/config/network:
config interface 'lan'
option ifname 'eth0.1'
option proto 'static'
option ipaddr '192.168.1.1'
option netmask '255.255.255.0'
修改后执行/etc/init.d/network reload生效。验证连通性:
ping -c 3 192.168.1.100
4.5 常见误区与总结复盘
误区一:混淆factory.bin与sysupgrade.bin。在U-Boot下刷入factory镜像会覆盖Bootloader,导致设备变砖。正确做法是使用sysupgrade镜像,或手动拆分镜像分别写入kernel和rootfs分区。
误区二:忽略TFTP传输校验。网络传输过程中可能发生丢包,导致固件损坏。务必在写入前执行md5sum校验。
误区三:SSH登录时使用默认端口22,但部分网关可能修改了端口。可通过串口查看/etc/config/dropbear中的Port选项。
误区四:首次启动后直接拔掉串口线,未检查系统日志。建议执行logread -f观察启动过程,确认无kernel panic或oops错误。
总结:本章涵盖了从Bootloader到应用层的完整启动链路。掌握U-Boot命令是救砖的核心技能,而TFTP和Web烧录则是日常升级的便捷手段。首次启动配置中,串口是基础,SSH是效率,密钥认证是安全。建议开发者在实验环境中反复练习U-Boot的nand write和sf write操作,直到形成肌肉记忆。同时,务必在设备正常时备份factory分区和U-Boot环境变量,这是应对突发故障的保险单。