본문 바로가기

Operating Systems/Linux

[ Linux ] PXE 서버 설치 [ 임시 작성 ]

PXE(Preboot Execution Environment)

 

1. CentOS7

 

[ PXE 서버 ]

VMWare 가 기본적인 DHCP 서버를 제공하지 않도록 체크박스 해제
기본 CentOS7 이미지 삽입 및 Device Status 체크박스 체크

yum -y install syslinux tftp-server vsftpd dhcp xinetd

# 파일 복사 진행 상황 표시 툴 설치
yum -y install rsync

# 인터페이스 이름 확인
NET_INTERFACE=`ls /sys/class/net | grep -v lo | head -1`

PXE_SERVER_IP=`ip route | grep -e ${NET_INTERFACE} | grep src | awk '{print $9}'`

cat <<DHCP_SETTING > /etc/dhcp/dhcpd.conf
subnet ${PXE_SERVER_IP%.*}.0 netmask 255.255.255.0
{
$(printf '\t')option routers ${PXE_SERVER_IP%.*}.2;
$(printf '\t')option subnet-mask 255.255.255.0;
$(printf '\t')range dynamic-bootp ${PXE_SERVER_IP%.*}.30 ${PXE_SERVER_IP%.*}.50;
$(printf '\t')option domain-name-servers 168.126.63.1;
$(printf '\t')allow booting;
$(printf '\t')allow bootp;
$(printf '\t')next-server ${PXE_SERVER_IP};
$(printf '\t')filename "pxelinux.0";
}
DHCP_SETTING

cat <<TFTP_SETTING > /etc/xinetd.d/tftp
service tftp
{
$(printf '\t')socket_type = dgram
$(printf '\t')protocol = udp
$(printf '\t')wait = yes
$(printf '\t')user = root
$(printf '\t')server = /usr/sbin/in.tftpd
$(printf '\t')server_args = -s /var/lib/tftpboot
$(printf '\t')disable = no
$(printf '\t')per_source = 11
$(printf '\t')cps = 100 2
$(printf '\t')flags = IPv4
}
TFTP_SETTING

mkdir -p /app/repo/ftp/boot

chmod 775 /app/repo/ftp
chmod 777 /app/repo/ftp/boot

sed -i "s/^write_enable.*//g" /etc/vsftpd/vsftpd.conf
sed -i "s/^anon_upload_enable.*//g" /etc/vsftpd/vsftpd.conf
sed -i "s/^anon_root.*//g" /etc/vsftpd/vsftpd.conf
sed -i "s/^pasv_enable.*//g" /etc/vsftpd/vsftpd.conf
sed -i "s/^pasv_min_port.*//g" /etc/vsftpd/vsftpd.conf
sed -i "s/^pasv_max_port.*//g" /etc/vsftpd/vsftpd.conf

sed -i "/^$/d" /etc/vsftpd/vsftpd.conf

cat <<FTP_SERVER_SETTING >> /etc/vsftpd/vsftpd.conf
write_enable=YES
anon_upload_enable=YES
anon_root=/app/repo/ftp
pasv_enable=YES
pasv_min_port=30000
pasv_max_port=30009
FTP_SERVER_SETTING

# ftpusers 설정 파일에 등록된 유저는
# 패스워드 확인 후 거부
sed -i "s/^root.*//g" /etc/vsftpd/ftpusers

# user_list 설정 파일에 등록된 유저는
# 무조건 거부
sed -i "s/^root.*//g" /etc/vsftpd/user_list

# mount 확인
df

# 기본 cdrom mount 해제
umount /dev/cdrom 

mkdir /mnt/cdrom

# CentOS7 CD-ROM에 ISO 파일 확인 및
# Device Status 체크박스 확인후 생성한 폴더에 마운트
mount /dev/cdrom /mnt/cdrom

# cdrom 에 있는 파일 ftp 기본 폴더로 복사
# rsync 명령으로 진행상황까지 표시
rsync -r --progress /mnt/cdrom/* /app/repo/ftp/boot/

# 복사 완료되었으면 cdrom의 cd 제거
umount /dev/cdrom

# tftp 기본 공유 폴더에 부팅 파일 복사
cp /app/repo/ftp/boot/images/pxeboot/vmlinuz /var/lib/tftpboot/

cp /app/repo/ftp/boot/images/pxeboot/initrd.img /var/lib/tftpboot/

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

# 부팅 정보 config 폴더 생성
mkdir /var/lib/tftpboot/pxelinux.cfg

cat <<PXE_SETTING > /var/lib/tftpboot/pxelinux.cfg/default
DEFAULT CentOS7_Auto_Install

LABEL CentOS7_Auto_Install

$(printf '\t')kernel vmlinuz

$(printf '\t')APPEND initrd=initrd.img repo=ftp://${PXE_SERVER_IP}/boot
PXE_SETTING

# KICK Start 를 GUI 설치하려면 아래 명령어로 Config 파일 생성 툴 설치
# yum -y install system-config-kickstart system-config-keyboard
# system-config-kickstart 실행 후
# 기본 설정 → [ 기본언어: 한국어 ], [ 시간대: Asia/Seoul ], [ root 암호: P@ssw0rd! ]
# [ 암호 확인: P@ssw0rd! ], [ 설치후 시스템 재부팅: 체크 ]
# 설치 방법 → [ 새로운 설치 실행: 체크 ], [ 설치 소스: FTP: 체크 ], 
# [ FTP 서버: 서버 아이피 ], [ FTP 디렉토리: boot ] ※ 사용자명 암호 체크 안함
# 부트로더 옵션 → [ 새로운  부트로더 설치: 체크 ]
# 파티션 정보 → [ 마스터 부트 레코드 내용 삭제: 체크 ], [ 모든 기본 파티션 삭제: 체크 ], [ 디스크 레이블 초기화: 체크 ], 
# [ 레이아웃: 추가: 파일시스템 유형: 스왑 (swap): 수정된 용량 2048: 확인],
# [ 레이아웃: 추가: 마운트할 지점: /: 사용안된 디스크 공간 모두 채움: 확인]
# 파일 → 저장 → [ 파일시스템: app: repo: ftp: 이름: centos.ks ] → 저장
# 파일 → 끝내기
cat <<KICK_START_SETTING > /app/repo/ftp/centos.ks
#platform=x86, AMD64, 또는 Intel EM64T
#version=DEVEL
# Install OS instead of upgrade
install
# Keyboard layouts
keyboard 'us'
# Root password
rootpw --iscrypted \$1\$JqhTp6p8\$PlfasfGLIisFMnwo2CLCK.
# System language
lang ko_KR
# System authorization information
auth  --useshadow  --passalgo=sha512
# Use graphical install
graphical
firstboot --disable
# SELinux configuration
selinux --enforcing


# Firewall configuration
firewall --disabled
# Reboot after installation
reboot
# System timezone
timezone Asia/Seoul
# Use network installation
url --url="ftp://${PXE_SERVER_IP}/boot"
# System bootloader configuration
bootloader --location=mbr
# Clear the Master Boot Record
zerombr
# Partition clearing information
clearpart --all --initlabel
# Disk partitioning information
part swap --fstype="swap" --size=2048
part / --fstype="xfs" --grow --size=1
KICK_START_SETTING

# 버그로 인해 설정 툴로 패키지 등록이 되지 않음
# 직접 입력해주어야 함
cat <<KICK_START_SETTING >> /app/repo/ftp/centos.ks

%packages

@base

@core

@directory-client

@fonts

@gnome-desktop

@input-methods

@internet-browser

@java-platform

@multimedia

@network-file-system-client

@x11

%end
KICK_START_SETTING

# KICK START 정보 추가
cat <<PXE_SETTING > /var/lib/tftpboot/pxelinux.cfg/default
DEFAULT CentOS7_Auto_Install

LABEL CentOS7_Auto_Install

$(printf '\t')kernel vmlinuz

$(printf '\t')APPEND initrd=initrd.img repo=ftp://${PXE_SERVER_IP}/boot ks=ftp://${PXE_SERVER_IP}/centos.ks
PXE_SETTING

# 기본적으로 사용되는 dnsmasq 종료
ps -ef | grep dnsmasq | grep -v grep | awk '{ print $2 }' | xargs kill -9 2>null

# arp 테이블 삭제
ip -s -s neigh flush all

# dnsmasq 부팅시 사용하지 않도록 설정
systemctl disable libvirtd

firewall-cmd --permanent --add-port=69/udp

firewall-cmd --permanent --add-port=21/tcp --add-port=30000-30009/tcp

firewall-cmd --reload

firewall-cmd --list-ports

getsebool -a | grep ^ftp

setsebool -P ftpd_anon_write 1
setsebool -P ftpd_connect_all_unreserved 1
setsebool -P ftpd_connect_db 1
setsebool -P ftpd_full_access 1
setsebool -P ftpd_use_cifs 1
setsebool -P ftpd_use_fusefs 1
setsebool -P ftpd_use_nfs 1
setsebool -P ftpd_use_passive_mode 1

systemctl restart dhcpd

systemctl restart vsftpd

systemctl restart xinetd

systemctl enable xinetd

systemctl enable vsftpd

systemctl enable dhcpd

 

[ 리눅스 클라이언트 ]

새 가상머신 생성
iso 파일은 넣지 않고 생성
centos7 을 설치할 것이라 지정
가상 머신 이름 설정
용량 설정
하드웨어 설정
네트워크 대역을 PXE 서버의 네트워크 대역과 동일하게 설정
생성한 가상머신 실행

 

2. Ubuntu20

 

[ PXE 서버 ]

# PXE Client 설치가 도중 실패하는 경우 메모리 용량이 늘린뒤 다시시도
apt-get -y install isc-dhcp-server tftpd-hpa xinetd vsftpd pxelinux

# 인터페이스 이름 확인
NET_INTERFACE=`ls /sys/class/net | grep -v lo | head -1`

PXE_SERVER_IP=`ip route | grep -e ${NET_INTERFACE} | grep src | awk '{print $9}'`

cat <<DHCP_SETTING > /etc/dhcp/dhcpd.conf
subnet ${PXE_SERVER_IP%.*}.0 netmask 255.255.255.0
{
$(printf '\t')option routers ${PXE_SERVER_IP%.*}.2;
$(printf '\t')option subnet-mask 255.255.255.0;
$(printf '\t')range dynamic-bootp ${PXE_SERVER_IP%.*}.30 ${PXE_SERVER_IP%.*}.50;
$(printf '\t')option domain-name-servers 168.126.63.1;
$(printf '\t')allow booting;
$(printf '\t')allow bootp;
$(printf '\t')next-server ${PXE_SERVER_IP};
$(printf '\t')option bootfile-name "pxelinux.0";
}
DHCP_SETTING

mkdir -p /app/repo/tftp

cat <<TFTP_SETTING > /etc/default/tftpd-hpa
TFTP_USERNAME="tftp"
TFTP_DIRECTORY="/app/repo/tftp"
TFTP_ADDRESS=":69"
TFTP_OPTIONS="--secure"

RUN_DAEMON="yes"
OPTIONS="-l -s /app/repo/tftp"
TFTP_SETTING

cat <<TFTP_SETTING > /etc/xinetd.d/tftp
service tftp
{
$(printf '\t')socket_type = dgram
$(printf '\t')protocol = udp
$(printf '\t')wait = yes
$(printf '\t')user = root
$(printf '\t')server = /usr/sbin/in.tftpd
$(printf '\t')server_args = -c -p -s /app/repo/tftp
$(printf '\t')disable = no
$(printf '\t')per_source = 11
$(printf '\t')cps = 100 2
$(printf '\t')flags = IPv4
}
TFTP_SETTING

mkdir -p /app/repo/ftp/pxe

chmod 775 /app/repo/ftp
chmod 777 /app/repo/ftp/pxe

sed -i "s/^write_enable.*//g" /etc/vsftpd.conf
sed -i "s/^anonymous_enable.*//g" /etc/vsftpd.conf
sed -i "s/^anon_upload_enable.*//g" /etc/vsftpd.conf
sed -i "s/^anon_root.*//g" /etc/vsftpd.conf
sed -i "s/^pasv_enable.*//g" /etc/vsftpd.conf
sed -i "s/^pasv_min_port.*//g" /etc/vsftpd.conf
sed -i "s/^pasv_max_port.*//g" /etc/vsftpd.conf
sed -i "s/^userlist_enable.*//g" /etc/vsftpd.conf
sed -i "s/^userlist_file.*//g" /etc/vsftpd.conf
sed -i "s/^userlist_deny.*//g" /etc/vsftpd.conf

sed -i "/^$/d" /etc/vsftpd/vsftpd.conf

cat <<FTP_SERVER_SETTING >> /etc/vsftpd.conf
anonymous_enable=YES
write_enable=YES
anon_upload_enable=YES
anon_root=/app/repo/ftp
pasv_enable=YES
pasv_min_port=30000
pasv_max_port=30009
userlist_enable=YES
userlist_file=/etc/user_list
userlist_deny=YES
FTP_SERVER_SETTING

# ftpusers 설정 파일에 등록된 유저는
# 패스워드 확인 후 거부
sed -i "s/^root.*//g" /etc/ftpusers

echo >> /etc/user_list

# user_list 설정 파일에 등록된 유저는
# 무조건 거부
sed -i "s/^root.*//g" /etc/user_list

# mount 확인
df

mkdir /mnt/cdrom

# iso를 다운로드 받아 진행할 경우
# wget https://releases.ubuntu.com/20.04/ubuntu-20.04.3-live-server-amd64.iso -O /app/repo/ftp/pxe/ubuntu20.04.iso
# mount /app/repo/ftp/ubuntu20.04.iso /mnt/cdrom
mount /dev/cdrom /mnt/cdrom

# Hardware List 출력 ( cdrom 파일 위치 확인 )
lshw -c disk

# iso 이미지 추출
dd if=/dev/cdrom of=/app/repo/ftp/pxe/ubuntu20.04.iso bs=2k

# cdrom 에 있는 부팅파일 tftp 기본 폴더로 복사
cp /mnt/cdrom/casper/vmlinuz /app/repo/tftp/
cp /mnt/cdrom/casper/initrd /app/repo/tftp/
cp /usr/lib/syslinux/modules/bios/ldlinux.c32 /app/repo/tftp/
cp /usr/lib/PXELINUX/pxelinux.0 /app/repo/tftp/

# 복사 완료되었으면 cdrom의 cd 제거
umount /mnt/cdrom

# 부팅 정보 config 폴더 생성
mkdir /app/repo/tftp/pxelinux.cfg

cat <<PXE_SETTING > /app/repo/tftp/pxelinux.cfg/default
DEFAULT Ubuntu20_Auto_Install

LABEL Ubuntu20_Auto_Install
$(printf '\t')kernel vmlinuz
$(printf '\t')initrd initrd
$(printf '\t')APPEND ip=dhcp url=ftp://${PXE_SERVER_IP}/pxe/ubuntu20.04.iso
PXE_SETTING

ufw allow 69/udp
ufw allow 21/tcp
ufw allow 30000:30009/udp

ufw reload

ufw status

systemctl disable tftpd-hpa

systemctl stop tftpd-hpa

systemctl restart isc-dhcp-server

systemctl restart vsftpd

systemctl restart xinetd

systemctl enable xinetd

systemctl enable vsftpd

systemctl enable isc-dhcp-server

 

[ 리눅스 클라이언트 ]

#

'Operating Systems > Linux' 카테고리의 다른 글

[ Linux ] FIND 활용  (0) 2021.10.25
[ Linux ] 파일 압축 및 해제  (0) 2021.10.22
[ Linux ] PROXY 서버 설치  (0) 2021.10.20
[ Linux ] RAID 활용 ( 2 / 2 ) - Ubuntu20  (0) 2021.10.18
[ Linux ] RAID 활용 ( 1 / 2 ) - CentOS7  (0) 2021.10.18