Очень часто возникает необходимость устанавливать операционную систему Windows, в рамках одного компьютера можно воспользоваться диском, флешкой, я предлагаю способ устанавливать эту операционную систему через локальную сеть, в этом нам поможет сервер сетевой загрузки, рассмотренный в статьях тут и тут
Все нижеописанные скрипты я поместил в репозиторий git
План работ
1. Устанавливаем среду сборки образов предустановки WinPE
2. Выполняем сборку wim образа
3. Создаем конфигурацию загрузки на сервере загрузки
WinPE через PXE
Для того чтобы поставить Windows нам потребуется система предустановки Windows, которая называется WinPE.
Ее можно сделать скачав пакет ADK с сайта Microsoft
После установки можно приступать к сборке образа
В рабочем каталоге необходимо создать каталог drivers, в который можно будет сложить драйвера на сетевые карты для образа WinPE
Сборка образа WinPE
Я создал несколько скриптов позволяющих автоматически собирать образы, заточенные под установку ОС Windows.
В Windows7 мне пришлось отключать проверку цифровой подписи драйверов, так как команда dism вываливалась с ошибками, это делается при старте системы, клавишей F8 вызываем меню загрузки и выбираем «отключение обязательной цифровой подписи драйверов».
Автоматизация процесса создания образа WinPE
Скрипты описанные ниже представлены в порядке их запуска и имеют достаточно подробное описание, запускаются они как в автоматическом режиме с помощью setup.bat, так и по отдельности, необходимые переменные помещаю в config.bat
config.bat
В этом скрипте устанавливаем рабочую дерикторию и архитектуру создаваемого образа
arch могут быть «x86″,»amd64»
1 2 | set workdirectory=e: set arch=amd64 |
generate.bat
Создание рабочей дериктории winpe, в процессе работы в каталоге который мы указали появится подкаталог с названием архитектуры. В версииях SDK для Win10 были изменнены пути к скрипту copype, теперь чтобы его установить требуется пакет Windows PE add-on for ADK.
1 2 | call %~dp0config.bat copype %arch% %workdirectory%\%arch% |
unpack.bat
Скрипт распаковки созданного wim образа, распаковывает в каталог mount
1 2 | call %~dp0\config.bat dism /Mount-Image /Imagefile:"%workdirectory%\%arch%\media\sources\boot.wim" /index:1 /MountDir:"%workdirectory%\%arch%\mount" |
import_start.bat
Помещаем скрипт автозагрузки в системный каталог, в качестве скрипта автозагрузки выступает startnet.cmd, который можно отыскать в примонтированном образе /mount/windows/system32
1 2 | call %~dp0config.bat xcopy /Y %~dp0startnet.cmd %workdirectory%\%arch%\mount\windows\system32\ |
driver.bat
Импортируем рекурсивно драйвера на сетевые карты, драйвера должны быть сложены возле каталога со скриптом, команда dism выбирает inf файлы и по ним ищет остальные модули драйвера.
1 2 | call %~dp0config.bat dism /image:%workdirectory%\%arch%\mount /add-driver /driver:"%workdirectory%\drivers" /recurse /forceunsigned |
extractBootPXE.bat
Копируем из wim образа файлы для загрузки через PXE, в самом wim образе находятся необходимые модули для загрузки через PXE. Кроме того у меня не получилось загрузиться по сети с pxeboot.n12, но достаточно было ео переименовать заменив n12 на 0 как загрузка прошла без ошибок.
1 2 3 4 5 6 | call %~dp0config.bat mkdir %workdirectory%\%arch%\PXE echo f | xcopy /Y %workdirectory%\%arch%\mount\windows\boot\pxe\pxeboot.n12 %workdirectory%\%arch%\PXE\pxeboot.0 xcopy /Y %workdirectory%\%arch%\mount\windows\boot\pxe\bootmgr.exe %workdirectory%\%arch%\PXE mkdir %workdirectory%\%arch%\PXE\Boot xcopy /Y %workdirectory%\%arch%\media\Boot\boot.sdi %workdirectory%\%arch%\PXE\Boot |
pack.bat
Упаковываем в образ рабочую деррикторию, следует отметить что необходимо из нее выйти (она находится в каталоге mount), иначе образ не отмонтируется.
1 2 | call %~dp0\config.bat dism /Unmount-Image /MountDir:"%workdirectory%\%arch%\mount" /commit |
export.bat
Выгружаем из wim образа только наш слой, так как все наши изменения хранятся в образе в виде наслоений и образ начинает понемногу расти, тем самым увеличивая время загрузки.
1 2 | call %~dp0\config.bat Dism /Export-Image /SourceImageFile:%workdirectory%\%arch%\media\sources\boot.wim /SourceIndex:1 /DestinationImageFile:%workdirectory%\%arch%\PXE\winpe%arch%.wim |
Если необходимо откатить изменения которые мы делали после распаковки, то запускаем скрипт pack_dscard.bat
pack_dscard.bat
1 2 3 | call %~dp0\config.bat call %~dp0var.bat dism /Unmount-Image /MountDir:"%workdirectory%\%arch%\mount" /discard |
setup.bat
Автоматизируем процесс создания wim образа, запустив все созданные скрипты по очереди.
1 2 3 4 5 6 7 8 | call %~dp0\config.bat call %~dp0\generate.bat call %~dp0\unpack.bat call %~dp0\import_start.bat call %~dp0\driver.bat call %~dp0\extractBootPXE.bat call %~dp0\pack.bat call %~dp0\export.bat |
Еще понадобится файл с описанием загрузки BCD, он не заработал у меня из среды средств развертывания, поэтому запускаю средствами cmd с повышенными правами
createBCD.bat
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | call %~dp0config.bat bcdedit -createstore %workdirectory%\%arch%\PXE\Boot\BCD bcdedit -store %workdirectory%\%arch%\PXE\Boot\BCD -create {ramdiskoptions} /d "Ramdisk options" bcdedit -store %workdirectory%\%arch%\PXE\Boot\BCD -set {ramdiskoptions} ramdisksdidevice boot bcdedit -store %workdirectory%\%arch%\PXE\Boot\BCD -set {ramdiskoptions} ramdisksdipath \Boot\boot.sdi for /F "tokens=2" %%i in ('bcdedit -store %workdirectory%\%arch%\PXE\Boot\BCD -create /d "MyWinPE Boot Image" /application osloader') do set guid=%%i bcdedit -store %workdirectory%\%arch%\PXE\Boot\BCD -set %guid% systemroot \Windows bcdedit -store %workdirectory%\%arch%\PXE\Boot\BCD -set %guid% detecthal Yes bcdedit -store %workdirectory%\%arch%\PXE\Boot\BCD -set %guid% winpe Yes bcdedit -store %workdirectory%\%arch%\PXE\Boot\BCD -set %guid% osdevice ramdisk=[boot]\winpe%arch%.wim,{ramdiskoptions} bcdedit -store %workdirectory%\%arch%\PXE\Boot\BCD -set %guid% device ramdisk=[boot]\winpe%arch%.wim,{ramdiskoptions} bcdedit -store %workdirectory%\%arch%\PXE\Boot\BCD -create {bootmgr} /d "Windows PE BootManager" bcdedit -store %workdirectory%\%arch%\PXE\Boot\BCD -set {bootmgr} timeout 2 bcdedit -store %workdirectory%\%arch%\PXE\Boot\BCD -set {bootmgr} displayorder %guid% |
Итог
В результате работы скриптов у получается следующая структура каталогов:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | +---fwfiles | efisys.bin | etfsboot.com | +---media +---mount \---PXE | bootmgr.exe | pxeboot.0 | winpeamd64.wim | \---Boot boot.sdi BCD |
Настройка сервера загрузки
Копируем содержимое каталога PXE в корень tftp каталога сервера загрузки
Так как windows использует другой разделитель для своих путей, то нам необходимо сделать карту символов для tftp сервера, для этого в файле конфигурации /etc/default/tftp-hpa вносим изменения и указываем путь к файлу с картой:
Сервис tftpd-hpa
1 2 3 4 5 6 | # /etc/default/tftpd-hpa TFTP_USERNAME="nobody" TFTP_DIRECTORY="/srv/template" TFTP_ADDRESS="0.0.0.0:69" TFTP_OPTIONS="--secure -v -c -m /srv/template/tftpd.remap" |
Создаем файл tftpd.remap с таким содержимым:
1 | rg \\ / |
Это правило будет заменять все обратные слешы на прямые, затем помещаем этот файл также в корень tftp сервера (чтобы нам легко было изменить в случае чего)
Перезапускаем tftp-hpa сервер
1 | systemctl restart tftpd-hpa |
Настройка сервиса общих каталогов Samba
Для установки нам еще понадобится сервер samba,в debian и убунту он ставится командой
1 | apt install samba |
в конфигурационном файле /etc/samba/smb.conf добавляем секцию описывающую наш общий каталог:
1 2 3 4 | [image] path = /srv/template read only = no guest ok = yes |
Образ Window 7 и установовчный скрипт setup.bat
Теперь распаковываем образ с win7 и помещаем каталог sources в публичный каталог samba.
Создаем скрипт start.bat, в котором запускаем програму setup.exe из распакованного sources
1 | Z:\win7x64\setup.exe |
Последнее что нам осталось — это прописать в меню загрузки пункт с winpe:
1 2 3 | default Winpe label Winpe kernel pxeboot.0 |
В итоге все получилось
Скрипты в GitHub
После этого у нас загрузившись через PXE начнется загрузка WinPE: