犬でも分かるPXEブート(7):実際にやってみた

前回までの掲載で、PXEブートの基本から kickstart(キックスタート) の仕組みまでの解説が終えました。これで、PXEブートを利用したOSインストールの準備が整いました。あとは、実際にやってみましょう。

設定のおさらい

構築環境

私のおうちでは2台のミニPCがあります。1台をVM(仮想マシン)用のホストマシンとして運用し、1台をPXEブート等のテストに使っています。今回のPXEブートのテスト環境は以下の通りです。

MINISFORUM GK41
・VM用のホストマシン兼NFSサーバ: 192.168.2.200 (ホスト名:base0)
・DHCPサーバ,TFTPサーバ,HTTPサーバ: 192.168.2.203 (ホスト名:rocky1, 仮想マシン)

GMKtec NucBox3
・PXEブートしてOSをインストールするサーバ: 192.168.2.210

DHCPサーバの設定

/etc/dhcp/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;


subnet 192.168.2.0 netmask 255.255.255.0 {
option routers 192.168.2.200;
range 192.168.2.220 192.168.2.254;


class "pxeclients" {
match if substring (option vendor-class-identifier, 0, 9) = "PXEClient";
next-server 192.168.2.203;
if option architecture-type = 00:07 {
# x86_64 EFI
filename "BOOTX64.EFI";
} else {
# aarch64 EFI
filename "BOOTAA64.EFI";
}
}
include "/etc/dhcp/dhcp.server";
}

/etc/dhcp/dhcp.server の定義

host base1 {
hardware ethernet 00:e0:4c:38:6c:39;
fixed-address 192.168.2.210;
}

PXEブート対象のサーバにはDHCPでIPアドレスを割り当てますが、設定ではあえて、予め決めておいたIPアドレスを割り当てることにしています。
上記2つのファイルを修正したら、DHCPサーバを再起動して下さい。

TFTPサーバの設定

/var/lib/tftpboot/grub.cfg の定義

set timeout=10
default=0
menuentry 'RHEL 8.8 x86_64 (kickstart)' {
linuxefi /pxeboot/rhel-8.8-x86_64/vmlinuz ip=dhcp vga=normal inst.graphical inst.resolution=1024x768 inst.repo=http://192.168.2.203/repositories/rhel-8.8-x86_64/ inst.ks=http://192.168.2.203/repositories/kickstarts/rhel-8.8.cfg
initrdefi /pxeboot/rhel-8.8-x86_64/initrd.img
}

PXEブート対象のサーバのPXE対応NICのMacアドレスが 00:e0:4c:38:6c:39 なので、grub.cfg というファイル名の代わりに、grub.cfg-01-00-e0-4c-38-6c-39 でもOKです。

ブートローダ,grubファイル,カーネル,RAMイメージの配備

これらのファイルはTFTPでPXE対象のサーバにダウンロードされます。
ブートローダはdhcpd.confで定義したパス(/var/lib/tftpbootからの相対パス)に配備して下さい。grubファイルも同じディレクトリに配備します。

・ブートローダ: /var/lib/tftpboot/BOOTX64.EFI
・grubファイル: /var/lib/tftpboot/grubx64.efi

カーネルとRAMイメージは、grub.cfgファイルで定義したパス(/var/lib/tftpbootからの相対パス)に配備して下さい。

・カーネル: /var/lib/tftpboot/pxeboot/rhel-8.8-x86_64/vmlinuz
・RAMイメージ: /var/lib/tftpboot/pxeboot/rhel-8.8-x86_64/initrd.img

リポジトリーの作成

PXEブートの後、OSをインストールするためのリポジトリーをHTTPサーバ上に作成します。リポジトリーのディレクトリは、grub.cfgファイルのinst.repoに指定したURLで確認します。

・レポジトリーのディレクトリのパス: /var/www/html/repositories/rhel-8.8-x86_64/

このディレクトリ配下には、OSのISOイメージの内容をコピーして下さい。OSのISOイメージの内容をこのディレクトリにマウントすることでも構いません。

kickstartファイルの作成

OSインストールを自動化したい場合は、HTTPサーバ上にkickstartファイルを作成します。kickstartファイルのパスは、grub.cfgファイルのinst.ksに指定したURLで確認します。

・kickstartファイルのパス: /var/www/html/repositories/kickstarts/rhel-8.8.cfg

今回使用するkickstartファイルは以下のように作成しました。

# version=RHEL8
# Use graphical install
graphical


repo --name="AppStream" --baseurl=http://192.168.2.203/repositories/rhel-8.8-x86_64/AppStream

%packages
@^minimal-environment
@ Development Tools
kexec-tools
rear
grub2-efi-x64-modules.noarch
nfs-utils
%end


# Keyboard layouts
keyboard --xlayouts='jp'
# System language
lang ja_JP.UTF-8


# Network information
network --hostname=localhost.localdomain
# Use network installation
url --url="http://192.168.2.203/repositories/rhel-8.8-x86_64/"

# Run the Setup Agent on first boot
firstboot --enable

ignoredisk --only-use=sda
# Partition clearing information
zerombr
clearpart --all --initlabel

# Disk partitioning information
part swap --fstype="swap" --ondisk=sda --size=8192
part /boot/efi --fstype="efi" --ondisk=sda --size=600 --fsoptions="umask=0077,shortname=winnt"
part /boot --fstype="xfs" --ondisk=sda --size=1024
part / --fstype="xfs" --ondisk=sda --size=234381


# System timezone
timezone Asia/Tokyo --isUtc --nontp


# Root password
rootpw --iscrypted $6$XGqRFb8D8vohvsve$42w2rgFYZV3zssIS/q.SS9WORwLMyOhAhfCBsTCXSGETafvjFKMgBabT2oWu7NbjG55G05dqFMasSsaP8Ff9A/
user --name=admin --password=$6$khmcNi5e1S5ZFBFZ$JlvFz.rfSY5zFIubNpEuQ7QneN.rEfymzZIR5K7xfUXsErwk7nFWIX78qqhXiGt7qj3t9UNO1Pvho20Tx3ukA0 --iscrypted --gecos="Admin"

%addon com_redhat_kdump --enable --reserve-mb='auto'

%end

%anaconda
pwpolicy root --minlen=6 --minquality=1 --notstrict --nochanges --notempty
pwpolicy user --minlen=6 --minquality=1 --notstrict --nochanges --emptyok
pwpolicy luks --minlen=6 --minquality=1 --notstrict --nochanges --notempty
%end


selinux --disabled
eula --agreed
reboot

%post --log=/tmp/postscript.log
date
# mount NFS file system

mkdir /home/share
mount -t nfs 192.168.2.200:/home/share /home/share
# copy public key

mkdir /root/.ssh
chmod 700 /root/.ssh
cp -p /home/share/root/.ssh/id_rsa.pub /root/.ssh/authorized_keys
chmod 700 /root/.ssh/authorized_keys

# copy network-script
cp -p /home/share/root/base1/ifcfg-enp3s0.static /etc/sysconfig/network-scripts/ifcfg-enp3s0


date
%end

postscriptの中でNFSファイルシステムのマウント処理を記載しているので、NFSサーバ(192.168.2.200)において、/home/shareを192.168.2.0/24のネットワークに対してexportするようにしています。

PXEブート開始

PXEブート対象のミニPCのBIOS設定で、ブートオーダの最上位をPXE対応NICに変更した後で、ミニPCの電源をONします。
すると、PXE対応NICがブート可能なメディアを検索し、それを見つけるとPXEブートを開始します。

DHCPサーバがIPアドレス 192.168.2.210 を割り当てています。

DHCPサーバの /var/log/messages には以下の通り、Macアドレス 00:e0:4c:38:6c:39 に対応したIPアドレス 192.168.2.210 を割り当てしていることが分かります。

May 1 19:46:55 rocky1 dhcpd[189418]: DHCPDISCOVER from 00:e0:4c:38:6c:39 via enp8s0
May 1 19:46:55 rocky1 dhcpd[189418]: DHCPOFFER on 192.168.2.210 to 00:e0:4c:38:6c:39 via enp8s0
May 1 19:46:59 rocky1 dhcpd[189418]: DHCPREQUEST for 192.168.2.210 (192.168.2.203) from 00:e0:4c:38:6c:39 via enp8s0
May 1 19:46:59 rocky1 dhcpd[189418]: DHCPACK on 192.168.2.210 to 00:e0:4c:38:6c:39 via enp8s0

ブートローダとgrubファイルが見つかったことも以下のログから分かります。

May 1 19:46:59 rocky1 in.tftpd[190344]: RRQ from ::ffff:192.168.2.210 filename BOOTX64.EFI
May 1 19:46:59 rocky1 in.tftpd[190344]: Client ::ffff:192.168.2.210 finished BOOTX64.EFI
May 1 19:46:59 rocky1 in.tftpd[190345]: RRQ from ::ffff:192.168.2.210 filename grubx64.efi
May 1 19:47:00 rocky1 in.tftpd[190345]: Client ::ffff:192.168.2.210 finished grubx64.efi

grub.cfg ファイルが見つかったことも以下のログから分かります。

May 1 19:47:00 rocky1 in.tftpd[190360]: RRQ from ::ffff:192.168.2.210 filename /grub.cfg
May 1 19:47:00 rocky1 in.tftpd[190360]: Client ::ffff:192.168.2.210 finished /grub.cfg

grub.cfg ファイルに定義したブートメニューがコンソールに表示されます(timeout=10が指定されているので10秒間表示されます)。

PXEブート対象サーバが、カーネルとRAMイメージを見つけたことも以下のログから分かります。

May 1 19:47:10 rocky1 in.tftpd[190362]: RRQ from ::ffff:192.168.2.210 filename /pxeboot/rhel-8.8-x86_64/vmlinuz
May 1 19:47:12 rocky1 in.tftpd[190362]: Client ::ffff:192.168.2.210 finished /pxeboot/rhel-8.8-x86_64/vmlinuz
May 1 19:47:12 rocky1 in.tftpd[190363]: RRQ from ::ffff:192.168.2.210 filename /pxeboot/rhel-8.8-x86_64/initrd.img
May 1 19:47:27 rocky1 in.tftpd[190363]: Client ::ffff:192.168.2.210 finished /pxeboot/rhel-8.8-x86_64/initrd.img

カーネルモジュールが起動して、その後インストーラが起動します。

kickstartファイルでgraphicalを指定しているので、グラフィカルモードでインストーラが起動します。
kickstartファイルの内容にエラーがあれば、この画面で処理が停止します。エラーメッセージも表示されるので、対応しそうな箇所を修正して再トライしましょう。

kickstartファイルにエラーがなければ、インストールの処理は進みます。

リポジトリーからパッケージがダウンロードされています。

ダウンロード後、ストレージにパッケージがインストールされます。

カーネル・コアが設定されています。

ブートローダをインストールしています。

initramfsが作成されています。

kickstartの最終段階です。postscriptが実行されています。

その後、自動的に再起動されて、ストレージにインストールされたOSからシステムが起動します。

base0から192.168.2.210にログインしてみます。postscriptに記載した内容もエラーなく実行されたようですね。

これなら何台にOSをインストールしても楽チンだね。。

広告主へのリンク




このブログにおける関連リンク

犬でも分かるPXEブート(1):PXEブートとは
犬でも分かるPXEブート(2):起点は電源ON
犬でも分かるPXEブート(3):DHCPサーバの構築
犬でも分かるPXEブート(4):TFTPサーバの構築
犬でも分かるPXEブート(5):HTTPサーバとリポジトリーの構築
犬でも分かるPXEブート(6):kickstartによるOS自動インストール

コメント

タイトルとURLをコピーしました