Three things, headlined by the long-blocked graphical PXE menu.
## 1. Graphical PXE boot background — the iVentoy feature, finally
iVentoy paints a PNG background on the PXE screen using stock iPXE
built with CONSOLE_FRAMEBUFFER + IMAGE_PNG + CONSOLE_CMD; the public
iPXE binaries omit those, so `console --picture` is a no-op on them.
We now build our own iPXE from upstream with that thin config delta
(deploy/ipxe/local/{general,console}.h).
The 8-release blocker was cc1 segfaulting when an amd64 gcc ran under
QEMU emulation on the arm64 build host. Fix: a new `ipxe-build`
Dockerfile stage pinned to $BUILDPLATFORM (native arch — no emulation)
that cross-compiles x86_64 iPXE with CROSS_COMPILE=x86_64-linux-gnu-.
The compiler runs native and emits x86_64. Validated end-to-end:
png.o + fbcon.o + pixbuf.o all compile and link (confirmed via the
linked-ELF symbol table, not just strings), ~112s, no segfault. Host
tools needed libc6-dev (dropped by --no-install-recommends; without
it the native host compile falls through to iPXE's freestanding
headers and dies on bits/stdint.h — fixed).
Server side:
- pxe_logo.rs is now a full-screen background compositor: a dark field
(matching the WebUI theme) with the operator's uploaded logo across
the top, or — with no upload — a default OpenPXE rainbow disc drawn
with pure pixel math (no font/SVG deps). Always 1024x768 (iPXE
doesn't scale; this is the universal mode). WebP/JPEG/GIF/PNG in,
PNG out (iPXE only eats PNG).
- /branding/pxe-logo always returns a PNG now (default when no logo,
default when SVG) so the menu always has a background.
- render_menu uses `console --picture … --top 290 || console`: paints
the background and reserves the logo band on PNG-capable binaries
(x86_64 UEFI), cleanly falls back to text on the others. The ASCII
wordmark is GONE.
Only x86_64 UEFI is built from source (host-arch-agnostic cross build);
BIOS/i386/arm64 keep upstream-fetched no-PNG binaries + text fallback.
Modern clients are overwhelmingly x86_64 UEFI.
## 2. NFS AUTH_SYS credential — fixes NFS3ERR_ACCES
v0.4.68's privileged-port fix got past MNT3ERR_ACCES (mount); operators
then hit NFS3ERR_ACCES on READDIR because nfs3_client defaults to
AUTH_NONE and virtually every server exports sec=sys. We now present an
AUTH_UNIX credential (uid 0 / gid 0): no_root_squash servers treat us
as root, root_squash servers map us to anon which reads any
world-readable ISO share. Kept fixed (no UI knob) to stay dead-simple.
Hint updated: a remaining NFS3ERR_ACCES is now a server-side
permission/squash issue, not IP/auth-flavor.
## 3. FleetDM-style full-width logo (top-left)
When a custom logo is uploaded the sidebar header drops the bundled
mark + "OpenPXE" wordmark and lets the logo span the header
(left-aligned, capped 200x50, contain). Rendered server-side via a
brand-class in index_html (has_custom_logo) so there's no flash of the
default. The bundled-default case is unchanged.
Tests: 164 passing. clippy -D warnings clean. iPXE build stage
validated in isolation before the full image build.
Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]>
75 lines
3.2 KiB
Bash
Executable File
75 lines
3.2 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
# Build PNG-enabled iPXE binaries from source.
|
|
#
|
|
# Why from source: the official boot.ipxe.org binaries (and the
|
|
# Debian-packaged ones) are NOT built with CONSOLE_FRAMEBUFFER +
|
|
# IMAGE_PNG + CONSOLE_CMD, so `console --picture` is a no-op on them —
|
|
# you can't paint a graphical boot-menu background. iVentoy solves this
|
|
# by shipping its own iPXE build with exactly those three flags; we do
|
|
# the same, from upstream iPXE, with a thin auditable config delta
|
|
# (deploy/ipxe/local/{general,console}.h).
|
|
#
|
|
# Why a real cross-compiler instead of QEMU: building amd64 iPXE by
|
|
# emulating an amd64 gcc under QEMU on an arm64 host intermittently
|
|
# segfaults cc1 (the reason this was stuck for ~8 releases). Running a
|
|
# NATIVE arm64 gcc that cross-targets x86_64 (CROSS_COMPILE=
|
|
# x86_64-linux-gnu-) sidesteps emulation entirely — the compiler is a
|
|
# native binary, it just emits x86_64 objects. This stage is meant to
|
|
# run on $BUILDPLATFORM (the native builder arch), NOT the emulated
|
|
# target platform.
|
|
#
|
|
# Outputs (into $DEST), using the filenames OpenPXE's arch mapping
|
|
# expects:
|
|
# snponly.efi x86_64 UEFI, PNG-enabled
|
|
# ipxe.efi x86_64 UEFI, PNG-enabled (bundled drivers)
|
|
#
|
|
# We build ONLY x86_64 UEFI, always via the x86_64 cross toolchain
|
|
# (`x86_64-linux-gnu-gcc`). That's deliberately host-arch-agnostic: it
|
|
# works whether this stage runs on an arm64 Mac builder or an amd64 CI
|
|
# runner, because the cross compiler runs native and emits x86_64
|
|
# either way. Building arm64-efi or BIOS here would re-introduce a
|
|
# dependency on the host arch (native arm64 build) or a 32-bit multilib
|
|
# toolchain — so those arches keep their upstream-fetched (no-PNG)
|
|
# binaries and fall back to the menu's clean `|| console` text screen.
|
|
# Modern PXE clients are overwhelmingly x86_64 UEFI, which get the full
|
|
# graphical background.
|
|
|
|
set -euo pipefail
|
|
|
|
ROOT="$(cd "$(dirname "$0")/.." && pwd)"
|
|
DEST="${1:-$ROOT/assets/ipxe}"
|
|
WORK="$(mktemp -d)"
|
|
trap 'rm -rf "$WORK"' EXIT
|
|
|
|
# Pinned upstream iPXE. Rolling master is fine functionally, but a pin
|
|
# keeps builds reproducible and protects against a transient master
|
|
# breakage. Bump deliberately.
|
|
IPXE_REPO="https://github.com/ipxe/ipxe.git"
|
|
IPXE_REF="${IPXE_REF:-master}"
|
|
|
|
echo ">> cloning iPXE ($IPXE_REF)"
|
|
git clone --depth 1 --branch "$IPXE_REF" "$IPXE_REPO" "$WORK/ipxe" 2>/dev/null \
|
|
|| git clone "$IPXE_REPO" "$WORK/ipxe"
|
|
SRC="$WORK/ipxe/src"
|
|
|
|
echo ">> applying OpenPXE config overrides (PNG + framebuffer + console cmd)"
|
|
mkdir -p "$SRC/config/local"
|
|
cp "$ROOT/deploy/ipxe/local/general.h" "$SRC/config/local/general.h"
|
|
cp "$ROOT/deploy/ipxe/local/console.h" "$SRC/config/local/console.h"
|
|
|
|
mkdir -p "$DEST"
|
|
|
|
# x86_64 UEFI — cross-compiled with the native arm64 gcc targeting
|
|
# x86_64. HOST_CC stays the native cc for iPXE's build-time utilities
|
|
# (elf2efi, zbin, …); only the target objects use the cross compiler.
|
|
echo ">> building x86_64 UEFI (snponly.efi, ipxe.efi)"
|
|
make -C "$SRC" -j"$(nproc)" \
|
|
CROSS_COMPILE=x86_64-linux-gnu- \
|
|
bin-x86_64-efi/snponly.efi \
|
|
bin-x86_64-efi/ipxe.efi
|
|
cp "$SRC/bin-x86_64-efi/snponly.efi" "$DEST/snponly.efi"
|
|
cp "$SRC/bin-x86_64-efi/ipxe.efi" "$DEST/ipxe.efi"
|
|
|
|
echo ">> iPXE build complete:"
|
|
ls -l "$DEST"/snponly.efi "$DEST"/ipxe.efi
|