Windows 10 UEFI Физический в KVM/libvirt Virtual
Оригинальный пост
Я перевожу свой компьютер с Windows 10 на Linux. Есть несколько вещей, для которых мне все еще нужна Windows, и в настоящее время у меня двойная загрузка, с Windows и Linux на отдельных физических дисках. Я бы хотел избежать двойной загрузки и запустить виртуальную установку Windows 10 под KVM+libvirt+qemu.
Сложная часть здесь, кажется, состоит в том, что моя установка Windows 10 была сделана через UEFI (с таблицей разделов GPT), а не из устаревшей BIOS MBR. Вот как выглядит мой диск 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-файл конфигурации виртуальной машины в разделе "os":
<loader type='rom'>/usr/share/ovmf/x64/OVMF_CODE.fd</loader>
Когда я загружаю виртуальную машину, я вижу заставку TianoCore. Но это просто бросает меня в оболочку grub2, вместо того, чтобы найти загрузчик Windows.
Я также попытался загрузить эту виртуальную машину из Windows 10, установив ISO, надеясь, что смогу "починить" систему для загрузки. Но это не сработало.
Я уверен, что что-то упустил. Еще лучше было бы преобразовать это в загрузку MBR, просто чтобы избежать зависимости OVMF.
Редактировать / Обновление...
Согласно комментарию Дилана, я все заработал, но на этом пути возникло несколько небольших проблем, и я решил опубликовать их здесь на случай, если у других возникнут аналогичные проблемы.
Первым шагом, как писал Дилан, было создание образа всего диска, а не отдельных дисков на разделы. Я использовал эту команду:
qemu-img convert -f raw -O qcow2 /dev/nvme0n1 win10_import.qcow2
Затем я создал виртуальную машину в virt-manager, указав в качестве диска указанный выше образ диска ("win10_import.qcow2").
Далее нужно было использовать прошивку OVMF (TianoCore) UEFI. Это было сделано путем установки пакета 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", и это загрузилось. Прямо сейчас я использую "SandyBridge", и это тоже работает. (Для чего бы то ни было, я создал еще одну отдельную виртуальную машину 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 на хост-компьютер. Добавьте его в виртуальную машину в качестве привода CD-ROM. Затем загрузитесь в виртуальную машину, перейдите в нужную папку на компакт-диске и установите все необходимые драйверы VirtIO. В частности, для видео QXL в Windows 10 папка "qxldod" имеет правильный драйвер.
2 ответа
QEMU/Libvirt ожидают, что вы предоставите виртуальный диск: ваши файлы QCOW2 должны быть дисками, а не разделами. Делая то, что вы сделали, вы получили 4 файла qcow2, каждый с одним разделом. Вы нарушили прежнюю структуру, поэтому неудивительно, что GRUB больше не может загружать вашу систему.
Я предлагаю вам преобразовать весь физический диск в один файл QCOW2, а затем подключить этот виртуальный диск к вашей виртуальной машине.
Вы должны быть в состоянии удалить файл GRUB EFI из раздела EFI (см. Инструменты libguestfs) и получить доступ к меню загрузки, так как загрузчик Windows должен быть загружен UEFI виртуальной машины.
Если кто-то еще наткнется на этот вопрос, есть другая альтернатива для использования собственной установки Windows в качестве виртуальной машины в Linux:
- Представьте себе все устройство в соответствии с принятым ответом Дилана.
- Запустите ВМ из необработанного хранилища.
Мне удалось № 2 выше, но это может быть довольно сложно. Это становится довольно сложным и рискованным, если и Linux, и Windows используют одно и то же устройство.
Это стоит дополнительных усилий по разным причинам:
- Уже есть и нравится установка двойной загрузки.
- Необходимо запустить Windows непосредственно на оборудовании.
- Производительность графики для игр (и нет материнской платы / установки, способной выполнять PCI с 2x GPU и т. Д.).
- Чрезмерно чувствительные аудиоприложения, такие как Skype для бизнеса, которые плохо работают через виртуализированные аудиоустройства.
- Хотите удобство виртуальной машины для запуска других менее требовательных приложений Windows, таких как MS Office и т. Д.
Были многочисленные предостережения / обходные пути:
- Я боролся за то, чтобы окна оставались активированными, поскольку очевидно, что они привязывают лицензии к оборудованию. Трудно было добавить серийные номера материнской платы /BIOS, точную модель процессора и серийные номера устройств хранения.
- Добавьте правила udev, чтобы файловый менеджер Linux/Nautilus/Gnome игнорировал разделы Windows.
- Из-за паранойи (обеспокоенные обновления Windows могут повлиять на настройки grub/boot), я не просто поделился всем своим сырым диском с виртуальной машиной. Вместо:
- Я клонировал таблицу разделов (GPT) и раздел EFI в файлы, а также создал фальшивый конец файла образа устройства.
- Использовал драйвер loopback для обработки клонированных изображений как устройств
- Использовал драйвер MD (multi-device) через линейную настройку mdadm, чтобы объединить все необходимые компоненты в единое целое в качестве гибридного образа и необработанного устройства для виртуальной машины. Например
md0
построен из<GPT table clone image/loopback> + <recovery raw> + <EFI clone image/loopback> + <windows system raw> + <end of device GPT backup table/loopback>
, - Использовал gdisk и testdisk для исправления / корректировки таблиц разделов по мере необходимости.
- Обновление 1803 windows 10 добавило дополнительные параметры, на которые мне пришлось отрегулировать! Новый раздел появляется после установки обновления Windows 10 апреля. Нужно исправить снова...
Я использовал аналогичную настройку для 2-й системы, но значительно упростил мою жизнь, имея 2 отдельных устройства хранения: одно для Linux, другое для Windows.