본문 바로가기

리눅스

우분투 22.04에서 PXE 네트워크 부팅 서버를 구성하는 방법

반응형

우분투 22.04에서 PXE 네트워크 부팅 서버를 구성하는 방법

테스트 환경

  • 운영체제 : Ubuntu 22.04.5
  • DHCP : isc-dhcp-server(DHCP 서비스)
  • TFTP : tftpd-hpa(PXE 클라이언트에 부트로더/커널/인트림 제공)
  • HTTP : nginx(ISO, 커널/인트림, autoinstall 파일 제공)
  • PXE 부트로더 : syslinux/pxelinux(BIOS + PXELINUX)
  • 자동 설치 : cloud-init (NoCloud)

1. DHCP 서버 구성(isc-dhcp-server)

설치 및 서비스 활성화

sudo apt install -y isc-dhcp-server
sudo systemctl enable --now isc-dhcp-server

설정 파일 구성

sudo cp /etc/dhcp/dhcpd.conf /etc/dhcp/dhcpd.conf_$(date '+%Y%m%d_%H%M%S')
sudo vim /etc/dhcp/dhcpd.conf
sudo tee /etc/dhcp/dhcpd.conf > /dev/null << 'EOF'
default-lease-time 600;
max-lease-time 7200;
authoritative;

# PXE 아키텍처 식별을 위한 옵션 정의
option arch code 93 = unsigned integer 16;

subnet 192.168.10.0 netmask 255.255.255.0 {
  range 192.168.10.106 192.168.10.110;
  option routers 192.168.10.1;
  option domain-name-servers 8.8.8.8, 8.8.4.4;
  next-server 192.168.10.201; # TFTP 서버 IP

  if option arch = 00:07 or option arch = 00:09 {
    filename "uefi/syslinux.efi"; # UEFI 모드
  } else {
    filename "pxelinux.0";        # Legacy(BIOS) 모드
  }
}
EOF
  • next-server : TFTP 서버 IP 주소(PXE 서버)
  • filename : PXE 부트로더 이름

설정 파일 검증

sudo dhcpd -t -cf /etc/dhcp/dhcpd.conf

서비스 재시작

sudo systemctl restart isc-dhcp-server

서비스 상태 확인

sudo systemctl status isc-dhcp-server

2. TFTP 서버 구성(tftpd-hpa)

설치 및 서비스 활성화

sudo apt install -y tftpd-hpa
sudo systemctl enable --now tftpd-hpa

설정 파일 구성

sudo cp /etc/default/tftpd-hpa /etc/default/tftpd-hpa_$(date '+%Y%m%d_%H%M%S')
sudo vim /etc/default/tftpd-hpa
sudo tee /etc/default/tftpd-hpa << 'EOF'
# /etc/default/tftpd-hpa

TFTP_USERNAME="tftp"
TFTP_DIRECTORY="/var/lib/tftpboot"
TFTP_ADDRESS="0.0.0.0:69"
TFTP_OPTIONS="--secure --create"
EOF

TFTP 루트 디렉토리 생성

sudo mkdir -p /var/lib/tftpboot
sudo chown -R tftp:tftp /var/lib/tftpboot
sudo chmod -R 755 /var/lib/tftpboot

서비스 재시작

sudo systemctl restart tftpd-hpa

서비스 상태 확인

sudo systemctl status tftpd-hpa

3. 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

PXE용 HTTP 설정

default.conf 설정 파일 백업

sudo cp /etc/nginx/conf.d/default.conf /etc/nginx/conf.d/default.conf_$(date '+%Y%m%d_%H%M%S')

default.conf 설정 파일 수정

sudo vim /etc/nginx/conf.d/default.conf
sudo tee /etc/nginx/conf.d/default.conf << 'EOF'
server {
    listen 80;
    server_name _;

    access_log /var/log/nginx/host-access.log main;
    error_log /var/log/nginx/host-error.log;

    client_max_body_size 0;

    location / {
        root /usr/share/nginx/html;
        autoindex on;
    }

    location /iso/ {
        alias /usr/share/nginx/html/iso/;
        autoindex on;
    }

    location /ubuntu/ {
        alias /usr/share/nginx/html/ubuntu/;
        autoindex on;
    }

    location /autoinstall/ {
        alias /usr/share/nginx/html/autoinstall/;
        autoindex on;
        default_type text/plain;
    }
}
EOF
sudo nginx -t
sudo systemctl restart nginx

4. PXE 부트로더 설치 (PXELINUX)

PXE 부팅에서 부트로더로 pxelinux.0를 사용합니다.

 

설치

sudo apt install -y pxelinux syslinux-common

부트로더 및 모듈 복사

sudo cp /usr/lib/PXELINUX/pxelinux.0 /var/lib/tftpboot/
sudo cp /usr/lib/syslinux/modules/bios/{ldlinux.c32,libcom32.c32,libutil.c32,menu.c32,vesamenu.c32} \
	/var/lib/tftpboot/

UEFI 모드

더보기

---

sudo apt install -y syslinux-efi
sudo mkdir -p /var/lib/tftpboot/uefi
sudo cp /usr/lib/SYSLINUX.EFI/efi64/syslinux.efi /var/lib/tftpboot/uefi/
sudo cp /usr/lib/syslinux/modules/efi64/{ldlinux.e64,libcom32.c32,libutil.c32,vesamenu.c32} \
	/var/lib/tftpboot/uefi/
ln -s /var/lib/tftpboot/pxelinux.cfg /var/lib/tftpboot/uefi/pxelinux.cfg

---

728x90

우분투 ISO 준비 및 커널/Initrd 추출

ISO 다운로드 및 HTTP 제공

sudo mkdir -p /usr/share/nginx/html/{iso,ubuntu/22.04}
cd /usr/share/nginx/html/iso
wget https://releases.ubuntu.com/22.04/ubuntu-22.04.5-live-server-amd64.iso

ISO 마운트 및 파일 복사

sudo mount -o loop,ro ubuntu-22.04.5-live-server-amd64.iso /mnt
sudo cp -r /mnt/* /usr/share/nginx/html/ubuntu/22.04/
sudo cp -r /mnt/.disk /usr/share/nginx/html/ubuntu/22.04/
sudo umount /mnt

squashfs 링크 생성

cd /usr/share/nginx/html/ubuntu/22.04/casper
ln -s ubuntu-server-minimal.ubuntu-server.installer.squashfs filesystem.squashfs

Ubuntu 24.04

더보기

---

sudo mkdir -p /usr/share/nginx/html/ubuntu/24.04
cd /usr/share/nginx/html/iso
wget https://releases.ubuntu.com/24.04/ubuntu-24.04.3-live-server-amd64.iso
sudo mount -o loop,ro ubuntu-24.04.3-live-server-amd64.iso /mnt
sudo cp -r /mnt/* /usr/share/nginx/html/ubuntu/24.04/
sudo umount /mnt

---

커널(vmlinuz) 및 initrd 파일 복사

sudo cp /usr/share/nginx/html/ubuntu/22.04/casper/{vmlinuz,initrd} \
	/var/lib/tftpboot/
sudo cp /usr/share/nginx/html/ubuntu/22.04/casper/{vmlinuz,initrd} \
	/usr/share/nginx/html/ubuntu/22.04/

PXE 메뉴 구성(pxelinux.cfg)

/srv/tftp/pxelinux.cfg/default 파일을 생성하고 PXE 부팅 메뉴를 구성

sudo mkdir -p /var/lib/tftpboot/pxelinux.cfg
sudo vim /var/lib/tftpboot/pxelinux.cfg/default
sudo tee /var/lib/tftpboot/pxelinux.cfg/default << 'EOF'
DEFAULT menu.c32
PROMPT 0
TIMEOUT 300
MENU TITLE Ubuntu 22.04 PXE Boot Menu

LABEL ubuntu-2204-autoinstall
    MENU LABEL Install Ubuntu 22.04 (Auto)
    KERNEL vmlinuz
    INITRD initrd
    APPEND ip=dhcp \
      boot=casper \
      netboot=http \
      casper-path=casper \
      autoinstall \
      ds=nocloud-net;s=http://192.168.10.100/autoinstall/ \
      url=http://192.168.10.100/ubuntu/22.04/ \
      fsck.mode=skip

LABEL ubuntu-2204-manual
    MENU LABEL Install Ubuntu 22.04 (Manual)
    KERNEL vmlinuz
    INITRD initrd
    APPEND ip=dhcp \
      boot=casper \
      netboot=http \
      casper-path=casper \
      url=http://192.168.10.100/ubuntu/22.04/

LABEL local
    MENU LABEL Boot Local Disk
    LOCALBOOT 0
EOF

cloud-init(NoCloud) 자동 설치 파일 구성

디렉터리 생성

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

Vendor-Date 파일 생성

sudo touch /usr/share/nginx/html/autoinstall/vendor-data

Meta-Data 파일 생성

sudo vim /usr/share/nginx/html/autoinstall/meta-data
sudo tee /usr/share/nginx/html/autoinstall/meta-data << 'EOF'
instance-id: ubuntu-2204-pxe
local-hostname: ubuntu-pxe
EOF

User-Data 파일 생성

  • password는 반드시 openssl passwd -6으로 생성한 해시값 사용
# 패스워드 : ubuntu
openssl passwd -6 'ubuntu'
$6$YHHqTfkwCtHcDgHa$ljH6JlVWXT05xha4sCOjnQckLICoQJ5GpDlF0iwJ74zESHPTo.Sqwnb16zwZeHIAIcd9M0Kd503JPO5FD/tgb/
sudo vim /usr/share/nginx/html/autoinstall/user-data
sudo tee /usr/share/nginx/html/autoinstall/user-data << 'EOF'
#cloud-config
autoinstall:
  version: 1
  locale: ko_KR.UTF-8
  keyboard:
    layout: kr
  timezone: Asia/Seoul

  identity:
    hostname: ubuntu-pxe
    username: ubuntu
    password: "$6$YHHqTfkwCtHcDgHa$ljH6JlVWXT05xha4sCOjnQckLICoQJ5GpDlF0iwJ74zESHPTo.Sqwnb16zwZeHIAIcd9M0Kd503JPO5FD/tgb/"

  ssh:
    install-server: true
    allow-pw: true

  packages:
    - vim
    - curl
    - net-tools

  storage:
    layout:
      name: direct

  late-commands:
    - curtin in-target -- systemctl enable ssh
EOF

Cloud-Init 구성 검증

cloud-init schema --config-file /usr/share/nginx/html/autoinstall/user-data

서비스 재시작

sudo systemctl restart isc-dhcp-server tftpd-hpa nginx

네트워크 부팅 설치(Network boot)

  1. VirtualBox에서 VM 서버 (PXE 클라이언트) 생성
  2. Network Boot(PXE) : F12 → l) LAN

VirtualBox

무인 설치 시작

 

728x90
반응형