Нет автоматического изменения размера с SPICE и вирт-менеджером

Я настроил виртуальную машину, которая прекрасно работает, за исключением функции автоматического изменения размера, которая кажется несовместимой. У меня это случайно работает несколько раз, но это также случайно перестает работать. В настоящее время он не работает, и я не уверен, что мне нужно сделать, чтобы заставить его работать надежно (например, автоматическое изменение размера VirtualBox). Пожалуйста, смотрите ниже для моей конфигурации.

настроить

Host: Ubuntu 16.10
Guest: Ubuntu 16.04.2, et. al (I've tried with other Linux distros with similar results)
Guest: created using virt-manager
Guest: installed spice-vdagent
Guest: virt-manager > View > Scale Display > Auto resize VM with window (checked)

пряность

user@ubuntu:~$ ps aux | grep spice
root       805  0.0  0.0  30568   260 ?        Ss   08:59   0:00 /usr/sbin/spice-vdagentd
user      1365  0.0  0.0  35124  2360 ?        Ss   08:59   0:00 /usr/bin/spice-vdagent
user      1933  0.0  0.0  21292  1020 pts/17   S+   09:00   0:00 grep --color=auto spice

QXL

user@ubuntu:~$ sudo lshw -c Video
  *-display               
       description: VGA compatible controller
       product: QXL paravirtual graphic card
       vendor: Red Hat, Inc.
       physical id: 2
       bus info: pci@0000:00:02.0
       version: 04
       width: 32 bits
       clock: 33MHz
       capabilities: vga_controller rom
       configuration: driver=qxl latency=0
       resources: irq:10 memory:f4000000-f7ffffff memory:f8000000-fbffffff memory:fc058000-fc059fff ioport:c040(size=32) memory:c0000-dffff

Чего мне не хватает, чтобы правильно включить авторазмер с помощью qemu/kvm?

4 ответа

[Обходной путь]

Я тоже боролся с этим. Я считаю, что если я использую spicy (spice-client-gtk) и эту команду

xrandr --output Virtual-0 --auto

он действительно правильно меняет размер, если на хосте установлен vdagent, а также установлены гость и драйвер qxl. Я взял ярлык для этой команды в качестве пункта в моем меню или панели. (убедившись, что эта вещь находится в верхнем левом углу, чтобы я всегда мог добраться до нее.)

Но я не вижу ни одного события, чтобы посмотреть, чтобы автоматически сделать изменение размера. Гости Windows 7 и Windows 10 делают это отлично. Почему не linux????

Я использую Debian 10 и Icewm в качестве гостевой виртуальной машины. Когда spice-vdagent запущен, я могу вручную настроить размер экрана с помощьюxrandr --output Virtual-1 --auto

Изменение размера дисплея также можно наблюдать с помощью xev:

      joe@l1:~$ xev -root -event randr 

RRScreenChangeNotify event, serial 18, synthetic NO, window 0x3af,
    root 0x3af, timestamp 39153, config_timestamp 82137
    size_index 65535, subpixel_order SubPixelUnknown
    rotation RR_Rotate_0
    width 1320, height 949, mwidth 348, mheight 250

RRNotify event, serial 18, synthetic NO, window 0x3af,
    subtype XRROutputChangeNotifyEvent
    output Virtual-1, crtc 63, mode 1320x949 (1320x949)
    rotation RR_Rotate_0
    connection RR_Connected, subpixel_order SubPixelUnknown

Использование этого триггера кажется менее навязчивым, чем работа с udev, особенно при использовании разных сред рабочего стола или оконных менеджеров на одной виртуальной машине.

      joe@l1:~$ cat /home/joe/.xsession
#!/bin/sh

if [ -x /usr/bin/spice-vdagent ] ; then
    /usr/bin/spice-vdagent
    /home/joe/.icewm/xrandr-loop &
fi
exec /usr/bin/icewm-session

joe@l1:~$ cat /home/joe/.icewm/xrandr-loop
#!/bin/sh

sleep 2

xrandr --output "$(xrandr | awk '/ connected/{print $1; exit; }')" --auto

xev -root -event randr | \
grep --line-buffered 'subtype XRROutputChangeNotifyEvent' | \
while read foo ; do \
    xrandr --output "$(xrandr | awk '/ connected/{print $1; exit; }')" --auto
done

joe@l1:~$ 

Перейдите в раздел оборудования вашей виртуальной машины

Удалите существующее устройство канала, если оно есть, и добавьте устройство com.redhat.spice.0 spicevmc.

Мне было очень трудно заставить мои гостевые виртуальные машины поддерживать два монитора с разрешением выше 1080p. Как оказалось, это произошло потому, что буфер памяти QXL по умолчанию размером 16 МБ недостаточно велик. Вероятно, вы не столкнетесь с этой проблемой, если оба ваших монитора имеют разрешение только 1080p. Но если они есть, то нужно установитьheads=2И увеличить буфер памяти через атрибут (в моем случае работало 32 мб).

В моих системах мне приходилось редактировать XML-конфигурацию libvirt вручную, чтобы внести это изменение. Для этого найдитеvgamemатрибут. Вероятно, оно будет иметь значение по умолчанию16384(он же 16 миб). Чтобы увеличить его, скажем, на 32 мб, измените значение атрибута на32768. В моей системе этот измененный фрагмент XML:

      <video>
  <model type="qxl" ram="65536" vram="65536" vgamem="16384" heads="1" primary="yes"/>
  <address type="pci" domain="0x0000" bus="0x00" slot="0x01" function="0x0"/>
</video>

К:

      <video>
  <model type="qxl" ram="65536" vram="65536" vgamem="32768" heads="2" primary="yes"/>
  <address type="pci" domain="0x0000" bus="0x00" slot="0x01" function="0x0"/>
</video>

Если вы не уверены, какие значения на самом деле используются, вы можете узнать это, посмотревqemuпараметры командной строки. В системе Unix/Linux запустите гостевую систему, а затем запуститеps -ef | grep qemu... и найдите устройство QXL. Вероятно, это будет выглядеть примерно так-device qxl-vga,id=video0,ram_size=67108864,vram_size=67108864,vram64_size_mb=0,vgamem_mb=32,max_outputs=2,bus=pcie.0,addr=0x1. Важно значение vgamem_mb , равное 32.

После правильной настройки драйвера QXL изменить гостевое разрешение будет легко. Вы можете использовать графический конфигуратор дисплея или использоватьxrandrчерез командную строку. В моем случае я решил автоматизировать процесс с помощью следующего скрипта:

      #!/bin/bash
if [ `xrandr | grep --extended-regexp --count "Virtual-0 connected|Virtual-1 connected"` == 2 ]; then
xrandr --newmode "1920x1200_60.00"  193.25  1920 2056 2256 2592  1200 1203 1209 1245 -hsync +vsync
xrandr --addmode Virtual-0 "1920x1200_60.00"
xrandr --addmode Virtual-1 "1920x1200_60.00"
xrandr --output Virtual-0 --mode "1920x1200_60.00" --panning 1920x1200+0+0 --output Virtual-1 --mode "1920x1200_60.00" --panning 1920x1200+1920+0
elif [ `xrandr | grep --extended-regexp --count "qxl-0 connected|qxl-1 connected"` == 2 ]; then
xrandr --newmode "1920x1200_60.00"  193.25  1920 2056 2256 2592  1200 1203 1209 1245 -hsync +vsync
xrandr --addmode qxl-0 "1920x1200_60.00"
xrandr --addmode qxl-1 "1920x1200_60.00"
xrandr --output qxl-0 --mode "1920x1200_60.00" --panning 1920x1200+0+0 --output qxl-1 --mode "1920x1200_60.00" --panning 1920x1200+1920+0
elif [ `xrandr | grep --extended-regexp --count "Virtual-0 connected"` == 1 ]; then
xrandr --newmode "1920x1200_60.00"  193.25  1920 2056 2256 2592  1200 1203 1209 1245 -hsync +vsync
xrandr --addmode Virtual-0 "1920x1200_60.00"
xrandr --output Virtual-0 --mode "1920x1200_60.00" --panning 1920x1200+0+0
else
xrandr --newmode "1920x1200_60.00"  193.25  1920 2056 2256 2592  1200 1203 1209 1245 -hsync +vsync
xrandr --addmode qxl-0 "1920x1200_60.00"
xrandr --output qxl-0 --mode "1920x1200_60.00" --panning 1920x1200+0+0
fi

Обратите внимание, что это для настройки 1920x1200. Также стоит отметить, что в зависимости от вашего сервера отображения, версии ядра, настроек драйвера и т. д. адаптеры дисплея могут отображаться как «qxl-#» или «Virtual-#».

Чтобы использовать приведенный выше сценарий для разрешения, отличного от 1920x1200, вам необходимо использовать соответствующую модельную линию. Чтобы получить правильную модель, используйте инструмент командной строки. Например, если вам нужна модель для монитора 4K (он же 2160p), вы должны запуститьcvt 3840 2160 60(при условии, что частота обновления составляет 60 Гц). Это даст вам модельную линию:

      # 3840x2160 59.98 Hz (CVT 8.29M9) hsync: 134.18 kHz; pclk: 712.75 MHz
Modeline "3840x2160_60.00"  712.75  3840 4160 4576 5312  2160 2163 2168 2237 -hsync +vsync

Теперь возьмите значение, которое появляется после «Modeline»:

      "3840x2160_60.00"  712.75  3840 4160 4576 5312  2160 2163 2168 2237 -hsync +vsync

И замените значение:

      "1920x1200_60.00"  193.25  1920 2056 2256 2592  1200 1203 1209 1245 -hsync +vsync

В примере сценария выше.

Пара замечаний. А именно, текст внутри кавычек на самом деле является «меткой»… поэтому вам нужно будет заменить ссылки на"1920x1200_60.00"с этикеткой для вашей новой модели. Также стоит отметить, что вы можете опустить частоту обновления при вызове, и он будет догадываться... но это предположение может быть ошибочным, если вы запускаете его внутри гостевой системы. Чтобы избежать этой проблемы, вы можете позвонить своему хосту. В этом случае вы можете опустить частоту обновления иcvtопределит правильное значение, посмотрев на ваше оборудование.

Другие вопросы по тегам