klink0v (klink0v) wrote,
klink0v
klink0v

Перенос Windows 7 на другую платформу

Задача. Есть 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, но мой личный опыт говорит о том, что затык с загрузкой заключается совсем в другом.

Итак, алгоритм переноса системы. Всё нижесказанное будет справедливо и для переноса системы на другую железную материнскую плату в том числе.


  1. Максимально освобождаем свободное место на исходном жестком диске. Удаляем временные файлы, кеш браузеров, старые обновления, ошмётки бэкапов сервис-пака, точки восстановления системы. Вычищаем hiberfil.sys ("powercfg -h off"), уменьшаем файл подкачки (swap). На особо "запущенных" компах это может дать выигрыш в 5..7 гигабайт, то есть понадобится меньше времени на клонирование.

  2. Проходим "chkdsk /f /x" по всем разделам.

  3. Снимаем образ системы в режиме "Disk to image". Лично я, будучи линуксоидом, люблю пользоваться CloneZill-ой в составе LiveCD-дистрибутива Parted Magic. Но подойдут любые инструменты, не принципиально.

  4. Создаем виртуальную машину с максимально "классическими" параметрами. В качестве контроллера жесткого диска выбираем обычные IDE.

  5. Заливаем внутрь виртуальной машины полученный на шаге 3 образ "как есть" с сохранением таблицы разделов.

  6. Если таблица разделов — MBR, то переходим сразу к шагу номер 10.

  7. Конвертируем таблицу разделов из GPT в MBR. Лично я для этого использую gdisk. Команды "r (repair), g (convert gpt), w (write and exit)".

  8. Проверить таблицу разделов любым инструментом, назначить активный (boot) раздел. Я использую gparted.

  9. Скармливаем виртуальной машине "родной" инсталяционный ISO-образ Windows 7 и запускаемся с него. Говорим "восстановление системы". В первый раз он обнаружит просто какие-то абстрактные проблемы, предложит их пофиксить. Окей, соглашаемся. После этого перезагружаемся, снова "восстановление системы", на этот раз говорим, чтоб исправил "проблемы с запуском". Инсталлятор поправляет BootLoader, после чего снова отправляет машину в перезагрузку. Выключаем её.

  10. Запускаем любой WinPE-based LiveCD, в котором имеется инструментарий для правки реестра "чужой" винды. Скармливаем ему куст "System" из папки с системой на виртуальном жестком диске. Всё нижесказанное будет относиться к разделу реестра "HKEY_LOCAL_MACHINE\System".

  11. Удаляем подраздел "MountedDevices".

  12. В подразделе "Select" ключи "Current", "Default" и "LastKnownGood" выставляем в единицу. "Failed" выставляем в ноль.

  13. Дальше самое интересное. Лезем в подраздел "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.

  14. Для каждого интересущего нас драйвера указываем режим запуска путём установки ключа "Start" в значение 0 (ноль). Вот поди ж догадайся, что в данном случае ноль означает "запускать", а тройка — не запускать. И именно эта настройка не даёт подгружаться тому или иному драйверу при старте, из-за чего система и сваливается в BSOD. Хвала и вечная слава мелкомягким!

  15. Перезагружаемся в целевую систему. По сценарию она должна нормально запуститься в обычном штатном режиме.

  16. Ещё несколько раз перезагружаемся по просьбе форточек, устанавливаем недостающие драйвера по мере необходимости (Baloon, VirtIO-stor, VirtIO-net).

The End.
Tags: hints, it, 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 

  • 16 comments