이번에 사내 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에 옮겨주면 문제 해결~