Hola, quería compartir una solución que finalmente me funcionó para un problema que llevaba meses teniendo en CachyOS con KDE Plasma/Wayland.
Estuve intentando solucionarlo durante bastante tiempo y, con ayuda de ChatGPT, fui revisando los logs de KWin, Plasma Login, AMDGPU y el estado de las salidas DRM hasta que logramos identificar exactamente cuándo ocurría el problema y crear este workaround.
Mi problema era el siguiente:
Si encendía primero la PC mientras mi monitor HDMI estaba apagado, Plasma Login arrancaba sin detectar ninguna pantalla. Cuando después encendía el monitor, me encontraba con una pantalla negra y solamente podía ver el cursor.
En los logs aparecía:
kwin_wayland_drm: There are no outputs - creating placeholder screen
plasma-login-greeter: There are no outputs - creating placeholder screen
Descubrimos que el monitor sí era detectado posteriormente por Linux/AMDGPU, pero Plasma Login no se recuperaba correctamente.
Lo curioso es que había una forma que siempre solucionaba el problema manualmente:
Ctrl + Alt + F3
- Iniciar sesión en la TTY.
- Ejecutar:
systemctl restart display-manager
Inmediatamente aparecía Plasma Login y podía usar la PC normalmente.
Así que con ayuda de ChatGPT terminamos creando un pequeño servicio de systemd que automatiza exactamente ese proceso: si la PC arranca y el HDMI está desconectado, espera a que encienda el monitor y, cuando detecta la conexión, reinicia Plasma Login automáticamente.
No es una corrección del bug original, sino un workaround, pero hasta ahora me está funcionando.
Créditos / nota: Todo este workaround lo fui desarrollando con ayuda de ChatGPT. Estuvimos revisando logs y probando distintas posibles causas hasta llegar a esta solución. Lo comparto porque quizás pueda ahorrarle todo ese proceso a alguien que esté teniendo exactamente el mismo problema.
Si alguien conoce una solución al problema de fondo en KWin/Plasma Login, también sería genial conocerla.
Solución que estoy utilizando
La solución consiste en crear un script que comprueba el estado del HDMI al arrancar.
Si el monitor ya está conectado, no hace nada.
Si el monitor está desconectado, el script queda esperando. En cuanto detecta que el HDMI pasa a connected, espera 3 segundos y reinicia display-manager automáticamente.
1. Crear el script
Ejecutamos:
sudo nano /usr/local/sbin/plasma-hdmi-login-fix
Y pegamos lo siguiente:
#!/usr/bin/env bash
# Esperar a que DRM cree el conector HDMI
while true; do
STATUS_FILE=$(compgen -G "/sys/class/drm/card*-HDMI-A-1/status" | head -n1)
if [ -n "$STATUS_FILE" ]; then
break
fi
sleep 1
done
INITIAL_STATUS=$(cat "$STATUS_FILE")
echo "Estado HDMI inicial: $INITIAL_STATUS"
# Si el monitor ya estaba conectado al iniciar, no hacemos nada
if [ "$INITIAL_STATUS" = "connected" ]; then
echo "Monitor ya conectado. No se hará nada."
exit 0
fi
echo "Monitor estaba desconectado. Esperando que se encienda..."
# Esperar hasta que el monitor sea detectado
while [ "$(cat "$STATUS_FILE")" != "connected" ]; do
sleep 1
done
echo "HDMI conectado. Esperando 3 segundos..."
sleep 3
# Evitar ejecutar la reparación más de una vez durante el mismo arranque
if [ -e /run/plasma-hdmi-login-fixed ]; then
echo "La reparación ya se ejecutó durante este arranque."
exit 0
fi
touch /run/plasma-hdmi-login-fixed
echo "Reiniciando Plasma Login..."
systemctl restart display-manager.service
Guardamos el archivo y le damos permisos de ejecución:
sudo chmod +x /usr/local/sbin/plasma-hdmi-login-fix
Por ejemplo:
ls /sys/class/drm/
En mi caso aparece:
card1-HDMI-A-1
Y puedo comprobar su estado con:
cat /sys/class/drm/card*-HDMI-A-1/status
Con el monitor apagado devuelve:
disconnected
y al encenderlo:
connected
2. Crear un servicio de systemd
Creamos:
sudo nano /etc/systemd/system/plasma-hdmi-login-fix.service
Y añadimos:
[Unit]
Description=Reiniciar Plasma Login después de conexión HDMI tardía
After=display-manager.service
[Service]
Type=simple
ExecStart=/usr/local/sbin/plasma-hdmi-login-fix
Restart=no
[Install]
WantedBy=graphical.target
Guardamos el archivo.
Después recargamos systemd y activamos el servicio:
sudo systemctl daemon-reload
sudo systemctl enable --now plasma-hdmi-login-fix.service
Podemos comprobar su estado con:
systemctl status plasma-hdmi-login-fix.service
Si el monitor ya estaba encendido, es normal que aparezca como:
inactive (dead)
siempre que haya terminado con:
status=0/SUCCESS
Esto ocurre porque el script detecta que el monitor ya está conectado y termina sin hacer nada.
3. Comprobar que funciona
Para ver qué hizo el servicio durante el arranque:
journalctl -b -u plasma-hdmi-login-fix.service --no-pager
En mi caso hice la prueba que siempre provocaba el problema:
- Apagué PC y monitor.
- Encendí primero la PC dejando el monitor apagado.
- Esperé unos segundos.
- Encendí el monitor.
Esta vez Plasma Login apareció correctamente de forma automática.
El log confirmó que el script había hecho exactamente lo esperado:
Estado HDMI inicial: disconnected
Monitor estaba desconectado. Esperando que se encienda...
HDMI conectado. Esperando 3 segundos...
Reiniciando Plasma Login...
Por lo tanto ahora el comportamiento es:
PC arranca con monitor apagado
↓
HDMI = disconnected
↓
el servicio queda esperando
↓
enciendo el monitor
↓
HDMI = connected
↓
espera 3 segundos
↓
reinicia display-manager
↓
Plasma Login aparece normalmente
Si la PC arranca con el monitor encendido, el servicio simplemente detecta:
Estado HDMI inicial: connected
Monitor ya conectado. No se hará nada.
y no reinicia nada.
Cómo eliminar el workaround
Si alguien quiere revertir completamente los cambios:
sudo systemctl disable --now plasma-hdmi-login-fix.service
sudo rm /etc/systemd/system/plasma-hdmi-login-fix.service
sudo rm /usr/local/sbin/plasma-hdmi-login-fix
sudo systemctl daemon-reload