PXE用DHCPサーバの設定

単にDHCPLinux上でインストールするのはそれ程、手間のかかることではない。PXEを使えるようにするにはちょっと設定が必要になるのと、なにより今回は、通常使うDHCPPXE用のDHCPの2つのサーバを立てる必要があることだった。

持ち運びの出来るノートPCは一般的にはDHCPでアドレスを割当てる。現在はブロードバンド・ルータをDHCPサーバとしている。ブロードバンド・ルータは家庭内の冷蔵庫と同じで、一旦電源を入れるとほぼ24時間365日動作となりDHCPサーバとしてはうってつけである。しかし、ブロードバンド・ルータのDHCPサーバではきめ細かい設定ができない。例えば、ディスクレスのブート時に必要となるPXEサーバのアドレスを設定することが出来ない。(PXEサーバの指定(正確にはnext-serverの指定)さえできればブロードバンド・ルータのDHCPでもいいのだが。) 仕方ないので、PXEサーバとなるマシンにDHCPサーバをやらせるのが一般的だが、こちらのPCは色々とテストにつかったり、HDDのバックアップのために数時間止めることも考えられる。その間、DHCPクライアントが使えなくなってしまう場合もある。
そこで、通常使うDHCPサーバの他に、PXE用にもう1台DHCPサーバを立てる必要が出てきた。

同一LAN上で複数のDHCPを併用する

PXEの利用記事をみると、どれも「今使っているDHCPサーバはOFFにしてPXE用にDHCPサーバを設定する」と書いてある。私も以前はその通りにした。CD-ROMドライブの無いマシンに一時的にPXEを設定してインストールに使う、といった場合はこれでもOKである。しかし、上のような理由で今回は「今使っている」HDCPサーバをOFFにすることはやりたくない。

ブロードバンドルータなどの現行DHCPPXEDHCPが併用できないのは「DHCPクライアントを取り合って、どちらのDHCPサーバからサービスを受けるか分からないから」というのが一般的な理由だ。しかし、サービスを受けるDHCPを設定(もしくは固定)できるのであれば2台(もしくは複数台)のDHCPサーバを混在できる筈だ。サービスの運用で使うのであれば1台のDHCPに集中させるのは良い方法ではないし、当然、複数台に分散しているだろう。1つのブロードキャスト・セグメントにDHCPが1台しか設置できないのは不都合だ。(繰返しになるが、ブロードバンド・ルータのDHCPサーバでPXEサーバ(next-server)の指定が出来れば、何も2台も設定する必要はないのだが。)

ということで、dhcpd.confを見ていくと、かなり詳しい設定ができることが分かった。ある条件で特定のマシンだけをグループ化して、そのマシンだけにサービスすることが可能だ。今回の環境の場合、ブロードバンド・ルータのDHCPサーバは反応が遅く、PXE用のDHCPサーバはCore2 Duo 3GHz搭載なので反応が早い(意味は無いがClockによる単純計算では200倍は速い)。まず、PXEDHCPがパケットを見て自分が処理するクライアントからのものでなければ無視すれば、その内ブロードバンド・ルータのDHCPサーバが反応してくれる。(あくまで確率上の話しなので、本来PXEDHCPサーバが処理しなければならないクライアントを先にブロードバンド・ルータのDHCPサーバが捕捉してしまうこともあるが、実質的にあまりあり得ないし。)

/etc/dhcpd.conf

最終的に作成した /etc/dhcpd.conf は以下のとおり。

ddns-update-style	none;
ignore		client-updates;

subnet 192.168.1.0 netmask 255.255.255.0 {
	option routers		gateway12;
	option subnet-mask		255.255.255.0;

	option nis-domain		"localdomain";
	option domain-name		"localdomain";
	option domain-name-servers	gateway12, gateway01;

	option time-offset		32400;  # Japan Standard Time
	option ntp-servers		ntp.nict.jp, ntp.jst.mfeed.ad.jp;

	deny	unknown-clients; # デフォルトで allow
}

host bishop {
	hardware ethernet	00:67:89:AB:CD:EF;
	fixed-address		bishop;
##	option vendor-class-identifier  "PXEClient"; # この行は要らない。あるとNG
	next-server		192.168.1.10; # ホスト名ではNG
	filename		"/bishop/pxelinux.0";
##	allow			booting; # デフォルトで allow
	default-lease-time	1296000; # 2 weeks
	max-lease-time		2592000; # 4 weeks
}

「bishop」というのはPXEを使ってブートさせるクライアントのホスト名である。/etc/hostsでIPアドレスを定義してある。同様に「gateway12」はデフォルト・ゲートウェイのホスト名である。ネットなどでdhcpd.confの例を見ると直接IPアドレスを書き込んでいるケースが多いが、IPアドレスを変更する際に/etc/hostsと/etc/dhcpd.confの両方を変更しなければならないので設定ミスの元となりかねない。

このdhcpd.confでは2つセクションを定義している。1つは現在使っているサブネット(192.168.1.0/24)の情報である。デフォルトゲートウェイDNSサーバ、ドメイン名、NTPサーバ名などを定義している。DHCPサーバは「この」サブネットからの要求があると、これらの情報を渡すことになる。ここで注目なのは

	deny	unknown-clients; # デフォルトで allow

の部分。これは素性の知れない(ネット的にはMACアドレスとかが既知でない)マシンからのサービスには受け付けない、という設定である。今回のPXEクライアントは全てMACアドレスを予め登録することを前提とするので、それ以外のマシンからの要求には応えないようにする。従って、一般的なdhcpd.confの記述される次のような

	range dynamic-bootp	192.168.1.128 192.168.1.254;

「range」は必要ない。

もう一つのセクションは「bishop」というマシンについての処理を記述した部分である。最初、このセクションは、上のサブネットのセクションのサブセクションとして定義していた。(「bishop」は192.168.1.0/24に属しているので。)しかし、dhcpdコマンドでdhcpd.confの設定確認をすると

# dhcpd -t -d
WARNING: Host declarations are global.  They are not limited to the scope you declared them in.

と怒られてしまう。Host宣言は「global」扱いでサブネットセクションに置くな、と言うことらしい。素直にホスト・セクションをサブネット・セクションから外側に出してglobalとした。これで警告メッセージは出なくなった。

ここの部分は「bishop」に関するMACアドレスIPアドレスなどを定義している。注意点は2点。
ネット調べると「option vendor-class-identifier "PXEClient"」の記述は”必ず必要”とあったが、この行があると動作しなかった。これが分かるまで随分時間を喰ってしまった。この記述があるとDHCPでアドレスは割り振られるが、PXEでのブートファイルを見つけ出せなくなる。本来記述が要らないのか、現行のdhcpdのバグなのかは分からない。

もう一点は、「next-server」の指定ではホスト名ではなく直接IPアドレスを記述しなければならない。