在 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
答案1
看起来tcpdump
输出只包含请求,根本不包含任何响应。如果这是实际发生的情况,那么就会出现超时错误。
server_args
在xinetd 的 TFTP 配置行中,您有-u tftp
.这告诉in.tftpd
以用户身份运行tftp
。鉴于此,记录的这条消息in.tftpd
可能很重要:
Jan 15 13:13:21 tools in.tftpd[7955]: no user tftp: Success
它说“没有用户 tftp”。该tftp
用户帐户实际上存在于您的系统上吗?
日志消息末尾的Success
需要一些 C 编程知识才能理解。它可能来自一个极简的错误处理函数,该函数可能只是调用perror()
,然后在退出之前进行任何必要的清理。
该perror()
函数从调用者处获取消息,然后向其附加与变量当前值相对应的标准错误消息errno
。它被设计用于先前系统调用失败的情况;自定义消息应描述遇到错误时程序正在执行的操作,然后标准消息应阐明遇到的问题的类型。
但是,如果程序员使用错误处理函数报告以其他方式捕获的错误,则标准错误消息部分将显示为Success
。
我的猜测是该in.tftpd
进程由 启动xinetd
,准备切换到 user tftp
,并发现该用户不存在。因此,该in.tftpd
进程输出该日志消息并终止,而不向客户端发送任何内容。
结尾处带有误导性“成功”的简洁信息是“如果你唯一的工具是锤子,你倾向于将所有东西都视为钉子”的旧概念的一个例子。在这种情况下,程序员可能在其输出格式不太适合的情况下使用了他们唯一的错误处理函数。
另外,这些请求看起来有点奇怪:
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
表示tsize 0
客户端正在等待文件大小总计为 0 字节的 TFTP 传输。
您是否知道 UEFI PXE 规范(存在于 UEFI 2.3 版左右)要求 DHCP 服务器告诉 PXE 客户端它应该加载的文件的大小?如果您使用 ISC DHCP 服务器,则所需选项可以指定为
option boot-size <size value>;
应该<size value>
是引导文件的大小(以字节为单位)除以 512,然后向上舍入。
答案2
如果我正确理解了这个问题,我就遇到了类似的问题。
PXE服务器运行顺利,没有问题,tftp掉线,出现“PXE-E32: TFTP Open timeout”
经过长时间搜索后的解决方案是更改 tftp 配置 /etc/default/tftpd:
TFTP_USERNAME="tftp"
TFTP_DIRECTORY="/srv/tftp"
TFTP_ADDRESS="0.0.0.0:69"
TFTP_OPTIONS="--secure -l -v -r blksize"
我在 tftp 选项中添加了“-r blksize”。