PXEを使ってPCもディスクレスにしよう |
YAMAMORI Takenori ●yamamori |
PXEのブートプログラムが発するDHCPに応答するためのサーバプログラムとして dhcpdを用意しましょう. dhcpdには,ISC(Internet Software Consortium)版(http://www.isc.org/) を用います.
ここではISC版 dhcp-2.0 系を使うことにします. ISC版dhcp-3.0系を使う場合は dhcpd.conf の書き方が少々異なるため, 別途マニュアルなどを参照して下さい. なお,PXE のブートコードのバージョンによっては dhcp-2.0 との間で問題が発生することがあります. もしPXEでうまくブートできない場合は コラム「dhcp-2.0系のソースの修正」を参照して下さい.
dhcp-2.0xは,「./configure; make」方式でソースからインストールできます. (ただし,configureスクリプトはGNU autoconfではありません) GNU makeなら, make DEBUG='-O2' のようにして,コンパイラの最適化オプションを与えてもよいでしょう.
ここで,dhcpのバージョンや環境によっては, BPF(Berkeley Packet Filter)関係でエラーが出てmakeが通らないことが あるかも知れません. その場合,ソースツリーのincludes/site.hの中の「#define USE_SOCKETS」 を有効にして,BPFを使わず socket() を使うように変更するという方法があります.
dhcpをmakeすると,dhcpd以外にもいくつかのコマンドが作成されますが, 必要なコマンドは,serverディレクトリの下に作られるdhcpdのみです. 最低限,dhcpdだけをインストールしても構いません.
dhcpdがインストールできたら,PXE用のdhcpd.confを記述します. /etc/dhcpd.confの記述例を下のリストに示します. ここでは,クライアントのIPアドレスは, NICのMAC(イーサネットアドレス)を判断して固定的に割り当て, DHCPというよりBOOTP風の動作をさせています.
ここで,"PXEClient"や01:04:00:00:00:00という記述が重要で, これはNIC上のPXEのブートプログラムに対して, 適切なPXE対応のDHCPサーバであると認識させるために必要です. (ただし,PXEのブートコードによっては,この記述がなくてもブートできる場合があります)
option-135 "-i"はBpBatchに対するオプションで, これによりBpBatchが対話モードで動作します. BpBatchの設定が完了したら, "-i"の代わりにBpBatchのコマンドが記述されたスクリプトのファイル名を指定して, 自動的にネットワークブートを行なうこともできます. (その場合は、スクリプトのファイル名の拡張子を .bpb とし、.bpb を覗いたファイル名を option-135 で指定します)
option root-pathのところには, ブートするディスクレスクライアント用のNFS rootの位置を記述します.
server-identifier server; ← DHCPに応答するインターフェイスに付けられたホスト名 server-name "server"; ← クライアントに通知されるサーバ名 " "で囲む option domain-name "localdomain"; ← DNSドメイン名 " "で囲む option domain-name-servers server; ← DNSサーバのIPアドレスに対応するホスト名 option routers server; ← ルータのIPアドレスに対応するホスト名 subnet 192.168.1.0 netmask 255.255.255.0 { ← subnetの定義が一応必要 } host client { ← クライアントのホスト名 hardware ethernet 00:d0:b7:XX:XX:XX; ← クライアントのNICのMACアドレス fixed-address client; ← クライアントのIPアドレスに対応するホスト名 option dhcp-class-identifier "PXEClient"; ← PXEのため必要 option vendor-encapsulated-options 01:04:00:00:00:00; ← PXEのため必要 filename "bpbatch"; ← ブートファイルのファイル名 " "で囲む option option-135 "-i"; ← bpbatchに与えるオプション " "で囲む option root-path "/diskless/linux"; ← NFS rootを指定 " "で囲む(あとで使用) } |
server-identifier server; ← DHCPに応答するインターフェイスに付けられたホスト名 server-name "server"; ← クライアントに通知されるサーバ名 " "で囲む option domain-name "localdomain"; ← DNSドメイン名 " "で囲む option domain-name-servers server; ← DNSサーバのIPアドレスに対応するホスト名 option routers server; ← ルータのIPアドレスに対応するホスト名 subnet 192.168.1.0 netmask 255.255.255.0 { ← subnetの定義が一応必要 } host freebsd { ← クライアントのホスト名 hardware ethernet 00:d0:b7:XX:XX:XX; ← クライアントのNICのMACアドレス fixed-address freebsd; ← クライアントのIPアドレスに対応するホスト名 option dhcp-class-identifier "PXEClient"; ← PXEのため必要 option vendor-encapsulated-options 01:04:00:00:00:00; ← PXEのため必要 filename "pxeboot"; ← ブートファイルのファイル名 " "で囲む option root-path "/diskless/freebsd"; ← NFS rootを指定 " "で囲む } |
なお,初めてdhcpdを起動する際には, あらかじめサイズゼロのdhcpd.leasesファイルを touchコマンドなどで作成しておく必要があります. dhcpd.leasesの場所はOSやdhcpのバージョンによって異なりますが, とりあえずdhcpdを起動してみればその場所がエラーメッセージで表示されるため, それにしたがえばよいでしょう.
あとdhcpdは,dhcpd.confファイルの更新後, “kill -HUP”でシグナルを送っても再読み込みさせることはできず, いったんdhcpdをkillしてから起動しなおす必要があります. そこで,dhcpd.confの設定およびディスクレスでのブートテストを行なう際には, “dhcpd -d”とデバッグオプションを付けて起動し, デバッグメッセージを表示させるとともに dhcpdをフォアグラウンドで実行させた方がやりやすいでしょう.