← Tu laboratorio en cualquier parteSerie Remoto · paso 9 de 11

Escritorio remoto en una máquina sin monitor: RustDesk headless sin quedarte fuera

Las GX10 no tienen pantalla. Para ver su escritorio desde fuera montamos RustDesk con un display virtual. Por el camino, instalarlo nos dejó sin ningún acceso gráfico. Cómo hacerlo bien a la primera.

Dificultadmedia
Tiempo45 min
IngredientesRustDesk · xserver-xorg-video-dummy · GDM en X11 · systemd drop-in · SSH abierto como red de seguridad

El 90 % del tiempo, una máquina de IA se administra por SSH. Pero hay un 10 % —un instalador gráfico, un navegador para iniciar sesión en algo, un panel de ajustes— en el que necesitas ver el escritorio. Las GX10 no tienen monitor conectado, y ahí empieza el problema.

Por qué RustDesk falla en una máquina sin pantalla

El escritorio remoto de GNOME (RDP) funciona sin monitor porque crea su propia sesión gráfica virtual. RustDesk no: intenta capturar la pantalla que ya existe. En una GX10 sin conector activo, el servidor gráfico no tiene pantalla que capturar y el cliente dice No displays.

Dos cosas que parecen solución y no lo son:

  • activar la opción allow-linux-headless de RustDesk, sola, no basta;
  • instalar el driver dummy de Xorg, solo, tampoco: RustDesk intenta usar su Xorg virtual interno y no lo lanza.

Lo que sí funciona

La receta que tenemos en producción:

  1. Driver de pantalla ficticia:

    sudo apt install xserver-xorg-video-dummy
  2. Xorg usando la configuración dummy que trae RustDesk, guardando antes la tuya:

    sudo cp /etc/X11/xorg.conf /etc/X11/xorg.conf.pre-rustdesk-headless 2>/dev/null || true
    sudo cp /etc/rustdesk/xorg.conf /etc/X11/xorg.conf
  3. GDM en X11, no en Wayland (/etc/gdm3/custom.conf, con copia previa):

    [daemon]
    WaylandEnable=false
  4. RustDesk arranca después de GDM y lo acompaña. Un drop-in de systemd, /etc/systemd/system/rustdesk.service.d/headless.conf:

    [Unit]
    After=gdm.service
    Requires=gdm.service
    PartOf=gdm.service
    
    [Service]
    Restart=always
    RestartSec=5

Resultado verificado: GDM y RustDesk activos, RustDesk unido al display :1, un único monitor virtual DUMMY0 a 1680×1050 y cero reinicios. Los contenedores de inferencia ni se enteran.

Lo que nos pasó la primera vez (y cómo evitarlo)

Instalamos el .deb de RustDesk estando conectados por escritorio remoto. Tres segundos después, todo se cayó (P-034):

20:08:31  Started rustdesk.service      ← la instalación
20:08:33  Stopping gdm.service
20:08:34  Stopped gdm.service · RDP server stopped

El instalador para GDM y no lo vuelve a arrancar. Sin GDM no hay Xorg; sin Xorg no hay sesión gráfica. Parecían dos averías (RDP muerto y RustDesk sin display) y era una sola. El arreglo fue una línea:

sudo systemctl start gdm

Lo que nos salvó fue tener una sesión SSH abierta. En una máquina sin monitor, el escritorio remoto es el único acceso gráfico: si lo tumbas y no tienes SSH, te toca ir con un monitor y un teclado.

La regla

Antes de instalar cualquier cosa que toque la sesión gráfica en una máquina sin pantalla:

  1. abre una sesión SSH antes y no la cierres;
  2. instala;
  3. comprueba systemctl is-active gdm y, si hace falta, arráncalo.

Y otra, para cualquier cambio de acceso remoto: no reinicies hasta tener dos caminos de acceso independientes verificados (por ejemplo, SSH por Tailscale y escritorio remoto).

Comprobación sin tocar nada

systemctl is-enabled rustdesk.service
systemctl is-active gdm.service rustdesk.service
systemctl show rustdesk.service -p DropInPaths -p After -p Restart -p NRestarts
DISPLAY=:1 XAUTHORITY=/run/user/$(id -u)/gdm/Xauthority xrandr --listmonitors

Deshacerlo

Restaura las dos copias (xorg.conf.pre-rustdesk-headless y la de custom.conf), borra el drop-in, systemctl daemon-reload y reinicia solo GDM y RustDesk. Con una sesión SSH abierta, claro.

Siguiente: un único endpoint para todos tus agentes, elijas el modelo que elijas.