手当たり次第に書くんだ

飽きっぽいのは本能

Ubuntu 26.04 PXE autoinstall – DHCP / TFTP / NoCloud で自動インストールする

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.efigrub.cfgcasper、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 を配布します。どこか一つだけ見ても全体は分かりません。

領域役割
DHCPclient に IP address、next-serverfilename を通知する
TFTPgrubnetx64.efigrub/grub.cfgcasper/vmlinuzcasper/initrd を配布する
HTTPUbuntu ISO と autoinstall 用の NoCloud seed を配布する
GRUBmenuentry を表示し、ds=nocloud-net 付きで installer を起動する
NoCloud seedホストごとの user-datameta-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/autoinstall

UEFI 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.efi

proxy 環境では http_proxyhttps_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
EOF

ds=nocloud-net;s=... の末尾は、対象ホストごとの seed directory です。ここに user-datameta-data を置きます。

ISO と casper を配置する

GRUB の linux / initrd は TFTP から読みます。一方で installer 本体は HTTP 経由の ISO URL として渡します。ISO から casper/vmlinuzcasper/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/iso

ISO のファイル名は環境で管理しているものに合わせます。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-datameta-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"
EOF

DHCP から 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/vmlinuzinitrd の配置
installer が ISO を取得できないGRUB の iso_url、HTTP 公開、proxy、firewall
autoinstall が始まらないds=nocloud-net の URL、user-datameta-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 を慎重に確認する必要があります。

参考書籍
参考書籍
Advanced Ubuntu Administration and Management Best Practices

Ubuntu Server の運用項目を体系的に確認したい場合の参考書籍です。価格や在庫はリンク先で確認してください。

Amazon で見る

このリンクは Amazon アソシエイトリンクです。

次に読む記事

Ubuntu 26.04 サーバー管理ガイド
Ubuntu 26.04 PXE autoinstall – DHCP / TFTP / NoCloud で自動インストールする

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)

トップへ戻る