Introduction
以前から試してみたかった PXE ブートを試してみる。
これができれば、いちいち iso ファイルや CD/DVD メディアを仮想マシンにアタッチしたりする必要がなくなって便利になる。
How to do?
ググると出てくるのは、 dnsmasq を使っての PXE サーバ構築で、よくある事例は dnsmasq で DHCP と TFTP サーバを全て担当してもらう例が多い。
だが、自分のネットワーク環境では既に DHCP サーバ (Buffalo のルータ) が存在しており、dnsmasq に DHCP を担当させるのは影響が大きすぎる。
また、 dnsmasq を使うとしても、 iso ファイルなどは別に用意してあるファイルサーバを使うことで、dnsmasq をインストールしたサーバは極力軽量にしておきたい。
ということで、こんな我儘な要望を実現するために参考にしたのは下記の記事
これを参考にした上で肝となるのは下記の点。
- dnsmasq の Proxy DHCP 機能を使い、既存の DHCP に IP のリリースを委譲
- TFTP も外部のサーバを使うよう設定
01. 環境の確認
ネットワーク環境は下記。
- サブネット: 192.168.11.0/24
- PXE サーバ (Alpine Linux 3.20.2): 192.168.11.109
- TFTP サーバ (既存のファイルサーバ): 192.168.11.17
- DHCP サーバ (既存の Buffalo ルータ): 192.168.11.1
02. dnsmasq のインストール
PXE サーバにインストール。
1 | apk add dnsmasq |
設定ファイルを作成。
1 | cat <<EOF > /etc/dnsmasq.conf |
dnsmasq を自動起動するように設定し、再起動。
1 | mkdir /var/log/dnsmasq |
03. ブート設定ファイルの作成
今回は先のブログの記事を参考にして、OS ではなく memtest86+ を起動するようにする。
参考記事では古いバージョン (そもそも記事自体が 8 年前!!) なので、最新の memtest86+ を使うようにした。
1 | default memtest86 |
このようなテキストファイルを TFTP サーバの公開ディレクトリから見て pxelinux/pxelinux.cfg/default
として保存する。
04. memtest86+ の展開
memtest86+ v7.00 をダウンロード。
展開後、memtest64.bin
を TFTP サーバの公開ディレクトリから見て pxelinux/memtest/v7.00/memtest64
として保存する。
注意するのは、必ず拡張子の .bin は削除して保存すること。
そうしないと正しくブートしない。
05. TFTP の疎通試験
TFTP は WinSCP ではサポートされていないため、手軽に確認したいなら Windows の追加機能で実現できる。
インストール後、下記のように指定する。
1 | $ tftp -i 192.168.11.17 GET pxelinux/pxelinux.cfg/default |
06. linux のブートイメージを準備
linux ならどのディストリビューションでもいい (と思う) ので、 syslinux パッケージをインストールし、ブートイメージを取り出す。
1 | apk add syslinux |
インストール後、 /usr/share/syslinux
配下の
- ldlinux.c32
- pxelinux.0
を TFTP サーバの公開ディレクトリから見て pxelinux
の配下に保存する。
現時点で、公開ディレクトリは下記のようになっている筈。
1 | (公開ディレクトリ) |
これで準備完了。
07. PXE ブートしてみる
今回は VMware ESXi 上の仮想マシンで確認してみた。
設定で UEFI ではなく BIOS で起動するように設定しておくこと。
PXE ブートが始まると、PXE サーバ側に要求が飛んできて、ブートに必要な情報が流れてくるのがわかる。
1 | # tail -f /var/log/dnsmasq/dnsmasq.log |
ここで PXE の要求が飛んでくると…
1 | Aug 24 07:36:42 dnsmasq-dhcp[3692]: 717457579 available DHCP subnet: 192.168.11.1/255.255.255.0 |
確かに、既存の DHCP サーバとやり取りして IP をリースしたり、ブートファイルの情報を送っているのがわかる。
実際、正しく memtest86+ が起動した。