klink0v (klink0v) wrote,
klink0v
klink0v

Двойной запуск Windows 10

Итоговый мануал по результатам моих извращений: раз, два.

Напомню задачу. Есть относительно современный PC. На нём в разных разделах носителя установлены две операционные системы: Linux и Windows 10. Linux — основная рабочая, Windows — для эпизодических экспериментов. Загрузчик — GRUB2 в режиме EFI. Хочется иметь возможность запускать одни и те же форточки как с физического ("голого") железа, так и внутри Linux-а под управлением VirtualBox. Ниже пошаговое руководство. Предполагается, что изначально обе системы уже установлены на физическое железо и функционируют без проблем.


  1. Загружаемся в винду. Произносим в командной строке с повышением заклинания 'wmic csproduct get "UUID"' и 'wmic diskdrive get serialnumber'. Внимательно записываем на бумажку буковки и цифирьки, которые они покажут.

  2. Загружаемся в Linux. Устанавливаем VirtualBox, если ещё не.

  3. Создаём виртуальную машину с требуемыми параметрами, пока что без диска. Если на хосте используется EFI, то ставим соответствующую "галку" в настройках VirtualBox. Контроллеры дисковых устройств выставляем максимально похожие на контроллеры хоста. Если включено EFI, то это без вариантов SATA+AHCI.

  4. Выдаём себе-любимому права на прямой доступ к блочному устройству, на котором живёт винда. В моём примере это "/dev/nvme0n1" (SSD-диск в режиме NVMe). Заклинание будет звучать как "/usr/bin/setfacl -m u:stas:rw /dev/nvme0n1". Его действие будет распространяться до ближайшей перезагрузки.

  5. Если вы не хотите каждый раз произносить это заклинание вручную, то придётся создать правило для udev-а. Пример: ACTION=="add", SUBSYSTEM=="block", KERNEL=="nvme0n1", RUN+="/usr/bin/setfacl -m u:stas:rw /dev/nvme0n1". Название устройства и имя пользователя, разумеется, подставить ваши. Положить правило в "/etc/udev/rules.d".

  6. Создаём файл с настройками прямого доступа к диску. В целях предупреждения возможных факапов лучше выдать виртуалке только те разделы, с которыми она будет работать. Пример: "VBoxManage internalcommands createrawvmdk -filename evo960.vmdk -rawdisk /dev/nvme0n1 -partitions 1,2,3". Здесь я предоставил доступ для виртуальной машины только к первым трём разделам: загрузочный EFI, MSFT Reserved и собственно сам корень винды.

  7. Скармливаем созданный на предыдущем шаге псевдообраз диска виртуалке.

  8. Также будет не лишним отключить автомонтирование блочных устройств в вашей оболочке (Gnome, KDE и т.п.), дабы случайным кликом мышки не смонтировать виндовый раздел в тот момент, когда гостевая система будет запущена. Иначе ей может наступить моментальный карачун.

  9. Дальше есть два варианта. Либо вам требуется сохранить действующую активацию форточек, либо вам пофигу. Если второе, то на этом можно остановиться и начинать пользоваться виртуалкой. Если первое, то читайте дальше.

  10. Берём серийный номер загрузочного носителя, полученный на шаге 1, и подставляем его в виртуалку: VBoxManage setextradata MySuperMachine "VBoxInternal/Devices/ahci/0/Config/Port0/SerialNumber" "blah_blah_blah_blah". В данном примере предполагается, что загрузка виртуалки происходит с SATA-контроллера, порт 0.

  11. Берём серийный номер хоста (HostID), полученный на шаге 1, и тоже подставляем его в виртуалку. Пример: vboxmanage modifyvm MySuperMachine --hardwareuuid 031B021C-040D-05F9-A806-3E0700080009. Но тут есть нюанс. Почему-то порядок байтиков (октетов) будет перепутан. В первых трёх частях серийника октеты надо писать задом наперёд (сначала последний, потом предпоследний и т.д.), а в последних двух частях всё оставить так, как есть. В любом случае, эксперимент — критерий истины. Пытаемся загружать виртуалку и смотрим на выхлоп wmic csproduct get "UUID", сравнивая его с эталоном. Если не срослось, пробуем по-другому.

  12. Возможно, серийники будут подобраны правильно, но винда всё равно пишет, что не активирована. В таком случае надо просто разок загрузиться с физического железа, после этого она изменит своё мнение. Но тут есть подвох. Смотри ниже.

Когда мы привели в соответствие HostID и серийный номер загрузочного носителя между реальной и виртуальной машиной, форточки начинают думать, что это как бы один и тот же компьютер, только с разным железом внутри. И если при этом используются различные контроллеры загрузочных устройств, например, NVMe на физическом железе и AHCI на виртуальном, то windows будет каждый раз принудительно выключать драйвер (службу) одного из них. В моём случае это проявляется в том, что винда не хочет запускаться на реальном железе после того, как хотя бы раз загрузится внутри виртуалки (см. предыдущий псто).

Чтобы пофиксить, надо идти в раздел реестра "HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\ваш_контроллер\StartOverride" и выставлять там в ноль значение одноимённого ключа. Причём, придётся это делать каждый раз после запуска форточек в виртуалке. Как это забороть раз и навсегда, лично мне неизвестно. Отбирать у "Системы" права на запись в этот раздел не помогает.

И напоследок предупреждение. Не пытайтесь монтировать / использовать одни и те же разделы ваших физических носителей из двух запущенных систем одновременно. Ни к чему, кроме как к повреждению данных на них, это не приведёт. Вместо этого поднимайте Samba Server, FTP, WebDAV или чего вам там больше нравится.

Tags: it, linux, manual, virtualbox, windows, администрирование, виртуализация
Subscribe
  • Post a new comment

    Error

    Anonymous comments are disabled in this journal

    default userpic

    Your reply will be screened

    Your IP address will be recorded 

  • 3 comments