U-Boot配置TFTPboot获取Linux镜像超时后不再重试问题咨询
看你描述的情况确实挺闹心的——U-Boot配置了通过TFTP加载image.ub镜像,可要是开机时TFTP服务器还没准备好,触发超时后就彻底放弃重试了,哪怕之后服务器就绪也不会再尝试连接。从你贴的运行日志也能看得明明白白:
Filename 'image.ub'.
Load address: 0x10000000
Loading: T T T T T T T T T T
Retry count exceeded; starting again
Zynq>
明明日志提示“starting again”,但实际上根本没再发起连接对吧?下面给你几个实用的解决思路:
1. 调整U-Boot的TFTP重试参数
U-Boot默认的TFTP重试次数和超时时间可能不够灵活,你可以先在命令行临时测试调整,没问题再固化到配置里:
- 命令行临时修改(立即生效,重启后失效):
# 设置单次重试的超时时间(单位:毫秒,这里设为5秒) setenv tftp-timeout 5000 # 设置最大重试次数(这里设为20次) setenv tftp-retries 20 # 保存环境变量到板载存储,让修改重启后依然生效 saveenv - 编译时固化默认值(修改U-Boot的配置文件,比如
configs/zynq_xxx_defconfig):CONFIG_TFTP_TIMEOUT=5000 CONFIG_TFTP_RETRIES=20
2. 编写自动循环重试的U-Boot启动脚本
如果单纯调参数还是满足不了需求,你可以写个简单的启动脚本,让U-Boot在TFTP失败后自动循环重试,直到成功为止:
setenv bootcmd 'tftpboot 0x10000000 image.ub; if test $? -ne 0; then echo TFTP failed, retrying in 3s...; sleep 3; run bootcmd; fi; bootm 0x10000000' saveenv
这个脚本的逻辑很直白:先执行TFTP下载,要是返回值非0(说明下载失败),就打印提示、等3秒,然后重新执行启动命令;直到下载成功后,再启动镜像。
3. 启用U-Boot的自动重启重试功能
部分U-Boot版本支持启动失败后自动重试的功能,你可以检查配置文件里有没有CONFIG_AUTOBOOT_RETRY项,没有的话直接开启:
CONFIG_AUTOBOOT_RETRY=y # 设置重试间隔时间(单位:秒) CONFIG_AUTOBOOT_RETRY_TIME=5
开启后,当启动流程中出现错误时,U-Boot会自动等待指定时间后重新尝试整个启动流程。
另外你提到的日志里“Retry count exceeded; starting again”却没实际重试的问题,大概率是你用的U-Boot版本里这个提示只是回到命令行,而非重新执行启动命令,上面的脚本方案应该能完美解决这个问题。
内容的提问来源于stack exchange,提问作者user2913869

