Skip to main content

max / alloy

image: drop initial-setup now the installer creates the account It was here because the bootc Anaconda flow has no user-creation spoke, so an install otherwise finished with root locked and no way in. Keeping it alongside `alloy install` made things worse rather than redundant. Booting a configured install in QEMU, initial-setup took the console and blocked on an Anaconda text spoke reading "[!] User creation (No user will be created)" in front of a perfectly good uid 1000 account. It ships enabled in both graphical.target.wants and multi-user.target.wants, so every install would still land in an Anaconda prompt: the exact surface the installer exists to remove. Also drops the tty1 drop-in and the preset line, which were configuring a unit that is no longer installed.
Co-Authored-By
Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Author: Max Johnson <me@maxj.phd> · 2026-07-20 18:27 UTC
Signed with PGP, not checked
Commit: 56cd79b709c4cec65e275e435126e108d19a9984
Parent: da56cf5
3 files changed, +9 insertions, -33 deletions
M Containerfile +9 -8
@@ -206,14 +206,15 @@
206 206 # Greeter
207 207 greetd \
208 208 tuigreet \
209 - # First-boot account creation. The bootc Anaconda flow offers no
210 - # user-creation spoke, so without this an install completes with
211 - # root locked, greeter set to nologin, and no way to log in.
212 - # Deliberately NOT initial-setup-gui: with no GUI binary present
213 - # run-initial-setup takes the TUI branch, which is what Alloy
214 - # wants regardless of default.target being graphical.target.
215 - # Retired when the Alloy installer replaces Anaconda (GO task).
216 - initial-setup \
209 + # No initial-setup. It was here because the bootc Anaconda flow has no
210 + # user-creation spoke, so an install otherwise finished with root
211 + # locked and no way in. `alloy install` creates the account now, and
212 + # keeping it made things worse rather than redundant: it ships enabled
213 + # in both graphical.target.wants and multi-user.target.wants, and on
214 + # first boot it takes the console and blocks on an Anaconda text spoke
215 + # reading "[!] User creation (No user will be created)", in front of a
216 + # perfectly good uid 1000 account. Verified in QEMU 2026-07-20.
217 + # Removing it is what lets first boot reach greetd.
217 218 # Cursor, GTK theme
218 219 bibata-cursor-theme \
219 220 adw-gtk3-theme \
@@ -4,12 +4,6 @@
4 4 # units are enabled or disabled by default. Rationale for each entry:
5 5 #
6 6 # - greetd: boot lands on the tuigreet TUI on VT1.
7 - # - initial-setup: first-boot account creation. greetd carries
8 - # Alias=display-manager.service and initial-setup
9 - # declares Before=display-manager.service, so it runs
10 - # to completion before tuigreet takes the VT. It
11 - # disables itself once setup succeeds. Without it an
12 - # install has no loginable account at all.
13 7 # - tailscaled: opt-in only. Enrollment happens via `alloy tail`
14 8 # (see docs/CONTINUITY.md — Alloy does not phone home
15 9 # before the user says yes).
@@ -22,6 +16,5 @@
22 16 # a match fall through to /usr/lib/systemd/system-preset/ defaults.
23 17
24 18 enable greetd.service
25 - enable initial-setup.service
26 19
27 20 disable tailscaled.service
@@ -1,18 +1,0 @@
1 - # Put first-boot account creation on the console the user is looking at.
2 - #
3 - # Fedora's initial-setup.service sets TTYPath=/dev/tty7, and
4 - # run-initial-setup contains no chvt, so nothing switches the active VT
5 - # to it. After plymouth quits the console sits on tty1, which means the
6 - # account prompt renders to a VT nobody is watching and the machine
7 - # looks hung on a blank screen.
8 - #
9 - # tty1 is free at this point: initial-setup declares Before=getty-pre.target
10 - # so no getty has spawned, and greetd (Alias=display-manager.service,
11 - # Conflicts=getty@tty1.service) is held by Before=display-manager.service
12 - # until initial-setup exits.
13 - #
14 - # Revisit if initial-setup ever grows its own VT handling, and drop this
15 - # entirely when the Alloy installer replaces Anaconda.
16 -
17 - [Service]
18 - TTYPath=/dev/tty1