2026-09-25 23:30:29 -08:00
|
|
|
# quine-linux
|
|
|
|
|
|
2026-09-25 23:31:23 -08:00
|
|
|
Quine distro of Linux based on uBlue Aurora
|
2026-09-25 23:30:29 -08:00
|
|
|
|
2026-09-26 01:04:59 -08:00
|
|
|
## Building
|
2026-09-25 23:30:29 -08:00
|
|
|
|
2026-10-30 05:40:01 -08:00
|
|
|
The image is built in two repos:
|
2026-09-28 00:47:44 -08:00
|
|
|
|
2026-10-30 05:40:01 -08:00
|
|
|
- **[`quine-global-labs/aurora`](https://forge.quinefoundation.com/quine-global-labs/aurora)**,
|
|
|
|
|
our fork of [Aurora](https://github.com/ublue-os/aurora). Its workflow
|
|
|
|
|
builds it with Aurora's own `just build` and publishes it as
|
|
|
|
|
`forge.quinefoundation.com/quine-global-labs/aurora:stable`. Changes that
|
|
|
|
|
have to happen *inside* Aurora's build (its package set, build scripts,
|
|
|
|
|
the Kinoite base it starts from) go there, as commits on the fork.
|
|
|
|
|
- **This repo's `Containerfile`**, which builds the quine-linux bootc image
|
|
|
|
|
on top of that, layering in everything under `overlay/`, plus a
|
2026-09-28 00:47:44 -08:00
|
|
|
`kmod-builder` stage that compiles the CS8409 mic-fix kernel module (see
|
|
|
|
|
[Hardware-specific patches](#hardware-specific-patches) below). Anything a
|
2026-10-30 05:40:01 -08:00
|
|
|
`RUN` step on top of Aurora can do belongs here, not in the fork. Its
|
2026-10-31 04:11:12 -08:00
|
|
|
workflow publishes `forge.quinefoundation.com/quine-global-labs/quine-linux`,
|
2026-11-02 04:19:24 -09:00
|
|
|
and the live ISO and disk image (to MinIO). Installed systems pull and
|
|
|
|
|
update from the same image as `registry.quineglobal.com/quine-linux`, a
|
|
|
|
|
pull-only name for it (Taskfile.yml's `UPDATE_IMAGE`).
|
2026-09-28 00:47:44 -08:00
|
|
|
|
2026-10-31 04:11:12 -08:00
|
|
|
Like Aurora, there's one installer: the live ISO's. There's no separate
|
|
|
|
|
install ISO.
|
2026-09-26 01:25:14 -08:00
|
|
|
|
|
|
|
|
[`Taskfile.yml`](Taskfile.yml) (requires [`task`](https://taskfile.dev)) is
|
|
|
|
|
the supported way to drive all of this — run `task` with no arguments to
|
|
|
|
|
list what's available. Notably:
|
|
|
|
|
|
2026-10-30 05:40:01 -08:00
|
|
|
- `task build-image` — builds the image on our published Aurora. To build
|
|
|
|
|
on stock upstream Aurora instead, pass
|
|
|
|
|
`BASE_IMAGE=ghcr.io/ublue-os/aurora:stable`; on a local build of the fork,
|
|
|
|
|
`BASE_IMAGE=localhost/aurora:stable`. Builds locally, as root, with podman, or
|
2026-09-27 02:41:52 -08:00
|
|
|
docker if podman isn't installed (force either with
|
|
|
|
|
`CONTAINER_RUNTIME=docker|podman`). Every task below works with either;
|
|
|
|
|
under docker, images are copied via skopeo into a
|
|
|
|
|
`quine-containers-storage` volume for `bootc-image-builder` to read.
|
2026-10-31 01:48:11 -08:00
|
|
|
- `task build-disk-image` — builds a ready-installed disk image (qcow2)
|
|
|
|
|
via `bootc-image-builder`, landing in `output/qcow2/disk.qcow2`. It has
|
|
|
|
|
no user: plasma-setup creates the first one at first boot.
|
|
|
|
|
- `task build-live-iso` — builds a live ISO (`live/`, after Aurora's):
|
|
|
|
|
boots into a Quine Linux session with Anaconda WebUI to install it,
|
|
|
|
|
landing in `output/live/Quine-Linux-Live.iso`. Podman only.
|
2026-09-26 01:25:14 -08:00
|
|
|
- `task test:stage` / `task test:boot` — stage the locally-built image as
|
|
|
|
|
this machine's next boot target (`bootc switch`), optionally rebooting
|
|
|
|
|
into it immediately. The fast way to test a change — especially the
|
|
|
|
|
kernel module — against the real running system, without building an ISO
|
|
|
|
|
or reinstalling anything.
|
|
|
|
|
- `task revert` — rolls back to the previously-booted deployment and
|
|
|
|
|
reboots, undoing a `test:boot` switch (or any other deployment change) if
|
|
|
|
|
something's wrong.
|
|
|
|
|
|
|
|
|
|
Equivalently, by hand:
|
2026-09-25 23:30:29 -08:00
|
|
|
|
|
|
|
|
```sh
|
2026-09-28 00:47:44 -08:00
|
|
|
sudo podman build -t quine-linux -f Containerfile .
|
2026-09-25 23:30:29 -08:00
|
|
|
```
|
|
|
|
|
|
2026-10-30 05:40:01 -08:00
|
|
|
To build the Aurora fork yourself (Linux, with buildah, cpp, just >= 1.46,
|
|
|
|
|
skopeo, jq, yq and cosign), in a clone of `quine-global-labs/aurora`:
|
|
|
|
|
|
|
|
|
|
```sh
|
|
|
|
|
sudo just build --image aurora --tag stable --flavor main # -> localhost/aurora:stable
|
|
|
|
|
```
|
|
|
|
|
|
2026-09-27 02:41:52 -08:00
|
|
|
An ISO can then be generated from the built image with `bootc-image-builder`
|
|
|
|
|
(`ghcr.io/osbuild/bootc-image-builder`; the project now lives in
|
|
|
|
|
[osbuild/image-builder](https://github.com/osbuild/image-builder), and the old
|
|
|
|
|
`quay.io/centos-bootc/bootc-image-builder` image is no longer updated).
|
2026-09-25 23:30:29 -08:00
|
|
|
|
2026-09-25 23:36:22 -08:00
|
|
|
## overlay/
|
|
|
|
|
|
2026-09-26 01:04:59 -08:00
|
|
|
Files here mirror their path on the root filesystem and are baked into the
|
|
|
|
|
image via `COPY overlay/ /` in the Containerfile.
|
2026-09-25 23:36:22 -08:00
|
|
|
|
2026-09-26 01:04:59 -08:00
|
|
|
- `overlay/etc/...` — local/admin config. On the ostree-based image, content
|
|
|
|
|
shipped here becomes the default `/etc` and is still locally overridable
|
|
|
|
|
(3-way merged on upgrade), same as any package-installed `/etc` file.
|
|
|
|
|
- `overlay/usr/lib/systemd/...` — vendor-shipped units. `/usr` is replaced
|
|
|
|
|
wholesale on each image build/upgrade, so anything here always matches the
|
|
|
|
|
image and isn't meant to be hand-edited on a running system.
|
2026-09-25 23:36:22 -08:00
|
|
|
|
|
|
|
|
### overlay/etc/gitconfig
|
|
|
|
|
|
|
|
|
|
System-wide git config so every user on the box gets `main` as the default
|
|
|
|
|
init branch, not `master`.
|
|
|
|
|
|
2026-09-26 01:04:59 -08:00
|
|
|
### overlay/etc/systemd/system/rpm-ostree-cleanup.{service,timer}
|
|
|
|
|
|
|
|
|
|
Weekly, runs as root via systemd (not cron/sudoers): `rpm-ostree cleanup -rb`
|
|
|
|
|
(drops rollback deployment and any pending deployment). Enabled at build time
|
|
|
|
|
via `RUN systemctl enable` in the Containerfile.
|
|
|
|
|
|
|
|
|
|
### overlay/etc/systemd/journald.conf.d/size-cap.conf
|
2026-09-25 23:30:29 -08:00
|
|
|
|
|
|
|
|
Continuous 500M journal retention cap instead of a periodic vacuum job.
|
|
|
|
|
|
2026-09-26 01:04:59 -08:00
|
|
|
### overlay/usr/lib/systemd/user/disk-cleanup.{service,timer}
|
|
|
|
|
|
|
|
|
|
Weekly, runs as the user, no privilege needed: `podman system prune -af`,
|
|
|
|
|
`flatpak uninstall --unused -y`, clears `~/.cache`. Auto-enabled for every
|
|
|
|
|
user via `overlay/usr/lib/systemd/user-preset/90-quine-linux.preset` — no
|
|
|
|
|
manual `systemctl --user enable` needed.
|
2026-09-26 01:25:14 -08:00
|
|
|
|
|
|
|
|
### overlay/etc/systemd/system/cs8409-intmike-power-fixup.service
|
|
|
|
|
|
|
|
|
|
Hardware-specific fixup for the iMac19,2 internal mic (see below).
|
|
|
|
|
|
|
|
|
|
## Hardware-specific patches
|
|
|
|
|
|
|
|
|
|
`docs/` and `patches/` hold write-ups and out-of-tree kernel module patches
|
|
|
|
|
for hardware quirks on the machines this image runs on, that don't fit
|
|
|
|
|
anywhere else in this repo:
|
|
|
|
|
|
|
|
|
|
- [`docs/imac19-2-mic-fix.md`](docs/imac19-2-mic-fix.md) — the internal mic
|
|
|
|
|
on iMac19,2 capturing near-silence despite maxed gain; root cause, fix,
|
|
|
|
|
and current verification status.
|
|
|
|
|
- `patches/snd-hda-codec-cs8409/` — the vendored driver source and patch
|
|
|
|
|
backing that fix, built into `Containerfile`'s `kmod-builder` stage.
|
2026-09-29 23:19:34 -08:00
|
|
|
- [`docs/imac19-2-speaker-fix.md`](docs/imac19-2-speaker-fix.md) — the
|
|
|
|
|
internal speakers on iMac19,2 producing no sound at all; investigation and
|
|
|
|
|
prior-art writeup, no fix packaged yet.
|
|
|
|
|
|
|
|
|
|
## Software fork directions
|
|
|
|
|
|
|
|
|
|
Write-ups of problems found on this image that point at a fork/patch of an
|
|
|
|
|
upstream project, kept here before anyone's had time to act on them:
|
|
|
|
|
|
|
|
|
|
- [`docs/chromium-dbus-singleton-activation.md`](docs/chromium-dbus-singleton-activation.md)
|
|
|
|
|
— not started: Chromium lacks D-Bus activation, so KDE + Flatpak can't
|
|
|
|
|
dedupe a slow-starting launch, and repeated launcher clicks stack up full
|
|
|
|
|
duplicate browser instances instead of forwarding to the existing one.
|