犬でも分かるPXEブート(3):DHCPサーバの構築

PXEブートを実現するために必要な構成要素のひとつが DHCPサーバ です。ここでは、DHCPサーバのインストール方法と、PXEブートに必要な設定を分かりやすく説明します。
PXEブートのフローの図でいうと、以下の赤線の範囲が対象です。

DHCPサーバの処理

PXEブートにおけるDHCPサーバの役割

一般的なDHCPサーバの役割は、
・DHCPクライアントとなるサーバにIPアドレスを割り当てること
なのですが、PXEブートを実現するために、更に重要な役割があります。それは、
・PXEブートで必要となるTFTPサーバのIPアドレスを示すこと
・PXEブートで使用するブートローダのパスを示すこと
です。

DHCPサーバのインストール

RedHatやRocky Linuxでは、以下のコマンドでDHCPサーバをインストールすることができます。

# dnf -y install dhcp-server

DHCPサーバの設定

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";
}

順番に説明をしていきます。

subnet 192.168.2.0 netmask 255.255.255.0

DHCPサーバが管理するサブネットのアドレスとネットマスクを定義して下さい。この定義はブロックになっていますが、このサブネットに対する定義はこのブロックの中に格納します。私の環境では、192.168.2.0/24のサブネットでDHCPを運用しています。

option routers 192.168.2.200;

192.168.2.0/24のサブネットにおけるデフォルトデートウェイのIPアドレスを定義しています。この定義は必須ではありません。逆に、192.168.2.00のIPアドレスを持つサーバがルータとしてきちんと機能していないと、NICがTFTサーバにアクセスするときに悪さをすることがあるので、PXEブートしたいサーバとDHCPサーバが同一のセグメントに存在する場合は、この定義はないほうが良いです。

range 192.168.2.220 192.168.2.254;

DHCPサーバが動的に割り当てるIPアドレスの範囲(開始アドレスと終了アドレス)を定義しています。固定のIPアドレスで運用する範囲を避けて定義して下さい。

class "pxeclients"

PXEブートのクライアント(PXEブートの対象となるサーバ)に対する定義は、このブロックの中に記述します。

next-server 192.168.2.203;

next-server にはブートローダをダウンロードするTFTPサーバのIPアドレスを定義します。私の環境では、192.168.2.203のサーバでTFTPを運用しています。

if option architecture-type = 00:07 {
# x86_64 EFI
filename "BOOTX64.EFI";

}

PXEクライアントのアーキテクチャタイプを判別するブロックです。アーキテクチャタイプ 00:07 は、PXEブート対象となるサーバのアーキテクチャタイプが x86_64 であることを意味しています。
そして、filename "BOOTX64.EFI" は、x86_64に対応したブートローダのファイル(パス)が BOOTX64.EFI であることを示しています。ここで定義したパスは、TFTPサーバのtopディストリからの相対パスです。例えば、TFTPサーバのtopディストリが、/var/lib/tftpboot/ であるならば、/var/lib/tftpboot/BOOTX64.EFI にブートローダを配備しましょう。

else {
# aarch64 EFI
filename "BOOTAA64.EFI";

}

PXEブート対象となるサーバのアーキテクチャタイプが aarch64 の場合には、ブートローダのファイルに BOOTAA64.EFI を指定したかったのですが、アーキテクチャタイプの数値(16進数)が分からなかったので、00:07以外の場合は aarch64 とみなすことにしました。うーん、誰か教えてくだちゃい。
そもそもPXEブート対象となるサーバがx86_64しかないのであれば、このelseブロックは不要です。更に言えば、if option architecture-type = 00:07 のifブロックも不要で、filename "BOOTX64.EFI"; だけを定義すれば良いです。

include "/etc/dhcp/dhcp.server";

このinclude文も必須ではありません。実は、DHCPの動的なIPアドレス割り当てで、サーバのIPアドレスが動的に変わるのが嫌だったので、サーバのMacアドレス(すなわちPXE対応デバイスのNICのMacアドレス)に対応するIPアドレスを、/etc/dhcp/dhcp.server の中で以下のように定義しています。

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

この例では、PXEブートしたいサーバ base1 のMacアドレス(PXE対応NICのMacアドレス) 00:e0:4c:38:6c:39 と付与したいIPアドレス 192.168.2.210 を定義しています。host ブロックに付ける名前には base1 を記載していますが、分かりやすい名前を付ければOKです。
include文は外部ファイルを組み込みという命令なので、上記の記述を直接 /etc/dhcp/dhcpd.conf に記載しても構いません。

DHCPサーバの起動

DHCPサーバの設定が完了したら、DHCPサーバを以下の通り起動します。

# systemctl start dhcpd

システム起動時にDHCPサーバを自動起動するために、自動起動の設定もしておきましょう。

# systemctl enable dhcpd

以後、/etc/dhcp/dhcpd.conf 及び /etc/dhcp/dhcp.server を修正した場合は、以下のようにしてDHCPサーバを再起動しましょう。

# systemctl restart dhcpd

Macアドレスの確認方法

BIOS画面で確認する

PXE対応NICのMacアドレスは、BIOS画面を見れば大抵の場合は書いてあります。以下はミニPC GMKtec NucBox3 の例です。

PXE対応NICのMacアドレスの確認

また、BIOS画面でIpv4 PXE Support が Enabled になっていることも確認しましょう。これが Disabled になっているとPXEブートできません。

高価なサーバの場合は複数のNICを持っているものが多く、PXEブートするNICの優先順位を定義するBIOSメニューもあるので、そこも確認しておきましょう。

/var/log/messages で確認する

DHCPDのログは /var/log/messages に出力されます。PXEブートの対象サーバの電源をONしたときに、PXE対応NICのMacアドレスに対して、IPアドレスを割り当てたことがリアルタイムにログに出力されますので、ここでMacアドレスを確認することもできます。

逆に、IPアドレスの割り当てが行われなかったり、意図しないMacアドレスが表示されている場合は、設定ファイルを再確認して下さい。

意図しないIPアドレスが割りあたっている場合は、もしかすると、DHCPのキャッシュに情報が残っているせいかもしれません。
例えば、/var/lib/dhcpd/dhcpd.leases ファイルの中で、以下のようなキャッシュデータの記録があると、Macアドレス 00:e0:4c:38:6c:39 に対するIPアドレスは 192.168.2.13 が割り当てられるようになります。その場合は、dhcpd.leasesファイルから対象となる行を削除して、dhcpdの再起動を行って下さい。

lease 192.168.2.13 {
starts 3 2024/01/24 06:55:52;
ends 3 2024/01/24 18:55:52;
tstp 3 2024/01/24 18:55:52;
cltt 3 2024/01/24 09:04:13;
binding state free;
hardware ethernet 00:e0:4c:38:6c:39;
uid "\000\000@\030\351\203y\354\021\200\000tV<X i";
set vendor-class-identifier = "PXEClient:Arch:00007:UNDI:003016";
}

広告主へのリンク




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

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

犬でも分かるKVM シリーズ

コメント

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