Ubuntu 26.04 を PXE boot で自動インストールする場合、DHCP、TFTP、HTTP、autoinstall の役割を分けて考える必要があります。PXE は単体の機能ではなく、複数のサービスをつないで初めて成立する起動経路です。
この記事では、UEFI PXE で grubnetx64.efi を起動し、GRUB から Ubuntu installer の kernel / initrd を読み込み、HTTP 経由で ISO と NoCloud seed を渡す構成を整理します。物理サーバーや KVM ホストを再現可能にインストールするための土台です。
- PXE autoinstall で DHCP / TFTP / HTTP / NoCloud seed が担当する役割
grubnetx64.efi、grub.cfg、casper、ISO、user-dataの配置- Ubuntu 26.04 autoinstall の
ds=nocloud-net指定 - ホストごとに hostname、network、storage を分ける考え方
- TFTP と HTTP での確認手順
PXE autoinstall の全体像
PXE autoinstall では、DHCP が boot server と boot file を通知し、TFTP が initial bootloader を渡し、GRUB が installer を起動し、HTTP が ISO と autoinstall seed を配布します。どこか一つだけ見ても全体は分かりません。
| 領域 | 役割 |
|---|---|
| DHCP | client に IP address、next-server、filename を通知する |
| TFTP | grubnetx64.efi、grub/grub.cfg、casper/vmlinuz、casper/initrd を配布する |
| HTTP | Ubuntu ISO と autoinstall 用の NoCloud seed を配布する |
| GRUB | menuentry を表示し、ds=nocloud-net 付きで installer を起動する |
| NoCloud seed | ホストごとの user-data と meta-data を渡す |
ディレクトリを作成する
TFTP root 配下には GRUB と casper を置き、HTTP document root 配下には ISO と autoinstall seed を置きます。TFTP は小さい boot file、HTTP は大きい ISO と設定ファイルを配る役割に分けます。
sudo mkdir -p /srv/tftp/casper
sudo mkdir -p /srv/tftp/grub
sudo mkdir -p /var/www/html/iso
sudo mkdir -p /var/www/html/autoinstall
sudo chown -R root:root /srv/tftp /var/www/html/iso /var/www/html/autoinstall
sudo chmod -R 0755 /srv/tftp /var/www/html/iso /var/www/html/autoinstallUEFI PXE 用の grubnetx64.efi を配置する
UEFI PXE では、DHCP から通知された boot file として grubnetx64.efi を取得させます。Ubuntu の netboot 用 GRUB を TFTP root に配置します。
cd /srv/tftp
sudo curl -fsSL -o grubnetx64.efi https://releases.ubuntu.com/26.04/netboot/amd64/grubx64.efi
sudo chmod 0644 /srv/tftp/grubnetx64.efi
ls -l /srv/tftp/grubnetx64.efiproxy 環境では http_proxy や https_proxy を設定して取得します。check mode のような事前確認では実ファイル取得までは行わず、通常実行後に存在確認します。
GRUB menu を作成する
grub.cfg では、HTTP server の IP address、ISO URL、autoinstall seed URL を指定します。ホストごとに menuentry を分けることで、インストール対象に応じた user-data を選べます。
sudo tee /srv/tftp/grub/grub.cfg >/dev/null <<'EOF'
set timeout=30
loadfont unicode
set menu_color_normal=white/black
set menu_color_highlight=black/light-gray
set web_server=10.1.0.89
set iso_url=http://${web_server}/iso/ubuntu-26.04-live-server-amd64.iso
set autoinstall_url=http://${web_server}/autoinstall
menuentry "PXE boot autoinstall kvm-base-g01-n001-p.core.s01" {
set gfxpayload=keep
linux /casper/vmlinuz ip=dhcp url=${iso_url} autoinstall "ds=nocloud-net;s=${autoinstall_url}/kvm-base-g01-n001-p.core.s01/" ---
initrd /casper/initrd
}
if [ "$grub_platform" = "efi" ]; then
menuentry 'Boot from next volume' {
exit 1
}
menuentry 'UEFI Firmware Settings' {
fwsetup
}
fi
EOFds=nocloud-net;s=... の末尾は、対象ホストごとの seed directory です。ここに user-data と meta-data を置きます。
ISO と casper を配置する
GRUB の linux / initrd は TFTP から読みます。一方で installer 本体は HTTP 経由の ISO URL として渡します。ISO から casper/vmlinuz と casper/initrd を取り出して TFTP 側に置きます。
sudo cp /path/to/ubuntu-26.04-live-server-amd64.iso /var/www/html/iso/ubuntu-26.04-live-server-amd64.iso
sudo mkdir -p /mnt/ubuntu-iso
sudo mount -o loop /var/www/html/iso/ubuntu-26.04-live-server-amd64.iso /mnt/ubuntu-iso
sudo cp /mnt/ubuntu-iso/casper/vmlinuz /srv/tftp/casper/vmlinuz
sudo cp /mnt/ubuntu-iso/casper/initrd /srv/tftp/casper/initrd
sudo umount /mnt/ubuntu-iso
ls -l /srv/tftp/casper /var/www/html/isoISO のファイル名は環境で管理しているものに合わせます。GRUB の iso_url と実際の配置名がずれると、installer 起動後に ISO を取得できません。
NoCloud seed の user-data を作成する
user-data は autoinstall の本体です。hostname、初期ユーザー、SSH、network、storage、late-commands などを定義します。storage は破壊的なので、対象ディスクと wipe の指定を誤らないことが重要です。
sudo mkdir -p /var/www/html/autoinstall/kvm-base-g01-n001-p.core.s01
sudo tee /var/www/html/autoinstall/kvm-base-g01-n001-p.core.s01/user-data >/dev/null <<'EOF'
#cloud-config
autoinstall:
version: 1
locale: "en_US.UTF-8"
source:
id: ubuntu-server
search_drivers: false
kernel:
package: linux-generic
proxy: "http://proxy.example.internal:8080"
identity:
hostname: "kvm-base-g01-n001-p.core.s01.example.internal"
username: "myadmin"
realname: "myadmin"
password: "$6$replace-with-hashed-password"
ssh:
install-server: true
allow-pw: true
authorized-keys:
- "ssh-ed25519 AAAA..."
keyboard:
layout: "jp"
shutdown: "poweroff"
network:
version: 2
ethernets:
enp2s0:
dhcp4: true
dhcp-identifier: mac
storage:
config:
- {type: disk, id: disk0, path: /dev/sda, ptable: gpt, wipe: superblock-recursive}
- {type: partition, device: disk0, size: 1G, flag: boot, grub_device: true, id: part-boot_efi}
- {type: format, volume: part-boot_efi, fstype: fat32, id: fmt-boot_efi}
- {type: mount, device: fmt-boot_efi, path: /boot/efi, id: mnt-boot_efi}
- {type: partition, device: disk0, size: -1, id: part-root}
- {type: format, volume: part-root, fstype: xfs, id: fmt-root}
- {type: mount, device: fmt-root, path: /, id: mnt-root}
late-commands:
- mkdir -p /target/etc/sudoers.d
- printf '%s
' 'myadmin ALL=(ALL:ALL) NOPASSWD: ALL' > /target/etc/sudoers.d/admin
- chown root:root /target/etc/sudoers.d/admin
- chmod 0440 /target/etc/sudoers.d/admin
EOF実運用では、password hash や SSH public key は secret として管理します。記事の例は構造を示すためのものであり、そのまま使う値ではありません。
meta-data を作成する
meta-data には instance-id と local-hostname を入れます。NoCloud seed では user-data と meta-data の両方が必要です。
sudo tee /var/www/html/autoinstall/kvm-base-g01-n001-p.core.s01/meta-data >/dev/null <<'EOF'
instance-id: "kvm-base-g01-n001-p.core.s01"
local-hostname: "kvm-base-g01-n001-p.core.s01.example.internal"
EOFDHCP から PXE boot file を通知する
DHCP 側では、PXE client に TFTP server と boot file を通知します。next-server は TFTP server の IP address、filename は TFTP root から見た boot file です。
option arch code 93 = unsigned integer 16;
class "pxeclients" {
match if substring (option vendor-class-identifier,0,9) = "PXEClient";
next-server 10.1.0.89;
filename "grubnetx64.efi";
}DHCP、TFTP、HTTP の IP address がずれていると、PXE boot は途中で止まります。DHCP で bootloader までは取れるが ISO が取れない場合は、HTTP 側の URL と Nginx / Apache の公開状態を確認します。
配置状態を確認する
最後に、TFTP と HTTP の両方から必要なファイルが取得できるか確認します。PXE は画面上の失敗だけでは原因が分かりにくいため、サーバー側から先に配布状態を確認します。
ls -ld /srv/tftp/casper /srv/tftp/grub
ls -l /srv/tftp/grubnetx64.efi /srv/tftp/grub/grub.cfg
ls -ld /var/www/html/iso /var/www/html/autoinstall
find /var/www/html/autoinstall -maxdepth 2 -type f \( -name user-data -o -name meta-data \) | sort
curl -I http://127.0.0.1/iso/
curl -I http://127.0.0.1/autoinstall/
tftp 127.0.0.1 -c get grubnetx64.efi /tmp/grubnetx64.efi
rm -f /tmp/grubnetx64.efi| 症状 | 確認する場所 |
|---|---|
| PXE menu が出ない | DHCP の next-server / filename、TFTP、grubnetx64.efi |
| GRUB menu は出るが installer が起動しない | /srv/tftp/casper/vmlinuz と initrd の配置 |
| installer が ISO を取得できない | GRUB の iso_url、HTTP 公開、proxy、firewall |
| autoinstall が始まらない | ds=nocloud-net の URL、user-data、meta-data |
| 意図しない disk が消える | storage.config の disk path と wipe 指定 |
まとめ
Ubuntu 26.04 の PXE autoinstall は、DHCP、TFTP、HTTP、NoCloud seed をつなぐ構成です。DHCP は bootloader の場所を通知し、TFTP は GRUB と kernel / initrd を配り、HTTP は ISO と autoinstall seed を配ります。
重要なのは、PXE を一つの機能として見るのではなく、各段階の責務を分けて確認できるようにすることです。特に storage 設定は破壊的なので、対象ホストごとの user-data を分離し、インストール対象の disk path を慎重に確認する必要があります。
Ubuntu Server の運用項目を体系的に確認したい場合の参考書籍です。価格や在庫はリンク先で確認してください。
Amazon で見るこのリンクは Amazon アソシエイトリンクです。



