Документы о рабочей средеДвойная загрузка с Windows XP и Windows PE 2.0

Уэс Миллер (Wes Miller)

Загрузить исходный код для этой статьи: Desktop2008_02.exe (151KB)

В предыдущих выпусках документов о рабочей среде я упоминал о том, что Windows PE стало средством восстановления, и объяснял, как ее можно использовать со второго раздела. Недавно я получил вопрос, который заставил меня задуматься, не написать ли о новом варианте – использование Windows PE 2.0 вместе с Windows XP.

В конце концов, многие давно используют Windows® XP, а Windows PE 2.0 – версия, развитие которой корпорация Майкрософт поддерживает (заметьте, что обновлений Windows PE 1.x больше не будет).

Одно важное отличие Windows PE 1.x от 2.x состоит в том, что Windows PE 2.x может загружаться через стандартный интерфейс загрузки (а не специальным методом, который использует Windows PE 1.x). Windows PE 1.x или 2.x можно загружать со второго раздела, но загружать их с того же раздела, что и операционная система, очень удобно; я расскажу об этом чуть ниже.

Две загрузки для Windows

Windows NT® всегда была относительно терпима к двойной загрузке. Но из-за того, что компьютеры на основе расширяемого интерфейса микропрограмм (EFI) начали замещать старые на основе IBM PC AT BIOS, Майкрософт изменила механизм загрузки, для лучшей работы с EFI и унификации механизма загрузки для всех архитектур. Новый механизм загрузки, использующийся начиная с Windows Vista®, называется базой данных конфигурации загрузки (BCD) (см. microsoft.com/whdc/system/platform/firmware/bcd.mspx). Но говорим ли мы о старом boot.ini или о новом механизме BCD, Windows обычно может загружать другие операционные системы, даже если это требует передачи процесса загрузки другому загрузчику.

Прежде чем мы начнем, важно вспомнить, что Windows PE 2.0 работает только на системах, полностью совместимых со стандартом Advanced Configuration and Power Interface (ACPI) и имеющих 384MБ (лучше 512MБ) ОЗУ. Как я отмечал в статье за май (technetmagazine.com/issues/2007/05/DesktopFiles), системы, не совместимые с ACPI не загружают Windows PE 2.0 и, так как Windows PE 2.0 загружается на RAMDisk, требуется достаточно ОЗУ для RAMDisk, какое-нибудь рабочее пространство и весь объем ОЗУ для работы среды. Если у вашей системы менее 384 МБ ОЗУ, даже не думайте об этом; используйте Windows PE 1.6. Даже опытный мастер уменьшения размера Windows PE не сможет заставить ее нормально работать на 256MБ.

Да, какие же проблемы это решит

Давайте посмотрим, с какими проблемами вы справитесь, загрузив Windows PE 2.0 с того же раздела, что и Windows XP.

Полное восстановление системы Это только одна задача, реализуемая засчет загрузки Windows PE прямо с раздела Windows XP. Так как Windows PE 2.0 (и более ранняя Windows PE 1.6) может полностью загружаться на RAMDisk, можно восстановить весь димк, или воспользоваться ImageX для восстановления самих файлов Windows XP, веьд нет необходимости в восстановлении всего раздела.

Если пользователи могут загрузить Windows PE при запуске, они могут восстанавливать свои системы даже при удаленной работе. Образ может быть на вторичном разделе, общей папке в сети (если пользователи не мобильны), DVD или жестком диске USB для восстановления или, если используется ImageX, даже на восстанавливаемом разделе. Такой тип восстановления с диска – отличное решение многих проблем (за исключением физического повреждения диска). Этот вариант, очевидно, плох для восстановления данных, если они сначала не защищены и не восстанавливаются затем в комплексе. Запомните: всегда всегда использовать перемещаемые профили и создавать резервные копии данных с компьютера, чтобы предотвратить такую потерю. Также следует убедиться, что используемый механизм восстановления может справиться с потерей данных по вине пользователя (в том числе с потерей из-за сброса ключей шифрования EFS).

Восстановление файлов Windows PE также позволяет запустить систему, даже если основная установка Windows не загружается. В этом случае вам удастся загрузиться и восстановить данные пользователя либо на другую систему (если для пользователей подготовлены резервные системы), либо в другое место, чтобы пользователь мог вскоре продолжить работать.

Ремонт системы Наконец, загрузка Windows PE поверх Windows XP позволяет ремонтировать систему, запуская набор сценариев диагностики и устранения неполадок или простое приложение ремонта или восстановления под управлением пользователя. Этот процесс похож на полное восстановление системы, но несколько уже (и не подвергает риску данные пользователя).

Теперь, представляя себе, что можно сделать, загрузив Windows PE на разделе Windows XP, посмотрим, что происходит за кулисами, чтобы уметь воспользоваться этим в любом собственном решении.

До Windows Vista.

Вот как загружались системы на основе BIOS/Master Boot Record (главной загрузочной записи, MBR) до прихода Windows Vista. BIOS указывал на загрузочное устройство (MBR в случае жесткого диска). MBR выполнял код, указывающий на раздел, с которого следует загружаться. Заметьте, что флаг активности устанавливается для первого раздела. В ранних версиях diskpart было невозможно сделать раздел неактивным (то есть нельзя было снять флаг активности). Это было исправлено добавлением в diskpart переключателя, иначе флаг активности устанавливался для первого раздела в таблице разделов. Раздел содержит загрузочный сектор, который говорит, какой код выполнять следующим. С Windows NT по Windows Server® 2003, этот код находится в файле ntldr, без расширения. Если вы когда-нибудь форматировали диск, не устанавливали Windows, а потом пробовали загрузиться, то вы видели сообщение об ошибке "NTLDR not found".

Интересно отметить, что ntldr полностью обратно совместим (но, конечно, не совместим вперед). Это значит, что ntldr Windows XP может загружать Windows 2000, но не наоборот. Поэтому, если планируется двойная загрузка, важно сперва установить более старую операционную систему. Это тем более важно, что ntldr не сопровождается номером версии.

Ntldr – 16-битное приложение, в реальном времени запускающее NTDetect.com, выполняющее поиск основных устройств и запускающее ядро, ntoskrnl.exe (это может быть один из нескольких файлов, всегда переименованных в ntoskrnl.exe). Ядро – главный компонент процесса загрузки Windows.

Это несколько упрощенный обзор процесса загрузки, я полностью опустил инциализацию Win32®, но это не имеет отношения к нашей теме. Если вы хотите узнать об этом больше, я рекомендую почитать книгу Windows Internals, Fourth Edition (Внутренняя структура Windows, четвертое издание) Марка Руссиновича (Mark Russinovich) и Дэвида Соломона (David Solomon) (Microsoft Press®, 2004) (имеется русский перевод: Внутреннее устройство Microsoft Windows: Windows Server 2003, Windows XP и Windows 2000, СПб, 2006).

Еще одна важная вещь – когда происходит загрузка с компакт-диска, Windows Setup и Windows PE используют не ntldr, а setupldr.bin. Этот файл содержит несколько другой код загрузки, чтобы загружаться с компакт-диска (этого не может делать ntldr). Вот почему для загрузки Windows PE 1.x вам пришлось переименовать setupldr.bin в ntldr и записать его на жесткий диск. Поэтому же он не может загрузить файл boot.ini (setupldr.bin разработан для загрузки компакт-диска, поэтому boot.ini не представлялся нужным).

После Windows Vista

В Windows Vista многие детали этого процесса изменились. Windows Server 2008 еще изменяет его, включая IA32 (поддержка 32-битных систем) для загрузки с EFI, раньше это было возможно только в системах на основе Itanium. Для систем на основе BIOS, первые шаги процесса загрузки не очень отличаются. Ключевое отличие в том, что инициализируется загрузчик BOOTMGR, который выполняет следующие действия.

Он ищет в папке загрузки файл BCD, который является собственным кустом реестра. BCD содержит записи для загрузки (включая используемые по умолчанию). На рис. 1 указаны типы образов (типы исполнимых файлов, а на рис. 2 типы запускаемых приложений. Одна (или несколько) этих записей может быть ссылкой на ntldr. Только одна может сслыться на известный GUID, используемый для загрузки ntldr (пятый ряд рис. 3). Затем bootmgr решает, какую запись загружать следующей, в зависимсоти от того, загружается ли система, выходит из спящего режима или загружает ntldr или другой диспетчер загрузки (в этом случае он укажет на другой загрузочный сектор и запустит этот загрузчик). Это обычная ситуация, если вы делаете двойную загрузку с операционной системой не на основе Windows. Узнать больше можно на странице microsoft.com/whdc/system/platform/firmware/bcd.mspx.

Figure 3 Стандартные объекты приложений

Описание BCDEdit ID GUID
Диспетчер загрузки Windows {bootmgr} 9dea862c-5cdd-4e70-acc1-f32b344d4795
Микропрограммный диспетчер загрузки {fwbootmgr} a5a30fa2-3d06-4e9f-b5f4-a01df9d1fcba
Тестер памяти Windows {memdiag} b2721d73-1db4-4c62-bf78-c548a880142d
Приложение возобновления Windows Нет псевдонима 147aa509-0358-4473-b83b-d950dda00615
Загрузчик старых версий Windows {ntldr} 466f5a88-0af2-4f76-9038-095b170dc21c
Текущая запись загрузки {current} fa926493-6f1c-4193-a414-58f0b2456d1e
Запись загрузки по умолчанию {default} нет предопределенного GUID
     

Figure 2 Типы приложений

Описание Значение Описание
Микропрограммный диспетчер загрузки 0x1 Применимо только к системам EFI.
Диспетчер загрузки Windows 0x2 Контролирует поток загрузки. В системе с двойной загрузкой, выдает пользователю меню с выбором загрузки.
Загрузчик Windows 0x3 Загружает определенную версию или конфигурацию Windows.
Приложение возобновления Windows 0x4 Возобновляет работу Windows после выхода из спящего режима.
Тестер памяти Windows 0x5 Приложение диагностики памяти.
Ntldr 0x6 Применимо только к системам PC/AT BIOS. Загружает версии Windows до Windows Vista.
Загрузочный сектор 0x8 16-битное приложение в реальном времени. Применимо только к системам PC/AT BIOS. Может использоваться для перезапуска процесса загрузки и загрузки операционной системы не на основе Windows.
     

Figure 1 Типы образов

Описание Значение
Приложение микропрограмм 0x1
Приложение загрузки 0x2
Объект загрузчика на основе ntldr 0x3
Приложение в реальном времени 0x4
   

Вы заметите, что переработанная инфраструктура загрузки Windows Vista более организована, чем предыдущие версии: весь код загрузки, кроме bootmgr, содержится в папке \boot на корневом уровне и выдается специфическим двоичным файлам Windows по указанию BCD.

Загрузка Windows XP и Windows PE 2.0

Вы уже могли увидеть, как Windows PE, с помощью диспетчера загрузки Windows Vista, может выступать посредником, позволяющим продолжать загружать Windows XP или более ранние версии, добавляя в смесь Windows PE 2.0 в качестве встроенного средства восстановления.

Конечно, придется добавить еще один шаг в процесс загрузки, но этот шаг был запланирован корпорацией Майкрософт. Новая инфраструктура bootmgr должа была иметь обратную совместимость с ntldr и другими сторонними диспетчерами загрузки, поэтому bootmgr создан с расчетом на такие решения.

Теперь мы знаем, как загружается Windows и как работает новый BCD. Как связать их вместе и запустить Windows PE 2.0 поверх установленной Windows XP? Есть два способа записать загрузочный сектор Windows Vista, ту часть загрузочного кода, которая говорит системе запустить bootmgr. Один – использовать diskpart и создать и отформатировать новый раздел с Windows PE 2.0. Но здесь это не годится, ведь у нас уже есть установка Windows XP, которую нельзя двигать или повреждать. Вместо этого, сделайте так:

  1. Убедитесь, что на загрузочном компакт-диске Windows PE 2.0 есть копии bootsect.exe и bcdedit.exe (их можно найти на DVD установки Windows Vista).
  2. Загрузите систему Windows XP на компакт-диск Windows PE 2.0.
  3. После загрузки выполните эту команду:
    bootsect.exe /NT60 ALL

Теперь загрузочный сектор будет совместимым с сектором Windows Vista, который знает, как запустить bootmgr.

4. Скопируйте диспетчер загрузки на жесткий диск:

    xcopy BOOTMGR C:\BOOTMGR /I

5. Скопируйте файл boot.SDI в папку \BOOT на жестком диске. Перед загрузкой придется сделать его копию, так как при работе Windows PE он будет заблокирован для копирования:

    xcopy BOOT.SDI C:\BOOT\ 

Поправьте путь по необходимости.

6. Скопируйте boot.WIM на жесткий диск. Как и с SDI, понадобится вторая копия, скопировать исполняющийся файл будет невозможно:

    xcopy BOOT.WIM C:\BOOT\BOOT.WIM 

Поправьте путь по необходимости.

7. Создайте новое хранилище BCD:

    bcdedit /createstore

8. Затем создайте записи BCD для загрузки Windows PE:

    bcdedit /create {ramdiskoptions} /d "Boot Windows PE"
    bcdedit /set {ramdiskoptions} ramdisksdidevice partition=c:
    bcdedit /set {ramdiskoptions} ramdisksdipath \boot\boot.sdi
    bcdedit /create /d "Windows PE" /application OSLOADER

9. Последняя строка вернет GUID. Замените {YOURGUID} фактически возвращеннымGUID. Это записи на RAMDisk, которые загрузят Windows PE с жесткого диска, см. рис. 4.

Figure 4 Записи на RAMDisk, загружающие Windows PE с жесткого диска

bcdedit /set {YOURGUID} device ramdisk=[c:]\boot\boot.wim,{ramdiskoptions}
bcdedit /set{YOURGUID} path \windows\system32\winload.exe
bcdedit /{YOURGUID} osdeviceramdisk=[c:]\boot\boot.wim,{ramdiskoptions}
bcdedit /set{YOURGUID} systemroot \windows
bcdedit /set{YOURGUID} winpe yes
bcdedit /set {YOURGUID} detecthal yes

10. Теперь создайте записи bootmgr, чтобы запустить диспетчер загрузки:

    bcdedit /create {bootmgr} /d "Boot Manager"
    bcdedit /set {bootmgr} device boot

11. Наконец, заведите запись BCD для существующей установки Windows (замените текст Windows XP на любой, который вы хотите видеть в меню диспетчера загрузки. Последняя команда делает ее первой (по умолчанию) строкой в меню загрузки:

    bcdedit /create {ntldr} /d "Windows XP"
    bcdedit /set {ntldr} device partition=C:
    bcdedit /set {ntldr} path \ntldr
    bcdedit /displayorder {ntldr} /addfirst

12. Теперь нужно перезагрузить систему и запустить старую установку Windows или Windows PE 2.0, выбирая соответствующую запись меню загрузки. На рис. 5 показан пример вывода из bcdedit /enum all. Эта команда перечисляет все записи в BCD после добавления записей (из-под Windows PE 1.6).

Пример ввода

Пример ввода  (Щелкните изображение, чтобы увеличить его)

Я работал над сценарием, который может делать это автоматически. Пока что он может только копировать загрузочные файлы на жесткий диск и выставлять записи в BCD. Он не может выставить в загрузочном секторе новое значение Windows Server 2008 при работе Windows, это придется делать под Windows PE. Сценарий можно найти в разделе с загружаемым кодом веб-узла журнала TechNet Magazine по адресу technetmagazine.com. Чтобы запустить сценарий, в той папке, где работает VBScript, понадобятся следующие объекты:

  1. BCDEdit
  2. BOOTMGR
  3. Папка \BOOT\ (с источника Windows Vista или Windows PE 2.0)
  4. Папку \SOURCES\ с рабочим загрузочным файлом Windows PE 2.0 BOOT.WIM

Он создаст BCD и копии нужных загрузочных файлов. После загрузки Windows PE и запуска bootsect, вы сможете сделать двойную загрузку.

Отмена двойной загрузки

Отменить двойную загрузку еще проще, чем сделать. Нужно просто восстановить загрузочный сектор до его до- Windows Vista состояния, выполнив следующие команды:

bootsect.exe /NT52 ALL

После восстановления можно удалить bootmgr и папку \boot. При следующей загрузке загрузочный сектор запустит ntldr и полностью удалит Windows PE 2.0 и все загрузочные двоичные файлы Windows Vista из потока загрузки.

Уэс Миллер (Wes Miller) –– технический руководитель продуктов в Initiate Systems (InitiateSystems.com) в г. Остин, штат Техас. Ранее Уэс работал в компании Winternals Software, а также в корпорации Майкрософт в должности руководителя программы. Связаться с Уэсом Миллером можно по адресу technet@getwired.com.

© 2008 Корпорация Майкрософт и компания CMP Media, LLC. Все права защищены; полное или частичное воспроизведение без разрешения запрещено.