MENU

PXEサーバを構築してLinuxをインストール

ネットワーク経由で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
パラメータ設定内容
portDNSサーバの使用するポート番号。
今回は使わないので「0(無効化)」を設定。
interfaceDHCPサーバで使用するNWインターフェース。
今回はホストオンリーアダプター(ens192)を指定。
デフォルトでは「lo」になっているのでens192に書き換える。
no-dhcp-interfaceDHCPサーバ、TFTPサーバが使用しないNWインターフェース。
今回は仮想マシンにデフォルトで付いているブリッジ用(ens160)を指定。
dhcp-rangeDHCPサーバがクライアントに割り当てるIPアドレスレンジ。
今回は192.168.100.50~192.168.100.99を指定。
IPアドレスのリリース時間は12時間(12h)とする。
dhcp-bootクライアントがPXEブートするためのカーネルファイル名。
今回はデフォルト名であるpxelinux.0を指定。
(なおpxelinux.0のパスは、後述の「tftp-root」で指定したディレクトリ配下に「pxelinux.0」があるとクライアントに通知される)
enable-tftpTFTPサーバ有効化。
デフォルトではコメントアウトされているので、コメントインする。
tftp-rootTFTPのルートディレクトリ。
今回は/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;
パラメータ設定内容
rootHTTP公開するドキュメントルートのディレクトリ。
デフォルトでは「/usr/share/nginx/html」だが、今回は「/var/www/html」に変更。
autoindexHTTP公開しているディレクトリ、ファイル一覧を表示。今回は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をインストールする。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

目次