#!/usr/bin/bash set -eoux pipefail ############################################################################### # Transaction: Login-Stack (greetd + tuigreet-Fallback + Noctalia-Greeter) ############################################################################### # - greetd ist der Display-Manager (leicht, Wayland-nativ). # - noctalia-greeter (aus Terra, siehe 10-repos.sh) ist die Login-UI in # Noctalia-Optik. Braucht ZWINGEND greetd als Unterbau. # - tuigreet bleibt als sparsamer Fallback, falls der grafische Greeter # je streikt (in /etc/greetd/config.toml per Kommentar umschaltbar). ############################################################################### echo "Installing login stack (greetd + Noctalia greeter)..." # greetd + D-Bus + polkit sind harte Voraussetzungen des Noctalia-Greeters # (https://docs.noctalia.dev/greeter/installation/) und werden hier explizit # installiert statt von der Basis vorausgesetzt. dnf5 install -y \ --allowerasing \ greetd \ greetd-selinux \ dbus-daemon \ polkit \ tuigreet \ noctalia-greeter \ fprintd dnf5 clean all # Fingerprint (Framework u.a.): System-Auth per authselect erweitern, damit # sudo/Polkit/login-Pfade Finger anbieten (nach fprintd-enroll auf Hardware). # Greeter-PAM (/etc/pam.d/greetd) bewusst NICHT angefasst: Feinschliff erst # auf echter Hardware mit Reader testbar, kein VM-Test moeglich. authselect enable-feature with-fingerprint || echo "WARN: with-fingerprint nicht aktivierbar - auf Hardware pruefen" # accounts-daemon: liefert User-Avatare auf dem Login-Screen. systemctl enable accounts-daemon.service # Service-Account fuer die Greeter-Session. Weder greetd- noch Greeter-Paket # legen ihn verlaesslich an - ohne ihn stirbt greetd ("user not found"). # WICHTIG (bootc/altfiles): video/render existieren nur in /usr/lib/group # (read-only Image-Default). useradd -G scheitert daran ("group does not # exist"), weil es die Mitgliedschaft nicht nach /etc mergen kann. # systemd-sysusers ist das einzige Werkzeug, das den Split korrekt schreibt. # Build-Zeit (statt Erst-Boot): Eintrag ab Boot 1 vorhanden, kein Race. mkdir -p /usr/lib/sysusers.d cat > /usr/lib/sysusers.d/noctalia-greeter.conf <<'EOF' u greeter - "Greeter" - /usr/sbin/nologin m greeter video m greeter render EOF systemd-sysusers /usr/lib/sysusers.d/noctalia-greeter.conf id greeter # System-Setup des Greeters: richtet u.a. /etc/pam.d/greetd ein. # Pfad laut PACKAGING.md: share/noctalia-greeter/setup_greeter_system.sh if [[ -x /usr/share/noctalia-greeter/setup_greeter_system.sh ]]; then /usr/share/noctalia-greeter/setup_greeter_system.sh || true else echo "WARN: setup_greeter_system.sh nicht gefunden - Greeter-State wird erst beim Boot angelegt" fi # GNOME-Keyring beim Login still mit entsperren (wie GDM/SDDM). greetd # authentifiziert via PAM, daher kann pam_gnome_keyring das Login-Passwort # abgreifen und den "login"-Keyring oeffnen - ohne den Dialog # "Choose password for new keyring" bei der ersten Secrets-Anfrage. # Nach dem Greeter-Setup anhaengen (dessen PAM-Anpassungen bleiben vorn). if ! grep -q 'pam_gnome_keyring\.so' /etc/pam.d/greetd 2>/dev/null; then cat >> /etc/pam.d/greetd <<'EOF' auth optional pam_gnome_keyring.so session optional pam_gnome_keyring.so auto_start EOF fi # bootc-Hygiene: /var-Inhalte aus dem Build werden beim Deployment verworfen # und wuerden nur den var-tmpfiles-Lint triggern. Die /etc-Anteile des Setups # (PAM) bleiben erhalten; /var/lib/noctalia-greeter wird zur Laufzeit via # tmpfiles.d angelegt (Paket-eigen + unsere Seed-Regel). rm -rf /var/lib/noctalia-greeter # Terra nach der Installation wieder entfernen: Der Greeter ist das einzige # Paket von dort (includepkgs in 10-repos.sh), Updates kommen ueber # Image-Rebuilds (Atomic-Prinzip: kein dnf-Upgrade einzelner Pakete). # So sieht weder ein spaeterer Layer noch BIB-Depsolve noch das laufende # System das Dritt-Repo je wieder (keine CDN-Hickups, kein Shadowing). rm -f /etc/yum.repos.d/terra*.repo dnf5 clean all # Alte Display-Manager explizit aus (zwei DMs = Blackscreen). # Auf fedora-bootc-Basis existieren sie i.d.R. nicht -> Fehler tolerieren. systemctl disable sddm.service gdm.service lightdm.service 2>/dev/null || true systemctl enable greetd.service systemctl set-default graphical.target || true