遠端無頭 Linux 上的多個虛擬監視器,用於 VNC 到本地多個監視器

遠端無頭 Linux 上的多個虛擬監視器,用於 VNC 到本地多個監視器

我認輸了。我一直在嘗試將我的遠端 Linux 機器配置為具有兩個虛擬監視器,以便我可以使用多個本地監視器透過 VNC 連接到它。令我驚訝的是,沒有人需要幫助來在網路上尋找某些內容。

我還嘗試在 Linux 機器上建立一個雙倍寬度的監視器。然後使用 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 看到我的顯示器被稱為“預設”。所以我嘗試了這個:

$ 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內存。

所有 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年5月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

相關內容