Problema
Muchos usuarios de Linux utilizan portátiles como estaciones de trabajo principales, pero a veces el equipo está lejos del monitor y necesitan acceder a él mediante un cliente RDP. El escenario típico incluye:
- Necesidad de una conexión RDP que ajuste la resolución al monitor del cliente (resolución dinámica).
- El portátil debe poder entrar en modo de ahorro de energía sin que la sesión remota se bloquee o se desconecte.
- Cuando el usuario se sienta frente al portátil, la sesión local debe “tomar el control” sin iniciar una nueva sesión X.
Los servidores RDP tradicionales en Linux (por ejemplo, xrdp con el backend VNC) no cumplen con estos requisitos: la resolución queda fija, la pantalla del portátil debe estar encendida y la sesión remota nunca se fusiona con la local. Además, algunas soluciones populares (Sunshine, Moonlight, Rustdesk) están fuera del alcance del usuario por limitaciones de licencia o hardware.
Causa
Los síntomas aparecen por tres factores recurrentes:
-
Backend VNC – xrdp, cuando se configura con el módulo
xrdp-vnc, simplemente reenvía un framebuffer estático. No hay intercambio de información de DPI ni de cambios de tamaño, por lo que la ventana del cliente permanece a la resolución definida en el inicio de la sesión. -
Gestión de energía del Xorg – el servidor X mantiene la pantalla “encendida” mientras haya clientes conectados. Si el portátil se suspende, X se detiene y la sesión remota se corta. Los gestores de pantalla (sddm, gdm, lightdm) no notifican al proceso xrdp para que libere recursos.
-
Separación de sesiones – xrdp crea una sesión X separada para cada conexión. Cuando el usuario abre la consola local, se inicia una segunda sesión X, lo que impide que la sesión remota y la local compartan el mismo entorno de ventanas.
Solución
Una combinación de xrdp con el backend Xorg y xrandr permite resolver los tres puntos. El flujo es:
-
Instalar
xrdpyxorgxrdp. El paquetexorgxrdpreemplaza al backend VNC por un servidor Xorg que escucha en el puerto RDP. Gracias a Xorg, la sesión remota es idéntica a la local y soporta cambios de resolución a través dexrandr. -
Configurar
xrdppara usar el modo single‑session (sesman‑Xorg). Con esta opción, la primera conexión crea una sesión X en:10. Cuando el usuario abre la consola local, el mismo display:10se reutiliza, logrando el “takeover” automático. -
Habilitar la opción
allow_channels=trueymax_bpp=32en/etc/xrdp/xrdp.inipara que el cliente reciba información de DPI y pueda solicitar cambios de resolución. -
Crear un script de post‑login que invoque
xrandr --output <output> --autocada vez que el cliente cambie de tamaño. La mayoría de clientes RDP (Microsoft Remote Desktop, Remmina) envían el nuevo tamaño como evento de pantalla; xrdp lo traduce a una llamada axrandr. -
Configurar el gestor de energía para que, al suspender, se envíe
SIGTERMal procesoxrdp-sesman. Systemd puede hacerlo mediante un hookSuspendque ejecutasystemctl stop xrdp-sesman. Al reactivar, el servicio se inicia automáticamente y la sesión X vuelve a estar disponible sin perder estado.
Pasos concretos
- Instalación (Arch‑based, AUR o repositorios oficiales).
- Configuración de xrdp.ini – activar
port=3389,crypt_level=high,use_compression=yes. - Crear archivo de sesión
/etc/xrdp/startwm.shque invoque el entorno de escritorio deseado (plasma, gnome, i3). - Activar el modo single‑session editando
/etc/xrdp/sesman.ini→MaxSessions=1yKillDisconnected=0. - Hook de energía – crear
/etc/systemd/system/xrdp-sesman.service.d/override.confconExecStopPost=/usr/bin/systemctl stop xrdp-sesman. - Reiniciar servicios y probar la conexión desde un cliente RDP.
Con este esquema, la resolución se adapta al cliente, el portátil puede entrar en suspensión y la sesión local y remota comparten el mismo display.
Cuándo aplicar esta solución
- Entornos de trabajo híbridos – el portátil se usa tanto en escritorio como en remoto.
- Necesidad de alta fidelidad visual – aplicaciones gráficas que requieren la misma profundidad de color que la sesión local.
- Política de ahorro energético – se desea que el equipo se suspenda cuando no está en uso sin perder la sesión remota.
No es adecuada si:
- El cliente solo soporta protocolos propietarios (por ejemplo, TeamViewer) y no RDP.
- Se necesita compartir pantalla a varios usuarios simultáneos; el modo single‑session limita la concurrencia.
- El hardware es muy antiguo y no soporta Xorg con aceleración suficiente; en ese caso, una solución basada en VNC puede ser más ligera.
Código
# Instalación en una distro basada en Arch
sudo pacman -Syu xrdp xorgxrdp
# Habilitar y arrancar servicios
sudo systemctl enable --now xrdp
sudo systemctl enable --now xrdp-sesman
# Configuración mínima de xrdp.ini (edita con nano o tu editor)
sudo sed -i 's/^port=.*/port=3389/' /etc/xrdp/xrdp.ini
sudo sed -i 's/^crypt_level=.*/crypt_level=high/' /etc/xrdp/xrdp.ini
sudo sed -i 's/^use_compression=.*/use_compression=yes/' /etc/xrdp/xrdp.ini
# Forzar single‑session en sesman.ini
sudo sed -i 's/^MaxSessions=.*/MaxSessions=1/' /etc/xrdp/sesman.ini
sudo sed -i 's/^KillDisconnected=.*/KillDisconnected=0/' /etc/xrdp/sesman.ini
# Hook de suspensión (crea directorio si no existe)
sudo mkdir -p /etc/systemd/system/xrdp-sesman.service.d
cat <<EOF | sudo tee /etc/systemd/system/xrdp-sesman.service.d/override.conf
[Service]
ExecStopPost=/usr/bin/systemctl stop xrdp-sesman
EOF
# Recargar systemd y reiniciar servicio
sudo systemctl daemon-reload
sudo systemctl restart xrdp-sesman
Verificación
- Desde otro equipo, abre un cliente RDP (Remmina, Microsoft Remote Desktop) y conecta a
IP_DEL_PORTATIL:3389. - Cambia el tamaño de la ventana del cliente; la pantalla del portátil debe redimensionarse automáticamente (observa el cambio en
xrandr -q). - Cierra la sesión RDP, suspende el portátil con
systemctl suspend, espera unos segundos y reanuda. La sesión X debe seguir activa; vuelve a conectar con RDP y verifica que el escritorio sigue donde lo dejaste. - Si te sientas frente al portátil, la pantalla local mostrará la misma sesión sin pedir login adicional.
Notas adicionales
- Algunos entornos de escritorio (KDE Plasma) requieren que la opción “Allow applications to block compositing” esté desactivada para evitar artefactos al cambiar la resolución.
- En Wayland, la solución anterior no funciona; en ese caso, la alternativa es GNOME Remote Desktop (integrado en gnome‑settings) que ya expone RDP con resolución dinámica, pero carece de la capacidad de “takeover” de sesión X.
- Si el cliente es macOS, la aplicación nativa Microsoft Remote Desktop soporta “Smart Sizing”, lo que permite que xrdp reciba los cambios de pantalla sin necesidad de plugins adicionales.
- Mantén
xrdpactualizado; versiones anteriores tenían un bug que ignoraba los eventos dexrandrenviados por el cliente.
Con esta configuración, el portátil Linux se comporta como una máquina Windows tradicional en cuanto a RDP: la resolución se adapta al cliente, la energía se gestiona de forma inteligente y la sesión local y remota son una sola. Esto elimina la latencia de soluciones basadas en VNC y evita la molestia de confirmaciones de “mirroring” en cada arranque.