PXEには3種類ある

昨日の件で、PXE 2.1の仕様をしっかり読んで確認してみました。以下、試していないので実際のNICで動くかどうかは分かりませんが、内容を書いておきます。(読み違えで間違いがある可能性は大 ^_^;)


まず、ほとんどのWebサイトで説明されているPXEは、普通のDHCPのやりとりの中でDHCPOFFERにPXEの拡張オプションを埋め込む方法で、4011/udpを使わない方法。ISC DHCPサーバーの設定(dhcpd.conf)でfilenameに"/pxelinux.0"を指定して…というのはこれです。
ところが、これとは別にProxyDHCPなるものを使う方法があります。ProxyDHCPによるPXEは普通のDHCPのやりとりではありません(だけどプロトコルフォーマットはDHCPと同じ)。ProxyDHCPによるPXEも2種類ある。一つは同じホストでProxyDHCPサーバーとDHCPサーバーを動かす方法。もう一つはProxyDHCPサーバーとDHCPサーバーを別のホストで動かす方法。どちらも4011/udpを使う。(67/udpも使う)


というわけで、PXEには3種類ある。

  1. 普通のDHCPのやりとりだけど、DHCPOFFERにPXEの拡張オプションが入っている(DHCPサーバーの設定の変更が必要)
  2. DHCPサーバーを動かしているホストでProxyDHCPサーバーを動かす(少しだけDHCPサーバーの設定の変更が必要)
  3. DHCPサーバーとは別のホストでProxyDHCPサーバーを動かす(DHCPサーバーの設定の変更が不要)

最初の方法は、単にDHCPOFFERにPXEの拡張オプションを埋め込む方法。どうやら「option 60に"PXEClient"を入れる必要はない」ようです。むしろ入れてはいけない?(仕様書15ページ〜16ページ)。(でも27ページでは入っている…これはProxyDHCPの方?)
PXE_BOOT_MENUなどを指定する必要がなければ、拡張オプションの代わりにnext serverにtftpサーバーのIPアドレス、filenameに"/pxelinux.0"などと入れるだけでも良い…のかもしれません(仕様書27ページ)。RFC2132を読んでみる必要もありそうです。ただし仕様はさておき、実際には動きます。



2番目のDHCPサーバーと同じホストでProxyDHCPサーバーを動かす方法では、DHCPOFFERの中でoption 60に"PXEClient"と入れるように、DHCPサーバーの設定を変更しておく必要がある(仕様書19ページ)。しかしPXEの拡張オプションを入れる必要はない。
option 60に"PXEClient"と入ったDHCPOFFERでIPアドレスを割り振られたクライアントは、通常通り67/udpにDHCPREQUESTを返すとともに、4011/udpにもDHCPREQUESTを投げてくる。サーバーは4011/udpでDHCPREQUESTを待ち受けて、PXEの拡張を含んだ「DHCPOFFER」を返す。このDHCPOFFERに対するDHCPREQUESTはもう返ってこない。



3番目のDHCPサーバーと別のホストでProxyDHCPサーバーを動かす方法では、DHCPサーバーの設定を変更する必要がない。
別のホストの67/udpでDHCPDISCOVERを待ち受け、「クライアントのIPアドレスを0.0.0.0にしたDHCPOFFERを返す」(それからoption 60に"PXEClient"と入れておく)(仕様書20ページ)。そうすると、クライアントはこのホスト(next serverのアドレス?Server Identifierのアドレス?)の4011/udpにDHCPREQUESTを投げてくる。サーバーでは4011/udpでDHCPREQUESTを待ち受けて、PXEの拡張を含んだ「DHCPACK」を返す。



クライアントが発行するDHCPDISCOVERやDHCPREQUESTにはすべてoption 60に"PXEClient"が入っているので、これを見て条件分岐することが可能。(PXEClientだけに0.0.0.0のDHCPOFFERを返すなど)


現状では既にDHCPサーバーが存在するネットワークの方が多く、DHCPサーバーの設定を変更することなくPXEを利用できる3番目の方法が一番使いやすいと思うのですが、3番目の方法を実装したサーバーは、商用のもの(詳細不明。Ardence、Windows Server RIS?)かPXE daemonくらいしか見あたりません(昔はRedHatの実装があったようですが行方不明。Intelの実装もあるようですが詳細不明)。
しかも後者の実装は67/udpと4011/udpのどちらか片方しか待ち受けてくれないので、同じバイナリを67/udp用と4011/udp用で2つ起動する必要がある気がします(違う?試してない…)



それから、3comのNICが搭載しているPXEは、バージョン2.1ではなく2.0かもしれません(古い製品?)3comの製品情報
PXE 2.0の仕様書を探したのですが、どうも見つかりません。


※追記:ProxyDHCPサーバーを実装しました:Proxy DHCPを使ってネットワークブートサーバーを構築する