LINUX.ORG.RU

KVM/qemu: виснет гостевая WinXP при переходе в ждущий режим (stand by).

 ,


1

1

Здравствуйте.

[ Дано ]
Домашний сервер HP ProLiant MicroServer Gen7 N40L (CPU AMD Turion II Neo N40L с технологией AMD-V).

Ubuntu Server 16.04.2 (4.4.0-71-generic x86_64).
Гипервизор KVM, виртуальная машина qemu (package qemu-kvm 1:2.5).
Seabios 1.8.2

Гостевая ОС - Windows XP SP3 x32.

Конфиг гостя winxppro.xml:

<domain type='kvm'>
  <name>winxppro</name>
  <uuid>8ef8376b-0b82-4b49-98a7-670ba02b3889</uuid>
  <memory unit='KiB'>262144</memory>
  <currentMemory unit='KiB'>262144</currentMemory>
  <vcpu placement='static'>1</vcpu>
  <os>
    <type arch='x86_64' machine='pc-i440fx-xenial'>hvm</type>
    <boot dev='hd'/>
  </os>
  <features>
    <acpi/>
    <apic/>
    <hyperv>
      <relaxed state='on'/>
      <vapic state='on'/>
      <spinlocks state='on' retries='8191'/>
    </hyperv>
  </features>
  <cpu mode='custom' match='exact'>
    <model fallback='allow'>Opteron_G3</model>
  </cpu>
  <clock offset='localtime'>
    <timer name='rtc' tickpolicy='catchup'/>
    <timer name='pit' tickpolicy='delay'/>
    <timer name='hpet' present='no'/>
    <timer name='hypervclock' present='yes'/>
  </clock>
  <on_poweroff>destroy</on_poweroff>
  <on_reboot>restart</on_reboot>
  <on_crash>restart</on_crash>
  <pm>
    <suspend-to-mem enabled='yes'/>
    <suspend-to-disk enabled='yes'/>
  </pm>
  <devices>
    <emulator>/usr/bin/kvm-spice</emulator>
    <disk type='file' device='disk'>
      <driver name='qemu' type='qcow2'/>
      <source file='/home/amok/vm/winxppro.img'/>
      <target dev='hda' bus='ide'/>
      <address type='drive' controller='0' bus='0' target='0' unit='0'/>
    </disk>
    <disk type='file' device='cdrom'>
      <driver name='qemu' type='raw'/>
      <target dev='hdb' bus='ide'/>
      <readonly/>
      <address type='drive' controller='0' bus='0' target='0' unit='1'/>
    </disk>
    <controller type='usb' index='0' model='ich9-ehci1'>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x7'/>
    </controller>
    <controller type='usb' index='0' model='ich9-uhci1'>
      <master startport='0'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x0' multifunction='on'/>
    </controller>
    <controller type='usb' index='0' model='ich9-uhci2'>
      <master startport='2'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x1'/>
    </controller>
    <controller type='usb' index='0' model='ich9-uhci3'>
      <master startport='4'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x2'/>
    </controller>
    <controller type='pci' index='0' model='pci-root'/>
    <controller type='ide' index='0'>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x1'/>
    </controller>
    <interface type='network'>
      <mac address='52:54:00:05:f6:bd'/>
      <source network='default'/>
      <model type='rtl8139'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
    </interface>
    <serial type='pty'>
      <target port='0'/>
    </serial>
    <console type='pty'>
      <target type='serial' port='0'/>
    </console>
    <input type='tablet' bus='usb'/>
    <input type='mouse' bus='ps2'/>
    <input type='keyboard' bus='ps2'/>
    <graphics type='vnc' port='-1' autoport='yes' listen='0.0.0.0'>
      <listen type='address' address='0.0.0.0'/>
    </graphics>
    <video>
      <model type='vmvga' vram='16384' heads='1'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/>
    </video>
    <memballoon model='virtio'>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0'/>
    </memballoon>
  </devices>
</domain>

[ Задача ]
При простое гостевая ОС должна сама уходить в режим ACPI S3 (или S1), для снижения нагрузки на CPU. И при подключении пользователя по VNC и шевелении им мышкой, «просыпаться». НЕ ПОДХОДИТ вариант «засыпать» виртуалку «снаружи» средствами qemu типа virsh dompmsuspend winxppro mem!

[ Что сделано ]
Изменил видеокарту в конфиге: 'vga' --> 'vmvga' и установил VMWARE видео-дравера.

Также установил драйвер VirtIO Balloon.

Установил в госте QEMU Guest Agent, но служба почему-то не стартует.

Вывод гостевой powercfg.exe:

C:\Documents and Settings\amok>powercfg -a
В данной системе доступны следующие состояния спящего режима: Standby ( S3 ) Hibernate
Следующие состояния спящего режима недоступны в данной системе:
Standby (S1)
Standby (S2)

C:\Documents and Settings\amok>powercfg /devicequery wake_programmable
NONE

C:\Documents and Settings\amok>powercfg /devicequery wake_armed
NONE

C:\Documents and Settings\amok>powercfg /devicequery wake_from_S1_supported
NONE

C:\Documents and Settings\amok>powercfg /devicequery wake_from_S2_supported
NONE

C:\Documents and Settings\amok>powercfg /devicequery wake_from_S3_supported
NONE

C:\Documents and Settings\amok>powercfg /devicequery wake_from_S4_supported
Неправильные параметры - используйте параметр "/?" для получения справки

C:\Documents and Settings\amok>powercfg /devicequery wake_from_any
NONE
Читать вывод powercfg -a нужно так: «Поддерживаются следующие режимы: Standby ( S3 ), Hibernate».

[ Проблема ]
Гостевая ОС виснет при переходе в ждущий режим. Т. е. начинается переход и затем какие-то полоски на экране. Причём VNC-соединение сохраняется, подключиться к виртуалке типа можно, только там чёрный экран, на мышь и клаву через VNC (send custom key) нет реакции (как и на попытку «нажать» клавишу «снаружи»: virsh send-key winxppro KEY_C). Может виртуалка не виснет, а не пробуждается? Выключение, перезагрузка, ресет на виртуалку плохо срабатывают, чётко отрабатывает только virsh destroy winxppro.

Кстати, в режим S4 (спящий режим или hibernate) гость уходит, только адски долго и при этом процесс qemu-system-x86 жрёт 100% CPU.

[ Вопросы ]
Налаживаю весь колхоз первый раз.

Куда копать?

  • Пытаться разобраться с BIOS виртуалки (SeaBIOS)? Какой режим там по-умолчанию стоит S1 или S3? Какая технология используется - APM или ACPI? Включено ли пробуждение от клавы или мыши?
  • Пытаться дожать драйвера устройств в самой виртуалке, ибо кто-то из них блокирует/портит переход?
  • Проблема в чём-то ещё?
  • Почему если сделать virsh suspend winxppro, то согласно top процесс qemu-system-x86 всё равно жрёт 5% CPU?

Спасибо!

Попробуй заменить i440fx на q35. Для этого лучше создать виртуалку заново, там много различий по шинам.

Deleted ()
Ответ на: комментарий от Deleted

При попытке запуска установки новой виртуалки:

sudo virt-install --hvm --virt-type kvm --machine q35 --name=winxppro3 --ram=256 --cdrom=/home/amok/win.iso --os-type=windows --os-variant=winxp --graphics vnc,port=7900,password=,listen=0.0.0.0 --memballoon virtio --video=vmvga --disk none

Гость выдал BSOD: The BIOS in this system is not fully ACPI compliant. ... you can turn off ACPI mode during text mode setup.

amokmen ()
Ответ на: комментарий от darkenshvein

Теперь я не понял — зачем WoL? Если я верно понимаю, то доступ по VNC к виртуалке, это как если бы пользователь сидел за настоящим монитором.

amokmen ()
Ответ на: комментарий от darkenshvein

Я хочу для виртуалки обычно-нормальное поведение среднестатистического десктопа: настраиваем ОС так, что, например, через 30 минут неактивности пользователя, ОС отправляет компьютер в ждущий режим. Как только пользователь возвращается и начинает дёргать за мышку, компьютер возвращается в боевое состояние.

amokmen ()
Ответ на: комментарий от King_Carlo

На своём десктопе с Win 7 поднял в VirtualBox'е Ubuntu Desktop 16.04, в нём установил Virtual Machine Manager 1.3.2 и прежде чем мудохатьсяизучать как его подключить к серверу, решил попробовать локально. Для этого сделал apt install qemu и локально создал виртуальную машину под WinXP (понятно, без поддержки со стороны KVM, но это же не влияет в данном случае?). В которой выбрал Q35 и обратил внимание, что при выборе Firmware опция «UEFI» недоступна, только «BIOS». При загрузке с ISO, BSOD выпадает там же, как и на сервере и с тем сообщением про говно-биос без поддержки ACPI. Подозреваю, что подключение к серверу и создание виртуалки там, не даст ничего нового.

amokmen ()
Ответ на: комментарий от amokmen

прежде чем мудохатьсяизучать как его подключить к серверу

файл->добавить соединение->поставить галку «удаленное подключение»->вбить имя пользователя и Ip сервера.

при выборе Firmware опция «UEFI» недоступна

Установи ovmf

King_Carlo ★★★★★ ()
Ответ на: комментарий от King_Carlo

Естественно, я пробовал подключение к серверу. C отрицательным результатом. Там, как обычно, «начинается...» :) «А установите какую-то хрень askpass». «А слушает ли нас с той стороны libvirtd?» А я откуда знаю? Вроде в сокетах по grep'у чего-то болтается с такими буквами, а мельком проглядев sudoedit /etc/libvirt/libvirtd.conf я вообще впал в ступор от обилия аббревиатур и прочих сокращений связанных с безопасными соединениями...

Установил ovmf, опция с каким-то UEFI появилась. Теперь нужно понять как в этом UEFI запустить загрузку с носителя, ибо я вижу только приглашение «Shell>».

amokmen ()
Ответ на: комментарий от amokmen

Чего-то туплю! Зачем мне UEFI для WinXP?! Понятно, что дистрибутивный диск с WinXP не содержит \efi\boot\bootx64.efi - поэтому и загрузка не стартует.

amokmen ()
Ответ на: комментарий от amokmen

А установите какую-то хрень askpass

Надо установить эту хрень askpass.

sudoedit /etc/libvirt/libvirtd.conf я вообще впал в ступор от обилия аббревиатур и прочих сокращений связанных с безопасными соединениями...

В убунте открыто по умолчанию, ничего трогать не надо.

Зачем мне UEFI для WinXP?!

Я не знаю.

King_Carlo ★★★★★ ()
Ответ на: комментарий от King_Carlo

askpass установлен тогда ещё. Только какой смысл от всей этой кутерьмы с подключением к серверу, если локально гуевая утилита не справилась?

amokmen ()
Ответ на: комментарий от amokmen

На десктопной Убунте версия SeaBIOS, кстати, такая же - 1.8.2.

amokmen ()
Ответ на: комментарий от amokmen

В общем, ничего не делал, однако внезапно подключение к серверу сработало. Машину сделал, Q35 выбрал. Тот же BSOD.

Кстати, этот askpass, кажется, мозг любит - при первом запуске виртуалки, для подключения к графической консоли запросил пароль (я так предполагаю от учётки, ибо пароль на подключение к консоли я не ставил), я пароль ввёл, а он кучку ошибок мне выдал и не показал консоль. Немедля прибил виртуалку и запустил заново, теперь уже пароль не никто не спрашивал и консоль с инсталляшкой показалась как надо.

amokmen ()
Ответ на: комментарий от amokmen

Подниму тему.

Единственный совет — попробовать создание виртуалки на базе Q35, в том числе с помощью гуёвого virt-manager — не помог.

Какие ещё будут мысли?

P.S. А я пока пошёл внимательно читать: http://www.linux-kvm.org/page/PowerManagement

amokmen ()
Ответ на: комментарий от iliyap

Изменил видеоадаптер на QXL, поставил драйвер. Есть улучшение: в ждущий режим виртуалка уходит, проц не грузится.

Только вот при попытке вывести виртуалку из ждущего режима путём посылки клавиши через VNC (на мышь не реагирует):

  • вываливается BSOD «A wait operation, attach process, or yield was attempted from a DPC routine.» STOP: 0x000000B8
  • умирает сеть (чтобы восстановить сеть, нужно выкл/вкл виртуалку, перезагрузки не помогают)

P. S. Спящий режим по-прежнему работает, сеть не умирает при пробуждении. Только вот уходит в него 256MB RAM 2 минуты!

amokmen ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.