嵌入式开发环境搭建: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允许客户端上传文件。
我的习惯:我会把TFTP根目录放在/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
避坑指南:我曾经在CentOS 7上折腾了一下午,发现SELinux的布尔值虽然开了,但文件上下文没设对。建议用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服务器搭建流程 TFTP服务器搭建流程 1. 选型 2. 安装 3. 配置 4. 防火墙配置 5. SELinux配置 6. 目录权限 7. 自启动配置 8. 本地测试 ✅ 嵌入式设备TFTP烧录 💡 提示:每一步都可用 systemctl status tftpd-hpa 验证状态

看到这张图你应该明白了:TFTP服务器搭建不是装个包就完事,防火墙、SELinux、权限、自启动,每个环节都可能掉坑。按这个流程走一遍,基本不会出问题。

好了,TFTP服务器已经跑起来了。下一件事就是让嵌入式设备通过uboot来烧录固件——那是咱们后面章节的内容。