Головна Завантажувальна Запис - Master Boot Record (MBR)

Для початку давайте визначимося з термінологією. Під словами, винесеними в заголовок статті, часто розуміють дві різні речі, які в деяких випадках можуть бути еквівалентні, а в деяких - ні. Перше поняття - власне Master Boot Record. Це запис (програмний код і дані), яка завантажується в пам'ять з вінчестера і забезпечує впізнання логічних розділів на ньому, визначає активний розділ і завантажує з нього завантажувальний запис (Boot Record - BR), яка продовжить запуск операційної системи (ОС). І друге поняття - Завантажувальний Сектор, Master Boot Sector (MBS) - це сектор, розташований на циліндрі 0, площини (головка) 0 і має номер 1. У більшості випадків MBS містить весь необхідний код і всі дані, тому його вміст і є MBR , проте бувають випадки (які ми розглянемо в кінці статті), коли код і дані не поміщаються в одному секторі (просто не вистачає місця або з міркувань безпеки), і тоді код цього сектора забезпечить регулярне пам'ять інших секторів. В цьому випадку MBR - це сукупність всіх секторів, які повинні бути завантажені, а MBS - всього лише перший сектор.
Однак почнемо ми з випадку, коли MBR і MBS - одне і те ж, і будемо називати їх більш звичним і широко поширеним терміном MBR. Злегка відступаючи від теми, зауважу, що такий MBR (забезпечує завантаження будь-якої ОС і займає тільки MBS) зазвичай називають терміном Generic MBR.
Взагалі MBR з'явився на жорстких дисках починаючи з MS DOS версії 3.0, в більш ранніх версіях жорсткий диск форматувався як дискета, і в першому секторі розташовувався BR. Відповідно диск вдавав із себе один розділ і не міг бути розбитий на логічні частини - правда, при тих розмірах дисків, які тоді випускалися, це було неактуально.
Розмір сектора на жорсткому диску - 512 байт. Цього простору цілком вистачає для розміщення там всього необхідного - і коду, і даних. Однак тільки одна структура повинна там бути присутнім обов'язково - це сигнатура. Цим словом називається спеціальна, суворо встановлена, послідовність з 2 байт з шістнадцятковим значеннями 55h AAh, яка записується в останні 2 байта сектора і відповідно має зсув від початку сектора 1FEh. Якщо хоча б один з двох останніх байтів відрізняється за значенням, вважається, що перший сектор не є MBR і не містить осмисленої інформації. Якщо комп'ютер при старті, прочитавши перший сектор, не виявить правильної сигнатури, він не буде передавати управління розташованому там коду, навіть якщо він правильний, а видасть повідомлення про те, що головний завантажувальний запис не знайдено. Або буде пробувати знайти її на інших пристроях - наприклад, на дискеті. Злегка відхиляючись від теми, зауважу, що BR також містить сигнатуру 55h AAh в останніх двох байтах.
Ну вже коли почали з хвоста, то підемо від нього до початку сектора. Перед сигнатурою, впритул до неї, розташовані 4 блоки даних по 16 байтів кожний (відповідно зі зміщенням від початку сектора 1BEh, 1CEh, 1DEh, 1EEh). Сукупність цих блоків називається Таблиця Розділів, Partition Table (PT), а кожна окрема запис - елементом таблиці розділів (Partition Table Entry) або просто розділом (Partition). Цих 16 байтів цілком достатньо, щоб вказати всі необхідні характеристики розділу, а саме: тип розділу, ознака активності розділу, початковий і кінцевий сектора розділу в форматі Циліндр (доріжка) - Головка (сторона) - Сектор (Cylinder - Head - Sector, CHS) , відносний номер першого сектора (щодо MBR) і кількість секторів в розділі.
Все інше простір сектора зайнято програмним кодом, який забезпечує розбір PT, пошук активного розділу, завантаження в пам'ять BR цього розділу і передачу йому управління. Як легко підрахувати, на код залишається 512 - 4 * 16 - 2 = 446 байт. Цього простору з надлишком вистачає для виконання зазначених дій.
Отже, загальна структура MBR може бути представлена ​​наступною таблицею:
  Зсув Довжина Опис
 000h 446 Код завантажувача
 1BEh 64 Таблиця розділів
  16 Розділ 1
 1CEh 16 Розділ 2
 1DEh 16 Розділ 3
 1EEh 16 Розділ 4
 1FEh 2 Сигнатура (55h AAh)
Кожен 16-байтний блок, що описує один розділ, має наступну структуру:
  Зсув Довжина Опис
 00h 1 Ознака активності розділу
 01h 1 Початок розділу - головка
 02h 1 Початок розділу - сектор (біти 0-5), доріжка (біти 6,7)
 03h 1 Початок розділу - доріжка (старші біти 8,9 зберігаються в байті номера сектора)
 04h 1 Код типу розділу
 05h 1 Кінець розділу - головка
 06h 1 Кінець розділу - сектор (біти 0-5), доріжка (біти 6,7)
 07h 1 Кінець розділу - доріжка (старші біти 8,9 зберігаються в байті номера сектора)
 08h 4 Зсув першого сектора
 0Ch 4 Кількість секторів розділу
Код типу розділу являє собою однобайтовий ідентифікатор. Якщо його значення - 00h, то вважається, що в даному елементі PT не містяться дані про розподіл, і його вміст ігнорується. Будь-яке ненульове значення означає, що в зазначеному просторі знаходиться розділ певного типу. Деякі значення однозначно вказують тип розділу, деяким відповідають кілька можливих типів, і визначення конкретного типу покладається на операційну систему, інші зарезервовані для майбутнього використання. Порівняно повний та актуальний довідник по кодам типів розділів можна знайти в Ralf Brown Interrupt List в файлі INTERRUPT.D, таблиця 00652, який міститься в архіві (на момент написання статті) inter61a.zip за адресою http://www.pobox.com/ ~ ralf / files.html . Тут же я приведу таблицю тих типів розділів, які створюються операційними системами Windows 9x і Windows NT / 2000 / XP:
  Код Тип розділу
 01h 12-бітна FAT
 04h 16-бітна FAT до 32 Мбайт
 05h Розширений розділ
 06h 16-бітна FAT понад 32 Мбайт
 07h Windows NT NTFS (і деякі інші - тип визначається за вмістом BR)
 0Bh 32-бітна FAT
 0Ch 32-бітна FAT з використанням розширеного управління INT13
 0Eh LBA VFAT (то ж що і 06h, з використанням розширеного управління INT13)
 0Fh LBA VFAT (то ж що і 05h, з використанням розширеного управління INT13)
 17h Прихований розділ NTFS
 1Bh Прихований розділ 32-бітної FAT (то ж що 0Bh)
 1Ch Прихований розділ 32-бітної FAT з використанням розширеного управління INT13 (то ж що 0Ch)
 1Eh Прихований розділ LBA VFAT (то ж що і 06h, з використанням розширеного управління INT13)
 86h Розділ FAT-16 stripe-масиву Windows NT
 87h Розділ NTFS stripe-масиву Windows NT
 B6h Дзеркальний master-розділ FAT-16 Windows NT
 B7h Дзеркальний master-розділ NTFS Windows NT
 С6h Дзеркальний slave-розділ FAT-16 Windows NT
 С7h Дзеркальний slave-розділ NTFS Windows NT
Ознака активності розділу - тобто ознака того, що операційну систему слід завантажувати саме з цього розділу - може мати значення 80h (розділ активний) і 00h (розділ не активний). У загальному випадку кількість активних розділів має бути не більше 1 (інакше як зробити вибір?). Якщо активних розділів немає - значить з цього жорсткого диска ОС не може бути завантажена. Інші значення вважаються помилковими і ігноруються. Втім, рішення про передачу управління приймає код завантажувача, тому значення байта ознаки завантажувальний - аксіома тільки для стандартних загрузчиков.
Трёхбайтний блок адреси початку і адреси кінця розділу мають ідентичний формат. Тут фактично використовується упаковка значень з тим, щоб вони мали мінімальний обсяг. Формат упаковки повністю відповідає тому, як ці дані передаються процедурам роботи з жорстким диском (Int 13h), що знаходяться в BIOS комп'ютера, тому і накладні обчислювальні витрати виходять мінімальними. При цьому циліндри і доріжки нумеруються, починаючи з нульового значення, а сектора - чомусь з першого. Уже й не знаю чому - так склалося історично.
Сектор, на який вказує адресу початку розділу, містить в собі спеціальний запис, яка називається завантажувальним записом (BR). Її призначення і склад ми розглянемо в окремій статті.
Зсув першого сектора розділу - це фактично номер цього сектора якщо всі сектори жорсткого диска перенумерувати починаючи з 0 (відповідно до нумерації, яка застосовується Int 25h / 26h) в порядку зростання спершу по секторам однієї доріжки, далі в порядку збільшення номерів головок і, нарешті, циліндрів. А що таке кількість секторів в розділі - зрозуміло без пояснень.
Природно, що всі ці значення пов'язані простими залежностями, адже у них інформація надлишкова. Тому наведу формули залежності між ними.
Отже, якщо позначити:
C M - циліндр, на якому розташовується MBR;
H M - доріжка, на якій розташовується MBR;
S M - сектор, в якому розташовується MBR;
C S, H S, S S,C E, H E, S E - то ж, для секторів початку (S) і кінця (E) розділу;
H H - кількість доріжок у жорсткого диска;
S H - кількість секторів на одній доріжці у жорсткого диска,
то:
Абсолютний номер сектора, в якому знаходиться PT:
Num PT = C M * H H * S H + H M * S H + S M -1
Абсолютний номер сектора початку розділу:
Num S = C S * H H * S H + H S * S H + S S -1
Абсолютний номер сектора кінця розділу:
Num E = C E * H H * E H + H E * E H + E E -1
Зсув першого сектора розділу:
Offset S = Num S - Num PT
Кількість секторів розділу:
Amount = Num E - Num S +1
З наведених формул, крім того, видно, що важливе значення має те, скільки доріжок має один циліндр жорсткого диска і скільки на кожній доріжці секторів. Ці значення залежать як від геометрії жорсткого диска, так і від обраного в установках BIOS режиму трансляції. Тому диск, поділений на розділи в одному режимі трансляції, може виявитися нечитабельним при зміні режиму трансляції.
Для IDE-накопичувачів існують кілька режимів трансляції:
CHS (Cylinder-Head-Sector) - при цьому геометрія диска вважається такою, якою він її повідомляє комп'ютера. Не спокушайтеся - у більшості накопичувачів реальна геометрія зовсім не така. Однак контролер, що входить до складу жорсткого диска, проводить необхідні перетворення самостійно, і то, як він це робить, для нас несуттєво. При цьому максимальна кількість циліндрів - одна тисяча двадцять чотири (від 0 до 1023), доріжок - 16 (від 0 до 15), секторів - 63 (від 1 до 63), а максимальний обсяг диска, доступний в даній трансляції без застосування спеціальних програм - 504 Мбайт . При дискових операціях адресу сектора передається BIOS комп'ютера контролера жорсткого диска без зміни.
LBA (Logical Block Addressing) - при цьому режимі трансляції використовується не та геометрія диска, яку він повідомляє BIOS комп'ютера. Виробляється приведення до формату, коли кількість циліндрів не перевищує 1024, а кількість секторів на доріжку одно 63. Наведене кількість доріжок при цьому залежить від BIOS комп'ютера і обсягу жорсткого диска і може дорівнювати 16, 64, 128 або 255, останні версії BIOS як правило використовують приведення до 255 (0-254) доріжках незалежно від обсягу накопичувача. При зверненні до диска передані в LBA-трансляції номер циліндра, головки і сектора перераховуються в абсолютний номер сектора, і саме він передається BIOS комп'ютера контролера жорсткого диска для виконання операції. При обсязі накопичувача понад 8 Гбайт кількість циліндрів виходить більше 1024, тому на комп'ютерах, які не підтримують роботу розширеного режиму Int 13h, без установки спеціального програмного забезпечення простір за межами 8 Гбайт недоступно (незалежно від режиму трансляції). Іноді, втім, допомагає оновлення BIOS комп'ютера.
LARGE, або ECHS (Extended CHS) - при цьому режимі трансляції проводиться приведення числа циліндрів до значення менше 1024 за рахунок кратного збільшення кількості доріжок. Наведене кількість доріжок строго кратно реальному кількість секторів на доріжку не змінюється. Втім, у більшості сучасних накопичувачів кількість секторів на доріжку (по запевненнях контролера накопичувача) одно 63. Максимально доступний обсяг на комп'ютерах, які не підтримують роботу розширеного режиму Int 13h, залежить від реальної кількості доріжок, але не більше 8 Гбайт (наприклад, якщо диск має 16 доріжок, то в LARGE трансляції їх може бути 16, 32, 48 ... 240, але не 255, тому що 255 не кратне 16, а максимальний доступний обсяг - 1024 * 240 * 63 * 512 / (1024 3) = 7.38 Гб).
При використанні трансляції LBA або LARGE за рахунок округлення до цілих значень кілька секторів в кінці накопичувача можуть "випасти" з описаного простору і стати недоступними. Втім, втрати зазвичай невеликі.
Що ж стосовно SCSI-накопичувачів, то вони завжди працюють в режимі LBA-трансляції. Вірніше, контролер SCSI представляє геометрію накопичувача відповідно до вимог LBA-трансляції, а сам при зверненні до диска передає йому абсолютний адресу сектора. Природно, що саме на BIOS SCSI-контролера покладається обов'язок виробляти необхідні перерахунку.
Повернемося до MBR. Як уже сказано, він містить 4 блоки даних про елементи таблиці розділів. Це означає, що максимальна кількість розділів, яке може бути описано в MBR, дорівнює чотирьом. Однак це аж ніяк не означає, що максимальне число розділів, на які може бути розділений накопичувач, дорівнює чотирьом. Для подолання цього бар'єру було введено спеціальний тип розділу з кодом 05h - розширений розділ (Extended Partition).
Розширений розділ сильно відрізняється від всіх інших типів розділів. По-перше, він описує не розділ, а область простору накопичувача, в якій розташовані інші розділи. При цьому кількість що знаходяться в ньому розділів теоретично не обмежена. Правда, ті розділи, які розташовані в цій області, кілька "обмежені в правах", найістотнішим обмеженням є те, що вони не можуть бути активними (вірніше, можна зробити так, що з такого розділу завантажити систему, але штатні засоби більшості існуючих ОС цього не дозволяють, доведеться використовувати спеціальні засоби). По-друге, в MBR має бути присутня тільки одна запис про розширеному розділі. Вірніше, їх можна зробити і більше (хоч всі чотири), але як поведе себе ОС, зустрівши таке, передбачити важко. Наприклад MS-DOS 6.20 просто ігнорує все розширені розділи, крім першого в списку, як ніби їх взагалі немає. По-третє, на відміну від інших типів розділів в тому секторі, який прописаний в структурі як сектор початку розділу, міститься аж ніяк не BR. Там знаходиться фактично ще один MBR, який має сигнатуру і таблицю розділів, але зазвичай не містить програмного коду (зазвичай сектор, що містить таблицю розділів, але не містить коду початкового завантаження, називають Abstract MBR). Втім, оскільки там немає активних розділів, то і код ні до чого. У таблиці розділів такого сектора є зазвичай одна або дві записи. Перша описує звичайний розділ (Partition), причому цей розділ повинен повністю перебувати всередині простору Extended Partition. Якщо звичайний розділ займає не весь простір, в таблиці розділів з'являється другий елемент, який описує простір, що залишився як Extended Partition. У наступному секторі точно також описується один розділ і, якщо місце залишилося, ще запис про Extended Partition. І так триває до тих пір, поки простір не закінчиться. Фактично всі записи про розширених розділах представляють собою пов'язану ланцюг (Extended Partition Chain), в якій від дискового простору відщипують шматочки на звичайні розділи, поки місце не скінчиться. Помилка в будь-якому елементі цього ланцюга призведе до її розсипання, в результаті всі записи після розриву не будуть знайдені ОС, а займане ними простір ОС буде вважати незайнятим.
При заповненні ланцюга зазвичай ОС дотримується декількох правил. По-перше, описаний в черговому "ланці" ланцюга звичайний розділ не повинен розташовуватися в середині, оскільки тоді для опису одержані двох шматків незайнятого простору потрібно в PT цього елемента ввести два записи про двох різних розширених розділах а, як я говорив раніше, ОС зазвичай ігнорують всі такі записи крім першої, і в результаті частина дискового простору випаде з розбиття. По-друге, як правило запис про звичайний розділі робиться так, щоб вона займала початкову область розширеного розділу, а наступний елемент ланцюга розділів - залишок.
Які ж проблеми можуть виникнути з вмістом MBR? По-перше, фізичне або логічне руйнування, тобто пошкодження поверхні або інша механічна проблема або руйнування сервометки, що не дає можливості прочитати цей сектор з диска. Однак подібні випадки виходять за рамки нашого розгляду. І друга, найбільш часто зустрічається, - це руйнування всієї або частини інформації, що міститься в секторі, в результаті чого розділи або не можуть бути знайдені операційною системою, або їх параметри визначаються невірно.
Найлегший випадок - це руйнування сигнатури. При цьому ОС вважає, що в секторі міститься якась випадкова інформація, "сміття", а сам накопичувач взагалі не поділений на розділи і ніякої інформації на ньому немає. Для відновлення достатньо всього лише будь-яким засобом прямого доступу до секторів диска (найбільш популярний DISKEDIT з пакета NORTON UTILITIES) відновити сигнатуру. Більшість ОС, правда, потрібно перезавантажити, оскільки ОС як правило при старті зчитують інформацію про розбиття диска на розділи і далі в процесі роботи її зміни не враховують.
Більш складний випадок - це руйнування коду. При цьому втрачається можливість зробити завантаження операційної системи з накопичувача, а спроба завантаження як правило закінчується "зависанням" комп'ютера. У той же час якщо завантажитися з іншого носія (інший жорсткий диск, дискета, завантажувальний CD-ROM і т.п.), то вся інформація на накопичувачі доступна для використання. В цьому випадку рекомендується використовувати штатні засоби відновлення коду завантажувача, які є в кожній ОС. Наприклад, в ОС Windows 9x для цієї мети використовується програма FDISK.EXE, що запускається з ключем / MBR.
Руйнування коду - не настільки рідкісний випадок, як може здатися. Як правило, така неприємність відбувається, коли на один накопичувач послідовно встановлюються різні ОС в один або різні розділи. Будь-яка ОС при установці бажає мати в MBR власний код, але далеко не всі піклуються про збереження того коду, який був в секторі раніше. Наприклад ОС Windows 9x переписують код завантажувача, не ставлячи до відома користувача і безповоротно знищуючи старе вміст. Втім, такий випадок якраз не дуже страшний, оскільки всі завантажувачі ОС дуже схожі. Проблема виникає, якщо для розбиття накопичувача на розділи використовувалися програмні засоби третіх фірм, такі як EZ-drive, ODM або наприклад SpeedStore, для яких саме поняття MBR і MBS не еквівалентні. Через інший ідеології завантаження (яку ми розглянемо пізніше) код, що знаходиться в MBS, виконує іншу функцію, а саме пошук і завантаження частини коду MBR, що розташовується в інших секторах диска. Заміна коду призводить до того, що ця функція втрачається, і відповідно виникають проблеми різного характеру. Користувач повинен бути досить обережним, якщо використовує подібні програмні засоби - відновлення коду в таких випадках може виявитися вельми непростою справою.
І найбільш важкий і неприємний випадок - це руйнування самої таблиця розділів. Втім, як відомо, біда ніколи не приходить одна, і найчастіше руйнуються всі три компоненти MBR, але саме руйнування PT призводить до найбільш тяжких наслідків, оскільки при цьому втрачається можливість доступу до що зберігається на накопичувачі інформації. PT може бути зруйнована повністю, а може і частково - тобто частина елементів зруйнована, а інші цілі. Бувають випадки, коли PT, що знаходиться в MBR, ціла, а зруйнована запис про розділи в одному з ланок ланцюга Extended Partition. Однак оскільки структура MBR і структура абсолютно ідентичні (за винятком того що в елементах Extended Partition відсутній код), методика відновлення в обох випадках одна і та ж.
Існує достатня кількість програм, які вміють відновлювати зруйновані PT. Якість їх роботи різний і залежить головним чином від того, наскільки складним було розбиття диска на розділи, чи всі типи розділів, які були на диску, відомі програмі і чи немає крім руйнування PT ще якихось пошкоджень інформації в інших секторах, особливо в BR розділів. Однак ми не шукаємо легких шляхів, і якщо у Вас над душею не варто начальник з криками "швидше, швидше, стрибками роздрукуй мені бланк, я у відпустку спізнююся!", Ви отримаєте набагато більше задоволення, якщо самостійно, без будь-яких програм-автоматів, користуючись лише своїми знаннями, зможете відновити всю інформацію. Ви навіть можете просто провести всі необхідні дослідження, отримати всі цифри, які потрібно записати в PT, а потім запустити програму відновлення і після її роботи переконатися, що все порахували правильно. А може, навіть і поправити результати її роботи, якщо вона відпрацювала не на 100%.
Отже, для роботи нам буде потрібно: завантажувальний диск з будь-яким DOS, на яку скопійований файл DISKEDIT.EXE, олівець, папір, калькулятор (втім, калькулятор є в DISKEDIT) і трохи мізків. Бажано, звичайно, щоб і DOS, і DISKEDIT були свіжіші. Я використовую DOS 7.10 від Windows 98 SE і DISKEDIT з пакета NORTON UTILITIES 2002. Ніякі драйвери нам на цьому етапі не потрібні, ну крім тих випадків, коли накопичувач підключений до старого SCSI-контролера і без завантаження драйвера просто не видно. Можна завантажити драйвер мишки - буде трохи зручніше. Тепер головна дрібниця - крім зазначених файлів на дискеті не повинно бути нічого! Це важливо - якщо на дискеті немає конфігураційного файлу, DISKEDIT.EXE запуститься в режимі тільки читання (Read-Only) і ніякі дані на диску не будуть змінені, поки ми цього явно не будемо просити Тебе. А дискету взагалі б закрити від запису.
Завантажується з дискети. Запускаємо DISKEDIT.EXE. Після завантаження натискаємо клавіші Alt-D (або через меню Object - Drive). Виводиться вікно з доступними дисковими пристроями. Спершу зазначимо, що нам потрібні фізичні пристрої (Physical disks), а потім виберемо потрібний диск (припустимо, Hard Disk 1) і натиснемо ОК. При цьому в якості діапазону перегляду будуть обрані всі сектори диска від першого до останнього. Це нам і потрібно.
Спочатку ми попросимо програму виконати перегляд диска і знайти всі сектори, які можуть бути елементами ланцюга Extended Partition або BR. І хоча при цьому DISKEDIT буде просто шукати сектора, мають сигнатуру, а не аналізувати вміст (це ми беремо на себе) - результати можуть здорово полегшити роботу. Правда доведеться запастися терпінням - процес це не швидкий, та до того ж кожен знайдений сектор потрібно буде брати на олівець, але овчинка вичинки варта.
Отже, Tools - Find Object - Partition / Boot. Поїхали. Кожен раз, коли трапляється сектор з сигнатурою, пошук зупиняється, на екран виводиться дамп сектора, а в правому нижньому кутку - номер сектора. Саме ці адреси і потрібно брати на олівець. Втім, якщо при розбитті диска на розділи не використовувалися особливо витончені методи, все цікавлять нас сектора будуть розташовуватися на нульовий або першій стороні в першому секторі, тобто Side 0 або 1, Sector 1. Решта сектора, наприклад який-небудь Cyl 12, Side 4, Sector 52 можна сміливо проігнорувати - це випадково. Правда, ми отримуємо абсолютний номер сектора, але це не страшно, для "правильних" секторів номер буде без остачі ділитися на кількість секторів на доріжку, зазвичай 63 (інші значення зустрічаються зараз набагато рідше - 17, 26, 40, 56, тому далі по тексту всюди де я буду говорити про кількість секторів 63, майте на увазі, що на Вашому конкретному накопичувачі можливо доведеться використовувати інше число). А цю цифру ми можемо подивитися через меню (Info - Drive Info). На жаль, кількість сторін і циліндрів там може виявитися неправильним (що не відповідає використовуваної трансляції), але і це не страшно. Записавши номер чергового сектора, продовжуємо пошук (можна через меню Tools - Find Again, можна просто Ctrl-G). І так поки не отримаємо повідомлення що об'єкт не знайдено. У цей момент у нас на руках (вірніше, на папері) все номера секторів, в яких присутня сигнатура.
Теперь обрабатываем список, отсеивая явно случайные номера (это которые не делятся на 63), и особо выделяя пары номеров, которые различаются на 63. Эти пары - не что иное как пара из элемента Extended Partition и BR описанного в нём раздела.
Теперь отложим на минутку листок с цифрами и попытаемся вспомнить, какого размера разделы были на диске. Так, крупными мазками, 600 мегабайт, 12 гигабайт… запишем всё что помним. Если сумма не равна объёму накопителя - либо что-то забылось, либо неверно вспомнилось, либо было пространство, не принадлежавшее ни одному разделу (а что, бывает… знаю не один случай, когда десятигигабайтный жёсткий диск разбивался на компьютере, материнская плата которого не понимала более восьми гигабайт, а при апгрейде это как-то не вспомнилось… вот так 2 гигабайта и зависли). На этом этапе желательно вспомнить ещё и типы файловых систем в каждом из разделов.
Теперь возьмём оба листка и попытаемся совместить полученные данные. Мегабайт - две тысячи секторов, гигабайт - два миллиона… приблизительно. Но обычно удаётся совершенно однозначно наложить одно на другое. Полезно бывает нарисовать длинный прямоугольник, расставить на нём границы, соответствующие найденным секторам, и поделить на кусочки, соответствующие размерам разделов. Даже если однозначности нет - не беда. Разберёмся. При совмещении данных рекомендую помнить, что некоторые BR и элементы цепи Extended Partition могут быть разрушены (и соответственно не будут найдены), причём наиболее часто разрушаются BR первого (по положению на накопителе) раздела и BR активного раздела.
Впрочем, на данном этапе, пожалуй, всё… и не потому, что дальше некуда, а по другой причине - для дальнейшей работы по восстановлению требуется анализ других структур, которые располагаются уже в "найденных" разделах - это BR, FAT/MFT, каталоги и пр… мы их пока не рассматривали. Впрочем, иногда и найденной и вспомненной информации достаточно. В конце статьи приведен пример такого восстановления (пока не написан).
Иногда знание структуры разделов применяют совершенно для других целей - например, для создания своего собственного разбиения диска на разделы. Пример такого применения также есть в конце статьи.
При создании нестандартного разбиения диска на разделы, кроме требований, описанных ранее (один расширенный раздел и пр.), рекомендую также учитывать то, в каком порядке ОС MS-DOS и Windows назначают разделам буквы логических дисков ( Q51978 - Order in Which MS-DOS and Windows Assign Drive Letters ). Буквы присваиваются, начиная с C: (A: и B: зарезервированы для дисководов гибких дисков, возможно виртуальных). Порядок подключения таков:
  1. Раздел, с которого загружается ОС (при загрузке с жёсткого диска).
  2. Первые первичные разделы остальных жёстких дисков в порядке их нумерования (инициализации) BIOS компьютера.
  3. Разделы в Extended Partition жёстких дисков в порядке их нумерования (инициализации) BIOS компьютера, в порядке их записи в Partition Table дисков.
  4. Остальные первичные разделы дисков, в порядке их записи в Partition Table по порядку их нумерования (инициализации) BIOS компьютера.
  5. Устройства, формируемые драйверами, запускаемыми в файлах config.sys и autoexec.bat, в порядке их формирования и инициализации, если формируемому устройству не назначается в явной форме определённая буква или диапазон букв.
  6. Для ОС, которые могут опознавать и подключать накопители, не инициализируемые BIOS компьютера (не описанные в установках CMOS накопители) - разделы этих накопителей в соответствии с правилами 3 и 4 в порядке инициализации накопителей операционной системой.
Разделы не известных ОС типов не инициализируются и буквы им не присваиваются.
Следует помнить, что ОС семейства Windows NT имеют штатные средства переопределения букв логических дисков.

Пример 1. Ручное разбиение на разделы.

  • Параметры накопителя в LBA-трансляции (взяты из BIOS - Autodetect Hard Disk) - Cylinders 1216, Heads 255, Sectors 63, Capacity 10 Gb.
  • Желаемое разбиение: система 2 Гбайт, данные - 2 Гбайт, игры и дистрибутивы - остальное. Желательно разместить системный раздел в конце диска (по тестам там самая быстрая область), игры - в начале диска (по заверениям специалистов, наиболее часто данные повреждаются именно там).
  • Операционная система - Windows 98 SE rus, все разделы - FAT-32.
Исходя из желаемого разбиения, видится следующая схема: сначала расширенный раздел с двумя логическими дисками в нём - 6 и 2 Гбайт, потом первичный активный раздел 2 Гбайт, либо 3 первичных раздела в указанном порядке и с указанными размерами. Последний вариант нам не подходит (неважно по каким соображениям). Особенности работы программы FDISK выбранной ОС не позволяют выполнить разбиение штатно: если сначала мы создадим первичный раздел, он будет находиться в начале накопителя, если же мы сначала создадим расширенный раздел, то программа отказывается создавать первичный.
Принимаем решение провести разбиение с помощью FDISK насколько возможно, а затем доделать вручную. Первый этап: создать расширенный раздел с двумя дисками; второй: вручную добавить запись о первичном разделе.
Первый этап проблем не вызывает: загружаемся с дискеты, создаём extended partition размером 8 Гбайт, и в ней два логических диска - 6 Гбайт и 2 Гбайт. Перезагружаемся с дискеты, убеждаемся, что на диске появились (но недоступны - ведь мы не форматировали разделы!) диски C: и D:. Форматируем их при помощи стандартного FORMAT и в процессе форматирования убеждаемся, что диск C: имеет размер 6 Гбайт, диск D: - 2 Гбайт. Запускаем DISKEDIT и смотрим содержимое MBR. В нём имеется следующая запись:
 Starting location Ending location Relative Number of
System Boot Side Cylinder Sector Side Cylinder Sector Sectors Sectors
EXTEND No 1 0 1 254 972 63 63 15631182
unused No 0 0 0 0 0 0 0 0
unused No 0 0 0 0 0 0 0 0
unused No 0 0 0 0 0 0 0 0
Нам нужно добавить запись о первичном разделе. Тип (System) будет 0Ch (FAT32x), признак загрузки установлен, начало раздела по адресу 973/0/1, конец раздела по адресу 1215/254/63, относительный сектор начала раздела 15631245 (973*255*63+0*63+1-1), относительный сектор конца раздела 19535039 (1215*255*63+254*63+63-1), количество секторов 3903795 (19535039-15631245+1). Весьма существенная тонкость - если номер цилиндра более 1023, в соответствующее поле вносится значение 1023 - увы, это максимальное значение, которое можно туда записать - а правильное значение ОС рассчитает исходя из заданного количества секторов.
Переводим DISKEDIT в режим Read-Write (Tools-Configuration) и во второй строке вписываем рассчитанные данные. После ввода и проверки всех значений выходим из DISKEDIT клавишей Esc, а на вопрос, что делать с изменениями, отвечаем - записать (write). Перезагружаем компьютер. Убеждаемся, что на диске теперь три раздела - C: - недоступен, D: - 6 Гбайт, E: - 2 Гбайт. Форматируем диск C: с переносом на него системных файлов, в процессе форматирования убеждаемся, что диск C: имеет размер 2 Гбайт. Обновляем код MBR командой FDISK /MBR, вынимаем дискету, перезагружаем компьютер, убеждаемся, что ОС загрузилась, диски C:, D: и E: доступны и имеют размеры 2, 6 и 2 Гбайт. Запускаем NDD и убеждаемся, что ошибок ни в таблице разделов, ни на дисках нет. Разбиение закончено.
Теперь таблица разделов при просмотре через DISKEDIT выглядит так:
 Starting location Ending location Relative Number of
System Boot Side Cylinder Sector Side Cylinder Sector Sectors Sectors
EXTEND No 1 0 1 254 972 63 63 15631182 ; Расширенный раздел
FAT32x Yes 0 973 1 254 1023 63 15631245 3903795 ; Первичный раздел (C :)
unused No 0 0 0 0 0 0 0 0
unused No 0 0 0 0 0 0 0 0
Если поставить курсор на строку с записью о расширенном разделе и нажать Enter, то DISKEDIT автоматически перенесёт просмотр в сектор, на который указывает адрес начала раздела (для первичного раздела это будет BR, для расширенного - элемент цепи разделов). В нашем случае мы увидим такое содержимое элемента цепи разделов:
 Starting location Ending location Relative Number of
System Boot Side Cylinder Sector Side Cylinder Sector Sectors Sectors
FAT32x No 2 0 1 254 728 63 63 11711259 ; Логический раздел (D :)
EXTEND No 0 729 1 254 972 63 11711322 3919923 ; Расширенный раздел
unused No 0 0 0 0 0 0 0 0
unused No 0 0 0 0 0 0 0 0
Продолжим движение по цепи разделов в следующий элемент:
 Starting location Ending location Relative Number of
System Boot Side Cylinder Sector Side Cylinder Sector Sectors Sectors
FAT32x No 1 729 1 254 972 63 63 3919860 ; Логический раздел (E :)
unused No 0 0 0 0 0 0 0 0
unused No 0 0 0 0 0 0 0 0
unused No 0 0 0 0 0 0 0 0
Очередной элемент цепи не содержит записи о расширенном разделе. Цепь закончилась.