PXE Boot Menu Generator
Generate PXELINUX, iPXE, and GRUB boot menus from boot rows, with default-entry checks, fallbacks, validation notes, and JSON output.- {{ 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 }}
Network boot menus sit before the installed operating system has a chance to protect, log, or recover the machine. In a Preboot Execution Environment, or PXE, firmware obtains an initial boot file from the network, then a bootloader menu chooses the next action. That action may start an unattended installer, load a rescue image, run diagnostics, return to the local disk, reboot, or hand control to another boot script.
The menu is small, but the consequences are not. A default installer entry can rebuild a host after a short timeout. A missing initial RAM disk can leave a rescue image without the early files it needs. A kernel argument copied from one distribution can be ignored by another. A chain target that works in iPXE may not work from a legacy PXELINUX path without the expected module or network support.
PXELINUX, iPXE, and GRUB often appear in the same boot estate because they serve different client classes and deployment habits. PXELINUX is common for legacy BIOS network boot, iPXE is useful for scripted menus and HTTP-served assets, and GRUB is a familiar UEFI menu format. Their menu labels may describe the same boot plan, but their syntax differs for defaults, timeouts, path resolution, chainloading, and initrd handling.
| Planning field | Why it matters |
|---|---|
| Stable ID | Default selections, labels, menu jumps, and audit records need an identifier that does not change when a title is edited. |
| Human title | Operators at a console need a readable description such as an installer, rescue shell, diagnostics lane, or local boot option. |
| Action type | Linux image, chain target, local disk, and reboot actions map to different commands in each bootloader family. |
| Kernel, initrd, and arguments | Linux entries depend on the right early boot files and command line for the target installer or rescue environment. |
| Fallback behavior | Local boot and reboot entries can prevent an accidental reinstall or give remote hands a safe recovery action. |
Generated menu text should be treated as a controlled draft, not proof that a machine will boot. DHCP options, TFTP roots, HTTP paths, bootloader modules, Secure Boot policy, firmware quirks, and installer-specific arguments all live outside the text. The safer workflow is to make the menu internally consistent, review the default and fallback behavior, then test on the real client class before production use.
How to Use This Tool:
Start with the boot plan, then use the review output to catch mismatched IDs, missing targets, and bootloader-specific assumptions before copying a menu into a boot-server workflow.
- Enter Menu title with the environment, rack, lab, or build lane name operators should see during network boot.
- Choose Selected menu format. This controls the summary copy button, while PXELINUX Menu, iPXE Script, and GRUB UEFI Menu remain available as separate result tabs when validation passes.
- Set Default entry ID to the entry that should run after the timeout.If the summary changes to Fix menu inputs, open PXE Validation Review and compare the requested default with the IDs in Boot Entry Ledger.
- Set Menu timeout in seconds. The generated formats convert that value to PXELINUX tenths of a second, iPXE milliseconds, or GRUB seconds.
- Fill Boot entry rows using the eight-column order
id,title,type,kernel-or-target,initrd,arguments,category,shortcut. Quote the arguments cell when it contains commas. - Use Ubuntu sample or Mixed sample when you need a starting shape, then use Normalize rows after pasting to rewrite the parsed rows into consistent CSV text.
- Open Advanced for bootloader-specific choices such as iPXE asset base URL, PXELINUX menu module, PXELINUX initrd style, GRUB kernel commands, DHCP retry, local boot fallback, and reboot fallback.Relative iPXE image paths need an asset base when kernels and initrds are not served from the same directory as the script.
- Read PXE Validation Review before using generated text. Errors block output. Warnings still allow output, but they name assumptions that need a real environment check.
Interpreting Results:
The most important result is whether the review found a blocking mismatch between the intended boot plan and the rows that were parsed. If Fix menu inputs appears, the code tabs stay empty until the listed error is corrected.
| Cue | What it means | What to check next |
|---|---|---|
| Error | A required row, entry type, target, duplicate-ID, or default-entry check failed. | Fix the named row or field before copying any generated menu. |
| Warning | The menu can be rendered, but a path, shortcut, initrd, chain target, or asset-location assumption needs review. | Compare the warning with the actual firmware, bootloader, and boot-server paths. |
| review clean | No warning rows were produced for the current rows and options. | Still run a lab boot because live DHCP, TFTP, HTTP, firmware, and image behavior are not tested here. |
| default <id> | The default ID exists in the parsed entries and is used for the generated menu default. | Confirm that the default is safe for unattended boot after the configured timeout. |
| Boot Entry Ledger | The parsed IDs, titles, types, kernel or target values, initrds, arguments, source rows, and generated fallbacks. | Use it as the audit view before placing files in TFTP or HTTP roots. |
Do not treat matching PXELINUX, iPXE, and GRUB outputs as proof of equivalent runtime behavior. The text can be internally consistent while one client class still fails because a module is missing, a relative path resolves differently, or a firmware build does not support the chosen chainloading path.
Technical Details:
The row parser accepts non-empty, non-comment CSV lines and reads up to eight cells from each row. Entry IDs are normalized into compact labels, unsupported entry types are reported as errors, and duplicate IDs block output because labels and menu identifiers must be unique. The supported entry types are linux, chain, local, and reboot.
Linux entries need a kernel path and may include an initrd path plus kernel arguments. Chain entries need a target, such as another script or boot object. Local and reboot entries can be entered manually, or appended through the fallback switches. The generated fallback IDs are local-disk and reboot when those IDs are not already present.
Transformation Core:
| Row element | How it is interpreted | Generated effect | Review behavior |
|---|---|---|---|
| ID | First CSV cell, normalized to a compact menu label. | Used as the PXELINUX label, iPXE boot label suffix, GRUB menu ID, and default-entry target. | Duplicate IDs are errors. A missing default request falls back to the first parsed entry. |
| Title | Second CSV cell, or the ID when no title is provided. | Shown as the menu label or menu entry title. iPXE can add a shortcut marker to the title. | Titles are not treated as unique. The ID is the controlling value. |
| Linux entry | linux plus kernel, optional initrd, and arguments. |
Emits PXELINUX, iPXE, and GRUB loader commands for the image and its command line. | A missing kernel is an error. An initrd cell plus an existing initrd= argument is a warning. |
| Chain entry | chain plus a target path or URI. |
Emits chainloading syntax for each generated format. | A missing target is an error. Any chain entry gets a warning because runtime support varies. |
| Shortcut | Single letter or digit from the eighth CSV cell. | Used as an iPXE menu key and title hint. | Other shortcut characters are removed after a warning. |
Format Mapping:
| Format | Default and menu behavior | Linux image behavior | Fallback behavior |
|---|---|---|---|
| PXELINUX Menu | Uses the selected UI module, MENU TITLE, ONTIMEOUT, and MENU DEFAULT. |
Uses KERNEL plus either an APPEND initrd=... argument or a separate INITRD directive. |
Uses LOCALBOOT 0 for local disk and reboot.c32 for reboot. |
| iPXE Script | Builds a script menu with item rows and a choose command that jumps to the selected boot label. |
Uses kernel, optional initrd --name, and boot. Relative image paths join to the asset base URL when one is entered. |
Uses exit for local boot return and reboot for reboot. |
| GRUB UEFI Menu | Uses set default with a zero-based menu index and one menuentry block per entry. |
Uses either linux/initrd or linuxefi/initrdefi, depending on the selected command style. |
Uses exit for local boot return and reboot for reboot. |
Timeout Conversion:
The timeout input is entered once in seconds and converted to the unit each generated format expects. Values are clamped to a range from 0 to 86400 seconds before conversion.
With s = 8, PXELINUX receives TIMEOUT 80, iPXE receives --timeout 8000, and GRUB receives set timeout=8. A zero timeout is not identical across formats: PXELINUX disables the timeout, iPXE omits the choose timeout and waits indefinitely, while GRUB set timeout=0 boots the default immediately.
Validation Scope:
The review is a syntax and planning check. It catches empty row sets, rows with too many CSV cells, unsupported types, duplicate IDs, missing Linux kernels, missing chain targets, default IDs that do not match parsed entries, non-simple shortcut keys, initrd duplication, whitespace in paths, chain-entry risk, and missing iPXE asset base URLs. It does not verify that files exist, that a server can deliver them, that a bootloader module is present, that firmware accepts the commands, or that an installer understands the kernel arguments.
Limitations and Privacy Notes:
The generated menus are configuration drafts for review and lab testing. They should not be treated as deployment records or live boot-server checks.
- Validation does not contact DHCP, TFTP, HTTP, firmware, or bootloader services. A clean review only means the current rows can be rendered consistently.
- Kernel arguments are passed through as text. Distribution-specific installer options, kickstart paths, autoinstall data, and rescue flags still need target-image testing.
- The page builds output from values in the browser after it loads. Do not paste secrets into kernel arguments, asset paths, or chain targets unless the same values are already safe to place in boot-server configuration.
Worked Examples:
Ubuntu autoinstall default
A row such as ubuntu-autoinstall,Ubuntu Server autoinstall,linux,ubuntu/vmlinuz,ubuntu/initrd,ip=dhcp autoinstall,Installers,u creates a Linux entry with a kernel, initrd, installer arguments, category, and shortcut. With Default entry ID set to ubuntu-autoinstall and Menu timeout set to 8, the summary should report that ID as the default, and PXE Validation Review should include a pass row for the default entry.
Mixed menu with a chain target
A mixed set can include a Linux kickstart row, a chain row such as ipxe-tools,Chain to tools script,chain,scripts/tools.ipxe,,,Utilities,t, plus local boot and reboot fallbacks. The iPXE Script can jump to the chained script, while PXE Validation Review warns that chain targets need bootloader-specific testing.
Default ID typo
If the rows contain debian-rescue but Default entry ID is debian-rescue-shell, the summary changes to Fix menu inputs. PXE Validation Review reports that the default ID does not match a parsed entry, and the code tabs stay empty until the default is changed to an ID shown in Boot Entry Ledger.
Initrd conflict
A Linux row with an initrd cell and an argument string that already includes initrd=custom.img still generates menu text, but the review warns about duplicate initrd sources. Check Boot Entry Ledger and the selected output format, then keep either the separate initrd value or the explicit kernel argument so the booted kernel receives the intended early boot image.
FAQ:
Which menu format should I use?
Use PXELINUX Menu for PXELINUX-style BIOS clients, iPXE Script when the client is running iPXE script commands, and GRUB UEFI Menu when your UEFI path expects GRUB menu entries.
Why are the generated code tabs empty?
A blocking error suppresses menu text. Open PXE Validation Review, fix the named row or field, and confirm the summary no longer says Fix menu inputs.
How do I include commas in kernel arguments?
Keep the eight-column CSV shape and quote the arguments cell when it contains commas. Use Normalize rows after pasting, then check Boot Entry Ledger to confirm the arguments stayed in one cell.
Does a clean review mean the host will boot?
No. A clean review means the current rows passed the menu checks. You still need to test the real DHCP boot file, TFTP or HTTP paths, bootloader modules, firmware behavior, and target image arguments.
What happens if I set the timeout to zero?
The generated formats handle zero differently. PXELINUX gets TIMEOUT 0, iPXE omits the choose timeout and waits indefinitely, and GRUB gets set timeout=0, which boots the default immediately.
Glossary:
- PXE
- Preboot Execution Environment, a firmware boot method that starts a machine 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 chained scripts from URIs.
- GRUB UEFI
- A GRUB menu path commonly used in UEFI boot flows.
- Initrd
- An initial RAM disk loaded with a Linux kernel to provide early boot files, drivers, or installer logic.
- Chain entry
- A menu entry that hands control to another boot image or script instead of directly loading a Linux kernel.
References:
- Config, Syslinux Wiki.
- PXELINUX, Syslinux Wiki.
- choose command, iPXE project.
- kernel command, iPXE project.
- menuentry, GNU GRUB Manual.
- timeout, GNU GRUB Manual.