개요
이전 게시글에서 Kickstart 기반의 PXE 시스템을 구축하는 실습을 진행했었습니다 ..!
이번 게시글에서는 디스크리스(diskless) 시스템을 PXE로 어떻게 구축하는지 실습을 진행해보겠습니다.
디스크리스 시스템을 구축하면 다음과 같은 이점이 있습니다.
- 하드디스크 없이 운영 가능한 씬 클라이언트 시스템 구축 가능
- 중앙 집중식 관리로 보안 강화 (?)
- 메인 PXE 서버 --- PXE Client 1, PXE Client 2...
보통 PXE를 도입하는 가장 큰 이유는 여러 대의 서버들에 대해서 OS를 자동으로 설치할 수 있다는 이점 때문이겠죠?
- PXE로 커널 + initrd (램 디스크)를 받아오고
- 이후에 Kickstart 등으로 자동 설치 진행
보통 이 순서대로 진행하여 클라이언트의 로컬 디스크에 OS가 설치됩니다.
그런데 위와 같은 목적이 아닌 다른 목적으로 PXE를 도입하는 경우도 있습니다.
- 디스크리스(Diskless) 형 (thin client / nfs root)
PXE로 커널 + initrd를 불러온 뒤, root 파일 시스템을 NFS
, HTTP
, iSCSI
같은 네트워크 스토리지에서 마운트해서 실행하는 방법입니다.
로컬 디스크에는 아무것도 설치되지 않고, OS 자체가 네트워크를 통해 실행됩니다.
당연히 클라이언트에는 디스크가 따로 장착될 필요도 없겠죠?
그렇다면 왜 Diskless 기반의 Thin Client를 쓰는가?
일반적인 PXE 시스템 구축과는 운영 목적이 아예 다릅니다 ..!
1. 운영 관리 단순화
- 모든 클라이언트는 네트워크 부팅 -> OS와 애플리케이션은 서버(
NFS
,iSCSI
등)에 있음. - 업데이트, 보안 패치, 프로그램 설치는 클라이언트 개별이 아닌 서버 한 군데 만 하면 됨.
- 수백 ~ 수천 대 관리가 훨씬 쉬워짐
2. 저비용 Thin Client 환경
- 클라이언트 PC에 디스크나 고성능 스펙이 필요 없음.
- 부팅만 가능하면 되고, 실제 데이터/스토리지는 서버에 있음.
3. 보안 및 데이터 중앙 집중
- 로컬 디스크가 클라이언트에 장착되지 않으니 데이터 유출 위험 감소
- 모든 데이터는 중앙 서버에 저장됨 -> 백업이나 보안면에 있어서 관리가 용이하겠죠?
제가 근무하는 환경에서도 이러한 Thin Client 기반의 PXE 시스템을 구축하고 운영하고 있기 때문에,
위와 같은 이점이 더 크게 와닿습니다.
PXE 부팅 과정 ?
PXE 부팅은 대략 다음과 같이 진행됩니다.
- 1. DHCP: 클라이언트가 네트워크에서 IP 주소와 함께 TFTP 서버 주소, 부트 파일 정보를 받음.
- 2. TFTP: 클라이언트는 TFTP 서버에서 커널(vmlinuz) 과 initramfs(초기 램디스크) 파일을 다운로드하여 메모리에 올림.
- 3. Kernel & initramfs: 커널이 실행되고,
initramfs
가 임시 루트 파일 시스템으로 동작함. 이 때initramfs
의 주 역할은 진짜 루트 파일 시스템 을 찾아 마운트하는 것!
Diskless 기반 PXE 서버 구축하기
이제 본격적으로 PXE 서버를 구축해보겠습니다.
실습은 VMWare Workstation에서 진행을 하겠습니다.
1. 환경 설정
필수 구성 요소
- PXE 서버용 VM (CentOS 7 또는 Rocky 8)
- 데이터 복제용 깡통 OS VM
- 클라이언트 테스트용 VM (No disk)
- 격리된 네트워크 (VMWare의
Host-Only
네트워크 사용)
VMWare의 Host-Only 네트워크 대역은 다음과 같이 설정됩니다.
PXE 서버: 192.168.221.1/24
DHCP 범위: 192.168.221.128 ~ 192.168.221.200
또한, PXE 서버에는 NIC가 두 개 장착이 되어야겠죠?
NIC 1
: 외부 통신용NIC 2
: 내부 통신용 (Host-Only: Gateway 역할)
2. 필수 패키지 설치
# EPEL 저장소 추가
sudo yum install -y epel-release
# 필수 패키지 설치
sudo yum install -y dhcp tftp tftp-server syslinux xinetd nfs-utils
3. DHCP 서버 설정
DHCP 서버 측에서 PXE 부팅에 필요한 부팅 정보를 제공해야 합니다.
# /etc/dhcp/dhcpd.conf
default-lease-time 600; # 기본 IP 임대 시간 (10분)
max-lease-time 7200; # 최대 IP 임대 시간 (2시간)
authoritative; # 이 서버가 해당 네트워크의 공식 DHCP 서버임을 선언
subnet 192.168.221.0 netmask 255.255.255.0 {
range dynamic-bootp 192.168.221.128 192.168.221.200; # IP 할당 범위
option broadcast-address 192.168.221.255; # 브로드캐스트 주소
option routers 192.168.221.1; # 게이트웨이 (PXE 서버)
option domain-name-servers 168.126.63.1; # DNS 서버
next-server 192.168.221.1; # TFTP 서버 주소 (추가 필요)
filename "pxelinux.0"; # 부트로더 파일명
}
4. TFTP 서버 설정
# /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 # yes를 no로 변경
per_source = 11
cps = 100 2
flags = IPv4
}
5. PXE 부트 환경 구성
PXE 부트에 필요한 파일들을 tftp root 디렉토리에 복사해주도록 합시다!
# 필요한 파일 복사
cp /usr/share/syslinux/pxelinux.0 /var/lib/tftpboot/
cp /usr/share/syslinux/ldlinux.c32 /var/lib/tftpboot
# PXE 설정 디렉토리 생성
mkdir -p /var/lib/tftpboot/pxelinux.cfg
6. PXE 부트 메뉴 설정
default rocky8 # 기본 선택 메뉴
label rocky8
kernel rocky8/vmlinuz # 커널 이미지 경로
append initrd=rocky8/initrd.img root=nfs:192.168.221.1:/disk/tftpboot/rocky8/root -o rw selinux=0
# initrd: 초기 램디스크 이미지
# root=nfs: NFS를 통해 루트 파일시스템 마운트
# rw: 읽기/쓰기 모드
# selinux=0: SELinux 비활성화
위 설정이 바로 디스크리스 부팅 방식을 사용하고 있는겁니다! OS를 설치하는 것이 아니라 NFS를 통해 직접 부팅하는 방식이죠.
7. NFS 서버 설정 (디스크리스 부팅용)
# /etc/exports 파일 편집
/disk/tftpboot/rocky8/root 192.168.221.0/24(rw,sync,no_root_squash,no_subtree_check)
# NFS 서비스 시작
sudo systemctl enable --now nfs-server
sudo exportfs -a
8. Rocky 루트 파일시스템 준비
NFS 네트워크 부팅을 클라이언트에서 시도하려면 nfs 마운트 포인트(/disk/tftpboot/rocky8/root
)에 당연히 부팅 가능한 OS 데이터가 있어야겠죠?
그렇다면 부팅 가능한 OS 데이터는 어디서 만들어야 할까요?
하기에 작성된 것과 같이 여러 방법이 있지만,
저는 Rocky 8 깡통 OS를 VM으로 생성하여 해당 VM의 데이터를 rsync
로 복제해 PXE 서버로 넘겨주도록 하겠습니다!
# 루트 파일시스템 생성 방법
# 방법 1: 기존 시스템 복제
mkdir -p /var/lib/tftpboot/centos7/root
rsync -av --exclude='/proc/*' --exclude='/sys/*' --exclude='/dev/*' / /var/lib/tftpboot/centos7/root/
# 방법 2: ISO에서 추출
mount -o loop CentOS-7-x86_64-DVD.iso /mnt
cp -a /mnt/* /var/lib/tftpboot/centos7/root/
# 방법 3: yum으로 새로 설치
yum --installroot=/var/lib/tftpboot/centos7/root --releasever=7 install @base kernel
8-1. Rocky OS 복제하기 (rsync
)
먼저 VMWare에서 VM 1개를 추가로 생성해주고 Rocky OS 8.3
을 설치해주겠습니다.
이미 설치를 진행하였기 때문에 설치 과정은 넘어가겠습니다.
PXE 서버의 경우 다음과 같이 nfs 마운트 포인트가 잡혀있습니다.
showmount -e localhost
Export list for localhost:
/disk/tftpboot/rocky8/root 192.168.221.0/24
Rocky VM에서 PXE 서버의 nfs 경로로 마운트를 잡아주고,
해당 경로에 OS 데이터를 복제하도록 하겠습니다.
# Rocky 깡통 VM에서 진행함.
# mount -t nfs <PXE 서버 IP>:<마운트포인트> <매핑할_로컬경로>
mount -t nfs 192.168.221.1:/disk/tftpboot/rocky8/root /data
# rsync로 데이터 복제 시작
rsync -av --exclude={"/proc", "/dev", "/run", "/sys", "/data", "/tmp"} / /data
nfs 마운트 포인트를 확인해보면 다음과 같이 OS 데이터가 넘어간 것을 볼 수 있습니다.
8-2. TFTP 커널 / initrd 배포
PXE 클라이언트에 건네줄 커널 / initrd는 해당 VM의 /boot
디렉토리에서 가져와야 합니다.
이 작업은 PXE 서버에서 진행해주세요.
위 작업으로 인해 PXE 서버의 nfs 마운트 포인트(/disk/tftpboot/rocky8/root
)에 OS 데이터가 넘어왔을겁니다.
/disk/tftpboot/rocky8/root/boot
에 있는 커널 및 램디스크 파일을 tftp 루트 디렉토리로 복사해줍시다.
cp /disk/tftpboot/rocky8/root/boot/vmlinuz-* /var/lib/tftpboot/vmlinuz
cp /disk/tftpboot/rocky8/root/boot/initramfs-* /var/lib/tftpboot/initrd.img
반드시 설치 완료된 VM의 /boot 안 커널/ramdisk를 사용해야 합니다.
8-3. initramfs nfs 지원 확인
initrd.img
안에 NFS 모듈이 포함되어 있는지 확인해봅시다.
만약 없는 경우 PXE 부팅 시 root nfs mount가 실패할 수 있습니다.
확인 방법
lsinitrd /disk/tftpboot/rocky8/root/boot/initramfs-*.img | grep nfs
출력되지 않는 경우 rebuild 실행
깡통 VM에서 dracut
명령을 통해 rebuild를 진행한 후, 다시 PXE 서버로 전송해도 됩니다.
하지만 저는 /disk/tftpboot/rocky8/root
디렉토리에 chroot로 루트 파일 시스템을 변경한 후, rebuild 작업을 진행해주도록 하겠습니다.
mkdir -p /disk/tftpboot/rocky8/root/{proc,dev,sys,run}
mount --bind /proc /disk/tftpboot/rocky8/root/proc
mount --bind /dev/disk/tftpboot/rocky8/root/dev
mount --bind /sys/disk/tftpboot/rocky8/root/sys
mount --bind /run/disk/tftpboot/rocky8/root/run
chroot /disk/tftpboot/rocky8/root
# rebuild 진행
dracut -f --add nfs /boot/initramfs-$(uname -r).img $(uname -r)
9. 방화벽 설정
# 필요한 포트 오픈
firewall-cmd --permanent --add-service=dhcp
firewall-cmd --permanent --add-service=tftp
firewall-cmd --permanent --add-service=nfs
firewall-cmd --permanent --add-port=111/tcp
firewall-cmd --permanent --add-port=111/udp
firewall-cmd --permanent --add-port=2049/tcp
firewall-cmd --permanent --add-port=2049/udp
firewall-cmd --reload
VMWare에서 테스트 진행하기
깡통 VM을 다음과 같이 생성해줍시다.
- Edit → Virtual Network Editor
- Add Network → VMnet2 (Host-only)
- Subnet:
192.168.221.0/24
- DHCP 비활성화
위처럼 생성해주고 부팅해주면 다음과 같이 PXE 부팅이 시작됩니다.
의도한대로 Rocky OS 부팅이 진행된 것을 볼 수 있습니다!
트러블슈팅
1. TFTP open timeout
방화벽 차단 or 서비스 비활성화 이슈
# TFTP 서비스 확인
systemctl status tftp
# 방화벽 확인
firewall-cmd --list-all
# SELinux 확인
getenforce
2. Permission denied while mounting NFS
# NFS exports 확인
exportfs -v
# 권한 설정 확인
chmod 755 /var/lib/tftpboot/centos7/root
3. DHCP 미응답 이슈
# DHCP 설정 검증
dhcpd -t -cf /etc/dhcp/dhcpd.conf
# 네트워크 인터페이스 확인
ip addr show
4. /var/lib/tftpboot/pxelinux.cfg/default
파일에서 initrd.img
권한 오류 문제 발생
# 오류 내용
Loading rocky8/initrd.img ...failed: No such file or directory
# 해결 방법
# initrd.img 파일의 권한을 644로 올려주면 됨.
chmod 644 initrd.img
5. kernel, ramdisk, root file system 불일치 시 커널 패닉 문제 발생함.
vmlinuz-4.18.0-553.el8_10.x86_64
initramfs-4.18.0-553.el8_10.x86_64.img
위 두 파일은 동일한 버전임.
하지만 커널 및 램 디스크 버전 불일치 시 PXE 부팅 도중 커널 패닉 문제가 발생함