Orchestrator 7319689814 refactor: clean VPS code, keep only host solution in main\n
- Removed all VPS-specific scripts and configs from main branch\n- VPS solution archived in archive/vps-rustdesk-server\n- Rewrote README.md to focus on Intel Alder Lake-N host setup\n- Added note about archive branch and host-only scope\n
Fixes #6 (wontfix for VPS GUI, host solution restored)
2026-05-16 00:52:54 +01:00

RDtop — RustDesk Headless Display Setup for Intel iGPU

Виртуальный дисплей для RustDesk без подключенного HDMI на Intel Alder Lake-N.

Ветка archive/vps-rustdesk-server содержит архивное решение для VPS (Hbbr/Hbbs relay). Main теперь только для хоста.


Проблема

Оборудование: Intel Alder Lake-N (i915), Debian 12, X11 (GDM/GNOME).

Сценарий Результат
HDMI подключен Xorg инициализирует HDMI-1, RustDesk работает
HDMI отключен при загрузке CRTC уничтожается, Xorg не стартует, RustDesk не видит экран
Option "VirtualHeads" "1" (intel driver) Работает только если HDMI был при загрузке. Без HDMI — VIRTUAL1 не создается

Решение: Dummy Driver + Kernel EDID Fallback

Dummy driver создает DUMMY0 сразу при старте Xorg, независимо от HDMI.

+------------------------------------------------------------------------+
|   Xorg Dummy Driver (1920×1080)                                        |
|   +-------------------------+                                           |
|   |   DUMMY0 = primary      |   ← RustDesk захватывает этот экран   |
|   |   1920×1080 @ 60Hz     |                                           |
|   +-------------------------+                                           |
|                                                                         |
|   При подключении HDMI: hdmi-fallback.sh клонирует HDMI1 на DUMMY0      |
|   При отключении HDMI:    HDMI1 off, DUMMY0 остается primary           |
+------------------------------------------------------------------------+

Kernel EDID Fallback (страховка)

Если dummy по какой-то причине не загрузится, ядро i915 создаст виртуальный framebuffer через EDID:

video=HDMI-A-1:1920x1080@60 drm.edid_firmware=HDMI-A-1:edid/samsung.bin

Файлы

Файл репозитория Назначение Установка
bin/hdmi-fallback.sh Мониторинг HDMI-A-1 и auto-fallback ~/.local/bin/hdmi-fallback.sh
config/x11-host/20-dummy-headless.conf Dummy driver Xorg config /etc/X11/xorg.conf.d/20-dummy-headless.conf
config/systemd/hdmi-fallback.service systemd user unit ~/.config/systemd/user/hdmi-fallback.service
scripts/host/setup-host-rustdesk.sh Полная настройка RustDesk ID на хосте Запустить от root
install.sh One-liner установщик bash install.sh

Установка (Хост)

Автоматическая

bash -c "$(curl -fsSL https://git.softuniq.eu/NW/RDtop/raw/branch/main/install.sh)"
sudo reboot

Вручную

# 1. Клонировать
git clone https://git.softuniq.eu/NW/RDtop.git ~/RDtop && cd ~/RDtop

# 2. Dummy driver config
sudo cp config/x11-host/20-dummy-headless.conf /etc/X11/xorg.conf.d/

# 3. Удалить старые конфиги
sudo rm -f /etc/X11/xorg.conf.d/20-intel-virtual.conf
sudo rm -f /etc/X11/xorg.conf.d/90-fallback.conf

# 4. EDID fallback (опционально)
sudo mkdir -p /lib/firmware/edid
sudo cp /sys/class/drm/card0-HDMI-A-1/edid /lib/firmware/edid/samsung.bin

# 5. GRUB
sudo sed -i 's|GRUB_CMDLINE_LINUX_DEFAULT=".*"|GRUB_CMDLINE_LINUX_DEFAULT="quiet splash video=HDMI-A-1:1920x1080@60 drm.edid_firmware=HDMI-A-1:edid/samsung.bin"|' /etc/default/grub
sudo update-grub

# 6. Fallback скрипт
chmod +x bin/hdmi-fallback.sh
cp bin/hdmi-fallback.sh ~/.local/bin/

# 7. systemd unit
mkdir -p ~/.config/systemd/user
cp config/systemd/hdmi-fallback.service ~/.config/systemd/user/
systemctl --user daemon-reload
systemctl --user enable --now hdmi-fallback.service

# 8. RustDesk ID fix (защита ID от смены после перезагрузки)
sudo bash scripts/host/setup-host-rustdesk.sh

# 9. Перезагрузка
sudo reboot

Проверка

# После reboot без HDMI
$ xrandr --listmonitors
0: +*DUMMY0 1920/508x1080/286+0+0  DUMMY0   [PRIMARY]

$ rustdesk --get-id
158 356 564  # или ваш текущий ID — он не должен меняться

Troubleshooting

ID меняется после перезагрузки

# Проверить защиту файла
lsattr ~/.config/rustdesk/RustDesk.toml
# Должно показать ---- i --------

# Если нет — запустить setup-host-rustdesk.sh от root
sudo bash scripts/host/setup-host-rustdesk.sh

Черный экран в RustDesk

# Проверить primary
xrandr --verbose | grep primary
# Должно быть: DUMMY0 connected primary

# Если primary не DUMMY0:
xrandr --output DUMMY0 --mode "1920x1080" --primary
xrandr --output HDMI-1 --auto --same-as DUMMY0

Архив

Решение для VPS (Hbbr/Hbbs + Xvfb + XFCE) заархивировано:

git checkout archive/vps-rustdesk-server

Авторы

  • Intel Alder Lake-N (i915), Debian 12 / Ubuntu 24.04
  • Решение: AI Agent (Kilo Code Orchestrator)
Description
RustDesk headless setup for Intel iGPU with HDMI fallback
Readme 105 KiB
Languages
Shell 100%