PXE Kickstart 구축은 DHCP가 부팅 위치를 안내하고, UEFI HTTP 또는 PXE/TFTP가 부트로더와 커널을 전달하며, HTTP 서버가 설치 트리와 Kickstart 파일을 제공하는 자동 설치 구조입니다. 현대 UEFI 장비는 펌웨어가 지원한다면 UEFI HTTP Boot를 우선 검토하고, 기존 장비 호환을 위해 PXE/TFTP 경로를 함께 설계합니다.

이 글은 Rocky Linux 9.8 계열을 예로 들지만 설치 미디어의 커널·initrd·패키지 트리는 반드시 같은 릴리스로 맞춰야 합니다. DHCP는 네트워크 전체에 영향을 주므로 기존 운영 DHCP와 겹치지 않는 격리 VLAN에서 먼저 시험하십시오.

PXE Kickstart 구축 아키텍처: DHCP, UEFI HTTP, PXE TFTP, HTTP 설치 트리와 Anaconda
UEFI HTTP 우선 경로와 PXE/TFTP 호환 경로가 같은 Kickstart 설치 트리로 합류하는 구조

PXE Kickstart 구축 구성 요소

구성 요소 역할 운영 기준
DHCP IP와 부팅 파일·서버 안내 기존 DHCP와 권한 충돌 금지
UEFI HTTP 펌웨어가 HTTP로 부트 이미지 수신 지원 장비에서 권장
TFTP/PXE 구형 BIOS·UEFI 부트 파일 전달 작은 부트 파일만 제공
HTTP 커널·initrd·설치 트리·ks.cfg 접근 로그와 최소 노출
Kickstart Anaconda 설치 응답 자동화 검증·버전 관리·비밀 분리

1단계: Rocky Linux ISO 검증과 설치 트리 준비

curl --fail --location --remote-name   https://download.rockylinux.org/pub/rocky/9/isos/x86_64/CHECKSUM
sha256sum Rocky-9.8-x86_64-dvd.iso
grep 'Rocky-9.8-x86_64-dvd.iso' CHECKSUM

sudo mount -o loop,ro Rocky-9.8-x86_64-dvd.iso /mnt/rocky9
sudo install -d -m 0755 /var/www/html/rocky/9.8
sudo rsync -aH --delete /mnt/rocky9/ /var/www/html/rocky/9.8/
sudo restorecon -RFv /var/www/html/rocky

체크섬은 ISO를 내려받은 같은 경로가 아니라 공식 사이트에서 확인한 값과 비교합니다. 마운트한 ISO는 읽기 전용으로 두고, 웹 루트에는 전체 설치 트리를 보존합니다.

2단계: PXE Kickstart 구축 HTTP 서비스

sudo dnf install -y httpd
sudo systemctl enable --now httpd
sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --reload

curl --fail --head http://192.0.2.10/rocky/9.8/.treeinfo
sudo journalctl -u httpd --since '-10 min' --no-pager

3단계: TFTP 부트 파일 배치

패키지 이름과 파일 위치는 배포판 저장소에서 확인합니다. UEFI 클라이언트에는 shim과 GRUB, BIOS 클라이언트에는 PXELINUX 계열 파일이 필요합니다. Secure Boot를 쓰는 경우 공식 서명 파일을 임의 바이너리로 교체하지 않습니다.

sudo dnf install -y tftp-server syslinux-tftpboot grub2-efi-x64 shim-x64
sudo install -d -m 0755 /var/lib/tftpboot/{pxelinux.cfg,rocky9}
sudo cp -a /usr/share/syslinux/{pxelinux.0,ldlinux.c32,libcom32.c32,libutil.c32}   /var/lib/tftpboot/
sudo cp -a /mnt/rocky9/images/pxeboot/{vmlinuz,initrd.img}   /var/lib/tftpboot/rocky9/
sudo restorecon -RFv /var/lib/tftpboot
UEFI shim·GRUB 파일의 실제 패키지 경로는 Rocky 9.8 패키지에서 확인해 복사하십시오. 경로를 추측해 자동화하면 펌웨어 유형에 따라 부팅이 실패합니다.

4단계: 격리 실습망의 DHCP·TFTP 예시

다음 dnsmasq 설정은 전용 실습 VLAN 예시입니다. 운영망에 이미 DHCP가 있으면 적용하지 말고 기존 DHCP 관리자가 아키텍처별 bootfile과 next-server 옵션을 구성해야 합니다.

port=0
interface=ens192
bind-interfaces
dhcp-range=192.0.2.100,192.0.2.180,255.255.255.0,12h
dhcp-option=3,192.0.2.1
dhcp-option=6,192.0.2.53

enable-tftp
tftp-root=/var/lib/tftpboot
dhcp-match=set:efi64,option:client-arch,7
dhcp-boot=tag:efi64,shimx64.efi
dhcp-boot=tag:!efi64,pxelinux.0
log-dhcp
sudo dnsmasq --test
sudo systemctl enable --now dnsmasq
sudo firewall-cmd --permanent --add-service=dhcp
sudo firewall-cmd --permanent --add-service=tftp
sudo firewall-cmd --reload
sudo journalctl -u dnsmasq -f

5단계: PXE Kickstart 구축 부트 메뉴

BIOS PXELINUX 메뉴

default rocky9
prompt 1
timeout 50

label rocky9
  menu label Install Rocky Linux 9.8 with Kickstart
  kernel rocky9/vmlinuz
  append initrd=rocky9/initrd.img ip=dhcp inst.repo=http://192.0.2.10/rocky/9.8/ inst.ks=http://192.0.2.10/ks/rocky9.cfg

UEFI GRUB 메뉴

set timeout=5

menuentry 'Install Rocky Linux 9.8 with Kickstart' {
    linuxefi /rocky9/vmlinuz ip=dhcp       inst.repo=http://192.0.2.10/rocky/9.8/       inst.ks=http://192.0.2.10/ks/rocky9.cfg
    initrdefi /rocky9/initrd.img
}

GRUB 명령은 설치 미디어의 실제 부트 구성을 기준으로 확인합니다. 펌웨어·GRUB 조합에 따라 linux와 initrd 명령을 사용하는 경우도 있으므로 같은 유형의 VM에서 먼저 부팅 시험을 수행하십시오.

6단계: 최소 권한 Kickstart 작성

text
url --url=http://192.0.2.10/rocky/9.8/
lang ko_KR.UTF-8
keyboard kr
timezone Asia/Seoul --utc
network --bootproto=dhcp --device=link --activate

rootpw --lock
user --name=opsadmin --groups=wheel --iscrypted   --password='$6$REPLACE_WITH_A_REAL_HASH'

ignoredisk --only-use=sda
zerombr
clearpart --all --initlabel --drives=sda
autopart --type=lvm
bootloader --location=mbr
selinux --enforcing
firewall --enabled --service=ssh
reboot

%packages
@^minimal-environment
chrony
%end

%post --log=/root/ks-post.log
systemctl enable chronyd
%end
clearpart --all은 지정 디스크의 데이터를 삭제합니다. 서버 모델별 디스크 이름과 WWN을 확인하고 빈 시험 VM에서 검증한 뒤 사용하십시오. 예제의 암호 해시는 실제 강한 해시로 교체하되 공개 웹 서버나 Git 저장소에 비밀을 두지 않습니다.

7단계: Kickstart 구문 검증

sudo dnf install -y pykickstart
ksvalidator -v RHEL9 /var/www/html/ks/rocky9.cfg

curl --fail http://192.0.2.10/ks/rocky9.cfg | head
curl --fail http://192.0.2.10/rocky/9.8/.treeinfo | head
sudo restorecon -RFv /var/www/html/ks

8단계: UEFI VM에서 설치 시험

  1. 빈 디스크가 연결된 UEFI VM을 전용 VLAN에 만듭니다.
  2. DHCP offer의 주소·next-server·bootfile을 패킷 캡처로 확인합니다.
  3. 커널 인자에서 inst.repo와 inst.ks 응답을 확인합니다.
  4. 설치 중 Anaconda 로그와 HTTP 접근 로그를 함께 봅니다.
  5. 재부팅 뒤 SELinux, 방화벽, 시간 동기화와 관리 계정을 검증합니다.
sudo tcpdump -ni ens192 -vvv 'port 67 or port 68 or port 69'
sudo tail -f /var/log/httpd/access_log /var/log/httpd/error_log

# 설치 화면의 셸에서 확인
ip address
cat /proc/cmdline
curl --fail http://192.0.2.10/ks/rocky9.cfg
journalctl -b --no-pager | tail -200

9단계: 설치 완료 후 검증

cat /etc/rocky-release
uname -r
sudo dnf upgrade --refresh -y
sudo systemctl --failed --no-pager
getenforce
sudo firewall-cmd --list-all
chronyc tracking
sudo journalctl -p err -b --no-pager

PXE Kickstart 구축 완료 뒤에는 설치 결과를 재현 가능한 빌드 산출물로 관리합니다. ISO 체크섬, Kickstart 버전, 부트 파일 해시, 시험한 펌웨어 유형과 성공한 설치 기록을 함께 보관하십시오.

보안과 운영 주의사항

  • Kickstart URL을 필요한 설치 VLAN에서만 접근하게 제한합니다.
  • 등록 토큰과 SSH 개인 키를 파일에 직접 넣지 않습니다.
  • HTTP 접근 로그에서 비정상 대량 요청을 감시합니다.
  • TFTP는 부트 파일 제공에만 쓰고 설치 패키지는 HTTP로 제공합니다.
  • 운영 DHCP 변경은 검토와 롤백 계획을 거칩니다.
  • 사용하지 않는 설치 창에는 PXE 경로를 차단합니다.

공식 자료와 관련 글

PXE Kickstart 구축 요약

PXE Kickstart 구축은 DHCP, 부트 전송, HTTP 설치 트리와 검증된 Kickstart를 하나의 흐름으로 설계하는 작업입니다. UEFI HTTP를 우선 검토하고 PXE/TFTP는 호환 경로로 유지하며, ISO 체크섬·구문 검사·빈 VM 설치·설치 후 보안 상태까지 통과해야 무인 설치를 운영에 적용할 수 있습니다.