Несколько фиктивных мониторов на удалённом безголовом Linux для VNC на локальных нескольких мониторах

Вопрос или проблема

Я сдаюсь. Я пытался настроить свой удалённый Linux-компьютер, чтобы он имел два виртуальных монитора, чтобы я мог использовать несколько локальных мониторов для подключения к нему через VNC. Я удивлён, что никто другой не искал помощи с этим в интернете.

Я также пробовал создать монитор на Linux-компьютере, который был бы в два раза шире. Затем использовать x11vnc для обрезки области для каждого дисплея. Но у меня возникают проблемы с созданием такого большого монитора с использованием виртуального драйвера.

У меня установлен графический адаптер, у которого есть два DisplayPort, но я не планирую его использовать. Когда я использовал реальный адаптер, он работал медленно. Когда я попробовал виртуальный, он был очень отзывчивым. Так что я надеюсь просто создать ещё один виртуальный.

Я использую KDE DM.

Я видел много примеров использования VIRTUAL1, но не могу заставить это работать с виртуальным драйвером. Я пробовал добавить Option “VirtualHeads” “2” в конфигурацию, но виртуальный драйвер этого не распознает.

Я видел предложения использовать Xvfb, но он был снят с поддержки виртуальным драйвером с 2016 года.

Вот некоторые детали.

$ uname -a
Linux bgrupczy-linux 5.8.0-53-generic #60~20.04.1-Ubuntu SMP Thu May 6 09:52:46 UTC 2021 x86_64 x86_64 x86_64 GNU/Linux

/usr/share/X11/xorg.conf.d/xorg.conf пустой

Следующее было найдено при поиске в интернете. Как только я заставил это работать, я перестал вносить изменения, поэтому это может иметь недостатки, но они, похоже, не влияют на меня.

/usr/share/X11/xorg.conf.d/dummy-1920×1080.conf содержит следующее, что позволяет мне получить мой единственный 1920×1080.

Section "Monitor"
  Identifier "Monitor0"
  HorizSync 28.0-80.0
  VertRefresh 48.0-75.0
  Modeline "1920x1080_60.00" 173.00 1920 2048 2248 2576 1080 1083 1088 1120 -hsync +vsync
EndSection

Section "Device"
  Identifier "Card0"
  Driver "dummy"
  VideoRam 256000
EndSection

Section "Screen"
  Identifier "Screen0"
  Device "Card0"
  Monitor "Monitor0"
  DefaultDepth 24
  SubSection "Display"
    Depth 24
    Modes "1920x1080_60.00"
  EndSubSection
EndSection
$ xrandr
xrandr: Не удалось получить размер гаммы для вывода по умолчанию
Экран 0: минимальный 320 x 240, текущий 1920 x 1080, максимальный 1920 x 1080
по умолчанию подключен 1920x1080+0+0 0mm x 0mm
   1920x1080     60.00* 
   1680x1050     70.00    60.00  
   1400x1050     70.00    60.00  
   1600x900      60.00  
   1280x1024     75.00    60.00  
   1440x900      60.00  
   1400x900      60.00  
   1280x960      60.00  
   1368x768      60.00  
   1360x768      60.00  
   1280x800      60.00  
   1152x864      75.00    70.00    60.00  
   1280x720      60.00  
   1024x768      75.00    70.00    60.00  
   1024x576      60.00  
   960x600       60.00  
   832x624       75.00  
   960x540       60.00  
   800x600       75.00    72.00    60.00    56.00  
   840x525       70.00    60.00  
   864x486       60.00  
   700x525       70.00    60.00  
   800x450       60.00  
   640x512       75.00    60.00  
   720x450       60.00  
   700x450       60.00  
   640x480       75.00    73.00    60.00  
   684x384       60.00  
   680x384       60.00  
   640x400       60.00  
   576x432       75.00    70.00    60.00  
   640x360       60.00  
   512x384       75.00    70.00    60.00  
   512x288       60.00  
   416x312       75.00  
   480x270       60.00  
   400x300       75.00    72.00    60.00    56.00  
   432x243       60.00  
   320x240       75.00    73.00    60.00  
$ lspci | grep VGA
00:02.0 VGA совместимый контроллер: Intel Corporation Device 9bc5 (rev 05)

Я вижу из xrandr, что мой монитор называется “по умолчанию”. Так что я попробовал это:

$ cvt 3840 1080
# 3840x1080 59.96 Hz (CVT) hsync: 67.16 kHz; pclk: 346.00 MHz
Modeline "3840x1080_60.00"  346.00  3840 4088 4496 5152  1080 1083 1093 1120 -hsync +vsync
$ xrandr --newmode "3840x1080_60.00"  346.00  3840 4088 4496 5152  1080 1083 1093 1120 -hsync +vsync
$ xrandr --addmode default "3840x1080_60.00"
$ xrandr --output default --mode "3840x1080_60.00"

Последняя строка даёт мне:

xrandr: Настройка crtc 0 не удалась

Я попробовал увеличить VideoRam до 512000 (в два раза), чтобы убедиться, что у меня достаточно места. Не знаю, что с этим делать. У меня 32 ГБ оперативной памяти.

И все команды xrandr дают мне:
xrandr: Не удалось получить размер гаммы для вывода по умолчанию
и я предполагаю, что это связано с тем, что это виртуальный монитор, который не имеет гаммы.

Я в данный момент работаю в VNC-сессии. Нужно ли мне отключить x11vnc, чтобы завершить xrandx? Я в отчаянии.

Я запускаю x11vnc таким образом:

x11vnc -loop -forever -shared -repeat -noxdamage -xrandr -display :0 -clip 1920x1080+0+0

Linux-компьютер находится в моей локальной сети, так что я не переживаю насчёт аутентификации/паролей.

Правка 2021-05-27:

Больше поиска, и я нашёл некоторые варианты. Мне удалось получить экран в два раза шире, а затем создать два экземпляра x11vnc. Но это не оптимально. Linux-компьютер всё ещё рассматривает это как один экран. Теперь есть ли способ взять этот экран и сказать Linux-компьютеру, чтобы он разделил его? Например, если я разворачиваю окно в KDE, оно не охватывает оба локальных экрана?

Конфигурационный файл X:

Section "Monitor"
  Identifier "Monitor0"
EndSection

Section "Device"
  Identifier "Card0"
  Driver "dummy"
  VideoRam 512000
EndSection

Section "Screen"
  Identifier "Screen0"
  Device "Card0"
  Monitor "Monitor0"
  DefaultDepth 24
  SubSection "Display"
    Depth 24
    Virtual 3840 1080
  EndSubSection
EndSection
x11vnc -loop -forever -shared -repeat -noxdamage -xrandr -display :0 -rfbport 5900 -clip 1920x1080+0+0
x11vnc -loop -forever -shared -repeat -noxdamage -xrandr -display :0 -rfbport 5901 -clip 1920x1080+1920+0

Я могу затем подключиться к VNC-дисплеям :0 и :1 и расположить их на локальных мониторах и изменить размер окон, чтобы они соответствовали этим мониторам.

Когда появляется диалоговое окно, чаще всего оно находится посередине Linux “большого экрана”, который для меня охватывает оба монитора…

Правка 2021-11-12:

Одно решение: https://superuser.com/a/1188573/514658

Сущностная проблема заключается в том, что я не могу заставить мой VNC-визуализатор перейти в полноэкранный режим и охватывать только два из моих трёх мониторов. Единственный доступный вариант в визуализаторе – использовать ВСЕ мониторы, что блокирует моё использование со стороны Windows. DisplayFusion по ссылке выше решил эту проблему. Теперь я могу беспрепятственно перетаскивать между двумя мониторами и не застревать на краю одного.

Правка 2021-11-16:

“РЕШЕНО”: Вместо использования DisplayFusion, который является универсальным инструментом, дальнейший поиск привёл меня к Windows PowerShell. Нет необходимости в сторонних утилитах. Мне нужно только переместить/изменить размер конкретного окна, чтобы оно заняло два из моих трёх мониторов в полном экране. Вот он:

Add-Type @"
  using System;
  using System.Runtime.InteropServices;

  public class Win32 {
    [DllImport("user32.dll")]
    [return: MarshalAs(UnmanagedType.Bool)]
    public static extern bool GetWindowRect(IntPtr hWnd, out RECT lpRect);

    [DllImport("user32.dll")]
    [return: MarshalAs(UnmanagedType.Bool)]
    public static extern bool GetClientRect(IntPtr hWnd, out RECT lpRect);

    [DllImport("user32.dll")]
    [return: MarshalAs(UnmanagedType.Bool)]
    public static extern bool MoveWindow(IntPtr hWnd, int X, int Y, int nWidth, int nHeight, bool bRepaint);
  }

  public struct RECT
  {
    public int Left;        // x позиция верхнего левого угла
    public int Top;         // y позиция верхнего левого угла
    public int Right;       // x позиция нижнего правого угла
    public int Bottom;      // y позиция нижнего правого угла
  }

"@

$h = (Get-Process vnc-E4_6_3-x86_win32_viewer).MainWindowHandle
[Win32]::MoveWindow($h, 1920, 0, 3840, 1080, $true )

Следующая X-конфигурация работает для меня на безголовой рабочей станции и позволяет использовать два виртуальных монитора с помощью x11vnc + vncviewer.
Она использует виртуальный драйвер X (dummy_drv.so). Я не пробовал настраивать с помощью приложения Xvfb, которое, возможно, также сработает. Однако в KDE есть некоторые ошибки с перемещением окон.

# darwin
Section "Monitor"
    Identifier  "Monitor1"
    HorizSync   60.0-100.0
    VertRefresh 60-120
    Option "Primary" "True"
    Option "Enable" "True"
    Option "Position" "0 0"
EndSection

Section "Monitor"
    Identifier  "Monitor2"
    HorizSync   60.0-100.0
    VertRefresh 60-120
    Option "Primary" "False"
    Option "Enable" "True"
    Option "Position" "1280 0"
    Option "RightOf" "Monitor1"
EndSection

Section "Device"
    Identifier  "Device1"
    Driver      "dummy"
    VideoRam    512000
    # DUMMY0 и DUMMY1 - это имена драйверов, определённые по
    # ошибкам в /var/log/Xorg.0.log и также
    # в проверке xorg-server src pkg.
    Option "Monitor-DUMMY0" "Monitor1"
    Option "Monitor-DUMMY1" "Monitor2"
EndSection

Section "Screen"
    Identifier  "Screen1"
    Device      "Device1"
    Monitor     "Monitor1"
    DefaultDepth 24
    SubSection "Display"
            Modes "1280x1024"
    EndSubSection   
EndSection

Section "Screen"
    Identifier  "Screen2"
    Device      "Device1"
    Monitor     "Monitor2"
    DefaultDepth 24
    SubSection "Display"
            Modes "1280x1024"
    EndSubSection   
EndSection

Section "ServerLayout"
    Identifier "Layout 1"
    Screen 0 "Screen1"
    Screen 1 "Screen2" RightOf "Screen1"
EndSection
                
Section "ServerFlags"
    Option "DefaultServerLayout" "Layout 1"
    # Расширение XRANDR более современное и может заменить старое расширение XINERAMA.
    # dummy_drv.so может быть легко перекомпилирован из последнего исходного кода для поддержки XRANDR.
    # Если XRANDR поддерживается dummy_drv.so, установите следующее значение на false.
    # Ubuntu 20.04 dummy_drv.so пока не поддерживает XRANDR,
    # поэтому следующее значение должно быть установлено на true.
    Option "Xinerama"  "False"
EndSection

Ответ или решение

Настройка нескольких виртуальных мониторов на безголовом Linux для VNC

Введение

Работа с безголовыми системами Linux и удаленными рабочими столами через VNC может оказаться непростой задачей, особенно когда требуется использование нескольких виртуальных мониторов для оптимизации рабочего процесса. В данной статье мы подробно рассмотрим настройку двух легковесных виртуальных мониторов на удаленной Linux-машине, обеспечивая комфортный доступ через VNC к локальным многоэкранным конфигурациям.

Проблема

Вы столкнулись с необходимостью подключаться к удаленному Linux-серверу, используя несколько локальных мониторов, но без возможности создания правильных виртуальных мониторов. Использование драйвера dummy и x11vnc не дало ожидаемых результатов – возникла проблема с настройкой, а также с разделением экрана и управлением окнами в KDE.

Решение

Для успешной настройки виртуальными мониторами мы используем X dummy driver и x11vnc. Основной целью будет создание двух отдельных мониторов, которые можно будет использовать параллельно через VNC.

1. Установка необходимых пакетов

Убедитесь, что у вас установлены необходимые пакеты. Используйте следующую команду:

sudo apt-get install x11-xserver-utils x11vnc xserver-xorg-video-dummy

2. Настройка конфигурации X

Создайте файл конфигурации X в каталоге /etc/X11/xorg.conf.d/ или /usr/share/X11/xorg.conf.d/, чтобы добавить поддержку двух виртуальных мониторов. Вот пример конфигурации:

Section "Monitor"
    Identifier "Monitor1"
    HorizSync 60.0-100.0
    VertRefresh 60-120
    Option "Position" "0 0"
EndSection

Section "Monitor"
    Identifier "Monitor2"
    HorizSync 60.0-100.0
    VertRefresh 60-120
    Option "Position" "1280 0"  # Позиция второго монитора
    Option "RightOf" "Monitor1"
EndSection

Section "Device"
    Identifier "Device1"
    Driver "dummy"
    VideoRam 512000
    Option "Monitor-DUMMY0" "Monitor1"
    Option "Monitor-DUMMY1" "Monitor2"
EndSection

Section "Screen"
    Identifier "Screen1"
    Device "Device1"
    Monitor "Monitor1"
    DefaultDepth 24
    SubSection "Display"
        Modes "1280x1024"
    EndSubSection
EndSection

Section "Screen"
    Identifier "Screen2"
    Device "Device1"
    Monitor "Monitor2"
    DefaultDepth 24
    SubSection "Display"
        Modes "1280x1024"
    EndSubSection
EndSection

Section "ServerLayout"
    Identifier "Layout1"
    Screen 0 "Screen1"
    Screen 1 "Screen2" RightOf "Screen1"
EndSection

Section "ServerFlags"
    Option "Xinerama" "False"
EndSection

3. Подключение через x11vnc

После успешного настроивания конфигурации X, вы можете запустить x11vnc следующим образом:

x11vnc -display :0 -forever -loop -noxdamage -repeat -shared -rfbport 5900

Это позволит вам подключиться к вашему удаленному серверу через VNC-клиент, используя два отдельных монитора.

Управление окнами

Проблемы с тем, как окна ведут себя при работе с KDE, могут оставаться, так как KDE имеет свои особенности управления окнами. Попробуйте отключить различные функции управления окнами или изменить конфигурации в настройках рабочего стола, чтобы улучшить управление окнами между мониторами.

Заключение

С помощью вышеуказанных шагов вы сможете успешно создать два виртуальных монитора на вашем удаленном Linux-сервере. Это позволит вам более эффективно использовать ваши локальные многоэкранные конфигурации, улучшая общий рабочий процесс при помощи VNC. Если у вас возникли дополнительные вопросы или проблемы, не стесняйтесь обратиться за помощью к сообществу или искать решения в специализированных форумах.

Оцените материал
Добавить комментарий

Капча загружается...