Proxy DHCPを使ってネットワークブートサーバーを構築する

pxe-pdhcpはProxy DHCPサーバーの実装です。Proxy DHCPはPreboot Execution Environment (PXE)というネットワークブートの標準規格を使ってディスクレスコンピュータをネットワークブートする際に使います。ディスクレスコンピュータは簡単に増やしたり交換したりできるので、シンクライアントやHPCクラスタ、ロードバランサの裏に置く実サーバーなどを簡単に用意することができるようになります。


Proxy DHCPサーバーは別のホスト上で動いているDHCPサーバーと連携して動作します。DHCPサーバーはIPアドレスを割り振り、Proxy DHCPサーバーは Network Bootstrap Program (NBP。ブートローダーのようなものです) の位置をネットワークブートクライアントに通知します。クライアントはNBPを取得するのにTFTPを使うので、NBPの位置はTFTPサーバーのIPアドレスとファイル名ということになります。


Proxy DHCPを使う利点は、DHCPサーバーとネットワークブートサーバーを切り離すことができる点にあります。これはDHCPサーバーを再設定することなく既存のネットワークにネットワークブート機能を追加できるということです。



ここではネットワークブートサーバーを設定するための具体的な手順を紹介します。

pxe-pdhcpの使い方

usage: pxe-pdhcp  [-d] [-i interface]
                  [-l listen address] [-t tftp address] [-b broadcast address]
                  <nbp name>

-i interfaceオプションにはリクエストを待ち受けるネットワークインターフェイス名を指定します(Linuxでは'eth0'など)。ただし複数のIPアドレスが割り当てられているネットワークインターフェイスを指定することはできません。その場合は代わりに-i listen addressオプションと-b broadcast addressオプションを指定してください。

-t tftp addressオプションにはTFTPサーバーのIPアドレスを指定します。このオプションを省略すると、pxe-pdhcpを実行するホストのIPアドレスが使われます。

引数の最後にはTFTPサーバー上にあるNBPのファイル名を指定してください。たとえばNBPにPXELINUXを使っている場合は、"pxelinux.0"などのようになるはずです。


pxe-pdhcpはwell-knownポートをリッスンするので、root権限が必要なことに注意してください。また、pxe-pdhcpとDHCPサーバーを同じホスト上で同時に走らせることはできません。DHCPサーバーはpxe-pdhcpとは別のホストで実行してください。

ネットワークブートサーバーの設定

以下の手順は、コンピュータがフラットなL2ネットワーク(ルーターが介在しないネットワーク)に接続していることを想定しています。また、一台のコンピュータがDHCPサーバーを実行するように既に設定されている必要があります。


まずpxe-pdhcpをダウンロードし、コンパイルします。pxe-pdhcpはCodeReposからsvnでダウンロードすることができます。

$ svn co http://svn.coderepos.org/share/lang/c/pxe-pdhcp
$ cd pxe-pdhcp
$ make


続いてTFTPサーバーをダウンロードし、コンパイルします。TFTPサーバーはディストリビューションからパッケージが用意されていることが多いですが、結局は自分でコンパイルした方が楽だということに気付くでしょう :-p

$ wget http://www.kernel.org/pub/software/network/tftp/tftp-hpa-0.48.tar.bz2
$ tar jxvf tftp-hpa-0.48.tar.bz2
$ cd tftp-hpa-0.48
$ ./configure --without-tcpwrappers
$ make
$ cp tftpd/tftpd ../
$ cd ..


PXELINUXをダウンロードし、コンパイルします。PXELINUXはNetwork Bootstrap Program (NBP) です。

$ wget http://www.kernel.org/pub/linux/utils/boot/syslinux/syslinux-3.70.tar.bz2
$ tar jxvf syslinux-3.70.tar.bz2
$ cd syslinx-3.70
$ make pxelinux.0
$ cp pxelinux.0 ../
$ cd ..


TFTPサーバーで公開するためのディレクトリを作り、その中に先ほどコンパイルしたPXELINUXと設定ファイル、そしてLinuxカーネルをコピーします。Linuxカーネルは現在使っているカーネルを/bootからコピーしてきて使うことにします。

$ mkdir tftpboot
$ cp /boot/vmlinuz-`uname -r` tftpboot/vmlinuz
$ cp /boot/initrd-`uname -r`.img tftpboot/initrd.img
$ cp pxelinux.0 tftpbot/
$ mkdir tftpboot/pxelinux.cfg
$ vi tftpboot/pxelinux.cfg/default


PXELINUXの設定ファイルは以下のようになります。

$ cat tftpboot/pxelinux.cfg/default
default mypxe
prompt 0

label mypxe
kernel vmlinuz
append initrd=initrd.img


最後にTFTPサーバーとProxy DHCPサーバーを起動してください。

$ sudo ./tftpd -l -s ./tftpboot
$ sudo ./pxe-pdhcp -i eth0 pxelinux.0


これでネットワークブートの準備が整いました。ネットワークで接続された他のコンピュータのBIOSの設定で起動順の設定をHDDからネットワークブート(PXE)に変更し、起動してください。すると、まずpxelinux.0ファイルがロードされ、続いてlinuxカーネル(vmlinuz)がロードされて起動します。しかし正常にLinuxカーネルが起動しても、すぐに「カーネルパニック」になって止まってしまうはずです。これはルートファイルシステムが存在しないためです。

これでは使い物になりませんが、ここでは確かにLinuxカーネルが起動したということが重要です。ルートファイルシステムをどうやって提供するかは、また今度紹介します。