Skip to content

Releases: armbian/configng

26.2.0-trunk.832.0502.212243

02 May 21:23
1f79bca

Choose a tag to compare

ci/maintenance-unit-tests: stop+rm long-up named test-service containers

Tests that exercise module_postgres / module_redis / module_immich
(and friends) spawn long-running service containers — postgres,
postgres-immich, mysql, redis — and only call `remove` if the test
reaches that stage. An interrupted test (or one that only does
install) leaves them wedged on the runner; the diagnostic step on
this branch's first run showed postgres-immich and mysql with
'Up 7 days', and a `postgres` container in 'Created' state for 8h
because its 5432 publish was held by the older one.

Add a second cleanup block to both diagnostic steps, ahead of the
orphaned-Created sweep, that stop+rm's exactly these four names if
they have been *running for more than 2 hours*. The threshold is
the safety knob: native job timeout-minutes is 90, emulated 210
(3.5h), so 2h sits comfortably below "test still in flight" and
well above "leftover from a prior run". Anything younger is left
alone — the next slot's start will pick it up if needed.

Implementation:

  * Names are exact-match anchored ('^name$') so a future sibling
    like 'mysql-readonly' or 'postgres-staging' isn't caught.
  * Stopped / Created containers are deliberately skipped here —
    the orphaned-Created sweep below uses the bare-hash filter
    and handles them safely.
  * Uptime via 'docker inspect ... .State.StartedAt' → 'date -d'
    → epoch math. GNU date is standard on Linux runners.
  * 'docker stop --time 30' gives postgres / mysql a chance to
    flush the WAL before SIGKILL; '|| true' on each docker call
    so a transient hiccup doesn't fail the test slot.
  * Output is one line per name ('absent', 'recent <2h (skip)',
    'stopped (skip — orphan sweep handles below)', or
    'stop+rm: <name> (up Xh)') so the GHA log shows exactly which
    containers were touched and why.

Runs *before* the orphaned-Created sweep so a freshly-stopped
service isn't briefly seen as orphan in the same pass.

Same block in both gradle-native and gradle-emulated diagnostic
steps so the cleanup fires on both runner hosts (the arm64 host
is only seen by native; the amd64 host is seen by both).

26.2.0-trunk.832.0502.205256

02 May 20:53

Choose a tag to compare

ci/maintenance-unit-tests: clean orphaned 'Created' containers

Replace the placeholder comment in both diagnostic steps with a
narrow cleanup: containers in 'Created' state whose Image column
is a bare 12-char hex ID (no repo:tag). These are leftovers from
prior runs where the underlying image was already removed but the
container record stayed wedged. The arm64 self-hosted runner had
12 of them visible in the first diagnostic run, oldest 2 months.

Pattern:

    docker ps -a --filter 'status=created' \
        --format '{{.ID}} {{.Image}}' \
      | awk '$2 ~ /^[0-9a-f]{12}$/ { print $1 }' \
      | xargs -r docker rm

Tagged-image-but-'Created' containers are deliberately not in
scope. The runner host also runs the operator's home services
(postgres-immich, mysql, wireguard, openssh-server, swag) and a
'Created' state with a tagged image can be a mid-'docker create'
in flight on those — only the bare-hash form is unambiguously
orphan.

xargs -r no-ops on empty input so the step doesn't error when
there's nothing to clean; '|| true' so a transient docker hiccup
on the host doesn't fail the test slot.

Other cleanups deliberately not added here:

  * ghcr.io/armbian/repository-update:*-<arch> images that aren't
    in use — would race sibling matrix slots that still need them
    mid-run. Belongs in the 'stop' job once it lands.
  * 62 GB of dangling volumes per the diagnostic — too risky to
    auto-prune; the operator needs to spot-check the mountpoints
    before running 'docker volume prune'. Manual one-off.

Both gradle-native and gradle-emulated diagnostic steps get the
same cleanup so the arm64 host (only seen by native) and the
amd64 host (seen by both) both have orphans removed.

26.2.0-trunk.831.0502.154013

02 May 15:40

Choose a tag to compare

`Automatic` documentation update

26.2.0-trunk.831.0502.152506

02 May 15:25

Choose a tag to compare

desktops/bianbu: purge gnome-initial-setup after install

Bianbu's GNOME stack pulls gnome-initial-setup as a dependency, which
makes the GNOME first-run "Welcome" wizard run on first GUI boot,
prompting the user to create an account / pick locale / sign into a
GNOME Online Account. Armbian images already do their own first-boot
setup via the firstrun service (account, locale, keyboard, network),
so the GNOME wizard is redundant and lands the user in a confusing
two-prompts-for-the-same-thing experience.

Add gnome-initial-setup to bianbu.yaml's minimal-tier
packages_uninstall list. The list is already wired end-to-end:

  parse_desktop_yaml.py:296   collects per-tier packages_uninstall
  parse_desktop_yaml.py:319   emits DESKTOP_PACKAGES_UNINSTALL
  module_desktops.sh:657      pkg_remove $DESKTOP_PACKAGES_UNINSTALL
                              (autopurge — also drops orphaned deps)

Runs in build mode too: the purge is part of the install action,
not the postinst (the latter is skipped under CI/container env).
The 2>/dev/null || true at the call site keeps a missing
gnome-initial-setup from failing the install — for any future
release where Bianbu drops the dep, this entry becomes a no-op
rather than a regression.

26.2.0-trunk.831.0502.123706

02 May 12:37

Choose a tag to compare

desktops/bianbu: re-enable systemd suspend on K1

SpacemiT's stock Bianbu image ships a /etc/systemd/sleep.conf with
`AllowSuspend=no`, so on a freshly installed Bianbu desktop the
GNOME suspend menu entry, `systemctl suspend`, and the lid-close
action all fail with:

    Call to Suspend failed: Sleep verb 'suspend' is disabled by config

Suspend actually works on shipped K1 boards (verified on Musebook)
— SpacemiT just gates it off, presumably to avoid edge-case
resume failures on boards / firmware revisions where it isn't yet
solid. For users running the Armbian Bianbu build the desktop UX
expectation is that the suspend button does something, so drop a
sleep.conf.d/ override re-enabling it.

The override goes into /etc/systemd/sleep.conf.d/ rather than
modifying the SpacemiT-shipped /etc/systemd/sleep.conf so an
upgrade of the bianbu-* package set won't undo it, and so a user
who hits resume problems on a different K1 board can simply remove
the single drop-in to fall back to SpacemiT's default behaviour.

No daemon-reload is issued — logind re-reads sleep.conf on each
suspend call, so the override is live on first boot regardless,
and skipping the reload avoids disturbing running units in the
chrooted build-time environment where this postinst also runs.

26.2.0-trunk.831.0502.115510

02 May 11:55

Choose a tag to compare

desktops: pass --allow-downgrades on pinned package install

Bianbu image build (armbian/os run 25250450338) failed at the
chrooted `module_desktops install de=bianbu tier=mid mode=build`
call with:

    The following packages will be DOWNGRADED:
       libdrm-common libdrm2
    E: Packages were downgraded and -y was used without --allow-downgrades.
    Error: bianbu package install failed; aborting before any system state is changed

The downgrade is exactly what bianbu.yaml's per-package APT pin asks
for — priority 1001 against archive.spacemit.com pulls Bianbu's
older `libdrm2 / libdrm-common` over the distro's newer ones so the
whole Mesa stack stays on the SpacemiT BSP version. apt resolves
correctly; it just refuses to act with `-y` alone because the result
includes downgrades, by design.

Add `--allow-downgrades` to the three desktop pkg_install call sites
that run with the per-DE pin in effect:

  - module_desktops.sh: main DESKTOP_PACKAGES install
  - module_desktops.sh: display-manager install
  - module_desktops.sh: tier-upgrade install (set-tier path; pin still
    in place during cross-tier package adds)

The flag is a no-op for DEs whose YAML carries no pin (apt only
resolves to a downgrade when explicitly directed to), so this is
scoped to the install path that benefits without touching pkg_install
itself or any other apt user.

Skipped: the armbian-plymouth-theme install on the live-system path
(specific Armbian-archive package, no pin-driven downgrade scenario)
and the global `_module_desktops_write_apt_pin` path which targets
apt.armbian.com snap-shim packages (the existing 1001 priority on
that pin already requires --allow-downgrades de facto, but that pin
has been working as-is for years — it acts on packages where the
distro version is a stub, not a real older build, so apt's resolution
doesn't classify the swap as a downgrade).

26.2.0-trunk.831.0502.103927

02 May 10:39

Choose a tag to compare

desktops: detect installed DE via marker file, add Bianbu menu entries

`module_desktops status de=<X>` is the gate every Desktops submenu
entry runs to decide whether to show its "Uninstall / Disable login /
Change tier" actions. The check was a plain
`dpkg -l "$DESKTOP_PRIMARY_PKG" | grep ^ii`, which misfires whenever
two desktops share a primary-tier package — most notably on a Bianbu
install, where bianbu-desktop-minimal-en pulls gnome-session as a
dependency. The Desktops menu would then offer "Uninstall GNOME" and
"Change GNOME to full" while the actual installed DE is Bianbu, and
clicking them would tear down packages Bianbu owns.

Three coupled changes, since fixing detection without also rounding
out the Bianbu menu would leave a Bianbu user with an empty submenu
and only a single mid-tier install entry where every other DE
exposes minimal/mid/full:

1. Introduce _module_desktops_is_installed and route the three
   status callers (status, tier, at-tier) through it. Three layers,
   falling through in order:

     a. /etc/armbian/desktop/<de>.tier exists → installed.
        Authoritative because install/remove maintain the marker.
     b. A different DE has its marker present → not installed. The
        other DE's marker is the tiebreaker against the dpkg
        fallback when desktops share packages.
     c. No markers anywhere AND DESKTOP_PRIMARY_PKG is dpkg-installed
        → legacy installs that pre-date the marker convention or
        were done with apt directly.

2. Add the standard six management entries for Bianbu in
   config.system.json (Uninstall, autologin on/off, tier
   minimal/mid/full), gated on `module_desktops status de=bianbu`,
   so the submenu has actual options once the GNOME entries
   correctly hide. IDs allocated as BIAN02/03/04/07/08/09 to match
   the slot numbers used by the other DEs.

3. Bring Bianbu's install entries in line with the rest of the menu:
   BIAN01 was the only Bianbu install slot and was misnamed —
   labelled "Install Bianbu" with tier=mid, where every other DE's
   slot 01 is minimal. Repoint BIAN01 to tier=minimal and add BIAN05
   (mid) and BIAN06 (full) so the user sees the full minimal/mid/full
   choice on a clean install instead of just one entry.

26.2.0-trunk.797.0424.134951

24 Apr 13:50

Choose a tag to compare

`Automatic` documentation update

26.2.0-trunk.797.0424.130907

24 Apr 13:09

Choose a tag to compare

config.system: add Bianbu to the desktop install menu

bianbu has a complete YAML definition under
tools/modules/desktops/yaml/bianbu.yaml (SpacemiT K1 RISC-V
desktop, riscv64 on noble/resolute, pinned SpacemiT archive)
and wires up through module_desktops install like every other
DE. But the DE install menu is populated from hardcoded entries
in tools/json/config.system.json, and bianbu was simply never
added — so on a riscv64 image there was no way to reach it from
armbian-config.

Add a single-tier entry (tier=mid — full DE + bianbu-standard +
k1x-cam, the intended out-of-box experience) alongside the other
community DEs (kde-neon/budgie/deepin/enlightenment). The
`module_desktop_supported bianbu` condition already gates on the
YAML's architectures list, so the entry auto-hides everywhere
except riscv64 noble/resolute.

26.2.0-trunk.797.0424.105535

24 Apr 10:55

Choose a tag to compare

desktops: install libv4l-0 before rockchip-multimedia packages

rockchip-multimedia-config's postinst expects the V4L2 userspace library to
already be present. Mirror the ordering from armbian/build's
extensions/mesa-vpu.sh by doing a separate pkg_install of libv4l-0 between
pkg_update and the rockchip-multimedia-* batch, inside the existing
noble/rk3588/vendor gate in _module_desktops_rockchip_multimedia.