Ubuntu 26.04 Server を物理サーバーや検証機へ繰り返し導入する場合、PXE boot と autoinstall を組み合わせると、ISO メディアを手作業で差し替えずに同じ手順で初期導入できます。
この記事では、DHCP、TFTP、HTTP、GRUB、NoCloud seed、user-data、meta-data の役割を分けて、Ubuntu 26.04 の PXE autoinstall を構成する基本をまとめます。
- PXE autoinstall の構成要素
- TFTP 配下の GRUB と casper ファイル
- HTTP 配下の ISO と NoCloud seed
grub.cfg、user-data、meta-dataの考え方- DHCP / TFTP / HTTP の疎通確認
| 対象 OS | Ubuntu 26.04 Server |
|---|---|
| 起動方式 | UEFI PXE boot |
| TFTP 配置例 | /srv/tftp |
| HTTP 配置例 | /var/www/html/iso、/var/www/html/autoinstall |
| seed 方式 | NoCloud network datasource |
PXE autoinstall の構成要素を確認する
PXE autoinstall では、ネットワーク起動の入口を DHCP と TFTP が担当し、インストーラー本体や autoinstall seed の配布を HTTP が担当します。UEFI 起動では GRUB の netboot EFI binary を TFTP から読み込み、grub.cfg で ISO URL と NoCloud seed URL を指定します。
- DHCP は PXE クライアントへ TFTP サーバーと起動ファイル名を渡す
- TFTP は
grubnetx64.efi、grub.cfg、vmlinuz、initrdを配布する - HTTP は Ubuntu ISO と NoCloud seed を配布する
- GRUB は
url=とds=nocloud-netを kernel command line に渡す - NoCloud seed はホスト別の
user-dataとmeta-dataを持つ
ディレクトリを用意する
TFTP 側には GRUB と casper 用のディレクトリを用意し、HTTP 側には ISO と autoinstall seed を置くディレクトリを用意します。実際の TFTP root は利用している TFTP サーバーの設定に合わせます。
sudo install -d -o root -g root -m 0755 /srv/tftp/casper
sudo install -d -o root -g root -m 0755 /srv/tftp/grub
sudo install -d -o root -g root -m 0755 /var/www/html/iso
sudo install -d -o root -g root -m 0755 /var/www/html/autoinstallUEFI 用 GRUB を配置する
UEFI PXE boot では、TFTP root 直下に grubnetx64.efi を配置する構成が扱いやすいです。DHCP の filename では、このファイル名を返します。
sudo curl -L -o /srv/tftp/grubnetx64.efi https://releases.ubuntu.com/26.04/netboot/amd64/grubx64.efi
sudo chmod 0644 /srv/tftp/grubnetx64.efi
ls -l /srv/tftp/grubnetx64.efiISO と casper を配置する
Ubuntu Server の ISO は HTTP で配布し、PXE 起動に必要な vmlinuz と initrd は TFTP の casper 配下へ配置します。ISO ファイル名は環境で使うものに合わせます。
sudo cp ubuntu-26.04-live-server-amd64.iso /var/www/html/iso/ubuntu-26.04-live-server-amd64.iso
sudo mount -o loop /var/www/html/iso/ubuntu-26.04-live-server-amd64.iso /mnt
sudo cp /mnt/casper/vmlinuz /srv/tftp/casper/vmlinuz
sudo cp /mnt/casper/initrd /srv/tftp/casper/initrd
sudo umount /mntgrub.cfg を作成する
grub.cfg では、HTTP で配布する ISO URL と autoinstall seed URL を変数化し、ホストごとの menuentry で ds=nocloud-net を指定します。
set timeout=30
loadfont unicode
set menu_color_normal=white/black
set menu_color_highlight=black/light-gray
set web_server=192.0.2.10
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 server01" {
set gfxpayload=keep
linux /casper/vmlinuz ip=dhcp url=${iso_url} autoinstall "ds=nocloud-net;s=${autoinstall_url}/server01/" ---
initrd /casper/initrd
}NoCloud seed を配置する
NoCloud seed は、ホスト別ディレクトリに user-data と meta-data を置く構成にします。実際の cloud-init user-data では先頭に #cloud-config を置くのが一般的です。公開用の例では、パスワードハッシュや SSH 公開鍵は必ずダミー値にします。
autoinstall:
version: 1
locale: en_US.UTF-8
source:
id: ubuntu-server
search_drivers: false
kernel:
package: linux-generic
identity:
hostname: server01.example.com
username: admin
realname: admin
password: "$6$CHANGE_ME_HASHED_PASSWORD"
ssh:
install-server: true
allow-pw: false
authorized-keys:
- "ssh-ed25519 CHANGE_ME_PUBLIC_KEY"
keyboard:
layout: jp
shutdown: poweroffinstance-id: "server01"
local-hostname: "server01.example.com"network と storage はホストごとに分ける
PXE autoinstall では、インストール先ディスク、NIC 名、IP アドレス、VLAN、bonding などがホストごとに異なります。共通項目とホスト固有項目を分け、network と storage は対象サーバーに合わせて明示します。
autoinstall:
network:
version: 2
ethernets:
eno1:
dhcp4: true
storage:
layout:
name: lvmDHCP で起動ファイルを返す
DHCP サーバーでは、PXE クライアントに TFTP サーバーの IP アドレスと起動ファイル名を返します。UEFI x64 を対象にする場合は、grubnetx64.efi を返す構成にします。
option arch code 93 = unsigned integer 16;
if option arch = 00:07 {
filename "grubnetx64.efi";
}
next-server 192.0.2.10;HTTP 配信を確認する
PXE クライアントが取得する ISO と NoCloud seed は HTTP で取得できる必要があります。ISO、user-data、meta-data の URL を事前に確認します。
curl -I http://192.0.2.10/iso/ubuntu-26.04-live-server-amd64.iso
curl -I http://192.0.2.10/autoinstall/server01/user-data
curl -I http://192.0.2.10/autoinstall/server01/meta-dataTFTP 配信を確認する
TFTP では、PXE 起動に必要なファイルが取得できることを確認します。grubnetx64.efi だけでなく、grub/grub.cfg、casper/vmlinuz、casper/initrd も確認対象です。
tftp 192.0.2.10
get grubnetx64.efi
get grub/grub.cfg
get casper/vmlinuz
get casper/initrd
quit
ls -l grubnetx64.efi grub.cfg vmlinuz initrd起動時に見るポイント
- DHCP で想定した
next-serverとfilenameが返っている - TFTP で
grubnetx64.efiとgrub.cfgを取得できる - GRUB メニューに対象ホストの menuentry が表示される
- kernel command line に
url=とds=nocloud-netが入っている - HTTP で ISO と NoCloud seed を取得できる
- ホスト固有の storage / network が対象サーバーと一致している
まとめ
Ubuntu 26.04 の PXE autoinstall では、DHCP、TFTP、HTTP、GRUB、NoCloud seed の責務を分けて構成すると、どこで失敗しているかを切り分けやすくなります。
grubnetx64.efi、grub.cfg、vmlinuz、initrd、ISO、user-data、meta-data の配置と取得確認を先に済ませてから、ホストごとの network / storage 定義を詰めるのが安全です。

