Исправляя коллизии сигнатур дисков

Клонирование дисков стало всеобщим явлением по мере того, как ИТ-профессионалы стали виртуализировать физические серверы с помощью инструментов вроде Sysinternals Disk2vhd и использовать образ главного виртуального жесткого диска в качестве эталона для копий, создаваемых для виртуальных клонов. В большинстве случаев с образами клонированных дисков можно обращаться, не опасаясь, что у них одинаковые сигнатуры. Однако в редких случаях может случиться так, что вы присоедините клонированный диск к Windows-системе, уже имеющий диск с такой же сигнатурой, и пострадаете от последствий коллизии сигнатур, которая приведет к тому, что любая дисковая установка Windows Vista и более новой ОС станет незагружаемой. Причинами добавления нового диска обычно являются оффлайновое копирование файлов, оффлайновое сканирование на вредоносные программы и – о ирония судьбы – восстановление незагружаемой системы. Риск повреждения – причина, по которой я поместил в документацию утилиты Disk2vhd предупреждение о недопустимости подсоединения VHD, созданного с помощью Disk2vhd, к системе, которая генерирует VHD, используя собственную встроенную поддержку виртуальных дисков, добавленную в Windows 7 и Windows Server 2008 R2.

Я получил сообщения от людей, столкнувшихся с проблемой коллизии сигнатур дисков и обнаруживших, что в Интернете не так много ресурсов, помогающих решить ее. Поэтому в этом сообщении я приведу простые шаги, следуя которым вы сможете починить систему, которая не загружается из-за коллизии сигнатур. Также я объясню, где хранятся сигнатуры дисков, как Windows использует их и почему коллизия приводит к тому, что Windows не загружается.

Сигнатуры дисков

Сигнатура диска представляет собой четырехбайтовый идентификатор, расположенный по смещению 0x1B8 в главной загрузочной записи (MBR), записанной в первом секторе диска. Следующий снимок экрана дискового редактора показывает, что сигнатура диска на мой системе равна 0xE9EB3AA5 (величина записана в формате с порядком следования байтов начиная с младшего, поэтому байты идут в обратной последовательности – little-endian format):

clip_image002

Windows использует сигнатуры дисков внутри себя для отображения объектов, подобных томам, на физические диски. Начиная с Windows Vista, система хранит их в своей базе загрузочных конфигураций (Boot Configuration Database – BCD), в которой находится информация, используемая в процессе загрузки для нахождения загрузочных файлов и параметров загрузки. При изучении содержимого BCD с помощью встроенной утилиты Bcdedit, можно найти три места, связанные с сигнатурами дисков:

clip_image004

В действительности BCD имеет дополнительные ссылки на дисковые сигнатуры в альтернативных загрузочных конфигурациях, вроде Windows Recovery Environment, продолжение из режима hibernate и загрузка процесса диагностирования памяти, которые не показаны в основном выводе Bcdedit. Исправление коллизий требует небольшого знания структуры BCD, которая на самом деле является файлом куста (hive) реестра, который Windows загружает в HKEY_LOCAL_MACHINE\BCD00000:

clip_image006

Дисковые сигнатуры можно найти по смещению 0x38 в параметре реестра, называемом Element, в разделах 0x11000001 (загрузочное устройство Windows) и 0x2100001 (устройство загрузки OS):

clip_image008

Здесь показан элемент, соответствующий одной из записей вывода Bcdedit, где можно видеть ту же самую сигнатуру, которая хранится в MBR моего диска:

clip_image010

Коллизии сигнатур дисков

Windows требует чтобы сигнатуры были уникальными, поэтому когда вы подсоединяете диск с сигнатурой, совпадающей с сигнатурой одного из уже подключенных, Windows выводит этот диск в режим «offline» и не читает его таблицу разделов и не монтирует тома. Следующий снимок показывает, как административная утилита Windows Disk Management представляет отключенный диск, который я получил при подсоединении VHD, созданного с помощью программы Disk2vhd из моего системного диска, к этой же системе:

clip_image012

Если щелкнуть правой клавишей мыши на этом диске, утилита предложит перевести его в режим «Online», что заставит Windows проанализировать его таблицу разделов и смонтировать его тома:

clip_image014

Когда вы выберете пункт меню «Online», Windows без предупреждения сгенерирует новую случайную дисковую сигнатуру и присвоит ее диску, записав в MBR. После этого можно обработать MBR и смонтировать существующие тома, но когда Windows обновляет дисковую сигнатуру, запись BCD становится подвисшей, связанной с предыдущей сигнатурой, а не с новой. Загрузчик не сможет идентифицировать заданный диск и загрузочные файлы при загрузке с диска и выдаст следующую ошибку:

clip_image016

Восстановление сигнатуры диска

Одним способом восстановления дисковой сигнатуры является определение новой сигнатуры, которую Windows присвоила диску, загрузка BCD-куста диска и ручное редактирование всех параметров реестра, которые содержат старую сигнатуру диска. Однако это трудоемкий процесс, чреватый ошибками. Иногда можно использовать команды Bcdedit для задания элементам устройства новых сигнатур диска, но этот метод не работает с присоединенными VHD и потому ненадежен. К счастью есть более простой способ. Вместо обновления BCD можно вернуть диску исходную сигнатуру.

Сначала необходимо определить исходную сигнатуру, вот где нам пригодятся знания о BCD. Подключите к работающей системе Windows диск, который надо исправить. Он будет доступен и Windows присвоит буквы накопителей томам на диске, поскольку никакой коллизии сигнатур пока не будет. Загрузите BCD с диска, запустив Regedit, зайдя в HKEY_LOCAL_MACHINE и выбрав из меню File пункт Load Hive: clip_image018

В диалоге File перейдите на диске в скрытый каталог \Boot, который расположен в корневом каталоге тома и выберите файл с именем «BCD». Если на диске расположены несколько томов, найдите каталог Boot, вводя «x:\boot\bcd», где вместо «x:» подставляется буква соответствующего тома на диске. Когда найдете BCD, выберите имя раздела, в который он загружается, и найдите «Windows Boot Manager». Вы найдете эту надпись в разделе с именем 12000004, как здесь:

clip_image020

Выберите раздел с именем 11000001 в том же самом родительском разделе Elements и запишите четырехбайтную сигнатуру диска, расположенную по смещению 0x38 (помните об обратном порядке байтов).

С сигнатурой диска в руках, откройте административное окно командной строки и запустите утилиту управления дисками из командной строки Diskpart. Введите «select disk 2», заменив «2» на ID диска, который утилита Disk Management показывает для диска. Теперь вы готовы к последнему шагу, возвращению сигнатуре диска своего исходного значения с помощью команды «uniqueid disk id=e9eb3aa5», подставив вместо ID то, что вы увидели в BCD:

clip_image022

После выполнения команды Windows немедленно переведет диск и все его тома в режим «offline» для предотвращения коллизий. Постарайтесь не переводить снова диск в «online», так как это отменит проделанную вами работу. Теперь можно отсоединить диск, поскольку его сигнатура снова соответствует BCD, и Windows будет загружаться успешно. Вы можете оказаться в ситуации, когда не будет выбора кроме как вызвать коллизию и дать Windows обновить сигнатуру диска, но, по крайней мере, сейчас вы знаете, как исправить проблему.

Можно подробнее прочесть о Disk2vhd в книге Sysinternals Administrator’s Reference, написанной мною и Аароном Марголисом.