在 CentOS 7 机器上设置 PXE 引导服务器时,我遇到了一个奇怪的 TFTP 问题。如果没有遇到超时问题,我无法从 TFTP 服务器检索任何文件。启动过程到此为止,我正确地从 DHCP 服务器获得了 IP 地址和文件名。但是,当要从 TFTP 服务器检索引导文件时,会出现“TFTP 打开超时”消息。如果我从本地计算机手动建立到 PXE 服务器的 TFTP 连接,我会立即访问该服务器。但如果我尝试使用“get pxelinux.0”命令,我会收到另一条超时消息。我的防火墙设置正确,如果我完全关闭防火墙也没有什么区别。SeLinux 也被禁用。如果我在端口 69 上进行 tcpdump,我会收到以下消息:
12:34:33.477401 IP 172.16.1.202.ah-esp-encap > tools.dmz.tuxme.dk.tftp: 27 RRQ "pxelinux.0" octet tsize 0
12:34:35.481131 IP 172.16.1.202.acp-port > tools.dmz.tuxme.dk.tftp: 27 RRQ "pxelinux.0" octet tsize 0
12:34:39.490793 IP 172.16.1.202.msync > tools.dmz.tuxme.dk.tftp: 27 RRQ "pxelinux.0" octet tsize 0
12:34:45.477712 IP 172.16.1.202.gxs-data-port > tools.dmz.tuxme.dk.tftp: 27 RRQ "pxelinux.0" octet tsize 0
12:34:53.441801 IP 172.16.1.202.vrtl-vmf-sa > tools.dmz.tuxme.dk.tftp: 27 RRQ "pxelinux.0" octet tsize 0
12:35:03.384065 IP 172.16.1.202.newlixengine > tools.dmz.tuxme.dk.tftp: 32 RRQ "pxelinux.0" octet blksize 1456
12:35:39.414843 IP 172.16.1.202.newlixconfig > tools.dmz.tuxme.dk.tftp: 32 RRQ "pxelinux.0" octet blksize 1456
12:36:51.422568 IP 172.16.1.202.tsrmagt > tools.dmz.tuxme.dk.tftp: 32 RRQ "pxelinux.0" octet blksize 1456
12:38:39.406732 IP 172.16.1.202.tpcsrvr > tools.dmz.tuxme.dk.tftp: 32 RRQ "pxelinux.0" octet blksize 1456
不幸的是,系统日志没有显示任何有用的信息:
Jan 15 13:13:19 tools xinetd[6993]: EXIT: tftp status=67 pid=7954 duration=0(sec)
Jan 15 13:13:21 tools xinetd[6993]: START: tftp pid=7955 from=172.16.1.202
Jan 15 13:13:21 tools in.tftpd[7955]: no user tftp: Success
Jan 15 13:13:21 tools xinetd[6993]: EXIT: tftp status=67 pid=7955 duration=0(sec)
Jan 15 13:13:25 tools xinetd[6993]: START: tftp pid=7956 from=172.16.1.202
Jan 15 13:13:25 tools in.tftpd[7956]: no user tftp: Success
Jan 15 13:13:25 tools xinetd[6993]: EXIT: tftp status=67 pid=7956 duration=0(sec)
Jan 15 13:13:31 tools xinetd[6993]: START: tftp pid=7957 from=172.16.1.202
Jan 15 13:13:31 tools in.tftpd[7957]: no user tftp: Success
/var/lib/tftpboot 目录的权限是 0755。
这是我的设置文件:
/etc/xinetd.d/tftp:
service tftp
socket_type = dgram
protocol = udp
wait = yes
user = root
server = /usr/sbin/in.tftpd
server_args = -c -v -u tftp -p -U 117 -s /var/lib/tftpboot
disable = no
per_source = 11
cps = 100 2
flags = IPv4
看起来
tcpdump
输出只包含请求,根本没有任何响应。如果这是实际发生的情况,则预期会出现超时错误。在
server_args
xinetd 的 TFTP 配置行中,您有-u tftp
. 这告诉in.tftpd
以用户身份运行tftp
。鉴于此,记录的这条消息in.tftpd
可能很重要:它说“没有用户 tftp”。用户帐户是否实际存在于您的系统中?
tftp
Success
日志消息末尾的 需要一点 C 编程知识才能理解。它可能来自一个极简的错误处理函数,它可能只是调用perror()
然后在退出之前进行任何必要的清理。该
perror()
函数从其调用者那里获取一条消息,然后附加一条与errno
变量的当前值相对应的标准错误消息。它旨在用于先前系统调用失败的情况;自定义消息应该描述遇到错误时程序正在做什么,然后标准消息应该阐明遇到的问题的类型。但是,如果程序员使用他们的错误处理函数报告了一个以其他方式捕获的错误,标准错误消息部分将显示为
Success
.我的猜测是该
in.tftpd
过程开始于xinetd
,准备切换到 usertftp
,并发现这样的用户不存在。因此,该in.tftpd
进程输出该日志消息并在没有向客户端发送任何内容的情况下终止。结尾带有误导性“成功”的简洁信息是“如果你唯一的工具是锤子,你倾向于把一切都当作钉子”的旧概念的一个例子。在这种情况下,程序员可能在其输出格式不太适合的情况下使用了他们唯一的错误处理功能。
此外,这些请求看起来有点奇怪:
tsize 0
表示客户端期望 TFTP 传输文件大小总计为 0 字节。您是否知道 UEFI PXE 规范(存在于 UEFI 2.3 版左右)要求 DHCP 服务器告诉 PXE 客户端它应该加载的文件的大小?如果您使用的是 ISC DHCP 服务器,则所需的选项可以指定为
应该是引导文件的
<size value>
大小(以字节为单位)除以 512,然后向上取整。如果我正确理解了这个问题,我遇到了类似的问题。
PXE 服务器运行顺利,没有问题,tftp 因“PXE-E32: TFTP Open timeout”而掉线
经过长时间搜索后的解决方案是更改 tftp 配置 /etc/default/tftpd:
我在 tftp 选项中添加了“-r blksize”。