Easy Recovery Professional
от OnTrack Data Recovery
(www.ontrack.com) - симпатичный, но на проверку довольно
бестолковый
инструмент, к тому же работающий полностью в автоматическом режиме,
интеллектуальность которого находится на зачаточном уровне. Не
рекомендуется
для использования (ну, разве что вы хотите восстановить только что
отформатированный том, на который еще ничего существенного не писалось).
Рисунок 14. EasyRecovery и
полтораста мег косметики.
Master boot record - базовые концепции
Первые жесткие
диски были небольшого (даже по тем временам) размера и форматировались
практически также, как и дискеты, однако их объемы стремительно росли и
MS-DOS
уже не могла их целиком адресовать.
Для преодоления этого ограничения был введен механизм разделов
(partitions),
разбивающий один физический диск на несколько логических, каждый из
который
имел свою собственную файловую систему и форматировался независимо от
других.
За счет чего это достигается?
В первом
секторе физического диска (цилиндр 0/головка 0/сектор 1) хранится
специальная
структура данных - master boot record
(главная загрузочная запись) или сокращенно MBR. Она состоит из двух
основных частей - первичного
загрузчика (master boot code) и таблицы разделов (partition table),
описывающей схему
разбиения и геометрию каждого из логических дисков. В конце сектора по
смещению
1FE находится сигнатура
55h AAh, по
которой BIOS определяет
признак "загрузочности" сектора. Даже если вы не хотите дробить свой
винчестер на части и форматируете его как один диск, присутствие master
boot record обязательно.
Рисунок 15. Cхематичное
представление разбитого диска.
При старте
компьютера BIOS
выбирает загрузочный винчестер (обычно Primary Master, но порядок
загрузки в
большинстве BIOS'ов
можно изменять, а самые продвинутые из них при удержании ESC по время
прохождения post'а даже выводят интерактивное
меню), считывает первый сектор (цилиндр 0/головка 0/сектор 1) в память
по
адресу 0000h:7C00h, проверяет наличие сигнатуры 55h AAh в его конце и
если такая сигнатура
действительно обнаруживается, передает управление на 0000h:7C000h. В
противном случае анализируется следующее загрузочное устройство, а если
таковое
отсутствует - выдается ругательное сообщение.
Первичный
загрузчик, получив управление, сканирует partition table (которая уже
загружена в память!),
находит активный раздел (Boot Indicator = 80h), извлекает номер
стартового сектора
раздела, также называемого boot-сектором,
загружает его в память по адресу 0000h:7C00h (предварительно переместив
свое тело в другое место, чтобы избежать затирания), убеждается в
наличие
сигнатуры 55h AAh,
передавая управление по 0000h:7C00h, в противном случае выдается
ругательное сообщение и после нажатия на клавишу компьютер
перезагружается.
Некоторые загрузчики поддерживают несколько активных разделов,
последовательно
перебирая их один за другим, но это уже отсебятина разработчиков,
выходящих за
стандартные спецификации Microsoft,
что, впрочем, никого не смущает.
Если первичный
загрузчик поврежден, то BIOS
не сможет запустить операционную систему с такого диска, однако при
подключении его "вторым" (или загрузке с дискеты) все логические
диски будут доступны. Как минимум, они должны быть "видны", т.е.
команды C:, D:, E: выполняются нормально,
правда работоспособность команды dir уже не гарантируется. Во-первых,
для этого файловая система
соответствующего раздела должна быть известна загруженной операционной
системе
и не повреждена, а, во-вторых, должен быть цел boot-сектор (но об этом
позже).
Partition Table, которую анализирует master boot code, а чуть позже -
драйвер логических дисков операционной системы, состоит из четырех 10h
записей, расположенных по
смещению 1BEh, 1CEh, 1DEh, 1EEh байт от начала диска, соответственно.
Каждая из них описывает
свой логический раздел, задавая его стартовый и конечный сектора,
записанные в CHS-формате (да! даже если
диск работает в LBA-режиме,
партиции все равно адресуются через CHS!). Поле относительного смещения
раздела относительно начала
таблицы разделов является вспомогательным и его избыточность очевидна.
То же
самое относится и к полю с общим количеством секторов на диске - как
будто
это нельзя вычислить на основе стартового и конечного секторов! Одни
операционные системы и загрузчики игнорируют вспомогательные поля,
другие же их
активно используют, поэтому они должны соответствовать действительности.
Поле
идентификатора диска содержит уникальную 32-разрядную
последовательность,
помогающую операционной системе отличить один смонтированный диск от
другого и
автоматически копирующую в следующий ключ реестра:
HKLM\SYSTEM\MountedDevices.
На самом деле, Windows
свободно обходится и без него, поэтому содержимого этого поля
некритично.
Поле Boot ID содержит
идентификатор файловой системы, установленной на разделе, который в
случае NTFS равен 07h. За динамическими дисками,
согласно фирменной спецификации, закреплен идентификатор 42h. На самом
деле, это справедливо лишь
для тех из них, что получены путем обновления (update) обычного раздела
до
динамического. Сведения об остальных динамических дисках в таблице
разделов не
хранятся, а содержатся в последнем мегабайте физического диска в
LDM-базе, и для стандартных
дисковых менеджеров они не видны. При установке операционной системы
семейства Windows 9х или UNIX на винчестер, содержащий
динамические диски, они могут быть необратимо утеряны, поскольку
согласно
таблице разделов занятое ими пространство отмечено как свободное. Тем не
менее,
загрузочный логический диск (независимо от того, динамический он или
нет) в
обязательном порядке должен присутствовать в partition table, иначе BIOS
не сможет его загрузить.
Четырех
записей partition table,
обеспечивающих всего четыре логических диска, явно не хватало, но
расширять
таблицу разделов было уже некуда - последняя запись упиралась в конец
сектора, а использовать следующий сектор разработчикам не хотелось,
поскольку
его активно использовали многие вирусы и нестандартные драйвера, к тому
же это
все равно не решало проблемы, а лишь оттягивало конец. Тогда инженеры
нашли
другое решение, предложив концепцию расширенных разделов (Extended
partition). Если boot ID некоторого
раздела равен 05h или 0Fh, он трактуется как
"виртуальный физический диск" (термин мой - примечание автора),
со своей собственной partition table,
расположенной в его начале, на которую и указывает стартовый сектор
расширенного раздела. Короче говоря, таблица разделов получается
вложенной и
уровень вложения ограничен разве что свободным местом жесткого диска и
количеством стековой памяти загрузчика (при условии, что он использует
рекурсивный алгоритм сканирования). Таблица разделов как бы
"размазывается" вдоль
винчестера. Большинство утилит резервирования сохраняют лишь первый
сектор,
чего явно недостаточно (впрочем, первый сектор гибнет намного чаще
других, так
что даже плохая политика резервирования лучше, чем совсем ничего).
Рисунок 16. Pасширенная таблица
разделов.
Штатные
утилиты разбивки (FDISK.EXE, Disk Manager) в каждой таблице
разделов создают один основной и один расширенный раздел. Т.е. если вы
хотите разбить свой винчестер на четыре логических диска, мы получим 4
partition
table (см. листинг 4), хотя в данном случае можно
было бы обойтись и одной. Штатный загрузчик FDISK'а требует, чтобы
активный раздел находился в первом секторе partition table,
"благодаря" чему операционная система может грузиться только с диска C:.
Нестандартные менеджеры,
анализирующие всю цепочку разделов, позволяют загружаться с любого из
разделов.
Самые честные из них создают в первой partition table еще один раздел
(благо, если диск
был разбит FDISK'ом,
свободное место там всегда есть), назначают его активным и помещают в
него свое
тело. Другие же внедряются непосредственно в MBR, замещая первичный
загрузчик, что создает очевидные проблемы совместимости.
Если таблица
разделов повреждена или искажена, логические диски будут либо полностью
недоступны (команда C:
вызывает ошибку), либо их объем будет изменен и при последующим
переформатировании произойдет либо затирание данных из соседнего
раздела, либо
текущий раздел окажется усечен. Кстати говоря, если расширенный раздел
указывает сам на себя или на один из предшествующих разделов в цепочке,
все
известные мне операционные системы наглухо зависнут еще на этапе
загрузки, даже если диск подключен
"вторым". Чтобы исправить ситуацию, необходимо запустить редактор
диска или другую утилиту, а для этого необходимо загрузить операционную
систему! Существует несколько путей выхода из этой, казалось бы
неразрешимой
проблемы. Самое простое - горячее подключение диска на ходу с
последующей
работой с ним через BIOS
или порты ввода/вывода. Если ни диск, ни материнская плата не умрет (а
для IDE-устройств подключение
"на лету" представляется довольно жестким испытанием!), вы сможете
запустить доктора и работать с диском на физическом уровне. Другой,
чисто
хакерский путь - пропатчить MS-DOS,
изменив сигнатуру 55h AAh на что-нибудь еще, тогда
она не сможет распознать таблицу разделом и, стало быть, не станет ее
анализировать. Как вариант, можно записать в boot-сектор дискеты
специально подготовленную программу, которая
обнуляет MBR или
искажает сигнатуру, расположенную в его конце. Просто загрузитесь с нее и
все!
Cмещение
|
Pазмер
|
Назначение
|
0x000
|
Перемен.
|
Код загрузчика
|
1x1BB
|
4h
|
Идентификатор диска
|
0x1BE
|
10h
|
Partition
1
|
0x1CE
|
10h
|
Partition
2
|
0x1DE
|
10h
|
Partition
3
|
0x1EE
|
10h
|
Partition
4
|
0x1FE
|
0x2
|
Признак таблицы разделов
сигнатура 55h Aah
|
Таблица 2. Формат MBR.
Смещение
|
Размер
|
Назначение
|
000
|
1BE
|
1CE
|
1DE
|
1EE
|
byte
|
Флаг
активного загрузочного раздела. (Boot Indicator)
80h -
загрузочный раздел, 00h - не загрузочный
|
001
|
1BF
|
1CF
|
1DF
|
1EF
|
|
Стартовая
головка раздела
|
002
|
1C0
|
1D0
|
1E0
|
1F0
|
byte
|
Стартовый
сектор раздела (биты 0 - 5)
Старшие
биты стартового цилиндра (биты 6-7)
|
003
|
1C1
|
1D1
|
1E1
|
1F1
|
byte
|
Младшие
биты стартового цилиндра (биты 0-7)
|
004
|
1C2
|
1D2
|
1E2
|
1F2
|
byte
|
Идентификатор
системы (Boot ID), см. таблицу.4
|
005
|
1C3
|
1D3
|
1E3
|
1F3
|
byte
|
Конечная
головка раздела
|
006
|
1C4
|
1D4
|
1E4
|
1F4
|
byte
|
Конечный
сектор раздела (биты 0 - 5)
Старшие
биты конечного цилиндра (биты 6-7)
|
007
|
1C5
|
1D5
|
1E5
|
1F5
|
|
Младшие
биты конечного цилиндра (биты 0-7)
|
008
|
1C6
|
1D6
|
1E6
|
1F6
|
dword
|
Смещение
раздела относительно начала таблицы разделов в секторах
|
00С
|
1CA
|
1DA
|
1EA
|
1FA
|
dword
|
Кол-во
секторов раздела
|
Таблица 3. Формат partition.
Boot ID
|
Тип раздела
|
00h
|
Раздел свободен
|
0x01
|
FAT12
(менее чем 32.680 секторов в томе или 16 Мбайт)
|
0x04
|
FAT16
(32,680-65,535 секторов или 16-33 Мбайт)
|
0x05
|
Расширенный раздел (extended partition)
|
0x06
|
BIGDOS
FAT16 раздел
(33 Мбайт -
4 Гбайт)
|
0x07
|
NTFS-раздел
|
0x0B
|
FAT32 раздел
|
0x0C
|
FAT32
раздел с поддержкой расширенной BIOS INT 13h
|
0x0E
|
BIGDOS FAT16
раздел с поддержкой расширенной
BIOS INT 13h
|
0x0F
|
Расширенный раздел с поддержкой расширенной BIOS int
13h
|
0x12
|
EISA
раздел
|
0x42
|
Динамический диск
|
0x86
|
Legacy FT
FAT16 раздел
|
0x87
|
Legacy FT
NTFS раздел
|
0x8B
|
Legacy FT
volume formatted with FAT32 *
|
0x8C
|
Legacy FT
volume using BIOS INT 13h extensions formatted with FAT32
|
Таблица 4. Возможные
значения Boot ID.
Sector Inspector Copyright Microsoft Corporation 2003 =========================================================================== Target - \\.\PHYSICALDRIVE0 1867 Cylinders 255 Heads 63 Sectors Per Track 512 BytesPerSector 12 MediaType
LBN 0 [C 0, H 0, S 1] =========================================================================== Master Boot Record =========================================================================== | B | FS TYPE | START | END | | | | F | (hex) | C H S| C H S| RELATIVE | TOTAL | =========================================================================== | * | 07 | 0 1 1| 764 254 63| 63| 12289662| | | 0f | 765 0 1|1023 254 63| 12289725| 17687565| | | 00 | 0 0 0| 0 0 0| 0| 0| | | 00 | 0 0 0| 0 0 0| 0| 0| ===========================================================================
LBN 12289725 [C 765, H 0, S 1] =========================================================================== Extended Boot Record =========================================================================== | B | FS TYPE | START | END | | | | F | (hex) | C H S| C H S| RELATIVE | TOTAL | =========================================================================== | | 07 | 765 1 1|1023 254 63| 63| 8193087| | | 05 |1023 0 1|1023 254 63| 8193150| 4096575| | | 00 | 0 0 0| 0 0 0| 0| 0| | | 00 | 0 0 0| 0 0 0| 0| 0| ===========================================================================
LBN 20482875 [C 1275, H 0, S 1] =========================================================================== Extended Boot Record =========================================================================== | B | FS TYPE | START | END | | | | F | (hex) | C H S| C H S| RELATIVE | TOTAL | =========================================================================== | | 07 |1023 1 1|1023 254 63| 63| 4096512| | | 05 |1023 0 1|1023 254 63| 12289725| 5397840| | | 00 | 0 0 0| 0 0 0| 0| 0| | | 00 | 0 0 0| 0 0 0| 0| 0| ===========================================================================
LBN 24579450 [C 1530, H 0, S 1] =========================================================================== Extended Boot Record =========================================================================== | B | FS TYPE | START | END | | | | F | (hex) | C H S| C H S| RELATIVE | TOTAL | =========================================================================== | | 07 |1023 1 1|1023 254 63| 63| 5397777| | | 00 | 0 0 0| 0 0 0| 0| 0| | | 00 | 0 0 0| 0 0 0| 0| 0| | | 00 | 0 0 0| 0 0 0| 0| 0| ===========================================================================
Листинг 4. Пример таблицы
разделов, сформированный программой FDISK.
Master boot record
- техника восстановления
Существует
множество утилит для автоматического восстановления master boot code
и partition table (Get Data Back, Easy Recovery, Active
Data Recovery Software и т.д.). До
некоторого времени они вполне успешно справлялись со своей задачей,
восстанавливая даже полностью уничтоженные таблицы разделов, однако с
появлением емких винтов, преодолевших барьер в 2 Гбайт с помощью
всевозможных
расширений, они стали часто путаться и потому доверять им нельзя. Если
не
хотите потерять свои данные - восстанавливайте MBR самостоятельно (тем
более, что это
достаточно простая операция, не требующая особой квалификации).
Восстановление
значительно упрощается, если в вашем распоряжении имеется копия таблицы
разделов, снятая Sector Inspector'ом
или подобными ей утилитами. Однако чаще всего ее все-таки нет...
Если операционная система отказывается загружаться, а на экране
появляется
ругательство от BIOS
типа "Disk Boot failure,
Non-System disk or disk error... Press Enter to restart", это указывает
на разрушение сигнатуры 55h AAh,
обычно сопровождаемое смертью первичного загрузчика. Внимание! Очень
важно
отличать сообщение BIOS
от сообщений первичного загрузчика и boot-сектора. Зайдите в BIOS Setup
и отключите все загрузочные устройства, оставив активным только диск A: с
вытащенной дискетой. А
теперь перезагрузитесь и запомните, какое сообщение появится на экране.
Это и
будет ругательством BIOS'а.
Восстановить
сигнатуру 55h AAh
можно в любом дисковом редакторе. Когда будете это делать, убедитесь,
что в
начале диска присутствуют осмысленный master boot code (если вы
испытываете
затруднение с дизассемблированием в
уме, воспользуйтесь Идой или HIEW'ом).
Вы не умеете дизассемблировать? Тогда попробуйте оценить степень
"нормальности" первичного загрузчика визуально (однако для этого
опять-таки требуется опыт работы с кодом). В начале более или менее
стандартного загрузчика расположено приблизительно 100h байт машинного
кода, в котором
обнаруживаются последовательности: 00 7С, 1B 7C, BE 07, CD 13, CD 18,
CD 10, 55 AA, а затем идут характерные
текстовые сообщения: Invalid partition table,
Error loading operating system, Missing operating system..... ну или
подобные
им. Если загрузчик поврежден, но сигнатура 55 AA цела, то попытка
загрузки с такого диска обернется
неизменным зависанием.
Восстановить
"слетевший" или искореженный первичный загрузчик можно с помощью
утилиты FDISK.EXE, запущенной с ключом
/MBR, записывающий в главную загрузочную запись первого диска
стандартный
master boor code, или командой FIXMBR консоли аварийного
восстановления в Windows 2000
(недокументированный ключ /CMBR,
появившийся в MS-DOS 7.0, позволяет
выбирать любой из подключенный дисков). Внимание! Если вы использовали
нестандартный загрузчик (такой, например, как LILO), то после перезаписи
MBR сможете загружаться
только с основного раздела, а для запуска операционных систем из других
разделов вам придется переустановить свой мультизагрузочный менеджер
(вообще-то, такой менеджер можно написать и самостоятельно, при наличии
HIEW'а, а если лучше -
транслятора ассемблера, и работа не займет и получаса).
Как уже
говорилось, некоторые загрузчики изменяют схему трансляции адресов
жесткого
диска и со штатным загрузчиком такой диск будет полностью
неработоспособен.
Попробуйте переустановить загрузчик с дистрибутивных дисков - быть
может,
это поможет. В противном случае, ничего не остается, как писать свой
собственный
загрузчик, определять текущую геометрию диска и соответствующим образом
транслировать секторные адреса. Это довольно сложная задача, требующая
серьезной подготовки и здесь ее лучше не обсуждать.
Если загрузчик
говорит "Invalid partition table",
это еще не обозначает, что таблица разделов повреждена, просто ни один
из
основных разделов не назначен активным. Такое случается при
использовании
нестандартных загрузчиков, загружающих операционную систему из
расширенного
раздела. После выполнения команды FDISK /MBR
или установке операционной системы, автоматически заменяющий первичный
загрузчик своим собственным, он не обнаружит в пределах досягаемости ни
одного
активного раздела и естественно разразится многоэтажным ругательством.
Такое
поведение, в частности, характерно для Windows 98. Для решения проблемы
либо восстановите прежний
загрузчик, либо установите операционную систему на первичный раздел и,
запустив
FDISK, сделайте его
активным.
Загрузитесь с
системной дискеты (другого винчестера, CD-диска) и посмотрите - видны ли
ваши логические диски или
нет. Если да, то смело переходите к другому пункту, в противном случае
соберитесь с духом и приготовьтесь немного поработать руками и головой.
Восстановление
основного раздела, созданного FDISK'ом
или Disk Manager'ом
в большинстве случаев осуществляется элементарно, а остальные, как
правило,
восстанавливать и не требуется, поскольку именно MBR гибнет чаще всего, а
расширенные
патриции, рассредоточенные по диску, дохнут разве что при явном удалении
разделов средствами FDISK/Disk Manager.
Адрес стартового
сектора первого логического всегда равен 0/1/1 (Cylinder/Head/Sector),
относительный (Relative) сектор - количеству головок жестка диска
уменьшенных на единицу (сведения о геометрии диска можно почерпнуть из
любого
дискового редактора, в том числе и Sector Inspector'a). Конечный сектор
определить несколько сложнее. Если
загрузочный сектор цел (см. "Загрузочный
сектор - техника восстановления"), то узнать
количество секторов в разделе патриции (total sectors) можно и из поля
BootRecord.NumberSectors,
увеличив его значение на единицу. Тогда
конечный цилиндр будет равен LastCyl := TotalSectors / (Heads *
SecPerTrack), где Heads - кол-во
головок на
физическом диске, а SecPerTrack -
кол-во секторов на трек. Конечная головка равна
LastHead := (Total Sector - (LastCyl * Heads SecPerTrack)) /
SecPerTrack, а конечный
сектор равен LastSec :== (Total Sector - (LastCyl *
Heads SecPerTrack)) % SecPerTrack. Пропишите полученные
значения в MBR и
посмотрите - не находится ли за вычисленным концом раздела следующий
раздел? Это должна быть либо расширенная таблица разделов, либо
boot-сектор. Если это так,
создайте еще одну запись в partition table,
заполнив его соответствующим образом.
А если boot-сектор отсутствует и не
может быть восстановлен - реально ли восстановить таблицу разделов или
нет? Да, реально. Необходимо лишь найти boot или partition
следующих разделов, в чем вам поможет контекстный поиск. Ищите сектора,
содержащие сигнатуру 55h AAh
в конце. Отличить boot
от partition очень
просто (в boot секторе
по смещению два байта от его начала расположен идентификатор
производителя (NTFS, MSWIN4.1 и т.д.).
Логично, что размер текущего раздела на один сектор меньше, а зная
размер и
геометрию диска, можно рассчитать и конечный цилиндр/головку/сектор.
Только учтите,
что Windows хранит копию
boot-сектора, которая в
зависимости от версии может быть расположена либо в середине раздела,
либо в
его конце. Другие копии могут находиться в архивных файлах и файле
подкачке.
Кстати говоря, посмотрите - не содержится ли среди них ничего
удобоваримого - Как
отличить копию сектора от оригинала?
Элементарно, Ватсон! Если это подлинник, вслед за ним пойдут служебные
структуры
файловой системы (в частности, для NTFS - таблица MFT,
каждая запись которой начинается с легко узнаваемой строки FILE*).
Собственно говоря, поскольку
служебные структуры файловой системы обычно располагаются на более или
менее
предсказуемом смещении относительно начала раздела, то отталкиваясь от
их
"географического" расположения, мы может установить размеры каждого
из логических дисков, даже если все-все-все boot/partition
уничтожены.
Что
произойдет, если границы разделов окажутся определенными неверно? Если
мы
переборщим, увеличив размер раздела сверх необходимого, все будет
нормально
работать, поскольку карта свободного пространства хранится в специальной
структуре (у NTFS это
файл $bitmap, а у FAT13/32 - непосредственно сама FAT-таблица) и
"запредельные" сектора будут добавлены только после
переформатирования раздела. Если все, что нам нужно - это скопировать
данные с
восстанавливаемого диска на другой носитель, но возиться с подгонкой
параметров
partition table
не нужно! Распахните ее на весь физический диск и дело с концом!
Естественно,
такой способ восстановления подходит только для первого раздела диска, а
для
всех последующих нам потребуется определить стартовый сектор. Это
определение
должно быть очень точным, поскольку все структуры файловой системы
адресуются
от начала логического диска и ошибка в один-единственный сектор сделает
весь
этот тонкий механизм полностью неработоспособным. К счастью, некоторые
из
структур ссылаются сами на себя, давая нам ключ к разгадке. В частности,
файлы
$mft/$mftmiff содержат номер своего первого
кластера. Стоит нам найти первую запись FILE*, как мы узнаем, на каком
именно секторе мы сейчас находимся
(конечно, при условии, что сумеем определить количество секторов на
кластер, но
это уже другая тема).
Проблема нулевой дорожки
Главная
загрузочная запись жестко держит за собой первый сектор и если он вдруг
окажется разрушенным, работа с таким диском станет невозможной. До
недавнего
времени проблема решалась посекторным копированием винчестера с
переносом
данных на здоровый жесткий диск с идентичной геометрией с последующим
восстановлением MBR.
Сейчас
ситуация изменилась. Современные винчестеры поддерживают возможность
принудительного замещения плохих секторов из резервного фонда (а
некоторые
делают это автоматически), поэтому проблема нулевой дорожки,
преследующая нас
еще со времен гибких дисков и 8-разрядных машин, наконец перестала
существовать.
Механизм
замещение секторов все еще не стандартизирован и осуществляются
утилитами,
предоставляемые производителем конкретной модели винчестера. Чаще всего
они
распространяются бесплатно и могут быть свободно найдены в сети.
0x0000 eb 2e 49 50 41 52 54 20-63 6f 64 65 20 30 30 39 ы.IPART code 009 0x0010 20 2d 20 49 6f 6d 65 67-61 20 43 6f 72 70 6f 72 - Iomega Corpor 0x0020 61 74 69 6f 6e 20 2d 20-31 31 2f 32 33 2f 39 30 ation - 11/23/90 0x0030 fa fc 8c c8 8e d0 bc 00-7c 8e d8 8e c0 b9 00 02 ·?МLО¦-.|О+ОL¦.. 0x0040 bf 00 7e be 00 7c f3 a4-e9 00 02 fb bd 00 7e 8b ¬.~-.|?дщ..v-.~Л 0x0050 fd be be 01 b9 04 00 80-3a 80 74 0b 83 c6 10 e2 ?--.¦..А:Аt.Г¦>т 0x0060 f6 8b b5 b2 01 eb 51 56-83 c6 10 49 e3 0b 80 3a ?Л¦-.ыQVГ¦>Iу.А: 0x0070 80 75 f5 8b b5 b0 01 eb-3f 5e 56 8a 12 8a 72 01 Аu?Л¦-.ы?^VК¦Кr. 0x0080 8a 4a 02 8a 6a 03 bb 00-7c be 05 00 56 b8 01 02 КJ.Кj.¬.|-..V¬.. 0x0090 cd 13 73 0e 33 c0 cd 13-5e 4e 75 f0 8b b5 b4 01 =!s.3L=!^NuЁЛ¦+. 0x00a0 eb 16 5e be fe 7d 81 3c-55 aa 74 06 8b b5 b6 01 ы-^-¦}Б<Uкt.Л¦¦. 0x00b0 eb 06 5e 03 f5 e9 48 fd-e8 1b 00 8b b5 b8 01 e8 ы.^.?щH?ш<.Л¦¬.ш 0x00c0 14 00 b4 00 cd 16 33 c0-8e c0 26 c7 06 72 04 34 .+.=-3LОL&¦.r.4 0x00d0 12 ea f0 ff 00 f0 03 f5-ac 3c 00 74 0b 56 b4 0e ¦ъЁ .Ё.?м<.t.V+. 0x00e0 bb 07 00 cd 10 5e eb f0-c3 49 6e 76 61 6c 69 64 ¬..=>^ыЁ+Invalid 0x00f0 20 70 61 72 74 69 74 69-6f 6e 20 74 61 62 6c 65 partition table 0x0100 00 44 69 73 6b 20 69 73-20 6e 6f 74 20 62 6f 6f .Disk is not boo 0x0110 74 61 62 6c 65 00 45 72-72 6f 72 20 6c 6f 61 64 table.Error load 0x0120 69 6e 67 20 6f 70 65 72-61 74 69 6e 67 20 73 79 ing operating sy 0x0130 73 74 65 6d 00 4d 69 73-73 69 6e 67 20 6f 70 65 stem.Missing ope 0x0140 72 61 74 69 6e 67 20 73-79 73 74 65 6d 00 0d 0a rating system... 0x0150 52 65 70 6c 61 63 65 20-61 6e 64 20 73 74 72 69 Replace and stri 0x0160 6b 65 20 61 6e 79 20 6b-65 79 20 77 68 65 6e 20 ke any key when 0x0170 72 65 61 64 79 0d 0a 00-00 00 00 00 00 00 00 00 ready........... 0x0180 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ 0x0190 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ 0x01a0 00 00 00 00 00 00 00 00-00 00 00 00 00 00 45 06 ..............E. 0x01b0 e9 00 01 01 16 01 35 01-4e 01 6a 72 a5 d5 00 00 щ...-.5.N.jrе-.. 0x01c0 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ 0x01d0 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ 0x01e0 00 00 00 00 00 00 00 00-00 00 00 00 00 00 80 01 ..............А. 0x01f0 01 00 06 3f 20 5f 20 00-00 00 e0 ff 02 00 55 aa ...? _ ...р ..Uк
Листинг 5. Внешний вид
типичного MBR-сектора.
Динамические диски
Динамические
диски, впервые появившиеся в Windows 2000 - это все тот же
программный RAID,
призванный преодолеть ограничения стандартных механизмов разбиения с
учетом
ошибок своего прямого предшественника программного RAID'а Windows NT,
хранящего
конфигурационную информацию в системном реестре, что, во-первых,
препятствовало
его перемещению с машины на машину, а, во-вторых, делало очень уязвимым к
порче
реестра.
Типы динамических дисков, поддерживаемые Windows 2000
Простые
(simple) - практически ничем
не отличаются от обычных разделов, за исключением того, что при
переразбиении диска
отпадает необходимость в перезагрузке. Базовый тип для всех остальных
динамических дисков.
избыточность - нет
эффективность - низкая
Составные
(spanned) - состоят из одного или
нескольких simple-дисков,
находящихся в различных разделах или даже устройствах, представленных
как один
логический диск. Данные на simple-диски
пишутся последовательно (классический линейный RAID).
избыточность - нет
эффективность - низкая
Чередующиеся
(stripped) - то же самое, что и spanned, но данные записываются
параллельно на
все simple-диски. При
условии, что они расположены на различных каналах IDE-контроллера, это
значительно
увеличивает скорость обмена данными. Короче говоря, классический RAID
уровня 0.
избыточность - нет
эффективность - средняя
Зеркальные
(mirrored) - два simple-диска, расположенные на разных
устройствах. Данные дублируются на оба носителя (RAID уровня 1).
избыточность - средняя
эффективность - средняя
Чередующиеся
с контролем четности (stripped with party) - соответствует массиву
RAID
уровня 5. Состоит из трёх или более дисков. Представляет из себя
stripped
volume с контролем ошибок. Данные пишутся на два диска в два блока, а на
третий диск и в третий блок записывается ECC - код коррекции ошибок, с
помощью
которого по информации любого из блоков можно восстановить содержимое
второго блока.
избыточность - высокая
эффективность - высокая
Зеркальный
с чередованием (mirrored striped)
соответствует массиву RAID
1+0.
избыточность - средняя
эффективность - высокая
По умолчанию Windows создает базовые диски
(см. расшифровку терминов в таблице 5),
но всякий базовый диск в любой момент времени может быть обновлен до
динамического (это даже не потребует перезагрузки). Динамические диски
не
пользуются таблицей разделов, а потому и не имеют проблем, связанных с
ограничением CHS-разрядности,
и могут создавать тома практически неограниченного размера. Однако
динамические диски, созданные путем обновления основных разделов,
все-таки
остаются в partition table,
при этом их Boot ID
меняется на 42h. Если
эта информация окажется удалена, система откажется подключать такой
динамический диск. Кстати говоря, Windows может быть установлена только
на обновленный динамический
диск, поскольку BIOS
может загружать систему только с тех разделов которые перечислены в
partition table, а динамические диски,
созданные "на лету", в нее как раз и не попадают.
Схема
разбиения динамических дисков содержится в Базе Менеджера Логических
Дисков - Logical Disk Manager Database
или, сокращенно, LDM. Это
протоколируемая (journalled)
база данных, поддерживающая транзакции и устойчивая к сбоям. Если в
процессе
манипуляции с томами неожиданно исчезнет питание, при последующем
включении
компьютера будет выполнен откат в предыдущее состояние. При переносе
винчестера, содержащего один или несколько динамических дисков, на
другую систему,
они автоматически распознаются и монтируются как обыкновенные диски.
LMD-база хранится в последнем
мегабайте жесткого диска, а для дисков, полученных путем обновления
базового
раздела до динамического - в последнем мегабайте этого самого раздела, а
идентификатор системы Boot ID
соответствующей записи в Partition Table
принимает значение 42h.
Так происходит потому, что при стандартном разбиении винчестера в его
конце
просто не остается свободно места и операционной системе приходится
сохранять
эту информацию непосредственно в самом обновляемом диске (естественно,
для
этого в нем должен быть свободен, по меньшей мере, 1 Мбайт).
Сразу же за
таблицей разделов по адресу 0/0/2 расположен приватный заголовок
PROVHEAD, содержащий в себе
ссылки на основные структуры LDM
(см. рис. 17). Если PRIVHEAD погибнет, Windows не сможет обнаружить
и смонтировать динамические диски. А гибнет он удручающее часто.
Подавляющее
большинство загрузочных вирусов и дисковых менеджеров считают сектор
0/0/2
свободным и используют его для хранения своего тела, необратимо затирая
прежнее
содержимое. Осознавая значимость PRIVHEAD'а, разработчики
из Microsoft сохранили его аж в двух копиях -
одна из которых хранится в хвосте LDM, а другая - в последнем секторе
физического диска.
Благодаря такой избыточности, PRIVHEAD
практически никогда не приходится восстанавливать вручную, но если это
все-таки
потребуется сделать, обратитесь к проекту LINUX-NTFS
за подробным описанием его структуры (http://linux-ntfs.sourceforge.net).
Здесь
же оно по соображениям экономии места не приводится.
Рисунок 17. LMD-база и ее
дислокация.
Внутреннее
устройство LDM-базы
недокументированно и буквально пышет мощью и сложностью. Наверху
иерархии
расположено оглавление базы - структура TOCBLOCK (Table Of Content
Block),
состоящая из двух секций config
и log (вероятно, в
будущем их список будет расширен). Секция config содержит информацию о
текущем разбиении динамических
дисков и сведения о томах, а log
хранит журнал изменений схемы разбивки. Это очень мощное средство в
борьбе с
энтропией! Если удалить один или несколько динамических разделов,
информация о
старом разбиении сохранится в журнале и утерянные тома могут быть с
легкостью
восстановлены! Будучи очень важной структурой, оглавление диска защищено
от
случайного разрушения тремя копиями, одна из которых вплотную примыкает к
настоящему TOCBLOCK'у,
расположенному в начале LDM-базы,
а две других находится в конце диска, между копиями PRIVHEAD.
Внутренне
секция config состоит
из заголовка (VMDB) и
одного или нескольких VBLKs -
специальных 128-байтовых структур данных, каждая из которых описывает
соответствующий ей том, контейнер, раздел, диск или группу дисков.
VMDB-заголовок не имеет копии
и нигде не дублируется, однако все его изменения протоколируются в
журнале (KLOG) и потому могут быть
восстановлены.
Строение VMDB и VBLs подробно документировано в "LMD Documentation",
находящейся на сайте LINUX-NTFS и потому описывать его
здесь нет никакой необходимости (оно слишком громоздко, к тому же крайне
маловероятно,
что кому-то потребуется восстанавливать секцию config руками).
Рисунок 18. Внутри LDM.
Для просмотра LDM-базы и архивирования ее
содержимого можно воспользоваться утилитой LDM-dump
Марка Руссиновича, бесплатную копию которой можно скачать с его сайта
(http://www.sysinternals.com/files/ldmdump.zip). Как вариант -
можно
зарезервировать последний мегабайт физического диска и последний
мегабайт всех
патриций, чей Boot ID
равен 42h любым
подходящим дисковым редактором (например, Sector Inspector'ом) и
сохранить
эту информацию на надежном носителе (Zip'е, СD-R/RW), не
забывая также зарезервировать и TOCBLOCK.
При
восстановлении удаленных динамических дисков следует учитывать, что,
во-первых,
журнал изменений на интерфейсном уровне недоступен и выполнить откат
легальными
средствами операционной системы невозможно. Во-вторых, boot-сектор
удаляемых дисков
автоматически очищается и восстанавливать его приходится вручную, о чем
мы чуть
позже и поговорим.
Если размер и
тип удаленного динамического диска вам известен (на NTFS-дисках его
можно
извлечь из копии boot-сектора), просто зайдите
в Менеджер Управления Дисками и воссоздайте его заново, от предложения
отформатировать раздел любезно откажитесь и восстановите очищенный
boot-сектор по методике,
описанной ниже.
Как видно, Microsoft тщательно
позаботилась о своих пользователях и подошла к проектированию
динамических
дисков со свежей головой, что для нее вообще нехарактерно.
Базовые (Basic)
разделы
|
Динамические (Dynamic) разделы
|
Основный раздел/Primary partition
|
Простой том/Simple volume
|
Системный и загрузочный раздел/System
and boot partitions
|
Системный и загрузочный том/System
and boot volumes
|
Активный раздел/Active partition
|
Активный том/ Active volume
|
Расширенный раздел/Extended partition
|
Том и свободное пространство/Volume
and unallocated space
|
Логический диск/Logical drive
|
Простой том/Simple volume
|
Набор томов/Volume set
|
Составной том/Spanned volume
|
Чередующийся набор/Stripe set
|
Чередующийся том/Stripe set
|
Таблица 5. Tерминологическое
соответствие динамических и обычных
дисков.
Загрузочный сектор - базовые концепции
Первый сектор
логического диска носит название загрузочного (boot).
Он содержит
самозагрузочный код (bootstrap code)
и важнейшие сведения о геометрии д
|