第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从请求到响应的完整流程,我画出来方便你理解:
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重启服务。