--clean-build clears all caches (Go, NVIDIA, lb packages, work dir)
and rebuilds the Docker image, then proceeds with a full clean build.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Removes all cached build artifacts: Go cache, NVIDIA/NCCL/cuBLAS
downloads, lb package cache, and live-build work dir. Use before
a clean rebuild or when switching Debian/kernel versions.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Switch squashfs compression from xz to zstd (3-5x faster compression,
~10-15% larger but decompresses faster at boot)
- Stop rm -rf BUILD_WORK_DIR on each build; rsync only config changes
so lb can reuse its chroot across builds (skips apt install step)
- Keep lb-packages cache in CACHE_ROOT as fallback if work dir is wiped
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
apt-cacher-ng requires a separate container; lb's own package cache
persisted in --cache-dir is simpler and sufficient.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Saves cache/packages.chroot before wiping BUILD_WORK_DIR and
restores it after, so apt packages are not re-downloaded on every
build. Cache lives in --cache-dir (same place as Go/NVIDIA cache).
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Pass APT_PROXY=http://host:3142 to build-in-container.sh to route
all apt traffic through a local cache. Also supports --apt-proxy flag.
Mirrors in auto/config are set from BEE_APT_PROXY env when present.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
toram was incorrectly added to the default bootappend-live causing
every boot to copy the full ISO to RAM (slow on BMC virtual media).
Default boot reads squashfs from media; toram is available as a
separate menu entry.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Removes ~100-300MB from the squashfs: man pages, non-en locales,
python cache, apt lists and package cache, temp files and logs.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Without this, git refuses to read the bind-mounted repo (UID mismatch)
and describe returns empty, causing the version to fall back to iso/v1.0.20.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Without toram the squashfs is read from the physical medium at runtime.
Disconnecting the USB/CD after boot causes SQUASHFS I/O errors on any
uncached block, making all X11 apps crash with SIGBUS.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- All prompts accept 'a' = abort, 'b' = back to previous step
- Interface input: validate numeric range and name existence, re-prompt on bad input
- IP address: regex check x.x.x.x/prefix format
- Gateway: regex check x.x.x.x format
- Main loop: 'b' at mode selection goes back to interface list
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
On real server hardware (IPMI/BMC AST chip + nomodeset) the VESA
framebuffer is set by BIOS at whatever resolution it chooses (often
1024x768 or 1280x1024). The hardcoded 1920x1080 Modeline caused X to
fail → LightDM crash-loop → SOL console flooded with systemd messages.
- Remove Monitor section / Modeline from xorg.conf — fbdev now uses
whatever framebuffer resolution the kernel provides
- Add lightdm.service.d/bee-limits.conf: RestartSec=10,
max 3 restarts per 60s so headless hardware doesn't spam the console
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
User sees a numbered list but could only type the name.
Now numeric input is resolved to the interface name via awk NR==N.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Plain v2.x tags are now the active tagging scheme; iso/v1.0.x tags
are legacy. Swap priority in resolve_iso_version so the ISO is named
bee-debian12-v2.x-amd64.iso instead of v1.0.x-N-gHASH.
Also tighten the v* pattern to v[0-9]* to avoid accidentally matching
other prefixed tags in both resolve functions.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
resolve_iso_version only matched iso/v* pattern; GUI release tags
(v2, v2.1 ... v2.6) were ignored, falling back to the old v1.0.20
annotated tag via resolve_audit_version.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Add video=1920x1080 to kernel cmdline (sets fbdev to Full HD)
- Update GRUB gfxmode to 1920x1080 (fallback to 1280x1024,auto)
- Add Xorg Monitor section with 1920x1080 Modeline and preferred mode
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
startx from user shell has /dev/fb0 permission issues and is fragile.
LightDM starts Xorg as root — standard LiveCD approach that works
on server hardware / IPMI KVM with nomodeset + fbdev/vesa.
- Add lightdm package, configure autologin as bee/openbox session
- Add /usr/share/xsessions/openbox.desktop
- Remove startx from .profile (LightDM manages X lifecycle)
- Remove Xwrapper.config needs_root_rights workaround (no longer needed)
- Enable lightdm.service in setup hook
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
If X fails to start, the user gets a working shell prompt instead
of a dead session or autologin loop.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Interactive script: lists interfaces, DHCP or static IP config.
Shown as hint in tty1 welcome message.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Explicit xorg.conf.d config prevents Xorg from trying KMS/DRM
drivers that fail on server hardware with nomodeset.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
startx from autologin shell targets VT1 directly — KVM sees the
graphical UI without VT switching. Remove bee-desktop.service
(systemd-launched X defaults to VT7, invisible on KVM).
Add xserver-xorg-video-fbdev for server AST/VGA framebuffer.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
grub-pc and grub-efi-amd64 conflict with each other in Debian 12.
The -bin packages provide the same grub-install binaries without conflict.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Copies the live system to a local disk via unsquashfs — no debootstrap,
no network required. Supports UEFI (GPT+EFI) and BIOS (MBR) layouts.
ISO:
- Add squashfs-tools, parted, grub-pc, grub-efi-amd64 to package list
- New overlay script bee-install: partitions, formats, unsquashfs,
writes fstab, runs grub-install+update-grub in chroot
Go TUI:
- Settings → Tools submenu (Install to disk, Check tools)
- Disk picker screen: lists non-USB, non-boot disks via lsblk
- Confirm screen warns about data loss
- Runs with live progress tail of /tmp/bee-install.log
- platform/install.go: ListInstallDisks, InstallToDisk, findLiveBootDevice
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Default boot no longer loads ISO to RAM (slow on BMC virtual media).
Separate menu entry added for toram in both GRUB and isolinux.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
nv/target has no .h suffix; use -type f instead of -name '*.h' to
detect non-empty include directories.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
cuda_fp16.h (included by cublas_api.h) requires <nv/target> from
the CUDA C++ Core Libraries (cuda-cccl-13-0).
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
ls *.h missed headers in subdirectories like crt/host_defines.h;
use find -maxdepth 2 instead.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
cuda-crt-13-0 may not share the same version string as cuda-cudart-13-0;
pass empty version to lookup_pkg to match the first available version.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
cublasLt.h -> cublas_api.h -> driver_types.h -> crt/host_defines.h
which lives in the cuda-crt-13-0 package, not cudart-dev.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
NVIDIA CUDA .deb packages install headers under
/usr/local/cuda-X.Y/targets/x86_64-linux/include/ not /usr/include/,
causing copy_headers() to silently skip them.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
awk exit in the blank-line block jumps to END, which printed the
result again causing repo_sha to contain the hash twice with a newline,
breaking the sha256 string comparison.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Debian Packages.gz uses CRLF line endings; \r in the captured SHA256
field caused string comparison to fail even when hashes were identical.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Echo messages captured in stdout polluted the return value of
download_verified_pkg(), causing extract_deb() to receive a
multi-line string instead of a file path and silently exit via set -e.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>