| Reference | Variant | Guest RAM | Media | Readiness |
|---|---|---|---|---|
debian-12-i386 |
Debian 12 CLI | 512 MiB | built rootfs | LUMIBOOT_GUEST_READY |
debian-12-i386-desktop |
Debian 12 X11/Openbox | 1024 MiB | built rootfs | LUMIBOOT_DESKTOP_READY |
debian-12-i386-xfce |
Debian 12 XFCE | 1024 MiB | built rootfs | LUMIBOOT_DESKTOP_READY |
ubuntu-18-i386 |
Ubuntu 18.04 CLI | 512 MiB | built rootfs | LUMIBOOT_GUEST_READY |
ubuntu-18-i386-desktop |
Ubuntu 18.04 X11/Openbox | 1024 MiB | built rootfs | LUMIBOOT_DESKTOP_READY |
ubuntu-18-i386-xfce |
Ubuntu 18.04 XFCE | 1024 MiB | built rootfs | LUMIBOOT_DESKTOP_READY |
windows-7-pro-sp1-x86 |
Windows 7 Professional SP1 x86 | 1536 MiB | operator RAW disk | disk-boot |
windows-7-x86 |
Windows 7 Lite x86 | 1024 MiB | operator RAW disk | disk-boot |
windows-10-x86 |
Windows 10 x86 32-bit | 2048 MiB | operator RAW disk | disk-boot |
custom-image |
Custom image (ISO / IMG / RAW) | 512 MiB | user-imported media | LUMIBOOT_GUEST_READY |
No disk, ISO or license key is shipped by this repository. This page is the index and the commands; details live next to each image under images/<ref>/.
Windows 11, Fedora, Linux Mint and macOS are catalogued but not developed: their x86-64 or ARM engine is not integrated, so they stay planned ("Not ready") with nothing to import.
Ubuntu 18.04 LTS follows the Debian pipeline — one script, three variants — and all three are built
locally, published into the Git-ignored apps/web/public/images/<ref>/ directories and validated by
a real boot (validated: true, availability ready), with XFCE as the default variant. Nothing is
distributed here: rebuild the media from
images/ubuntu-18-i386/README.md; see
Ubuntu 18.04 LTS.
Prerequisites: debootstrap, e2fsprogs, util-linux, coreutils, node, root, Linux or WSL2.
sudo ./images/debian-12-i386/build.sh # CLI
sudo FLAVOR=desktop ./images/debian-12-i386/build.sh # X11 + Openbox
sudo FLAVOR=xfce ./images/debian-12-i386/build.sh # XFCEOutputs land in build/, build-desktop/ and build-xfce/. Copy rootfs.img, vmlinuz-686, initrd.img and manifest.json into apps/web/public/images/<ref>/. <ref> is debian-12-i386, debian-12-i386-desktop or debian-12-i386-xfce.
Build details, package lists, profile measurements and smoke tests: images/debian-12-i386/README.md.
Prerequisites: Linux or WSL2, root, debootstrap (with its bionic script), e2fsprogs, util-linux, coreutils, node.
sudo ./images/ubuntu-18-i386/build.sh # CLI
sudo FLAVOR=desktop ./images/ubuntu-18-i386/build.sh # X11 + Openbox
sudo FLAVOR=xfce ./images/ubuntu-18-i386/build.sh # XFCE| Flavor | Reference | RAM | Disk |
|---|---|---|---|
| CLI | ubuntu-18-i386 |
512 MiB | 3 GiB |
| X11 + Openbox | ubuntu-18-i386-desktop |
1024 MiB | 3 GiB |
| XFCE | ubuntu-18-i386-xfce |
1024 MiB | 4 GiB |
Outputs land in build/, build-desktop/ and build-xfce/: rootfs.img, vmlinuz-686, initrd.img, manifest.json, packages.tsv and provenance.txt. Copy the first four into apps/web/public/images/<ref>/, a Git-ignored directory. v86 boots bzimage + initrd + hda, with no installer; the cmdline is console=tty0 console=ttyS0,115200 root=/dev/sda rw rootwait rootdelay=5, plus vga=0x318 on the graphical variants, and all three manifests carry it as boot.cmdline.
rootwait rootdelay=5 is required, not decorative: v86 serves the disk over asynchronous HTTP Range requests, so /dev/sda may answer after the ATA probe. Without it the bionic initramfs (systemd 237) abandons the first probe and drops to a shell (Gave up waiting for root file system device … ALERT! /dev/sda does not exist) even though the kernel booted. Debian tolerates the race, Ubuntu does not.
The bionic 4.15 kernel names the DRM driver bochs_drm (renamed bochs in 4.20+), so guest/no-drm.conf blacklists both names for the CLI variant, which must keep the text VGA console; the graphical variants keep bochs_drm, the only /dev/fb0 provider under v86.
18.04 "bionic" is the last Ubuntu release with an i386 port, and it is end-of-life (ESM). archive.ubuntu.com and security.ubuntu.com still serve it, i386 included, and they are the script's defaults. If the archive stops serving bionic, point UBUNTU_MIRROR and UBUNTU_SECURITY_MIRROR at http://old-releases.ubuntu.com/ubuntu. SNAPSHOT, DISK_SIZE, LUMIBOOT_BUILD_DIR and UBUNTU_KEYRING are supported.
The bionic keyring is often missing (a Debian host, or a current ubuntu-keyring): pass UBUNTU_KEYRING=/usr/share/keyrings/ubuntu-archive-keyring.gpg, otherwise debootstrap runs with --no-check-gpg and says so; provenance.txt records the mode.
A successful build is not a proof: the order is build → publish → smoke test (images/ubuntu-18-i386/tests/*.md) → validated: true in packages/catalog/src/profiles.ts → VM_E2E_ASSETS=1 pnpm test:e2e --grep "Ubuntu". All three variants went through it. Measured real boots: CLI about 2 min 30 (booted twice per run: first boot and restart), X11/Openbox 3 min 27, XFCE 4 min 04; uname -a reports 4.15.0-213-generic i686, /etc/os-release says Ubuntu 18.04 LTS, sudo -n whoami returns root, and autologin works on both VGA and serial; session-ubuntu.spec.ts, desktop-ubuntu.spec.ts and xfce-ubuntu.spec.ts pass with VM_E2E_ASSETS=1. Keep that order as the maintenance rule: revert the flag as soon as a rebuild or a boot stops matching the smoke test.
Build details, packages, provenance and smoke tests: images/ubuntu-18-i386/README.md.
Readiness threshold: the CLI profile waits 240 s for LUMIBOOT_GUEST_READY, like the graphical variants, because software emulation can push a measured boot past 120 s. Expiry is diagnostic only (boot-timeout): the VM is not stopped, the console stays live and a late marker still reaches running.
Requires an installed 32-bit RAW disk, bootable in BIOS/MBR, with your own license; a UEFI/GPT installation does not boot. Place it at images/windows-7-pro-sp1-x86/disk.img:
pnpm assets:windows7:prepare --source images/windows-7-pro-sp1-x86/disk.img --ref windows-7-pro-sp1-x86 --display-name "Windows 7 Professional SP1 x86" --architecture i386 --memory-mib 1536 --vga-mib 16 --out images/windows-7-pro-sp1-x86
pnpm assets:windows7:checkThe Lite variant reads images/windows-7-x86/disk.img with 1024 MiB of guest RAM. Register it with --ref windows-7-x86 --memory-mib 1024.
Guest networking needs an NE2000 driver installed inside the disk, offline under QEMU. Disk preparation, driver install, readiness, HTTP Range transport and network modes: images/windows-7-pro-sp1-x86/README.md. The Lite variant has its own page: images/windows-7-x86/README.md.
Requires a 32-bit BIOS/MBR installation; a UEFI/GPT disk does not boot. Convert to RAW, keep it outside public/:
qemu-img convert -O raw source.qcow2 images/windows-10-x86/disk.img
pnpm assets:windows10:prepare --source images/windows-10-x86/disk.img
pnpm assets:windows10:check2048 MiB of guest RAM minimum. The virtio-net driver must already be in the disk. QEMU install, VirtualBox conversion and validation: images/windows-10-x86/README.md.
Generic entry point: boot any 32-bit disk media you own with the integrated v86 engine.
- Accepted formats:
.iso,.img,.raw. A.img/.rawboots as a hard disk (hda); a bootable (live).isois mounted as a CD-ROM and boots from it (CD-first boot order). Installation ISOs are not supported: v86 persists no write, so run a media that is already bootable. - The media is imported through the page's import card and stored as a local blob in the browser; it is never uploaded, and LumiBoot distributes no image.
- 512 MiB of guest RAM, no fixed boot device (the media format decides the mount),
LUMIBOOT_GUEST_READY:custom-imagemarker. - Availability stays
resource-required("Resource required") until a media is imported. - You must hold a licence for the software contained in the media; the security of that disk is yours.
One card per family; the selector picks the launched profile.
Fields in packages/catalog/src/profiles.ts, copied into OSDefinition by systems.ts:
| Field | Role |
|---|---|
variantGroupId |
parent id; absent on the parent |
variantName |
short selector label |
variantOrder |
ascending priority; lowest = default; absent = after the ordered variants |
displayMode |
text for a CLI guest; graphical (or absent) for a VGA/framebuffer guest |
Each variant has its own image, profile, readiness and availability.
displayMode is explicit, never inferred from the display name: text identifies a CLI guest and graphical a VGA/framebuffer guest. The guest screen is always the primary surface and serial logs start collapsed for every profile; the "Logs" button explicitly shows or hides them.
Current groups:
| Group | Order | Default |
|---|---|---|
Debian (debian-12-i386) |
XFCE, X11, CLI | XFCE |
Ubuntu (ubuntu-18-i386) |
XFCE, X11, CLI | XFCE |
Windows 7 (windows-7-x86) |
Professional, Lite | Professional |
Helpers in packages/catalog/src/systems.ts: getDisplaySystems() returns the parents and standalone systems, getVariantGroup() the members sorted by variantOrder, getDefaultVariant() the first member, getVariantParent() and getVariantParentId() resolve the parent, and hasVariants() tells whether a group holds several entries.
Adding one: the image in images.ts, the profile in profiles.ts, then variantGroupId, variantName, variantOrder and the catalogue/UI/E2E tests. No React component to change.
ready requires a present image, a compatible profile, an integrated engine and validated: true. Without them the card is listed as unavailable.
Disks are mounted read-only: guest writes stay in memory and are lost on stop. Software emulation makes boot slow. The license and the security of the disk are the operator's responsibility.