Принцип разметки диска: от MBR к GPT

задняя часть Linux Microsoft C++
Принцип разметки диска: от MBR к GPT

об автореБишенг, парень, который не выглядит серьезным, но у него много технических интересов, в настоящее время является старшим инженером Python в Ele.me.У него был «неоднозначный» опыт работы с файловой системой. Говорят, что он очень хорошо пишет на C++, но насколько хорошо — неизвестно.

введение

MBR и GPT — это таблицы разделов жесткого диска, а после таблицы разделов жесткого диска — файловые системы, которые мы используем каждый день, такие как NTFS, FAT32, EXT и т. д. Хотя MBR теперь является необычной таблицей разделов жесткого диска, GPT добавила MBR в заголовок структуры GPT, чтобы быть совместимой со старой таблицей разделов жесткого диска. На следующих страницах автор сначала кратко представляет MBR, а затем представляет структуру GPT.

Часть кода структуры размещена в этой статье. Эти структуры извлекаются и изменены автором из шаблона 010Ditor. Эти структуры удобны для программирования. До тех пор, пока указатель буфера данных вынужден преобразовать в указатель структуры, указатель структуры может использоваться для извлечения данных, устраняя проблемы с использованием смещения кода для чтения данных. (Попробуйте использовать выравнивание 1-байтовой структуры, чтобы избежать ненужных неприятностей)

1.MBR

1.1 Состав МБР

В первом секторе жесткого диска хранится таблица MBR, которая состоит из 4 частей, а именно: основной загрузочной записи, области данных, таблицы разделов (включая 4 записи разделов) и метки конца.

Расположение смещения и профили этих 4 частей показаны в таблице ниже:

MasterBoot

  1. Основная загрузочная запись — это загрузочная программа и область данных таблицы разделов жесткого диска, занимающая в общей сложности 446 байт.БИОС считывает и выполняет этот код.Если система повреждена, данные на жестком диске не могут быть прочитаны, и система не может быть запущена.
  2. Элементы разделов будут подробно описаны позже
  3. Флаг конца — это конечный бит MBR, если есть ошибка, будет считана ошибка.

Ниже приведен код структуры на C++, bootinst — это основная загрузочная программа и область данных, partitions — 4 элемента раздела, а тип mbr_table будет подробно описан ниже, этот тип занимает 16 байт, а подпись является признаком окончания.

typedef struct {
    char    bootinst[446];   /* space to hold actual boot code */
    mbr_table partitions[4];
    unsigned short  signature;/* set to 0xAA55 to indicate PC MBR format */
} mbr_head;

Скриншот данных жесткого диска

MasterBootRecord

1.2 Структура записи раздела в MBR

Следующая таблица представляет собой объяснение 16 байтов независимой записи раздела в MBR.

байт памяти содержание и смысл
1-й байт Знак загрузки. Значение 80H указывает на активный раздел, а значение 00H указывает на неактивный раздел. Байты 2, 3 и 4 Начальный номер головки, номер сектора и номер цилиндра этого раздела. Среди них: номер головки - 2-й байт, номер сектора - младшие 6 бит 3-го байта, номер цилиндра - 2 старших бита 3-го байта + 8 бит 4-го байта.
5-й байт Символ типа раздела. 00H — раздел не используется (то есть не указан); 06H — базовый раздел FAT16; 0BH — базовый раздел FAT32; 05H — расширенный раздел; 07H — раздел NTFS; 0FH — (режим LBA) расширенный. раздел (раздел 83H для Linux и т. д.).
6-й, 7-й, 8-й байты Конечный номер головки, номер сектора и номер цилиндра этого раздела. Среди них: номер головки - 6-й байт, номер сектора - младшие 6 бит 7-го байта, номер цилиндра - 2 старших бита 7-го байта + 8-й байт.
9-й, 10-й, 11-й, 12-й байты Первый сектор этого раздела.
13-й, 14-й, 15-й, 16-й байты Общее количество секторов в этом разделе.

Арабские числа в следующей структуре относятся к битам, а беззнаковые короткие занимают 2 байта, всего 16 бит.

  1. unsigned short begsect : 6 означает первые 6 бит

  2. unsigned short begcyl : 10 означает следующие 10 бит

Примечание корректора

Это включает в себя концепцию битового поля C / C ++. В структуре в форме «тип [имя] : битовый размер» (имя необязательно, битовое поле без имени называется безымянным битовым полем), чтобы сообщить компилятору использовать только битовое поле.Размер битов данных хранения члена. Когда два соседних члена структуры оба являются битовыми полями, тип один и тот же, а длина типа (число битов) больше, чем сумма двух битовых полей, большинство компиляторов будут сжимать хранилище. Например, begsect и begcyl в следующей структуре являются битовыми полями, типом является unsigned short, а сумма битовых битов двух битовых полей меньше, чем длина в битах типа unsigned short, поэтому два бита поля будут сжаты в единицу. Хранится в пространстве хранения беззнакового короткого типа, всего они занимают 2 байта.

typedef struct {
    unsigned char  bootid;         /* bootable?  0=no, 128=yes  */
    unsigned char beghead ;    /* beginning head number */
    unsigned short begsect : 6;    /* beginning sector number */
    unsigned short begcyl  : 10;   /* 10 bit nmbr */
    unsigned char  systid;         /* Operating System type indicator code */
    unsigned char endhead ;    /* ending head number */
    unsigned short endsect : 6;    /* ending sector number */
    unsigned short endcyl  : 10;   /* also a 10 bit nmbr */
    unsigned int relsect;          /* first sector relative to start of disk */
    unsigned int numsect;          /* number of sectors in partition */
} mbr_table;

Скриншот данных жесткого диска

FdiskPartitioinPartitions

1.3 Ограничения MBR

MBR хранит данные на 4 разделах, эти разделы называются основными разделами. Раздел использует метод маркировки «цилиндр/головка/сектор», то есть метод маркировки CHS. В предыдущей структуре beghead, begsect и begcyl представляют головку, сектор и цилиндр в начале раздела соответственно, а endhead, endect и endcyl представляют головку, сектор и цилиндр в конце раздела. соответственно. Размер каждого сектора 512Б, общее количество секторов =2^{24}(磁头数\times扇区数\times柱面数,Сейчас2^{8}\times2^{6}\times2^{10}), поэтому он может описать не более 8G (8G=2^{24}\times512B\div1024\div1024\div1024) области диска.

Примечание корректора

Имея опыт использования раздела MBR, студенты могут задаться вопросом, как можно выразить только 8G?При фактической установке системного раздела, очевидно, простое разделение на несколько сотен разделов G ах. Это связано с тем, что при использовании современных дисков BIOS, чем в режиме 8G LBA, для некоторого превышения обычно устанавливают значение CHS 0xFEFFFF и игнорируют его, напрямую используя относительное значение Offset 0x08-0x0c на 4 байта, а затем внутреннее преобразование. Однако при использовании LBA relsect (32 бита) описывает номер начального сектора, relsect + numsect указывает номер конечного сектора, поскольку 32-битная адресация приводит к тому, что весь размер жесткого диска не может превышать 2 ТБ данных (2T=2^{32}\times512B\div1024\div1024\div1024\div1024).

Помимо этой проблемы с 2 ТБ, у MBR есть и другие трудности. Основная сложность — ограничение в 4 первичных раздела. Возможный способ обойти это ограничение — выделить основной раздел в качестве заполнителя (называемого расширенным разделом) для любого количества дополнительных разделов (называемых логическими разделами).

MBR также имеет проблемы с целостностью данных. Это единая структура данных, которая уязвима для неправильного использования и отказа диска. Кроме того, поскольку логические разделы определены в структуре связанного списка, при повреждении одного логического раздела доступ к остальным логическим разделам блокируется.


2.GPT

2.1 Состав ТШП

Давайте сначала вставим общую структуру GPT, чтобы у всех сложилось общее впечатление.

Структурная схема GPT

GPT结构

Данные структуры GPT

GPT结构数据

2.2 Защита MBR

В заголовке GPT есть защищенная MBR (см. LBA 0: Protective MBR на структурной схеме GPT).Защищенные данные MBR выглядят следующим образом.

保护MBR

Только первая запись раздела защитной MBR имеет значение, а остальные записи раздела пусты.

  1. PartitionType (тип раздела) первого элемента раздела, то есть systid (тип раздела) в предыдущей статье — 0xEE.

  2. Значение StartSectors (начальный сектор) равно 2, что означает LBA1, который является расположением заголовка структуры GPT. На жестком диске менее 2T SectorsInPartition (общее количество секторов) равно numsect (общему количеству секторов) в предыдущей статье, а значение соответствует размеру всего диска.Поскольку только 4 байта могут представлять только 2 ТБ, значение больше 2 ТБ будет зафиксировано как FFFFFFFFh

Первая запись раздела защищенной MBR записывает весь GPT как данные записи раздела, и ее функция состоит в том, чтобы предотвратить попытки форматирования дисковыми инструментами, которые не могут распознать разделы GPT, поэтому этот сектор называется «защищенной MBR». На самом деле EFI вообще не использует эту таблицу разделов.

2.3 Раздел EFI

Часть EFI можно разделить на 4 области: информационная область EFI (заголовок GPT), таблица разделов, раздел GPT, область резервного копирования.

  1. Область информационной области EFI (заголовок GPT): он начинается с LBA1 диска, и обычно занимает только этот единственный сектор. Его роль состоит в том, чтобы определить местоположение и размер таблицы раздела. Заголовок GPT также содержит контрольные суммы для таблицы заголовка и раздела, поэтому ошибки могут быть пойманы во времени

  2. Таблица разделов: Область таблицы разделов содержит записи таблицы разделов. Эта область определяется заголовком GPT и обычно занимает на диске сектора LBA2–LBA33. Каждая запись раздела в таблице разделов состоит из начального адреса, конечного адреса, значения типа, имени, флага атрибута и значения GUID. После создания таблицы разделов 128-битный GUID уникален для системы.

  3. Раздел GPT: самая большая область, состоящая из секторов, выделенных для раздела. Начальный и конечный адреса этой области определяются заголовком GPT.

  4. Область резервного копирования: область резервного копирования расположена в конце диска и содержит резервную копию заголовка GPT и таблицы разделов. Он занимает 33 сектора в конце данных жесткого диска. Последний сектор используется для резервного копирования информационной области EFI (заголовок GPT) сектора LBA1, а оставшиеся 32 сектора используются для резервного копирования таблицы разделов секторов LBA2–LBA33.

Информационная область EFI (заголовок GPT), таблица разделов и область резервного копирования обсуждаются отдельно ниже.

2.3.1 Структура данных информационной области EFI

Относительное байтовое смещение (Hex) Количество байтов Описание [Целые числа представлены с прямым порядком байтов]
00~07 8 Подпись заголовка GPT «45 46 49 20 50 41 52 54» (код ASCII — «EFI PART»)
08~0В 4 Номер версии, на данный момент версия 1.0, его значение "00 00 01 00"
0C~0F 4 Размер заголовка GPT (количество байтов) обычно является «5C 00 00 00» (0x5c), то есть 92 байта.
10~13 4 Контрольная сумма CRC заголовка GPT (само это поле считается нулевым значением при расчете)
14~17 4 Зарезервировано, должно быть "00 00 00 00"
18~1F 8 Номер начального сектора информационной области EFI (заголовок GPT) обычно равен «01 00 00 00 00 00 00 00», то есть LBA1.
20 ~ 27. 8 Номер сектора резервного хранилища информационной области EFI (заголовок GPT), то есть номер конечного сектора области EFI. Обычно это последний сектор всего диска.
28~2F 8 Номер начального сектора области раздела GPT, обычно «22 00 00 00 00 00 00 00» (0x22), то есть LBA34.
30~37 8 Конечный номер сектора области раздела GPT, обычно это 34-й сектор снизу.
38~47 16 Гидик диска (глобально уникальный идентификатор, синонимичный с UUID)
48~4F 8 Номер начального сектора таблицы разделов, обычно «02 00 00 00 00 00 00 00» (0x02), что соответствует LBA2.
50~53 4 Общее количество записей в таблице разделов, обычно ограниченное «80 00 00 00» (0x80), что равно 128.
54~57 4 Количество байтов, занимаемых каждой записью в таблице разделов, обычно ограничено значением «80 00 00 00» (0x80), что составляет 128 байт.
58~5Б 4 Контрольная сумма таблицы разделов CRC
5C~ зарезервировано, обычно все заполнено нулями

Количество записей разделов GPT может быть увеличено в соответствии со свойствами таблицы разделов в GPT. То есть количество таблиц разделов GPT может быть выделено, но общий размер составляет 128 записей раздела. И MBR имеет только 4 записи раздела.

typedef struct {
    BYTE   SIGNATURE[8];
    DWORD  Revision;
    DWORD  Headersize;
    DWORD  CRC32OfHeader;
    DWORD  Reserved;
    UINT64 CurrentLBA;
    UINT64 BackupLBA; //location of the other head copy
    UINT64 FirstUsableLBA; //primary partition table last LBA+1
    UINT64 LastUsableLBA; //secondary parition table first LBA-1
    BYTE DiskGUID[16];
    UINT64 PartitionEntries;
    DWORD  NumOfPartitions;
    DWORD  SizeOfPartitionEntry;
    DWORD  CRC32ofPartitionArray;
    BYTE reserved[420];
} gpt_head_table;

Данные заголовка GPT

Gptheader

2.3.2 Таблица разделов

Структура ввода раздела

Относительное смещение в байтах (шестнадцатеричное) количество байтов Описание [Целые числа представлены с прямым порядком байтов]
00~0F 16 Тип раздела, представленный GUID
10~1F 16 уникальный идентификатор раздела, представленный GUID
20~27 8 Начальный сектор раздела, представленный значением LBA.
28~2F 8 Конечный сектор (включительно) раздела, представленный значением LBA, обычно нечетным числом.
30~37 8 флаги атрибутов для раздела
38~7F 72 Удобочитаемое имя раздела в кодировке UTF-16LE, до 32 символов.

PartitionStartLBA (начальный сектор) и PartitionEndLBA (конечный сектор раздела) в записи раздела являются 64-битными, что увеличено с MBR24 бит до 64 бит, и добавлена ​​проверка CRC.

typedef struct {
    BYTE PartitionTypeGUID[16];
    BYTE PartitionGUID[16];
    UINT64 PartitionStartLBA;
    UINT64 PartitionEndLBA;
    UINT64 PartitionProperty;
    wchar_t PartitionName[36]; //Unicode
} gpt_paptition_table;

В следующей таблице приведено значение PartitionTypeGUID (GUID типа раздела).

Связанная операционная система GUID[little endian] значение
None 00000000-0000-0000-0000-000000000000 Неиспользованный
None 024DEE41-33E7-11D3-9D69-0008C781F39F Таблица раздела MBR
None C12A7328-F81F-11D2-BA4B-00A0C93EC93B Системный раздел EFI [Системный раздел EFI (ESP)]
None 21686148-6449-6E6F-744E-656564454649 Загрузочный раздел BIOS, соответствующая строка ASCII — «Hah!IdontNeedEFI».
None D3BFE2DE-3DAF-11DF-BA40-E3A556D89593 Intel Fast Flash (iFFS) partition (for Intel Rapid Start technology)
Windows E3C9E316-0B5C-4DB8-817D-F92DF00215AE Зарезервированный раздел Майкрософт
Windows EBD0A0A2-B9E5-4433-87C0-68B6B72699C7 Раздел основных данных
Windows DE94BBA4-06D1-4D40-A16A-BFD50179D6AC Среда восстановления Windows
Linux 0FC63DAF-8483-4772-8E79-3D69D8477DE4 раздел данных. Раньше в Linux использовался тот же GUID, что и в разделе базовых данных Windows. Этот новый GUID был изобретен разработчиками GPT fdisk и GNU Parted на основе традиционного кода раздела Linux «8300».
Linux 44479540-F297-41B2-9AF7-D131D5F0458A Корневой раздел x86 (/) Это изобретение systemd и может использоваться для автоматического монтирования без fstab
Linux 4F68BCE3-E8CD-4DB1-96E7-FBCAF984B709 Корневой раздел x86-64 (/), который является системным изобретением, можно использовать, когда нет автоматической загрузки fstab
Linux 3B8F8425-20E0-4F3B-907F-1A25A76F98E8 Данные сервера (/srv) Это изобретение SYSTEMD, которое можно использовать для автоматического монтирования, когда нет FSTAB
Linux 933AC7E1-2EB4-4F13-B844-0E14E2AEF915 Раздел HOME (/home) Это изобретение systemd и может использоваться для автоматического монтирования без fstab.
Linux 0657FD6D-A4AB-43C4-84E5-0933C84B4F4F Раздел подкачки (swap) не изобретение systemd, но его можно использовать и для автоматического монтирования без fstab
Linux A19D880F-05FC-4D3B-A006-743F0F84911E RAID-раздел
Linux E6D6D379-F507-44C2-A23C-238F2A3DF928 Разделы диспетчера логических томов (LVM)
Linux 8DA63339-0007-60C0-C436-083AC8230908 резерв

Microsoft также дополнительно сегментирует атрибуты раздела: младшие 4 байта указывают атрибуты, которые не зависят от типа раздела, а старшие 4 байта представляют свойства, связанные с типом раздела. В настоящее время Microsoft использует следующие свойства:

Bit объяснять
0 Системный раздел (средства работы с разделами диска должны оставить этот раздел как есть, без каких-либо изменений)
1 Скрытый раздел EFI (невидимый раздел EFI)
2 Устаревший флаг загрузочного раздела BIOS
60 только чтение
62 Спрятать
63 Не устанавливайте автоматически, то есть не назначать буквы дисков

Данные входа в раздел

分区属性

2.3.3 Резервная копия таблицы разделов, резервная копия заголовка GPT

备份区

Резервная таблица разделов и заголовок раздела находятся в конце данных жесткого диска, а данные и структура внутри такие же, как и в таблице разделов и заголовке раздела. является резервной копией заголовка.

2.4 Преимущества GPT

GPT снимает барьер в 2 ТБ за счет увеличения количества разделов и количества битов хранения в начальном и конечном секторах в таблице разделов. GPT не имеет единой структуры данных, такой как MBR, но имеет резервную копию таблицы разделов и CRC, что может эффективно предотвратить повреждение структуры.

инструмент

Инструменты, используемые в этой статье:010Editor Шестнадцатеричный редактор




Недостаточно читать блоги?

Приглашаем всех отсканировать QR-код, чтобы присоединиться к группе обмена, обсудить технические вопросы, связанные с ведением блога, и больше взаимодействовать с блогерами.

По вопросам перепечатки блога, офлайн-мероприятий и сотрудничества обращайтесь по адресуshadowfly_zyl@hotmail.comобщаться