Расширяем функционал WDS: добавление возможности загрузки в UEFI

Всем привет!

В данной статье, описаны шаги которые необходимо выполнить, для добавления к вашему WDS, возможности загрузки в режиме UEFI.

Т.е. инструкция в данной статье, предполагает, что у вас уже имеется, примерно следующая конфигурация:

1. Windows Server 2012R2 (или новее) 2. Полностью настроенный DHCP для работы с WDS 3. Собственно сам WDS 4. IIS 5. Виртуальная машина или ПК с Ubuntu

Так же, здесь описаны действия, которые не принесли мне должного результата. Описал я их, для облегчения поиска и экономии вашего времени.

Предисловие

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

Выглядит это вот так

image

И всё было хорошо, добавлялись новые образы для загрузки, образ winPE обрастал новыми фичами и всё работало.

Но, уже далеко не все устройства поддерживают режим загрузки BIOS/Legacy, либо если поддерживают, то его включение может находится в очень неочевидном месте.

Да и установка windows в legacy режиме, когда есть возможность установки в UEFI — не круто.

В итоге решил добавить возможность загрузки в UEFI, и отправился в гугл.

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

При добавлении UEFI к WDS возможна следующая, довольно не очевидная ситуация:

Если вы добавляете загрузочный файл к WDS и при попытке загрузится на устройстве в UEFI вы видите следующий текст: The selected boot device failed. Press to Continue. Или Boot Device Not Found Но загрузка в legacy у вас работает. Тогда один из возможных вариантов — отсутствие файла wdsmgfw.efi, по следующему пути: %WDSpath%Bootx64wdsmgfw.efi

Взять его можно тут: C:WindowsSystem32RemInstbootx64wdsmgfw.efi Либо, если у вас отсутствует по какой-то причине этот файл, я его выложил на . За это решение, спасибо ребятам с .

С этой проблемой я убил больше всего времени, т.к. я думал, что проблема где-то в конфигурации WDS или DHCP.

Настраивал политики, путём добавления Vendor Classes(Классы поставщиков) для различных архитектур, и настройкой опций DHCP 060, 066, 067. по настройке политик DHCP.

Архитектуры в ASCII для настройки DHCP

Так же, пробовал различные варианты загрузочных файлов .efi

  • syslinux
  • grub 2

Так же пытался найти проблему в Журнале событий. win + r -> eventvwr -> Журналы приложений и служб -> Microsoft -> Windows -> Deployment-Services-Diagnostics

Но, как я уже говорил выше, проблема крылась в файле wdsmgfw.efi. Либо я его сам случайно удалил, либо он не скопировался при установке и настройке WDS.

Ну, приступим!

Инструкция

Этап 1 — Проверка работоспособности WDS

Возьмите любое устройство или виртуальную машину с поддержкой загрузки в режиме UEFI по сети и попробуйте загрузится.

У вас должна быть следующая картина:

image

Этап 2 — Сборка загрузочного файла iPXE

Запускаем заранее подготовленную Ubuntu, открываем терминал и вставляем эту строку:

git clone https://git.ipxe.org/ipxe.git ipxe

image

cd ipxe/src gedit chain.ipxe

И вставляем в этот файл, следующий код, после чего сохраняем:

#!ipxe  dhcp chain http://%IP-address-your-IIS-server%/install.ipxe

Идём опять в терминал и запускаем компиляцию:

make bin-x86_64-efi/ipxe.efi EMBED=chain.ipxe

image

Если всё в порядке, то вы должны получить следующий вывод в терминале:

image

И файл ipxe.efi, по пути: ipxe/src/bin-x86_64-efi/ipxe.efi Если у вас по какой-то причине не получилось скомпилировать самостоятельно, я приложил свой . Он скомпилирован для загрузки с http://192.168.0.100/install.ipxe

На этом с Ubuntu всё.

Этап 3 — Добавление ipxe.efi к WDS

Берём файл, который мы получили во втором этапе и копируем по пути: %WDSpath%Bootx64%your-boot-folder%EFIBOOT После переименовываем его в BOOTX64.EFI. Это не обязательно, так просто удобней.

Потом запускаем cmd от имени администратора, и пишем следующие команды:

wdsutil /set-server /bootprogram:Bootx64%your-boot-folder%EFIBOOTBOOTX 64.EFI /architecture:x64uefi и wdsutil /set-server /N12bootprogram:Bootx64%your-boot-folder%EFIBOOTBOOTX 64.EFI /architecture:x64uefi

Этим мы установим полученный файл для загрузки через WDS.

Проверим конфигурацию:

wdsutil /get-server /Show:Config

image

Я так же скопировал файл ipxe.efi, переименовал его в BOOTIA32.EFI и сконфигурировал загрузку для него, на всякий случай. architecture:x86uefi Но по большому счёту в этом нет смысла, т.к. файл Bootmgfw.efi не поддерживает x86

Проверим, что получилось. image Отлично, WDS передаёт для загрузки наш файл и он в свою очередь ищет конфигурацию по пути: http://192.168.0.100/install.ipxe

Этап 4 — Конфигурация меню

Идём в корневую папку вашего сайта. По умолчанию это: C:inetpubwwwroot

Создаём текстовый файл install.ipxe.

Пример конфигурации install.ipxe

#!ipxe  :start menu Please choose an operating system to start/install item --gap Start Win PE item WinPE-x64 WinPE x64 item --gap ipxe shell item shell       Drop to iPXE shell  choose target && goto ${target}  :failed echo Booting failed, dropping to shell goto shell  :shell echo Type 'exit' to get the back to the menu shell set menu-timeout 0 set submenu-timeout 0 goto start  :WinPE-x64 kernel http://192.168.0.100/wimboot initrd http://192.168.0.100/peSE/Boot/bcd initrd http://192.168.0.100/peSE/Boot/boot.sdi initrd http://192.168.0.100/peSE/Boot/peSE64.wim boot || goto failed

Про конфигурацию для загрузки winPE можно прочитать .

Этап 5 — MIME types

Т.к. даже если вы попробуете из браузера скачать файл, по его адресу то получите ошибку: HTTP 404.3 - Not Found. image

Я не искал какой тип MIME подходит для этих целей лучше, и задал application/octet-stream, после чего всё заработало.

Для файлов у которых нет расширения, используйте точку.

Вот так:

image

Заключение

В конечном итоге, у нас получается возможность загрузки по локальной сети через UEFI.

Если мы всё сделали правильно, то будет примерно такое меню выбора загрузки:

image

Удачной реализации!

Источник: habr.com

Настройка uefi boot manager

BIOS — Basic Input Output System, это базовая система Ввода-Вывода, то есть набор программ зашитых в микросхему, использовалась ОС MSDOS, более современные ОС практически не используют BIOS.

За исключением процедуры POST — Инициализация и проверка работоспособности аппаратуры.

Если POST выполнен без ошибок, код BIOS начнёт поиск кода загрузчика ОС. Поиск выполняется на доступных и разрешённых в настройках носителях, код BIOS загрузит код загрузчика ОС в память и передаст ему управление.

Недостатки BIOS

  • 16-битный код, реальный режим(real-mode)
  • Отсутствие прямого доступа к 64-битному железу
  • Отсутствие единого стандарта
  • Сложность разработки.

2. UEFI на смену BIOS

Дословно Extensible Firmware Interface (EFI) — «расширяемый интерфейс прошивки»

EFI — интерфейс между операционной системой и микропрограммами, управляющими низкоуровневыми функциями оборудования, основное предназначение — корректно инициализировать оборудование при включении системы и передать управление загрузчику операционной системы.

EFI предназначен для замены BIOS, первый стандарт был разработан Intel, затем переработан и название заменено на UEFI (Universal).

Интерфейс, определённый спецификацией EFI, включает таблицы данных, содержащие информацию о платформе, загрузочные и runtime-сервисы, которые доступны для загрузчика операционной системы (ОС) и самой ОС.

Некоторые существующие расширения BIOS, типа ACPI и SMBIOS, также присутствуют в EFI, поскольку не требуют 16-разрядного runtime-интерфейса.

В дополнение к разнообразным службам и сервисам, EFI имеет оболочку — shell environment, для запуска программ, драйверов, создания исполняемых скриптов, для запуска утилит диагностики и обновления прошивок, работы с CD/DVD. Скрипты имеют расширение .nsh .

Достижения UEFI

  • Отсутствие ограничений объема разделов и их количества
  • Увеличение скорости загрузки
  • Безопасность: возможность использования Secure Boot
  • Обратная совместимость с BIOS — CSM (Compatibility Support Mode)
  • Поддердка сетевой загрузки PXE
  • Менеджер загрузки

3. Загрузка в UEFI

Как происходит загрузка в UEFI:

Примечание: в дальнейшем рассматривается только схема разметки GPT GUID Partition Table.

EFI ищет партицию с идентификатором EF00, эта партиция называется ESP (EFI System Partition) и должна быть оформлена как FS:

  • FAT32

однако, такие устройства как floppy, usb могут иметь FAT12 на ESP.

Далее уже работает сам загрузчик, by default это efibootbootx64.efi , он ищет корневую FS, на ней bootmanager или ядро, загружает их и передает им дальнейшее управление.

На самом деле, EFI BIOS, находит все ESP партиции, на всех носителях компьютера и на них файлы с расширением efi и если мы захотим загрузиться с какого-то иного носителя, второго диска или флешки, используя клавишу POP-UP меню загрузки BIOS, ну например F8 (у разных производителей могут разные функциональные клавиши), увидим все доступные носители с ESP и загрузчиками.

В отличие от BIOS, для UEFI используются другие ПЗУ, они дешевле, экономичней и имеют NVRAM в которой хранятся указатели на все найденные загрузчки .efi .

Структура ESP партиции выглядит следующим образом:

Примечание: Имена директорий Ubuntu, Debian, FreeBSD — всего лишь пример, можете использовать какие Вам угодно.

4. Windows on UEFI/GPT

Ничего необычно в установке Windows 7/8/10 на GPT из UEFI нет, ОС Windows ставится на диск с разметкой GPT только из UEFI.

Особенности и условия, ничего особенного:

  • настройка в UEFI BIOS -> загрузка UEFY Only
  • отключить Secure Boot
  • как уже было отмечено ранее, использовать официальный носитель с ОС
  • или выбрать правильный дистрибутив, если используете самодельные

Ниже показана структура ESP из Windows 7

Программа установки Windows создает ESP на компьютере при следующих условиях:

  • ESP еще не создан.
  • На диске достаточно места для создания раздела емкостью 100 МБ.

Программа установки Windows создает MSR при следующих условиях:

  • MSR еще не создан.
  • На диске достаточно места для создания раздела емкостью 128 МБ.

Примечание: В Windows 8.x/10 ESP 350MB, а в Windows 10 MSR=0-16MB

Важно: чтобы из командной строки Windows (cmd.exe), можно было смонтировать Системный Раздел ESP, нужно отключить UAC, затем, перезагрузиться, после чего команда: отработает без проблем.

Отключение UAC и Windows Defender с командной строки.

выходим в командную строку Windows:

Пуск -> Выполнить -> cmd.exe -> Запустить от Администратора

Отключаем Windows Defender:

Теперь, если у нас административный account, можно не заботиться о разрешениях «от Администратора».

Снова выходим в командную строку и выполняем следующие действия для монтирования Системного раздела ESP — EFI System Partition:

Ниже показано содержимое ESP записанное при установке Windows 7:

Примечание: В некоторых случаях, команда mountvol не может смонтировать ESP и выдает сообщение о неверном параметре, это возможно при наличии нескольких HDD в системе или по иной причине.

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

Выходим в командную строку и выполняем следующие действия для монтирования Системного раздела ESP — EFI System Partition:

чтобы понять что на каком диске находится:

  • выбираем диск командой sel
  • смотрим содержимое партиций

смотрим содержимое диска 1 (он пуст)

Из верхнего видно, нам нужен Системный раздел: Раздел 1 Системный 100 Mб 1024 Kб

  • выбираем диск 0
  • партицию 1
  • назначаем букву для монтирования

Все, можем работать с Системным разделом EFI, он смонтирован как диск S:

Загрузчик Windows и BootManager.

Как было сказано ранее, в UEFI NVRAM содержатся настройки, переменные EFI, прописанные и обнаруженные загрузчики с расширением .efi, порядок загрузки и тд и тп.

Для настройки BootLoader и BootManager, Microsoft использует целую ветку в реестре, а работа с ней и управление, осуществляется командой bcdedit.

Посмотреть текущие настройки можно следующим образом:

вариант с лицензионной системы:

Ниже показано что default’ный:

  • EFIMicrosoftBootbootmgfw.efi

это одна и та же EFI программа, см размер.

Если установлен загрузчик rEFInd, path должен быть: path EFIREFINDREFIND_X64.EFI

Изменить загрузчик из Windows, можно командой bcdedit: например:

5. Linux on UEFI/GPT

Перед установкой Linux из UEFI, советую настроить BIOS следующим образом;

  • загрузка UEFY Only
  • отключить Secure Boot
  • если разметка отсутствует создает ESP и прописывает туда загрузчик efi
  • если разметка уже есть и ESP партиция в наличии, добавляет туда свой загрузчик и делает его default’ным

Примечание: В EFI/BIOS предлагается выбрать загрузку UEFI Only потому что с ней не будет проблем.

Это связано с реализацией UEFI/BIOS различными производителями.

Загрузка: UEFY, Legacy — должна отрабатывать в последовательности:

  • — сначала найти ESP и попытаться загрузиться
  • — если ESP на устройствах отсутствуют, перейти к загрузке Legacy(BIOS)

Загрузка на некоторых материнских картах в случае выбора двух режимов; UEFI и затем Legacy может не найти реально существующий EFI-загрузчик на HDD.

Поэтому, лучше установить UEFY Only и установить ОС, а потом можно экспериментировать с настройками BIOS.

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

Допустим мы ставили Linux на чистый диск из UEFI, посмотрим конфигурацию системы и загрузки GRUB2 + EFI: /dev/sda1 это /boot/efi ESP partition

Посмоотрим разметку диска (GPT):

рекомендую сохранять значение UUID для ESP (может пригодится для grub)

модуль efivars подгружается автоматически при установке из UEFI

благодаря ему, реализован очень полезный функционал, но будьте осторожны с содержимым, которое монтируется в /sys/firmware/efi!

Очень Важно: UEFI NVRAM доступна на запись от root’а, удаление данных в NVRAM, может стать катастрофой для компьютера!

Еще один важный и полезный инструмент, утилита efibootmgr позволяет решать проблемы загрузки.

посмотрим текущее состояние:

Все верхние примеры были на базе ОС Debian.

Работа c ESP в Linux

Важно: ESP должна быть смонтирована!

В нижнем примере это выглядит следующим образом:

содержимое ESP при единственной установленой ОС Debian

В Ubuntu отличаться будет лишь названием: /boot/efi/EFI/ubuntu/

Создание GPT разметки в Linux:

  • Ubuntu и Debian имеют адаптированную утилиту fdisk для работы с GPT
  • или воспользоваться альтернативой: gdisk или parted

Примеры разметки:

  • fdisk
  • parted
  • sgdisk или

Примечание: Комментария и объяснения верхних команд не будет, как ими пользоваться можно прочитать в man

6. FreeBSD on UEFI/GPT

Установка FreeBSD из UEFI на чистый диск проходит без проблем, но если диск уже размечен как GPT и на нем есть ESP партиция, то встраиваться туда FreeBSD не умеет.

Ниже пример чистой установки FreeBSD из UEFI(пусть не смущает что это VM):

  • uname
  • camcontrol
  • gpart
  • mount
  • монтирование ESP и просмотр содержимого

Загрузка FreeBSD из UEFI коротко, четко и ясно описана в uefi(8)

UEFI firmware ищет загрузчик OS на EFI System Partition (ESP), если не установлен, по умолчанию грузит /efi/Boot/bootx64.efi. Это уже было описано.

По умолчанию FreeBSD устанавливает свой EFI загрузчик: boot1.efi как /efi/Boot/bootx64.efi

  • boot1.efi читает /boot.config или /boot/config
  • затем ищет на ufs или zfs загрузчик loader.efi и загружает его
  • loader.efi загружает ядро — kernel

Создание USB/HDD UEFI Bootable в FreeBSD:

Просто. Далее можем развернуть систему руками, как обычно из /usr/freebsd-dist при загрузке с CD/DVD или Memstick.

Что из себя представляет /boot/boot1.efifat:

Немного смущает что разный размер:

Но ничего страшного, при ручной разметке я использовал /boot/boot1.efi и без автоскрипта для efi-shell startup.nsh

Как во FreeBSD создать свой /boot/boot1.efifat, например, размером 512K:

Верхнее, только в случае отсутствия других ОС на диске, для DUAL/TRIPLE Boot, ESP должна быть достаточного размера, в случае Windows не менее 100MB

Это легко посчитать установив один раз Windows+Linux+FreeBSD.

Как во FreeBSD создать EFI раздел: создать FAT32:

7. Dual/Triple/Multiboot Windows,Linux,FreeBSD on UEFI

Выше была рассмотрена чистая установка трех Операционных систем, на основании которой, можно сделать несколько важных выводов:

  • Windows 7/8/10
    • использует существующую ESP при установке
    • делает собственый загрузчик default’ным, не интегрирует существующие ОС в меню загрузки
    • имеет утилиту управления загрузчиком: bcdedit
  • Linux
    • использует существующую ESP при установке
    • делает собственый загрузчик GRUB2-EFI default’ным, добавляет существующие ОС в загрузочное меню
    • имеет утилиту управления загрузчиком: efibootmgr
  • FreeBSD
    • процедура установки не умеет использовать существующую ESP
    • не имеет утилит управления загрузчиком
    • имеет пакет(порт) grub2-efi для установки и настройки стороннего загрузочного менеджера

На основании данных выводов, можно легко установить указанные ОС вместе на один компьютер:

  • на один диск
  • на разные диски
  • в любом порядке

однако определенный порядок, может упростить настройку загрузки.

При установке двух систем на один диск, удобней следующий порядок:

  • 1. Windows затем 2. FreeBSD
  • 1. Windows затем 2. Linux
  • 1. Linux затем 2. FreeBSD

А в случае установки трех систем на один диск, удобней следующий порядок:

  1. Windows
  2. FreeBSD
  3. Linux

Следует отметить, верхние рекомендации, являются условными, потому что опираются на личное, субъективное мнение.

Кроме того, при установке OS FreeBSD, необходимо:

  • использовать ручную разметку диска: Manual
  • не создавать ESP партицию

необходимые дополнительные настройки после установки FreeBSD разберем позже.

DualBoot Linux и Windows

Как уже было сказано, при установке первой системой Windows, а затем Linux, проблем не будет.

Не потребуется никаких дополнительных настроек, при установке Linux, будет установлен BootManager Grub2-EFI, grub2 найдет вторую систему и добавит в меню

Разберем что делать, если Windows была установлена позже и как создать меню загрузки в GRUB2.

Нам необходимо создать меню Windows для GRUB2, для этого необходимо загрузить Linux. Это можно сделать двумя способами:

  1. используя POP-UP меню BIOS выбрать загрузку Linux

После того как загрузились в Linux, необходимо:

  1. создать меню загрузки Windows для GRUB2 два варианта:
    1. достаточно выполнить утилиту os-prober (ее используют grub-probe и grub-mkconfig)
    2. или создать руками /etc/grub.d/40_custom

Все.

UEFI DualBoot Windows и FreeBSD

Недостатки FreeBSD в случае MultiBoot:

  • Установщик FreeBSD не умеет интегрировать efi загрузчик в уже существующую ESP
  • В FreeBSD отсутствует утилита аналогичная efibootmgr

Существующие решения UEFI Multiboot для FreeBSD:

  1. порт sysutils/grub2-efi
  2. сторонний загрузчик rEFInd

Установщик FreeBSD не умеет интегрировать свой загрузчик в уже существующую ESP и система не имеет утилиты манипуляции переменными EFI.

Наименее затратный вариант, если FreeBSD будет установлена первой. При установке нужно проследить чтобы партиция ESP была размером не менее 100MB. В ином случае, разметить вручную Manual

Если OS FreeBSD будет устанавливаться не первой системой:

  • разметку диска необходимо выполнить вручную Manual
  • ESP создавать НЕ НУЖНО! Должна быть только одна.
  • по завершению установки выйти в режим Live CD/USB и установить пакет sysutils/grub2-efi
  • или вместо grub2-efi установить из Windows загрузочный менеджер rEFInd

Рассмотрим вариант установки FreeBSD позже остальных ОС с установкой и настройкой sysutils/grub2-efi.

При установке выбираем Manual разметку диска, создаем как минимум freebsd-ufs для корня и freebsd-swap для swap, или устанавливаем zfs на пустую партицию.

  1. выполняем grub-mkconfig для создания конфигурации /boot/grub/grub.cfg
  2. удаляем секцию 10_kfreebsd из /boot/grub/grub.cfg — она создается НЕВЕРНО может мешать:

При использовании rEFInd, не требуется установка grub2-efi, но перед завершением установки FreeBSD необходимо выйти в Live CD/USB, смонтировать партицию ESP и скопировать туда загрузчик FreeBSD:

  • монтируем ESP
  • создаем директорию FreeBSD и копируем в нее загрузчик
  • установку и настройку rEFInd удобней выполнить из Windows, но можно из FreeBSD.

Установка и настройка rEFInd.

  • монтируем ESP используя команду mountvol
  • Скачиваем rEFInd
  • Разворачиваем архив в S:EFIrefind
  • Удаляем все лишние из EFIrefind
  • создаем конфиг refind.conf
  • настраиваем в нем нужные нам меню:
  • используя bcdedit устанавливаем refind как загрузчик by default
  • перезагружаемся и наслаждаемся меню rEFInd

rEFInd имеет достаточное количество настроек и может быть использован как с текстовым меню или графическим с иконками и тд и тп. Используйте документацию и пример refind.conf-sample

Теперь не составит труда настроить загрузку UEFI OS FreeBSD,Linux,Windows: Dual, Triple или MultiBoot.

Источник

Читайте также:  Настройка датчика дождя opel astra h image

Когда ранее мы упоминали, что командный DOS-ин­тер­пре­та­тор под наз­ва­ни­ем COM­MAND.COM в прин­ци­пе не ну­жен, так как его роль — это ор­га­ни­за­ция ин­тер­ак­тив­но­го ре­жи­ма, то дан­ный факт прак­ти­че­ски ни­ког­да не ре­а­ли­зо­вы­вал­ся на прак­ти­ке и ин­тер­пре­та­тор всег­да был в сис­те­ме. Для UEFI же при­сущ ди­а­мет­раль­но дру­гой под­ход — нуж­но обес­пе­чить преж­де все­го вы­пол­не­ние за­груз­чи­ка опе­ра­ци­он­ной сис­те­мы, по­э­то­му на­ли­чие про­ме­жу­точ­но­го ин­тер­ак­тив­но­го при­ло­же­ния ско­рее вре­дит, чем по­мо­га­ет.

В роли командного интерпретатора – EFI Shell

Поэтому EFI Shell формально существует в природе, но фак­ти­че­ски внутри firmware его нет. Что, однако, не оз­на­ча­ет не­воз­мож­ность его за­пус­ка — отнюдь. По­мес­тив на USB-носитель в раздел bootEFI файл EFI Shell под стан­дарт­ным наз­ва­ни­ем bootx64.efi, мы по­лу­чаем ре­ин­кар­на­цию DOS-системы, но на со­вре­мен­ный лад. Чтобы не быть при­вя­зан­ным к реальной аппаратуре и обезопасить себя от воз­мож­ных не­га­тив­ных по­след­ст­вий, я предлагаю даль­ней­шие дей­ст­вия перенести в эму­ли­ро­ван­ную среду и про­дол­жить зна­ком­ст­во с EFI Shell на примере QEMU и спе­ци­аль­но ада­п­­ти­­ро­­ван­­ным для него Ti­ano­core BIOS [3].

Итак, забираем архив с Tianocore BIOS, распаковываем в текущий каталог и запускаем эмулятор как:

/usr/local/qemu-1.6/bin/qemu-system-x86_64 -L

Ключ «-L» означает, что видео- и BIOS-файлы хранятся в текущей директории. Сам файл EFI Shell интегрирован в образ BIOS.

image

Командная строка EFI Shell напоминает CLI-интерфейс от DOS

Запустив командный интерпретатор EFI, убеждаемся в первом впечатлении — очень похоже на старые, добрые дни MS-DOS. Есть встроенная справка (интегрированная в Shell команда help), присутствует текстовый редактор, который теперь умеет редактировать ASCII и UTF8-файлы, и ряд других команд. Однако, внедрение открытых технологий не мог­ло повлиять и на развитие UEFI. В числе команд замечаем также специфичные команды вида mount и load. Со­от­вет­ст­вен­но, означающие монтирование раздела и загрузку в память драйвера к устройству. Очень похоже на BSD- и Linux-системы, не правда ли?

image

Загрузка интерпретатора UEFI осуществляется силами UEFI Boot менеджера

Дабы ощутить всю мощь EFI, создадим файловый образ с GPT-таблицей. А в нем сделаем 2 раздела: один в формате FAT16, понятный для встроенных драйверов EFI, а другой отформатируем в EXT2, но с прицелом его монтирования из-под самой микро-ОС UEFI

Листинг 1. Определяем смещение внутри GPT-таблицы

Определим смещение и монтируем первый раздел в виде loop-устройства. Кладем необходимые драйверы и готовые EFI-приложения и запускаем QEMU заново. Пе­ред нами при­мон­ти­ро­ван­ный раздел FAT16, переход на него осу­ще­ст­вля­ет­ся как: «fs0:»

Проверим командой map, какие разделы еще при­мон­ти­ро­ва­ны, но видим только еще одно блочное устройство. Всё вер­но, в DXE пространстве ведь нет драйвера для EXT2-разделов.

image

EFI-приложение можно тестировать через интерфейс Boot Maintenance Manager

Загрузим и при­мон­ти­ру­ем наш раздел с помощью ext2-драйвера с проекта rEFInd, т.е. выполним по­сле­до­ва­тель­но ко­ман­ды по одной на каждую строку: «load ext2_x64.efi», «mount blk3 fs1», «fs1:», «dir». Убеждаемся, что раздел успешно при­мон­ти­ро­ван.

Отлично, теперь у нас есть доступ практически к любой файловой системе, благо EFI-драйверы к ним уже созданы. А это означает, что не за горами создание не только аналога Volkov Commander для EFI-среды, но также и сервисных ути­лит и приложений — тот же антивирусный пакет, пор­ти­ро­ва­ние текстовых (и графических!) приложений (на­при­мер, бра­узер links) и многое другое. С учетом того, что перед нами из­на­чаль­но безопасная и чистая среда, то перед нами дей­ст­ви­тель­но лю­бо­пыт­ные пер­с­пек­ти­вы. Выглядят заманчиво? Еще бы!

image

Практически любая файловая система может быть смонтирована с помощью EFI-драйверов

Как и на чем создавать EFI-приложения?

Может создаться обманчивое впечатление, что EFI-приложение — это безумно сложное программирование. Но это не так. Для создания приложений требуется компилятор, который умеет создавать объектный код в формате PE32. И сре­да разработчика EDK II (EFI Development Kit) / UDK2010 (UEFI DevKit) [6]. Несмотря на то, что спецификации от­кры­ты и код ли­цен­зи­ру­ет­ся под BSD-лицензией и даже принимаются от пользователей ап­ст­рим-изменения в EDK II, сре­да UDK считается стабильной и эталонной для про­из­во­ди­те­лей ма­те­рин­ских плат, т.к. раз­ра­ба­ты­ва­ет­ся и под­дер­жи­ва­ет­ся компанией Intel.

image

Формат EFI-приложения должен соответствовать стандарту PE32

Среда разработчика существует как для Linux, так и для систем на базе Windows и Mac OS X. Сборка обеспечивается, как правило, компиляторами GCC и нативными из состава Visual Studio 2008 и Xcode. Хотя повторюсь – фактически, достаточно будет только компилятора и заголовочных файлов EDK. Данный факт особенно актуален, если принято решение задействовать ассемблер, а именно flatasm [4]. В этом случае получится создавать наиболее оп­ти­ми­зи­ро­ван­ный и минимальный код. Конечно, при росте проекта имеет смысл пе­ре­о­ри­ен­ти­ро­ватьмся на C/C++ и пе­ре­хо­дить, со­от­вет­ст­вен­но, на EDK.

Более подробно на создании EFI-приложений остановимся в следующих публикациях, а пока отмечу, что приложение вида «Hello, World» на ASM занимает всего 50 строк. Компилируется FlatASM на станции с Core2Duo за 1 ми­кро­се­кун­ду и за­ни­ма­ет только 2 Кб.

Выводы

С точки зрения дальнейшего развития подсистемы низкоуровневого аппаратного обеспечения (BIOS) появление от­кры­то­го решения, похожего на EFI, кажется закономерным и не случайным. Появляются серверные и деск­топ­ные плат­фор­мы на основе разных процессорных ар­хи­тек­тур (x86_64, ARM, IA64), чипсетов и интегрированных устройств, на­при­мер, организующих шифрование (чипы TPM). Для организации всего этого сонма в единое целое требуется мо­ду­ль­ный кон­ст­рук­тор, которым могли бы пользоваться как ко­неч­ные про­из­во­ди­те­ли, так и из­го­то­ви­те­ли от­дель­ных ап­па­рат­ных мо­ду­лей. К сча­стью, на­сущ­ность этой проб­ле­мы пер­вой уви­де­ла Intel и пред­ста­ви­ла та­кое от­кры­тое ре­ше­ние как UEFI. К вя­щей ра­дос­ти про­грам­мис­тов сис­тем­ного ПО, т.к. при бли­жай­шем рас­смот­ре­нии ука­зан­ное ре­ше­ние яв­ля­ет­ся на­сто­я­щей мик­ро-опе­ра­ци­онvной сис­те­мой с прак­ти­че­ски не­ог­ра­ни­чен­ны­ми воз­мож­но­стя­ми по уп­рав­ле­нию как ап­па­рат­ной ча­стью, так и за­гру­жа­е­мой в даль­ней­шем ре­аль­ной ОС — будь это Windows, BSD, Linux или нечто ана­ло­гич­ное. А при­ме­не­ния этим воз­мож­но­стям от­кры­ва­ют­ся са­мые ши­ро­кие.

Ссылки

[3] http://sourceforge.net/apps/mediawiki/tianocore/index.php?title=OVMF

[4] http://flatassembler.net/

Используемые источники:

  • https://prohoster.info/blog/administrirovanie/rasshiryaem-funktsional-wds-dobavlenie-vozmozhnosti-zagruzki-v-uefi
  • https://allomart.ru/nastroyka-uefi-boot-manager/
  • https://composter.com.ua/content/zdravstvuy-uefi

Рейтинг автора
5
Подборку подготовил
Андрей Ульянов
Наш эксперт
Написано статей
168
Ссылка на основную публикацию
Похожие публикации