PXE 부팅으로 Ubuntu 22.04 설치하기 [2편]
이전 포스팅 'PXE 부팅으로 Ubuntu 22.04 설치하기 [1편]'에서 이어지는 포스팅입니다. 이전 포스팅을 보지 않았다면 먼저 보고 오시는 것을 추천드립니다.
PXE 부팅으로 Ubuntu 22.04 설치하기 [1편]
소수의 베어메탈 서버 또는 가상 머신(VM)의 경우에 수동으로 OS를 설치하는 작업은 크게 어렵지 않습니다. 베어메탈의 서버의 경우 부팅 USB를 통해서, VM의 경우 ISO 파일을 Import 하는 형식으로 합
tech-recipe.tistory.com
PXE 부팅을 위한 준비
PXE 부팅을 위해서는 PXE 부팅의 대상이 되는 PXE 클라이언트와, DHCP 서버, TFTP 서버와 HTTP 서버가 필요합니다. 규모에 따라서 DHCP, TFTP, HTTP 서버 3대를 모두 통합해서 운영할 수도 있고, 각각을 분리해서 운영할 수 도 있습니다. 이번 포스팅에서는 총 3대의 서버로 PXE 부팅 환경을 구성하고 실습해 보도록 하겠습니다.
Host | 역할 | IP 주소 |
pxe-client | PXE 부팅을 통해 OS를 설치할 Baremetal 또는 VM 서버 | DHCP 할당 |
dhcp-server | PXE 클라이언트에 IP 주소 할당 및 FTFP 서버 안내 역할 | 192.168.100.1 |
pxe-server | PXE 부팅에 필요한 부트로더, 커널, ISO 제공을 위한 TFTP 및 HTTP 서버를 통합 | 192.168.100.200 |
DHCP 서버는 독립적으로 구성하고 TFTP와 HTTP 서버의 역할을 통합하여 하나의 서버에서 PXE 부팅 서비스를 제공하고자 합니다. 그러면 각 서버에 어떤 서비스와 어떤 설정을 구성해야 하는지 알아보도록 하죠. Ubuntu 22.04를 기준으로 살펴보도록 하겠습니다.
1. DHCP 서버
DHCP서버는 PXE 부팅에서 두 가지 역할을 합니다. 첫 번째는 PXE Client에게 IP 주소를 부여하는 것으로, PXE 부팅의 여러 단계들이 각 서버와의 통신을 통해 이루어 지므로 PXE Client의 IP 주소는 필수입니다. 두 번째는 TFTP 서버의 IP 주소 정보와 부팅 파일의 이름입니다. 이를 통해 PXE Client는 TFTP 서버로부터 부팅의 가장 첫 번째 작업을 수행할 수 있게 됩니다. 우선 Ubuntu에서 흔히 사용되는 ISC DHCP를 기준으로 이러한 설정을 적용하는 방법에 대해서 알아보겠습니다.
(1) ISC DHCP 서버 설치 및 설정 파일 수정
- DHCP 서버 설치
sudo apt update
sudo apt install isc-dhcp-server
- DHCP 서버 설정파일 수정
#설정 파일 편집
sudo vim /etc/dhcp/dhcpd.conf
#/etc/dhcp/dhcpd.conf
subnet 192.168.100.0 netmask 255.255.255.0 {
range 192.168.100.241 192.168.100.250; #DHCP IP 주소 범위
option routers 192.168.100.1; #Gateway 주소
option domain-name-servers 8.8.8.8, 8.8.4.4;
next-server 192.168.100.200; # TFTP 서버 IP (PXE 서버 IP)
filename "pxelinux.0"; # 부팅 파일 이름
}
DHCP 설정에서 next-server는 TFTP 서버의 IP 주소를 입력합니다. filename은 부트로더의 파일 이름을 지정해 줍니다. 이런 설정을 통해 PXE Client가 DHCP 서버에 IP 주소 할당을 요청하면, DHCP 서버에서는 IP 주소와 PXE 부팅의 시작점이 되는 TFTP 서버의 정보를 제공하게 됩니다.
- DHCP 서비스 시작
sudo systemctl enable isc-dhcp-server
sudo systemctl restart isc-dhcp-server
(2) OPNsense Kea DHCP 서버 설정
아래 내용은 OPNsense의 Kea DHCP를 설정하는 방법입니다. 웹 GUI를 통해 쉽고 간단하게 설정할 수 있습니다.
- Kea DHCP 서비스 실행
위 그림과 같이 OPNsense 관리 웹 페이지 왼쪽 메뉴의 Service > Kea DHCP > Kea DHCPv4 메뉴로 진입하여 Settings 탭에서 Enabled 체크박스를 활성화합니다. Interface는 DHCP 서비스를 실행할 인터페이스인데 PXE 클라이언트가 속할 네트워크의 인터페이스를 선택해 줍니다. 그리고 Apply 버튼을 클릭하여 DHCP 서비스를 실행합니다.
- DHCP 서비스 설정
DHCP 서비스가 실행되고 나면 Subnets 탭으로 이동하여 [+] 버튼을 눌러 DHCP 서비스 설정을 생성합니다. 위 그림과 같은 창에서 Subnet, Pools, Routers, DNS Servers와 같은 일반적인 DHCP 설정과 함께 PXE 부팅을 위한 Next Server, TFTP bootfile name 설정을 해줍니다. Next server에는 PXE 서버의 IP 주소(정확히는 부트로더를 제공하는 TFTP 서버의 IP 주소)를 입력하고, TFTP bootfile name에는 부트 파일의 이름을 입력해 줍니다. 이 설정을 Save 한 후 Kea DHCPv4 데몬을 재시작(Save 후 빠져나온 Subnets 탭 화면의 우측 상단 리프레시 버튼 클릭)하여 설정을 로드시킵니다.
여기서 주의할 점은 TFTP server를 공란으로 둔다는 것입니다. 저의 테스트 환경에서는 PXE Client가 Next server의 정보를 통해 부팅을 시작할 수 있었습니다.
2. PXE 서버
이번 실습에서 PXE 서버는 TFTP 서버와 HTTP 서버 두 가지 역할을 모두 수행합니다. 역시 Ubuntu 22.04를 기준으로 설명하겠습니다.
(1) TFTP 서버 설치 및 설정
- TFTP 서버 설치
sudo apt update
sudo apt install tftpd-hpa
- TFTP 설정 파일 수정
#설정 파일 편집
sudo vim /etc/default/tftpd-hpa
#/etc/default/tftpd-hpa
TFTP_USERNAME="tftp"
TFTP_DIRECTORY="/var/lib/tftpboot"
TFTP_ADDRESS=":69"
TFTP_OPTIONS="--secure"
이 파일의 내용을 조금 살펴보겠습니다. 우선 TFTP_USERNAME의 경우 TFTP 서버 데몬이 실행될 때 사용할 사용자 계정을 지정하는 것으로, 일반적으로 보안상 루트 권한이 아닌 비특권 사용자(not-privileged user)를 사용합니다. 해당 사용자 계정을 다른 것으로 변경해도 상관은 없으나 그렇게 되었을 때는 변경된 사용자 계정이 TFTP_DIRECTORY에 접근할 수 있는 권한이 있어야 합니다.
TFTP_DIRECTORY는 TFTP 서버가 파일을 제공할 루트 디렉터리를 지정하는 역할을 하고 클라이언트가 TFTP 프로토콜을 요청할 때, 이 디렉토리를 찾습니다.
다음으로 TFTP_ADDRESS는 TFTP 서버가 수신 대기할 네트워크 주소와 포트를 의미하고, 현재의 설정은 서버의 모든 IP 주소의 포트 69번에서 수신을 대기하는 의미입니다. 참고로 TFTP의 경우 UDP 프로토콜을 사용합니다.
마지막으로 TFTP_OPTIONS에 --secure의 경우 TFTP 서버가 chroot 환경에서 실행되게 하는 것으로 클라이언트가 TFTP 서버에 접근할 때 TFTP_DIRECTORY 이외의 다른 디렉터리로 접근하는 것을 막는 역할을 하여 보안성을 강화합니다.
- TFTP용 디렉토리 생성 및 권한 설정
sudo mkdir -p /var/lib/tftpboot
sudo chmod -R 777 /var/lib/tftpboot
이후 이 디렉터리에 PXE 부팅에 필요한 파일들이 위치하게 됩니다.
- TFTP 서비스 시작
sudo systemctl enable tftpd-hpa
sudo systemctl restart tftpd-hpa
(2) HTTP 서버 설치
HTTP 서버는 nginx, apache2 등 어떤 것을 사용해도 상관은 없습니다. 이번 포스팅에서는 nginx를 기준으로 하겠습니다.
- nginx 설치
sudo apt udpate
sudo apt install nginx
sudo systemctl enable nginx --now
- ISO 이미지용 디렉터리 생성
sudo mkdir -p /var/www/html/ubuntu
이 디렉터리에 Ubuntu 22.04 이미지를 복사하여 이후 PXE Client가 다운로드할 수 있도록 합니다.
(3) ISO 이미지 준비
- Ubuntu 22.04 ISO 이미지 다운로드
wget https://releases.ubuntu.com/jammy/ubuntu-22.04.5-live-server-amd64.iso
- HTTP 서버에 ISO 이미지 제공
sudo cp ubuntu-22.04.5-live-server-amd64.iso /var/www/html/ubuntu/
- ISO 이미지 마운트 및 부팅 파일 복사
#ISO 이미지 마운트
sudo mkdir /mnt/iso
sudo mount -o loop ubuntu-22.04.5-live-server-amd64.iso /mnt/iso/
#부팅 파일 복사
sudo cp /mnt/iso/casper/vmlinuz /var/lib/tftpboot/
sudo cp /mnt/iso/casper/initrd /var/lib/tftpboot/
#ISO 이미지 마운트 해제
sudo umount /mnt/iso
(4) PXELINUX, Syslinux 설치 및 PXE 부팅 설정
PXELINUX는 PXE 부팅 환경에서 사용하는 부트로더입니다. 정확히는 Syslinux 프로젝트의 일부로, PXE 부팅을 지원하는 부트로더인 pxelinux.0 파일을 의미합니다.
- PXELINUX, Syslinux 설치
sudo apt update
sudo apt install pxelinux syslinux-common
sudo cp /usr/lib/PXELINUX/pxelinux.0 /var/lib/tftpboot/
sudo cp /usr/lib/syslinux/modules/bios/* /var/lib/tftpboot/
앞선 DHCP 설정에서 filename(ISC DHCP) 또는 TFTB bootflie name(Kea DHCP)으로 설정했던 pxelinux.0이 드디어 등장했습니다. 이 파일을 tftp 서비스 대상 디렉터리인 /var/lib/tftpboot/ 경로로 복사해 두면, PXE Client가 IP를 할당받은 다음 이 파일을 다운로드하여 실행하게 됩니다.
- 설정 디렉토리 및 파일 생성
sudo mkdir /var/lib/tftpboot/pxelinux.cfg
sudo vim /var/lib/tftpboot/pxelinux.cfg/default
#/var/lib/tftpboot/pxelinux.cfg/default
DEFAULT ubuntu
LABEL ubuntu
MENU LABEL Install Ubuntu 22.04
KERNEL vmlinuz
APPEND initrd=initrd ip=dhcp url=http://192.168.100.200/ubuntu/ubuntu-22.04.5-live-server-amd64.iso
위 파일 설정에서 PXE 부팅에 사용할 커널과 ISO 이미지의 위치, 부팅 관련 옵션들을 정의할 수 있습니다. PXE Client는 pxelinux.0 파일을 다운로드하여 실행하게 되면 설정파일인 pxelinux.cfg/default를 읽어서 부팅 메뉴를 표시합니다. 현재의 설정은 커널로 vmlinuz로 하고, initrd 경로를 알려주며, ISO 파일은 http 서버로부터 얻도록 되어 있습니다. 다시 한번 각 파일의 역할에 대해서 정리해 보면 아래와 같습니다.
- /var/lib/tftpboot/pxelinux.0: PXE 부트로더
- /var/lib/tftpboot/pxelinux.cfg/default: 부팅 메튜와 설정(커널, initrd 경로, ISO 이미지 위치 등)을 정의
- /var/lib/tftpboot/vmlinuz: 부팅할 커널 이미지
- /var/lib/tftpboot/initrd: 초기 RAM 디스크 이미지
(5) 방화벽 설정
방화벽 설정은 옵션사항입니다. 보안성 강화를 위해서는 방화벽을 설정하고 필요한 포트만 개방하는 것이 좋습니다.
sudo ufw allow 69/udp # TFTP
sudo ufw allow 80/tcp # HTTP
sudo ufw enable
(6) PXE Clinet 준비 및 PXE 부팅 테스트
이제 기본적인 설정은 마무리되었습니다. PXE Client를 준비하고 부팅하여 잘 작동하는지 확인해 봅시다. 베어메탈 서버(PXE Client)를 DHCP 서비스가 가능한 LAN 영역에 연결한 후, BISO/UEFI에서 네트워크 부팅(PXE)을 활성화한 후 재부팅합니다. 단, 이번 포스팅에서 사용되는 PXE Client는 VMware vSphere 환경에서 생성된 VM을 기준으로 합니다. VMware vSphere의 VM들은 기본적으로 PXE 부팅이 활성화되어 있습니다.
- VM의 전원을 켠 후 PXE 부팅 테스트
- PXE 부팅의 상세 프로세스
- PXE 부팅 기능이 활성화된 Client가 DHCP 서버에 IP를 요청
- DHCP 서버는 PXE Client에 IP 주소를 할당하면서 TFTP 서버의 IP와 bootfile((pxelinux.0)의 경로를 전달
- PXE Client는 해당 정보를 바탕으로 TFTP 서버(이번 포스팅에서는 PXE Server)에 접근
- pxelinux.0를 다운로드하여 실행한 후, TFTP 서버의 /var/lib/tftpboot/pxelinux.cfg/default를 읽고 설정에 따라 추가 파일(vmlinuz, initrd)을 다운로드하고 부팅 시작
- HTTP 서버(PXE Server)에 ISO 파일을 요청
- HTTP 서버에서 ISO 파일을 다운로드하여 OS 설치 수행
PXE Client의 전원을 켜고 조금 기다리면 위와 같이 IP 할당부터 ISO 이미지 다운까지의 과정을 확인할 수 있으며, 최종적으로는 부팅 USB로 서버를 부팅했을 때와 같은 화면을 볼 수 있습니다.
그런데 문제는, 이렇게 하면 결국 설치 작업은 수동으로 진행해야 한다는 단점이 그대로 남습니다. 사용자 이름, 네트워크 설정, 디스크 사이즈 등의 작업들 말이죠. 이러한 작업들 역시 완전히 자동화할 수 있어야 PXE 부팅의 의미가 있을것 같습니다.
PXE 부팅 후 Ubuntu 설치 자동화
Ubuntu의 경우에는 20.04부터 Autoinstall 기능을 지원하여 설치 과정을 자동화 할 수 있습니다. 이를 PXE 부팅과 통합하면 수동 입력 없이 Ubuntu가 자동으로 설치된 상태로 부팅되게 할 수 있습니다. 이를 위해서는 몇 가지 파일과 설정에 변경이 필요합니다.
1. Cloud-init 설정파일 준비
Cloud-init을 위해 user-data와 meta-data 두 가지 파일을 준비해야 합니다. 이 두 파일은 HTTP 서버에 위치하여 Ubuntu 22.04 부팅 시에 사용되게 됩니다.
(1) 설치 자동화용 파일이 위치할 디렉터리 및 파일 생성
sudo mkdir -p /var/www/html/ubuntu/autoinstall
sudo touch /var/www/html/ubuntu/autoinstall/user-data
sudo touch /var/www/html/ubuntu/autoinstall/meta-data
(2) user-data 파일
sudo vim /var/www/html/ubuntu/autoinstall/user-data
#/var/www/html/ubuntu/autoinstall/user-data
autoinstall:
version: 1
locale: en_US
keyboard:
layout: us
network:
network:
version: 2
ethernets:
all:
match:
name: "en*"
dhcp4: true
storage:
layout:
name: lvm
match:
size: largest
identity:
hostname: ubuntu-server
username: admin
password: "$6$2SoqtUzTTiK9X8lA$.8t0lttpdPFsYdGPzP9kCXeeKZa9681K4U.4OBbZPgva2vbZxRu1zn9sAz4rHvfqoMvmvOHKT4mRNoe6yu/ko1"
ssh:
install-server: true
allow-pw: true
late-commands:
- lvresize -l +100%FREE ubuntu-vg/ubuntu-lv -r
이 설정파일의 몇 가지 내용들을 살펴보고 넘어가겠습니다.
- network 필드에서는 'en'으로 시작하는 이더넷 인터페이스를 모두 DHCP4를 통해 자동으로 IP 할당을 받도록 하겠다는 의미입니다.
- storage 필드에서는 PXE Client의 스토리지 중 가장 큰 것(size: largest)을 골라 LVM(name: lvm) 형식으로 볼륨을 구성하겠다는 의미입니다.
- identity 필드에서는 hostname과 username, password를 설정할 수 있습니다. password에는 sha-512 해시값이 들어가야 합니다. 아래 명령어를 통해 이를 확인할 수 있습니다. 사용할 password의 경우 필요에 따라 바꾸어 사용하길 권장합니다.
#'passwd' 문자열의 sha-512 해시값 출력
mkpasswd -m sha-512 'passwd'
$6$2SoqtUzTTiK9X8lA$.8t0lttpdPFsYdGPzP9kCXeeKZa9681K4U.4OBbZPgva2vbZxRu1zn9sAz4rHvfqoMvmvOHKT4mRNoe6yu/ko1
- ssh 필드에서는 ssh 데몬 설치 여부 및 password 사용한 로그인 여부를 선택할 수 있습니다.
- late-command 필드에서는 설치가 완료된 후 실행할 명령어로 여러 가지를 입력할 수 있습니다. 위 설정 파일에서는 lvm 사이즈를 디스크 여유공간을 모두 사용하도록 확장하는 명령어입니다. 위 명령어 없이 기본 lvm으로 설치 시에 디스크의 50%가 사용되지 않기에 위와 같은 명령어를 통해 모든 공간을 사용할 수 있도록 합니다.
(3) meta-data
sudo vim /var/www/html/ubuntu/autoinstall/meta-data
#/var/www/html/ubuntu/autoinstall/meta-data
instance-id: iid-ubuntu-pxe
2. PXE 설정 수정
/var/lib/tftpboot/pxelinux.cfg/default 파일을 아래와 같이 편집합니다.
#/var/lib/tftpboot/pxelinux.cfg/default
DEFAULT ubuntu-autoinstall
LABEL ubuntu-autoinstall
MENU LABEL Install Ubuntu 22.04
KERNEL vmlinuz
APPEND initrd=initrd ip=dhcp url=http://192.168.100.200/ubuntu/ubuntu-22.04.5-live-server-amd64.iso autoinstall ds=nocloud-net;s=http://192.168.100.200/ubuntu/autoinstall/
기존 설정의 APPEND 필드 마지막에 autoinstall ds=nocloud-net;s=http://192.168.100.200/ubuntu/autoinstall/를 추가하였습니다. 이렇게 Autoinstall 옵션이 적용되고, 앞서 만들었던 user-data와 meta-data의 설정을 통해 자동으로 설치를 진행하게 됩니다.
위와 같이 Autoinstall 설정을 통해 PXE 부팅 후 자동으로 IP 주소 할당 및 OS 설치와 설치 후 명령어까지 잘 적용되는 것을 확인할 수 있었습니다.
이 외에도 OS 종류를 골라서 설치한다거나, 사용자 이름이나 기타 설정을 다르게 하여 설치하는 등 다양한 옵션을 통해 인프라 환경에 맞춰 PXE 부팅을 설정할 수 있습니다. 해당 내용은 PXE 부팅 심화 과정으로 다루도록 하고, 이번 PXE 부팅 시리즈는 여기서 마무리하도록 하겠습니다. 감사합니다.