我认输了。我一直在尝试将我的远程 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