Привет, %username%! Когда ты говоришь «разбить диск на разделы», за этим стоит вполне конкретная структура в нулевых секторах накопителя — и в современных машинах это почти всегда GPT, а не его легендарный предок MBR. Снаружи видны только /dev/sda1, /dev/nvme0n1p3 и буквы дисков, но если заглянуть внутрь — там аккуратный заголовок, таблица записей по 128 байт и вторая копия в самом хвосте диска «на случай чего».
В этой шпаргалке разберём по байтам, как устроен GPT-диск: какие поля где лежат, зачем нужны Protective MBR и backup-копия, и что со всем этим можно делать руками, когда «оно вдруг не грузится».
Что такое GPT и зачем он появился
GPT (GUID Partition Table) — современная схема разметки диска, часть спецификации UEFI. Пришла на смену MBR, у которого было два бесивших ограничения: максимум 4 первичных раздела и потолок в 2 ТБ из-за 32-битной адресации LBA. GPT сносит оба разом: 64-битная адресация (теоретически — до 9.4 ZB, на практике — сколько у тебя денег на диски) и 128 разделов «из коробки».
Ключевая идея GPT — избыточность и самопроверка. Заголовок и таблица разделов хранятся в двух копиях: одна в начале диска, вторая — в самом конце. Всё защищено CRC32. Первая копия побилась? Система спокойно прочитает вторую и пойдёт дальше, как будто ничего и не было.
Карта диска
Если смотреть «сверху вниз», GPT-диск выглядит так:
LBA 0 : Protective MBR (1 сектор)
LBA 1 : Primary GPT Header (1 сектор)
LBA 2..33 : Primary Partition Entries (32 сектора, 128 записей × 128 байт)
LBA 34..N-34 : Сами разделы (данные)
LBA N-33..N-1 : Backup Partition Entries (32 сектора)
LBA N : Backup GPT Header (последний сектор диска)
N — последний LBA на диске. Размер сектора — обычно 512 байт, на современных «Advanced Format / 4Kn» дисках — 4096. Это важно: вся арифметика смещений считается в секторах, и на 4Kn-диске массив записей займёт уже не 32 сектора, а 8.
Protective MBR (LBA 0)
Первый сектор — фейковый MBR. Нужен ровно для одного: чтобы старые утилиты, не знающие про GPT, увидели «занятый» диск с одним разделом типа 0xEE на весь объём и не предложили его «отформатировать как пустой». По сути это табличка «здесь уже что-то есть, не лезь».
Внутри — стандартная структура MBR, но с единственной осмысленной записью:
Boot indicator:0x00Starting CHS:0x000200OS type:0xEE(GPT Protective)Ending CHS:0xFFFFFFStarting LBA:0x00000001Size in LBA:0xFFFFFFFFили фактический размер диска (если он меньше 2 ТиБ)
Primary GPT Header (LBA 1)
Это сердце разметки. Размер — 92 байта (остальное в секторе — нули). Структура:
| Offset | Size | Поле | Описание |
|---|---|---|---|
| 0 | 8 | Signature | Магия EFI PART (0x5452415020494645) |
| 8 | 4 | Revision | Версия, обычно 0x00010000 (1.0) |
| 12 | 4 | HeaderSize | Размер заголовка в байтах, обычно 92 |
| 16 | 4 | HeaderCRC32 | CRC32 самого заголовка (с обнулённым этим полем при расчёте) |
| 20 | 4 | Reserved | Должно быть 0 |
| 24 | 8 | MyLBA | LBA, где лежит этот заголовок (1 для primary) |
| 32 | 8 | AlternateLBA | LBA резервного заголовка (последний сектор) |
| 40 | 8 | FirstUsableLBA | Первый LBA, доступный для разделов (обычно 34) |
| 48 | 8 | LastUsableLBA | Последний LBA для разделов (N − 34) |
| 56 | 16 | DiskGUID | Уникальный идентификатор диска |
| 72 | 8 | PartitionEntryLBA | LBA, с которого начинается таблица записей (2) |
| 80 | 4 | NumberOfPartitionEntries | Сколько записей выделено (обычно 128) |
| 84 | 4 | SizeOfPartitionEntry | Размер одной записи (обычно 128) |
| 88 | 4 | PartitionEntryArrayCRC32 | CRC32 всего массива записей |
Два CRC — отдельная проверка для самого заголовка и отдельная для массива записей. Если хоть один не сходится — UEFI идёт за резервной копией. Никаких «оно как-то загрузилось со сбойной таблицей» — либо всё чисто, либо берём backup.
Partition Entry (запись о разделе)
Каждая запись занимает 128 байт. По умолчанию таблица содержит 128 записей → 16 КБ на массив. Это и есть тот самый «лимит в 128 разделов из коробки» — чисто административное ограничение, в спеке его можно поднять.
| Offset | Size | Поле | Описание |
|---|---|---|---|
| 0 | 16 | PartitionTypeGUID | Тип раздела (например, EFI System, Linux filesystem, Microsoft Basic Data) |
| 16 | 16 | UniquePartitionGUID | Уникальный GUID конкретного раздела |
| 32 | 8 | StartingLBA | Первый LBA раздела |
| 40 | 8 | EndingLBA | Последний LBA раздела (включительно) |
| 48 | 8 | Attributes | Битовые атрибуты (см. ниже) |
| 56 | 72 | PartitionName | UTF-16LE имя раздела, до 36 символов |
Если запись «пустая» — PartitionTypeGUID равен нулям. Никаких флажков «эта запись валидна» — нули в типе и есть «меня нет».
Известные PartitionTypeGUID
Запоминать их наизусть смысла нет, но в /etc/fstab или в выводе gdisk они мелькают регулярно:
C12A7328-F81F-11D2-BA4B-00A0C93EC93B— EFI System Partition (ESP), та самая, с которой грузится UEFI0FC63DAF-8483-4772-8E79-3D69D8477DE4— Linux filesystemE6D6D379-F507-44C2-A23C-238F2A3DF928— Linux LVM0657FD6D-A4AB-43C4-84E5-0933C84B4F4F— Linux swapEBD0A0A2-B9E5-4433-87C0-68B6B72699C7— Microsoft Basic Data (под этим GUID живут и NTFS, и exFAT, и FAT32 — ОС определяет уже по сигнатуре ФС)48465300-0000-11AA-AA11-00306543ECAC— Apple HFS+7C3457EF-0000-11AA-AA11-00306543ECAC— Apple APFS
Атрибуты (биты)
- Bit 0 —
Required Partition. Системный раздел платформы, руками не трогаем - Bit 1 —
No Block IO Protocol. UEFI не выдаёт обработчик блочного I/O - Bit 2 —
Legacy BIOS Bootable. Рудимент для совместимости - Биты 48–63 — определяются конкретным типом раздела. Например, для Microsoft Basic Data: 60 — read-only, 62 — hidden, 63 — no drive letter (тот самый трюк, которым Windows прячет свой recovery-раздел)
Backup GPT (хвост диска)
В последних 33 секторах диска лежат те же структуры, но в обратном порядке: сначала backup partition entries, потом backup header. У backup header MyLBA указывает на последний сектор, AlternateLBA — обратно на 1.
Это спасает в классической ситуации «кто-то умный сделал dd if=/dev/zero of=/dev/sda bs=512 count=1 и пошёл пить чай». Primary улетел, диск превратился в кирпич — но gdisk спокойно увидит backup в конце и предложит восстановить начало. С MBR такой фокус не пройдёт: там единственная копия, и затёртый сектор 0 = всё, грузиться нечем.
Что с этим делать на практике
- Посмотреть разметку:
gdisk -l /dev/sda,parted /dev/sda print,lsblk -o NAME,PARTUUID,PARTLABEL,PARTTYPE - Сырой дамп заголовка:
dd if=/dev/sda bs=512 count=1 skip=1 | hexdump -C— увидишьEFI PARTв первых байтах, дальше поля по таблице выше - PARTUUID vs UUID — частая путаница.
PARTUUID— этоUniquePartitionGUIDиз GPT-записи, живёт в самой разметке.UUID— внутри файловой системы. В/etc/fstabдля смонтированных ФС обычно используютUUID, а для raw-разделов или swap иногда удобнееPARTUUID(он не меняется приmkfs) - Восстановить primary из backup:
sgdisk --backup=.../sgdisk --load-backup=..., или интерактивноgdisk→recovery and transformation options→ дальше по подсказкам
Чем GPT лучше MBR
- 64-битные LBA → разделы и диски больше 2 ТиБ
- 128 разделов «из коробки», без всех этих primary/extended/logical костылей
- CRC32 на заголовок и таблицу → повреждение детектируется, а не «молча работает с битой таблицей»
- Резервная копия в конце диска — спасение в 90% случаев «затёр начало»
- У каждого раздела есть свой GUID и читаемое имя. Можно ссылаться по
PARTUUID/PARTLABEL, а не по/dev/sdaX, который меняется при перетыкании дисков и переименовании контроллера - Часть UEFI-стека: ESP с типом
C12A7328-...— стандартный способ грузиться, без танцев с активным разделом
Тонкие места, на которых легко споткнуться
- Гибридные MBR (например, старые Mac с Boot Camp) — это хак: внутри Protective MBR сделали реальные записи, дублирующие GPT. Опасно ровно тем, что рассинхрон между двумя таблицами ломает загрузчик. По возможности — не использовать
- 4Kn-диски: ещё раз напомню, что вся арифметика в секторах. На 4Kn таблица записей занимает 8 секторов вместо 32. Утилиты обычно справляются сами, но если правишь руками — проверь размер сектора через
blockdev --getss /dev/sda - CRC ≠ подпись: GPT защищает от случайных битфлипов, но не от целенаправленной модификации. Кто угодно может пересчитать CRC после правки — это не криптография
sgdisk -Zобнуляет обе копии разом. Если потом окажется, что данные ещё были нужны — восстановления через backup уже нет, придётся идти кtestdiskи молиться- Resize и
LastUsableLBA: послеdd-клона на больший диск backup останется на старом месте, аLastUsableLBAбудет указывать в середину нового диска.sgdisk -e /dev/sdaпереносит backup в конец и обновляет поля
На этом всё. Ничего магического в GPT нет — обычная структура данных, которую можно прочитать dd | hexdump. Зато когда снова придётся вытаскивать систему из «оно не грузится», понимать, что именно лежит в первых 33 секторах диска, очень помогает.
Если у тебя есть вопросы, комментарии и/или замечания – заходи в чат, а так же подписывайся на канал.
О способах отблагодарить автора можно почитать на странице “Донаты”.
