Нет автоматического изменения размера с 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
определит правильное значение, посмотрев на ваше оборудование.