리눅스

우분투 24.04에서 PXE 자동 설치 서버를 구축하는 방법

변군이글루 2025. 12. 15. 15:36
728x90
반응형

우분투 24.04에서 PXE 자동 설치 서버를 구축하는 방법

  • dnsmasq : DHCP, TFTP, DNS 기능 제공
  • syslinux-common & pxelinux : PXE 부팅로더(pxelinux.0)와 모듈 제공
  • nginx : 설치 ISO 및 Cloud-Init 제공
  • Subiquity + Cloud-Init : 무인 설치

아키텍처 개요

[ PXE Client ]
│
│ DHCP (dnsmasq)
▼
[ PXE Server : Ubuntu 24.04 ]
├─ dnsmasq : DHCP / TFTP / DNS
├─ pxelinux : PXE Boot Loader
└─ nginx : ISO, cloud-init(user-data) 제공

디렉토리 구조

/
├── /etc/dnsmasq.conf # DHCP/TFTP/DNS 설정
├── /srv/tftp/ # TFTP 루트
│ ├── pxelinux.0
│ ├── vmlinuz
│ ├── initrd
│ ├── menu.c32
│ ├── ldlinux.c32
│ └── /pxelinux.cfg/default
├── /usr/share/nginx/html/ # Nginx 웹 루트
│ ├── /iso
│ │ └── ubuntu-24.04.3-live-server-amd64.iso
│ ├── /ubuntu/24.04
│ └── /autoinstall
│   ├── user-data
│   └── meta-data
└── /etc/apt/sources.list.d/nginx.list

PXE 서버 구성

필수 패키지 설치

sudo apt update

sudo apt install -y dnsmasq syslinux-common pxelinux ipxe \
  whois curl

dnsmasq → TFTP 서버 내장

  • dnsmasq : DHCP + TFTP + DNS
  • syslinux-common : pxelinux.0 및 PXE 부팅 파일
  • nginx : ISO 및 Cloud-Init 파일 제공 웹서버

dnsmasq 설정(DHCP + TFTP + DNS)

TFTP 루트 디렉토리 생성

sudo mkdir -p /srv/tftp
sudo chown -R dnsmasq:nogroup /srv/tftp
sudo chmod -R 755 /srv/tftp

PXELINUX 파일 복사

sudo cp /usr/lib/PXELINUX/pxelinux.0 /srv/tftp/
sudo cp /usr/lib/syslinux/modules/bios/*.c32 /srv/tftp/

Nginx 설치

Nginx 공식 저장소 등록

sudo apt install -y curl gnupg2 ca-certificates lsb-release ubuntu-keyring
curl -fsSL https://nginx.org/keys/nginx_signing.key | gpg --dearmor \
    | sudo tee /usr/share/keyrings/nginx-archive-keyring.gpg >/dev/null
echo "deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg] \
http://nginx.org/packages/ubuntu `lsb_release -cs` nginx" \
    | sudo tee /etc/apt/sources.list.d/nginx.list

sudo apt update
sudo apt install -y nginx
sudo systemctl enable --now nginx

우분투 24.04 파일 준비(HTTP 제공)

우분투 24.04의 Netboot 커널(vmlinuz)과 램디스크(initrd) 파일을 다운로드하여 TFTP 디렉토리에 복사합니다.

sudo mkdir -p /usr/share/nginx/html/{iso,ubuntu/24.04}

우분투 24.04 네트부팅 파일 다운로드

cd /usr/share/nginx/html/iso
wget https://releases.ubuntu.com/noble/ubuntu-24.04.3-live-server-amd64.iso

임시 마운트 디렉토리 생성 및 ISO 마운트

sudo mkdir -p /mnt/iso
sudo mount -o loop,ro ubuntu-24.04.3-live-server-amd64.iso /mnt/iso
sudo cp /mnt/iso/casper/{vmlinuz,initrd} /srv/tftp/
sudo umount /mnt/iso
sudo chown -R www-data:www-data /usr/share/nginx/html/ubuntu

PXE 설정 파일 생성

sudo mkdir -p /srv/tftp/pxelinux.cfg
sudo vim /srv/tftp/pxelinux.cfg/default
# /srv/tftp/pxelinux.cfg/default 수정
sudo tee /srv/tftp/pxelinux.cfg/default > /dev/null << 'EOF'
DEFAULT menu.c32
PROMPT 0
TIMEOUT 50
ONTIMEOUT local-boot
MENU TITLE Ubuntu 24.04 PXE Install
MENU AUTOBOOT Booting local disk in # seconds

LABEL ubuntu-24.04-autoinstall
  MENU LABEL ^1 - Ubuntu 24.04 Autoinstall (DANGEROUS)
  KERNEL vmlinuz
  INITRD initrd
  APPEND ip=dhcp \
    url=http://192.168.0.142/iso/ubuntu-24.04.3-live-server-amd64.iso \
    autoinstall \
    ds=nocloud-net;s=http://192.168.0.142/autoinstall/ \
    cloud-config-url=/dev/null \
    console=tty0 console=ttyS0,115200n8

LABEL local-boot
  MENU LABEL ^9 - Boot from Local Disk
  LOCALBOOT 0
EOF

DNS/DHCP 서버 설정(dnsmasq)

dnsmasq를 DHCP 서버, TFTP 서버, 그리고 DNS 캐시로 사용합니다.

sudo cp /etc/dnsmasq.conf /etc/dnsmasq.conf.backup
sudo vim /etc/dnsmasq.conf
sudo tee /etc/dnsmasq.conf > /dev/null << 'EOF'
# 네트워크 인터페이스 설정 (enp0s3 -> 실제 인터페이스로 변경)
interface=enp0s3,lo
bind-interfaces

# DHCP 설정
dhcp-range=192.168.0.106,192.168.0.110,255.255.255.0,12h
dhcp-option=option:router,192.168.0.1
dhcp-option=option:dns-server,8.8.8.8,8.8.4.4
dhcp-authoritative

# PXE/TFTP 설정
enable-tftp
tftp-root=/srv/tftp
dhcp-boot=pxelinux.0
# TFTP 서버 주소 명시적 설정 (next-server 변수에 사용)
dhcp-option=option:tftp-server,192.168.0.142

# PXE 클라이언트 유형별 부팅 파일
dhcp-match=set:ipxe,175
dhcp-boot=tag:!ipxe,pxelinux.0
dhcp-boot=tag:ipxe,undionly.kpxe

# 특정 MAC 주소에 고정 IP 할당 (선택사항)
#dhcp-host=aa:bb:cc:dd:ee:ff,192.168.0.106

# 로그 설정
log-dhcp
log-queries
log-facility=/var/log/dnsmasq.log
EOF
sudo dnsmasq --test
sudo systemctl enable --now dnsmasq
sudo systemctl restart dnsmasq

Nginx 웹 서버 구성(Cloud-Init 파일 제공)

sudo mv /etc/nginx/conf.d/default.conf /etc/nginx/conf.d/default.conf.backup
sudo tee /etc/nginx/conf.d/default.conf > /dev/null << 'EOF'
server {
    listen 80;
    server_name _;

    access_log  /var/log/nginx/host.access.log  main;

    # 큰 파일 다운로드를 위한 설정
    client_max_body_size 0;

    # 기본 경로
    location / {
        autoindex on;
        root   /usr/share/nginx/html;
        index  index.html index.htm;
    }

    # /iso 경로에 대한 별도 설정
    location /iso/ {
        alias /usr/share/nginx/html/iso/;
        autoindex on;
        
        # ISO 파일 캐싱 설정
        location ~* \.(iso)$ {
            add_header Cache-Control "public, max-age=31536000";
        }
    }

    # /autoinstall 경로에 대한 별도 설정 (필요시)
    location /autoinstall/ {
        alias /usr/share/nginx/html/autoinstall/;
        autoindex off;
    }

    # /ubuntu 경로에 대한 별도 설정 (필요시)
    location /ubuntu/ {
        alias /usr/share/nginx/html/ubuntu/;
        autoindex on;
    }

    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
}
EOF

디렉토리 구조 생성

sudo mkdir -p /usr/share/nginx/html/autoinstall

Autoinstall 설정(User-Data)

Autoinstall 설정 파일인 user-data와 meta-data를 Nginx 웹 루트에 생성합니다.

 

Meta-Data 파일 생성

sudo tee /usr/share/nginx/html/autoinstall/meta-data > /dev/null << 'EOF'
instance-id: autoinstalled-server-001
local-hostname: autoinstalled-server-001
EOF

User-Data 파일 생성

  • ubuntu / ubuntu
# 패스워드 : ubuntu1!
openssl passwd -6 'ubuntu1!'
sudo tee /usr/share/nginx/html/autoinstall/user-data > /dev/null << 'EOF'
#cloud-config
autoinstall:
  version: 1
  identity:
    hostname: autoinstalled-server-001
    password: "$6$7tUafIA6FEeUzS59$8ES67iWLiFd3fVyoAKQnrOqUm4T4qigAuH20tOJA8NjZYHBCouFIQVyIf4yYqxmAQqvUDr6zex1e0By01f0el1"
    username: ubuntu

  locale: ko_KR.UTF-8
  
  keyboard:
    layout: us

  network:
    version: 2
    ethernets:
      eth0:
        dhcp4: true

  # 저장소 설정        
  storage:
    layout:
      name: lvm

  ssh:
    install-server: true
    allow-pw: true
  
  # 패키지 목록
  packages:
    - net-tools
 
  late-commands:
    - sed -i 's/#PasswordAuthentication yes/PasswordAuthentication yes/g' /target/etc/ssh/sshd_config
EOF
sudo chown -R www-data:www-data /usr/share/nginx/html/autoinstall
sudo systemctl restart nginx

서비스 재시작

sudo systemctl restart dnsmasq nginx

웹 서버 접근 확인

curl -I http://192.168.0.142/autoinstall/user-data

서버에서 PXE 부팅(클라이언트 서버)

  1. F12 → Network Boot (PXE)
  2. 무인 설치 시작

설치 로그 확인 (디버깅)

설치 중 콘솔

Ctrl + Alt + F2

cloud-init 로그

/var/log/cloud-init.log
/var/log/cloud-init-output.log
/var/log/installer/subiquity-debug.log

 

참고URL

- ubuntu releases : Ubuntu 24.04.3 (Noble Numbat)

- Ubuntu Documentation : How to use cloud-init

- GitHub : canonical/cloud-init

 

# /srv/tftp/pxelinux.cfg/default 수정 sudo tee /srv/tftp/pxelinux.cfg/default > /dev/null << 'EOF' 기본 메뉴.c32 프롬프트 0 시간 초과 50 ONTIMEOUT 로컬 부팅 메뉴 제목 Ubuntu 24.04 PXE 설치 MENU AUTOBOOT #초 안에 로컬 디스크 부팅 중 LABEL ubuntu-24.04-autoinstall 메뉴 라벨 ^1 - Ubuntu 24.04 자동 설치(위험) 커널 vmlinuz INITRD 초기화 추가 ip=dhcp \ url=http://192.168.0.142/iso/ubuntu-24.04.3-live-server-amd64.iso \ 자동 설치 \ ds=nocloud-net;s=http://192.168.0.142/autoinstall/ \ cloud-config-url=/dev/null \ 콘솔=tty0 콘솔=ttyS0,115200n8 LABEL 로컬 부팅 메뉴 라벨 ^9 - 로컬 디스크에서 부팅 로컬부트 0 EOF
 
728x90
반응형