公司动态

固件下载必备:TFTP服务配置与内核镜像下载实操

📅 2026/7/19 1:23:02
固件下载必备:TFTP服务配置与内核镜像下载实操
固件下载必备TFTP服务配置与内核镜像下载实操作者黒漂技术佬适合人群嵌入式开发新手已搭建基础开发环境关键词TFTP、内核镜像下载、U-Boot、固件烧录引言NFS解决了应用程序的实时共享问题但有个场景它搞不定——U-Boot阶段下载内核镜像。当你需要在U-Boot里通过tftpboot命令从网络加载内核和设备树时就需要TFTP服务了。TFTPTrivial File Transfer Protocol是一种简单轻量的文件传输协议专门用于嵌入式设备的固件下载场景。这篇带你从零搭建TFTP服务器并在U-Boot中实现内核镜像的网络下载。一、TFTP协议介绍1.1 什么是TFTPTFTP简单文件传输协议是一种基于UDP的轻量级文件传输协议端口号69。与FTP和SCP相比它有以下特点特性TFTPFTPSCP传输层协议UDPTCPTCP端口692122认证无用户名/密码SSH认证功能仅读写文件完整文件管理加密传输复杂度极低高中等适用场景嵌入式固件下载通用文件传输安全文件传输1.2 为什么U-Boot用TFTP而不是其他协议U-Boot是嵌入式设备的Bootloader在它运行时Linux内核还没启动网络协议栈非常精简。TFTP基于UDP协议简单到只需要几百行代码就能实现U-Boot原生支持。而TCP/SCP这类协议需要完整的握手和加密流程在Bootloader阶段实现成本太高。1.3 TFTP在嵌入式开发中的典型用途┌─────────────────┐ TFTP(UDP:69) ┌──────────────────┐ │ PCTFTP服务器│ ←────────────────→ │ 开发板U-Boot │ │ │ │ │ │ /tftpboot/ │ ←──下载内核镜像──→ │ tftpboot命令 │ │ ├── zImage │ │ 加载到内存 │ │ ├── uImage │ │ 启动内核 │ │ └── *.dtb │ │ │ └─────────────────┘ └──────────────────┘下载内核镜像zImage / uImage到内存中启动下载设备树文件.dtb到内存下载U-Boot自身进行在线升级下载固件到内存后写入Flash二、PC端TFTP服务器安装配置2.1 安装TFTP服务# Ubuntu/Debiansudoaptupdatesudoaptinstalltftpd-hpa tftp-hpa# tftpd-hpaTFTP服务器端# tftp-hpaTFTP客户端用于本机测试2.2 创建TFTP共享目录# 创建TFTP根目录sudomkdir-p/tftpboot# 修改权限TFTP要求目录可读写sudochmod777/tftpboot# 放入测试文件echoTFTP test/tftpboot/test.txt2.3 配置TFTP服务编辑TFTP配置文件sudovim/etc/default/tftpd-hpa修改内容如下# /etc/default/tftpd-hpaTFTP_USERNAMEtftpTFTP_DIRECTORY/tftpbootTFTP_ADDRESS:69TFTP_OPTIONS--secure -c配置参数说明参数含义TFTP_USERNAMETFTP服务运行的用户名TFTP_DIRECTORYTFTP共享根目录TFTP_ADDRESS监听地址和端口:69表示所有接口的69端口--secure安全模式切换到目录后再处理请求-c允许创建新文件上传需要2.4 启动TFTP服务# 重启TFTP服务sudosystemctl restart tftpd-hpa# 设置开机自启sudosystemctlenabletftpd-hpa# 检查服务状态sudosystemctl status tftpd-hpa# 确认69端口监听sudonetstat-ulnp|grep69预期输出类似udp 0 0 0.0.0.0:69 0.0.0.0:* 1254/in.tftpd2.5 本机自测# 从本机TFTP服务器下载测试文件cd/tmp tftp127.0.0.1# 进入tftp交互模式tftpget test.txt Received11bytesin0.0seconds tftpquit# 验证下载的文件cat/tmp/test.txt# 预期输出TFTP test自测通过说明TFTP服务器配置正确。三、U-Boot中通过TFTP下载内核镜像3.1 准备内核镜像文件将编译好的内核镜像和设备树文件放入TFTP共享目录# PC端操作cp~/kernel_build/arch/arm/boot/zImage /tftpboot/cp~/kernel_build/arch/arm/boot/dts/rk3399-board.dtb /tftpboot/# 确认文件存在ls-l/tftpboot/# -rw-r--r-- 1 user user 5.2M zImage# -rw-r--r-- 1 user user 38K rk3399-board.dtb3.2 开发板进入U-Boot命令行开发板上电后在串口终端按任意键打断自动启动进入U-Boot命令行U-Boot 2017.09 (Jul 10 2026 - 10:00:00 0800) Model: Rockchip RK3399 Board Hit any key to stop autoboot: 0 3.3 配置开发板网络# 设置开发板IP地址setenv ipaddr192.168.1.100# 设置PCTFTP服务器IP地址setenv serverip192.168.1.50# 设置网关如果需要setenv gatewayip192.168.1.1# 测试网络连通性ping192.168.1.50# 预期输出# host 192.168.1.50 is alive3.4 TFTP下载内核镜像# 下载内核镜像到内存地址 0x280000tftp 0x280000 zImage# 预期输出# Speed: 1000 Mbps# Using ethernetfe300000 device# TFTP from server 192.168.1.50; our IP address is 192.168.1.100# Filename zImage.# Load address: 0x280000# Loading: 3.2 MiB/s# done# Bytes transferred 5242880 (5000000 hex)3.5 TFTP下载设备树# 下载设备树到内存地址 0x830000tftp 0x830000 rk3399-board.dtb# Bytes transferred 38912 (9800 hex)3.6 启动内核# 设置启动参数setenv bootargsconsolettyS0,115200 root/dev/mmcblk1p2 rw rootwait# 启动内核bootz 0x280000 - 0x830000bootz命令的三个参数含义0x280000内核镜像地址-ramdisk地址无ramdisk时用减号占位0x830000设备树地址3.7 保存环境变量可选如果每次启动都走TFTP下载可以把环境变量保存下来# 保存到Flashsaveenv# Saving Environment to eMMC...# OK四、U-Boot自动化TFTP启动每次手动输命令太麻烦可以在U-Boot中配置自动TFTP启动脚本# 设置自动启动命令setenv bootcmd_tftptftp 0x280000 zImage; tftp 0x830000 rk3399-board.dtb; bootz 0x280000 - 0x830000# 设置为默认启动命令setenv bootcmdrun bootcmd_tftp# 保存saveenv之后每次上电U-Boot会自动从TFTP服务器下载内核并启动改了内核镜像后重启即可生效。五、常见问题排查5.1 TFTP下载超时# U-Boot输出# T T T T T T T T T T ...# Retry count exceeded# 原因1PC的TFTP服务未启动# 原因2防火墙阻断UDP 69端口# 解决sudosystemctl status tftpd-hpasudoufw allow69/udp5.2 文件未找到# U-Boot输出# File not found# 原因文件名拼写错误或文件不在TFTP目录# 解决在PC上确认文件存在ls/tftpboot/zImage5.3 权限拒绝上传时# 报错Error code 2: Access violation# 原因TFTP目录不可写或未加-c参数# 解决sudochmod777/tftpboot# 确认 /etc/default/tftpd-hpa 中 TFTP_OPTIONS 包含 -c问题速查表现象原因解决方案T T T 超时服务未启动或防火墙启动tftpd-hpa开放69/udpFile not found文件名/路径错误确认文件在 /tftpboot 目录Access violation权限不足chmod 777 加 -c 参数下载速度慢协商速率低检查网络带宽和网线质量总结TFTP在嵌入式开发中扮演固件投递员的角色尤其在U-Boot阶段下载内核镜像和设备树时不可替代。它基于UDP、协议简单正好适配Bootloader阶段的精简网络栈。搭建TFTP服务器的步骤安装tftpd-hpa→创建/tftpboot目录→配置/etc/default/tftpd-hpa→启动服务。U-Boot端用setenv配置网络参数用tftp命令下载文件到指定内存地址再用bootz启动。把TFTP启动命令写入bootcmd后每次改了内核镜像重启即可测试开发和调试效率大幅提升。至此SCP传应用、NFS共享目录、TFTP下内核三板斧凑齐嵌入式网络开发环境就齐活了。