Profile picture

[Linux] Diskless 기반 PXE 시스템 구축하기

JaehyoJJAng2025년 09월 12일

개요

이전 게시글에서 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 네트워크 대역은 다음과 같이 설정됩니다.
image

PXE 서버: 192.168.221.1/24
DHCP 범위: 192.168.221.128 ~ 192.168.221.200

또한, PXE 서버에는 NIC가 두 개 장착이 되어야겠죠?

  • NIC 1: 외부 통신용
  • NIC 2: 내부 통신용 (Host-Only: Gateway 역할)

image


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을 설치해주겠습니다.
image
이미 설치를 진행하였기 때문에 설치 과정은 넘어가겠습니다.


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 데이터가 넘어간 것을 볼 수 있습니다.
image


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 부팅이 시작됩니다.
image


의도한대로 Rocky OS 부팅이 진행된 것을 볼 수 있습니다!
image


트러블슈팅

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 부팅 도중 커널 패닉 문제가 발생함

    Tag -

Loading script...