Mehrere Dummy-Monitore unter Remote-Headless-Linux für VNC zu mehreren lokalen Monitoren

Mehrere Dummy-Monitore unter Remote-Headless-Linux für VNC zu mehreren lokalen Monitoren

Ich gebe mich geschlagen. Ich habe versucht, meine Remote-Linux-Box so zu konfigurieren, dass sie zwei Dummy-Monitore hat, sodass ich mehrere lokale Monitore verwenden kann, um mich per VNC darauf einzuloggen. Ich bin überrascht, dass niemand sonst dabei Hilfe brauchte, um etwas im Internet zu finden.

Ich habe auch versucht, auf der Linux-Box einen Monitor mit doppelter Breite zu erstellen. Dann benutze ich x11vnc, um für jedes Display einen Bereich auszuschneiden. Aber ich habe Probleme, mit dem Dummy-Treiber einen so großen Monitor zu erstellen.

Ich habe einen Grafikadapter mit zwei DisplayPorts installiert, aber ich habe nicht vor, ihn zu verwenden. Als ich den echten Adapter verwendete, reagierte er träge. Als ich den Dummy ausprobierte, reagierte er sehr schnell. Ich hoffe also, einfach einen weiteren Dummy zu erstellen.

Ich verwende KDE DM.

Ich habe viele Beispiele für die Verwendung von VIRTUAL1 gesehen, aber ich bekomme das mit dem Dummy-Treiber nicht zum Laufen. Ich habe versucht, die Option „VirtualHeads“ „2“ zur Konfiguration hinzuzufügen, aber der Dummy-Treiber erkennt sie nicht.

Ich habe Vorschläge zur Verwendung von Xvfb gesehen, aber es wird seit 2016 vom Dummy-Treiber nicht mehr unterstützt.

Hier sind einige Einzelheiten.

$ 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 ist leer

Das Folgende habe ich durch Recherchen im Internet herausgefunden. Nachdem es funktionierte, habe ich aufgehört, daran herumzubasteln. Es mag also Fehler geben, aber das scheint mich nicht zu beeinträchtigen.

/usr/share/X11/xorg.conf.d/dummy-1920x1080.conf hat Folgendes, womit ich meine einzelnen 1920 x 1080 bekomme.

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)

Ich kann von xrandr sehen, dass mein Monitor „Standard“ heißt. Also habe ich Folgendes versucht:

$ 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"

Die letzte Zeile gibt mir:

xrandr: Configure crtc 0 failed

Ich habe versucht, den VideoRAM auf 512.000 (doppelt) zu erhöhen, um sicherzustellen, dass ich Platz habe. Ich bin nicht sicher, was ich da machen soll. Ich habe 32 GB RAM.

Und ALLE xrandr-Befehle geben mir: xrandr: Failed to get size of gamma for output default und ich nehme an, das liegt daran, dass es sich um einen Dummy-Monitor ohne Gamma handelt.

Ich arbeite derzeit in der VNC-Sitzung. Muss ich x11vnc beenden, damit xrandx abgeschlossen werden kann? Ich bin mit meinem Latein am Ende.

Ich starte x11vnc wie folgt:

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

Die Linux-Box befindet sich in meinem lokalen Netz, daher muss ich mir um Authentifizierung/Passwörter keine Gedanken machen.

Bearbeitung 27.05.2021:

Ich habe weiter herumgeschnüffelt und einige Optionen gefunden. Ich konnte einen doppelt breiten Bildschirm erhalten und dann zwei x11vnc-Instanzen erstellen. Aber das ist nicht optimal. Die Linux-Box sieht dies immer noch als einen einzigen Bildschirm. Gibt es nun eine Möglichkeit, diesen Bildschirm zu nehmen und der Linux-Box zu sagen, dass sie ihn teilen soll? Wenn ich beispielsweise ein Fenster in KDE maximiere, wird es nicht beide lokalen Bildschirme umfassen?

Xorg-Konfigurationsdatei:

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

Ich kann dann eine Verbindung zu den VNC-Displays :0 und :1 herstellen, sie auf lokalen Monitoren anordnen und die Fenstergröße an diese Monitore anpassen.

Wenn ein Dialogfenster erscheint, befindet es sich oft in der Mitte des „großen Bildschirms“ von Linux, der sich bei mir über beide Monitore erstreckt …

Bearbeitung 12.11.2021:

Eine Lösung:https://superuser.com/a/1188573/514658

Das eigentliche Problem ist, dass ich meinen VNC-Viewer nicht auf Vollbild stellen kann und er nur zwei meiner drei Monitore abdeckt. Die einzige im Viewer verfügbare Option ist, ALLE Monitore zu verwenden, was dann meine Nutzung der Windows-Seite blockiert. DisplayFusion unter dem obigen Link hat es geschafft. Jetzt kann ich nahtlos zwischen meinen beiden Monitoren hin- und herziehen und bleibe nicht am Rand eines Monitors hängen.

Bearbeitung 16.11.2021:

„GELÖST“: Anstatt DisplayFusion zu verwenden, was ein großer Hammer ist, führte mich weiteres Suchen zu Windows PowerShell. Ich brauche kein Dienstprogramm von Drittanbietern. Ich muss nur ein bestimmtes Fenster verschieben/in der Größe ändern, damit es auf zwei meiner drei Monitore im Vollbildmodus passt. Hier ist es:

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 )

Antwort1

Die folgende X-Konfiguration funktioniert bei mir auf einer Headless-Workstation und ermöglicht duale Dummy-Monitore mit x11vnc + vncviewer. Sie verwendet den X-Dummy-Treiber (dummy_drv.so). Ich habe nicht versucht, die Einrichtung mit der Xvfb-App durchzuführen, die möglicherweise auch funktioniert. KDE hat jedoch einige Fehler beim Verschieben von Fenstern.

# 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

verwandte Informationen