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

Всем привет!


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


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


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

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


Предисловие


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


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


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


И всё было хорошо, добавлялись новые образы для загрузки, образ 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%\Boot\x64\wdsmgfw.efi


Взять его можно тут: C:\Windows\System32\RemInst\boot\x64\wdsmgfw.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 по сети и попробуйте загрузится.


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



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


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


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


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


Тут хотелось бы сделать небольшое замечание, о том, что возможно вам в 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


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



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


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


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


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


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


wdsutil /set-server /bootprogram:Boot\x64\%your-boot-folder%\EFI\BOOT\BOOTX
64.EFI /architecture:x64uefi
и
wdsutil /set-server /N12bootprogram:Boot\x64\%your-boot-folder%\EFI\BOOT\BOOTX
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:\inetpub\wwwroot


Создаём текстовый файл 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.


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


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


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


Вот так:



Заключение


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


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



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


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


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

  • +20
  • 3,5k
  • 8
Поделиться публикацией

Комментарии 8

    +1
    У вас нигде не написано откуда взялся файл
    192.168.0.100/wimboot
    а без него вся цепочка развалится.
    ipxe.cfg
    #!ipxe

    :start
    set url http://192.168.3.100/tftpboot/
    menu Please choose an operating system to install

    item --gap Debian
    item debian-net Debian net install

    item sys SYSTEM-RESCUE-CD 5.1.2 (www.system-rescue-cd.org)
    item memtest memtest

    item --gap Windows
    item win Win10 Installation Env
    item veeam Veeam
    item win2012 Win 2012
    item dart10x86 DaRT win10 x86
    item dart10x64 DaRT win10 x64
    item dart8x86 DaRT win8 x86
    item dart8x64 DaRT win8 x64
    item dart7x86 DaRT win7 x86
    item dart7x64 DaRT win7 x64
    item AdminPE32 AdminPE32
    item AdminPE64 AdminPE64

    item --gap ipxe shell
    item shell Drop to iPXE shell
    item exit Exit to BIOS

    choose --default exit --timeout 5000 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

    :memtest
    set iso memtest86-7.5.iso
    sanboot --no-describe ${url}livecd/${iso}
    # chain memdisk iso raw
    # boot || read void

    :win
    kernel wimboot
    initrd winpe/winpeshl.ini winpeshl.ini
    initrd winpe/net.bat net.bat
    initrd winpe/bcd BCD
    initrd winpe/boot.sdi boot.sdi
    initrd ${url}winpe/boot.wim boot.wim
    boot

    :veeam
    kernel wimboot
    initrd winpe/bcd BCD
    initrd winpe/boot.sdi boot.sdi
    initrd ${url}winpe/veeam/boot.wim boot.wim
    boot

    :win2012
    kernel wimboot
    initrd winpe/bcd BCD
    initrd winpe/boot.sdi boot.sdi
    initrd ${url}winpe/win2012/boot.wim boot.wim
    boot

    :winmem
    kernel wimboot
    initrd winpe/dart/bootmgr bootmgr
    initrd winpe/dart/BCD BCD
    initrd winpe/dart/boot.sdi boot.sdi
    initrd winpe/dart/memtest.exe memtest.exe
    initrd ${url}winpe/dart/bootx64.wim bootx64.wim
    boot

    :dart10x86
    kernel wimboot
    initrd winpe/bootmgr bootmgr
    initrd winpe/bcd bcd
    initrd winpe/boot.sdi boot.sdi
    initrd ${url}winpe/dart10x86/boot.wim boot.wim
    boot

    :dart10x64
    kernel wimboot
    initrd winpe/bcd BCD
    initrd winpe/boot.sdi boot.sdi
    initrd ${url}winpe/dart10x64/boot.wim boot.wim
    boot

    :dart8x86
    kernel wimboot
    initrd winpe/bootmgr bootmgr
    initrd winpe/bcd bcd
    initrd winpe/boot.sdi boot.sdi
    initrd ${url}winpe/dart8x86/boot.wim boot.wim
    boot

    :dart8x64
    kernel wimboot
    initrd winpe/bcd BCD
    initrd winpe/boot.sdi boot.sdi
    initrd ${url}winpe/dart8x64/boot.wim boot.wim
    boot

    :dart7x86
    kernel wimboot
    initrd winpe/bootmgr bootmgr
    initrd winpe/bcd bcd
    initrd winpe/boot.sdi boot.sdi
    initrd ${url}winpe/dart7x86/boot.wim boot.wim
    boot

    :dart7x64
    kernel wimboot
    initrd winpe/bootmgr bootmgr
    initrd winpe/bcd bcd
    initrd winpe/boot.sdi boot.sdi
    initrd ${url}winpe/dart7x64/boot.wim boot.wim
    boot

    :AdminPE64
    kernel wimboot
    initrd winpe/bootmgr bootmgr
    initrd winpe/bcd bcd
    initrd winpe/boot.sdi boot.sdi
    initrd ${url}winpe/AdminPE64/boot.wim boot.wim
    boot

    :AdminPE32
    kernel wimboot
    initrd winpe/bootmgr bootmgr
    initrd winpe/bcd bcd
    initrd winpe/boot.sdi boot.sdi
    initrd ${url}winpe/AdminPE32/boot.wim boot.wim
    boot
    ---------
    :sys
    kernel rescuecd/rescue64 scandelay=4 netboot=nfs://192.168.3.100:/var/lib/tftpboot/rescuecd/
    initrd rescuecd/initram.igz
    boot

    :debian-net
    kernel http://mirror.yandex.ru/debian/dists/stable/main/installer-amd64/current/images/netboot/debian-installer/amd64/linux ---
    initrd http://mirror.yandex.ru/debian/dists/stable/main/installer-amd64/current/images/netboot/debian-installer/amd64/initrd.gz
    boot
    #|| goto failed

    set timeout 1000

    :menu
    menu Network boot options for ${uuid}
    item --key a default Try to boot (a)ll network adapters in turn
    item
    item --gap -- --- Detected network adapters ---
    set i:int8 0
    :loop
    ifopen net${i} && item --key ${i} net${i} net(${i}): ${netX/mac} - ${netX/bustype} ${netX/busloc:busdevfn} ${pci/${netX/busloc}.0.2}:${pci/${netX/busloc}.2.2} ${netX/chip} ; ifclose
    inc i
    iseq ${i} 10 || goto loop
    item
    item --gap -- --- Alternatives ---
    item --key c config Open (c)onfiguration
    item --key r reboot (R)eboot computer
    item --key s shell Drop to iPXE (s)hell
    item --key x exit E(x)it and continue BIOS boot order
    choose --timeout ${timeout} selected && goto select || goto default
    goto menu

    :select
    isset ${${selected}/mac} && goto nic || goto label

    :nic
    autoboot ${selected} && goto exit ||
    echo Booting '${selected}' failed, exiting iPXE...
    goto exit

    :label
    goto ${selected} ||
    echo The label '${selected}' could not be found, returning to menu...
    sleep 2
    goto restart

    :default
    autoboot && goto exit ||
    echo Booting failed, exiting iPXE...
    goto exit

    :config
    config
    goto restart

    :shell
    shell
    goto restart

    :restart
    set timeout 0
    goto menu

    :reboot
    reboot

    :exit
    echo Continuing BIOS boot order...
    sleep 1
    exit


    PS не использую WDS, вся эта возня с загрузчиками BCD и заклинаниями в ракушке мощи после линукса просто взрывает мозг. Все образы имеют имя boot.wim и лежат в разных каталогах, что позволяет использовать единый файл BCD
      0
      Файл 192.168.0.100/wimboot, взят отсюда: ipxe.org/howto/winpe
      Эту ссылку я оставил в статье и подумал, что нет необходимости выкладывать этот файл сюда.

      Про BCD я согласен. Хороший вариант.
      Но по факту, даже если их кастомизировать, то это нужно сделать один раз всего.
      (В большинстве случаев)
      0
      Довольно интересно, но я до сих пор не могу понять, чем UEFI лучще. Надо будет на своём WDS попробовать.
        0
        В теории UEFI быстрее грузится.
        Для себя же, на практике с ним удобней.
        У подавляющего большинства устройств, из коробки стоит загрузка именно в UEFI режиме.
        А у некоторых, это единственный вариант загрузки.
        BIOS/Legacy вариант отсутствует.
        0
        BIOS/Legacy вариант отсутствует.

        Обычно такое на ноутбуках, у которых все настройки BIOS помещаются на одной странице.
        Но бывает и наоборот. Сейчас взял для проверки первый попавшийся моноблок со склада, какой-то OEM без названия. Судя по разъемам что-то на платформе как ASUS H110T. Так у него в биосе сетевая загрузка настраивается только Disabled или Legacy, все остальные настройки про CSM и UEFI есть.
        Еще задаю пароль на биос, теперь при входе в биос или в Boot Menu спрашивается пароль. Но если на запрос пароля просто нажать enter, то прекрасно входит в настройки, или можно поменять очередность загрузки. А с неверным паролем зайти нельзя. Все как из анекдотов про пароли.
          0
          Или 2 поколение Hyper-V.
          0

          Коллеги подскажите,


          1. возможно ли к wds подключить Linux образы?
          2. Возможно ли на was опубликовать образы загрузки а-ля live c, например с мемтестом?

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