Привет, %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: 0x00
  • Starting CHS: 0x000200
  • OS type: 0xEE (GPT Protective)
  • Ending CHS: 0xFFFFFF
  • Starting LBA: 0x00000001
  • Size in LBA: 0xFFFFFFFF или фактический размер диска (если он меньше 2 ТиБ)

Primary GPT Header (LBA 1)

Это сердце разметки. Размер — 92 байта (остальное в секторе — нули). Структура:

OffsetSizeПолеОписание
08SignatureМагия EFI PART (0x5452415020494645)
84RevisionВерсия, обычно 0x00010000 (1.0)
124HeaderSizeРазмер заголовка в байтах, обычно 92
164HeaderCRC32CRC32 самого заголовка (с обнулённым этим полем при расчёте)
204ReservedДолжно быть 0
248MyLBALBA, где лежит этот заголовок (1 для primary)
328AlternateLBALBA резервного заголовка (последний сектор)
408FirstUsableLBAПервый LBA, доступный для разделов (обычно 34)
488LastUsableLBAПоследний LBA для разделов (N − 34)
5616DiskGUIDУникальный идентификатор диска
728PartitionEntryLBALBA, с которого начинается таблица записей (2)
804NumberOfPartitionEntriesСколько записей выделено (обычно 128)
844SizeOfPartitionEntryРазмер одной записи (обычно 128)
884PartitionEntryArrayCRC32CRC32 всего массива записей

Два CRC — отдельная проверка для самого заголовка и отдельная для массива записей. Если хоть один не сходится — UEFI идёт за резервной копией. Никаких «оно как-то загрузилось со сбойной таблицей» — либо всё чисто, либо берём backup.

Partition Entry (запись о разделе)

Каждая запись занимает 128 байт. По умолчанию таблица содержит 128 записей → 16 КБ на массив. Это и есть тот самый «лимит в 128 разделов из коробки» — чисто административное ограничение, в спеке его можно поднять.

OffsetSizeПолеОписание
016PartitionTypeGUIDТип раздела (например, EFI System, Linux filesystem, Microsoft Basic Data)
1616UniquePartitionGUIDУникальный GUID конкретного раздела
328StartingLBAПервый LBA раздела
408EndingLBAПоследний LBA раздела (включительно)
488AttributesБитовые атрибуты (см. ниже)
5672PartitionNameUTF-16LE имя раздела, до 36 символов

Если запись «пустая» — PartitionTypeGUID равен нулям. Никаких флажков «эта запись валидна» — нули в типе и есть «меня нет».

Известные PartitionTypeGUID

Запоминать их наизусть смысла нет, но в /etc/fstab или в выводе gdisk они мелькают регулярно:

  • C12A7328-F81F-11D2-BA4B-00A0C93EC93B — EFI System Partition (ESP), та самая, с которой грузится UEFI
  • 0FC63DAF-8483-4772-8E79-3D69D8477DE4 — Linux filesystem
  • E6D6D379-F507-44C2-A23C-238F2A3DF928 — Linux LVM
  • 0657FD6D-A4AB-43C4-84E5-0933C84B4F4F — Linux swap
  • EBD0A0A2-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 0Required Partition. Системный раздел платформы, руками не трогаем
  • Bit 1No Block IO Protocol. UEFI не выдаёт обработчик блочного I/O
  • Bit 2Legacy 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=..., или интерактивно gdiskrecovery 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 секторах диска, очень помогает.


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

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