QEMU-KVM зависает при перезагрузке гостя – как это исправить?

Вопрос или проблема

Я не тестировал это на госте Linux, но на виртуальной машине Windows 10 большинство перезагрузок зависают посередине загрузки. У меня никогда такого не было на VirtualBox, и я этого не ожидал, поскольку он обычно стабилен, а KVM, как я выяснил, очень капризен. Тем не менее, он действительно значительно быстрее, чем VirtualBox, поэтому я хочу это исправить.

Мне приходится принудительно выключать гостя каждый раз, когда это происходит.

Я использую EndeavourOS, LTS Kernel, KDE Plasma, X11, Thinkpad T470p (включая дискретную Nvidia GeForce 940MX [по умолчанию установлен Nvidia Optimus на использование только дискретного GPU]), 32 ГБ DDR4 3200MHz, M.2-2280 NVMe 1TB.

Я столкнулся с той же проблемой (или как минимум с очень похожей): моя только что созданная виртуальная машина KVM на основе UEFI, управляемая libvirt, всегда (или почти всегда) зависала во время перезагрузки, даже до появления сообщений загрузки UEFI.

Я не смог установить конкретную причину этого, но я исправил это, переключив прошивку UEFI с OVMF_CODE.fd, предоставленной пакетом edk2-ovmf-bin, на edk2-x86_64-code.fd, предоставленную самим QEMU.

Детали:

Я использую Gentoo Linux, версию app-emulation/qemu 8.0.4, версию sys-firmware/edk2-ovmf-bin 202202.

“Плохой” XML-описание домена libvirt (который зависал при перезагрузке) содержал следующий фрагмент:

  <os firmware="efi">
    <type arch="x86_64" machine="pc-q35-8.0">hvm</type>
    <firmware>
      <feature enabled='no' name="enrolled-keys"/>
      <feature enabled='no' name="secure-boot"/>
    </firmware>
    <loader readonly='yes' type="pflash">/usr/share/edk2-ovmf/OVMF_CODE.fd</loader>
    <nvram template="/usr/share/edk2-ovmf/OVMF_VARS.fd">/var/lib/libvirt/qemu/nvram/xxxxx_VARS.fd</nvram>
  </os>

“Хороший” XML-описание домена libvirt (который не зависает) вместо этого имеет следующий фрагмент:

  <os firmware="efi">
    <type arch="x86_64" machine="pc-q35-8.0">hvm</type>
    <firmware>
      <feature enabled='no' name="enrolled-keys"/>
      <feature enabled='no' name="secure-boot"/>
    </firmware>
    <loader readonly='yes' type="pflash">/usr/share/qemu/edk2-x86_64-code.fd</loader>
    <nvram template="/usr/share/qemu/edk2-i386-vars.fd">/var/lib/libvirt/qemu/nvram/xxxxxx_VARS.fd</nvram>
  </os>

(Обратите внимание на расхождение между названиями файла “code” и файла шаблона “vars”: x86_64 против i386. У меня возникли проблемы с работой прошивки QEMU, потому что я пытался использовать совпадающие имена – либо i368, либо x86_64 – в обоих именах файлов, что было неправильно.)

Ответ или решение

Проблема зависания виртуальной машины QEMU-KVM при перезагрузке может быть связана с несколькими факторами, особенно если вы используете UEFI. На основе описаний, приведённых в вашем запросе, есть несколько действий, которые могут помочь решить эту проблему.

  1. Замена UEFI прошивки: Как было упомянуто в одном из ваших примеров, переход с прошивки OVMF_CODE.fd, предоставленной пакетом edk2-ovmf-bin, на edk2-x86_64-code.fd, поставляемую с QEMU, может решить проблему зависания при перезагрузке. Убедитесь, что ваша конфигурация XML для виртуальной машины указывает на правильные пути к файлам:

    Пример "плохой" конфигурации:

    <os firmware="efi">
       <type arch="x86_64" machine="pc-q35-8.0">hvm</type>
       <firmware>
           <feature enabled='no' name="enrolled-keys"/>
           <feature enabled='no' name="secure-boot"/>
       </firmware>
       <loader readonly='yes' type="pflash">/usr/share/edk2-ovmf/OVMF_CODE.fd</loader>
       <nvram template="/usr/share/edk2-ovmf/OVMF_VARS.fd">/var/lib/libvirt/qemu/nvram/xxxxx_VARS.fd</nvram>
    </os>

    Пример "хорошей" конфигурации:

    <os firmware="efi">
       <type arch="x86_64" machine="pc-q35-8.0">hvm</type>
       <firmware>
           <feature enabled='no' name="enrolled-keys"/>
           <feature enabled='no' name="secure-boot"/>
       </firmware>
       <loader readonly='yes' type="pflash">/usr/share/qemu/edk2-x86_64-code.fd</loader>
       <nvram template="/usr/share/qemu/edk2-i386-vars.fd">/var/lib/libvirt/qemu/nvram/xxxxxx_VARS.fd</nvram>
    </os>

    Убедитесь, что у вас установлены актуальные версии QEMU и OVMF, чтобы избежать проблем совместимости.

  2. Настройки виртуальной машины: Убедитесь, что ваша виртуальная машина настроена правильно, включая настройки CPU, памяти и видео. Возможно, неполные или некорректные настройки могут привести к тому, что система зависает во время перезагрузки.

  3. Обновления и патчи: Проверяйте наличие обновлений для вашей операционной системы, QEMU и связанных пакетов, таких как libvirt. Иногда проблемы могут быть решены в новых версиях программного обеспечения.

  4. Проверка аппаратного обеспечения: Если проблема продолжает существовать, стоит проверить, могут ли быть проблемы с аппаратным обеспечением, особенно с динамическим переключением между графическими адаптерами (Nvidia Optimus). Убедитесь, что драйвера для вашей видеокарты установлены правильно и работают, как задумано.

  5. Логи и отладка: Проверяйте логи системы и QEMU на наличие ошибок, которые могли бы дать больше информации о причине зависания. Логи можно найти в /var/log/libvirt/qemu/ и на уровне системы.

Если после выполнения этих шагов проблема не решается, вы можете опубликовать дополнительную информацию о конфигурации вашей системы и логах, чтобы получить более детальную помощь от сообщества.

Оцените материал
Добавить комментарий

Капча загружается...