본문 바로가기
기초 튼튼탄탄탄/서버, OS(리눅스)

PXE & kickstart로 CentOS 설치 자동화하기

by 잇서니 2021. 1. 3.
반응형

 

개요

  • 클러스터에 OS를 설치할 때, 여러 개 노드에 일일이 OS를 수동설치하는 것은 번거롭다.
  • PXE를 사용하면 여러 개의 노드에 OS를 자동으로 설치할 수 있다.
  • 실습은 virtual box로 서버 2개(pxe용 서버, target1 서버)를 만들어 진행합니다.

 

목차

  1. PXE 개념
  2. virtual box 환경세팅
  3. iso 이미지 mount
  4. httpd
  5. tftp-server
  6. dhcpd
  7. pxelinux 설정
  8. target 노드 OS 자동설치

 

 

PXE 개념

  • PXE(Preboot eXecution Environment)는 네트워크를 이용해서 컴퓨터를 부팅할 수 있게 만들어주는 환경이다.
  • 하드디스크나 CD-ROM과 같은 저장소에 구애 받지 않고 OS를 설치할 수 있다.
  • 서버-클라이언트 인터페이스. pxe노드가 서버가 되고, target1노드가 클라이언트가 된다.
  • pxe를 구축하기 위해 필요한 요소는 크게 3가지이다.
    1) http 2) tftp 3) dhcp

 

 

virtual box 환경세팅

(1) 구성도

  • 데니스 서버(노트북)에서 virtualbox를 설치하여 vm을 2개 설치한 상태이다.

 

(2) virtual box 설정

  • host-only 네트워크는 데니스서버(노트북)에서 vm과 통신할 수 있는 GW 역할을 한다.
  • host-only 네트워크를 추가한다.(파일 -> 호스트네트워크관리자)
  • dhcp 서버는 사용하지 않는다.
    vm #1(pxe)에서 dhcp 서버를 구축하므로 virtualbox에서도 dhcp 서버를 사용해버리면 클라이언트 (vm #2 - target1) 노드가 어떤 dhcp 서버를 참고할 지 알 수 없기 때문이다.
  • 어댑터는 수동으로 설정한다. (ip, subnet 설정)

 

(3) vm #1 (pxe 서버)

    

  • vm #1(pxe)에는 네트워크 어댑터 2개를 추가한다.
    1) NAT에 연결되는 어댑터
    실습 편의상 pxe에서 외부접속이 가능하도록 하기 위해 사용한다. 실제 설치에서는 외부접속이 되지 않아, 패키지를 담아와 로컬레포를 구축해야 한다.
    2) host-only에 연결되는 어댑터
    virtualbox host-only(GW)와 연결하고, vm#2과도 연결하기 위해 사용한다.

 

(4) vm #2 (target1)

  • vm #2 (target1)에는 네트워크 어댑터 1개를 추가한다.
    1) host-only에 연결되는 어댑터
    pxe 네트워크 부팅을 하기 위해 사용한다. 어댑터 종류를 Pcnet-FAST III로 선택한다. (pxe 부트를 지원하기 때문이다.)

  • target1 노드에서 부팅순서를 설정한다. 1순위는 하드디스크, 2순위는 네트워크로.
  • 맨 처음에는 target1 노드 하드디스크에 아무것도 없는 상태이다. 그러니 1순위 하드디스크 부팅이 밀려나고, 2순위 네트워크 부팅(pxe)을 통해 os설치가 이루어진다.
  • os설치가 완료된 후에는, target1 노드를 재부팅하면 이제 하드디스크에 os이미지들이 있는 상태이다. 그러니 1순위인 하드디스크로 부팅을 하게 된다.
  • 실제 설치를 할 때 부팅순서는 BIOS에서 설정한다고 한다.

 

 

iso이미지 mount

os설치를 하기 위해서는 커널이미지(vmlinuz, initrd.img)와 설치이미지들이 필요하다. pxe에서는 tftp, http를 사용하여 target1노드에 이미지들을 전송할 것이다. 그러니 미리 이미지 파일을 준비해둔다. 실습에서는 iso이미지를 파일질라로 vm#1(pxe)에 전송하고, mount -o loop 옵션을 사용하여 마운트한다. 실제로는 부팅디스크를 mount한다.

# mkdir /mount/CentOS_iso
# mount -o loop /root/CentOS-6.9-x86_64-bin-DVD1 (1).iso /mount/CentOS_iso

 

httpd

타겟노드(vm#20에 os설치이미지와 kickstart 파일들을 전송하기 위해 http를 사용한다. 그러니 pxe서버 (vm #1)에 httpd를 설치한다.

 

(1) httpd 설치

  • 실습환경에서는 외부접속이 가능하므로 yum install로 httpd를 설치한다.
# yum install httpd

 

  • 외부접속이 불가능한 상황에서는 패키지들을 일일이 설치한다.
# rpm -ivh <패키지이름>
1 apr-1.3.9-5.el6_2.x86_64.rpm
2 apr-util-1.3.9-3.el6_0.1.x86_64.rpm
3 apr-util-ldap-1.3.9-3.el6_0.1.x86_64.rpm
4 httpd-tools-2.2.15-53.el6.centos.x86_64.rpm
5 httpd-2.2.15-53.el6.centos.x86_64.rpm

 

 

(2) OS설치이미지 옮기기

http로 전송할 OS설치이미지를 http 기본 디렉토리(/var/www/html/)로 옮겨놓는다. OS설치이미지는 아까 /mount/CentOS_iso에 mount 해 놓은 상태이다.

# cd /var/www/html

# mkdir -p pxe/iso/centos6.9

# cp /mount/CentOS_iso /var/www/html/pxe/iso/centos6.9

 

(3) kickstart 파일

OS설치 시 파티션구성, 언어, 계정 등등을 설정한다. kickstart를 사용하면 타겟노드에서 OS설치할 때 OS 설정을 자동으로 할 수 있다.

  • kickstart 파일 생성
    kickstart 파일 또한 http로 전송하기 때문에 http 기본 디렉토리에 생성해야 한다. 파일명은 <타켓서버이름.cfg>로 한다. /root/anaconda-ks.cfg 파일을 이용해도 된다.
# cd /var/www/html

# mkdir /pxe/ks.cfg

# vim target1.cfg
  • kickstart 파일 작성
    • url은 아까 옮겨놓은 OS설치이미지 경로를 적는다.
    • network에는 타겟노드가 pxe 서버와 통신할 네트워크 정보를 적는다.

#Install OS instead of upgrade

install

# Firewall configuration

firewall --disabled

# Use CD-ROM installation media

url --url http://10.10.10.11/pxe/iso/centos6.9/CentOS_iso

#Network information

#Private IP

network --device eth0 --onboot yes --bootproto static --ip 10.10.10.18 --netmask 255.255.255.0 --hostname target1.sunny.com

# Root password

rootpw --iscrypted $6$mU/M9ekxR75wXojQ$JXZ19c6JofaYEcCVuXy2bdao7k.pzfpFN425LmVPNDsvkIU8b0INOKdMi8JeUU/iaWtNf3xNtZxA9oESYRQJe1

# System authorization information

auth --useshadow --passalgo=md5

# use text mode install

text

# System Keyboard

keyboard ko

# System language

lang ko_KR

# SELinux configuration

selinux --disabled

# Do not configure the X Window System

skipx

# Installation logging level

logging --level=info

# System timezone

timezone Asia/Seoul

# System bootloader configuration

bootloader --location=mbr

# Clear the Master Boot Record

zerombr

# Partition clearing information

clearpart --all --initlabel

# Disk partitioning information

part /boot --fstype="ext4" --ondisk=sda --size=500

part /swap --fstype="swap" --ondisk=sda --size=4000

part / --fstype="ext4" --grow --ondisk=sda --size=1

 

#part /data1 --fstype="ext4" --grow --ondisk=sdb --size=1

#part /data2 --fstype="ext4" --grow --ondisk=sdc --size=1

 

%packages --ignoremissing

@Core

@Base

@Development

 

# YUM

yum-utils

createrepo

 

# httpd

httpd

 

# Misc

dialog

ltrace

sudo

kernel-devel

kernel-headers

bzip2

unzip

parted

rsync

ftp

telnet

vsftpd

nfs-utils

 

# Python

python-setuptools

 

# NTP

ntp

ntpdate

 

%end

 

%post

# Services

/sbin/chkconfig --level 2345 iptables off

/sbin/chkconfig --level 2345 ip6itables off

/sbin/chkconfig --level 2345 httpd off

/sbin/chkconfig --level 2345 vsftpd off

 

%end

 

# Reboot after installation

reboot

 

tftp-server

pxe에서는 tftp를 사용하여 부트로더와 os커널이미지를 타겟노드에 전송한다. 리눅스가 부팅될 때 부트로더가 커널이미지를 로드한다. tftp는 별다른 인증없이 파일들을 빠르게 전송할 수 있다. pxe-server(vm #1)에 tftp-server를 구축해보자.

 

(1) tftp-server 설치 및 설정

  • tftp-server 설치
# yum install tftp-server -y

 

  • tftp 설정 (/etc/xinitd.d/tftp)
    • disable = no로 수정한다.
    • server_args 는 tftp의 기본 디렉토리이다. (http의 기본경로가 /var/www/html 인 것처럼)

service tftp

{

        socket_type             = dgram

        protocol                = udp

        wait                    = yes

        user                    = root

        server                  = /usr/sbin/in.tftpd

        server_args             = -s /var/lib/tftpboot

        disable                 = no

        per_source              = 11

        cps                     = 100 2

        flags                   = IPv4

}

  • tftp 가동 및 서비스 등록
# service xinetd start

# chkconfig xinetd on

 

(2) OS커널이미지

아까 iso 이미지 마운트 해 놓은 곳에 OS커널이미지(vmlinuz, initrd.img)가 있다. tftp 기본디렉토리에 옮겨 놓는다.

# cd /var/lib/tftpboot

# mkdir images/centos6.9

# cp /mount/CentOS_iso/images/vmlinuz /var/lib/tftpboot/images/centos6.9/

# cp /mount/CentOS_iso/images/initrd.img /var/lib/tftpboot/images/centos6.9/

 

(3) 부트로더

syslinux 부트로더를 설치하고, 부트로더 파일 5개를 tftp 기본디렉에 옮긴다.

# yum install syslinux -y

# cp /usr/share/syslinux/pxelinux.0 /var/lib/tftpboot/

# cp /usr/share/syslinux/menu.c32 /var/lib/tftpboot/

# cp /usr/share/syslinux/memdisk /var/lib/tftpboot/

# cp /usr/share/syslinux/mboot.c32 /var/lib/tftpboot/

# cp /usr/share/syslinux/chain.c32 /var/lib/tftpboot/

 

 

dhcpd

초기에는 타겟노드들의 ip, subnet 등이 설정되지 않은 상태이다. dhcp를 사용하여 타겟노드들의 네트워크 정보를 설정하여, pxe 네트워크 부팅이 가능하도록 한다.

  • dhcp 설치
# yum install dhcp -y

 

  • dhcp 설정 (/etc/dhcp/dhcpd.conf)
    • range : 타겟서버에게 동적으로 할당할 ip범위
    • next-server : tftp-server의 ip. 제 실습에서는 vm#1 (pxe)에 tftp-server를 구축했으니 vm#1 ip를 적어주었습니당.
    • file-name : 부트로더 파일
    • domain-name : dhcp서버의 도메인네임
    • domain-name-server : dhcp서버의 도메인 네임서버

# DHCP Server Configuration file.

#   see /usr/share/doc/dhcp*/dhcpd.conf.sample

#   see 'man 5 dhcpd.conf'

#

 

 

option domain-name "sunny.com";

option domain-name-servers pxe.sunny.com;

default-lease-time 600;

max-lease-time 7200;

authoritative;

 

#################The followings are mandatory to be able to boot from PXE ############

allow booting;

allow bootp;

option option-128 code 128 = string;

option option-129 code 129 = text;

next-server 10.10.10.11;

filename "/pxelinux.0";

 

######################################

subnet 10.10.10.0 netmask 255.255.255.0 {

 range dynamic-bootp 10.10.10.12 10.10.10.13;

 #option broadcast-address 10.0.0.255;

 #option routers 10.0.0.1;

  • dhcp 재기동 및 서비스 등록
# service dhcpd restart

# chkconfig dhcpd on

 

pxelinux 설정

  • 설정파일 생성
    • 특정 맥어드레스나 특정 네트워크에 있는 클라이언트들에게, 특정한 config 파일을 지정하고 싶을 때는 파일명을 지정해준다.
    • 맥어드레스가 00-0E-0C-66-FC-BE 인 사용자에게만 특정하게 사용할 config 파일을 만들고 싶다면 00-0E-0C-66-FC-BE 이름의 설정파일을 만들면 된다.
    • 192.168.0.0 네트워크에 있는 사용자에게만 특정하게 사용할 config 파일은 c0a800 이름의 설정파일을 만들면 된다.
      (c0a800 은 192.168.0 의 hex 값이다. sh# printf "%02X%02X%02X" 192 168 0 하면 hex 값이 나옵니다.)
    • 저는 01-<타겟서버의 맥주소>로 파일명을 지정했습니다.
# cd /var/lib/tftpboot

# mkdir pxelinux.cfg

# vim pxelinux.cfg/01-08-00-27-3f-45-1a
  •  
  • 설정파일 작성
    • kernel : vmlinuz 위치
    • initrd : 커널 모듈이미지 (initrd.img) 위치
    • ks : kickstart 파일 위치

promt 0

timeout 30

 

default centos6.9

label centos6.9

 kernel images/centos6.9/vmlinuz

 append initrd=images/centos6.9/initrd.img ramdisk_size=100000 ks=http://10.10.10.11/pxe/ks.cfg/target1.cfg ksdevice=eth0

 

 

target 노드 OS 자동설치

pxe-server 세팅은 끝났습니다. 이제 타겟노드(vm#2)를 부팅시켜 OS가 자동으로 설치되는지 확인해보겠습니다.

  • dhcp 실행

오호. dhcp 설정에서 range를 10.10.10.12 ~ 10.10.10.14 로 적어놓았는데, 타겟노드가 10.10.10.12 ip를 부여받은 걸 확인할 수 있습니다.

  • 진행중

커널이미지 로딩하고, OS 설정파일 등록하고 등등 이러한 과정을 다 거친 후에, 패키지설치가 진행되는 모습입니다. 패키지 설치까지 완료되면 OS설치가 완료된 것입니다.
여기서 기다리면 재부팅이 됩니다. 재부팅 될 때는 부팅순서 1순위인 하드디스크 부팅이 진행될 겁니다. OS설치가 진행됐으므로 하드디스크에 부팅에 필요한 것들이 저장되어 있기 때문입니다. (OS설치가 안됐을 때는 하드디스크에 정보가 없으므로 2순위인 네트워크 부팅이 됩니다.)

  • OS자동설치 성공!

 

 

 

 

반응형

댓글