远程无头 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

相关内容