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. 테스트
- PXE 부팅이 가능한 클라이언트를 준비하고 BIOS에서 PXE 부팅을 활성화합니다.
- PXE 서버가 IP, pxelinux.0, vmlinuz, initrd.img, HTTP repo, ks.cfg를 정상 제공하는지 확인합니다.
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 해시가 잘못된 경우 설치 후 로그인 불가