Некоторые картинки не загружаются из РФ и РК, используйте VPN.

четверг, 22 февраля 2024 г.

QEMU KVM Два монитора


Появилась интересная задачка - организация рабочего места на съемном носителе (ssd). Ну интересное тут другое, там используется виртуализация на базе QEMU. Установка и настройка производились на Hyper-V (виртуализация в виртуализации) на внешний ssd (проброшен в VM).

Установка QEMU выглядела так:

sudo apt-get install  --no-install-recommends qemu-system-ppc libvirt-daemon-system libvirt-clients virt-manager gir1.2-spiceclientgtk-3.0

Вот я сделал, а заказчик спрашивает, а как мне работать на двух мониторах?

Поясню, на носителе базовая операционная система, а в ней есть гипервизор QEMU KVM. Человек запускает виртуальную машину и работает через консоль. А у него два монитора и растянуть окно нельзя.

В поисках решений перепробовал много вариантов, в итоге решение нашлось.

Ставим virt-viewer:

apt-get install virt-viewer
В настройках vm модель видео ставим virtio и добавляем head в режиме редактирования XML
для редактирования XML требуется добавить разрешение:



Пример XML, слот может быть другой, будьте внимательны
<video>
  <model type="virtio" heads="2" primary="yes">
    <acceleration accel3d="no"/>
  </model>
  <address type="pci" domain="0x0000" bus="0x00" slot="0x02" function="0x0"/>
</video>

Далее в разделе Server Spice проверяем настройки


Для доступа снаружи в Адрес выбираем "Все интерфейсы". Для локальной работы достаточно localhost. Записываем какой порт использовать (5900). Запускаем VM.  Открываем приложение virt-viewer



Указываем адрес и порт, нажимаем подключиться. Вот тут должно появится два окна. Обычно второе окно имеет разрешение 640*480, что не удобно, так как каждый раз нужно перенастраивать. Настройка осуществляется в менеджере дисплея, даже сохранение профиля не помогает. 
Указание разрешение в grub:
GRUB_GFXMODE=1920x1080
Решает проблему только на перезагрузку. При выключении машины настройки не применяются для мониторов типа Virtual.

Методом научного тыка была подобрана такая комбинация:
xrandr --output Virtual-1 --mode 1920x1080 --pos 0x0 --output Virtual-2 --mode 1920x1080 --pos 1920x0
При таких вводных:
[workstation user ~]% xrandr --listactivemonitors
Monitors: 2
 0: +*Virtual-1 1920/609x1080/342+0+0  Virtual-1
 1: +Virtual-2 1920/609x1080/342+1920+0  Virtual-2
Попытался записать скрипт в /etc/lightdm/lightdm.conf в разделе Seat

После перезагрузки графика не загружается, только курсор мигает и все
Поэтому данный "скрипт" был записан в файл на рабочем столе, пользователь после входа в учетку запускает его и получает два окна FullHD.
Потом было принято решение довести этот вопрос до автоматизма, скрипт переместил в /opt и добавил его в автозапуск. Для этого нужно создать файл /etc/xdg/autostart/xrandr-settings.desktop с таким содержимым:
[Desktop Entry]
Type=Application
Version=1.0
Name=Custom randr settings

Exec=/opt/monitor.sh
Icon=
Comment=
Path=
Terminal=false
StartupNotify=false
Вместо скрипта в Exec можно указать в одну строку, нельзя, только файл скрипта.
Скрипт я переписал так:
#!/bin/sh
(
        date
        res="1920x1080"
        xrandr --output Virtual-1 --mode $res --pos 0x0
        xrandr --output Virtual-2 --mode $res --pos 1920x0
) >>/home/user/monitor.log 2>&1
Для теста. Проверить без перезагрузки можно кликнув два раза в файловом менеджере по файлу


5 комментариев:

  1. Не выходит каменный цветок (@)
    появляется второе окно 640*480 с надписью Display output is not active
    основная ОС AltLinux в виртуалке windows крутится

    ОтветитьУдалить
  2. дополню, в лог файле
    warning: output Virtual-1 not found; ignoring
    warning: output Virtual-2 not found; ignoring

    ОтветитьУдалить
    Ответы
    1. Как минимум нужно проверить вывод команды xrandr --listactivemonitors, она покажет и мониторы и их названия. Далее надо использовать "названия мониторов" из вывода команды.

      Удалить
  3. $ xrandr --listactivemonitors
    Monitors: 2
    0: +*HDMI-1 1920/509x1080/286+0+0 HDMI-1
    1: +DP-2 1920/160x1080/90+1920+0 DP-2
    так?
    xrandr --output HDMI-1 --mode $res --pos 0x0
    xrandr --output DP-2 --mode $res --pos 1920x0

    ОтветитьУдалить