Задача. Есть N труЪ-железных десктопов сотрудников под управлением Windows 7. Надо из них сделать виртуальные машины для гипервизора QEMU/KVM "как есть", с сохранением профилей пользователей и всех настроек. Чтобы трудящийся на следующий день зашел на неё по RDP и не заметил бы разницы.
Сложности. Машины разнородные. Где-то контроллер жесткого диска работает в режиме IDE-compatible, где-то в AHCI. На некоторых таблица разделов оформлена в MBR, где-то в GPT. SysPrep делать нельзя, ибо чревато рисками потерей некоторых пользовательских настроек. А после "затаскивания" образа-клона на подставленное гипервизором железо, семерка начинает вываливаться в BSOD с традиционной отмазкой 0x007B "Inaccessible boot device".
Я в курсе, что с "восьмёркой" таких проблем уже нет. Она как и Linux, может "с ходу" запускаться на чём угодно после переноса. Также мне известно про sysprep и про некоторые инструменты Hyper-V, которые позволяют виртуализировать рабочие места "малой кровью". Но в данном случае всё это по некоторым причинам, к сожалению, не годится.
Также интернет пестрит различными советами типа "переустановить драйвер контроллера в Generic IDE до начала процедуры переноса" или "поставить на целевое железо чистую систему и скопировать с неё ветвь реестра CriticalDeviceDatabase". Так вот, это всё фигня. Может, оно было и актуально для Windows XP, но мой личный опыт говорит о том, что затык с загрузкой заключается совсем в другом.
Итак, алгоритм переноса системы. Всё нижесказанное будет справедливо и для переноса системы на другую железную материнскую плату в том числе.
- Максимально освобождаем свободное место на исходном жестком диске. Удаляем временные файлы, кеш браузеров, старые обновления, ошмётки бэкапов сервис-пака, точки восстановления системы. Вычищаем hiberfil.sys ("powercfg -h off"), уменьшаем файл подкачки (swap). На особо "запущенных" компах это может дать выигрыш в 5..7 гигабайт, то есть понадобится меньше времени на клонирование.
- Проходим "chkdsk /f /x" по всем разделам.
- Снимаем образ системы в режиме "Disk to image". Лично я, будучи линуксоидом, люблю пользоваться CloneZill-ой в составе LiveCD-дистрибутива Parted Magic. Но подойдут любые инструменты, не принципиально.
- Создаем виртуальную машину с максимально "классическими" параметрами. В качестве контроллера жесткого диска выбираем обычные IDE.
- Заливаем внутрь виртуальной машины полученный на шаге 3 образ "как есть" с сохранением таблицы разделов.
- Если таблица разделов - MBR, то переходим сразу к шагу номер 10.
- Конвертируем таблицу разделов из GPT в MBR. Лично я для этого использую gdisk. Команды "r (repair), g (convert gpt), w (write and exit)".
- Проверить таблицу разделов любым инструментом, назначить активный (boot) раздел. Я использую gparted.
- Скармливаем виртуальной машине "родной" инсталяционный ISO-образ Windows 7 и запускаемся с него. Говорим "восстановление системы". В первый раз он обнаружит просто какие-то абстрактные проблемы, предложит их пофиксить. Окей, соглашаемся. После этого перезагружаемся, снова "восстановление системы", на этот раз говорим, чтоб исправил "проблемы с запуском". Инсталлятор поправляет BootLoader, после чего снова отправляет машину в перезагрузку. Выключаем её.
- Запускаем любой WinPE-based LiveCD, в котором имеется инструментарий для правки реестра "чужой" винды. Скармливаем ему куст "System" из папки с системой на виртуальном жестком диске. Всё нижесказанное будет относиться к разделу реестра "HKEY_LOCAL_MACHINE\System".
- Удаляем подраздел "MountedDevices".
- В подразделе "Select" ключи "Current", "Default" и "LastKnownGood" выставляем в единицу. "Failed" выставляем в ноль.
- Дальше самое интересное. Лезем в подраздел "ControlSet001\services" и выискиваем там драйвера для того IDE-контроллера, который у нас распаян на целевой материнской плате. В случае с QEMU-виртуалкой это будут службы "amdxata", "atapi" и "intelide", имена которых отражены в названиях соответствующих ветвей реестра. В случае с реальной железной материнской платой контроллер может быть каким угодно. Примерный список возможных вариантов: amdide, amdsata, amdxata, atapi, intelide, msahci, pciide, adp94xx, adpahci, adpu320, aic78xx, amdsbs, arc, arcsas, elxstor, HpSAMD, iaStorV, iirsp, LSI_FC, LSI_SAS, LSI_SAS2, LSI_SCSI, megasas, MegaSR, nfrd960, nvraid, nvstor, ql2300, ql40xx, SiSRaid2, SiSRaid4, vhdmp, vsmraid, aliide, cmdide, nvraid, viaide.
- Для каждого интересущего нас драйвера указываем режим запуска путём установки ключа "Start" в значение 0 (ноль). Вот поди ж догадайся, что в данном случае ноль означает "запускать", а тройка - не запускать. И именно эта настройка не даёт подгружаться тому или иному драйверу при старте, из-за чего система и сваливается в BSOD. Хвала и вечная слава мелкомягким!
- Перезагружаемся в целевую систему. По сценарию она должна нормально запуститься в обычном штатном режиме.
- Ещё несколько раз перезагружаемся по просьбе форточек, устанавливаем недостающие драйвера по мере необходимости (Baloon, VirtIO-stor, VirtIO-net).
The End.