Несколько дней назад я собрал первоклассную рабочую станцию, чтобы возиться с хобби-проектами и играть. Купил себе наилучший и новейший процессор (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. Сложность здесь была в том, как загрузиться именно с физического жёсткого диска, а не с виртуального. Вот какие проблемы вырисовывались с вышеописанным подходом:
Первым делом необходимо зайти в BIOS и оттуда активировать возможность виртуализации, включив её в Windows. В моём случае всё было просто: найти в BIOS настройку Virtual Machine Mode (SVM) – безопасный режим виртуальной машины. Когда она активна, в Windows можно пользоваться HyperV. После этого активировать HyperV в Windows не составляет труда. Просто выполните следующие шаги:
Следующая задача – убедиться, что фактически используемый носитель данных в моём случае — SSD) преодолевается без каких-нибудь помех для только что созданной нами виртуальной машины. Обязательно убедитесь, что Windows не пользуется этим носителем и аккуратно перепоручает его нашей целевой VM.
В Windows переводим устройство в оффлайновый режим
Нужно убедиться, что те носители, которые мы передаём виртуальной машине, не используются операционной системой хоста. Для этого диск необходимо перевести в оффлайновый режим. Для этого можно выполнить, например, следующие шаги:
Создаём виртуальную машину при помощи HyperV
Выполнив предыдущий этап, далее вы должны создать виртуальную машину при помощи HyperV. Перейдите в HyperV и там создайте новую VM. Новая виртуальная машина создаётся сразу со всеми необходимыми конфигурационными настройками – речь, в частности, об объёме памяти и количестве ядер процессора. Создавая новую виртуальную машину, убедитесь, что выбираете для неё поколение 2 в разделе «Specify Generation» (на то нет никаких особых причин, просто этот вариант кажется более новым и мне лучше подходит). В разделе Connect Virtual Hard disk (Подключить виртуальный жёсткий диск) выберите опцию “Attach a Virtual Hard disk later” (Прикрепить виртуальный жёсткий диск позже). Чтобы смонтировать наш носитель с Linux и убедиться, что мы можем с него загрузиться, нам нужно проложить путь с этого устройства к виртуальной машине:
SuperGrub2 поможет нам в случае, если при загрузке с VM мы не сможем найти раздел с GRUB. Таким образом, при помощи SuperGrub2 мы загружаемся в установленный дистрибутив Linux.
Когда закончите, оставьте для DVD-дисковода наивысший загрузочный приоритет.
HyperV не позволит вам загрузить созданную таким образом виртуальную машину, так как HyperV Manager не может делать мгновенные снимки. Дело в том, что носитель, на котором установлена наша система – это физический HDD, а не виртуальный. Можно отключить создание мгновенных снимков, перейдя в настройки VM -> Management -> Checkpoints и убрав галочку у пункта «Enable Checkpoints».
Как только выполните все вышеперечисленные шаги, вы сможете поднять виртуальную машину и далее загрузиться в меню SuperGrub. В этом меню выберите запись “Detect and show boot methods” (Обнаружить и показать методы загрузки).
После этого у вас должна появиться возможность выбрать вашу версию Linux, и далее вы сможете в неё загрузиться.
Если вы пользуетесь в имеющемся у вас дистрибутиве Linux проприетарными драйверами Nvidia, то их нужно удалить. Сделав это, установите пакет xserver-xorg-video-fbdev, чтобы у вас заработал сервер xorg.
Также я добавил конфигурационный файл x11, но точно не знаю, помог он или нет. Оставлю, вдруг кому-нибудь пригодится. Создайте новый файл /etc/X11/xorg.conf.d/30-hyperv.conf и добавьте в него следующий сниппет.
Без перечисленных костылей я не мог загрузиться в графический пользовательский интерфейс (хотя, интерфейс командной строки работает нормально). Как только всё это проделаете и перезагрузитесь, Linux GUI должен начать нормально загружаться.
Поздравляем! Вот вы и виртуализовали ваш дистрибутив Linux, и теперь можете обращаться к нему из вашей ОС Windows. Достоинство этого подхода в том, что при нём сохраняется возможность нормально загружаться в ОС Linux, а все изменения остаются согласованными как в виртуальной машине, так и в самой системе Linux, так как обе эти системы установлены на одном и том же носителе. Единственное, с чем у меня возникли проблемы – как включить драйверы GPU. Может быть, в будущем я смогу динамически переключать дисплейные драйверы в зависимости от контекста.
Ещё этот метод не сработает, если на рассматриваемом жёстком диске у вас стоит Linux. Думаю, в таком случае было бы проще преобразовать весь сегмент диска в VHDX-файл. У такого подхода есть собственные недостатки – в частности, вы не сможете добиться согласованности данных в обоих инстансах.
Некоторое время спустя я осознал, что у такой конфигурации есть явный недостаток. Пока я играл, мои поисковые роботы и прочие сервисы, в сущности, оставались выключены. Чтобы это исправить, я изменил порядок загрузки так, чтобы по умолчанию загружалась именно ОС Linux. Но даже в таком случае я не был готов смиряться с такой нагрузкой, которую испытывал процессор – фактически, он был вынужден тянуть обе эти ОС одновременно, хотя и более чем справлялся с этим. Если бы мне удалось как-то виртуализовать уже установленный у меня образ Linux, то процессор бы смог обслуживать обе ОС, даже не напрягаясь. Я к тому же ленив и обнаружил, что переключаться с одной действующей ОС на другую, фактически, деактивируя при этом первую – очень сложно, в особенности, если делать это часто. Мне хотелось просто снизить издержки.
Итак, резюмируя вышесказанное: я хотел попробовать загрузить уже имеющийся образ Linux с другого SSD, представив его как гостевую виртуальную машину под Windows. У меня уже была установлена Windows 10 Professional, так что о выборе гипервизора вопрос не стоял – данная конкретная версия Windows поставляется с Hyper-V. Сложность здесь была в том, как загрузиться именно с физического жёсткого диска, а не с виртуального. Вот какие проблемы вырисовывались с вышеописанным подходом:
- Как проскочить через жёсткий диск (на котором уже установлен Linux) прямо на виртуальную машину
- Как загрузиться с этого жёсткого диска, воспользовавшись виртуализованным носителем GRUB
- Как решить другие проблемы, чтобы добиться гладкой работы системы
Активируем виртуализацию и HyperV
Первым делом необходимо зайти в BIOS и оттуда активировать возможность виртуализации, включив её в Windows. В моём случае всё было просто: найти в BIOS настройку Virtual Machine Mode (SVM) – безопасный режим виртуальной машины. Когда она активна, в Windows можно пользоваться HyperV. После этого активировать HyperV в Windows не составляет труда. Просто выполните следующие шаги:
- Через поисковую строку Windows найдите раздел Windows Features.
- Поставьте флажок у Hyper-V. Нажмите OK – и всё должно быть готово.
- Как только вы активируете эту возможность, Windows перезапустится.
Как через SSD добраться до виртуальной машины
Следующая задача – убедиться, что фактически используемый носитель данных в моём случае — SSD) преодолевается без каких-нибудь помех для только что созданной нами виртуальной машины. Обязательно убедитесь, что Windows не пользуется этим носителем и аккуратно перепоручает его нашей целевой VM.
В Windows переводим устройство в оффлайновый режим
Нужно убедиться, что те носители, которые мы передаём виртуальной машине, не используются операционной системой хоста. Для этого диск необходимо перевести в оффлайновый режим. Для этого можно выполнить, например, следующие шаги:
- Найдите инструмент Disk Management (Управление дисками) через поисковую строку Windows и откройте его.
- В нижней части экрана должны выстроиться все ваши диски, в том числе, логические.
- Перейдите к тому носителю с Linux, на который вы хотите устроить переадресацию (речь о том диске, на котором установлен Linux) и щёлкните по нему левой кнопкой мыши. Будет предложено перевести этот диск в оффлайновый режим, щёлкните по этому варианту. Теперь диск должен оказаться оффлайн, и эти изменения отразятся в пользовательском интерфейсе.
Создаём виртуальную машину при помощи HyperV
Выполнив предыдущий этап, далее вы должны создать виртуальную машину при помощи HyperV. Перейдите в HyperV и там создайте новую VM. Новая виртуальная машина создаётся сразу со всеми необходимыми конфигурационными настройками – речь, в частности, об объёме памяти и количестве ядер процессора. Создавая новую виртуальную машину, убедитесь, что выбираете для неё поколение 2 в разделе «Specify Generation» (на то нет никаких особых причин, просто этот вариант кажется более новым и мне лучше подходит). В разделе Connect Virtual Hard disk (Подключить виртуальный жёсткий диск) выберите опцию “Attach a Virtual Hard disk later” (Прикрепить виртуальный жёсткий диск позже). Чтобы смонтировать наш носитель с Linux и убедиться, что мы можем с него загрузиться, нам нужно проложить путь с этого устройства к виртуальной машине:
- Перейдите в настройки той VM, которую только что создали, найдите раздел с контроллером SCSI. Там необходимо добавить жёсткий диск.
- В разделе «media» ваш HDD с Linux HDD должен появиться в разделе «Physical Hard disk» (физический жёсткий диск). Выберите жёсткий диск и нажмите «apply» (Применить).
- Смонтируйте и любые другие диски, которые вам потребуются.
- Скачайте отсюда образ диска SuperGrub2
- В подразделе «DVD drive» раздела SCSI выберите в качестве файла образа тот ISO, который недавно скачали.
SuperGrub2 поможет нам в случае, если при загрузке с VM мы не сможем найти раздел с GRUB. Таким образом, при помощи SuperGrub2 мы загружаемся в установленный дистрибутив Linux.
Когда закончите, оставьте для DVD-дисковода наивысший загрузочный приоритет.
Отключаем мгновенные снимки
HyperV не позволит вам загрузить созданную таким образом виртуальную машину, так как HyperV Manager не может делать мгновенные снимки. Дело в том, что носитель, на котором установлена наша система – это физический HDD, а не виртуальный. Можно отключить создание мгновенных снимков, перейдя в настройки VM -> Management -> Checkpoints и убрав галочку у пункта «Enable Checkpoints».
Загружаемся через виртуальную машину Linux
Как только выполните все вышеперечисленные шаги, вы сможете поднять виртуальную машину и далее загрузиться в меню SuperGrub. В этом меню выберите запись “Detect and show boot methods” (Обнаружить и показать методы загрузки).
После этого у вас должна появиться возможность выбрать вашу версию 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-файл. У такого подхода есть собственные недостатки – в частности, вы не сможете добиться согласованности данных в обоих инстансах.