리눅스
우분투 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 부팅(클라이언트 서버)
- F12 → Network Boot (PXE)
- 무인 설치 시작
설치 로그 확인 (디버깅)
설치 중 콘솔
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
반응형