嵌入式开发环境搭建:Linux主机TFTP服务器安装与配置
TFTP服务器,说白了就是嵌入式设备在裸机或uboot阶段用来下载固件的"快递员"。没有它,你的板子就是一块砖。今天咱们就把这个快递员请进Linux主机,顺便把路铺好、权限设对、防火墙放行。
我个人习惯在Ubuntu/Debian系发行版上做开发,所以下面的操作以apt包管理器为例。如果你用CentOS或Fedora,把apt换成yum/dnf就行,原理一样。
1. TFTP服务器选型:tftp-hpa vs atftpd
Linux下主流的TFTP服务器有两个:tftp-hpa和atftpd。我刚开始做嵌入式时也纠结过选哪个,后来两个都用了一遍,总结出下面的对比。
| 特性 | tftp-hpa | atftpd |
|---|---|---|
| 包名 | tftpd-hpa | atftpd |
| 配置方式 | /etc/default/tftpd-hpa | /etc/default/atftpd |
| 多线程支持 | 单线程(fork模式) | 多线程(并发处理) |
| 日志输出 | syslog | stdout/syslog均可 |
| 适用场景 | 轻量、稳定、嵌入式常用 | 高并发、多客户端同时烧录 |
| 我的推荐 | ⭐ 首选(兼容性最好) | 团队开发/产线场景 |
我在项目里遇到过用atftpd时,某些老版本uboot的TFTP客户端会超时重传导致烧录失败。换成tftp-hpa后一次通过。所以如果你只是个人开发,我建议直接上tftp-hpa,省心。
2. 安装tftp-hpa服务器
安装过程非常简单,两条命令搞定:
sudo apt update
sudo apt install tftpd-hpa tftp-hpa
这里我同时装了tftpd-hpa(服务器)和tftp-hpa(客户端)。客户端用来本地测试,非常方便。装完后检查一下服务状态:
sudo systemctl status tftpd-hpa
如果看到绿色的active (running),说明安装成功。嗯,这里要注意:Ubuntu 18.04之后默认用systemd管理服务,所以别再用service命令了。
3. 配置TFTP服务器
tftp-hpa的配置文件在/etc/default/tftpd-hpa。默认内容长这样:
# /etc/default/tftpd-hpa
TFTP_USERNAME="tftp"
TFTP_DIRECTORY="/srv/tftp"
TFTP_ADDRESS="0.0.0.0:69"
TFTP_OPTIONS="--secure --create"
我来解释一下每个参数:
- TFTP_USERNAME:运行服务的系统用户,默认tftp。我建议保持默认,不要用root跑服务——安全第一。
- TFTP_DIRECTORY:TFTP根目录,所有文件都放这里。默认
/srv/tftp,你可以改成/home/你的用户名/tftp,方便开发。 - TFTP_ADDRESS:监听地址和端口。
0.0.0.0:69表示监听所有网卡的69端口。如果你只想让某个网卡提供服务,可以改成192.168.1.100:69。 - TFTP_OPTIONS:启动选项。
--secure限制客户端只能访问根目录(chroot),--create允许客户端上传文件。
/home/developer/tftp,这样用scp传固件时不用切目录。改完配置记得重启服务:sudo systemctl restart tftpd-hpa。
4. 防火墙规则与SELinux配置
TFTP使用UDP 69端口。很多新手装好服务后客户端连不上,十有八九是防火墙没放行。我曾经在客户现场排查了半小时,最后发现是ufw默认拒绝了UDP 69。
UFW(Ubuntu默认防火墙)配置:
sudo ufw allow 69/udp
sudo ufw reload
iptables配置(如果你用传统防火墙):
sudo iptables -A INPUT -p udp --dport 69 -j ACCEPT
sudo iptables-save > /etc/iptables/rules.v4
SELinux(CentOS/RHEL用户注意):
如果你用的是CentOS或Fedora,SELinux默认会阻止TFTP服务访问文件。需要执行:
sudo setsebool -P tftp_home_dir on
sudo semanage port -a -t tftp_port_t -p udp 69
restorecon -Rv /srv/tftp恢复一下安全上下文。
5. TFTP根目录权限设置
权限问题是最容易被忽略的。TFTP服务以tftp用户运行,所以根目录必须让tftp用户可读(甚至可写,如果你需要上传功能)。
标准做法:
sudo mkdir -p /srv/tftp
sudo chown -R tftp:tftp /srv/tftp
sudo chmod -R 755 /srv/tftp
如果你需要客户端能上传文件(比如uboot用tftp put保存环境变量),目录权限要改成777:
sudo chmod -R 777 /srv/tftp
但说实话,我一般只给755。上传功能在产线场景才需要,个人开发时用scp传文件更安全。
- 根目录所有者是
tftp:tftp - 目录权限至少755(读+执行)
- 文件权限至少644(读)
- 父目录(如
/srv)不能有noexec挂载选项
6. TFTP服务自启动配置
开发主机经常重启,服务必须开机自启。用systemd配置:
sudo systemctl enable tftpd-hpa
sudo systemctl is-enabled tftpd-hpa
第二条命令会输出enabled,确认自启动生效。如果你想立即启动但不影响下次开机:
sudo systemctl start tftpd-hpa
嗯,这里有个小细节:如果你改了配置文件,记得restart而不是reload。TFTP服务器不支持热加载配置。
7. 本地测试验证
服务配好了,怎么知道能不能用?用本地客户端测一下:
# 在TFTP根目录放一个测试文件
echo "Hello TFTP" | sudo tee /srv/tftp/test.txt
# 用tftp客户端下载
tftp localhost
tftp> get test.txt
tftp> quit
# 检查下载的文件
cat test.txt
如果看到Hello TFTP,说明服务正常。如果报Transfer timed out,检查防火墙和SELinux。
8. 知识体系总览
下面这张图把整个TFTP服务器搭建的流程串起来了,方便你对照操作:
看到这张图你应该明白了:TFTP服务器搭建不是装个包就完事,防火墙、SELinux、权限、自启动,每个环节都可能掉坑。按这个流程走一遍,基本不会出问题。
好了,TFTP服务器已经跑起来了。下一件事就是让嵌入式设备通过uboot来烧录固件——那是咱们后面章节的内容。