feat: migrate from SDDM to greetd+tuigreet

- Add greetd role with tuigreet greeter (3 packages, 4.9MB)
- Replace SDDM as display-manager.service with greetd
- Add ADR 0003 documenting migration rationale
- Rename hyprland task: "register session in SDDM" -> "register
  Wayland session desktop entry"
- Add display_manager variables to vars/main.yml
- Add greetd role to workstation.yml
- Update setup.md timestamp
This commit is contained in:
ja
2026-05-20 12:51:25 +02:00
parent 1274b3e2cb
commit 9d06a71f71
8 changed files with 147 additions and 2 deletions
+4
View File
@@ -0,0 +1,4 @@
---
- name: restart greetd
command: systemctl restart greetd
become: yes
+28
View File
@@ -0,0 +1,28 @@
---
- name: Greetd - install packages
pacman:
name:
- "{{ display_manager_package }}"
- "{{ display_manager_greeter }}"
state: present
update_cache: yes
tags: [greetd, packages]
- name: Greetd - configure tuigreet to launch Hyprland
template:
src: config.toml.j2
dest: "{{ display_manager_config }}"
owner: root
group: root
mode: '0644'
notify: restart greetd
tags: [greetd, config]
- name: Greetd - ensure enabled as display manager
file:
src: /usr/lib/systemd/system/greetd.service
dest: /etc/systemd/system/display-manager.service
state: link
force: yes
notify: restart greetd
tags: [greetd, service]
@@ -0,0 +1,8 @@
[terminal]
# The VT to run the greeter on
vt = 1
# Default session: tuigreet greeter
[default_session]
command = "tuigreet --time --remember --asterisks --cmd {{ hyprland_cmd | default('Hyprland') }}"
user = "greeter"
+1 -1
View File
@@ -44,7 +44,7 @@
notify: rebuild initramfs notify: rebuild initramfs
tags: [hyprland, nvidia] tags: [hyprland, nvidia]
- name: Hyprland - register session in SDDM - name: Hyprland - register Wayland session desktop entry
copy: copy:
dest: /usr/share/wayland-sessions/hyprland.desktop dest: /usr/share/wayland-sessions/hyprland.desktop
content: | content: |
+8
View File
@@ -65,3 +65,11 @@ hyprland_packages:
- egl-wayland - egl-wayland
- qt5-wayland - qt5-wayland
- qt6-wayland - qt6-wayland
# ---------------------------------------------------------------------------
# greetd role: display manager - minimal TUI greeter for Wayland
# Replaced SDDM (2026-05-20) - see docs/adr/0003-sddm-to-greetd.md
# ---------------------------------------------------------------------------
display_manager_package: greetd
display_manager_greeter: greetd-tuigreet
display_manager_config: /etc/greetd/config.toml
+2
View File
@@ -16,3 +16,5 @@
- maintenance - maintenance
- role: hyprland - role: hyprland
tags: [hyprland] tags: [hyprland]
- role: greetd
tags: [greetd]
+95
View File
@@ -0,0 +1,95 @@
---
description: >-
Replace SDDM (Qt-based graphical display manager) with greetd + tuigreet
for a minimal, Wayland-first login experience with zero heavy GUI dependencies.
status: accepted
date: 2026-05-20
replaces: SDDM as display-manager.service
---
# 0003: SDDM to greetd Migration
## Context
The workstation uses Hyprland as the primary Wayland compositor. SDDM was
pulled in as the display manager with significant Qt dependencies (~50+
transitive packages). For a single-user dev workstation running Hyprland,
this is unnecessary overhead — heavy, slow-booting, and over-engineered for
the use case.
SDDM provides: graphical login prompt, session selection, PAM authentication.
All three can be achieved with far lighter tools.
## Decision
Migrate from SDDM to greetd + tuigreet.
- **greetd**: minimal display manager daemon, designed for Wayland first-class.
- **tuigreet**: TUI greeter with time display, user remembering, session
discovery from `/usr/share/wayland-sessions/` and `/usr/share/xsessions/`.
### What changed
| Before | After |
|--------|-------|
| sddm.service (display-manager) | greetd.service (display-manager) |
| Qt5/Qt6 dependency chain | greetd + greetd-tuigreet (3 packages, 4.9MB) |
| /etc/sddm.conf | /etc/greetd/config.toml |
| Graphical login screen | Text-based TUI login screen |
| Heavy PAM surface | Standard PAM chain (system-local-login) |
### Ansible changes
- Added `greetd` role: installs packages, configures config.toml from template,
enables greetd as display-manager.service
- Hyprland task renamed: "register session in SDDM" -> "register Wayland session
desktop entry" (no functional change, just accurate naming)
- vars/main.yml: added `display_manager_package`, `display_manager_greeter`,
`display_manager_config` variables
### Configuration
```toml
[terminal]
vt = 1
[default_session]
command = "tuigreet --time --remember --asterisks --cmd Hyprland"
user = "greeter"
```
### Rationale
1. **Wayland-native**: greetd handles Wayland sessions cleanly without X
compatibility layers
2. **Minimal**: 3 packages vs Qt dependency chain; <5MB vs ~500MB
3. **Maintained**: Rust codebase, clean TOML config, Arch repos (no AUR)
4. **AI-agent friendly**: TOML config is trivially parseable/modifiable;
clean systemd service with structured journalctl output
5. **Simplicity principle**: maximizes work not done
## Consequences
### Positive
- Faster boot (no Qt/Xorg init)
- Smaller attack surface
- Less disk usage
- No Qt dependencies to maintain
- Clean systemd service management
### Negative
- No graphical login (only a limitation if multi-user GUI switching is needed)
- SDDM themes not available (not a requirement for this workstation)
- Tuigreet has fewer visual customization options
### Migration path back
```bash
sudo systemctl disable greetd
sudo systemctl enable sddm
sudo ln -sf /usr/lib/systemd/system/sddm.service /etc/systemd/system/display-manager.service
```
Reversible with zero data loss — the hyprland.desktop session entry is
unchanged and works with both DMs.
+1 -1
View File
@@ -5,7 +5,7 @@ tags:
- setup - setup
- bootstrap - bootstrap
- ansible - ansible
last_updated: '2026-05-18' last_updated: '2026-05-20'
--- ---
# Workstation Setup Guide # Workstation Setup Guide