第2章:TFTP服务器搭建与验证

TFTP这玩意儿,说白了就是个轻量级的文件传输工具。在嵌入式开发里,它最常见的用途就是配合U-Boot,通过网络把内核、设备树、文件系统烧到板子上。我刚开始做嵌入式那会儿,总觉得TFTP不如SCP安全,后来发现——在U-Boot阶段,你根本没得选,TFTP就是标准答案。

2.1 安装tftp-hpa与tftpd-hpa

Linux下TFTP服务器有好几个实现,我个人习惯用tftp-hpa和tftpd-hpa这套组合。HPA是H. Peter Anvin的缩写,这老哥写的代码稳定可靠,我在项目中从来没出过幺蛾子。

安装命令很简单,一行搞定:

sudo apt-get update
sudo apt-get install tftp-hpa tftpd-hpa -y

装完之后,检查一下服务状态:

sudo systemctl status tftpd-hpa

如果看到绿色的active (running),说明安装成功。嗯,这里要注意——Ubuntu和Debian系默认会把服务自动启动,但有些精简版系统可能不会,需要手动启。

我的习惯:装完立刻检查状态,别等到烧录时才发现服务没跑起来。我曾经在一个项目里折腾了半小时,最后发现只是忘了启动服务。

2.2 配置TFTP根目录

TFTP需要一个根目录,用来存放你要传输的文件。默认配置在/etc/default/tftpd-hpa里,我们来看看:

sudo cat /etc/default/tftpd-hpa

默认内容大概是这样的:

TFTP_USERNAME="tftp"
TFTP_DIRECTORY="/var/lib/tftpboot"
TFTP_ADDRESS="0.0.0.0:69"
TFTP_OPTIONS="--secure"

几个关键参数说明:

参数 含义 建议值
TFTP_USERNAME 运行服务的用户 tftp(保持默认)
TFTP_DIRECTORY 根目录路径 /var/lib/tftpboot
TFTP_ADDRESS 监听地址和端口 0.0.0.0:69
TFTP_OPTIONS 启动选项 --secure(限制根目录)

我个人习惯把根目录改到/srv/tftp,这样更符合FHS标准。改法如下:

sudo mkdir -p /srv/tftp
sudo chmod 777 /srv/tftp
sudo sed -i 's|TFTP_DIRECTORY="/var/lib/tftpboot"|TFTP_DIRECTORY="/srv/tftp"|' /etc/default/tftpd-hpa
权限陷阱:TFTP根目录的权限一定要给够。我见过有人把目录权限设成755,结果客户端能列出文件但下载失败。建议直接用777,反正TFTP只在内网用,安全性不是首要考虑。

2.3 启动服务与本地回环测试

配置改完后,重启服务让配置生效:

sudo systemctl restart tftpd-hpa

然后放一个测试文件到根目录:

echo "Hello TFTP" | sudo tee /srv/tftp/test.txt

接下来就是见证奇迹的时刻——本地回环测试。用tftp客户端连本机:

tftp 127.0.0.1
tftp> get test.txt
tftp> quit

如果当前目录下出现了test.txt,内容为Hello TFTP,那就成了。

验证清单:
  • 服务状态:systemctl status tftpd-hpa → active
  • 端口监听:sudo netstat -anp | grep :69 → 有tftpd进程
  • 文件传输:tftp 127.0.0.1 -c get test.txt → 成功下载

为什么会强调本地回环测试?因为这一步能帮你把问题范围缩小。如果本地都传不了,那肯定是服务器配置有问题;如果本地能传但板子不行,那就是网络或防火墙的问题。我在项目中就用这个思路,省了不少排查时间。

2.4 TFTP工作流程示意图

下面这张图展示了TFTP从请求到响应的完整流程,我画出来方便你理解:

TFTP文件传输流程 TFTP客户端 TFTP服务器 ① 读请求 (RRQ) ② 数据块 (DATA) ③ 确认包 (ACK) ②③循环直到传输完成 传输完成 TFTP基于UDP,不加密、不认证,适合局域网嵌入式调试 每个数据块512字节,不足512字节表示传输结束

2.5 常见问题与避坑指南

搭建过程中,有几个坑我替你们踩过了:

  • 端口被占用:TFTP默认用69端口,如果被其他服务占了,启动会失败。用sudo lsof -i :69查一下。
  • 防火墙拦截:有些系统默认开了ufw或firewalld,记得放行:sudo ufw allow 69/udp。
  • 文件权限问题:根目录和文件都要有读权限,我习惯统一设成777省心。
  • SELinux捣乱:如果你用的是CentOS/RHEL,记得关SELinux或加规则,不然文件传不出去。
我曾经踩过的坑:有一次在Ubuntu 20.04上装TFTP,怎么都连不上。查了半天,发现是systemd的PrivateNetwork限制导致服务无法监听网络。解决办法是在/etc/systemd/system/tftpd-hpa.service.d/override.conf里加上PrivateNetwork=no,然后systemctl daemon-reload重启服务。