Skip to content

Booting или как работает EFI?

Доброго времени суток, читатели!
Сегодня мы начнем погружаться в загрузочные системы или booting systems. В англоязычных статьях слово booting описывает весь процесс загрузки компьютера. Однако для начала мы поговорим об общих понятиях и начнем с UEFI (Unified Extensible Firmware Interface) или просто EFI — UEFI более новое название этой системы.

Также предупрежу, что данная статья составлена по отчету, который был в формате «Вопрос — ответ». Вопросы могут показаться не связанными, но я надеюсь на ваше терпение! Также для торопливых напоминаю о комбинации Cntr+F.

UEFI или BIOS Legacy?

UEFI — это своего рода стандарт для всех современных загрузочных систем. Поэтому он сейчас присутствует во всех новых ноутбуках или материнских платах. И, по-моему, некоторые производители прекратили давать пользователю возможность использовать Legacy BIOS, и при острой необходимости, скорее всего, придется перепрошивать загрузочную систему.

Говоря о плюсах UEFI по сравнению с BIOS:

  • У UEFI нет ограничения на размер в 2,2 ТБ в отличии от BIOS. Это возможно благодаря новому подходу к системе разделов диска. В UEFI используется GPT вместо MBR.
  • Скорость загрузки UEFI быстрее, чем BIOS.

О всех возможностях UEFI вы можете узнать на официальном сайте в спецификациях. Однако, 1000 страниц счастья на английском языке мало кому по силам, поэтому могу посоветовать почитать статьи @CodeRush на хабре.

Что такое PXE Booting?

PXE расшифровывается как Preboot eXecution Environment. Основная цель данной фичи — возможность загрузки и установки системы через сеть. Администраторы в современных компаниях используют данную функцию для дистанционной установки системы сразу на десятки или сотни машин.

PXE Booting дает возможность загрузить систему как в Legacy BIOS, так и EFI режимах. (Legacy BIOS — загрузочная система для старых систем, например Windows XP).

Как работает PXE?

  • Клиент подключается к DHCP-серверу с помощью широковещательного запроса (67 / UDP), также он называется пакетом DHCPDISCOVER для предоставления свободного IP-адреса и маски. Далее DHCP сервер помогает клиентскому PXE найти следующий IP-адрес сервера для скачивания NBP* файла по протоколу TFTP.
  • Далее клиент устанавливает NBP пакет, скаченный в RAM (random-access memory или просто — оперативку). Как видите, до процесса установки ресурсы самого жесткого диска не используются.

*NBP содержит в себе первичные драйвера для работы с компонентами компьютера и скрипты для успешной загрузки и установки образа уже полноценной системы. Если вы найдёте расшифровку аббревиатуры NBP, пишите в комментариях. Буду признателен… )

Что такое GPT?

GPT (таблица разделов GUID) — стандарт для компоновки таблицы разделов на жестком диске. Это часть интерфейса Extensible Firmware Interface (EFI) или на новый лад — Unified Extensible Firmware Interface (UEFI) .
Фактически, EFI использует формат таблицы разделов GPT, также как BIOS использует MBR (Master Boot Record).

В GPT реализована современная система логической блок-адресации LBA (Logic Block Address) вместо  CHS (Cylinder, Head, Sector) в MBR. LBA0 и LBA1 содержат защищенные от редактирования заголовки MBR и GPT. Да-да в GPT есть кусочек MBR. LBA (2-33) включают информацию о всем диске с таблицами разделов и GUID (Global Unic ID или глобальный уникальный идентификатор). Кроме того, GPT содержит информацию о таблице разделов и в начале, и в конце диска.

Что такое LBA или логический блок в GPT?

LBA — логический блок размером 512 байт, который используется для структурирования и распределения информации на диске. На картинке ниже вы можете видеть за что отвечает тот или иной LBA.
LBA 0 — «Защищенный» MBR — это стандартный MBR, однако он находится в начале диска и имеет префикс (0xEE). Он обеспечивает защиту от редактирования или удаления структуры диска для старых систем, которые работают только с MBR, например Windows XP (32 бит). На практике он почти не используется. Вся информация о цепочке загрузок хранится на отдельном EFI разделе.
LBA 1 — Сводная информация о самом GPT диске.
LBA 2-33 — Информация о разделах диска.
Весьма ёмкое объяснение дано на wiki.
Схема GPT

Для чего нужны разделы дисков (partitions)?

Разделы диска необходимы для разграничения используемого пространства под программные или системные нужды. В частности создание backup-ов или dual-boot систем. Существуют первичные, логические и расширяемые разделы дисков.

Первичные — основные разделы дисков с системой. Логические работают также как и первичные, однако, Windows может запускаться только с первичного раздела. Для MBR есть ограничение в 4 первичных диска, в то время как для GPT такого ограничения нет. Расширяемые — тип разделов, которые не существуют без первичного и не имеют собственной файловой системы.

Protective MBR на практике

На Linux изучать свой диск гораздо проще, поэтому используем bash для чтения первых 512 байт:

sudo dd if=/dev/sda of=/home/nikitas/hex512.dump bs=512 count=1

Я сразу помечу важные значения цветом:

EB 63 90 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 80 00 08 10 00 00 00 00 00 FF FA 90 90
F6 C2 80 74 05 F6 C2 70 74 02 B2 80 EA 79 7C 00 00 31 C0 8E D8 8E D0 BC 00 20 
FB A0 64 7C 3C FF 74 02 88 C2 52 BB 17 04 F6 07 03 74 06 BE 88 7D E8 17 01 BE
05 7C B4 41 BB AA 55 CD 13 5A 52 72 3D 81 FB 55 AA 75 37 83 E1 01 74 32 31 C0 
89 44 04 40 88 44 FF 89 44 02 C7 04 10 00 66 8B 1E 5C 7C 66 89 5C 08 66 8B 1E
60 7C 66 89 5C 0C C7 44 06 00 70 B4 42 CD 13 72 05 BB 00 70 EB 76 B4 08 CD 13
73 0D 5A 84 D2 0F 83 D0 00 BE 93 7D E9 82 00 66 0F B6 C6 88 64 FF 40 66 89 44
04 0F B6 D1 C1 E2 02 88 E8 88 F4 40 89 44 08 0F B6 C2 C0 E8 02 66 89 04 66 A1
60 7C 66 09 C0 75 4E 66 A1 5C 7C 66 31 D2 66 F7 34 88 D1 31 D2 66 F7 74 04 3B
44 08 7D 37 FE C1 88 C5 30 C0 C1 E8 02 08 C1 88 D0 5A 88 C6 BB 00 70 8E C3 31
DB B8 01 02 CD 13 72 1E 8C C3 60 1E B9 00 01 8E DB 31 F6 BF 00 80 8E C6 FC F3
A5 1F 61 FF 26 5A 7C BE 8E 7D EB 03 BE 9D 7D E8 34 00 BE A2 7D E8 2E 00 CD 18
EB FE 47 52 55 42 20 00 47 65 6F 6D 00 48 61 72 64 20 44 69 73 6B 00 52 65 61
64 00 20 45 72 72 6F 72 0D 0A 00 BB 01 00 B4 0E CD 10 AC 3C 00 75 F4 C3 00 00
00 00 00 00 00 00 01 00 EE FE FF FF 01 00 00 00 AF 44 F2 1B 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 55 AA

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

Red:
00 — Boot Indicator. Флаг загрузки. Если равен 00, то раздел не является загрузочным.
00 — Starting Head.
01 — Starting Sector.
00 — Starting Cylinder.
Напомню, что MBR работает с заголовками, секторами и цилиндрами. Поэтому эти три параметра нужны, чтобы указать правильный адрес на LBA. Как видите 00 01 00 = LBA 1
EE — Флаг, показывающий, что описываемый раздел является одним и не должен быть удален.
FE — Ending Head.
FF — Ending Sector.
FF — Ending Cylinder.
Соответственно, конец диска.

Green:
01 00 00 00 — Номер первого LBA
AF 44 F2 1B — Количество LBA
Blue:
55 AA — Номер последнего LBA.

LBA 2 и LBA 3 под микроскопом

LBA 2 и LBA 3 — это следующие два блока по 512 байт.

sudo dd if=/dev/sda of=/home/nikitas/hex1536.dump bs=1536 count=1

Мы увидем следующее:

45 46 49 20 50 41 52 54 00 00 01 00  5C 00 00 00 7A 0D D7 79 00 00 00 00 01 00
00 00 00 00 00 00 AF 44 F2 1B 00 00 00 00 22 00 00 00 00 00 00 00 8E 44 F2 1B
00 00 00 00 16 46 11 5A 0C 0D A0 4A AF 58 E6 05 C7 3A 9D 8D 02 00 00 00 00 00
00 00 80 00 00 00 80 00 00 00 46 F9 0F B7 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 28 73 2A C1 1F F8 D2 11
BA 4B 00 A0 C9 3E C9 3B 0D 99 8E 53 06 C0 A2 4E 83 73 40 A0 88 6B 44 3A 00 08
00 00 00 00 00 00 FF 07 10 00 00 00 00 00 00 00 00 00 00 00 00 00 45 00 46 00
49 00 20 00 53 00 79 00 73 00 74 00 65 00 6D 00 20 00 50 00 61 00 72 00 74 00
69 00 74 00 69 00 6F 00 6E 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 AF 3D C6 0F 83 84 72 47 8E 79
3D 69 D8 47 7D E4 1C 0A 23 30 18 44 FD 43 8D 10 F3 8C 73 32 4D 10 00 08 10 00
00 00 00 00 FF 47 1F 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 AF 3D C6 0F 83 84 72 47 8E 79 3D 69 
D8 47 7D E4 8C 3E B9 DA 5A 6F DA 47 85 7D 21 3E 19 DC E8 36 00 48 1F 00 00 00 
00 00 FF 3F F2 1B 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00

Red:
45 46 49 20 50 41 52 54 — (EFI PART) Используется для определения всех EFI совместимых заголовков
00 00 01 00 — EFI спецификация, которая обозначает версию. В нашем случае Version 1 ➔ ..01..

Green:
5C 00 00 00 — Размер заголовка в байтах. 5C 00 00 00 ➔ 92 bytes
7A 0D D7 79 — CRC32 Checksum (Контрольная сумма)
00 00 00 00 — Зарезервировано

Небольшое отступление. Big и Little означают правило чтения. Big ending — чтение БАЙТОВ слева направо (как мы привыкли). Little ending — справа налево. Отмечу, что именно байты, а не вся строка. В диске могут быть записи и так, и этак. Зависит от производителя. В нашем случае были почти все в Little ending.

Blue: 01 00 00 00 00 00 00 00 — Primary LBA (Первоначальный LBA)

Pink: AF 44 F2 1B 00 00 00 00 — Backup LBA. Номер LBA c бэкапом первоначального. Так что AF 44 F2 1B 00 00 00 00 ➔ 468862127 в Big ending.

Brown:
22 00 00 00 00 00 00 00 — Адрес первого используемого LBA — 22 00 00 00 00 00 00 00 ➔ 34 (big ending).
8E 44 F2 1B 00 00 00 00 — Адрес последнего используемого LBA. — 8E 44 F2 1B 00 00 00 00 ➔ 468862094 (big ending).

Coral: 16 46 11 5A 0C 0D A0 4A AF 58 E6 05 C7 3A 9D 8D — GUID самого диска

DarkOliveGreen: 02 00 00 00 00 00 00 00 — Адрес первого LBA в разделе указанного GUID ➔ 2

DeepSkyBlue:
80 00 00 00 — Количество заголовков разделов. ➔ 128 (big ending) Следует отметить, что это значение по-умолчанию. В некоторых случаях увеличиваемое, но не уменьшаемое.
80 00 00 00 — Размер заголовков в bytes. По-умолчанию ➔ 128 bytes (big ending)

GoldenRod: 46 F9 0F B7 — Чек сумма заголовка раздела CRC32

Black: 00 00 .. — Зарезервировано

28 73 2A C1 1F F8 D2 11 BA 4B 00 A0 C9 3E C9 3B — UID типа раздела. В нашем случае EFI System partition. Этот индефикатор одинаков для всех EFI разделов.
0D 99 8E 53 06 C0 A2 4E 83 73 40 A0 88 6B 44 3A — Уникальный GUID EFI раздела.

SlateBlue:
00 08 00 00 00 00 00 00 — Адрес первого LBA раздела ➔ 2048 (На самом деле число очень большое и логичнее предположить, что это должен быть LBA 4. Но в документации иначе)
FF 07 10 00 00 00 00 00 — Адрес последнего LBA раздела ➔ 1050623

SeaGreen: 00 00 00 00 00 00 00 00 — Attribute Bits. Описывает как используется раздел.

  • 45 00 46 00 49 00 20 …- Название раздела. Длина в 36 символов в формате Unicode.

AF 3D C6 0F 83 84 72 47 8E 79 3D 69 D8 47 7D E4 — UID типа раздела
1C 0A 23 30 18 44 FD 43 8D 10 F3 8C 73 32 4D 10 — Уникальный GUID раздела

Blue:
00 08 10 00 00 00 00 00 — Адрес первого LBA раздела ➔ 1050624
FF 47 1F 00 00 00 00 00 — Адрес последнего LBA раздела ➔ 2050047

Pink: 00 00 00 00 00 00 00 00 — Attribute Bits. Описывает как используется раздел.

AF 3D C6 0F 83 84 72 47 8E 79 3D 69 D8 47 7D E4 — UID типа раздела
8C 3E B9 DA 5A 6F DA 47 85 7D 21 3E 19 DC E8 36 —Уникальный GUID раздела

Pink: 00 00 00 00 00 00 00 00 — Attribute Bits. Описывает как используется раздел.

Blue:
00 48 1F 00 00 00 00 00 — Адрес первого LBA раздела ➔ 2050048
FF 3F F2 1B 00 00 00 00 — Адрес последнего LBA раздела ➔ 468860927

С какого байта фактически начинается таблица разделов в GPT?

C 1024 байта (включая) или с 0x400 в hex формате. Пруф:
Start of GPT entities

Заключение

Сегодня мы разобрали основные моменты загрузочных систем (Booting System). Повторим главные пункты:

  • UEFI и BIOS (Legacy)
  • PXE загрузка
  • GPT и MBR

Весь описанный материал можно считать поверхностным, особенно тот, что относится к UEFI. Однако, в следующей статье мы продолжим говорить о цепочке загрузки компьютера с участие EFI boot manager и NVRAM.

Так что дальше будет интересно, оставайся с нами =)

Опубликовано вИнформационная безопасность

Будьте первым, кто оставит комментарий

    Добавить комментарий

    Ваш e-mail не будет опубликован. Обязательные поля помечены *