Привет, %username%! Сегодня MBR воспринимается как что-то из музея — на новых машинах давно GPT и UEFI, а слово «активный раздел» молодёжь слышит впервые в жизни. Но MBR никуда не делся: он живёт на старых ноутбуках, флешках, виртуалках с BIOS-загрузкой и в виде Protective MBR на тех самых GPT-дисках. И когда что-то «перестало грузиться», понимать, что лежит в первых 512 байтах диска, всё ещё бывает очень полезно.

В этой шпаргалке разберём по байтам, что такое MBR, как устроены его четыре записи о разделах, зачем нужны extended/logical партиции через EBR и какие архитектурные ограничения в итоге привели к появлению GPT.

Что такое MBR

MBR (Master Boot Record) — самый первый сектор диска (LBA 0, 512 байт), в котором одновременно живут две вещи: маленький загрузочный код для BIOS и таблица из четырёх записей о разделах. Появился в 1983 году вместе с PC DOS 2.0 и больше тридцати лет был стандартом разметки x86-машин, пока его наконец не вытеснил GPT.

Главная идея простая до неприличия: BIOS после POST читает первый сектор первого устройства, проверяет, что он заканчивается сигнатурой 0x55AA, и передаёт управление в самое начало этого сектора как обычному 16-битному коду. Дальше уже сам код решает, какой раздел грузить. Никаких CRC, никаких backup-копий, никакой защиты — затёр сектор и привет.

Карта сектора (512 байт)

Offset  Size   Назначение
------  ----   ----------
0x000   440    Bootstrap code (загрузчик, stage 1)
0x1B8   4      Disk Signature (NT Disk Signature / MBR ID)
0x1BC   2      Reserved (обычно 0x0000)
0x1BE   16     Partition Entry #1
0x1CE   16     Partition Entry #2
0x1DE   16     Partition Entry #3
0x1EE   16     Partition Entry #4
0x1FE   2      Boot Signature (0x55 0xAA)

Итого: 440 + 4 + 2 + 64 + 2 = 512 байт ровно. Именно столько было в одном секторе у дисков 80-х, и именно эта цифра до сих пор определяет всё устройство MBR.

Bootstrap code (0x000–0x1B7)

440 байт машинного кода в реальном режиме x86. Что туда обычно кладут:

  • Минимальный загрузчик, который ищет «активный» раздел (с флагом 0x80)
  • Читает с него первый сектор (VBR — Volume Boot Record) и передаёт ему управление
  • Либо это stage 1 GRUB / LILO / syslinux, который читает stage 1.5 / stage 2 с заранее известных секторов

В 440 байт нельзя засунуть драйвер файловой системы — поэтому stage 1 GRUB хранит в себе блок-лист (LBA-адреса) первых секторов stage 1.5 в т. н. «post-MBR gap» (секторы 1–62, до начала первого раздела). Если переразметил диск так, что эти сектора съехали — система не грузится, и это самая частая причина «всё работало, потом подвинул раздел и сломалось».

Disk Signature (0x1B8–0x1BB)

4 байта — уникальный идентификатор диска, который Windows называет NT Disk Signature. По нему ОС привязывает диск к буквам в BCD и реестре. Если склонировать диск побайтово на другой — Windows увидит два диска с одинаковой подписью и одну из них автоматически переведёт в offline. Лечится через diskpart → uniqueid disk id=..., но узнать про эту весёлую особенность обычно успеваешь уже после нескольких часов поиска «почему второй диск не виден».

В Linux эта же подпись видна через fdisk -l, поле Disk identifier: 0x....

Partition Entry (16 байт)

Главная структура разметки. Четыре штуки, фиксированно, на любом MBR-диске в мире:

OffsetSizeПолеОписание
01Boot indicator0x80 — активный (бутабельный), 0x00 — нет, прочее — invalid
13Starting CHSCylinder/Head/Sector начала раздела (legacy)
41Partition TypeТип раздела (см. ниже)
53Ending CHSCHS конца раздела (legacy)
84Starting LBALBA первого сектора раздела (little-endian)
124Size in LBAДлина раздела в секторах

Из этих 16 байт реально работают только последние 8: Starting LBA + Size in LBA. Поля CHS остались для совместимости с BIOS-ами 80-х; современные ОС их игнорируют, но для надёжности туда обычно пишут 0xFFFFFF, если раздел выходит за пределы CHS-адресации (а это всё, что больше ~8 ГБ — то есть фактически любой диск, который ты держал в руках за последние двадцать лет).

Лимиты, которые отсюда растут

  • Starting LBA и Size in LBA — 32-битные → максимум 2³² × 512 байт = 2 ТиБ. Дальше адрес физически не лезет, и MBR на 4-терабайтнике увидит ровно половину диска. Если столкнулся — это знак, что пора на GPT
  • Записей всего 4 → максимум 4 первичных раздела. Чтобы обойти этот лимит, придумали extended-партиции

Partition Type (известные коды)

КодТип
0x00Пусто
0x05Extended (CHS)
0x07NTFS / exFAT / HPFS
0x0BFAT32 (CHS)
0x0CFAT32 (LBA)
0x0EFAT16 (LBA)
0x0FExtended (LBA)
0x82Linux swap
0x83Linux filesystem
0x8ELinux LVM
0xA5FreeBSD
0xAFApple HFS / HFS+
0xEEGPT Protective MBR
0xEFEFI System (на MBR-диске)
0xFDLinux RAID auto-detect

Тип — это просто метка-подсказка для ОС, что внутри. Сам диск от смены типа не «форматируется», но Windows может перестать видеть раздел, если поставить «чужой» код. Кстати, никакого центрального реестра этих кодов нет — список держится на честном слове и Wikipedia, поэтому для разных ОС одинаковые байты иногда означают разное. Привет, GPT с его GUID-ами.

Extended и logical partitions

Чтобы сделать больше четырёх разделов, одну из четырёх записей объявляют extended (тип 0x05 или 0x0F). Внутри extended-области строится связный список через дополнительные структуры — EBR (Extended Boot Record).

Каждый EBR — это сектор с такой же таблицей из 4 записей, но реально используются только две:

  • Запись 1 — описывает logical-раздел, лежащий сразу за этим EBR
  • Запись 2 — указывает на следующий EBR в цепочке (тип 0x05/0x0F); смещения здесь относительные

Цепочка обрывается, когда вторая запись пустая. В Linux logical-разделы нумеруются с 5 (/dev/sda5, /dev/sda6, …) — независимо от того, сколько было primary-разделов. Лимит на количество — обычно 60 logical в Linux, ограничение драйвера ядра.

Минусы конструкции:

  • Список последовательный → удалил logical посередине, и нумерация поехала, фрагментация в полный рост
  • Затёр EBR — потерял всю цепочку дальше; backup-копии нет
  • Активным может быть только primary; нельзя загрузиться напрямую с logical, нужен посредник

Это всё, очевидно, костыль. И именно поэтому на серверах с пятнадцатью разделами под логи, БД, /var и прочее переход на GPT воспринимается как глоток свежего воздуха.

Boot Signature (0x1FE–0x1FF)

Два байта: 0x55 0xAA. Если их нет — BIOS считает диск незагрузочным и идёт к следующему. Это самая частая жертва «битого MBR»: код есть, таблица есть, а сигнатуру кто-то затёр. Внешне выглядит как «диск пропал», хотя на самом деле там всего два байта надо вернуть на место.

Что с этим делать на практике

  • Посмотреть таблицу: fdisk -l /dev/sda, sfdisk -d /dev/sda, parted /dev/sda print
  • Сырой дамп: dd if=/dev/sda bs=512 count=1 | hexdump -C — увидишь bootstrap, таблицу разделов и 55 AA в самом конце
  • Бэкап MBR целиком: dd if=/dev/sda of=mbr.bin bs=512 count=1. Только таблица без бутстрапа: dd if=/dev/sda of=ptable.bin bs=1 skip=446 count=64
  • Восстановить bootloader: grub-install /dev/sda (Linux), bootrec /fixmbr (Windows)
  • Сменить тип раздела: fdiskt → код. Не форматирует, только меняет байт
  • Активировать раздел: fdiska. Помним: 0x80 должен стоять только у одного раздела

Чем плох MBR (и зачем родился GPT)

  • Потолок 2 ТиБ — на современных дисках это ровно половина
  • Только 4 первичных раздела, остальное — через костыль с EBR
  • Нет контрольных сумм — один битфлип в нужном месте, и таблица «уехала», а ОС об этом не узнает
  • Нет резервной копии — затёртый сектор 0 равняется диску-«кирпичу» для BIOS
  • Тип раздела — 1 байт без пространства имён, поэтому коды конфликтуют между ОС и существуют по сути «по договорённости»

Подробнее про преемника — в Как выглядит GPT.

Тонкие места, на которых легко споткнуться

  • CHS vs LBA: до сих пор встречаются прошивки, которые читают именно CHS. Если поставить туда «битые» значения, BIOS может отказаться грузиться даже при корректном LBA. Утилиты обычно сами пишут 0xFFFFFF в CHS, но если правил руками — проверь
  • Активный раздел: 0x80 должен быть только у одного раздела. Несколько активных — поведение зависит от загрузчика, и бывает классическое «грузится не то, что ожидал»
  • MBR на USB: некоторые BIOS грузятся только если на флешке 0x80 стоит и тип — 0x0C/0x0B. Нарезал через dd ISO-образ, а флешка не грузится — проверь именно это
  • Hybrid MBR на GPT-дисках: записи в Protective MBR подменяют на «настоящие», чтобы BIOS-only ОС увидели разделы. Жуткий хак, рассинхрон с GPT ломает всё разом — лучше не использовать, но если унаследовал — знай, что оно есть
  • NT Disk Signature и клонирование: после dd диска побайтово обязательно меняй подпись, иначе Windows унесёт один из дисков в offline. На Linux-only стенде проблемы нет, но как только подключишь к Windows — словишь весёлый сюрприз

На этом всё. MBR — простая структура из эпохи, когда диски измерялись в мегабайтах, а 4 разделов хватало всем. Сегодня его удел — старые системы и роль Protective MBR на GPT-дисках, но базу знать всё ещё полезно: на боевой железке в 3 часа ночи хочется понимать, что именно ты сейчас правишь в dd и hexdump.


Если у тебя есть вопросы, комментарии и/или замечания – заходи в чат, а так же подписывайся на канал.

О способах отблагодарить автора можно почитать на странице “Донаты”.