[Unit] Description=Wayland kiosk (weston desktop-shell + Chromium) Documentation=man:weston(1) man:weston.ini(5) # Take over tty1 from the login getty and start after the network is up (the # kiosk loads a URL). plymouth-quit lets the splash hand off cleanly. After=systemd-user-sessions.service plymouth-quit-wait.service getty@tty1.service network-online.target Wants=network-online.target Conflicts=getty@tty1.service [Service] Type=simple User=kiosk # A real PAM session on tty1 so logind assigns seat0 — weston needs a seat for # DRM master + libinput. Uses a DEDICATED PAM stack (/etc/pam.d/kiosk, see # files/kiosk/kiosk.pam) instead of "login": under STIG the login/system-auth # account phase (pam_faillock + password aging) rejects the passwordless kiosk # user, so the session never opened and getty kept tty1. The kiosk stack keeps a # full session (pam_systemd seat registration) but a permissive account phase. # (PAMName runs account/session, not auth.) XDG_SEAT/XDG_VTNR are set into the # PAM environment before pam_open_session so pam_systemd registers the session on # seat0/vt1 — WITHOUT them logind's auto-derivation failed and weston died with # "logind: failed to get session seat" -> "failed to create compositor backend". PAMName=kiosk Environment=XDG_SEAT=seat0 Environment=XDG_VTNR=1 TTYPath=/dev/tty1 TTYReset=yes TTYVHangup=yes TTYVTDisallocate=yes StandardInput=tty-fail StandardOutput=journal StandardError=journal UtmpIdentifier=tty1 UtmpMode=user EnvironmentFile=/etc/kiosk/kiosk.env # kiosk-session launches weston (foreground, owns the seat) + Chromium. weston # 8.0 (EPEL 9) lacks kiosk-shell.so/[autolaunch], so the wrapper does what those # would have — see kiosk-session and weston.ini. If weston dies, Restart=always # relaunches the whole stack; a Chromium-only crash is handled inside the wrapper. ExecStart=/usr/local/bin/kiosk-session Restart=always RestartSec=2 [Install] WantedBy=graphical.target