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

Всем привет!

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

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

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

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

Предисловие

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

Помогли мне кстати тогда вот эти статьи:
Добавляем WDS универсальности
Загрузочное меню PXE с System Center Configuration Manager


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

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

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

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

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

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

Но структурированной информации, как получить рабочий WDS + UEFI, я так и не нашёл.
Собственно, поэтому я и решил написать эту статью.

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

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

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

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

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

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

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

PXEClient:Arch:00000 — BIOS/Legacy
PXEClient:Arch:00006 — UEFI x86
PXEClient:Arch:00007 — UEFI x64

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

  • syslinux
  • grub 2

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

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

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

Инструкция

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

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

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

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

Если так, то отлично, можно продолжать.
Если же нет, то смотрите, что я написал в предисловии.

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

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

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

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

Тут хотелось бы сделать небольшое замечание, о том, что возможно вам в Ubuntu придётся добавить пакеты, необходимые для компиляции C и C++.
Просто у меня они уже были установлены.

Скачалось? — Отлично!
Теперь нужно сделать конфигурационный файл для сборки.
В терминале, пишем:

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

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

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

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

И файл 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

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

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

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

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

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

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

И конфигурируем его в соответствии с документацией и вашими нуждами.
Так же имеется русскоязычное описание команд.
Я пользовался этой инструкцией при конфигурации своего WDS.

Пример конфигурации 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

После создания меню и добавления всех необходимых файлов в корневую папку IIS,
необходимо дать к ним доступ.

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

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

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

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

Вот так:

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

Заключение

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

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

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

Если у вас подготовлены основные инструменты и вы не будете заморачиваться с конфигурацией, то на реализацию данной возможности уходит примерно 10-20 минут.
У меня же ушло 2 рабочих дня, т.к. пришлось много гуглить.

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

Спасибо за внимание и огромное спасибо тем людям чьи статьи мне помогли!
На Хабре это: Ingtar и Deeptown.

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