課題:大量セットアップ時の「USB挿し直し」という悪夢
開発チーム用に導入された15台の新品PCのキッティングや、ペネトレーションテスト実施後にラボ内30台の端末を一斉初期化(再イメージング)する場面を想像してみてください。従来のシステム管理者ならどう対応するでしょうか。Ventoyを入れたUSBメモリを数本用意し、各デスクを回っては挿してパーティションを選び、展開が終わるのをただ待つ……という作業を繰り返すはずです。
しかし、このやり方は極めて非効率です。2本のUSBメモリで15台をセットアップするだけでも、平気で午前中いっぱい(3〜4時間)が潰れてしまいます。さらに、USBメモリの接触不良やフラッシュメモリの故障、部署間で古いISOイメージを誤って適用してしまうリスクも付きまといます。もし上司から「昼までに50台準備しろ」と指示されれば、手動作業では確実に破綻するでしょう。よりスマートな解決策は、既存のギガビットネットワークを活用してOSインストーラーを自動ブート・配布することです。
基本概念:PXEブート、dnsmasq、iPXEの仕組み
動作の仕組みはいたってシンプルです。クライアントPCの電源を入れると、ネットワークカード(NIC)がLAN内へブロードキャストを送信し、「IPアドレスとブート手順を教えてくれるサーバーはいますか?」と問い合わせます。
- PXE (Preboot Execution Environment): NICのROMチップやUEFI/BIOSに組み込まれたブートローダー読み込み規格。DHCPサーバーからIPを取得後、初期ブートローダーファイルをRAM上に展開して起動します。
- dnsmasq: Linuxにおける定番のオールインワン軽量サーバーツール。従来のISC-DHCP Serverとtftpd-hpaを組み合わせた重厚な構成と異なり、DNS、DHCP Proxy、TFTPの全機能をメモリ消費量わずか15MB未満の単一プロセスで提供します。
- iPXE: 従来のPXEを拡張・代替するオープンソースのブートファームウェア。標準PXEはブロックサイズが小さくUDPを使うTFTPに依存するため、転送速度が1〜2 MB/s程度に制限されがちです。一方、iPXEはHTTP/HTTPS経由でカーネルやrootfsを取得できるため、1Gbpsのネットワーク帯域上限(〜110 MB/s)をフル活用した高速ロードが可能になり、柔軟なグラフィカルメニューやスクリプト制御も実現します。
実践:FedoraでPXEブートサーバーを構築する
Fedoraは最新のカーネルとアップストリームに追従したパッケージが揃っており、検証用サーバー環境に最適です。オフィスで稼働しているFedoraワークステーションを1台流用するだけで、社内全体向けのブートサーバーとして即座に機能させることができます。
ステップ1: dnsmasqとNginxのインストール
まずはdnsmasq本体と、ISOファイルを高速なHTTP経由で配信するためのNginxをインストールします。
sudo dnf install -y dnsmasq nginx syslinux-tftpboot ipxe-bootimgs
ステップ2: TFTPブートファームウェアの準備
dnsmasqは指定されたTFTPルートディレクトリから、初期バイナリファイルをクライアントへ配信します。ディレクトリを作成し、ハードウェア規格に合わせてLegacy BIOS用とUEFI 64-bit用のiPXEブートファイルを配置します。
sudo mkdir -p /var/lib/tftpboot
sudo cp /usr/share/ipxe/undionly.kpxe /var/lib/tftpboot/ # レガシーBIOS搭載マシン用
sudo cp /usr/share/ipxe/ipxe-x86_64.efi /var/lib/tftpboot/ # 64ビットUEFI搭載マシン用
ステップ3: ProxyDHCPモードでのdnsmasq設定
一般的なオフィス環境では、MikroTikやYAMAHAなどのルーターがすでにDHCPを稼働させています。そこに別のDHCPサーバーを追加すると、即座にIPの競合が発生します。dnsmasqのProxyDHCP機能は、この問題を完全に回避できます。IPアドレスの払い出し権限は既存ルーターに残したまま、dnsmasqはクライアントからのDHCP Discoverパケットを検知した際にブート用オプション(PXEオプション)のみを追加提供します。
設定ファイル /etc/dnsmasq.d/pxeboot.conf を作成します:
sudo nano /etc/dnsmasq.d/pxeboot.conf
Fedoraマシンのネットワークインターフェース名を enp3s0、固定IPアドレスを 192.168.1.100 と仮定した場合、以下のように記述します:
# 内部ネットワークインターフェースでリッスン
interface=enp3s0
bind-interfaces
# 内部サブネット上でProxy DHCPモードとして動作(IPレンジの払い出しは行わない)
dhcp-range=192.168.1.0,proxy,255.255.255.0
# 内蔵TFTPサーバーを有効化
enable-tftp
tftp-root=/var/lib/tftpboot
# クライアントのアーキテクチャを判定: BIOS (0) または UEFI (7, 9)
dhcp-match=set:bios,option:client-arch,0
dhcp-match=set:efi-x86_64,option:client-arch,7
dhcp-match=set:efi-x86_64,option:client-arch,9
# アーキテクチャに応じたiPXEローダーをTFTP経由で配信
dhcp-boot=tag:bios,undionly.kpxe
dhcp-boot=tag:efi-x86_64,ipxe-x86_64.efi
# iPXEロード後、制御をHTTPメニューへ引き渡し
dhcp-userclass=set:ipxe,iPXE
dhcp-boot=tag:ipxe,http://192.168.1.100/boot.ipxe
ステップ4: iPXEスクリプトによるブートメニューの作成
iPXEがRAM上にロードされると、Nginxから boot.ipxe をフェッチして視覚的なメニューを表示します。Webルートディレクトリにこのファイルを作成します:
sudo nano /usr/share/nginx/html/boot.ipxe
メニュー設定のサンプルは以下の通りです:
#!ipxe
set menu-timeout 15000
set menu-default fedora-live
:start
menu Network Boot System (PXE Lab Fedora)
item --gap -- ---------------- OS INSTALLERS ----------------
item fedora-live Fedora Workstation 39 (Live) のインストール
item local ローカルストレージから起動
item shell iPXE コマンドシェルの起動
choose --timeout ${menu-timeout} --default ${menu-default} target && goto ${target}
:local
echo Booting from local drive...
exit
:shell
shell
:fedora-live
echo HTTP経由でLinuxカーネルとInitrdをダウンロード中 (1Gbps)...
kernel http://192.168.1.100/os/fedora/vmlinuz ip=dhcp root=live:http://192.168.1.100/os/fedora/squashfs.img ro rd.live.image quiet
initrd http://192.168.1.100/os/fedora/initrd.img
boot
続いて、FedoraのISOファイルをマウントし、vmlinuz、initrd.img、squashfs.img を /usr/share/nginx/html/os/fedora/ 配下にコピーします。通常の1Gbpsスイッチ環境であれば、HTTP経由での転送はわずか15〜20秒程度で完了します。
ステップ5: ファイアウォールの設定とサービスの起動
Fedoraはデフォルトで firewalld が厳格に動作しています。DHCP (67/udp)、TFTP (69/udp)、HTTP (80/tcp) の各ポートを開放する必要があります。
sudo firewall-cmd --permanent --add-service={dhcp,dns,tftp,http}
sudo firewall-cmd --reload
sudo systemctl enable --now dnsmasq
sudo systemctl enable --now nginx
各サービスの状態を確認します:
systemctl status dnsmasq nginx --no-pager
それでは動作確認を行いましょう。クライアントPCにLANケーブルを接続して電源を入れ、ブートメニュー呼び出しキー(Dell/LenovoならF12、MSI/HPならF11など)を押します。一覧から Network Boot / UEFI PXE を選択すると、瞬時にブートメニューが立ち上がります。
まとめ
Fedora環境上でdnsmasqとiPXEを組み合わせることで、極めて軽量でありながら圧倒的なロード速度を誇るブートサーバーを構築できます。ProxyDHCP方式を採用しているため、既存のネットワーク構成を崩さず安全に運用できる上、必要に応じてWindows PEやUbuntu Serverなどのインストールイメージをいつでも柔軟に追加・拡張できます。

