Всем привет!
В данной статье, описаны шаги которые необходимо выполнить, для добавления к вашему 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, я так и не нашёл.
Собственно, поэтому я и решил написать эту статью.
Перед тем как начать, я опишу проблему, которая отняла больше всего времени.
Если вы добавляете загрузочный файл к 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.
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.
#!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.
Naves
У вас нигде не написано откуда взялся файл
192.168.0.100/wimboot
а без него вся цепочка развалится.
#!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
BlackFIlms Автор
Файл
192.168.0.100/wimboot
, взят отсюда: ipxe.org/howto/winpeЭту ссылку я оставил в статье и подумал, что нет необходимости выкладывать этот файл сюда.
Про BCD я согласен. Хороший вариант.
Но по факту, даже если их кастомизировать, то это нужно сделать один раз всего.
(В большинстве случаев)
YMax
Довольно интересно, но я до сих пор не могу понять, чем UEFI лучще. Надо будет на своём WDS попробовать.
BlackFIlms Автор
В теории UEFI быстрее грузится.
Для себя же, на практике с ним удобней.
У подавляющего большинства устройств, из коробки стоит загрузка именно в UEFI режиме.
А у некоторых, это единственный вариант загрузки.
BIOS/Legacy вариант отсутствует.
Naves
Обычно такое на ноутбуках, у которых все настройки BIOS помещаются на одной странице.
Но бывает и наоборот. Сейчас взял для проверки первый попавшийся моноблок со склада, какой-то OEM без названия. Судя по разъемам что-то на платформе как ASUS H110T. Так у него в биосе сетевая загрузка настраивается только Disabled или Legacy, все остальные настройки про CSM и UEFI есть.
Еще задаю пароль на биос, теперь при входе в биос или в Boot Menu спрашивается пароль. Но если на запрос пароля просто нажать enter, то прекрасно входит в настройки, или можно поменять очередность загрузки. А с неверным паролем зайти нельзя. Все как из анекдотов про пароли.
AcidVenom
Или 2 поколение Hyper-V.
Dee3
Коллеги подскажите,
YMax
1. Да, конечно да.
2. Конечно да.