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

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

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

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

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

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

Я видел много примеров использования VIRTUAL1, но я не могу заставить это работать с фиктивным драйвером. Я пробовал добавить опцию "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-1920x1080.conf содержит следующее, что дает мне единственное разрешение 1920x1080.

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: Failed to get size of gamma for output default
Screen 0: minimum 320 x 240, current 1920 x 1080, maximum 1920 x 1080
default connected 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 compatible controller: Intel Corporation Device 9bc5 (rev 05)

Я вижу из xrandr, что мой монитор называется "default". Поэтому я попробовал это:

$ 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: Configure crtc 0 failed

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

И ВСЕ команды xrandr выдают мне: xrandr: Failed to get size of gamma for output default и я думаю, это потому, что это фиктивный монитор, у которого нет гаммы.

Я сейчас работаю в сеансе 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, оно не охватит оба локальных экрана?

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

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 position of upper-left corner
    public int Top;         // y position of upper-left corner
    public int Right;       // x position of lower-right corner
    public int Bottom;      // y position of lower-right corner
  }

"@

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

решение1

Следующая конфигурация 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 and DUMMY1 are driver names guessed from
    # errors in /var/log/Xorg.0.log and also
    # checking 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 extension is more recent and can replace older XINERAMA extension.
    # dummy_drv.so can easily be recompiled from latest source to support XRANDR.
    # If XRANDR is supported by dummy_drv.so, set the following to false.
    # Ubuntu 20.04 dummy_drv.so don't support XRANDR yet,
    # so the following must be set to true.
    Option "Xinerama"  "False"
EndSection

Связанный контент