The ISO now boots straight into a GTK installer instead of dropping to a tty. Structure: - installer/arcline-installer: small GTK3 (Python) frontend that drives scripts/deploy-disk.sh — pick a disk, choose boot mode, type the device path to confirm, watch the deploy log, reboot. Pure helper logic is tested against lsblk (lowercase keys, pseudo-devices filtered). - scripts/build-live.sh: builds build/rootfs/<edition>-live by cloning the CLEAN rootfs and layering on live-boot, a minimal X session (Xorg + openbox), the installer, and the deploy tooling under /usr/lib/arcline (deploy-disk.sh + btrfs/init.sh + edition fstabs, laid out so the scripts' own path resolution works unchanged). - overlays/live/: arcline-installer.service + session script that start Xorg on vt1 (with -allow-root) and run the installer as the X client. - build-iso.sh: builds the live rootfs for the squashfs AND stages the clean rootfs archive into isofiles/install/ — the installer deploys the clean archive, so what's installed is the hardened system, never the live session with the installer in it. - Refactor: ARCLINE_LIVE handling removed from build-rootfs.sh and configure-system.sh (now lives entirely in build-live.sh). - validate.sh now checks overlays shell scripts + installer python. - docs updated (building.md, architecture.md, installer/README.md).
4.3 KiB
4.3 KiB
Arcline OS — architecture
This is the foundation ("the wires") for Arcline OS: a hardened, Debian-derived operating system for people who run infrastructure. The landing page describes the product; this repository is how it gets built.
Design goals
- Secure by default — hardened kernel, default-deny firewall, AppArmor, locked-down ssh. You opt in to exposure, never out.
- Zero telemetry — no phone-home, no analytics, no cloud integration.
- btrfs-native — snapshots and boot-to-snapshot rollback are built in.
- Production-ready from first boot — observability pre-configured, tools pre-installed, everything documented.
- Auditable — every script and config is plain text in this repo.
How a build flows
flowchart LR
A[editions/* metadata] --> B[debootstrap<br/>Debian trixie]
B --> C[install edition<br/>packages.list]
C --> D[apply overlays<br/>base + edition]
D --> E[configure-system.sh<br/>in chroot]
E --> F[rootfs .tar.xz]
F --> G[grub-mkrescue + squashfs<br/>→ live ISO]
E -.toolchain .debs.-> C
Pipeline stages live in scripts/:
| Stage | Script | What it does |
|---|---|---|
| bootstrap | build-rootfs.sh |
debootstrap minbase, apt sources, package install |
| overlay | apply-overlays.sh |
copies overlays/base + overlays/<edition> into the rootfs |
| configure | configure-system.sh |
runs in the chroot: hostname, locale, kernel cmdline, services, toolchain |
| live | build-live.sh |
clone clean rootfs → live session (live-boot + X + graphical installer) |
| package | build-iso.sh |
live rootfs → hybrid BIOS/UEFI ISO, plus the clean install archive |
| image | build-image.sh |
rootfs → bootable qcow2/raw disk image (via deploy-disk.sh) |
| deploy | deploy-disk.sh |
partition → btrfs layout → copy rootfs → GRUB + fstab (shared by image + installer) |
| install | install.sh |
scripted installer for a real disk (confirmation-gated) |
| GUI install | installer/arcline-installer |
GTK frontend booted by the live ISO (drives deploy-disk.sh) |
| orchestrate | build-edition.sh / Makefile |
wire the above to make iso-<edition> |
The source trees
| Path | Role |
|---|---|
editions/ |
per-edition manifests: package lists, kernel cmdline, fstab, metadata |
overlays/ |
files that land in the image, organised as layered rootfs trees |
scripts/ |
the build pipeline (all plain bash, readable top to bottom) |
btrfs/, toolchain/, tests/, ci/ |
supporting subsystems |
scripts/secureboot/ |
MOK key generation + boot-chain signing (optional) |
There is no hidden magic: the Makefile is a thin wrapper, versions.mk /
scripts/common.sh hold the single source of truth for versions and paths.
Zero telemetry, enforced
- No distro telemetry packages are installed (
ubuntu-report,popularity-contest, snapd are never in a package list). - apt automatic-update timers are masked in every edition's metadata.
- The firewall's output chain never initiates calls on its own.
- cloud-init is pointed only at the configured cloud datasource.
- The smoke tests (
tests/smoke/verify-rootfs.sh) fail the build if telemetry artifacts are found.
What "the wires" now covers
The four original follow-up items are implemented:
- Disk images —
make image-<edition>produces bootable qcow2/raw images; the cloud edition ships as a qcow2 by default. - Installer —
scripts/install.sh <device>installs to a real disk (explicit confirmation, reuses the deploy module). - Grafana/Loki/Promtail
.debs—make vendorpackages them so the full observability stack installs without upstream repos. - Secure boot — MOK-based signing (
scripts/secureboot/), off by default, enabled withARCLINE_SIGN=1. - Graphical installer — the live ISO now boots straight into a GTK
installer (
installer/arcline-installer) that drivesdeploy-disk.sh, instead of dropping to a tty.
Still on the horizon
- A signed Microsoft-KEK boot chain (only relevant for commercial distribution; the MOK path covers self-hosted use).
- ARM64 (
arm64) as a first-class arch (one-line change inversions.mk). - Boot-time verification tests for installed systems (the smoke tests cover the image contents, not a booted VM yet).