Привет, %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-диске в мире:
| Offset | Size | Поле | Описание |
|---|---|---|---|
| 0 | 1 | Boot indicator | 0x80 — активный (бутабельный), 0x00 — нет, прочее — invalid |
| 1 | 3 | Starting CHS | Cylinder/Head/Sector начала раздела (legacy) |
| 4 | 1 | Partition Type | Тип раздела (см. ниже) |
| 5 | 3 | Ending CHS | CHS конца раздела (legacy) |
| 8 | 4 | Starting LBA | LBA первого сектора раздела (little-endian) |
| 12 | 4 | Size 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 | Пусто |
0x05 | Extended (CHS) |
0x07 | NTFS / exFAT / HPFS |
0x0B | FAT32 (CHS) |
0x0C | FAT32 (LBA) |
0x0E | FAT16 (LBA) |
0x0F | Extended (LBA) |
0x82 | Linux swap |
0x83 | Linux filesystem |
0x8E | Linux LVM |
0xA5 | FreeBSD |
0xAF | Apple HFS / HFS+ |
0xEE | GPT Protective MBR |
0xEF | EFI System (на MBR-диске) |
0xFD | Linux 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) - Сменить тип раздела:
fdisk→t→ код. Не форматирует, только меняет байт - Активировать раздел:
fdisk→a. Помним: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. Нарезал черезddISO-образ, а флешка не грузится — проверь именно это - 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.
Если у тебя есть вопросы, комментарии и/или замечания – заходи в чат, а так же подписывайся на канал.
О способах отблагодарить автора можно почитать на странице “Донаты”.
