びぼうろぐ

ネ申エクセルからの卒業

【RHEL8】PXEサーバを設定してみる

RHEL8でネットワークブートしてみます。

PXEとは

以下RHELのドキュメントからの引用です。

PXE を使用してネットワークからインストールするための準備

インストールサーバーへのアクセスがあるシステムに、Red Hat Enterprise Linux をインストールできます。ネットワークインストールには、少なくとも 2 つのシステムが必要です。

  • PXE サーバー: DHCP サーバー、TFTP サーバー、および HTTP サーバー、HTTPS サーバー、FTP サーバー、または NFS サーバーを実行しているシステム。

  • クライアント: Red Hat Enterprise Linux をインストールしているシステム。インストールが開始すると、クライアントは DHCP サーバーに問い合わせ、TFTP サーバーからブートファイルを受け取り、HTTP サーバー、HTTPS サーバー、FTP サーバー、または NFS サーバーからインストールイメージをダウンロードします。その他のインストール方法とは異なり、クライアントはインストールを開始するのに物理的な起動メディアを必要としません。

環境構成

NW

VM

  • CPU: 1
  • Mem: 1GB
  • Disk: 20GB

OS

RHEL8.1を最小構成でインストール

インストール

ライセンス登録

Developer Lisence をありがたく使わせてもらいます。

$ sudo subscription-manager register --username=<myname> --password=<mypassword>
$ sudo subscription-manager subscribe --auto

最新化

$ sudo yum update -y && sudo reboot

いろいろインストール

$ sudo yum install chrony dhcp-server tftp-server httpd -y

Chronyの設定

$ sudo systemctl enable chronyd.service && systemctl start chronyd.service

DHCPサーバの設定

# 既存の設定を退避
$ sudo cp -av /etc/dhcp/dhcpd.conf /etc/dhcp/dhcpd.conf.org

# 設定編集
$ sudo vi /etc/dhcp/dhcpd.conf

# 編集後設定ファイルの文法チェック
$ sudo dhcpd -t

# サービス起動
$ sudo systemctl enable dhcpd.service && sudo systemctl start dhcpd.service

dhcpd.conf

option space pxelinux;
option pxelinux.magic code 208 = string;
option pxelinux.configfile code 209 = text;
option pxelinux.pathprefix code 210 = text;
option pxelinux.reboottime code 211 = unsigned integer 32;
option architecture-type code 93 = unsigned integer 16;

authoritative;
default-lease-time 3600;
max-lease-time 43200;

subnet 192.168.0.0 netmask 255.255.255.0 {

        range 192.168.0.100 192.168.0.199;
        option subnet-mask 255.255.255.0;
        option routers 192.168.0.254;
        option broadcast-address 192.168.0.255;
        option domain-name-servers 8.8.8.8,8.8.4.4;

        class "pxeclients" {
                match if substring (option vendor-class-identifier, 0, 9) = "PXEClient";
                next-server 192.168.0.253;
                if option architecture-type = 00:07 {
                        filename "uefi/BOOTX64.efi";
                } else {
                        filename "pxelinux/pxelinux.0";
                }
        }
}

ISOのマウント

ISOの中身をいろいろと利用するのでマウントしておきます。

$ sudo mount -t iso9660 /dev/cdrom /mnt/ -o loop,ro

TFTPサーバの設定

# BIOS ベースのクライアント向けのファイルを取得・配置
$ cp -pr /mnt/BaseOS/Packages/syslinux-tftpboot-6.04-4.el8.noarch.rpm ~
$ rpm2cpio ~/syslinux-tftpboot-6.04-4.el8.noarch.rpm | cpio -dimv
$ sudo mkdir /var/lib/tftpboot/pxelinux
$ sudo mv ~/tftpboot/* /var/lib/tftpboot/pxelinux/

# UEFI ベースのクライアント向けのファイルを取得・配置
$ cp -pr /mnt/BaseOS/Packages/shim-x64-15-11.x86_64.rpm ~
$ cp -pr /mnt/BaseOS/Packages/grub2-efi-x64-2.02-78.el8.x86_64.rpm ~
$ rpm2cpio shim-x64-15-11.x86_64.rpm | cpio -dimv
$ rpm2cpio grub2-efi-x64-2.02-78.el8.x86_64.rpm | cpio -dimv
$ sudo mkdir /var/lib/tftpboot/uefi
$ sudo mv ~/boot/efi/EFI/BOOT/BOOTX64.EFI /var/lib/tftpboot/uefi/
$ sudo mv ~/boot/efi/EFI/redhat/grubx64.efi /var/lib/tftpboot/uefi/
$ sudo vi /var/lib/tftpboot/uefi/grub.cfg

# ブート用のファイルをtftpの公開ディレクトリに配置
$ sudo mkdir -p /var/lib/tftpboot/pxelinux/images/RHEL-8.1/
$ sudo cp /mnt/images/pxeboot/{vmlinuz,initrd.img} /var/lib/tftpboot/pxelinux/images/RHEL-8.1/

# 設定ファイルをtftpの公開ディレクトリに配置
$ sudo mkdir /var/lib/tftpboot/pxelinux/pxelinux.cfg
$ sudo vi /var/lib/tftpboot/pxelinux/pxelinux.cfg/default

# サービス起動
$ sudo systemctl enable tftp.socket && sudo systemctl start tftp.socket

pxelinux.cfg/default

default vesamenu.c32
prompt 0
timeout 300

display boot.msg

label linux
  menu label ^Install Red Hat Enterprise Linux 8.1
  menu default
  kernel images/RHEL-8.1/vmlinuz
  append initrd=images/RHEL-8.1/initrd.img ip=dhcp inst.ks=http://192.168.0.253/RHEL-8.1/ks.cfg

label rescue
  menu label ^Rescue installed system
  kernel images/RHEL-8.1/vmlinuz
  append initrd=images/RHEL-8.1/initrd.img rescue

label local
  menu label Boot from ^local drive
  localboot 0xffff

grub.cfg

set timeout=60
menuentry 'RHEL 8' {
  linuxefi images/RHEL-8.1/vmlinuz ip=dhcp inst.ks=http://192.168.0.253/RHEL-8.1/ks.cfg
  initrdefi images/RHEL-8.1/initrd.img
}

httpサーバの設定

# ISOの中身をhttpサーバで公開
$ sudo mkdir /var/www/html/RHEL-8.1/
$ sudo cp -r /mnt/* /var/www/html/RHEL-8.1/

# RHEL8からISOの構成が変わったので、
# ↓をしないとブートできませんでした(´・ω・`)
$ sudo mv /var/www/html/RHEL-8.1/images /var/www/html/RHEL-8.1/BaseOS/

# KickStartの設定配置
$ vi /var/www/html/RHEL-8.1/ks.cfg

# サービス開始
$ sudo systemctl enable httpd.service && sudo systemctl start httpd.service

ISOのマウント解除

$ sudo umount /mnt

Firewallの設定

まとめて開放します。

$ sudo firewall-cmd --add-service={dhcp,tftp,http} --permanent 
$ sudo firewall-cmd --reload

参考ページ