PXE ์ง„ํ–‰ ๊ณผ์ •

๊ธฐ์ค€ ํ™˜๊ฒฝ

  • PXE ์„œ๋ฒ„ IP
    • 17.3.115.126
  • ๋Œ€์ƒ ์„œ๋ฒ„ ๋Œ€์—ญ
    • 17.3.115.0/24
  • ์„ค์น˜ OS
    • Rocky Linux 9.7 (์ถ”ํ›„์— ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ๊ฐ€๋Šฅ)
    • ๋ฒ„์ „ ์„ ํƒํ•  ๋•Œ๋Š” ๋ฌด์กฐ๊ฑด ์ตœ์‹  ๋ฒ„์ „ ์‚ฌ์šฉ์ด ์•„๋‹Œ ์•ˆ์ •์„ฑ์„ ๊ณ ๋ คํ•˜์—ฌ ์„ ํƒ
  • ๋ฐฉ์‹
    • PXE + Kickstart ์ž๋™ ์„ค์น˜
  • UEFI / BIOS ๋‘˜ ๋‹ค ๋Œ€์‘

 

์ „์ฒด ํ๋ฆ„ ์ •๋ฆฌ

  1. ํ•„์š”ํ•œ ํŒจํ‚ค์ง€ ์„ค์น˜ ๋ฐ ํ™•์ธ
  2. DHCP ์„ค์ •
  3. ISO ๋งˆ์šดํŠธ
  4. ๋ถ€ํŒ… ํŒŒ์ผ ๋ณต์‚ฌ (TFTP)
  5. Rocky ์„ค์น˜ ํŒŒ์ผ ๊ณต๊ฐœ (HTTP)
  6. PXE ๋ฉ”๋‰ด ์ž‘์„ฑ
  7. Kickstart ์ž‘์„ฑ
  8. ์„œ๋น„์Šค ์‹œ์ž‘
  9. ๋ฐฉํ™”๋ฒฝ ํ—ˆ์šฉ
  10. PXE ์„œ๋ฒ„ ์ƒํƒœ ์ ๊ฒ€
  11. ๋Œ€์ƒ ์„œ๋ฒ„ PXE ๋ถ€ํŒ… ์‹œ ๋กœ๊ทธ ํ™•์ธ

 

(1) ํ•„์š”ํ•œ ํŒจํ‚ค์ง€ ์„ค์น˜ ๋ฐ ํ™•์ธ

  • ์„ค์น˜ ์—ฌ๋ถ€ ํ™•์ธ
    • rpm -qa | egrep "dhcp|tftp|syslinux|httpd|grub2-efi|shim"
  • ํŒจํ‚ค์ง€ ์„ค์น˜
    • dnf install -y dhcp-server tftp-server syslinux httpd grub2-efi-x64 shim-x64
  • DHCP ์„ค์น˜ ํ™•์ธ
    • rpm -qa | grep dhcp-server
  • ๋””๋ ‰ํ† ๋ฆฌ ๊ตฌ์„ฑ
    • /var/lib/tftpboot : PXE ๋ถ€ํŒ…์šฉ ํŒŒ์ผ
    • /var/www/html : Rocky ์„ค์น˜ ํŒŒ์ผ + Kickstart

 

(2) DHCP ์„ค์ •

option arch code 93 = unsigned integer 16;

default-lease-time 600;
max-lease-time 7200;

deny unknown-clients;
authoritative;

subnet 17.3.115.0 netmask 255.255.255.0 {
  option routers 17.3.115.2; # ๊ฒŒ์ดํŠธ์›จ์ด ์ฃผ์†Œ
  option subnet-mask 255.255.255.0;
  option domain-name-servers 17.17.17.102, 17.17.17.103; # dns ์„ค์ •

  next-server 17.3.115.126; 

  if option arch = 00:07 or option arch = 00:09 {
      filename "shimx64.efi";
  } else {
      filename "pxelinux.0";
  }
}

host server-123 {
  hardware ethernet 10:e7:c6:43:3c:02;
  fixed-address 17.3.115.123;
}

host server-127 {
  hardware ethernet 84:69:93:79:ec:66;
  fixed-address 17.3.115.127;
}
  • ์„ค์ • ํŒŒ์ผ ์ž‘์„ฑ
  • `/etc/dhcp/dhcpd.conf`์— ์ž‘์„ฑ (ํŒจํ‚ค์ง€ ์„ค์น˜ํ•˜๋ฉด ํŒŒ์ผ์€ ์ž๋™์œผ๋กœ ์ƒ์„ฑ๋˜์–ด ์žˆ์Œ)
  • option arch code 93 = unsigned integer 16;
    • ํด๋ผ์ด์–ธํŠธ ์•„ํ‚คํ…์ฒ˜ ํƒ€์ž… ์ •์˜
    • PXE ํด๋ผ์ด์–ธํŠธ๊ฐ€ BIOS์ธ์ง€ UEFI์ธ์ง€
  •  authoritative;
    • ๊ณต์‹ DHCP ์„œ๋ฒ„ ์„ ์–ธ
  • next-server 17.3.115.126;
    • PXE ์„œ๋ฒ„ ์œ„์น˜
  • IP ์„ค์ •์€ ๊ฐ™์€ ๋„คํŠธ์›Œํฌ ๋Œ€์—ญ ์•ˆ์—์„œ ์ง€์ •
  • ์„ค์ • ํŒŒ์ผ ๋ฌธ๋ฒ• ๊ฒ€์‚ฌ
    • dhcpd -t -cf /etc/dhcp/dhcpd.conf

 

(3) ISO ๋งˆ์šดํŠธ

  • ๋กœํ‚ค Minimal ์‚ฌ์šฉ
  • ISO ํŒŒ์ผ ์ค€๋น„
mkdir -p /mnt/iso

mount -o loop Rocky-9.7~.iso(๊ฒฝ๋กœ ์ง€์ •) /mnt/iso
  • ํ™•์ธ
    • ls /mnt/iso
    • images, EFI ๋“ฑ์˜ ํด๋”(ํŒŒ์ผ)์ด ๋ณด์—ฌ์•ผ ํ•จ

 

(4) ๋ถ€ํŒ… ํŒŒ์ผ ๋ณต์‚ฌ (TFTP)

  • ์„ค์น˜ ISO ์ „์ฒด๋ฅผ ์ฃผ๋Š” ๊ฒƒ์ด ์•„๋‹Œ, ๋ถ€ํŒ…์— ํ•„์š”ํ•œ ์ตœ์†Œ ํŒŒ์ผ์„ TFTP๋กœ ์ œ๊ณต
  • ํ•„์š”ํ•˜๋‹ค๋ฉด ํŒŒ์ผ์— ๊ถŒํ•œ ์„ค์ • (ํŒŒ์ผ์„ ์ฝ์ง€ ๋ชปํ•  ์ˆ˜๋„ ์žˆ์Œ)

BIOS PXE์šฉ ํŒŒ์ผ

find /usr/share -name pxelinux.0 # /usr/share/syslinux/pxelinux.0
find /usr/share -name ldlinux.c32 # /usr/share/syslinux/ldlinux.c32
find /usr/share -name libcom32.c32 # /usr/share/syslinux/libcom32.c32
find /usr/share -name libutil.c32 # /usr/share/syslinux/libutil.c32

cp /usr/share/syslinux/pxelinux.0 /var/lib/tftpboot/
cp /usr/share/syslinux/ldlinux.c32 /var/lib/tftpboot/
cp /usr/share/syslinux/libcom32.c32 /var/lib/tftpboot/
cp /usr/share/syslinux/libutil.c32 /var/lib/tftpboot/

# ์ด ๋‘˜์€ ์„ ํƒ์ด์ง€๋งŒ ๊ถŒ์žฅํ•œ๋‹ค๊ณ  ํ•จ
find /usr/share -name menu.c32 # /usr/share/syslinux/menu.c32
find /usr/share -name vesamenu.c32 # /usr/share/syslinux/vesamenu.c32

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

UEFI PXE์šฉ ํŒŒ์ผ

find /boot -name shimx64.efi
find /boot -name grubx64.efi

cp /boot/efi/EFI/rocky/shimx64.efi /var/lib/tftpboot/
cp /boot/efi/EFI/rocky/grubx64.efi /var/lib/tftpboot/

 

PXE ์ปค๋„ ๋ณต์‚ฌ

cp /mnt/iso/images/pxeboot/vmlinuz /var/lib/tftpboot/rocky/9.7/
cp /mnt/iso/images/pxeboot/initrd.img /var/lib/tftpboot/rocky/9.7/
  • vmlinuz(์ปค๋„)๋กœ ๋ถ€ํŒ…
  • initrd.img๋กœ ์„ค์น˜๊ธฐ ์˜ฌ๋ฆผ
    • ์ดˆ๊ธฐ ๋ถ€ํŒ…์šฉ ์ž„์‹œ ๋ฃจํŠธ ํŒŒ์ผ ์‹œ์Šคํ…œ
    • ์•„๋‚˜์ฝ˜๋‹ค ์„ค์น˜๊ธฐ, ๋“œ๋ผ์ด๋ฒ„, ๋„คํŠธ์›Œํฌ ๊ธฐ๋Šฅ ๋“ฑ์ด ๋“ค์–ด์žˆ์Œ

 

(5) Rocky ์„ค์น˜ ํŒŒ์ผ ๋ณต์‚ฌ (HTTP)

mkdir -p /var/www/html/rocky/9.7

cp -r /mnt/iso/* /var/www/html/rocky/9.7/

ls /var/www/html/rocky/9.7/repodata # Minimal๋„ repodata ์กด์žฌํ•ด์•ผ ํ•จ
  • HTTP ํด๋”๋กœ ๋กœํ‚ค ๋งˆ์šดํŠธ ๋ณต์‚ฌ

 

(6) PXE ๋ฉ”๋‰ด ์ž‘์„ฑ

BIOS ๋ฉ”๋‰ด ์ž‘์„ฑ

DEFAULT rocky9.7-auto
PROMPT 0
TIMEOUT 10

LABEL rocky9.7-auto
  KERNEL rocky/9.7/vmlinuz
  APPEND initrd=rocky/9.7/initrd.img inst.repo=http://17.3.115.126/rocky/9.7 inst.ks=http://17.3.115.126/ks.cfg quiet

LABEL local-disk
  LOCALBOOT 0
  • `mkdir -p /var/lib/tftpboot/pxelinux.cfg`
  • `/var/lib/tftpboot/pxelinux.cfg/default`์— ์ž‘์„ฑ
  • ํ•ด๋‹น ํŒŒ์ผ ์œ„์น˜
    •  /var/lib/tftpboot/rocky/9.7/
      • vmlinuz
      • initrd.img
    • /var/www/html/
      • rocky/9.7
      • ks.cfg

UEFI ๋ฉ”๋‰ด ์ž‘์„ฑ (grub.cfg ์ž‘์„ฑ)

set timeout=10
set default=0

menuentry "Rocky Linux 9.7 Auto Install" {
  linuxefi /rocky/9.7/vmlinuz inst.repo=http://17.3.115.126/rocky/9.7 inst.ks=http://17.3.115.126/ks.cfg quiet
  initrdefi /rocky/9.7/initrd.img
}
  • `/var/lib/tftpboot/grub.cfg`์— ์ž‘์„ฑ
  • ํ•ด๋‹น ํŒŒ์ผ ์œ„์น˜
    • ์œ„์™€ ๋™์ผ

์ฃผ์˜!

  • ์ง€๊ธˆ ์ƒํƒœ๋Š” `/var/www/html/rocky/9.7`๊ฐ€ ์•„๋‹Œ `/var/www/html/rocky/9.7/Minimal`์—  `/repodata/repomd.xml`๊ฐ€ ์œ„์น˜ํ•ด ์žˆ์Œ
  • PXE ๋ฉ”๋‰ด์—์„œ repo ์œ„์น˜๋ฅผ `/rocky/9.7`๋กœ ์žก์•„๋†จ๊ธฐ ๋•Œ๋ฌธ์— `/Minimal` ํด๋” ์•ˆ์— ์žˆ๋Š” ํŒŒ์ผ๋“ค์„ ๋ชจ๋‘ ๊บผ๋‚ด์ค˜์•ผ ํ•จ
  • ์ •ํ™•ํ•œ ์ด์œ ๋Š” ๋ชจ๋ฅด๊ฒ ์ง€๋งŒ PXE ๋ฉ”๋‰ด์—์„œ repo ๊ฒฝ๋กœ ๋’ค์— `/Minimal`์„ ๋ถ™์ด๋Š” ๊ฑธ๋กœ๋Š” ํ•ด๊ฒฐ์ด ๋˜์ง€ ์•Š์Œ

 

(7) Kickstart ์„ค์ • ์ž‘์„ฑ

text
reboot

# English install (avoid Korean font issues)
lang en_US.UTF-8
keyboard us
timezone Asia/Seoul --utc

url --url="http://17.3.115.126/rocky/9.7"

rootpw --plaintext 'simul!'

# IP ์ž๋™ ํ• ๋‹น ๋ฐ DNS ์„œ๋ฒ„ ์„ค์ •
network --bootproto=dhcp --device=link --activate

# ํ˜ธ์ŠคํŠธ๋ช… ์„ค์ •
network --hostname=localhost.localdomain

# Auto select install disk
%pre --log=/tmp/ks-pre.log

if ls /dev/nvme*n1 >/dev/null 2>&1; then
    install_disk=$(ls /dev/nvme*n1 | head -n1 | sed 's|/dev/||')
else
    install_disk=$(lsblk -ndo NAME,TYPE,SIZE \
        | awk '$2=="disk"{print $1,$3}' \
        | sort -k2 -h \
        | head -n1 \
        | awk '{print $1}')
fi

cat > /tmp/disk.ks <<EOF
ignoredisk --only-use=${install_disk}
zerombr
clearpart --all --initlabel --drives=${install_disk}
bootloader --boot-drive=${install_disk}

part /boot/efi --fstype=efi   --size=1024 --ondisk=${install_disk}
part /boot     --fstype=ext4  --size=1024 --ondisk=${install_disk}
part swap      --fstype=swap  --size=16384 --ondisk=${install_disk}
part /         --fstype=xfs   --grow       --ondisk=${install_disk}
EOF

%end

%include /tmp/disk.ks

%packages
@^minimal-environment
%end

%post
echo "DEV server clean install completed." > /root/ks-info.txt
echo "All configuration will be applied by Ansible." >> /root/ks-info.txt

# root SSH ๋กœ๊ทธ์ธ ํ—ˆ์šฉ
sed -i 's/^#PermitRootLogin.*/PermitRootLogin yes/' /etc/ssh/sshd_config
sed -i 's/^PermitRootLogin.*/PermitRootLogin yes/' /etc/ssh/sshd_config 

# ๋น„๋ฐ€๋ฒˆํ˜ธ ๋กœ๊ทธ์ธ ํ—ˆ์šฉ
sed -i 's/^#PasswordAuthentication.*/PasswordAuthentication yes/' /etc/ssh/sshd_config
sed -i 's/^PasswordAuthentication.*/PasswordAuthentication yes/' /etc/ssh/sshd_config 

# SSH ํ™œ์„ฑํ™”
systemctl enable sshd
systemctl restart sshd 

%end
  • `/var/www/html`์— ์ž‘์„ฑ

 

(8) ์„œ๋น„์Šค ์‹œ์ž‘

systemctl enable --now dhcpd
systemctl enable --now tftp.socket
systemctl enable --now httpd

# ์ƒํƒœ ํ™•์ธ
systemctl status dhcpd
systemctl status tftp.socket
systemctl status httpd

 

(9) ๋ฐฉํ™”๋ฒฝ ํ—ˆ์šฉ (ํฌํŠธ ์˜คํ”ˆ)

firewall-cmd --permanent --add-service=dhcp
firewall-cmd --permanent --add-service=tftp
firewall-cmd --permanent --add-service=http
firewall-cmd --reload

# ํ™•์ธ
firewall-cmd --list-all

 

(10) PXE ์„œ๋ฒ„ ์ƒํƒœ ์ ๊ฒ€

# Kickstart ์ ‘๊ทผ ํ™•์ธ
curl <http://17.3.115.126/ks.cfg>

# Repo ์ ‘๊ทผ ํ™•์ธ
curl <http://17.3.115.126/rocky/9.7/.treeinfo>
curl <http://17.3.115.126/rocky/9.7/repodata/repomd.xml>

 

(11) ๋Œ€์ƒ ์„œ๋ฒ„ PXE ๋ถ€ํŒ… ์‹œ ๋กœ๊ทธ ํ™•์ธ

journalctl -u dhcpd -f
journalctl -u tftp.socket -f
tail -f /var/log/httpd/access_log # ํŒŒ์ผ ๊ฒฝ๋กœ
  • ๋กœ๊ทธ ํ™•์ธ์€ PXE ์„œ๋ฒ„์—์„œ ์ง„ํ–‰

 

์œ„ ๊ณผ์ • ์ง„ํ–‰ ํ›„ ์•ˆ๋˜๋Š” ์›์ธ

  • .treeinfo ๊ฒฝ๋กœ ๋ชป์ฐพ์Œ
    • ์ด ํŒŒ์ผ์€ ์ง€๊ธˆ ๊ณผ์ •(Minimal ์‚ฌ์šฉ)์—์„  ์—†์–ด๋„ ๋ฌด๊ด€ํ•œ๋“ฏ ํ•จ (ํŒŒ์ผ์ด ์กด์žฌํ•˜์ง€ ์•Š์Œ)
  • repodata/repomd.xml ๊ฒฝ๋กœ ๋ชป์ฐพ์Œ
    • ์„ค์ • ํŒŒ์ผ(default, grub.cfg)์—์„œ rocky/9.7์„ repo ๊ฒฝ๋กœ๋กœ ์„ค์ •ํ•œ ์ƒํƒœ์ธ๋ฐ ์‹ค์ œ๋กœ repodata๋Š” Minimal ํด๋” ์•ˆ์— ๋“ค์–ด์žˆ์Œ
    • ๋จผ์ € repo ๊ฒฝ๋กœ ๋์— /Minimal์„ ๋ถ™์—ฌ๋ดค๋Š”๋ฐ ์—๋Ÿฌ ๋ฐœ์ƒํ•จ
    • Minimal ๋‚ด๋ถ€์˜ ํด๋”๋“ค์„ ์„ค์ •ํ•œ repo ๊ฒฝ๋กœ๋กœ ์˜ฎ๊ธฐ๋‹ˆ ํ•ด๊ฒฐ๋จ

 

๋Œ€์ƒ ์„œ๋ฒ„์—์„œ ์–ด๋“œ๋ฏผ ๊ณ„์ • ์ถ”๊ฐ€

useradd -m admin
passwd admin
usermod -aG wheel admin # ์‚ฌ์šฉ์ž๋ฅผ wheel ๊ทธ๋ฃน์— ์ถ”๊ฐ€ (sudo ๊ถŒํ•œ ๊ด€๋ฆฌ์ž ๊ทธ๋ฃน)
su - admin
  • ๋ฌผ๋ก  admin์ด ์•„๋‹Œ ๋‹ค๋ฅธ ์ด๋ฆ„ ์‚ฌ์šฉ ๊ฐ€๋Šฅ