Windows 10 UEFI Физический для KVM/libvirt Виртуальный

Оригинальное сообщение

Я переношу свой компьютер с Windows 10 на Linux. Есть несколько вещей, для которых мне все еще нужна Windows, и в настоящее время я выполняю двойную загрузку с Windows и Linux на отдельных физических дисках. Я хотел бы отказаться от двойной загрузки и запустить свою установку Windows 10, виртуализированную в KVM+libvirt+qemu.

Сложность здесь, похоже, заключается в том, что моя установка Windows 10 была выполнена через UEFI (с таблицей разделов GPT), а не через устаревший BIOS МБР. Вот как выглядит мой диск Windows:

$ sudo parted /dev/nvme0n1 print
Model: Unknown (unknown)
Disk /dev/nvme0n1: 500GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags:

Number  Start   End    Size    File system  Name                          Flags
 1      1049kB  524MB  523MB   ntfs         Basic data partition          hidden, diag
 2      524MB   628MB  104MB   fat32        EFI system partition          boot, esp
 3      628MB   645MB  16.8MB               Microsoft reserved partition  msftres
 4      645MB   500GB  499GB   ntfs         Basic data partition          msftdata

Поскольку он был настроен как UEFI, похоже, для виртуализации необходимы некоторые дополнительные шаги, поскольку libvirt, похоже, не поддерживает UEFI из коробки. Я попытался экспортировать каждый из вышеперечисленных разделов в виде образа qcow2 с помощью такой команды:

$ qemu-img convert -f raw -O qcow2 /dev/nvme0n1p1 win10_part1.qcow2

И повторяется для всех четырех разделов. Затем я создал виртуальную машину под управлением virt-manager, импортировав все четыре диска qcow2. Я установил пакет "ovmf" для своего дистрибутив (Manjaro) и добавил эту строку в файл конфигурации XML виртуальной машины в разделе "ОС":

<loader type='rom'>/usr/share/ovmf/x64/OVMF_CODE.fd</loader>

Когда я загружаю виртуальную машину, я вижу заставку TianoCore. Но это просто сбрасывает меня в оболочку grub2, вместо того, чтобы найти загрузчик Windows.

Я также попытался загрузить эту виртуальную машину из установочного ISO Windows 10, надеясь, что смогу "восстановить" систему для загрузки. Но это не сработало.

Я уверен, что что-то упускаю. Еще лучше было бы обратить это для загрузки MBR, просто чтобы избежать зависимости OVMF.

Редактировать/Обновлять...

Согласно комментарию Дилана, я действительно заставил его работать, но по пути возникло несколько небольших проблем, я подумал, что опубликую их здесь на случай, если у других возникнут подобные проблемы.

Первым шагом, как писал Дилан, было создание образа всего диска , а не отдельных дисков для каждого раздела. Я использовал эту команду:

qemu-img convert -f raw -O qcow2 /dev/nvme0n1 win10_import.qcow2

Затем я создал виртуальную машину в virt-manager, указав выше образа диска ("win10_import.qcow2") в качестве моего диска.

Далее следовало использовать прошивку UEFI OVMF (TianoCore). Это было сделано путем установки пакета ovmf ("ovmf" на Manjaro), а затем добавления его в XML-определение виртуальной машины:

  <os>
    <type arch='x86_64' machine='pc-q35-3.0'>hvm</type>
    <loader type='rom'>/usr/share/ovmf/x64/OVMF_CODE.fd</loader>
  </os>

После этого Windows будет по-прежнему аварийно завершать работу во время загрузки с синим экраном и ошибкой "ИСКЛЮЧЕНИЕ СИСТЕМНОГО ПОТОКА НЕ ОБРАБОТАНО". По какой-то причине ему не понравилась настройка процессора "Копировать конфигурацию центрального процессора". Я перешел на "core2duo", и это загрузилось. Прямо сейчас я использую "Сэндибридж", и это тоже работает. (Чего бы это ни стоило, я создал еще одну отдельную виртуальную машину Win10, выполнив новую установку с нуля. Что виртуальная машина действительно работала с "Конфигурацией процессора узла копирования". Мой процессор AMD Ryzen 5 2400G.)

Следующая проблема, с которой я столкнулся, заключалась в том, что Windows 10 работала невыносимо медленно. Каким-то образом мне удалось создать виртуальную машину с помощью гипервизора "QEMU TCG", а не "KVM". Это имеет смысл, так как первое эмуляция и ужасно медленная, в то время как последняя является настоящей аппаратной виртуализацией. (Как это произошло: пытаясь заставить это работать, я также выполнил обновление BIOS в физической системе, которое сбросило все мои настройки BIOS, одна из которых отключила виртуализацию (называемую "SVM" в моем BIOS). Как только я исправил это, я смог использовать гипервизор KVM с почти родной скоростью.)

Следующая проблема заключалась в том, что разрешение экрана застряло на 800x600. Windows не позволила бы мне его изменить. Я мог бы сделать одноразовое исправление, нажав Esc, как только машина загрузится, сразу после появления всплеска TianoCore. Это приводит меня в настройки UEFI, где я могу принудительно увеличить разрешение. Но это не постоянное исправление.

Поскольку моя виртуальная машина указала QXL в качестве видеоустройства, мне нужно было установить драйверы QXL в Windows. На этой странице Создание виртуальных машин Windows с использованием драйверов virtIO объясняется, как это сделать. Краткая версия такова: загрузите virtio-win iso на главной машине. Добавьте его в виртуальную машину в качестве привода компакт-дисков. Затем загрузитесь в виртуальную машину, перейдите в нужную папку на компакт-диске и установите все необходимые драйверы VirtIO. В частности, для видео QXL в Windows 10 в папке "qxldod" есть нужный драйвер.