PXE Kickstart 구축: Rocky Linux 9 UEFI 무인 설치
EdwardMoon
이 글은 UEFI x86_64 클라이언트가 PXE/TFTP로 서명된 shim·GRUB과 커널을 받고, HTTP로 Rocky Linux 설치 트리와 Kickstart 파일을 읽는 구성을 다룬다. UEFI HTTP Boot와 레거시 BIOS는 부트 파일·DHCP 분기가 달라 별도 구축이 필요하며 아래 예제의 범위에 포함하지 않는다.
이 글은 Rocky Linux 9.8 계열을 예로 들지만 설치 미디어의 커널·initrd·패키지 트리는 반드시 같은 릴리스로 맞춰야 한다. DHCP는 네트워크 전체에 영향을 주므로 기존 운영 DHCP와 겹치지 않는 격리 VLAN에서 먼저 시험한다.
PXE Kickstart 구축 구성 요소
| 구성 요소 | 역할 | 운영 기준 |
|---|---|---|
| DHCP | IP와 부팅 파일·서버 안내 | 기존 DHCP와 권한 충돌 금지 |
| TFTP/PXE | UEFI shim·GRUB·커널·initrd 전달 | 작은 부트 파일만 제공 |
| HTTP | 설치 트리·ks.cfg | 접근 로그와 최소 노출 |
| Kickstart | Anaconda 설치 응답 자동화 | 검증·버전 관리·비밀 분리 |
1단계: PXE Kickstart 구축 ISO 검증과 설치 트리 준비
# 먼저 공식 Rocky 9.8 x86_64 DVD ISO를 현재 디렉터리에 내려받습니다.
curl --fail --location --remote-name https://download.rockylinux.org/pub/rocky/9.8/isos/x86_64/CHECKSUM
test -f Rocky-9.8-x86_64-dvd.iso
sha256sum --check --ignore-missing CHECKSUM
# 위 검사에서 해당 DVD ISO의 OK를 확인한 뒤에만 진행합니다.
sudo dnf install -y httpd rsync dnsmasq tcpdump
sudo install -d -m 0755 /mnt/rocky9 /var/www/html/rocky/9.8
sudo mount -o loop,ro Rocky-9.8-x86_64-dvd.iso /mnt/rocky9
# 아래 대상은 새로 준비한 전용 9.8 설치 트리이며 기존 파일은 --delete로 삭제될 수 있습니다.
sudo rsync -aH --delete /mnt/rocky9/ /var/www/html/rocky/9.8/
sudo restorecon -RFv /var/www/html/rocky
공식 HTTPS 주소의 CHECKSUM에서 정확히 9.8 DVD ISO 항목이 일치하는지 확인한다. 다른 파일만 OK로 나온 결과는 이 ISO 검증이 아니다. 조직의 공급망 정책에서 서명 검증을 요구하면 Rocky가 배포한 서명과 신뢰한 공식 키도 확인한다. 마운트한 ISO는 읽기 전용으로 두고 전체 설치 트리를 보존한다.
2단계: PXE Kickstart 구축 HTTP 서비스
전용 실습 NIC ens192에 서버 주소 192.0.2.10/24를 미리 설정하고, 해당 연결을 firewalld의 internal 영역에 배정한다. 게이트웨이·DNS·NIC 이름은 실제 격리 VLAN에 맞춘다. 아래 서비스 허용 전에 firewall-cmd --get-zone-of-interface=ens192가 internal인지 확인한다. 운영 NIC를 이 실습 영역으로 옮기지 않는다.
sudo dnf install -y httpd
sudo systemctl enable --now httpd
sudo firewall-cmd --permanent --zone=internal --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단계: PXE Kickstart 구축 TFTP 부트 파일 배치
검증한 동일 DVD ISO의 서명된 UEFI 파일을 사용한다. shim은 같은 디렉터리의 grubx64.efi를 불러오며 GRUB은 같은 릴리스의 커널·initrd를 사용한다. 별도 tftp.socket을 함께 띄우지 않고 다음 단계의 dnsmasq가 UDP 69를 담당한다.
sudo install -d -m 0755 /var/lib/tftpboot/rocky9
sudo install -m 0644 /mnt/rocky9/EFI/BOOT/BOOTX64.EFI /var/lib/tftpboot/shimx64.efi
sudo install -m 0644 /mnt/rocky9/EFI/BOOT/grubx64.efi /var/lib/tftpboot/grubx64.efi
sudo install -m 0644 /mnt/rocky9/images/pxeboot/vmlinuz /var/lib/tftpboot/rocky9/vmlinuz
sudo install -m 0644 /mnt/rocky9/images/pxeboot/initrd.img /var/lib/tftpboot/rocky9/initrd.img
sudo restorecon -RFv /var/lib/tftpboot
ls -l /var/lib/tftpboot/{shimx64.efi,grubx64.efi,rocky9/vmlinuz,rocky9/initrd.img}
4단계: PXE Kickstart 구축 DHCP·TFTP 예시
다음 내용을 /etc/dnsmasq.d/pxe.conf에 저장하고 기존 dnsmasq 설정과 중복되지 않는지 확인한다. DHCP architecture 7과 9를 UEFI x86_64로 취급한다. 다른 아키텍처에는 부트 파일을 광고하지 않는다.
sudoedit /etc/dnsmasq.d/pxe.conf
다음 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-match=set:efi64,option:client-arch,9
dhcp-boot=tag:efi64,shimx64.efi
log-dhcp
sudo dnsmasq --test
sudo systemctl enable --now dnsmasq
sudo firewall-cmd --permanent --zone=internal --add-service=dhcp
sudo firewall-cmd --permanent --zone=internal --add-service=tftp
sudo firewall-cmd --reload
sudo journalctl -u dnsmasq -f
5단계: PXE Kickstart 구축 부트 메뉴
UEFI GRUB 메뉴
다음 메뉴를 TFTP 루트의 /var/lib/tftpboot/grub.cfg에 저장한다. 테스트 시 dnsmasq 로그나 패킷 캡처로 GRUB이 실제 요청한 경로도 확인한다.
sudoedit /var/lib/tftpboot/grub.cfg
sudo restorecon -RFv /var/lib/tftpboot
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 작성
다음 예제는 /var/www/html/ks/rocky9.cfg에 저장한다. opsadmin의 암호 해시는 반드시 실제 해시로 바꾸고 HTTP 접근을 설치 VLAN으로 제한한다. 원문 플레이스홀더를 그대로 사용하면 정상 관리자 로그인이 되지 않는다.
sudo install -d -m 0755 /var/www/html/ks
sudoedit /var/www/html/ks/rocky9.cfg
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
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에서 설치 시험
- 빈 디스크가 연결된 UEFI VM을 전용 VLAN에 만든다.
- DHCP offer의 주소·next-server·bootfile을 패킷 캡처로 확인한다.
- 커널 인자에서 inst.repo와 inst.ks 응답을 확인한다.
- 설치 중 Anaconda 로그와 HTTP 접근 로그를 함께 본다.
- 재부팅 뒤 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 경로를 차단한다.
공식 자료와 관련 글
- RHEL 9 자동 설치 공식 문서
- RHEL 9 UEFI HTTP 설치 준비
- RHEL 9 Kickstart 시작 방법
- Rocky Linux 9.8 설치 가이드
- Ansible 자동화 운영 가이드
PXE Kickstart 구축 요약
PXE Kickstart 구축은 DHCP, 부트 전송, HTTP 설치 트리와 검증된 Kickstart를 하나의 흐름으로 설계하는 작업이다. 이 UEFI x86_64 예제에서는 PXE/TFTP와 HTTP 설치 트리의 연결을 확인하며, ISO 체크섬·구문 검사·빈 VM 설치·설치 후 보안 상태까지 통과해야 무인 설치를 운영에 적용할 수 있다.