tftp本身无守护进程,必须由xinetd按需启动以节省资源;直接systemctl start tftp会失败,因无对应服务单元,且硬启tftpd易致端口冲突或权限异常。

为什么必须用 xinetd 管理 tftp-server
TFTP 本身不带守护进程,Linux 下的 tftp-server 默认由 xinetd 按需拉起——客户端发请求时才启动服务,避免常驻、节省资源。直接 systemctl start tftp 会失败,因为服务单元不存在;硬启 tftpd 进程又容易端口冲突或权限异常。
-
xinetd配置文件是/etc/xinetd.d/tftp,关键项是disable = no(不是yes) - 修改后必须
systemctl restart xinetd,不是systemctl restart tftp - 验证是否生效:运行
ss -uln | grep :69,看到udp+127.0.0.1:69或*:69才算监听成功
/var/lib/tftpboot 权限和文件结构不能错
TFTP 根目录默认是 /var/lib/tftpboot,但它的权限和内容组织直接影响 PXE 客户端能否读取 pxelinux.0 和后续配置。常见错误是复制了文件却因 SELinux 或用户组限制被拒绝访问。
- 确保目录属主为
root:root,权限设为755(chmod 755 /var/lib/tftpboot) - SELinux 必须开启对应布尔值:
setsebool -P tftp_anon_read 1(否则即使文件存在也返回 “File not found”) - 必需文件至少包括:
pxelinux.0、menu.c32(来自syslinux-tftpboot包),以及pxelinux.cfg/目录(内含default配置文件) -
pxelinux.0不要放在子目录里——它必须在/var/lib/tftpboot/根下,否则 DHCP 的filename "pxelinux.0"会找不到
pxelinux.0 和 pxelinux.cfg/default 怎么配才不报错
pxelinux.0 是引导加载器,真正决定装什么系统的是 pxelinux.cfg/default。这个文件写错,客户端会卡在 “boot:” 提示或报 “No DEFAULT or UI configuration directive”。
-
default文件必须是纯文本,无 BOM,换行符为 LF(Windows 编辑器容易写成 CRLF,导致解析失败) - 最简可用内容示例:
default install<br>label install<br> kernel centos8/vmlinuz<br> append initrd=centos8/initrd.img inst.ks=http://192.168.10.100/ks.cfg
-
kernel和initrd路径是相对于/var/lib/tftpboot/的,比如上面的vmlinuz实际位置是/var/lib/tftpboot/centos8/vmlinuz - 别漏掉
inst.ks=参数——没有它,即使引导成功也会进交互式安装,不是无人值守
测试 TFTP 是否真能被 PXE 客户端访问
光看 ss -uln | grep :69 不够。PXE 客户端用的是 UDP,且对路径敏感,本地 tftp 命令测试更接近真实行为。
- 在服务端执行:
tftp 127.0.0.1 -c get pxelinux.0 /dev/null,成功说明文件可读、权限 OK - 从另一台同网段 Linux 机器测试:
echo "get pxelinux.0" | tftp 192.168.10.100,能下载下来才算网络层通 - 如果报 “Transfer timed out”,先检查防火墙:
firewall-cmd --add-port=69/udp --permanent && firewall-cmd --reload - 注意:Windows 自带
tftp客户端默认只支持 ASCII 模式,可能无法正确获取二进制的pxelinux.0,建议用 Linux 测试
pxelinux.0 能被客户端通过 TFTP 下载并执行,后面就只是配置文件和镜像路径的事了。











