tftp 命令概述
TFTP 是一个简单的文件传输协议,基于 UDP 协议,它比 FTP 简单得多,但功能也少,通常用于无盘系统启动或简单的文件传输,非常适合在 U-Boot 这样的 Bootloader 环境中使用。

tftp 命令的核心功能是:从 TFTP 服务器下载一个文件到 U-Boot 所在设备的 RAM(内存)中。
基本语法
tftp 命令的基本语法如下:
tftp [loadAddress] [[hostIPaddr:]filename]
参数详解:
-
loadAddress(可选)- 作用:指定下载的文件将被加载到内存中的哪个地址。
- 如果省略:U-Boot 会使用环境变量
loadaddr的值作为默认加载地址,你通常可以通过printenv loadaddr查看这个值,并通过setenv loadaddr <address>来修改它。 - 示例:
tftp 0x82000000 uImage表示将uImage文件下载到内存地址0x82000000处。
-
hostIPaddr:(可选)
(图片来源网络,侵删)- 作用:指定 TFTP 服务器的 IP 地址。
- 如果省略:U-Boot 会使用环境变量
serverip的值作为默认服务器地址,你可以通过printenv serverip查看和修改。 - 示例:
tftp 192.168.1.10:zImage表示从 IP 地址为168.1.10的服务器下载zImage文件。
-
filename(必需)- 作用:指定要从 TFTP 服务器上下载的文件名。
- 示例:
uImage,zImage,rootfs.cpio.gz,atf.bin等。
常用命令示例
假设我们已经配置好了 U-Boot 的网络环境:
- 开发板 IP:
168.1.20 - TFTP 服务器 IP:
168.1.10(存放在serverip环境变量中) - 默认加载地址:
0x82000000(存放在loadaddr环境变量中)
示例 1:最简单的用法(使用默认值)
如果只想下载一个文件,并且使用默认的服务器 IP 和默认的加载地址,只需指定文件名即可。
tftp uImage
- 解释:U-Boot 会从
serverip(192.168.1.10) 下载uImage文件,并将其加载到loadaddr(0x82000000) 指定的内存位置。
示例 2:指定加载地址
如果不想使用默认的加载地址,可以手动指定。

tftp 0x81000000 zImage
- 解释:从
serverip(192.168.1.10) 下载zImage文件,并将其加载到内存地址0x81000000。
示例 3:指定服务器 IP 和文件名
TFTP 服务器不是 serverip 环境变量中配置的那个,可以在命令中直接指定。
tftp 192.168.1.30:my-device-tree.dtb
- 解释:从 IP 地址为
168.1.30的服务器下载my-device-tree.dtb文件,并将其加载到默认的loadaddr(0x82000000) 位置。
示例 4:同时指定加载地址、服务器 IP 和文件名
这是最完整的用法,提供了最大的灵活性。
tftp 0x88000000 192.168.1.10:rootfs.cpio.gz
- 解释:从 IP 地址为
168.1.10的服务器下载rootfs.cpio.gz文件,并将其加载到内存地址0x88000000。
环境变量配置
tftp 命令的强大之处在于它依赖于几个关键的环境变量,在执行 tftp 命令前,请确保这些变量已正确设置。
| 环境变量 | 描述 | 示例值 | 查看命令 | 设置命令 |
|---|---|---|---|---|
ipaddr |
本机(开发板)的 IP 地址 | 168.1.20 |
printenv ipaddr |
setenv ipaddr 192.168.1.20 |
serverip |
TFTP 服务器的 IP 地址 | 168.1.10 |
printenv serverip |
setenv serverip 192.168.1.10 |
loadaddr |
文件下载的默认内存地址 | 0x82000000 |
printenv loadaddr |
setenv loadaddr 0x82000000 |
bootcmd |
启动命令 (通常包含 tftp) |
tftp ${loadaddr}; bootm |
printenv bootcmd |
setenv bootcmd 'tftp ${loadaddr}; bootm' |
bootfile |
默认下载的文件名 | uImage |
printenv bootfile |
setenv bootfile uImage |
配置示例:
# 1. 设置开发板IP setenv ipaddr 192.168.1.20 # 2. 设置TFTP服务器IP setenv serverip 192.168.1.10 # 3. 设置默认加载地址 setenv loadaddr 0x82000000 # 4. 设置默认启动文件 (可选) setenv bootfile uImage # 5. 保存环境变量,使设置永久生效 saveenv
配置完成后,就可以直接执行 tftp 或 tftp ${bootfile} 来下载默认文件了。
常见问题与排查
在使用 tftp 时,经常会遇到失败的情况,下面是常见错误及其解决方法:
| 错误信息 | 可能原因 | 解决方案 |
|---|---|---|
Error: 'serverip' not set |
serverip 环境变量未定义或为空。 |
使用 setenv serverip <服务器IP> 设置服务器地址。 |
File not found |
TFTP 服务器上找不到指定的文件名。 | 检查文件名拼写是否正确。 2. 确认文件是否存在于 TFTP 服务器的根目录下。 3. 检查 TFTP 服务器的权限设置。 |
TFTP error: 'access violation' |
通常是权限问题。 | 检查 TFTP 服务器配置文件(如 tftpd-hpa 的配置)中的权限,确保对文件有读取权限。 2. 尝试将文件权限改为 777 (chmod 777 filename) 进行测试。 |
TFTP error: 'file not found' |
与 File not found 类似,但更偏向于协议层面的错误。 |
同上,重点检查文件名和服务器目录。 |
ARP timeout |
最常见的问题,开发板无法通过 ARP 协议找到 TFTP 服务器的 MAC 地址,这通常意味着网络不通。 | 检查物理连接:网线是否插好? 2. 检查网络配置:开发板和服务器是否在同一个网段?( 168.1.x) 3. 检查服务器状态:TFTP 服务器程序是否正在运行?(可以在服务器上执行 ps aux | grep tftp 查看) 4. 在开发板上 ping 服务器:ping ${serverip},看是否能通。ping 不通,说明网络层有问题,请优先排查。 |
ethernet not ready |
网卡驱动未初始化或网络未启动。 | 检查 U-Boot 中是否正确加载了网卡驱动。 2. 尝试手动启动网络: dhcp 命令(如果配置为 DHCP)或手动设置 ipaddr 和 netmask 后执行 ifconfig。 |
相关命令
tftpboot:tftpboot是tftp命令的一个别名,功能完全相同。tftp是更新的、更推荐的命令名,但很多旧的 U-Boot 版本仍然支持tftpboot。dhcp: 通过 DHCP 协议自动获取 IP 地址、网关、TFTP 服务器地址等网络信息,如果使用 DHCP,serverip和ipaddr等变量可能会被自动设置。ping: 测试网络连通性的基本命令。ping ${serverip}是排查tftp问题的第一步。saveenv: 保存所有环境变量的修改,使其在重启后仍然有效。printenv/env print: 查看所有环境变量的当前值。
tftp 命令是 U-Boot 与网络交互的基石,要成功使用它,关键在于:
- 网络通畅:确保开发板和 TFTP 服务器物理连接正确,IP 配置在同一网段,并且能互相
ping通。 - 服务就绪:确保 TFTP 服务器程序正在运行,并且目标文件存在且有正确的读取权限。
- 地址正确:了解并设置好
loadaddr等关键环境变量,确保文件被加载到正确的内存位置以便后续执行(如bootm)。
