ネットワーク経由でOSをインストールできるPXEサーバをたてておくと、OSをインストールするたびに毎回インストールDVDやisoファイルをインストール対象マシンにアタッチしなくてよいので便利だったりする。
特にOSインストール対象数が多い場合には効果を発揮するので、構築手順をこの記事で整理しておく。
環境
物理サーバが手元にないので、VMware Player上に仮想マシンをたててPXEサーバを構築する。環境イメージ図は下記のとおり。
PXEサーバ環境
- VMware Workstation 16 Player(Windows11で稼働)
- AlmaLinux9
- dnsmasq(DHCPサーバ・TFTPサーバ)
- nginx(HTTPサーバ)
なお、今回は作業を簡素化するため、SELinuxは無効化、firewalldは停止しておく。
クライアント環境
- VMware Workstation 16 Player(Windows11で稼働)
- AlmaLinux9(今回導入するOS)
PXEサーバ構築の前提作業
PXEサーバ(AlmaLinux9)をVM Player上に仮想マシンとして作成する。仮想マシンのネットワークインターフェースには、予めホストオンリーアダプターを追加しておく。
なお、AlmaLinux9のインストーラで選択する「ソフトウェアの選択」では「最小限のインストール(minimal install)」でインストールする。(今回PXEサーバにインストールするソフトウェアはdnsmasqとnginxくらいなので)
AlmaLinux9のインストールが完了したら、サーバにログインし以下3点の設定をしておく。
OS最新化
必須ではないが一応やっておく。
[root@pxesrv10 ~]# dnf -y update
SELinux無効化
デフォルトではSELinuxが有効化されていることを確認
[root@pxesrv10 ~]# getenforce
Enforcing
以下コマンドでSELinuxを無効化し、OSをリブートし設定を反映
[root@pxesrv10 ~]# grubby --update-kernel ALL --args selinux=0
[root@pxesrv10 ~]# reboot
再起動後、SELinuxが無効になっていることを確認
[root@pxesrv10 ~]# getenforce
Disabled
firewalld停止
本来ならばクライアントからの通信を通す
設定を入れるべきだけど、とりあえずPXEサーバを構築することだけに主眼をおくため、今回はPXEサーバの挙動確認時のみ停止しておく。(disableはせずstopのみ)
[root@pxesrv10 ~]# systemctl stop firewalld
※firewalldは今回stopしただけなので、OS再起動した場合はfirewalldは起動状態となる。そのため、都度上記コマンドを実行する。
dnsmasq設定(DHCP・TFTP設定)
dnsmasq設定
PXEサーバに必要なDHCPサーバ、TFTPサーバはそれぞれ対応するパッケージをインストールすることも可能だが、今回はそれぞれの機能を内包したdnsmasqを使用する。
dnsmasqのインストール
[root@pxesrv10 ~]# dnf install dnsmasq
[root@pxesrv10 ~]# vi /etc/dnsmasq.conf
以下箇所を設定
port=0
interface=ens192
no-dhcp-interface=ens160
dhcp-range=192.168.100.50,192.168.100.99,12h
dhcp-boot=pxelinux.0
enable-tftp
tftp-root=/tftpboot/pxelinux
パラメータ | 設定内容 |
---|---|
port | DNSサーバの使用するポート番号。 今回は使わないので「0(無効化)」を設定。 |
interface | DHCPサーバで使用するNWインターフェース。 今回はホストオンリーアダプター(ens192)を指定。 デフォルトでは「lo」になっているのでens192に書き換える。 |
no-dhcp-interface | DHCPサーバ、TFTPサーバが使用しないNWインターフェース。 今回は仮想マシンにデフォルトで付いているブリッジ用(ens160)を指定。 |
dhcp-range | DHCPサーバがクライアントに割り当てるIPアドレスレンジ。 今回は192.168.100.50~192.168.100.99を指定。 IPアドレスのリリース時間は12時間(12h)とする。 |
dhcp-boot | クライアントがPXEブートするためのカーネルファイル名。 今回はデフォルト名であるpxelinux.0を指定。 (なおpxelinux.0のパスは、後述の「tftp-root」で指定したディレクトリ配下に「pxelinux.0」があるとクライアントに通知される) |
enable-tftp | TFTPサーバ有効化。 デフォルトではコメントアウトされているので、コメントインする。 |
tftp-root | TFTPのルートディレクトリ。 今回は/tftpboot/pxelinuxを指定。 ※上述のpxelinux.0は/tftpboot/pxelinux/pxelinux.0に配置されているとみなされる。 |
TFTPサーバが使用するファイルの設置
次にdnsmasq.confで設定したTFTPサーバ関連で使用する実際のファイルを設置していく。
具体的には、pxlinux.0をはじめとしたPXEブート用Linuxカーネルや、構成ファイル、ブートイメージ関連を配置していく。
AlmaLinux9インストールイメージをマウント
[root@pxesrv10 ~]# mount -o loop,ro /dev/cdrom /mnt
syslinux-tftpbootパッケージをローカルにコピー
[root@pxesrv10 ~]# cp -pr /mnt/AppStream/Packages/syslinux-tftpboot-6.04-0.20.el9.noarch.rpm ./
[root@pxesrv10 ~]# ls
anaconda-ks.cfg syslinux-tftpboot-6.04-0.20.el9.noarch.rpm
[root@pxesrv10 ~]# umount /mnt
syslinux-tftpbootパッケージ中身を展開
[root@pxesrv10 ~]# rpm2cpio syslinux-tftpboot-6.04-0.20.el9.noarch.rpm | cpio -dimv
./tftpboot
./tftpboot/cat.c32
./tftpboot/chain.c32
(途中省略)
./tftpboot/whichsys.c32
./tftpboot/zzjson.c32
2196 ブロック
[root@pxesrv10 ~]# ls
anaconda-ks.cfg syslinux-tftpboot-6.04-0.20.el9.noarch.rpm tftpboot
上記のtftpboot配下のモジュール群を、/tftpboot/pxelinux配下にコピー
[root@pxesrv10 ~]# mkdir -p /tftpboot/pxelinux
[root@pxesrv10 ~]# cp -p tftpboot/* /tftpboot/pxelinux/
PXEブート構成ファイル(今回はdefaultファイル)を作成
[root@pxesrv10 ~]# mkdir -p /tftpboot/pxelinux/pxelinux.cfg
[root@pxesrv10 ~]# touch /tftpboot/pxelinux/pxelinux.cfg/default
PXEブート時に画面に表示されるメニュー(構成ファイル(default))の中身は以下のようにする。なお、ファイル内の「192.168.100.240」は、PXEサーバのホストオンリーアダプター(ens192)に設定したIPアドレスである。
[root@pxesrv10 ~]# vi /tftpboot/pxelinux/pxelinux.cfg/default
default vesamenu.c32
prompt 1
timeout 600
display boot.msg
label linux
menu label ^Install system
menu default
kernel images/alma9/vmlinuz
append initrd=images/alma9/initrd.img ip=dhcp inst.repo=http://192.168.100.240/alma9/iso/
label vesa
menu label Install system with ^basic video driver
kernel images/alma9/vmlinuz
append initrd=images/alma9/initrd.img ip=dhcp inst.xdriver=vesa nomodeset inst.repo=http://192.168.100.240/alma9/iso/
label rescue
menu label ^Rescue installed system
kernel images/alma9/vmlinuz
append initrd=images/alma9/initrd.img inst.rescue
inst.repo=http:///192.168.100.240/alma9/iso/
label local
menu label Boot from ^local drive
localboot 0xffff
最後にPXEブートイメージファイル(vmlinuzとinitrd.img)を配置する。
vmlinuzとinitrd.imgの配置ディレクトリを作成
[root@pxesrv10 ~]# mkdir -p /tftpboot/pxelinux/images/alma9
AlmaLinux9インストールイメージをマウント
[root@pxesrv10 ~]# mount -o loop,ro /dev/cdrom /mnt
vmlinuzとinitrd.imgを上で作成したディレクトリにコピー
[root@pxesrv10 ~]# cp /mnt/images/pxeboot/{vmlinuz,initrd.img} /tftpboot/pxelinux/images/alma9/
[root@pxesrv10 ~]# umount /mnt
nginx設定(HTTP設定)
インストールイメージを公開するHTTPサーバにはnginxを使用する。
nginxのインストール
[root@pxesrv10 ~]# dnf install nginx
[root@pxesrv10 ~]# vi /etc/nginx/nginx.conf
以下箇所を設定
root /var/www/html;
autoindex on;
パラメータ | 設定内容 |
---|---|
root | HTTP公開するドキュメントルートのディレクトリ。 デフォルトでは「/usr/share/nginx/html」だが、今回は「/var/www/html」に変更。 |
autoindex | HTTP公開しているディレクトリ、ファイル一覧を表示。今回はonに設定。 「autoindex on」にすることでブラウザアクセス(http://192.168.100.240)したときに、配置しているディレクトリ、ファイルが表示される。 |
次にHTTP公開ディレクトリ(/var/www/html)に配置するインストールイメージ置き場を作成する。
AlmaLinux9インストールイメージ配置ディレクトリ作成
[root@pxesrv10 ~]# mkdir -p /var/www/html/alma9/iso
AlmaLinux9インストールイメージをマウント
[root@pxesrv10 ~]# mount -o loop,ro /dev/cdrom /mnt
なお、/var/www/html/alma9/iso配下には、インストールメディアの中身をコピーしてもよいのだが、容量が大きいため今回は以下のようにマウントする。
[root@pxesrv10 ~]# mount -o loop,ro /dev/cdrom /var/www/html/alma9/iso
PXEサーバで必要なサービスを起動
以上でPXEサーバの基本的な設定は完了したため、dnsmasqとnginxサービスを起動・有効化しておく。
dnsmasqサービスの有効化・起動
[root@pxesrv10 ~]# systemctl enable dnsmasq
[root@pxesrv10 ~]# systemctl start dnsmasq
nginxサービスの有効化・起動
[root@pxesrv10 ~]# systemctl enable nginx
[root@pxesrv10 ~]# systemctl start nginx
なお、クライアントがブートしてからDHCPサーバからIPアドレスを付与されたり、TFTP関連のファイルを読み込む挙動を確認するため、/var/log/messagesをtailしておく。
[root@pxesrv10 ~]# tail -f /var/log/messages
クライアントNWブート設定(BIOS設定)
これでPXEサーバ側の準備は整ったので、実際にクライアントマシンをネットワークブートしてAlmaLinux9をインストールできるか確認してみる。
DHCPで払い出されるIPアドレスを付与するネットワークインターフェースからブートする必要があるので、クライアントマシン起動直後のBIOS画面でブートシーケンスを設定する。BIOS画面に入るためには仮想マシン起動後に以下画面時で「F2」を押下する。
BIOS画面に入れたら「Boot」タブから以下のようにネットワークブートさせたいネットワークインターフェースを一番上に移動させて「F10」キーで設定を保存する。
なお、今回はクライアントマシンのホストオンリーアダプターに、PXEサーバ(DHCP)から払い出されるIPアドレスを付与するため「VMXNET3 #2」をブートシーケンスの一番上に設定する。
PXEブート動作確認
クライアントマシンのネットワークブートが成功すると、以下のようにPXEサーバ(DHCP)からIPアドレスが付与される。(下記例だと192.168.100.80)
上記画面が表示されるまでの間、PXEサーバ側の/var/log/messagesを見ると、ホストオンリーアダプター(ens192)でMACアドレス「00:0C:29:E4:73:54」(クライアントマシンのホストオンリーアダプター)からDHCPリクエストを受信し、このMACアドレスに対してDHCPで払い出したIPアドレス「192.168.100.80」を通知していることが分かる。
そのあと、「192.168.100.80」のIPアドレスにPXEブート用のLinuxカーネル(pxelinux.0)を送付していることが分かる。
なお、この後pxelinux.cfg配下のファイルがnot foundである旨のメッセージが出続けているが、今回はPXEブート構成ファイルとして「default」ファイルを用意しているので無視して進める。
Feb 15 08:35:52 pxesrv10 dnsmasq-dhcp[1433]: DHCPDISCOVER(ens192) 00:0c:29:e4:73:54
Feb 15 08:35:52 pxesrv10 dnsmasq-dhcp[1433]: DHCPOFFER(ens192) 192.168.100.80 00:0c:29:e4:73:54
Feb 15 08:35:52 pxesrv10 dnsmasq-dhcp[1433]: DHCPDISCOVER(ens192) 00:0c:29:e4:73:54
Feb 15 08:35:52 pxesrv10 dnsmasq-dhcp[1433]: DHCPOFFER(ens192) 192.168.100.80 00:0c:29:e4:73:54
Feb 15 08:35:54 pxesrv10 dnsmasq-dhcp[1433]: DHCPREQUEST(ens192) 192.168.100.80 00:0c:29:e4:73:54
Feb 15 08:35:54 pxesrv10 dnsmasq-dhcp[1433]: DHCPACK(ens192) 192.168.100.80 00:0c:29:e4:73:54
Feb 15 08:35:54 pxesrv10 dnsmasq-tftp[1433]: error 0 TFTP Aborted received from 192.168.100.80
Feb 15 08:35:54 pxesrv10 dnsmasq-tftp[1433]: sent /tftpboot/pxelinux/pxelinux.0 to 192.168.100.80
Feb 15 08:35:54 pxesrv10 dnsmasq-tftp[1433]: sent /tftpboot/pxelinux/pxelinux.0 to 192.168.100.80
Feb 15 08:35:55 pxesrv10 dnsmasq-tftp[1433]: sent /tftpboot/pxelinux/ldlinux.c32 to 192.168.100.80
Feb 15 08:35:55 pxesrv10 dnsmasq-tftp[1433]: file /tftpboot/pxelinux/pxelinux.cfg/564d1124-bac2-d498-e961-c342f4e4734a not found
Feb 15 08:35:55 pxesrv10 dnsmasq-tftp[1433]: file /tftpboot/pxelinux/pxelinux.cfg/01-00-0c-29-e4-73-54 not found
Feb 15 08:35:55 pxesrv10 dnsmasq-tftp[1433]: file /tftpboot/pxelinux/pxelinux.cfg/C0A86450 not found
Feb 15 08:35:55 pxesrv10 dnsmasq-tftp[1433]: file /tftpboot/pxelinux/pxelinux.cfg/C0A8645 not found
Feb 15 08:35:55 pxesrv10 dnsmasq-tftp[1433]: file /tftpboot/pxelinux/pxelinux.cfg/C0A864 not found
Feb 15 08:35:55 pxesrv10 dnsmasq-tftp[1433]: file /tftpboot/pxelinux/pxelinux.cfg/C0A86 not found
Feb 15 08:35:55 pxesrv10 dnsmasq-tftp[1433]: file /tftpboot/pxelinux/pxelinux.cfg/C0A8 not found
Feb 15 08:35:55 pxesrv10 dnsmasq-tftp[1433]: file /tftpboot/pxelinux/pxelinux.cfg/C0A not found
Feb 15 08:35:55 pxesrv10 dnsmasq-tftp[1433]: file /tftpboot/pxelinux/pxelinux.cfg/C0 not found
Feb 15 08:35:55 pxesrv10 dnsmasq-tftp[1433]: file /tftpboot/pxelinux/pxelinux.cfg/C not found
Feb 15 08:35:55 pxesrv10 dnsmasq-tftp[1433]: sent /tftpboot/pxelinux/pxelinux.cfg/default to 192.168.100.80
Feb 15 08:35:55 pxesrv10 dnsmasq-tftp[1433]: file /tftpboot/pxelinux/boot.msg not found
以下画面は/tftpboot/pxelinux/pxelinux.cfg/defaultを読み込んだところのインストール画面。
クライアントマシンが上記画面まできたとき、PXEサーバ側の/var/log/messagesは以下メッセージが出力される。
Feb 15 08:36:55 pxesrv10 dnsmasq-tftp[1433]: sent /tftpboot/pxelinux/vesamenu.c32 to 192.168.100.80
Feb 15 08:36:55 pxesrv10 dnsmasq-tftp[1433]: sent /tftpboot/pxelinux/libcom32.c32 to 192.168.100.80
Feb 15 08:36:55 pxesrv10 dnsmasq-tftp[1433]: sent /tftpboot/pxelinux/libutil.c32 to 192.168.100.80
Feb 15 08:36:55 pxesrv10 dnsmasq-tftp[1433]: sent /tftpboot/pxelinux/pxelinux.cfg/default to 192.168.100.80
クライアントマシン側で「Install system」を押下するとPXEブートイメージ「vmlinuz, initrd.img」が読み込まれる。
クライアントマシンが上記画面まできたとき、PXEサーバ側の/var/log/messagesは以下メッセージが出力される。
Feb 15 08:37:54 pxesrv10 dnsmasq-tftp[1433]: sent /tftpboot/pxelinux/images/alma9/vmlinuz to 192.168.100.80
Feb 15 08:38:05 pxesrv10 dnsmasq-tftp[1433]: sent /tftpboot/pxelinux/images/alma9/initrd.img to 192.168.100.80
しばらく待つとクライアントマシン側でAlmaLinux9のインストーラ画面が表示されるので、あとはいつもどおりLinuxをインストールする。