[PXE] 구축 가이드

이번에 사내 PXE를 갈아 엎으려고 최근에 진행 해본 Project이다.

VM상에서 테스트를 해보았다.

먼저 PXE는 tftp, dhcp , apache(option임) 으로 사용이 가능하다.

  • tftp-hpa,tftpd-hpa (pxe 파일 전송시 필요)
  • isc-dhcpd-server(pxe client에서 ip통신을 할 수 있도록 ip를 할당)
  • apache2 (역시 파일 전송 및 autoinstall file 배포시 사용)
  • nfs (nfs도 역시 파일 전송을 사용할때 씀)

apt로 모두 패키지를 설치해준다.

환경은 다음과 같다

  • /tftpboot : boot file들 모음
  • /tftpboot/pxelinux.cfg/ : 부팅시 불러올 템플릿(?) 모음
  • /var/www/html : autoinstall or 불러올 file
  • /os : iso를 풀어둔 os리스트 폴더

sudo mkdir /tftpboot

로 bootfile을 불러올 디렉터리를 생성한다.

tftp의 설정은

sudo vi /etc/default/tftpd-hpa

안에 있으며,

TFTP_DIRECTORY="/tftpboot"

으로 설정해준다.

이후 pxelinux, syslinux-common을 설치하여 pxe의 기본 설정을 한다.

sudo apt install pxelinux syslinux-common

sudo cp /usr/lib/syslinux/modules/bios/ldlinux.c32 /tftpboot
sudo cp /usr/lib/PXELINUX/pxelinux.0 /tftpboot

으로 위 폴더에 넣어준다

추가적으로 여러 os를 같이 넣어 둘 예정이라면,

sudo cp /usr/lib/syslinux/modules/bios/menu.c32 /tftpboot

로 이동 시켜 두면 추후에 메뉴도 설정할 수 있다.

이제 pxe부팅시 기본으로 불러오는 파일을 생성해 보자

sudo mkdir /tftpboot/pxelinux.cfg

로 diretory를 생성한다.

default 라는 파일을 /tftpboot/pxelinux.cfg/default로 생성한다.

sudo vi /tftpboot/pxelinux.cfg/default

defaultfile은 자신의 환경에 맞게 설정해 준다.

예시로 ubuntu를 설치하는 default파일은 다음과 같다

여기서는 pxe server ip는 10.0.0.5이며, Kernel과 initrd는 nfs 폴더 안에 있다.

label ubuntu-Server-20.04
        menu label Install Ubuntu Server 20.04 LTS -AutoInstall
        kernel vmlinuz_20.04
        append boot=casper maybe-ubiquity netboot=nfs ip=dhcp nfsroot=10.0.0.5:/data/OS/ubuntu_20.04 initrd=initrd_20.04 

menu를 표시하는건 다음과 같다

default menu.c32
prompt 0

MENU TITLE OS SELECTION MENU
MENU AUTOBOOT Starting localdisk boot  in # seconds
timeout 100
TOTALTIMEOUT 9000

label disk0
  localboot 0
  MENU LABEL Boot local disk

label ubuntu-Server-20.04
        menu label Install Ubuntu Server 20.04 LTS
        kernel vmlinuz_20.04
        initrd=initrd_20.04
        append boot=casper maybe-ubiquity netboot=nfs ip=dhcp nfsroot=10.0.0.5:/data/ubuntu20.04

위에서 봐야할 곳은

  • vmlinuz_20.04
  • initrd_20.04

이다. 위 두파일은 ubuntu설치 iso기준으로 casper 폴더 안에 initrd, vmlinuz라고 되어있을것이다. /tftpboot에 복사해 둔다

NFS 설치

default 파일에서 nfs를 이용하여 파일을 땡겨오니, pxe서버에도 nfs를설치 해 준다.

sudo apt install nfs-kernel-server -y

설치 이후에는 nfs서버 root폴더를 지정해 줘야한다.

/etc/exports

안에 있으며,

예시는

#절대경로(/data/os, ip(권한)
/data/os 10.0.0.0/24(ro,sync,no_subtree_check) #읽기 전용으로 공유

이후 nfs를 재시작 한다.

sudo systemctl restart nfs-kernel-server

이 글에서는 /data/os안에 ubuntu20.04 디렉터리를 만들어서 진행 하였다.

isc-dhcp-server설치

isc-dhcp-server는 pxe로 부팅 할 때, ip를 할당해주는 역할을 한다. pxe client에서 요청을 날리면 dhcp에서 ip를 할당하여 ip통신을 가능하게 해준다.

/etc/default/isc-dhcp-server

안에서 default interface바꿔줘야함

자신 Ip할당 해둬야함.

dhcpd.conf

subnet 10.0.0.0 netmask 255.255.255.0 {
 allow booting;
 allow bootp;
 option routers                  10.10.10.1; #원하는 ip 주소 넣기
 option subnet-mask              255.255.255.0;
 option domain-name              "example.com";
 option domain-name-servers       1.1.1.1;
 option time-offset              -18000;     # Eastern Standard Time
 range 10.0.0.200 10.0.0.220; # 할당 할 ip주소의 범위
 next-server 10.0.0.55; #pxe가 설치된 서버 ip 를 넣는다
 filename "pxelinux.0";
 INTERFACES="ens19"; #pxe 서버에 interface를 설정해 준다. 
}

위는 템플릿 파일이며, 자신의 입맛대로 고쳐서 사용하면 된다.


pxe 부팅 해보기

해당 pxe 서버를 통해 부팅을 해보자.

(proxmox부팅사진)

Mac주소 기반 booting 하기

여러대의 PC,Sever에 배포를 하 되, mac주소에 따라서 os를 어떤걸 깔아야할 지 지정 해 줄수 있다.
이렇게 하면 어떤 pc에는 ubuntu를, 어떤pc에는 rhel을 설치 할 수 있게 된다.

예시 mac : aa:aa:aa:aa:aa:aa 으로 진행하며, mac based file은 아래 저장을 한다.

/tftpboot/pxelinux.cfg/

: 으로 되어있는걸 -으로 바꾸면

aa-aa-aa-aa-aa-aa

으로 바뀌며, 앞에 접두사로 01-을 붙혀준다.

01-aa-aa-aa-aa-aa-aa

으로 하고 해당 파일안에 pxe부팅에 필요한 정보들을 적어넣는다.

DEFAULT ubuntu-20.04
LABEL ubuntu-20.04
  MENU LABEL Install Ubuntu 20.04 LTS - AutoInstall
  KERNEL vmlinuz_20.04
  APPEND root=/dev/nfs boot=casper maybe-ubiquity netboot=nfs ip=dhcp nfsroot=10.0.0.55:/data/os/ubuntu20.04 initrd=initrd_20.04 autoinstall url=http://10.0.0.55/user-data-20.04

위는 예시이다. 입맛에 맞춰서 수정하면 된다


트러블 슈팅

ubuntu iso를 mount 하고 정확하게 nfsroot안에 넣었지만,

unable to find a live file system on the network 

와 같은 에러가 발생하면서 hang이 걸린다면,

mount 햇던 iso파일 안에

.disk

라는 디렉터리가 있다. 이 디렉터리를 해당 nfsroot에 옮겨주면 문제 해결~

Show Comments