개요
- 클러스터에 OS를 설치할 때, 여러 개 노드에 일일이 OS를 수동설치하는 것은 번거롭다.
- PXE를 사용하면 여러 개의 노드에 OS를 자동으로 설치할 수 있다.
- 실습은 virtual box로 서버 2개(pxe용 서버, target1 서버)를 만들어 진행합니다.
목차
- PXE 개념
- virtual box 환경세팅
- iso 이미지 mount
- httpd
- tftp-server
- dhcpd
- pxelinux 설정
- 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자동설치 성공!
'기초 튼튼탄탄탄 > 서버, OS(리눅스)' 카테고리의 다른 글
[리눅스-CentOS] 로컬 Repository 만들기 (8) | 2021.01.06 |
---|---|
PCS로 HA 클러스터 구성하기 (WAS-wildfly) (6) | 2021.01.04 |
디스크 RAID / 파티션 / 포맷 / 마운트 (550) | 2020.07.27 |
Linux(CentOS)와 Google Drive 동기화하기 (4) | 2020.02.13 |
인프라업무 Remind (4) | 2019.10.27 |
댓글