BugTraq.Ru
Русский BugTraq
https://bugtraq.ru/library/internals/real2vm.html

Руководство по переносу ОС MS Windows 2000 с физической аппаратной платформы на виртуальную
П.А. Рахман
Опубликовано: dl, 28.06.06 20:08

Аннотация

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

Условия применения

В данном документе описывается порядок действий при переносе системы на базе MS Windows 2000 с физического компьютера на виртуальную машину, работающей под управлением VMware Workstation с использованием только IDE устройств. В качестве утилиты для создания разделов используется встроенная в ОС MS Windows 2000 утилита Disk Management. В качестве утилиты для копирования разделов используется Symantec Norton Ghost.

Автор должен предупредить читателей, что он не несет ответственности в случае, если использование руководства повлекло нарушение функционирования каких-либо компьютерных систем, либо потерю каких-либо данных. Пользователи и специалисты могут использовать данное руководство только на свой собственный страх и риск. Также автор не несет ответственности в случае злоумышленного использования какими-либо физическими либо юридическими лицами данного руководства в качестве пособия для быстрого создания массовых копий в целях незаконного использования либо распространения программных продуктов корпорации Microsoft, равно как и любых других производителей программного обеспечения.

Microsoft, Windows и Windows NT являются зарегистрированными торговыми марками фирмы Microsoft Corporation.

Intel, Pentium, Pentium Pro являются зарегистрированными торговыми марками фирмы Intel Corporation.

VMware, Workstation, GSX Server, ESX Server являются зарегистрированными торговыми марками компании VMware, Inc.

Symantec, Norton Ghost являются зарегистрированными торговыми марками фирмы Symantec Corporation.

PowerQuest, Partition Magic, Drive Image Pro являются зарегистрированными торговыми марками фирмы PowerQuest Corporation.

Ключевые проблемы переноса систем

При переносе системы на базе ОС MS Windows 2000 с физического компьютера на другой физический компьютер либо виртуальную машину возникают три основные проблемы:

1) Несовместимость аппаратных платформ

На сегодняшний день ОС MS Windows 2000 распознает 6 ключевых аппаратных платформ: из них 3 с поддержкой технологии ACPI (Advanced Configuration and Power Interface), 3 без ее поддержки:
ПлатформаОписаниеСистемный драйвер
Standard PCСтандартный однопроцессорный ПК без поддержки ACPIHAL.DLL
ACPI PCСтандартный однопроцессорный ПК с поддержкой ACPIHALACPI.DLL
MPS Uniprocessor PCМногопроцессорный ПК, с одним установленным процессором без поддержки ACPIHALAPIC.DLL
ACPI Uniprocessor PCМногопроцессорный ПК, с одним установленным процессором с поддержкой ACPIHALAACPI.DLL
MPS Multiprocessor PCМногопроцессорный ПК, без поддержки ACPIHALMPS.DLL
ACPI Multiprocessor PCМногопроцессорный ПК, с поддержкой ACPIHALMACPI.DLL

Большинство ПК на базе процессоров Intel принадлежат к одной из этих платформ. ОС MS Windows 2000 для каждой из вышеперечисленных аппаратных платформ использует соответствующий системный драйвер. В диспетчере устройств тип платформы определяется как устройство:

Соответственно, если мы переносим систему с одного типа платформы на другой, то система не может успешно загрузиться (ПК автоматически перегружается на фазе инициализации ядра системы) в силу принципиальной несовместимости платформ. Поэтому перед переносом на другую платформу необходимо заменять системный драйвер в диспетчере устройств, выбрав соответствующий. Например, при переносе системы на виртуальную платформу всегда выбирается тип платформы Standard PC:

Важное примечание. После операции по замене драйвера аппаратной платформы загрузка системы на исходном ПК недопустима, поскольку из-за несовместимости драйвера и платформы это может привести к необратимому нарушению работоспособности операционной системы.

2) Несовместимость контроллеров жестких дисков

Вторая проблема при переносе системы связана с особенностями контроллера жестких дисков. Для успешной загрузки системы необходим доступ к системному разделу, а для этого необходимо, чтобы система корректно распознавала контроллер жестких дисков и сами диски. Если система переносится на аппаратную платформу с контроллером, отличным от того, который был в исходном компьютере, то система при загрузке останавливается с ошибкой "STOP 0x0000007B - Inaccessible boot device" и дальнейшая загрузка невозможна. Чтобы избежать этого, перед переносом системы необходимо удалять все драйвера RAID-массивов и прочие драйверы и утилиты, так или иначе связанные с работой жестких дисков. Также необходимо удалять все IDE-контроллеры в диспетчере устройств:

Важное примечание. После данной операции загрузка системы на исходном компьютере недопустима, т.к. в этом случае система вновь распознает дисковой контроллер и устанавливает специфичный для него драйвер, что приведет к невозможности загрузки на конечной аппаратной платформы после переноса.

3) Несоответствие буквы, назначаемой системному разделу в целевой системе, букве, назначенной в исходной системе

В отличие от первых двух проблем, данная проблема проявляется только при использовании, так называемых "нетипичных" букв для системных разделов. Например, если мы располагаем жестким диском с двумя разделами: загрузочным и системным - то по логике вещей загрузочный раздел должен иметь букву C:, а системный - D:. Однако, это соблюдается, как правило, если система изначально устанавливалась на компьютер, с одним IDE-устройством - единственным жестким диском. В общем же случае, системы могут устанавливаться на системы с несколькими жесткими дисками, приводами компакт дисков, ZIP приводами и прочими IDE-устройствами. Буквы разделам жестких дисков назначаются не в порядке их следования внутри одного жесткого диска, а сначала назначаются буквы первым разделам жестких дисков, всем IDE-устройств в порядке их следования в контроллере IDE-устройств. Например, если мы имеем два жестких диска по два раздела на каждом, то результат назначения букв получается следующим:

В данном примере, системный раздел имеет букву E:, в общем же случае он может иметь любую букву латинского алфавита, начиная с C:. В такой ситуации после подготовки к переносу системы на другой ПК и переноса данных разделов на другой диск, при запуске системы на исходном либо на другом компьютере с этого диска в ОС MS Windows 2000 возникает проблема с невозможностью входа в систему. Происходит это из-за того, что система при обнаружении нового диска начинает повторную процедуру назначения букв разделам. Например, если мы переносим жесткий диск с двумя разделами, с назначенными ранее буквами C: и E: на исходный либо другой ПК, на котором нет других жестких дисков, то система при первой загрузке присвоит системному разделу букву D:. Поскольку в реестре ОС MS Windows 2000 присутствует множество ссылок на диск E:, в том числе пути к профилям пользователей, то, несмотря на успешную загрузку систему, вход в рабочий сеанс пользователя будет невозможен. Данная ситуация разрешается путем внесения определенных корректировок в реестр "сбойной" системы.

К системному реестру "сбойной" системы можно получить доступ несколькими способами:

После копирования каждого раздела по отдельности с исходного диска на диск конечной системы и при загрузке с исходного диска, с подключенным диском конечной системы получаем следующую картину (в этом случае все в порядке): на исходном диске не нарушены привязки букв к его разделам:

В случае же копирования "диск в диск", получается следующее:

Назначение букв в случае копирования "диск в диск" нарушается: к разделам конечного диска привязываются буквы, принадлежавшие ранее исходному диску, а разделам исходного диска привязываются буквы, которые по логике вещей должны были бы принадлежать разделам конечного диска. Происходит это потому, что начальный загрузчик компьютера обнаруживает два активных загрузочных диска и выбирает последний по списку (а это диск конечной системы), далее загрузчик ищет на его первом разделе загрузочную запись и находит ее, далее этому разделу назначается буква C:. На этом разделе запускается начальный загрузчик операционной системы, называемый NTLOADER, который обращается к конфигурационному файлу BOOT.INI. В конфигурационном файле хранится информация о расположении системных файлов, при этом, самое важное то, что в качестве ссылок местоположения указываются не буквы дисков, а порядковые номера физических дисков и их разделов. Соответственно, начальный загрузчик операционной системы обнаруживает в этом файле запись типа Disk0\Partition2, что означает то, что система находится на 0-м физическом диске (нумерация начинается с 0), на 2-м разделе (нумерация начинается с 1). В результате ОС загружается именно со второго раздела первого жесткого диска, несмотря на то, что загрузчик был запущен с первого раздела второго жесткого диска. Далее, ОС считает второй жесткий диск первым и назначение букв происходит так, как будто второй и первый жесткий диск в порядке их следования поменяли местами. В результате второй раздел первого жесткого диска получает букву F:, а второй раздел второго диска букву E:. Далее, поскольку в реестре системы местоположение программного обеспечения, файла подкачки и профилей пользователей строго привязано именно к букве E:, то, несмотря на то, что система загружается со второго раздела первого диска, получившую букву F:, вышеуказанные данные извлекаются со второго раздела второго жесткого диска, получившего букву E:. При всем при этом используется реестр системы на исходном диске, расположенной на втором разделе первого диска (F:) и вся информация о привязке букв к конкретным разделам конкретных жестких дисков хранится именно в реестре системы на исходном диске. В такой ситуации, если в дальнейшем отключить второй жесткий диск и попытаться загрузить ОС на исходном диске, то система без проблем обнаружит системные файлы на втором разделе, однако, она не сможет обнаружить диск E:, привязанный ко второму разделу второго жесткого диска, и будет считать потерянными программное обеспечение, файл подкачки и профили пользователей, в результате чего работа в исходной системе станет невозможной.

Таким образом, копирование данных должно производиться не "диск в диск", а по разделам. После этого необходимо внести некоторые изменения в реестр "сбойной" системы на конечном диске.

Корректировка системного реестра "сбойной" системы

После того, как диск со "сбойной" системой подключен как дополнительный к компьютеру с работоспособной системой, в ней необходимо запустить утилиту редактирования реестра REGEDT32. Выделить мышью раздел HKEY_LOCAL_MACHINE, после чего в меню Registry выбрать Load Hive, и открыть файл "SYSTEM" находящийся в папке Winnt\system32\config системного раздела дополнительного диска, при этом необходимо точно знать какая именно буква соответствует этому разделу. Буква системного раздела дополнительного диска может быть различной при различных дисковых конфигурациях компьютера, поэтому эту букву необходимо уточнять через встроенную в ОС утилиту Disk Management. Например, как в примере выше, поскольку исходный диск использует буквы C: и E:, а дополнительный - D: и F:, причем F: - это и есть системный раздел "сбойной" системы, то в редакторе реестра необходимо будет загрузить файл F:\Winnt\system32\config\system. В качестве требуемого имени для загружаемой ветви реестра можно выбрать произвольное название, например HK2. После этого вносятся определенные корректировки в этой ветви реестра (системной ветви реестра "сбойной системы") - об этом будет сказано ниже.

Привязка букв к разделам жесткого диска в ОС Windows 2000

В системном реестре ОС Windows 2000 в ключе HKEY_LOCAL_MACHINE\SYSTEM\MOUNTEDDEVICES хранятся данные о привязках букв к устройствам и отдельным разделам жестких дисков. Обратимся к нашему старому примеру. Рассмотрим данные, которые хранятся в реестре исходной системы.

Как видно из скриншота, каждой букве соответствует некоторое двоичное значение, которое как минимум зависит от конкретного устройства (уникально для каждого устройства) и физического местоположения раздела на нем. Кроме того, для букв C: и E: первые 5 байтов соответствующих им кодов совпадают, то же самое можно отметить и для букв D: и F:, что означает, что первыми 5-ю байтами однозначно идентифицируется жесткий диск. Следующими байтами однозначно определяется раздел. Именно таким образом ОС MS Windows 2000 привязывает буквы к разделам жестких дисков. Соответственно, подставляя двоичные коды, соответствующие одним буквам в коды для других букв, причем, внося изменения в реестр не исходной, а "сбойной" системы, можно добиваться искусственного назначения требуемой буквы для системного раздела в "сбойной" системе.

Важное примечание. В нашем примере до подключения дополнительного диска и операции копирования разделов исходную операционную систему ни разу не загружали с подключенным дополнительным диском. После же операции копировании исходную систему загружали с дополнительным диском хотя бы один раз, после чего исходная система "распознала" дополнительный диск и назначила буквы его разделам.

Составим карту разделов, букв и двоичных кодов для нашего примера:
Disk0 / Partition1C:5DA05DA0007E000000000000
Disk0 / Partition2E:5DA05DA0007C54AD00000000
Disk1 / Partition1D:AC7E7303007E000000000000
Disk1 / Partition2F:AC7E7303007CA45D00000000

Disk0 - исходный диск, Disk1 - дополнительный диск со сбойной системой. Обратимся теперь к ключу MOUNTEDDEVICES системной ветви реестра "сбойной" системы (HK2):

Здесь мы видим то, что буквам C: и E: соответствуют коды разделов не дополнительного, а исходного диска. Это произошло по той причине, что в данном примере загрузка с дополнительного диска еще ни разу не проводилась, а также не выполнялась загрузка исходной системы с подключенным дополнительным диском до операции копирования разделов. Соответственно, реестр "один к одному" скопировался в том состоянии, каким он был до подключения дополнительного диска.

При попытке загрузиться с дополнительного диска, ОС обнаружит диск, отличающийся от исходного, и, соответственно, заново будет назначать буквы для разделов "нового диска". Если при загрузке кроме дополнительного диска других подключенных размеченных дисков не будет, то разделы получат буквы по порядку C: и D:, после чего система загрузится, но войти будет невозможно из-за того, что системному разделу назначена буква, отличная от E:.

Для такой ситуации существуют два способа решения проблемы:

  1. Внести корректировки в реестр "сбойной" системы еще до того, как с дополнительного диска будут загружать систему. Назовем это априорной корректировкой.
  2. Внести корректировки в реестр "сбойной" системы уже после того, как с дополнительного диска хотя бы один раз загружали систему и не могли войти в систему, после чего дополнительный диск подключили к работоспособной системе для внесения изменений в реестр. Назовем это апостериорной корректировкой.

Априорная корректировка

В данном случае корректировки в реестр "сбойной" системы вносят, загрузив исходную систему сразу же после операций копирования на дополнительный диск. Вернемся к нашему примеру. Как видим из предыдущих скриншотов, в ключе MOUNTEDDEVICES в ветви реестра "сбойной" системы для букв C: и E: хранятся коды, соответствующие разделам дисками исходного диска. Следовательно, эти коды необходимо поменять на коды, соответствующие разделам дополнительного диска со "сбойной" системой. Для этого обращаемся к ключу SYSTEM\MOUNTEDDEVICES реестра исходной системы, по карте дисков видим, что в исходной системе разделам дополнительного диска, соответствуют буквы D: и F:. Код, закрепленный за буквой F: - это и есть требуемый код для буквы E: в "сбойной" системы, а код для буквы D: в исходной системе - это искомый код для буквы C: в "сбойной".

Для корректировки необходимо скопировать двоичный код для буквы, соответствующей системному разделу дополнительного диска в реестре исходной системы, в код для буквы, соответствующей системному разделу исходного диска, в ключе MOUNTEDDEVICES реестра "сбойной" системы.

Соответственно, также можно скопировать значение для буквы, соответствующей загрузочному разделу дополнительного носителя в исходном реестре в значение для буквы, соответствующей загрузочному разделу исходного диска в ключе MOUNTEDDDEVICES ветви реестра "сбойной" системы, хотя это и необязательно, поскольку первому разделу жесткого диска по умолчанию будет назначена буква C:. Проще говоря, мы с помощью исходной системы выясняем коды для разделов дополнительного диска, а потом эти данные заносим в реестр "сбойной" системы. В нашем примере, мы должны скопировать код для буквы F: в исходном реестре, в код для буквы E: в реестре "сбойной" системы. Также можно скопировать код для буквы D: в исходном реестре, в код для буквы C: в реестре "сбойной" системы.

В результате реестр будет выглядеть следующим образом:

Карта разделов жесткого диска для "сбойной" системы будет следующей:
Disk0 / Partition1C:AC7E7303007E000000000000
Disk0 / Partition2E:AC7E7303007CA45D00000000

После внесения изменений необходимо выделить ветвь HK2 реестра "сбойной" системы и в меню Registry выполнить Unload Hive для того, чтобы сохранить изменения в реестре. В результате вышеописанных операций "сбойная" система, являющаяся копией исходной и находящаяся на дополнительном диске, становится работоспособной.

Апостериорная корректировка

В данном случае мы имеем дело с дополнительным диском, с которого пытались загрузить систему хотя бы раз, в результате чего система назначила на свое усмотрение буквы разделам дисков и сохранила эту информацию в реестре в ключе HKEY_LOCAL_MACHINE\SYSTEM\MOUNTEDDEVICES.

Обратимся снова к нашему примеру. Допустим, что мы уже выполнили копирование загрузочного и системного разделов с исходного диска на дополнительный диск, и после этого подключили этот диск как основной на исходный либо конечный компьютер, на котором нет иных IDE устройств, и попытались выполнить загрузку. После безуспешных попыток входа в рабочий сеанс пользователя системы мы подключаем дополнительный диск вместе с исходным диском, используемым как основной, на исходный компьютер и выполняем загрузку исходной системы (в действительности, мы можем подключить дополнительной диск к любому компьютеру с работоспособной системой MS Windows 2000). Тогда, запустив редактор реестра REGEDT32 и загрузив ветвь HKEY_LOCAL_SYSTEM\SYSTEM реестра "сбойной" системы, находящейся во втором разделе дополнительного диска (файл \Winnt\system32\config\system), и назвав эту ветвь HK2, обратимся к ключу HK2\MOUNTEDDEVICES и увидим следующее:

На скриншоте мы видим то, что первому и второму разделу дополнительного диска соответствуют буквы C: и D:. Когда система пыталась загружаться с дополнительного диска, карта дисков была следующей:
Disk0 / Partition1C:AC7E7303007E000000000000
Disk0 / Partition2D:AC7E7303007CA45D00000000

При первой загрузке с дополнительного диска, очевидно, система обнаружила неизвестный жесткий диск и выполнила повторное назначение букв разделам. В нашем примере загрузочный раздел получил букву C:, а системный - D:. Код для буквы E: остался без изменений и соответствует системному разделу исходного диска, который при загрузке системы физически недоступен. В общем случае, системный раздел может быть не вторым, а любым другим разделом дополнительного диска, и на компьютере, где выполнялась первая загрузка системы, может быть установлено множество IDE устройств, и системный раздел может получить любую букву от C: до Z:.

Для корректировки необходимо привязать в реестре "сбойной" системы требуемую букву к двоичному коду системного раздела диска со "сбойной" системой. Для этого в реестре "сбойной" системы достаточно переименовать параметр \DosDevices\<текущая буква:>, соответствующий системному разделу диска со "сбойной" системой, в параметр \DosDevices\<требуемая буква:>. Требуемая буква в данном случае - буква, соответствующая системному разделу в исходной системе на исходном жестком диске.

В нашем примере мы должны переименовать переменную \DosDevices\<D:> в переменную \DosDevices\<E:> в ветви HK2\MOUNTEDDEVICES. Поскольку редактор реестра REGEDT32 не позволяет переименовывать ключи и переменные, то можно воспользоваться альтернативным редактором REGEDIT, и в ветви HK2\MOUNTEDDEVICES выполнить следующие действия:

После этого необходимо закрыть редактор REGEDIT, вернуться в редактор REGEDT32, выделить ветвь HK2 и в меню Registry обязательно выполнить Unload Hive для того, чтобы сохранить изменения в реестре.

В результате этих операций "сбойная" система, являющаяся копией исходной и находящаяся на дополнительном диске станет работоспособной.

Порядок действий при переносе системы с реального ПК на виртуальную машину



обсудить  |  все отзывы (0)

[53520; 58; 7.53]




  Copyright © 2001-2024 Dmitry Leonov Design: Vadim Derkach