Вопрос или проблема
Я сдаюсь. Я пытался настроить свой удалённый Linux-компьютер, чтобы он имел два виртуальных монитора, чтобы я мог использовать несколько локальных мониторов для подключения к нему через VNC. Я удивлён, что никто другой не искал помощи с этим в интернете.
Я также пробовал создать монитор на Linux-компьютере, который был бы в два раза шире. Затем использовать x11vnc для обрезки области для каждого дисплея. Но у меня возникают проблемы с созданием такого большого монитора с использованием виртуального драйвера.
У меня установлен графический адаптер, у которого есть два DisplayPort, но я не планирую его использовать. Когда я использовал реальный адаптер, он работал медленно. Когда я попробовал виртуальный, он был очень отзывчивым. Так что я надеюсь просто создать ещё один виртуальный.
Я использую KDE DM.
Я видел много примеров использования VIRTUAL1, но не могу заставить это работать с виртуальным драйвером. Я пробовал добавить Option “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-1920×1080.conf содержит следующее, что позволяет мне получить мой единственный 1920×1080.
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: Не удалось получить размер гаммы для вывода по умолчанию
Экран 0: минимальный 320 x 240, текущий 1920 x 1080, максимальный 1920 x 1080
по умолчанию подключен 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 совместимый контроллер: 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: Настройка crtc 0 не удалась
Я попробовал увеличить VideoRam до 512000 (в два раза), чтобы убедиться, что у меня достаточно места. Не знаю, что с этим делать. У меня 32 ГБ оперативной памяти.
И все команды xrandr дают мне:
xrandr: Не удалось получить размер гаммы для вывода по умолчанию
и я предполагаю, что это связано с тем, что это виртуальный монитор, который не имеет гаммы.
Я в данный момент работаю в 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, оно не охватывает оба локальных экрана?
Конфигурационный файл X:
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 позиция верхнего левого угла
public int Top; // y позиция верхнего левого угла
public int Right; // x позиция нижнего правого угла
public int Bottom; // y позиция нижнего правого угла
}
"@
$h = (Get-Process vnc-E4_6_3-x86_win32_viewer).MainWindowHandle
[Win32]::MoveWindow($h, 1920, 0, 3840, 1080, $true )
Следующая 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 и DUMMY1 - это имена драйверов, определённые по
# ошибкам в /var/log/Xorg.0.log и также
# в проверке 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 более современное и может заменить старое расширение XINERAMA.
# dummy_drv.so может быть легко перекомпилирован из последнего исходного кода для поддержки XRANDR.
# Если XRANDR поддерживается dummy_drv.so, установите следующее значение на false.
# Ubuntu 20.04 dummy_drv.so пока не поддерживает XRANDR,
# поэтому следующее значение должно быть установлено на true.
Option "Xinerama" "False"
EndSection
Ответ или решение
Настройка нескольких виртуальных мониторов на безголовом Linux для VNC
Введение
Работа с безголовыми системами Linux и удаленными рабочими столами через VNC может оказаться непростой задачей, особенно когда требуется использование нескольких виртуальных мониторов для оптимизации рабочего процесса. В данной статье мы подробно рассмотрим настройку двух легковесных виртуальных мониторов на удаленной Linux-машине, обеспечивая комфортный доступ через VNC к локальным многоэкранным конфигурациям.
Проблема
Вы столкнулись с необходимостью подключаться к удаленному Linux-серверу, используя несколько локальных мониторов, но без возможности создания правильных виртуальных мониторов. Использование драйвера dummy и x11vnc не дало ожидаемых результатов – возникла проблема с настройкой, а также с разделением экрана и управлением окнами в KDE.
Решение
Для успешной настройки виртуальными мониторами мы используем X dummy driver и x11vnc. Основной целью будет создание двух отдельных мониторов, которые можно будет использовать параллельно через VNC.
1. Установка необходимых пакетов
Убедитесь, что у вас установлены необходимые пакеты. Используйте следующую команду:
sudo apt-get install x11-xserver-utils x11vnc xserver-xorg-video-dummy
2. Настройка конфигурации X
Создайте файл конфигурации X в каталоге /etc/X11/xorg.conf.d/
или /usr/share/X11/xorg.conf.d/
, чтобы добавить поддержку двух виртуальных мониторов. Вот пример конфигурации:
Section "Monitor"
Identifier "Monitor1"
HorizSync 60.0-100.0
VertRefresh 60-120
Option "Position" "0 0"
EndSection
Section "Monitor"
Identifier "Monitor2"
HorizSync 60.0-100.0
VertRefresh 60-120
Option "Position" "1280 0" # Позиция второго монитора
Option "RightOf" "Monitor1"
EndSection
Section "Device"
Identifier "Device1"
Driver "dummy"
VideoRam 512000
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 "Layout1"
Screen 0 "Screen1"
Screen 1 "Screen2" RightOf "Screen1"
EndSection
Section "ServerFlags"
Option "Xinerama" "False"
EndSection
3. Подключение через x11vnc
После успешного настроивания конфигурации X, вы можете запустить x11vnc следующим образом:
x11vnc -display :0 -forever -loop -noxdamage -repeat -shared -rfbport 5900
Это позволит вам подключиться к вашему удаленному серверу через VNC-клиент, используя два отдельных монитора.
Управление окнами
Проблемы с тем, как окна ведут себя при работе с KDE, могут оставаться, так как KDE имеет свои особенности управления окнами. Попробуйте отключить различные функции управления окнами или изменить конфигурации в настройках рабочего стола, чтобы улучшить управление окнами между мониторами.
Заключение
С помощью вышеуказанных шагов вы сможете успешно создать два виртуальных монитора на вашем удаленном Linux-сервере. Это позволит вам более эффективно использовать ваши локальные многоэкранные конфигурации, улучшая общий рабочий процесс при помощи VNC. Если у вас возникли дополнительные вопросы или проблемы, не стесняйтесь обратиться за помощью к сообществу или искать решения в специализированных форумах.