[Перевод] Запускаем нативную конфигурацию Linux как виртуальную машину при помощи HyperV

Несколько дней назад я собрал первоклассную рабочую станцию, чтобы возиться с хобби-проектами и играть. Купил себе наилучший и новейший процессор (Ryzen 3900x — 12 ядер, 24 потока), производство AMD, а также 32 ГБ ОЗУ — как говорится, «компромиссы — не для нас». Собрал ПК, оказалось, он просто летает. Сконфигурировал систему так, чтобы в ней можно было одновременно работать с Windows и Linux (PopOS), пользуясь двойной загрузкой. От прошлой сборки у меня сохранился твердотельный диск (SSD), на котором был установлен и сконфигурирован дистрибутив Linux. Там я настроил поисковые роботы для Twitter, а также установил и приспособил для работы другие сервисы. Linux я использовал для задач, где требуется продуктивность, а под Windows в основном играл — впрочем, так и принято.

Некоторое время спустя я осознал, что у такой конфигурации есть явный недостаток. Пока я играл, мои поисковые роботы и прочие сервисы, в сущности, оставались выключены. Чтобы это исправить, я изменил порядок загрузки так, чтобы по умолчанию загружалась именно ОС Linux. Но даже в таком случае я не был готов смиряться с такой нагрузкой, которую испытывал процессор — фактически, он был вынужден тянуть обе эти ОС одновременно, хотя и более чем справлялся с этим. Если бы мне удалось как-то виртуализовать уже установленный у меня образ Linux, то процессор бы смог обслуживать обе ОС, даже не напрягаясь. Я к тому же ленив и обнаружил, что переключаться с одной действующей ОС на другую, фактически, деактивируя при этом первую — очень сложно, в особенности, если делать это часто. Мне хотелось просто снизить издержки.

Итак, резюмируя вышесказанное: я хотел попробовать загрузить уже имеющийся образ Linux с другого SSD, представив его как гостевую виртуальную машину под Windows. У меня уже была установлена Windows 10 Professional, так что о выборе гипервизора вопрос не стоял — данная конкретная версия Windows поставляется с Hyper-V. Сложность здесь была в том, как загрузиться именно с физического жёсткого диска, а не с виртуального. Вот какие проблемы вырисовывались с вышеописанным подходом:
1. Как проскочить через жёсткий диск (на котором уже установлен Linux) прямо на виртуальную машину
2. Как загрузиться с этого жёсткого диска, воспользовавшись виртуализованным носителем GRUB
3. Как решить другие проблемы, чтобы добиться гладкой работы системы

Активируем виртуализацию и HyperV


Первым делом необходимо зайти в BIOS и оттуда активировать возможность виртуализации, включив её в Windows. В моём случае всё было просто: найти в BIOS настройку Virtual Machine Mode (SVM) — безопасный режим виртуальной машины. Когда она активна, в Windows можно пользоваться HyperV. После этого активировать HyperV в Windows не составляет труда. Просто выполните следующие шаги:
1. Через поисковую строку Windows найдите раздел Windows Features.
2. Поставьте флажок у Hyper-V. Нажмите OK — и всё должно быть готово.
3. Как только вы активируете эту возможность, Windows перезапустится.

image


Как через SSD добраться до виртуальной машины


Следующая задача — убедиться, что фактически используемый носитель данных в моём случае — SSD) преодолевается без каких-нибудь помех для только что созданной нами виртуальной машины. Обязательно убедитесь, что Windows не пользуется этим носителем и аккуратно перепоручает его нашей целевой VM.

В Windows переводим устройство в оффлайновый режим

Нужно убедиться, что те носители, которые мы передаём виртуальной машине, не используются операционной системой хоста. Для этого диск необходимо перевести в оффлайновый режим. Для этого можно выполнить, например, следующие шаги:
1. Найдите инструмент Disk Management (Управление дисками) через поисковую строку Windows и откройте его.
2. В нижней части экрана должны выстроиться все ваши диски, в том числе, логические.
3. Перейдите к тому носителю с Linux, на который вы хотите устроить переадресацию (речь о том диске, на котором установлен Linux) и щёлкните по нему левой кнопкой мыши. Будет предложено перевести этот диск в оффлайновый режим, щёлкните по этому варианту. Теперь диск должен оказаться оффлайн, и эти изменения отразятся в пользовательском интерфейсе.

image


Создаём виртуальную машину при помощи HyperV

Выполнив предыдущий этап, далее вы должны создать виртуальную машину при помощи HyperV. Перейдите в HyperV и там создайте новую VM. Новая виртуальная машина создаётся сразу со всеми необходимыми конфигурационными настройками — речь, в частности, об объёме памяти и количестве ядер процессора. Создавая новую виртуальную машину, убедитесь, что выбираете для неё поколение 2 в разделе «Specify Generation» (на то нет никаких особых причин, просто этот вариант кажется более новым и мне лучше подходит). В разделе Connect Virtual Hard disk (Подключить виртуальный жёсткий диск) выберите опцию «Attach a Virtual Hard disk later» (Прикрепить виртуальный жёсткий диск позже). Чтобы смонтировать наш носитель с Linux и убедиться, что мы можем с него загрузиться, нам нужно проложить путь с этого устройства к виртуальной машине:
1. Перейдите в настройки той VM, которую только что создали, найдите раздел с контроллером SCSI. Там необходимо добавить жёсткий диск.
2. В разделе «media» ваш HDD с Linux HDD должен появиться в разделе «Physical Hard disk» (физический жёсткий диск). Выберите жёсткий диск и нажмите «apply» (Применить).
3. Смонтируйте и любые другие диски, которые вам потребуются.
4. Скачайте отсюда образ диска SuperGrub2
5. В подразделе «DVD drive» раздела SCSI выберите в качестве файла образа тот ISO, который недавно скачали.

image


SuperGrub2 поможет нам в случае, если при загрузке с VM мы не сможем найти раздел с GRUB. Таким образом, при помощи SuperGrub2 мы загружаемся в установленный дистрибутив Linux.
Когда закончите, оставьте для DVD-дисковода наивысший загрузочный приоритет.

Отключаем мгновенные снимки


HyperV не позволит вам загрузить созданную таким образом виртуальную машину, так как HyperV Manager не может делать мгновенные снимки. Дело в том, что носитель, на котором установлена наша система — это физический HDD, а не виртуальный. Можно отключить создание мгновенных снимков, перейдя в настройки VM → Management → Checkpoints и убрав галочку у пункта «Enable Checkpoints».

Загружаемся через виртуальную машину Linux


Как только выполните все вышеперечисленные шаги, вы сможете поднять виртуальную машину и далее загрузиться в меню SuperGrub. В этом меню выберите запись «Detect and show boot methods» (Обнаружить и показать методы загрузки).

image


После этого у вас должна появиться возможность выбрать вашу версию Linux, и далее вы сможете в неё загрузиться.

Конфигурируем драйвер дисплея


Если вы пользуетесь в имеющемся у вас дистрибутиве Linux проприетарными драйверами Nvidia, то их нужно удалить. Сделав это, установите пакет xserver-xorg-video-fbdev, чтобы у вас заработал сервер xorg.

sudo apt-get install xserver-xorg-video-fbdev 


Также я добавил конфигурационный файл x11, но точно не знаю, помог он или нет. Оставлю, вдруг кому-нибудь пригодится. Создайте новый файл /etc/X11/xorg.conf.d/30-hyperv.conf и добавьте в него следующий сниппет.

Section "Device"
   Identifier "HYPER_V Framebuffer"
   Driver "fbdev"
EndSection


Без перечисленных костылей я не мог загрузиться в графический пользовательский интерфейс (хотя, интерфейс командной строки работает нормально). Как только всё это проделаете и перезагрузитесь, Linux GUI должен начать нормально загружаться.

Заключение


Поздравляем! Вот вы и виртуализовали ваш дистрибутив Linux, и теперь можете обращаться к нему из вашей ОС Windows. Достоинство этого подхода в том, что при нём сохраняется возможность нормально загружаться в ОС Linux, а все изменения остаются согласованными как в виртуальной машине, так и в самой системе Linux, так как обе эти системы установлены на одном и том же носителе. Единственное, с чем у меня возникли проблемы — как включить драйверы GPU. Может быть, в будущем я смогу динамически переключать дисплейные драйверы в зависимости от контекста.

Ещё этот метод не сработает, если на рассматриваемом жёстком диске у вас стоит Linux. Думаю, в таком случае было бы проще преобразовать весь сегмент диска в VHDX-файл. У такого подхода есть собственные недостатки — в частности, вы не сможете добиться согласованности данных в обоих инстансах.

image

© Habrahabr.ru