Установка Windows через PXE

Очень часто возникает необходимость устанавливать операционную систему Windows, в рамках одного компьютера можно воспользоваться диском, флешкой, я предлагаю способ устанавливать эту операционную систему через локальную сеть, в этом нам поможет сервер сетевой загрузки, рассмотренный в статьях тут и тут
Все нижеописанные скрипты я поместил в репозиторий git

План работ

1. Устанавливаем среду сборки образов предустановки WinPE
2. Выполняем сборку wim образа
3. Создаем конфигурацию загрузки на сервере загрузки

WinPE через PXE

Для того чтобы поставить Windows нам потребуется система предустановки Windows, которая называется WinPE.
Ее можно сделать скачав пакет ADK с сайта Microsoft
После установки можно приступать к сборке образа

Сборка образа 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, в процессе работы в каталоге который мы указали появится подкаталог с названием архитектуры.

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:
winpe_boot_boot.sdi
winpe_boot_winpe_wim
winpe_setup_win7

Добавить комментарий

Войти с помощью: 

Этот сайт использует Akismet для борьбы со спамом. Узнайте как обрабатываются ваши данные комментариев.