PXE 서버 구축 가이드

PXE(Network Boot) 서버를 구축하면 네트워크를 통해 클라이언트 시스템에 운영체제를 자동으로 설치할 수 있습니다. 본 문서는 CentOS 7.9을 기준으로 PXE 서버를 구성하는 절차와 그 이유를 설명합니다. PXE 서버의 IP는 192.168.161.245입니다.


0. SELinux 비활성화

setenforce 0
sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config

 

1. 테스트 환경 및 권장 사양

권장 테스트 환경

항목 권장 사양
PXE 서버 OS CentOS 7.9 (Minimal 설치 권장)
PXE 서버 IP 192.168.161.245
CPU 2코어 이상
메모리 최소 2GB, 권장 4GB 이상
디스크 최소 20GB 이상 (ISO 저장 및 서비스용)
PXE 클라이언트 PXE 부팅을 지원하는 가상머신 또는 물리 머신
네트워크 설정 동일 브로드캐스트 도메인 (DHCP 전달 가능)

※ PXE 클라이언트 테스트는 VirtualBox, VMware, QEMU 등 가상머신 사용 가능.
※ 가상환경에서는 PXE 서버와 동일 네트워크(브리지 또는 내부망) 사용 필수.


2. 구성 요소 및 역할

구성 요소 설명
DHCP 클라이언트에 IP 및 부트로더 파일명 전달
TFTP PXE 부트로더 및 커널/램디스크 이미지 제공
HTTP 설치 이미지(CentOS ISO) 제공
PXELINUX TFTP를 통해 전송되는 부트로더
vmlinuz, initrd.img 설치를 위한 커널 및 초기 RAM 디스크

3. OS ISO 다운로드

CentOS 7.9 설치 ISO를 다운로드합니다.

wget https://vault.centos.org/7.9.2009/isos/x86_64/CentOS-7-x86_64-DVD-2009.iso -P /root

 

4. 패키지 설치

PXE 서버를 구축하기 위해 필요한 핵심 서비스들을 설치합니다. 이 단계에서는 네트워크 부팅에 필요한 DHCP, TFTP, HTTP 서비스를 제공하고, PXELINUX 부트로더를 구성하기 위한 패키지를 준비합니다.

yum install -y dhcp tftp-server xinetd syslinux httpd

 

5. TFTP 설정

TFTP(Trivial File Transfer Protocol)는 PXE 부트 환경에서 클라이언트가 초기 부트로더 파일을 가져오는 데 사용됩니다.

/etc/xinetd.d/tftp 설정

service tftp {
    socket_type     = dgram
    protocol        = udp
    wait            = yes
    user            = root
    server          = /usr/sbin/in.tftpd
    server_args     = -s /var/lib/tftpboot
    disable         = no
}

systemctl enable xinetd
systemctl start xinetd

 

6. ISO 마운트 및 HTTP 설정

PXE 클라이언트가 운영체제 설치에 사용할 설치 미디어를 제공하려면, CentOS ISO 파일을 마운트하여 HTTP를 통해 접근 가능하게 만들어야 합니다. 이를 통해 PXE 클라이언트는 설치 과정에서 필요한 모든 패키지를 PXE 서버로부터 받게 됩니다.

📁 ISO 마운트 절차

mkdir -p /var/www/html/centos7
mount -o loop /root/CentOS-7-x86_64-DVD-2009.iso /var/www/html/centos7
  • mount -o loop: ISO 파일을 가상 장치로 마운트함
  • /var/www/html/centos7: Apache가 서비스하는 디렉터리, PXE 클라이언트가 설치 패키지를 이 경로를 통해 받아감

 

🌐 HTTP 서비스 시작

systemctl enable httpd
systemctl start httpd

Apache HTTP 서버를 부팅 시 자동 시작하도록 설정하고, 즉시 시작합니다.

⚠️ ISO 구조 주의 사항

📌 CentOS ISO는 종류에 따라 부트 파일 경로가 다를 수 있습니다:

  • DVD ISO: /isolinux/vmlinuz, /isolinux/initrd.img
  • Minimal ISO: /images/pxeboot/vmlinuz, /images/pxeboot/initrd.img

PXE 부트에 필요한 vmlinuz와 initrd.img 파일을 정확한 위치에서 복사해야 하며, mount 후 디렉터리 구조를 확인하는 것이 안전합니다.

ls /var/www/html/centos7/isolinux/ 
# 또는 
ls /var/www/html/centos7/images/pxeboot/

 

7. 부트 파일 구성

mkdir -p /var/lib/tftpboot/pxelinux.cfg
cp /usr/share/syslinux/pxelinux.0 /var/lib/tftpboot/
cp /usr/share/syslinux/menu.c32 /var/lib/tftpboot/

cp /var/www/html/centos7/isolinux/vmlinuz /var/lib/tftpboot/
cp /var/www/html/centos7/isolinux/initrd.img /var/lib/tftpboot/
chmod 644 /var/lib/tftpboot/vmlinuz /var/lib/tftpboot/initrd.img
restorecon -Rv /var/lib/tftpboot/

 

8. PXE 부트 메뉴 설정

/var/lib/tftpboot/pxelinux.cfg/default

default menu.c32
prompt 0
timeout 50
ONTIMEOUT install

label install
menu label ^Install CentOS 7 with Kickstart
kernel vmlinuz
append initrd=initrd.img inst.repo=http://192.168.161.245/centos7 inst.ks=http://192.168.161.245/ks.cfg

 

9. DHCP 서버 설정

/etc/dhcp/dhcpd.conf

default-lease-time 600;
max-lease-time 7200;
authoritative;

subnet 192.168.161.0 netmask 255.255.255.0 {
    range 192.168.161.100 192.168.161.200;
    option routers 192.168.161.1;
    filename "pxelinux.0";
    next-server 192.168.161.245;
}

systemctl enable dhcpd
systemctl start dhcpd

 

10. 방화벽 열기

firewall-cmd --add-service=dhcp --permanent
firewall-cmd --add-service=http --permanent
firewall-cmd --add-service=tftp --permanent
firewall-cmd --add-port=67/udp --permanent
firewall-cmd --add-port=69/udp --permanent
firewall-cmd --reload

 

11. Kickstart 자동 설치 설정 (ks.cfg)

PXE 부팅 후 완전 무인 설치를 수행하려면 Kickstart 파일을 사용합니다. 먼저 Kickstart 파일을 HTTP 서버가 접근 가능한 경로에 작성합니다.

/var/www/html/ks.cfg

lang ko_KR.UTF-8
keyboard us
timezone Asia/Seoul --isUtc
network --bootproto=dhcp --hostname=centos7-auto
rootpw --iscrypted <생성한 암호 해시>
user --name=alpha --password=<유저 해시> --iscrypted --gecos="Alpha User"
authconfig --enableshadow --passalgo=sha512
selinux --disabled
firewall --disabled
skipx
text
reboot
clearpart --all --initlabel
autopart
url --url="http://192.168.161.245/centos7"

%packages
@core
%end

%post
echo "설치 완료" > /root/install.log
%end

이후 PXE 메뉴 설정 파일 /var/lib/tftpboot/pxelinux.cfg/default에서 해당 Kickstart 파일을 참조하도록 아래와 같이 inst.ks= 옵션을 추가해야 합니다.

label install
menu label ^Install CentOS 7 with Kickstart
kernel vmlinuz
append initrd=initrd.img inst.repo=http://192.168.161.245/centos7 inst.ks=http://192.168.161.245/ks.cfg

 

12. 테스트

  1. PXE 부팅이 가능한 클라이언트를 준비하고 BIOS에서 PXE 부팅을 활성화합니다.
  2. PXE 서버가 IP, pxelinux.0, vmlinuz, initrd.img, HTTP repo, ks.cfg를 정상 제공하는지 확인합니다.
  3. tcpdump 명령어를 통해 DHCP, TFTP, HTTP 트래픽을 실시간으로 모니터링하여 클라이언트가 정상적으로 PXE 서버에 접근하고 있는지 확인할 수 있습니다.
tcpdump -i enp0s3 port 67 or port 69 or port 80

 

13. 실무 주의 사항 및 오류 발생 지점 점검 및 최종 점검표

⚠️ ISO 구조별 경로 차이 고려

  • DVD ISO: /isolinux/vmlinuz, /isolinux/initrd.img
  • Minimal ISO: /images/pxeboot/vmlinuz, /images/pxeboot/initrd.img

🔐 SELinux 활성화 시 HTTP 접근 차단 가능성

  • restorecon 외에도 다음 명령을 사용하여 HTTP에서 ks.cfg 파일 접근을 보장해야 함.
chcon -t httpd_sys_content_t /var/www/html/ks.cfg

또는 ks.cfg/var/www/html/centos7/ 내부로 이동하여 이미 허용된 경로를 활용할 수도 있음.

🔥 방화벽 포트 누락 가능성

  • DHCP 요청 수신을 위해 67/udp 포트 추가 필요

🔐 Kickstart 암호 해시 예시 누락

  • root와 사용자 계정에 사용할 해시값은 다음 명령으로 생성
openssl passwd -6

 

✅ 최종 확인 체크리스트 (정상 동작을 위해 필수)

항목 설명 확인
🔧 SELinux 비활성화 setenforce 0 + config 수정 ✅ 적용됨
🔐 방화벽 포트 DHCP(67/udp), TFTP(69/udp), HTTP(80/tcp) 허용 ✅ 적용됨
🌐 네트워크 구성 PXE 서버와 클라이언트가 같은 브로드캐스트 도메인 ✅ 설명 포함
🧱 ISO 마운트 경로 /var/www/html/centos7에 마운트, 경로 정확성 확인 ✅ ISO 구조 안내 포함
📂 부트 파일 위치 pxelinux.0, vmlinuz, initrd.img TFTP 경로 배치 ✅ 완료됨
📄 Kickstart 파일 존재 /var/www/html/ks.cfg 또는 권한 설정 포함 ✅ 설명 및 chcon 안내 포함
🔑 패스워드 해시 생성 openssl passwd -6로 root/user 계정 해시 준비 ✅ 안내 포함
🧪 tcpdump 테스트 DHCP/TFTP/HTTP 트래픽 확인법 제시 ✅ 명령어 포함

🔒 유의사항 요약

  • PXE 클라이언트는 무조건 같은 네트워크 대역에 있어야 함 (NAT나 호스트 전용 어댑터 안 됨)
  • Kickstart 파일 URL 오타/접근불가 시 설치 실패
  • ISO 마운트 경로와 실제 부트 이미지 경로 불일치 시 PXE 부팅 실패
  • rootpw 또는 user 해시가 잘못된 경우 설치 후 로그인 불가