PXE 부팅 중 TFTP 시간 초과 문제

PXE 부팅 중 TFTP 시간 초과 문제

CentOS 7 시스템에서 PXE 부팅 서버를 설정할 때 이상한 TFTP 문제가 발생했습니다. 시간 초과 문제가 발생하지 않으면 TFTP 서버에서 파일을 검색할 수 없습니다. 부팅 프로세스 지금까지 DHCP 서버로부터 IP 주소와 파일 이름을 올바르게 얻었습니다. 그러나 TFTP 서버에서 부팅 파일을 검색하려고 하면 "TFTP open timeout" 메시지가 나타납니다. 로컬 컴퓨터에서 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_argsxinetd의 TFTP 구성 라인에는 사용자로 실행하라는 -u tftp메시지가 있습니다 . 이러한 관점에서 볼 때, 녹음된 이 메시지는 중요할 수 있습니다.in.tftpdtftpin.tftpd

Jan 15 13:13:21 tools in.tftpd[7955]: no user tftp: Success

"사용자 없음 tftp"라고 표시됩니다.tftp사용자 계정이 실제로 시스템에 존재합니까?

로그 메시지 끝에 있는 내용을 Success이해하려면 C 프로그래밍 지식이 필요합니다. 이는 호출한 perror()다음 종료하기 전에 필요한 정리 작업을 수행 하는 최소한의 오류 처리 함수에서 비롯될 수 있습니다 .

perror()함수는 호출자로부터 메시지를 가져와 변수의 현재 값에 해당하는 표준 오류 메시지를 추가합니다 errno. 이는 이전 시스템 호출이 실패한 상황에서 사용하도록 설계되었습니다. 사용자 정의 메시지는 오류가 발생했을 때 프로그램이 수행 중이던 작업을 설명해야 하며 표준 메시지는 발생한 문제 유형을 명확히 해야 합니다.

그러나 프로그래머가 오류 처리 기능을 사용하여 발견된 오류를 보고하는 경우 표준 오류 메시지 부분이 나타납니다 Success.

내 생각엔 in.tftpd프로세스가 시작되고 xinetduser 로 전환할 준비가 되었으며 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 버전 2.3에 존재했던 UEFI PXE 사양에서는 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"를 추가했습니다.

관련 정보