-виртуальный город технической документации.

Alex Bondarenko

Восстановление тома NTFS

(из личного печального опыта)

Сбой в системе произошел во время процедуры копировании с одного логического диска на другой (оба логических диска находились на одном физическом диске). Диск (том) которого копировалась информация содержал сбойные кластера. При попытке копирования с этого диска и произошел сбой системы. Windows NT"забыла" записать MFT (Master File Table) для диска на который писалась информация. В результате система перестала воспринимать оба тома как таковые, выводя сообщение о невозможности чтения $Volume.

Схожая ситуация ситуация наблюдается при действии некоторых вирусов, разрушающих boot-сектор или файловую систему. Приминительно к данному случаю я бы отнес произошее к "багу" Windows NT. Мне кажется, что MFT - это последнее, что система может позволить себе "потерять". Тем более, что MFT может находиться практически в любом месте тома, что указывается ссылкой в EBR, и при невозможности записать MFT в сбойный кластер система по идее могла бы записать его в любое другое доступное место. В нашем же случае система потеряла еще и копию MFT. Т.е. баг в чистом виде. Пользователи NT (и соответственно NTFS) - будьте мужественны!

Особой благодарности заслуживает корпорация Microsoft, сделавшая структуру "наиболее защищенной от сбоев" файловой системы (NTFS) очередной "тайной мадридского двора", о которой знают все кроме Knowledge Base. Тем не менее, информацию о структуре BR и EBR корпорация сочла возможным открыть широкой публике

Восстановление MBR и boot-сектора

По мнению автора наиболее "удобоваримой" (вернее было бы сказать традиционной) утилитой для исправления (или создания) MBR является fdisk, входящий в состав любой не слишком “древней” версии Linux.

Но прежде, чем перейти к воссозданию MBR, нам необходимо подробнейшим образом ознакомиться с содержимым диска. Для этого можно установить диск под Linux и воспользоваться программой hexedit с ключем -d. Например, "hexedit -d /dev/hdc". Под NT подойдет hexedit, shareware версию которого можно взять на www.hotfiles.com. Также можно испльзовать diskedit из пакета Norton Utilities.

В Resource Kit, который поставляется  с Windows 2000, также есть утилита для работы с диском на низком уровне. К сожелению, автор смог познакомиться с этой утилитой только из замечательно статьи г-на Фролова http://www.certification.ru/library/mp/mp-1099-1.htm. Эту статью настоятельнейшим образом необходимо прочитать, если вы собираетесь "влазить" в NTFS.

Итак в самом начале диска мы видим Master Boot Record. Неважно, что там находится за исключением двух моментов:

Данные о месторасположении томов (Partition Table) на диске начиная со смещения 0x1BE.

Заключительная запись в конце MBR: смещение 0x1FE, байты со значением 0x55, 0xAA.

Структура Partition Table следующая:

Byte Offset

Field Length

Sample Value


Field Name and Definition

0x01BE

BYTE

0x80

Boot Indicator. Indicates whether the volume is the active partition. Legal values include:
00. Do not use for booting.
80. Active partition.

0x01BF

BYTE

0x01

Starting Head.

0x01C0

6 bits

0x01 *

Starting Sector. Only bits 0-5 are used. The upper two bits, 6 and 7, are used by the Starting Cylinder field.

0x01C1

10 bits

0x00 *

Starting Cylinder. Uses 1 byte in addition to the upper 2 bits from the Starting Sector field to make up the cylinder value. The Starting Cylinder is a 10-bit number, with a maximum value of 1023.

0x01C2

BYTE

0x07

System ID. Defines the volume type. See Table 1.3 for sample values.

0x01C3

BYTE

0xFE

Ending Head.

0x01C4

6 bits

0xBF *

Ending Sector. Only bits 0-5 are used. The upper two bits, 6 and 7, are used by the Ending Cylinder field.

0x01C5

10 bits

0x09 *

Ending Cylinder. Uses 1 byte in addition to the upper 2 bits from the Ending Sector field to make up the cylinder value. The Ending Cylinder is a 10-bit number, with a maximum value of 1023.

0x01C6

DWORD

0x3F000000

Relative Sectors. The offset from the beginning of the disk to the beginning of the volume, counting by sectors.

0x01CA

DWORD

0x4BF57F00

Total Sectors. The total number of sectors in the volume.

A BYTE is 8 bits, a WORD is 16 bits, a DWORD is 32 bits, and a LONGLONG is 64 bits. Sample values marked with an asterisk (*) do not accurately represent the value of the fields, because the fields are either 6 bits or 10 bits and the data is recorded in bytes.
Numbers larger than one byte are stored in little endian format, or reverse-byte ordering. Little endian format is a method of storing a number so that the least significant byte appears first in the hexadecimal number notation. For example, the sample value for the Relative Sectors field in the previous table, 0x3F000000, is a little endian representation of 0x0000003F. The decimal equivalent of this little endian number is 63.

Источник: Chapter 1 - Disk Concepts and Troubleshooting
(http://www.microsoft.com/technet/win2000/win2ksrv/reskit/sopch01.asp)

"Продвинутые" системы типа NT и Linux не используют данные о цилиндре, секторе и головке (т.н. CHS). Данные CHS использует только загрузчик системы. Автор статьи надеется, что читателю не придет в голову восстанавливать том файловой системы с целью загрузки с последнего. Поэтому мы воспользуемся данными об относительном адресе начала тома в секторах (0x1C6) и данными о размере тома (0x1CA). Размер сектора составляет в нормальном случае 512 байт (0x200).

Прежде всего необходимо удостовериться в наличии записей Partition Table как таковых. Затем попытаться посмотреть те сектора на диске, на которые указывает запись по адресу 0x1CA. (Для второго основного раздела соответственно 0x1BA и т.д.). Следует также посмотреть на тип файловой системы раздела по адресу 0x1C2. Байт со значением 0x07 означает основной раздел NTFS, 0x05 означает, что запись в PT указывает на Extended Partition Table. Подробнее со значениями этого поля можно ознакомиться на указанной ссылке Microsoft.

Если вы столкнулись с необходимостью восстановления extended partition (т.е. расширенного раздела), то необходимо помнить, что по адресу сектора, указанному в MBR находится сектор содержащий в примитивном виде Boot Sector с Partition Table для extended partition(s). Формат записи Partition Table в данном случае ничем не отличается (смещения те же).

После того, как определено место расположения восстанавливаемого тома, необходимо посмотреть начало этого тома, а именно его Boot Sector и BPB (BIOS Parameter Block).

Boot Record NTFS содержит первые три байта с командой jump, после которой следует OEM ID, а именно "NTFS". Boot Sector NTFS заканчивается так:

…\NTLDR is compressed…………

при этом замыкающие сектор байты имеют значения 0x55 0xAA.

Если Boot Sector в наличии на нужном месте - его необходимо "осмотреть внешне". Если есть подозрения по поводу его целостности, то в NTFS копия Boot Sector'а находится в последнем секторе соответствующего тома, где ее можно взять и записать поверх поврежденной.

Boot Sector Sections on an NTFS Volume

Byte Offset

Field Length

Field Name

0x00

3 bytes

Jump Instruction

0x03

LONGLONG

OEM ID

0x0B

25 bytes

BPB

0x24

48 bytes

Extended BPB

0x54

426 bytes

Bootstrap Code

0x01FE

WORD

End of Sector Marker

 BPB and Extended BPB Fields on NTFS Volumes

Byte Offset

Field Length

Sample Value

Field Name

0x0B

WORD

0x0002

Bytes Per Sector

0x0D

BYTE

0x08

Sectors Per Cluster

0x0E

WORD

0x0000

Reserved Sectors

0x10

3 BYTES

0x000000

always 0

0x13

WORD

0x0000

not used by NTFS

0x15

BYTE

0xF8

Media Descriptor

0x16

WORD

0x0000

always 0

0x18

WORD

0x3F00

Sectors Per Track

0x1A

WORD

0xFF00

Number Of Heads

0x1C

DWORD

0x3F000000

Hidden Sectors

0x20

DWORD

0x00000000

not used by NTFS

0x24

DWORD

0x80008000

not used by NTFS

0x28

LONGLONG

0x4AF57F0000000000

Total Sectors

0x30

LONGLONG

0x0400000000000000

Logical Cluster Number for the file $MFT

0x38

LONGLONG

0x54FF070000000000

Logical Cluster Number for the file $MFTMirr

0x40

DWORD

0xF6000000

Clusters Per File Record Segment

0x44

DWORD

0x01000000

Clusters Per Index Block

0x48

LONGLONG

0x14A51B74C91B741C

Volume Serial Number

0x50

DWORD

0x00000000

Checksum

Источник: Chapter 1 - Disk Concepts and Troubleshooting
(http://www.microsoft.com/technet/win2000/win2ksrv/reskit/sopch01.asp)

Во первых не мешало бы проверить BS включая BPB не предмет соответствия вышеуказанных полей. Указанная в BPB запись со смещением 0x28 указывает размер тома в секторах. Это размер по идее должен совпадать с размером, указанным в Partition Table для соответствующего тома. Значения Bytes per Sector и Sectors per Cluster четко определены для соответствующих размеров томов. Попробуйте найти эту информацию на MSDN.

Осмотрев MBR, Partition Table и Boot Sector восстанавливемого тома можно принять решение о дальнейших необходиых мерах по восстановлению. Т.е. необходимо привести в соответствие данные о размерах томов в MBR с данными в boot секторе тома NTFS. (Или наоборот, смотря что "осталось живым").

После восстановления всех Partition Table автор рекомендует воспользоваться fdisk из Linux для проверки Partition Table. Можно также просто загрузить Linux с установленным сбойным диском и посмотреть, что находится в начале соответствующих разделов, т.е., например:

hexedit -d /dev/hdc1

hexedit -d /dev/hdc5

Если вы при этом увидите Boot Sector'a томов, то можно двигаться дальше.

Восстановление MFT

Запись MFT (Master File Record) является главным файлом (там все является файлом) на томе NTFS.

Процесс восстановления отдельных файлов прекрасно описан г-ном Фроловым http://www.glasnet.ru/~frolov и воплощен в его программе EraseUndo. Поэтому необходимо остановиться на том, что там не описано.

Для успешной работы с MFT целесообразно ознакомиться с документацией на http://www.via.ecp.fr/~regis/ntfs/new/index.html.

FILE record number File name

0 $MFT

1 $MFTMirr

2 $LogFile

3 $Volume

4 $AttrDef

5 . (root directory)

6 $Bitmap

7 $Boot

8 $BadClus

9 $Quota

A $UpCase

B C D E F

10 and higer Any file

Итак, MFT содержит 16 записей файлов, каждая из которых начинается с "FILE" и заканчивается 0xFFFFFFFF. Во-первых, необходимо удостовериться в наличии этих фаловых записей. Чтобы определить, в каком месте находится MFT, необходимо посмотреть в boot sector'е тома номер сектора, в котором находится MFT (смещение 0x30 Boot Sector'a). Не мешает также посмотреть, есть ли в наличии копия MFT (MFT Mirror) в секторе, который указан в BS со смещением 0x38.

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

ПОСЛЕ ЭТОГО ТОМ ОТКРЫВАЕТСЯ WindowsNT, но файлов там СИСТЕМА НЕ НАХОДИТ.

Наиболее простым вариантом теперь является запуск chkdsk с ключем /f. При этом что-то будет даже найдено, но большинство файлов NT удалит как orphans.

После этого мы имеем:

монтируемый том

кучу удаленных файлов в хорошем состоянии.

НИЧЕГО НЕ ПИСАТЬ НА ДИСК. ВАШИ ДАННЫЕ (ПОЧТИ) ЦЕЛЫЕ. Но при попытке записи система будет естественным образом писать поверх освободившихся индексов.

Дальше автор рекомендует приобрести EraseUndo у господина Фролова или воспользоваться его вышеуказанной статьей для восстановления файлов, либо написать что-то свое.

Все вышеуказанное можно не читать, если воспользоваться утилитой для восстановления файлов под NTFS Tiramisu http://www.recovery.de). Теперь эта утилита называется Easy Recovery. Существуют также версии этой утилиты для  восстановления файлов в системах FAT. Есть несколько недостатков в использовании этой утилиты: во-первых вы потеряете все длинные имена файлов (существует только DOS-версия этой утилиты), а во-вторых — нельзя копировать восстановленные файлы на диски NTFS(это можно сделать только в том случае, если у вы установите на диск драйвер, позволяющий видеть диск NTFS) и в-третьих - Tiramisu довольно дорогое удовольствие.

УДАЧИ ВСЕМ !

Todo List для разработчиков Windows NT (2000).

  1. Сделать еще одну копию MFT (если двух мало), которая бы периодически обновлялась, но не затрагивалась бы при каждом изменении файловой системы.

  2. Убрать саму возможность исчезновения обеих таблиц MFT.

  3. Добавить в chkdsk возможность восстановления записей MFT при ее отсутствии из других доступных данных (об индексах и т.п.)

 

© Alex Bondarenko

alex831973@geocities.com


Используются технологии uCoz