@ Карта сайта News Автора!

Bog BOS: hardware:  Таблицы разделов MBR и GPT

Последнее изменение файла: 2017.11.24
Скопировано с www.bog.pp.ru: 2017.11.25

Bog BOS: hardware: Таблицы разделов MBR и GPT

Чтобы ОС могла интерпретировать данные на блочном устройстве хранения, необходимо в заранее определённом месте хранить в стандартизованном формате информацию о структуре хранения. Таких форматов (VTOC - Volume Table Of Content - оглавление тома, disklabel - метка тома, таблица разделов) имеется множество,например, утилита parted распознаёт следующие форматы таблицы разделов: aix, amiga, bsd, dvh, gpt, loop, mac, msdos (MBR), pc98, sun. Блочное устройство может быть использовано целиком, без разбиения на разделы. Раздел является блочным устройством. Блочное устройство хранения может адресовать блоки (сектора) методом CHS (цилиндр, головка, сектор) или LBA (Logical Block Address - монотонное возрастание номера блока от 0 до максимального). Возможна явная или неявная трансляция от реальной геометрии CHS в воображаемую геометрию CHS или LBA с целью обхода ограничений адресации (например, BIOS ограничивает количество цилиндров 1024, но позволяет 256 (255) головок, ATA устройство позволяет иметь не более 16 головок, но 65535 цилиндров). Учитывая, что современные дисковые устройства имеют зонную структуру (переменное количество секторов на дорожке), а SSD не имеют головок и цилиндров вовсе, CHS адресация используется исключительно для совместимости. Размер блока (сектора) долгое время был равен 512 байтам (522 или 528 для хранения дополнительных контрольных сумм), но сейчас физический размер блока 4096 байт для дисковый устройств и значительно больше для SSD. Наружу устройство может показывать 512n (реально блоки по 512 байт), 512e (физические блоки по 4096 байт, но устройство позволяет адресовать с дискретностью 512, однако запись в середину физического лока наказывается временем), 4096 (физические блоки по 4096 байт адресуются по 4096 байт). Настройка BIOS (BIOS Setup) должна иметь средства выбора устройства загрузки.

MBR

Формат MBR (master boot record), иногда называемый msdos, используется с 1983 года (PC DOS 2.0). По адресу 0-0-1 (CHS) или LBA 0 расположена MBR (master boot record), содержащая программу главного загрузчика (446 байт, 424 для Legacy MBR?) и таблицу разделов на 4 описателя разделов (16 байт каждый), последние 2 байта содержат 0x55 и 0xAA (BIOS проверяет их перед передачей управления). Описатели разделов не обязаны заполняться поочерёдно. Legacy MBR также содержит уникальный 32-битный идентификатор диска. Место после 512 байта не используется.

Описатель раздела задаёт флаг активности, границы разделов в системах CHS (начало, конец, по 3 байта) и LBA (начало, длина, по 4 байта), системный код. По традиции раздел начинал с границы цилиндра N-0-1, кроме первого, который начинается по адресу 0-1-1. Учитывая повсеместное использование трансляции адресов (63 сектора на дорожку) адрес 0-1-1 CHS превращается в 63 LBA, что плохо влияет на производительность устройств с блоками 512e. Поэтому традиция изменилась на размещение начала первого раздела по адресу 2048 LBA для устройств с блоками 512n и 512e. В Linux нумеруются с 1 до 4 (/dev/sda1).

Размер адреса LBA (32-бита) в сочетании с традиционным размером сектора в 512 байт ограничивает размер блочного устройство для MBR в 2 ТБ.

Системный код (1 байт) определяет тип файловой системы или тип использования (длинный список можно получить командой l утилиты fdisk), например:

Флаг активности (1 байт, 0x80 - активный) позволяет главному загрузчику выбрать раздел для загрузки. Он может быть установлен только у одного раздела. Главный загрузчик может иметь свои методы настройки. Предполагается, что главный загрузчик ищет адрес первого сектора активного раздела, загружает его в память и передаёт управление на его начало. Однако, главный загрузчик может иметь свои методы настройки, см. GRUB и GRUB2.

Один из разделов (системный код - 5 или 0xf или 0x85) может содержать расширенную таблицу разделов (EPR, Extended Partition Record, EBR, EPBR), аналогичную MBR, в котором первый описатель задаёт вторичный (secondary) раздел, содержащий файловую систему и т.п., а второй описатель указывает адрес следующего EPR и т.д. пока есть место на диске. Третий и четвёртый описатели не используются. Адреса указываются относительно EPR (?!). Цепочка EPR должна быть непрерывной, неветвящейся и незацикленной. Расширенные разделы физически являются вложенными друг в друга. В Linux нумеруются с 5 до 16 (/dev/sda5), контейнеры EPR кроме первого не учитываются в нумерации.

Редактировать MBR можно утилитами fdisk, parted, cfdisk, sfdisk.

Размер сектора нигде не укаывается.

Для загрузки UEFI требуется EFI System Partition в формате MBR.

Утилиты

Утилита "blockdev --reread устройство" позволяет информировать ядро о необходимости перечитать таблицу разделов.

Утилита "partprobe устройство" информирует ядро об изменении таблицы разделов.

Посмотреть список всех разделов: "cat /proc/partitions", блочных устройств: "blkid -o list".

Утилита partx позволяет исследовать таблицу разделов и добавить (удалить) раздел в таблицу разделов ядра (не создаёт раздел на диске!):

Утилита fixparts позволяет починить таблицу MBR.

GPT

GPT (GUID - Globally Unique IDentifier - Partition Table) разрабатывался как часть UEFI (Unified Extensible Firmware Interface) вместо связки BIOS-MBR, позволяет форматировать диски до 8 ЗиБ (LBA 64 бит вместо 32 бит у MBR).

GUID является статистически уникальным 128-битным идентификатором, иногда называется UUID, не требует централизованной службы для регистрации идентификаторов, генерируется на месте при необходимости, текстовое представление и алгоритмы генерации описываются RFC-4122 (little-endian). Повсюду используется little endian.

Первый сектор диска (LBA 0) содержит фиктивную MBR (protective MBR), описывающую 1 раздел типа EFI GPT (системный код - 0xee) размером с весь диск (по возможности или 0xFFFFFFFF). Второй сектор диска (LBA 1, заголовок диска) содержит: сигнатуру ("EFI PART"), версию GPT (пока 1, 4 байта), размер заголовка (4 байта), контрольную сумму CRC32 остатка заголовка (4 байта), резерв (4 байта), собственный LBA адрес (8 байт), адрес LBA вторичного заголовка (8 байт), LBA адрес начала доступной области (8 байт), LBA адрес конца доступной области (8 байт), GUUID диска (16 байт), адрес LBA основной таблицы разделов (8 байт), допустимое количество разделов (4 байта), размер описания раздела (128, 4 байта), контрольную сумму CRC32 основной таблицы разделов (4 байта), нули до конца сектора.

Основная таблица разделов (Partition Entry Array) хранит информацию о 128 разделах (Microsoft) или 256 (Linux, нумеруются с 1), размер таблицы разделов не стандартизован, но не менее 16 КиБ. Для каждого раздела хранится GUID типа раздела (16 байт), GUID раздела (16 байт), LBA адрес начала (8 байт), LBA адрес конца (8 байт), атрибуты (8 байт), имя (72 байта, 36 символов UTF-16LE). Атрибуты:

Вторичный заголовок (последний сектор диска) содержит GUID диска, собственный LBA адрес, собственный размер, LBA адрес запасной таблицы разделов, LBA адрес заголовка диска, размер доступной области, контрольную сумму CRC32 себя и запасной таблицы разделов, допустимое количество разделов. Запасная таблица разделов идентична основной.

GUID типа определяет тип файловой системы или тип использования (длинный список можно получить командой l утилиты gdisk, двухбайтовые версии), например:

Для загрузки UEFI требуется EFI System Partition в формате GPT.

Загрузчик LILO не умеет работать с GPT.

GRUB2 (и GRUB 0.97 с заплатками) умеет грузиться с GPT.

При загрузке Linux из BIOS при использовании GPT возникает проблема размещения второй стадии загрузчика (core.img), который при использовании MBR хранился между MBR и первым разделом. Для её решения создаётся вспомогательный раздел biosboot размером 1 MiB, в который и записывается программа загрузки второй стадии, которая понимает формат GPT и может быть запущена с помощью первичного загрузчика (boot.img) из защитной MBR. Раздел содержит бинарный код размером около 30 КБ без файловой системы. Поддерживается утилитами gdisk и parted. Установщик anaconda умеет его создавать, в т.ч. с использованием kickstart (bootloader, reqpart и "partition biosboot").

SYSLINUX 4.00 использует gptmbr.bin для загрузки из BIOS - записывается в защитную MBR на место загрузчика, д.б. готова к разбору GPT и сектору не 512 байт (Hybrid MBR, защитная MBR описывает до 3 разделов).

Редактировать GPT можно утилитами gdisk, parted.

Посмотреть список всех разделов: "cat /proc/partitions", блочных устройств: "blkid -o list".

Размер сектора нигде не укаывается (не надо делать поблочную копию на устройство с другим логическим размером сектора).

EFI System Partition

EFI System Partition (ESP, /boot/efi после загрузки) - раздел MBR или GPT (в El Torito тоже есть), размером 50 MiB, а лучше 200 MiB. Используется UEFI для загрузки ОС, содержит файловую систему FAT32 (точнее собственный стандарт на основе подмножества FAT) или FAT16 или FAT12, в которой хранятся загрузчики, образы ядра и драйверы, а также утилиты и журналы. Первый сектор раздела содержит загрузчик, который может быть использован BIOS или UEFI в режиме CSM (Compatibility Support Module). Некоторые реализации UEFI самостоятельно переключаются в режим CSM встретив ESP раздел для MBR. GRUB2 и elilo будучи загруженными UEFI с раздела ESP продолжают загрузку ядра самостоятельно с поддерживаемых ими устройств и файловых систем.

Синтаксис имён файлов соответствует FAT (8.3, ASCII, всегда прописные) с расширением длинных имён (LFN, ASCII или UCS-2, нет поддержки UTF-16) - каталог отделяется символом "\", регистр букв не принимается во внимание ('A' и 'a'). Выделенные имена файлов: ".", "..".

Атрибуты файлов: только чтение, скрытый, системный, каталог, архив.

ESP содержит каталог /EFI, в котором размещаются каталоги BOOT (загрузчик последней надежды bootx64.efi для архитектуры x86_64, не должно быть других файлов для той же архитектуры) и каталоги загрузчиков (Microsoft/BOOT/bootmgfw.efi, redhat, ubuntu, centos и т.д.). /efi/boot/bootstr.nvr может содержать EFI переменные.

SunOS и Solaris

Диски и файловые системы в Solaris.

Утилита fdisk

fdisk - интерактивная программа (текстовая) для манипуляций с MBR. В качестве параметра указывается блочное устройство. Понимает таблицы разделов dos (MBR), BSD и sun. В режиме совместимости создаваемые разделы выравниваются на границу цилиндра, иначе на границу МиБ. Изменения хранятся в памяти и записываются на устройство только перед завершением с записью ("w"), после чего вызывается sync() и ioctl(BLKRRPART) - ядро перечитывает таблицу разделов с устройства. Ключи:

Команды:

   a   toggle a bootable flag
   b   edit bsd disklabel
   c   toggle the dos compatibility flag
   d   delete a partition
   g   create a new empty GPT partition table
   G   create an IRIX (SGI) partition table
   l   list known partition types
   m   print this menu
   n   add a new partition
   o   create a new empty DOS partition table
   p   print the partition table
   q   quit without saving changes
   s   create a new empty Sun disklabel
   t   change a partition's system id
   u   change display/entry units
   v   verify the partition table
   w   write table to disk and exit
   x   extra functionality (experts only)

sfdisk - командный интерфейс для fdisk.

cfdisk - текстовое меню (curses) для fdisk.

Утилита gdisk

gdisk (GPT fdisk) - интерактивная программа (текстовая) для манипуляций с GPT. В качестве параметра указывается блочное устройство. Понимает таблицы разделов GPT. Преобразует MBR и BSD disklabel в GPT с защитной MBR (код начального загрузчика не портится, но может потребоваться переустановка загрузчика для завершения загрузки) или гибридной MBR. Изменения хранятся в памяти и записываются на устройство только перед завершением с записью ("w"), после чего вызывается sync() и ioctl(BLKRRPART) - ядро перечитывает таблицу разделов с устройства. Ключ "-l" выводит список разделов и их атрибутов (номер раздела, начальный сектор, последний сектор, размер, код в понимании gdisk) и завершает работу. Команды:

b       back up GPT data to a file
c       change a partition's name
d       delete a partition
i       show detailed information on a partition
l       list known partition types
n       add a new partition
o       create a new empty GUID partition table (GPT)
p       print the partition table
q       quit without saving changes
r       recovery and transformation options (experts only)
s       sort partitions
t       change a partition's type code
v       verify disk
w       write table to disk and exit
x       extra functionality (experts only)
?       print this menu

Recovery/transformation command (? for help): ?
b       use backup GPT header (rebuilding main)
c       load backup partition table from disk (rebuilding main)
d       use main GPT header (rebuilding backup)
e       load main partition table from disk (rebuilding backup)
f       load MBR and build fresh GPT from it
g       convert GPT into MBR and exit # сразу сохраняет на диск
h       make hybrid MBR
i       show detailed information on a partition
l       load partition data from a backup file
m       return to main menu
o       print protective MBR data
p       print the partition table
q       quit without saving changes
t       transform BSD disklabel partition
v       verify disk
w       write table to disk and exit
x       extra functionality (experts only)
?       print this menu

Expert command (? for help): ?
a       set attributes # системный раздел, только чтение, скрытый, не монтировать автоматически, прочие двоичные флажки
c       change partition GUID
d       display the sector alignment value
e       relocate backup data structures to the end of the disk # если размер диска увеличился
g       change disk GUID
h       recompute CHS values in protective/hybrid MBR
i       show detailed information on a partition
l       set the sector alignment value # по умолчанию 1 МиБ
m       return to main menu
n       create a new protective MBR
o       print protective MBR data
p       print the partition table
q       quit without saving changes
r       recovery and transformation options (experts only)
s       resize partition table # установить число записей в таблице разделов
t       transpose two partition table entries
u       Replicate partition table on new device # вместе с GUID диска и разделов
v       verify disk
w       write table to disk and exit
z       zap (destroy) GPT data structures and exit # сразу сохраняет на диск
?       print this menu

sgdisk - командный интерфейс для gdisk.

cgdisk - текстовое меню (curses) для gdisk.

Утилита parted

Утилита parted позволяет создавать, удалять, копировать, перемещать и изменять разделы в форматах msdos, gpt, loop, sun, mac, bsd и pc98, а также файловые системы на них (ext2, ext3, fat16, fat32, linux-swap) в интерактивном и пакетном режимах. Не рекомендуется менять таблицу разделов используемого блочного устройства. Единицы измерения могут задаваться суффиксом параметра или командой "unit" (отрицательное число - отсчитывается от конца диска, например "-1s" - это последний сектор):

Интерактивный режим:

parted устройство (например, /dev/sda)

Пакетный режим:

parted устройство команда [опции] [команда опции] ...

Команды:

Ключи:

Создание разделов более 2ТБ:

mklabel gpt
mkpart primary ext3 0 -1s # на весь диск

Увеличение раздела

unit cyl
print
resize номер-раздела начало конец

Ссылки

@ Карта сайта News Автора!

Bog BOS: hardware:  Таблицы разделов MBR и GPT

TopList

Copyright © 1996-2017 Sergey E. Bogomolov; www.bog.pp.ru (КГБ знает все, даже то что у Вас на диске ;)