Вопрос или проблема
Я не тестировал это на госте 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. На основе описаний, приведённых в вашем запросе, есть несколько действий, которые могут помочь решить эту проблему.
-
Замена 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, чтобы избежать проблем совместимости.
-
Настройки виртуальной машины: Убедитесь, что ваша виртуальная машина настроена правильно, включая настройки CPU, памяти и видео. Возможно, неполные или некорректные настройки могут привести к тому, что система зависает во время перезагрузки.
-
Обновления и патчи: Проверяйте наличие обновлений для вашей операционной системы, QEMU и связанных пакетов, таких как libvirt. Иногда проблемы могут быть решены в новых версиях программного обеспечения.
-
Проверка аппаратного обеспечения: Если проблема продолжает существовать, стоит проверить, могут ли быть проблемы с аппаратным обеспечением, особенно с динамическим переключением между графическими адаптерами (Nvidia Optimus). Убедитесь, что драйвера для вашей видеокарты установлены правильно и работают, как задумано.
-
Логи и отладка: Проверяйте логи системы и QEMU на наличие ошибок, которые могли бы дать больше информации о причине зависания. Логи можно найти в
/var/log/libvirt/qemu/
и на уровне системы.
Если после выполнения этих шагов проблема не решается, вы можете опубликовать дополнительную информацию о конфигурации вашей системы и логах, чтобы получить более детальную помощь от сообщества.