【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
- テストセグメント: 192.168.0.0/24
- デフォルトゲートウェイ:192.168.0.254
- PXEサーバのアドレス:192.168.0.253
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