Доброго времени суток, читатели!
Сегодня мы начнем погружаться в загрузочные системы или 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 не всегда выдает свободный адрес, зачастую стоит range на выдачу, но с PXE это не очень верно работает. — комментарий специалиста. Далее DHCP сервер помогает клиентскому PXE найти следующий IP-адрес сервера для скачивания NBP* файла по протоколу TFTP.
- Далее клиент устанавливает NBP пакет, скаченный в RAM (random-access memory или просто — оперативку).
Тут можно хоть немного некорректно, но сравнить с cloud.init когда ВМ разворачивается в виртуальном окружении. Например, для винды этот файл будет BCD — комментарий специалиста. До процесса установки ресурсы самого жесткого диска не используются.
Загрузка по PXE дает немалую автоматизацию, так, например, с помощью Cobbler и правильно настроенного пакета, что передается (NBP), мы можем получить уже настроенную установленную ось. — комментарий специалиста.
*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.
Для чего нужны разделы дисков (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 формате. Пруф:
Заключение
Сегодня мы разобрали основные моменты загрузочных систем (Booting System). Повторим главные пункты:
- UEFI и BIOS (Legacy)
- PXE загрузка
- GPT и MBR
Весь описанный материал можно считать поверхностным, особенно тот, что относится к UEFI. Однако, в следующей статье мы продолжим говорить о цепочке загрузки компьютера с участие EFI boot manager и NVRAM.
Так что дальше будет интересно, оставайся с нами =)
Доброго времени суток! NBP это скорее всего NetBIOS Protocol
Нет, NBP — это Network Bootstrap Program