PXE ブートでは、DHCP が起動ファイルの場所を伝え、TFTP が bootloader や初期設定ファイルを配布します。Ubuntu 22.04 で PXE 検証を行う場合、tftpd-hpa は軽量な TFTP サーバーとして使いやすい選択肢です。
この記事では、Ubuntu 22.04 に tftpd-hpa を導入し、/srv/tftp、/etc/default/tftpd-hpa、UDP 69 番、firewall、TFTP クライアントからの取得確認までを扱います。Ubuntu 22.04 は既存手順の保守対象として扱います。
- PXE 用 TFTP サーバーの役割
tftpd-hpaの導入/srv/tftpと/etc/default/tftpd-hpaの設定- UDP 69 番と firewall の確認
- TFTP クライアントからの取得確認
書籍
ストーリーで覚える Linux CLI 入門
Linux のコマンドライン操作を基礎から確認したい場合の参考書籍です。価格や在庫はリンク先で確認してください。
Amazon で見るこのリンクは Amazon アソシエイトリンクです。
TFTP サーバーの役割
TFTP は認証や暗号化を持たない単純なファイル転送プロトコルです。PXE では、UEFI bootloader、GRUB 設定、kernel、initrd などを取得する入口として使われます。公開範囲は構築用ネットワークに限定します。
| 要素 | 役割 |
| DHCP | next-server と boot file を通知する |
| TFTP | bootloader や設定ファイルを配布する |
| HTTP | Autoinstall の user-data や ISO 関連ファイルを配布する |
| firewall | UDP 69 番と戻り通信を許可する |
パッケージをインストールする
tftpd-hpa を導入します。TFTP クライアント検証も同じホストで行う場合は tftp-hpa も入れておきます。
sudo apt update
sudo DEBIAN_FRONTEND=noninteractive apt-get install -y tftpd-hpa tftp-hpa
systemctl status tftpd-hpa --no-pagerTFTP root を作成する
ここでは TFTP root を /srv/tftp とします。TFTP で配布するファイルはこのディレクトリ配下に置きます。
sudo mkdir -p /srv/tftp
sudo chown tftp:tftp /srv/tftp
sudo chmod 755 /srv/tftp
ls -ld /srv/tftp設定ファイルを作成する
/etc/default/tftpd-hpa で、実行ユーザー、TFTP root、待ち受けアドレス、オプションを指定します。書き込みを許可しない配布専用なら --create は付けません。
sudo tee /etc/default/tftpd-hpa >/dev/null <<'EOF'
TFTP_USERNAME="tftp"
TFTP_DIRECTORY="/srv/tftp"
TFTP_ADDRESS=":69"
TFTP_OPTIONS="--secure"
EOF
sudo systemctl restart tftpd-hpa
systemctl status tftpd-hpa --no-pager待ち受けを確認する
TFTP は UDP 69 番を使います。サービス状態だけでなく、実際に待ち受けているかを確認します。
sudo ss -lunp | grep ':69' || true
systemctl is-enabled tftpd-hpa
journalctl -u tftpd-hpa -n 50 --no-pagerテストファイルを配置する
まず小さなテストファイルを置き、TFTP クライアントから取得できることを確認します。
echo test | sudo tee /srv/tftp/test.txt >/dev/null
sudo chown tftp:tftp /srv/tftp/test.txt
ls -l /srv/tftp/test.txtローカルから取得確認する
同じサーバー上で TFTP クライアントを使い、TFTP root 配下のファイルを取得できるか確認します。
rm -f /tmp/test.txt
tftp 127.0.0.1 -m binary -c get test.txt /tmp/test.txt
cat /tmp/test.txt別ホストから取得確認する
PXE 対象端末と同じネットワーク側から、TFTP サーバーのアドレスを指定して取得確認します。
tftp 192.0.2.10 -m binary -c get test.txt
ls -lh test.txt
rm -f test.txtfirewall を確認する
TFTP は UDP 69 番を使います。firewall を使っている場合は、PXE 用ネットワークからの UDP 69 番を許可します。
sudo ufw status verbose
sudo iptables -S | grep 69 || true
sudo nft list ruleset | grep 69 || truePXE 用ファイルを配置する
PXE で使う bootloader や GRUB 設定を /srv/tftp 配下に配置します。ファイル名は DHCP 側で通知する boot file と合わせます。
sudo mkdir -p /srv/tftp/grub
sudo cp /usr/lib/grub/x86_64-efi-signed/grubnetx64.efi.signed /srv/tftp/grubx64.efi
sudo chown -R tftp:tftp /srv/tftp
find /srv/tftp -maxdepth 2 -type f -lsDHCP 側との対応を見る
TFTP サーバーだけでは PXE は完結しません。DHCP 側の next-server と boot file が、TFTP サーバーのアドレスとファイル名に合っているか確認します。
grep -R "next-server\|filename" /etc/dhcp 2>/dev/null || true
ls -l /srv/tftp/grubx64.efiログを確認する
取得できない場合は、サービスログ、syslog、パケットを分けて確認します。TFTP はエラーが簡素なので、サーバー側とクライアント側の両方を見ます。
journalctl -u tftpd-hpa -n 100 --no-pager
grep -i tftp /var/log/syslog | tail -50 || true
sudo tcpdump -ni any udp port 69書き込みを許可する場合
ネットワーク機器の設定バックアップなどで TFTP upload を受けたい場合だけ、--create を追加します。PXE 配布専用なら読み取り専用のままにします。
sudo tee /etc/default/tftpd-hpa >/dev/null <<'EOF'
TFTP_USERNAME="tftp"
TFTP_DIRECTORY="/srv/tftp"
TFTP_ADDRESS=":69"
TFTP_OPTIONS="--secure --create"
EOF
sudo systemctl restart tftpd-hpa不要になった場合は削除する
検証が終わり、TFTP サーバーを使わない場合は停止して削除します。/srv/tftp を消す前に、必要なファイルがないか確認します。
sudo systemctl disable --now tftpd-hpa
sudo apt purge -y tftpd-hpa
sudo apt autoremove -y
sudo rm -rf /srv/tftpよくある失敗
TFTP は仕組みが単純な分、ファイル名、権限、TFTP root、firewall、DHCP の指定ずれで止まりやすいです。
- DHCP の boot file と実ファイル名が違う
- TFTP root が想定と違う
- ファイル所有者や権限で読めない
- firewall で UDP 69 番または戻り通信が落ちている
- PXE 対象端末から TFTP サーバーへ経路がない
まとめ
Ubuntu 22.04 の tftpd-hpa は、PXE ブート用の TFTP サーバーとして使えます。/srv/tftp、/etc/default/tftpd-hpa、UDP 69 番、firewall、TFTP クライアントからの取得確認を順に見れば、切り分けしやすくなります。
PXE / Autoinstall では、DHCP、TFTP、HTTP の役割を分けて確認することが重要です。TFTP で bootloader を取得できることを確認してから、DHCP の通知内容や Autoinstall の HTTP 配布へ進みます。

