3. 配置TFTP服务

任务说明

本案例目标是在Ubuntu主机上配置TFTP服务,用于向目标板(ARM嵌入式Linux开发板)提供内核镜像(zImage/uImage)和设备树(.dtb)文件的下载。TFTP采用UDP 69端口,无认证机制,适合U-Boot引导阶段使用。

1. 安装TFTP服务端

sudo apt update
sudo apt install -y tftpd-hpa

2. 配置TFTP服务

编辑配置文件 /etc/default/tftpd-hpa:

sudo nano /etc/default/tftpd-hpa

内容如下:

TFTP_USERNAME="tftp"
TFTP_DIRECTORY="/srv/tftp"
TFTP_ADDRESS="0.0.0.0:69"
TFTP_OPTIONS="--secure --create"
  • TFTP_DIRECTORY:TFTP根目录,所有下载文件均相对于此目录。
  • TFTP_ADDRESS:监听所有网卡的69端口。
  • --secure:限制访问仅限于TFTP根目录,防止路径穿越。
  • --create:允许通过TFTP上传文件(可选,若仅下载可去掉)。

3. 创建根目录并设置权限

sudo mkdir -p /srv/tftp
sudo chown -R tftp:tftp /srv/tftp
sudo chmod -R 755 /srv/tftp

4. 放置内核与设备树文件

将编译好的内核镜像和设备树复制到TFTP根目录:

sudo cp ~/kernel/arch/arm/boot/zImage /srv/tftp/
sudo cp ~/kernel/arch/arm/boot/dts/your-board.dtb /srv/tftp/
sudo chown tftp:tftp /srv/tftp/zImage /srv/tftp/your-board.dtb

确认文件就位:

ls -l /srv/tftp/

5. 重启并验证服务状态

sudo systemctl restart tftpd-hpa
sudo systemctl status tftpd-hpa

预期输出中应包含 active (running),且监听 0.0.0.0:69。

6. 本机自测(验证路径)

安装客户端工具并测试下载:

sudo apt install -y tftp-hpa
cd /tmp
tftp 127.0.0.1 <<EOF
get zImage
quit
EOF
ls -l /tmp/zImage

判定标准:若 /tmp/zImage 存在且大小与 /srv/tftp/zImage 一致,则TFTP服务配置成功。

7. 目标板下载验证(交叉验证)

在U-Boot命令行中,确保主机IP与目标板IP在同一网段,执行:

setenv serverip 192.168.1.100   # 主机IP
setenv ipaddr 192.168.1.50      # 目标板IP
tftp 0x82000000 zImage
tftp 0x83000000 your-board.dtb

判定标准:U-Boot输出 Bytes transferred = xxx,且无超时或文件未找到错误,即表示目标板可通过TFTP成功下载内核与设备树。

8. 故障排查要点

  • 连接超时:检查主机防火墙 sudo ufw status,若开启则允许69/udp:sudo ufw allow 69/udp。
  • 文件未找到:确认文件名与TFTP根目录下完全一致(区分大小写)。
  • 权限拒绝:确认 /srv/tftp 下文件属主为 tftp 或权限为644。
Ubuntu 主机 (TFTP Server) tftpd-hpa 服务 监听 0.0.0.0:69/udp /srv/tftp/ zImage (内核镜像) your-board.dtb (设备树) 属主: tftp:tftp 权限: 644 UDP 69 TFTP 下载请求 ARM 目标板 (U-Boot) U-Boot 引导程序 tftp 0x82000000 zImage DDR 内存 0x82000000 0x83000000 启动流程 ① 下载 zImage → DDR ② 下载 .dtb → DDR ③ bootz 0x82000000 - 0x83000000 验证: 文件大小一致 验证: Bytes transferred

验证判定标准汇总

检查项命令/操作通过条件
服务运行systemctl status tftpd-hpaactive (running)
本机下载tftp 127.0.0.1 -c get zImage文件存在且大小一致
目标板下载U-Boot中执行 tftp 0x82000000 zImage输出 Bytes transferred,无错误

完成以上配置后,主机TFTP服务即可为目标板提供内核与设备树的下载通道,供后续U-Boot引导Linux内核使用。