PXE Boot Menu Generator
Generate PXE boot menus from CSV rows with PXELINUX, iPXE, and GRUB UEFI outputs, default checks, entry ledger, and validation review before rollout.PXE Boot Menu Generator
- {{ error }}
- {{ warning }}
{{ result.outputs.pxelinux || '# Fix validation errors to generate pxelinux.cfg/default.' }}
{{ result.outputs.ipxe || '# Fix validation errors to generate boot.ipxe.' }}
{{ result.outputs.grub || '# Fix validation errors to generate grub.cfg.' }}
| ID | Title | Type | Kernel or target | Initrd | Arguments | Source | Copy |
|---|---|---|---|---|---|---|---|
| No boot entries parsed yet. | |||||||
| {{ row.id }} | {{ row.title }} | {{ row.type }} | {{ row.kernel || '-' }} | {{ row.initrd || '-' }} | {{ row.args || '-' }} | {{ row.source }} | |
| Severity | Check | Detail | Recommendation | Copy |
|---|---|---|---|---|
| No review findings yet. | ||||
| {{ row.severity }} | {{ row.check }} | {{ row.detail }} | {{ row.recommendation }} | |
{{ jsonPayload }}
Introduction
Preboot Execution Environment menus give bare-metal machines and virtual machines a choice before an operating system is already running. A client can be pointed toward an installer, rescue image, memory diagnostic, local disk fallback, or another boot script, with the bootloader deciding how the selected target is loaded.
The hard part is keeping the same boot plan readable across firmware and bootloader differences. Legacy BIOS fleets often use PXELINUX-style configuration, iPXE scripts are common when HTTP-hosted assets and script logic are needed, and UEFI environments may expect a GRUB menu. Each format has its own command names, timeout units, and kernel/initrd syntax.
A boot menu is also operationally sensitive. A wrong default can reinstall the wrong machine, a missing initrd can drop an installer into a failure shell, and a relative path can work for one bootloader while failing for another. The menu text should be treated as a draft until it has been tested on the real DHCP, TFTP, HTTP, firmware, and bootloader path it will use.
PXE menu generation is most useful when the boot choices already exist and the main task is consistency. It can organize IDs, labels, kernels, initrds, arguments, chain targets, and fallbacks into comparable menu outputs, but it cannot prove that a boot server is reachable or that a target image supports the arguments being passed to it.
Technical Details:
PXE boot menus sit between firmware handoff and operating-system startup. The bootloader reads a menu definition, shows entries when a menu interface is available, and then runs the selected entry as a sequence of loader commands. Linux entries normally pair a kernel path with an optional initial RAM disk and a kernel command line. Chain entries hand control to another image or script, while local and reboot entries return control to firmware behavior.
The same boot intent must be rendered differently because PXELINUX, iPXE, and GRUB do not share one syntax. PXELINUX uses label blocks with directives such as KERNEL, APPEND, INITRD, LOCALBOOT, and COM32 modules. iPXE uses script labels, menu items, kernel, initrd, chain, boot, exit, and reboot. GRUB uses menuentry blocks with linux or linuxefi, matching initrd commands, optional chainloading, and menu IDs.
Transformation Core:
| Input concept | Accepted shape | Rendered effect | Review concern |
|---|---|---|---|
| Entry ID | First CSV cell, normalized to a compact label. | Becomes the PXELINUX label, iPXE script suffix, GRUB menu ID, and default-entry target. | Duplicate IDs block output because labels must be unique. |
| Linux entry | linux, kernel path, optional initrd, and arguments. |
Emits loader commands for kernel, initrd handling, and kernel command-line arguments. | A missing kernel path is an error; an initrd listed twice is a warning. |
| Chain entry | chain plus a target path or URI. |
Emits chainloading syntax for the supported formats. | Chain targets need real firmware and bootloader testing. |
| Fallback entry | local or reboot, entered manually or appended by switches. |
Adds local disk return or reboot commands where the format supports them. | The actual behavior depends on the bootloader build and firmware path. |
| Shortcut key | Single letter or digit in the eighth CSV cell. | Adds iPXE menu shortcut hints and keeps the title readable. | Other characters are removed after a warning. |
Timeouts are a good example of why one input cannot be pasted into every target unchanged. PXELINUX uses tenths of a second, iPXE menu selection uses milliseconds, and GRUB uses seconds. A timeout entered as 8 seconds therefore becomes TIMEOUT 80, an iPXE choose timeout of 8000, and a GRUB set timeout=8.
| Format | Default handling | Timeout unit | Path behavior to verify |
|---|---|---|---|
| PXELINUX BIOS menu | ONTIMEOUT references the selected label, and the default menu entry receives MENU DEFAULT. |
Tenths of a second. | Kernel and initrd paths are interpreted from the PXELINUX working directory unless configured otherwise. |
| iPXE script | choose stores a selected item, then jumps to the matching boot label. |
Milliseconds. | Relative paths are joined to the asset base URL when one is entered; absolute values stay as written. |
| GRUB UEFI menu | set default uses a zero-based menu index derived from the chosen entry. |
Seconds. | Kernel commands can use linux/initrd or linuxefi/initrdefi, depending on the GRUB build. |
Validation is syntactic and planning-focused. It checks row shape, supported entry types, duplicate IDs, missing required targets, default-entry presence, simple shortcut keys, whitespace in paths, chain-entry review needs, and the iPXE asset base URL. It does not verify DHCP options, TFTP roots, HTTP content, module availability, installer arguments, Secure Boot policy, or whether the selected machine will actually start the target image.
Everyday Use & Decision Guide:
Start with the Menu title, Selected menu format, Default entry ID, and Menu timeout. For a first pass, keep the default entry on the safest installer or fallback, then set the selected format to the menu you plan to copy first. All supported formats remain available in the result tabs.
Use Boot entry rows as the source of truth. Each line uses the shape id,title,type,kernel-or-target,initrd,arguments,category,shortcut. Quote the arguments cell when it contains a comma, and keep IDs meaningful enough for an operator to recognize in the ledger and generated menu labels.
- Use Ubuntu sample for a Linux-installer starting point with kernel, initrd, and installer arguments already present.
- Use Mixed sample when you need to see Linux, chain, and firmware fallback patterns together.
- Use Normalize rows after editing or pasting rows to rebuild parsed entries in the canonical eight-cell shape.
- Set iPXE asset base URL when iPXE should resolve relative kernel, initrd, or chain paths from a known HTTP directory.
- Leave PXELINUX initrd style on append style unless the target environment expects a separate
INITRDdirective. - Add local disk and reboot fallbacks only when those actions are acceptable during unattended or remote boot work.
Warnings deserve attention even when output is still generated. A chain entry may be valid text but still fail on the actual firmware. A path with spaces may be hard to boot reliably. A row with both an initrd cell and an existing initrd= argument may boot a different image than the person reviewing the table expects.
Generation happens in the browser session after the page loads. The page does not contact boot servers, fetch kernels, or test DHCP. Avoid putting secrets in kernel arguments, because those values can appear in the generated menus, JSON, CSV or DOCX outputs, copied text, page state, or screenshots.
Step-by-Step Guide:
Build the menu from rows first, then use the review tabs to decide whether the output is ready for a lab boot.
- Enter Menu title. The title should match the build lane or environment operators expect to see during network boot.
- Choose Selected menu format. The summary copy action follows this choice, while PXELINUX Menu, iPXE Script, and GRUB UEFI Menu remain available as separate tabs.
- Set Default entry ID. If the summary reports a default-entry error, open Boot Entry Ledger and copy an ID that actually appears there.
- Set Menu timeout in seconds. Check the generated format if the target expects a specific unit, because PXELINUX, iPXE, and GRUB render the value differently.
- Paste or edit Boot entry rows. Use
linux,chain,local, orrebootin the type column, and quote argument cells that contain commas. - Open Advanced when you need the iPXE asset base URL, a different PXELINUX menu module, separate initrd directives, GRUB EFI command names, DHCP retry, local boot fallback, or reboot fallback.
- Read PXE Validation Review. Clear every Error before copying menus, then decide whether each Warning is a real environment choice or a mistake.
- Use Boot Entry Ledger to compare parsed IDs, titles, types, targets, initrds, arguments, and generated fallback rows before moving the chosen menu text into a boot-server workflow.
Interpreting Results:
Fix menu inputs means at least one blocking issue is active, and the PXELINUX, iPXE, and GRUB text areas stay empty until the problem is corrected. A ready summary means the rows can be rendered as menu text; it does not mean the machine will boot from that text.
| Output cue | Meaning | Follow-up |
|---|---|---|
| Error | A row, default ID, type, kernel, or chain target failed a required check. | Fix the named row or field before copying any menu text. |
| Warning | The menu can be generated, but a path, initrd, shortcut, chain target, or asset-base assumption needs review. | Confirm the warning against the actual bootloader path and target firmware. |
| review clean | No warnings were recorded for the current rows and options. | Still perform a lab boot, because server reachability and image behavior are outside the review. |
| default <id> | The default entry matches a parsed boot row and is used in the generated menus. | Make sure the selected default is safe if no operator touches the menu. |
Use Boot Entry Ledger when the generated menu does not match the plan. The ledger shows parsed entries after normalization and generated fallbacks have been applied. If the ledger is wrong, fix the source rows instead of editing one generated format by hand and leaving the others out of sync.
Worked Examples:
Ubuntu autoinstall with a safe default
A row such as ubuntu-autoinstall,Ubuntu Server 24.04 autoinstall,linux,ubuntu/24.04/vmlinuz,ubuntu/24.04/initrd,ip=dhcp autoinstall ds=nocloud-net;s=http://boot.example.internal/autoinstall/ubuntu-24.04/,Installers,u creates a Linux entry with a kernel path, initrd path, and installer arguments. If Default entry ID is ubuntu-autoinstall, PXE Validation Review should include a pass row for the default entry, and the summary should name that ID as the default.
Mixed firmware menu with a chain target
A mixed row set can include a Rocky Linux kickstart entry, a chain entry such as ipxe-tools,Chain to tools.ipxe,chain,http://boot.example.internal/scripts/tools.ipxe,,,Utilities,t, and a local firmware fallback. The generated iPXE Script can chain to the tools script, while PXE Validation Review warns that chain targets require bootloader-specific support and should be tested on the exact firmware path.
Default ID typo before rollout
If the rows contain debian-rescue but Default entry ID is set to debian-rescue-shell, the review reports that the default ID does not match a parsed entry. The code outputs remain empty, and Boot Entry Ledger gives the corrected ID to use before the menu can be copied.
Initrd argument conflict
A Linux row with an initrd cell and an argument string that already contains initrd=custom.img still generates menu text, but the review warns about the duplicate initrd source. Check Boot Entry Ledger and the generated target format, then keep either the explicit argument or the initrd cell so the booted kernel receives the image you intended.
FAQ:
Which output should I copy first?
Use Selected menu format for the bootloader class you are preparing first. Copy PXELINUX Menu for BIOS PXELINUX clients, iPXE Script for iPXE script booting, or GRUB UEFI Menu for a GRUB-based UEFI path.
Why did generated menu text disappear?
A blocking validation error suppresses menu output. Open PXE Validation Review, fix the named row or field, and confirm the summary no longer says Fix menu inputs.
How should I write rows with commas in kernel arguments?
Keep the eight-column CSV shape and quote the arguments cell when it contains commas. After pasting, use Normalize rows and check Boot Entry Ledger to confirm the arguments stayed in one cell.
Does the page test my boot server?
No. It builds menu text and review rows from the current entries. It does not fetch kernels, test HTTP or TFTP paths, inspect DHCP options, or confirm firmware support.
What does timeout zero mean?
The entered timeout is rendered according to each format. For iPXE, a zero choose timeout waits indefinitely. For PXELINUX and GRUB behavior, confirm the exact target behavior because their zero-timeout handling differs from ordinary positive-second waits.
Glossary:
- PXE
- Preboot Execution Environment, a firmware boot path that lets a machine start from network-provided boot files.
- PXELINUX
- A Syslinux-family bootloader commonly used for legacy BIOS network boot menus.
- iPXE
- A scriptable network boot environment that can load kernels, initrds, and scripts from URIs.
- GRUB UEFI
- A GRUB menu path used by many UEFI boot environments.
- Initrd
- An initial RAM disk loaded with a Linux kernel to provide early boot files and installer logic.
- Chain entry
- A menu entry that hands control to another boot image or script instead of loading a kernel directly.
References:
- Config, Syslinux Wiki.
- PXELINUX, Syslinux Wiki.
- Choose menu item, iPXE project, 2025.
- Download and select an executable image, iPXE project, 2023.
- menuentry, GNU GRUB Manual 2.14.
- timeout, GNU GRUB Manual 2.14.