手当たり次第に書くんだ

飽きっぽいのは本能

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

関連する記事

Ubuntu 26.04 Server を物理サーバーや検証機へ繰り返し導入する場合、PXE boot と autoinstall を組み合わせると、ISO メディアを手作業で差し替えずに同じ手順で初期導入できます。

この記事では、DHCP、TFTP、HTTP、GRUB、NoCloud seed、user-datameta-data の役割を分けて、Ubuntu 26.04 の PXE autoinstall を構成する基本をまとめます。

この記事で扱うこと
  • PXE autoinstall の構成要素
  • TFTP 配下の GRUB と casper ファイル
  • HTTP 配下の ISO と NoCloud seed
  • grub.cfguser-datameta-data の考え方
  • DHCP / TFTP / HTTP の疎通確認
対象 OSUbuntu 26.04 Server
起動方式UEFI PXE boot
TFTP 配置例/srv/tftp
HTTP 配置例/var/www/html/iso/var/www/html/autoinstall
seed 方式NoCloud network datasource
参考書籍
参考書籍
Ubuntu Server Administration
Ubuntu Server のインストール、ネットワーク、サービス運用を体系的に確認したい場合の参考書籍です。価格や在庫はリンク先で確認してください。
Amazon で見る
このリンクは Amazon アソシエイトリンクです。

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.efigrub.cfgvmlinuzinitrd を配布する
  • HTTP は Ubuntu ISO と NoCloud seed を配布する
  • GRUB は url=ds=nocloud-net を kernel command line に渡す
  • NoCloud seed はホスト別の user-datameta-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/autoinstall

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

ISO と casper を配置する

Ubuntu Server の ISO は HTTP で配布し、PXE 起動に必要な vmlinuzinitrd は 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 /mnt

grub.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-datameta-data を置く構成にします。実際の cloud-init user-data では先頭に #cloud-config を置くのが一般的です。公開用の例では、パスワードハッシュや SSH 公開鍵は必ずダミー値にします。

user-data の例
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: poweroff
meta-data の例
instance-id: "server01"
local-hostname: "server01.example.com"

network と storage はホストごとに分ける

PXE autoinstall では、インストール先ディスク、NIC 名、IP アドレス、VLAN、bonding などがホストごとに異なります。共通項目とホスト固有項目を分け、networkstorage は対象サーバーに合わせて明示します。

user-data の一部
autoinstall:
  network:
  version: 2
  ethernets:
  eno1:
  dhcp4: true
  storage:
  layout:
  name: lvm

DHCP で起動ファイルを返す

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-datameta-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-data

TFTP 配信を確認する

TFTP では、PXE 起動に必要なファイルが取得できることを確認します。grubnetx64.efi だけでなく、grub/grub.cfgcasper/vmlinuzcasper/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-serverfilename が返っている
  • TFTP で grubnetx64.efigrub.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.efigrub.cfgvmlinuzinitrd、ISO、user-datameta-data の配置と取得確認を先に済ませてから、ホストごとの network / storage 定義を詰めるのが安全です。

関連する記事
Ubuntu 26.04 PXE autoinstall の基本設定 – DHCP / TFTP / NoCloud で自動インストールする

コメントを残す

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

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

トップへ戻る