Переносим Windows в виртуалку

Sergey, 24 January 2019

Всем привет! В связи с этим тредом я решил вернуться к своей давней идее отказаться от Windows в дуалбуте и перенести её в виртуальную машину. Но на пути решения этой задачи возникло несколько проблем, связанных с тем, что я пользуюсь ноутбуком, не совсем предназначенным, для подобных задач:

  1. Объём диска составляет 256 Гб, большая часть из которых занята виндой.
  2. Памяти тоже не шибко много много, только 8 Гб, поэтому бывало, что при запуске виртуалки система начинала подвисать, если виртуалке выделить слишком много памяти.
  3. Ну и самое худшее - только интегрированная видеопамять, что, казалось бы, ставило крест на использовании аппаратной виртуализации. В связи со всем этим, было решено создать виртуалку, использующую реальный жёсткий диск. Для ускорения виртуализации мне всё в том же треде посоветовали попробовать технологию Intel GVT-g. По итогам поисков в гугле и попыток разобраться с документацией я пришёл к алгоритму, похожему на описанный в этом посте (мой перевод этого поста на Хабре). Здесь я выделю отличия моего случая от случая в блоге и расскажу о них подробнее.

Перенос существующей системы в ВМ

Снимать образ с раздела мне было некуда, поэтому я решил “виртуализировать” уже установленную систему. Это привело к двум особенностям установки: мне нужно было использовать физический жёсткий диск, и виртуалка должна была быть создана с поддержкой UEFI. Первая проблема решилась весьма просто: нужно было при импорте образа диска указать физический диск:

Скриншот virt-manager

С UEFI всё несколько сложнее. Сперва нужно установить OVMF - открытую реализацию UEFI для KVM:

$ sudo pacman -S ovmf

Дальше нужно прописать путь к образу OVMF в конфиг libvirt, для чего нужно добавить в /etc/libvirt/qemu.conf:

nvram = [
	"/usr/share/ovmf/x64/OVMF_CODE.fd:/usr/share/ovmf/x64/OVMF_VARS.fd"
]

После чего нужно (пере-)запустить libvirt:

$ sudo systemctl restart libvirtd

Для того, чтобы иметь возможность дополнительно настроить конфигурацию системы, стоит отметить чекбокс “Проверить конфигурацию перед установкой”:

Окно с чекбоксом

При проверке конфигурации видим, что можно выбрать UEFI:

Окно проверки конфигурации

В принципе, с этим набором уже можно продолжать установку, как описано в посте, но в виртуальной машине не будет сети, если вдруг ваш компьютер использует беспроводной адаптер.

Настройка сети

Приведу инструкцию по настройке сети в виртуальной машине, взятую со Stack Exchange:

  1. Создадим подсеть локальной сети хоста в virt-manager:

Настройка сети

  1. Проверим с помощью ip route, что беспроводной интерфейс и bridge имеют разный destination IP:
    $ ip route
    default via 192.168.0.1 dev wlp2s0 proto dhcp src 192.168.0.101 metric 302
    192.168.0.160/27 dev virbr1 proto kernel scope link src 192.168.0.161 linkdown
    
  2. Включим проксирование ARP на интерфейсах:
    $ echo 1 | sudo tee /proc/sys/net/ipv4/conf/wlp2s0/proxy_arp
    $ echo 1 | sudo tee /proc/sys/net/ipv4/conf/virbr1/proxy_arp
    

    Для того, чтобы изменения не пропали при перезагрузке, можно использовать добавить в файл /etc/sysctl.d/90-vm.conf строку:

    net.ipv4.conf.wlp2s0.proxy_arp=1
    

Итоги

К сожалению, у меня так и не получилось довести решение до конца, поскольку Windows, установленная на диске, уже имела драйвера от производителя ноутбука, поэтому драйвера от Intel мне поставить не удалось. Установленные драйвера не хотели работать в виртуалке, вызывая тёмный экран, поэтому я отложил свою затею до лучших времён.