Skip to content

Boot Architecture & Diskless

Two-stage boot flow, boot types, PXELinux/GRUB2 compatibility, architecture mapping, and sanboot diskless boot.

Docs: Architecture | DHCP Modes | Custom iPXE Build


Two-Stage Boot

PxeLab uses a two-stage network boot architecture that upgrades the limited PXE ROM to full-featured iPXE:

Stage 1                    Stage 2
┌─────────┐   TFTP    ┌──────────┐   HTTP    ┌───────────┐
│ PXE ROM ├──────────►│  iPXE   ├──────────►│ Boot Menu │
│ (BIOS/  │ undionly  │ (custom │ /boot/    │ (Kernel + │
│  UEFI)  │ .kpxe/.efi│  build) │ ipxe/     │ Initrd /  │
└─────────┘           │         │ script    │ WIM /     │
                      │         │           │ Chain /   │
                      │         │           │ Local)    │
                      └──────────┘           └───────────┘

Stage 1: PXE ROM → iPXE

  1. The client PXE ROM sends DHCP Discover
  2. PxeLab's DHCP server responds with Offer/Ack, including:
    • IP address (server mode)
    • next-server (TFTP server address)
    • bootfile (NBP file name)
    • Option 175.178 (iPXE boot script URL)
  3. The client downloads the NBP over TFTP (undionly.kpxe / ipxe.efi)
  4. The PXE ROM loads and executes the NBP → iPXE starts

Stage 2: iPXE → Boot Menu

  1. The custom iPXE embedded script auto-runs:
#!ipxe
dhcp || clear
chain http://${next-server}:8080/boot/ipxe/script?mac=${net0/mac} || shell
  1. iPXE runs its own DHCP (doesn't read the PXE firmware cache — avoids chain-load loops)
  2. PxeLab answers DHCP again, including Option 175.178
  3. iPXE fetches the boot menu script over HTTP
  4. The menu shows the configured boot entries

Custom iPXE Build

All iPXE binaries are custom-built:

  • PXE_STACK/PXE_MENU disabled — avoids reading cached data from the PXE BIOS/UEFI
  • Embedded boot script — auto-runs dhcp + chain HTTP on startup
  • UNDI/SNP interfaces first — uses the PXE/UEFI firmware network stack, avoiding native driver compatibility issues

Build environment and embedded script details: Custom iPXE Build.


Boot Types

BootTypeUseExample
directLoad kernel + initrd directlyLinux distro install
chainChain-load another bootloader/ISOGRUB2, Windows Boot Manager
wdsWindows WIM bootWindows PE / install
sanbootiSCSI SAN bootDiskless workstations
localBoot from local diskSkip network boot

PXELinux / GRUB2 Compatibility

PXELinux

The PXELinux config parser (internal/boot/pxelinux/) is fully supported:

  • Parser — pxelinux.cfg syntax (default, label, kernel, append, initrd, ipappend, menu label/default, timeout, etc.)
  • AST — abstract syntax tree
  • Generator — AST → iPXE script conversion

When a client (pxelinux.0 / pxelinux.efi) requests pxelinux.cfg/default or the MAC-specific pxelinux.cfg/01-<mac>, PxeLab intercepts the request and generates PXELinux config from the host's bound Profile in real time; ChainLoad scenarios are supported — PXELinux configs can be translated on the fly and continue chain-loading iPXE.

Built-in NBP files: pxelinux.0 (BIOS), pxelinux.efi (UEFI), plus ldlinux.c32 / ldlinux.e64, menu.c32, memdisk.

GRUB2

  • Built-in GRUB2 NBPs: grubx64.efi (UEFI x64), grubaa64.efi (UEFI ARM64)
  • When a client requests grub.cfg (or MAC-specific grub.cfg-01-<mac>), the HTTP endpoint intercepts and generates GRUB2 config from the Profile
  • GRUB2 can also be chain-loaded from iPXE (chain grub2.efi) as a standalone bootloader

Config Generation Priority

Config requests are handled in this priority:

Request /boot/pxelinux.cfg/default or /boot/grub2/grub.cfg

    ├─ Level 1: Chain-to-iPXE enabled?   → return iPXE redirect config

    ├─ Level 2: default Profile?         → read Profile menu entries from DB
    │                                        render as PXELinux/GRUB2 syntax

    └─ Level 3: static file fallback     → read from the boot/ directory
                                             (pxelinux.cfg/default / grub2/grub.cfg)

Level 1 — Chain-to-iPXE redirect: with Chain to iPXE enabled in the UI, PXELinux/GRUB2 clients get a redirect snippet (PXELinux receives KERNEL http://server/boot/ipxe.efi, GRUB2 receives chainloader (http)/boot/ipxe.efi), handing over to iPXE with its fuller HTTP stack.

Level 2 — Native Profile config: look up the host's bound Profile by MAC (or the is_default Profile), then render its menu entries (MenuJSON) into the target format:

  • PXELinux format → LABEL xxx / KERNEL xxx / APPEND xxx
  • GRUB2 format → menuentry "xxx" { linux xxx; initrd xxx }

Level 3 — Static file fallback: with no default Profile, fall back to static files in the boot root (pxelinux.cfg/default / grub2/grub.cfg), embedded in the binary and released on first launch.

MAC-Specific Config

FormatExample path
PXELinuxpxelinux.cfg/01-aa-bb-cc-dd-ee-ff
GRUB2grub2/grub.cfg-01-aa-bb-cc-dd-ee-ff
GRUB2 shortgrub2/01-aa-bb-cc-dd-ee-ff

When a MAC-specific config is requested, the system looks up the host bound to that MAC and generates the matching config — per-machine boot config.


Architecture Mapping

Boot files are selected automatically by the client architecture from DHCP Option 93 (internal/boot/archmap.go):

Client architectureAL codeBoot file
BIOS x860ipxe.pxe / undionly.kpxe
EFI IA326ipxe32.efi
EFI x647, 9ipxe.efi
EFI ARM6411ipxe-arm64.efi
EFI RISCV6427ipxe-riscv64.efi

Diskless Boot (sanboot)

sanboot lets clients boot their system directly from an iSCSI target — no local disk at all, ideal for diskless workstations. The core criterion for whether a boot scenario suits sanboot: does the ISO need to go back and read "itself" for install files after booting?

ScenarioSuitable?Why
DOS boot disk (e.g. fdfullcd.iso)Runs immediately, no further external access
Live Linux (Kali / RescueCD)Self-contained kernel + initramfs; can loop-mount itself from the SAN
WinPE maintenance disk✅ (BIOS)Gets tools via wim/network after PE loads; no dependency on the ISO install source
Memtest86+ bare toolsDoesn't read disks after boot
iSCSI LUN with an installed OSThe goal is "run the system", not "install the system"
CentOS/RHEL install ISO⚠️→❌Anaconda needs explicit inst.repo; blind SAN scanning often fails
Ubuntu/Debian install ISO⚠️→❌Needs repo=/url=; subiquity has weak SAN loop-mount support
Windows install ISONeeds wim extraction + BCD; use wimboot

Rule of thumb: installer-type ISOs don't suit sanboot (they need to read install files after booting); run-type ISOs and already-installed system disks do.

PxeLab - All-in-one PXE Network Boot Server