Содержание
- 1 Предисловие
- 2 Инструкция
- 3 Заключение
- 4 Настройка uefi boot manager
- 5 2. UEFI на смену BIOS
- 6 3. Загрузка в UEFI
- 7 4. Windows on UEFI/GPT
- 8 5. Linux on UEFI/GPT
- 9 6. FreeBSD on UEFI/GPT
- 10 7. Dual/Triple/Multiboot Windows,Linux,FreeBSD on UEFI
- 11 В роли командного интерпретатора – EFI Shell
- 12 Как и на чем создавать EFI-приложения?
- 13 Выводы
Всем привет!
В данной статье, описаны шаги которые необходимо выполнить, для добавления к вашему WDS, возможности загрузки в режиме UEFI.
Т.е. инструкция в данной статье, предполагает, что у вас уже имеется, примерно следующая конфигурация:
1. Windows Server 2012R2 (или новее) 2. Полностью настроенный DHCP для работы с WDS 3. Собственно сам WDS 4. IIS 5. Виртуальная машина или ПК с Ubuntu
Так же, здесь описаны действия, которые не принесли мне должного результата. Описал я их, для облегчения поиска и экономии вашего времени.
Предисловие
Сделал как-то на работе WDS с множеством плюшек, т.к. устал постоянно бегать с кучей флешек и перезаписывать их.
Выглядит это вот так
И всё было хорошо, добавлялись новые образы для загрузки, образ 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 по сети и попробуйте загрузится.
У вас должна быть следующая картина:
Этап 2 — Сборка загрузочного файла iPXE
Запускаем заранее подготовленную Ubuntu, открываем терминал и вставляем эту строку:
git clone https://git.ipxe.org/ipxe.git ipxe
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
Если всё в порядке, то вы должны получить следующий вывод в терминале:
И файл 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
Я так же скопировал файл ipxe.efi, переименовал его в BOOTIA32.EFI и сконфигурировал загрузку для него, на всякий случай. architecture:x86uefi
Но по большому счёту в этом нет смысла, т.к. файл Bootmgfw.efi не поддерживает x86
Проверим, что получилось. Отлично, 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
.
Я не искал какой тип MIME подходит для этих целей лучше, и задал application/octet-stream
, после чего всё заработало.
Для файлов у которых нет расширения, используйте точку.
Вот так:
Заключение
В конечном итоге, у нас получается возможность загрузки по локальной сети через UEFI.
Если мы всё сделали правильно, то будет примерно такое меню выбора загрузки:
Удачной реализации!
Источник: 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
А в случае установки трех систем на один диск, удобней следующий порядок:
- Windows
- FreeBSD
- Linux
Следует отметить, верхние рекомендации, являются условными, потому что опираются на личное, субъективное мнение.
Кроме того, при установке OS FreeBSD, необходимо:
- использовать ручную разметку диска: Manual
- не создавать ESP партицию
необходимые дополнительные настройки после установки FreeBSD разберем позже.
DualBoot Linux и Windows
Как уже было сказано, при установке первой системой Windows, а затем Linux, проблем не будет.
Не потребуется никаких дополнительных настроек, при установке Linux, будет установлен BootManager Grub2-EFI, grub2 найдет вторую систему и добавит в меню
Разберем что делать, если Windows была установлена позже и как создать меню загрузки в GRUB2.
Нам необходимо создать меню Windows для GRUB2, для этого необходимо загрузить Linux. Это можно сделать двумя способами:
- используя POP-UP меню BIOS выбрать загрузку Linux
После того как загрузились в Linux, необходимо:
- создать меню загрузки Windows для GRUB2 два варианта:
- достаточно выполнить утилиту os-prober (ее используют grub-probe и grub-mkconfig)
- или создать руками /etc/grub.d/40_custom
Все.
UEFI DualBoot Windows и FreeBSD
Недостатки FreeBSD в случае MultiBoot:
- Установщик FreeBSD не умеет интегрировать efi загрузчик в уже существующую ESP
- В FreeBSD отсутствует утилита аналогичная efibootmgr
Существующие решения UEFI Multiboot для FreeBSD:
- порт sysutils/grub2-efi
- сторонний загрузчик 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 на пустую партицию.
- выполняем grub-mkconfig для создания конфигурации /boot/grub/grub.cfg
- удаляем секцию 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
Когда ранее мы упоминали, что командный DOS-интерпретатор под названием COMMAND.COM в принципе не нужен, так как его роль — это организация интерактивного режима, то данный факт практически никогда не реализовывался на практике и интерпретатор всегда был в системе. Для UEFI же присущ диаметрально другой подход — нужно обеспечить прежде всего выполнение загрузчика операционной системы, поэтому наличие промежуточного интерактивного приложения скорее вредит, чем помогает.
В роли командного интерпретатора – EFI Shell
Поэтому EFI Shell формально существует в природе, но фактически внутри firmware его нет. Что, однако, не означает невозможность его запуска — отнюдь. Поместив на USB-носитель в раздел bootEFI файл EFI Shell под стандартным названием bootx64.efi, мы получаем реинкарнацию DOS-системы, но на современный лад. Чтобы не быть привязанным к реальной аппаратуре и обезопасить себя от возможных негативных последствий, я предлагаю дальнейшие действия перенести в эмулированную среду и продолжить знакомство с EFI Shell на примере QEMU и специально адаптированным для него Tianocore BIOS [3].
Итак, забираем архив с Tianocore BIOS, распаковываем в текущий каталог и запускаем эмулятор как:
/usr/local/qemu-1.6/bin/qemu-system-x86_64 -L
Ключ «-L» означает, что видео- и BIOS-файлы хранятся в текущей директории. Сам файл EFI Shell интегрирован в образ BIOS.
Командная строка EFI Shell напоминает CLI-интерфейс от DOS
Запустив командный интерпретатор EFI, убеждаемся в первом впечатлении — очень похоже на старые, добрые дни MS-DOS. Есть встроенная справка (интегрированная в Shell команда help), присутствует текстовый редактор, который теперь умеет редактировать ASCII и UTF8-файлы, и ряд других команд. Однако, внедрение открытых технологий не могло повлиять и на развитие UEFI. В числе команд замечаем также специфичные команды вида mount и load. Соответственно, означающие монтирование раздела и загрузку в память драйвера к устройству. Очень похоже на BSD- и Linux-системы, не правда ли?
Загрузка интерпретатора UEFI осуществляется силами UEFI Boot менеджера
Дабы ощутить всю мощь EFI, создадим файловый образ с GPT-таблицей. А в нем сделаем 2 раздела: один в формате FAT16, понятный для встроенных драйверов EFI, а другой отформатируем в EXT2, но с прицелом его монтирования из-под самой микро-ОС UEFI
Листинг 1. Определяем смещение внутри GPT-таблицы
Определим смещение и монтируем первый раздел в виде loop-устройства. Кладем необходимые драйверы и готовые EFI-приложения и запускаем QEMU заново. Перед нами примонтированный раздел FAT16, переход на него осуществляется как: «fs0:»
Проверим командой map, какие разделы еще примонтированы, но видим только еще одно блочное устройство. Всё верно, в DXE пространстве ведь нет драйвера для EXT2-разделов.
EFI-приложение можно тестировать через интерфейс Boot Maintenance Manager
Загрузим и примонтируем наш раздел с помощью ext2-драйвера с проекта rEFInd, т.е. выполним последовательно команды по одной на каждую строку: «load ext2_x64.efi», «mount blk3 fs1», «fs1:», «dir». Убеждаемся, что раздел успешно примонтирован.
Отлично, теперь у нас есть доступ практически к любой файловой системе, благо EFI-драйверы к ним уже созданы. А это означает, что не за горами создание не только аналога Volkov Commander для EFI-среды, но также и сервисных утилит и приложений — тот же антивирусный пакет, портирование текстовых (и графических!) приложений (например, браузер links) и многое другое. С учетом того, что перед нами изначально безопасная и чистая среда, то перед нами действительно любопытные перспективы. Выглядят заманчиво? Еще бы!
Практически любая файловая система может быть смонтирована с помощью EFI-драйверов
Как и на чем создавать EFI-приложения?
Может создаться обманчивое впечатление, что EFI-приложение — это безумно сложное программирование. Но это не так. Для создания приложений требуется компилятор, который умеет создавать объектный код в формате PE32. И среда разработчика EDK II (EFI Development Kit) / UDK2010 (UEFI DevKit) [6]. Несмотря на то, что спецификации открыты и код лицензируется под BSD-лицензией и даже принимаются от пользователей апстрим-изменения в EDK II, среда UDK считается стабильной и эталонной для производителей материнских плат, т.к. разрабатывается и поддерживается компанией Intel.
Формат 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