All checks were successful
Mirror to GitHub / mirror (push) Successful in 3s
Boot-critical (each confirmed with a real boot/install cycle, not just code review): - Live ISO's liveuser shell is zsh, but Hyprland autostart was written to .bash_profile (never runs) — moved to .zprofile, and switched to start-hyprland (Hyprland's own watchdog wrapper; raw `exec Hyprland` is no longer the recommended launch method). - copytoram (self-enables on most real hardware: non-optical boot + image < 4GiB + enough free RAM) unmounts /run/archiso/bootmnt, which unpackfs.conf and bos-copy-kernel both hardcoded as their source — broke the installer outright on real hardware, confirmed by forcing copytoram=y. Added a resolver step for unpackfs, and switched the kernel copy to /usr/lib/modules/$(uname -r)/vmlinuz (part of the live squashfs itself, unaffected by copytoram). - BIOS installs got no bootloader — post-install.sh only ever ran the UEFI grub-install path despite BOS shipping bios.syslinux. Added a BIOS branch with disk auto-detection. - @snapshots/@log/@cache were never real: iso/partition.conf's btrfsSubvolumes key isn't part of this Calamares version's partition module schema at all (same class of bug as the userShell fix below — silently ignored). Calamares only natively creates @ and @home. post-install.sh now creates the three subvolumes by hand after unpackfs, migrates existing /var/log + /var/cache content into them before mounting over, and adds the fstab entries — verified end to end on real hardware, including grub-btrfs generating bootable snapshot menu entries. The unmount step in the existing snapper create-config dance also gained retry + lazy-unmount fallback after a real chroot run hit a transient busy-mount race. - Default shell was bash instead of zsh post-install: users.conf's top-level `userShell` key isn't part of this Calamares version's users module schema either — the real key is nested (user.shell). - graphical-session.target ships RefuseManualStart=yes (systemd convention), so the earlier attempt to activate it from hyprland.lua silently failed and breadclipd (WantedBy=graphical-session.target) never started. Starts breadclipd.service directly instead. - /etc/os-release was never set (showed "Arch Linux"); live boot never had quiet/splash/plymouth wired in (raw kernel scroll the whole time) despite BOS already shipping a complete bread-logo+spinner plymouth theme for the installed system. Also: generalized build-local.sh's per-service skel baking (previously only breadd.service was hand-committed; breadbox-sync/breadmill/ breadclipd never shipped), added the four new bakery packages to BREAD_BINS, removed the redundant cliphist/fzf clipboard pipeline in favor of breadclip, mirrored fastfetch's bread-logo config into skel, and fixed a stale bos-update comment.
52 lines
2.3 KiB
Bash
52 lines
2.3 KiB
Bash
#!/bin/bash
|
|
# Create the unprivileged BOS live user and its Hyprland session.
|
|
#
|
|
# Hyprland refuses to run as root (superuser-privileges check), so the live
|
|
# session must run as a normal user. Calamares — which does need root — is
|
|
# launched onto the user's Wayland socket via passwordless sudo (see
|
|
# bos-launch-calamares). Runs once at boot, before the tty1 autologin getty.
|
|
set -e
|
|
|
|
# useradd -m copies /etc/skel, so the live user gets the real BOS desktop
|
|
# (breadd + breadbar + breadbox + keybinds) — proper live-media functionality,
|
|
# not an installer kiosk.
|
|
if ! id liveuser &>/dev/null; then
|
|
useradd -m -s /usr/bin/zsh liveuser
|
|
for g in wheel video input audio storage power; do
|
|
getent group "$g" >/dev/null 2>&1 && gpasswd -a liveuser "$g" >/dev/null || true
|
|
done
|
|
passwd -d liveuser >/dev/null
|
|
fi
|
|
|
|
# Layer the installer onto the live desktop: auto-launch it, and bind Super+I to
|
|
# relaunch it after it's been closed. Appended (in Lua) to the skel hyprland.lua
|
|
# native config so the full desktop stays intact.
|
|
HYPR=/home/liveuser/.config/hypr/hyprland.lua
|
|
install -d -m 0755 -o liveuser -g liveuser /home/liveuser/.config/hypr
|
|
if ! grep -q bos-launch-calamares "$HYPR" 2>/dev/null; then
|
|
cat >>"$HYPR" <<'EOF'
|
|
|
|
-- --- live-media installer (added by bos-live-setup; absent on installed system) ---
|
|
hl.bind("SUPER + I", hl.dsp.exec_cmd("bos-launch-calamares"))
|
|
hl.on("hyprland.start", function() hl.dispatch(hl.dsp.exec_cmd("bos-launch-calamares")) end)
|
|
EOF
|
|
fi
|
|
|
|
# Start Hyprland on tty1 login; capture output and fall back to a shell so a
|
|
# failed compositor start is visible rather than a blank looping cursor.
|
|
# liveuser's shell is zsh (see useradd above), which never sources
|
|
# .bash_profile — this must be .zprofile (zsh's login-shell hook) or it never
|
|
# runs at all and the live session boots to a bare console.
|
|
cat >/home/liveuser/.zprofile <<'EOF'
|
|
if [[ "$(tty)" == /dev/tty1 ]] && [[ -z "$WAYLAND_DISPLAY" ]]; then
|
|
export WLR_RENDERER_ALLOW_SOFTWARE=1
|
|
export WLR_NO_HARDWARE_CURSORS=1
|
|
# Log to a user-writable path (/var/log is root-only; redirecting there
|
|
# would fail and silently keep the compositor from ever launching).
|
|
start-hyprland &>/tmp/hyprland-live.log
|
|
echo "Hyprland exited (rc=$?). Log: /tmp/hyprland-live.log"
|
|
exec zsh -i
|
|
fi
|
|
EOF
|
|
|
|
chown -R liveuser:liveuser /home/liveuser
|