読者です 読者をやめる 読者になる 読者になる

なんかかきたい

プログラミングなどの個人的なメモやサークル「ゆきいろパラソル」の情報を載せてます

PXEBOOT/BOOTP/DHCPあたりのことをまとめておく

この辺りはよく使ってる技術なんだけど一回作ってしまうと細かなことは忘れてしまうし、 AWSのようなクラウドサービスを使っていると触れる機会も減ってしまうので、 覚えているうちにまとめておこうと思う。

PXEBOOT

ネットワークカードに搭載されているPXE(Preboot eXecution Environment)機能を使ってプログラムを起動する方法。

起動するプログラムはDHCPサーバとTFTPなどのサーバを組み合わせて配布する。

ネットワークカードにPXEBOOTのための機能が搭載されているものがあれば、BIOSのBOOTをネットワークブートに設定すれば使える。

DHCPはBOOTPの上位互換プロトコルなので、BOOTP的な設定はDHCPサーバの設定に書くこともできる。

DHCP設定にTFTPサーバがどのアドレスかなどの情報を書いておき、クライアントに配布できるが、特に指定がない場合DHCPサーバとTFTPサーバは同じアドレスとみなされる。

TFTP、DHCPサーバともに軽量なサーバなことが多く、同じ物理サーバに設置することもある。

DHCP

PXE対応ネットワークカードは起動時にDHCPマルチキャストパケットを投げる。

ネットワーク上にDHCPサーバがあれば、パケットに応答しPXEの情報をクライアントに返す。

複数のDHCPサーバが応答する場合、どれが応答するかわからなくなるため同一ネットワークに複数のDHCPサーバと立てないようにしたい。

TFTP

UDPでやりとりするファイル転送用のプロトコルFTPより単純で認証などない。PXEで実行するイメージを転送する際に使うことができる。

暗号化も特にされていないので ngrep などでパケットを眺めればどういうやり取りがされているか簡単にわかる。

MACアドレスDHCPで割り当てされたIPアドレスの一部を使って設定ファイルをダウンロードしようとする。これはPXEの仕様。

例えば、 192.168.0.200DHCPで割り当てた場合、それぞれのアドレスを16進数に変換した、 C0A800C8 というファイルをリクエストする。

ファイルが見つからなかった場合、1文字短くした C0A800、 次には2文字短くした C0A8 といったファイルを順にリクエストしてくる。

この仕組みがあるので、サブネットごとに違うアドレスレンジをDHCPサーバが返すことでネットワークごとに違う設定ファイルをクライアントに渡すことができる。

設定ファイルの実体は pxelinux.cfg と同じ書式のもので、シンボリックリンクで名前だけ用意するのが簡単。

TFTPサーバはセキュリティの都合上、chroot化で実行されることがままあるため、シンボリックリンクを張る際には / からの絶対パスではなく相対パスで作成しておくのが無難。

DebianPXEサーバとDHCPサーバとTFTPサーバを作る例

TFTPサーバは tftpd-hpaDHCPサーバは isc-dhcp-server をそれぞれ使う。

apt install tftpd-hpa isc-dhcp-server

TFTPサーバの設定

TFTPサーバの設定は /etc/default/tftp-hpa だが、対して設定項目もないのでそのまま使ってもよい。

その場合、 /srv/tftp がTFTPサーバのルートとなり、chrootされた状態でサーバが起動される。

TFTP自体の設定は対してないが、いくつか重要なファイルがある。

/srv/tftp/pxelinux.0

pxelinuxのブートイメージ。後述のDHCPサーバの指定で細かな指定がない場合 filename "pxelinux.0" はこのパスになる。

/srv/tftp/pxelinux.cfg/

MACアドレスIPアドレスで設定ファイルを探しに来る場所。該当するMACアドレスIPアドレスのものがない場合は default のファイルが読みだされる。

いずれのファイルも見つからない場合、ネットワークブートは失敗に終わる。

DHCPサーバの設定

DHCPサーバの設定は、 /etc/dhcp/dhcpd.conf でこちらはネットワークに合わせて少し設定が必要になる。

この辺りは単にDHCPの設定になるし、DHCPは家庭LANでもよく使われているので改めて説明の必要もないかもしれない。

allow bootpallow booting あと、 nameserver の設定、PXEのイメージを配るときの名前 filename あたりの設定と、ネットワークのサブネット周りをちゃんと見ておく。

DebianWikiにも設定例があるけど、細かいところはネットワークによって違うので何とも言い難い。

サーバの再起動

設定ができたら、DHCPとTFTPを再起動しておく。最近はsystemdでやる。

動作確認

多分これだけで動く。適当に動作確認して問題なければこのまま使えばいいと思う。終わり。