iPXE без лишних слов, но с большим количеством пояснений

Страницы:  1

Ответить
 

Professor Seleznov


Для начала определимся, что такое ipxe:
iPXE (open-source network boot firmware) — это загрузчик с открытым исходным кодом, предназначенный для сетевой загрузки операционных систем и других файлов. Он расширяет возможности стандартного PXE (Preboot Execution Environment), добавляя расширенные функции и гибкость в процесс загрузки по сети.
Статей на тему pxe, pxelinux, ipxe-загрузчиков, как и готовых решений в сети много, но:
  • Готовые решения зачастую платные
  • pxeboot, pxelinux.0 и оные не умеют в UEFI (или я не смог их подружить), а на дворе 2026 год и новых Legacy компьютеров на полках магазинов вы вряд ли найдёте
  • Те статьи, что находил я, чаще всего заточены под Legacy загрузку с использованием ipxe через загрузку memdisk (о нём ниже), а загрузчики UEFI не работают с memdisk, поэтому в статье и проекте чаще всего будет использован http и sanboot (хоть и у него есть свои нюансы) и в отличии от прямой загрузки .iso в ОЗУ, он гибче (об этом тоже по ходу статьи)
Оглавление:

Начало
Грузить по сети мы будем установщик Windows через WDS (отдельным пунктом загрузчика ipxe), Veeam, для бекапов и прочего, WinPE, Memtest, Kaspersky (KRD), установку Linux Ubuntu 24.04 (как ручную, так и автоматическую через autoinstaller), ручную установку Linux Ubuntu Server, также установку Linux Debian-а, остальные пункты меню можно добавлять по аналогии на ваш вкус и под ваши потребности
Небольшой спойлер конечной стадии проекта:
pic
iPXE
Как и в любом проекте, всё начинается с установки ОС, так как мне привычнее ubuntu, я поставил Linux Ubuntu 24.04.4 без графической оболочки (она нам не нужна), вы в праве поставить любой другой дистрибутив Linux
Что понадобится в проекте?
  • ipxe
  • TFTP-сервер
  • HTTP-сервер
  • TAG (iSCSI таргет)
  • NFS
  • SAMBA

Настройка DHCP
DHCP ставить не нужно, если он у вас на контроллере домена или на роутере, нужно будет настроить правила 66, 67, 60 и политики, сразу же с политик и правил и начнём:
Когда вы включаете компьютер, тот отправляет широковещательный запрос на DHCP сервер и ждёт от него таблицу параметров загрузки, поэтому на DHCP сервере создадим две политики для Legacy и UEFI соответственно:
pic
политики
В свойствах политики Legacy добавляем классы поставщика, именно они определяют, каким компьютерам какой файл 67-ым правилом отдавать:
pic
классы поставщика
Отдельная благодарность статье за представленное решение, классы поставщиков вы можете посмотреть по ссылке, смысл в том, что цифрами 14, 04, 05, 00 и т.д. мы объясняем клиенту, какой файл ему брать в момент загрузки по сети
КРАЙНЕ ВАЖНО: При создании класса поставщика обязательно ставить галочку "Добавить подстановочный знак в конце (*)", поскольку перечислить всевозможные классы почти невозможно, каждый производитель может добавлять свой класс, который вероятнее всего есть в статье
Добавляем во вкладке "Параметры" 66, 67 и 60-ые правила:
pic
Правило 66
pic
правило 67
pic
правило 60
Правило 60 пустое, поскольку, мы его укажем в политике класса поставщика, а именно "PXEClient:BIOS(14)" (например), но включить его обязательно
В UEFI политике всё тоже самое, за исключением номеров классов поставщиков:
pic
классы поставщиков UEFI
КРАЙНЕ ВАЖНО: При создании класса поставщика обязательно ставить галочку "Добавить подстановочный знак в конце (*)", поскольку перечислить всевозможные классы почти невозможно, каждый производитель может добавлять свой класс, который вероятнее всего есть в статье
Сами классы поставщика настраиваются, если нажать правой кнопкой мыши по ipv4 и нажать "Определить классы поставщиков...":
pic
классы поставщиков
Внутри данной области буфер обмена не работает, а заполняется только поле ASCII руками:
pic
пример готового класса поставщиков
После чего, DHCP сервер в работе больше не участвует, передавая всю работу ipxe-серверу

Первичная настройка и TFTP
После первичной загрузки Linux обязательно сделать стандартные команды по обновлению библиотек в Linux:
sudo apt install -y && sudo apt upgrade -y
Начнём с настройки и установки TFTP, суть в том, что он будет отдавать .ipxe файл и передавать управление загрузчиком самому ipxe, больше через него ничего кроме .ipxe передаваться не будет, поскольку протокол очень медленный
Вводим команду для установки tftp:
sudo apt install tftpd-hpa -y
Настройка у tftp минимальная, поэтому сразу же и сделаем её:
sudo nano /etc/default/tftpd-hpa
И вносим туда 4 строчки:
TFTP_USERNAME="tftp" #пользователь для авторизации
TFTP_DIRECTORY="/srv/tftp" # папка, где будут лежать передаваемые с помощью tftp файлы
TFTP_ADDRESS=":69" #слушать все сетевые интерфейсы по порту 69 (порт по умолчанию)
TFTP_OPTIONS="--secure" #режим безопасности

HTTP-сервер
Так как tftp будет передавать только .ipxe файлы (из-за скорости протокола), то для передачи больших файлов таких как установщик Linux или WinPE будем использовать http-сервер, в моём случае это Apache2 (вы можете использовать любой другой, к примеру nginx), установим http-сервер:
sudo apt install apache2
Убедимся в наличии строк в конфиг файле откуда разрешать скачивание файлов по 80 порту, открываем файл:
sudo nano /etc/apache2/apache2.conf
Ищем эти строки: (если нету, добавьте)
<Directory /var/www/>
Options Indexes FollowSymLinks
AllowOverride None
Require all granted
</Directory>
Остальные строчки можно оставить по умолчанию, либо настроить под себя используя документацию вашего http сервера

iPXE
Для сборки ipxe используется официальный дистрибутив с гитхаба, поэтому сразу скачаем и подготовим как для Legacy файл undionly.kkpxe так и для UEFI файл ipxe.efi, именно эти два файла будут отдаваться 67-ым правилом DHCP сервера, выполним поочерёдно ряд команд:
sudo apt install git -y #доустановим, если нету
sudo git clone https://github.com/ipxe/ipxe.git
cd ipxe/src #переходим в директорию ipxe
sudo nano start.ipxe #создадим файл с расширением .ipxe, назвать файл можете как хотите
в файл start.ipxe добавить строчки:
#!ipxe
dhcp
chain tftp://ip-адрес вашего ipxe-сервера/boot.ipxe
Обратите внимание, что все скрипты для ipxe начинаются с #!ipxe, данный файл отдаёт загрузчик boot.ipxe, в котором можно настроить параметры под себя, указать переменные в ip адреса (об этом ниже), добавить цвет текста, обводки, выделения, а также возможность добавить фоновую картинку и т.д. С полным списком возможностей можете ознакомиться здесь
p.s: мы у себя оставили всё по умолчанию, поскольку добавление фонового изображения полностью ломало графику загрузчика из-за разного разрешения экрана на мониторах и поправить эту проблемы мы не смогли
Прежде чем перейдём к созданию меню загрузчика ipxe, сначала скомпилируем два файла ipxe.efi и undionly.kkpxe
У меня .kpxe ни на одной BIOS машине не завёлся, поэтому .kkpxe, в чём отличие каждого файла загрузчика вы можете посмотреть здесь
Вводим команды:
sudo make bin-x86_64-efi/ipxe.efi EMBED=start.ipxe #Для UEFI
sudo make bin-i386-pcbios/undionly.kkpxe EMBED=start.ipxe #Для BIOS
Сами загрузчики boot.ipxe, menu.ipxe будут отдаваться с помощью tftp сервера, поэтому, после завершения компиляции переносим файлы ipxe.efi и undionly.kkpxe в директорию tftp созданную ранее:
cp bin-x86_64-efi/ipxe.efi /srv/tftp/
cp bin-i386-pcbios/undionly.kkpxe /srv/tftp/
С помощью программы mc или с помощью команды cd переходим в директорию
cd /srv/tftp/
ВАЖНО! При создании файлов ipxe.efi и undionly.kkpxe они компилируются, поэтому если у вас поменяется ip-адрес ipxe сервера или название файла, нужно будет перекомпилировать файлы командами выше повторно!
После компилирования и переноса файлов, создаём в директории /srv/tftp два файла, первый с названием boot.ipxe:
sudo nano boot.ipxe
Моё содержимое boot.ipxe (ваше может сильно отличаться):
#!ipxe
# Глобальные параметры
set httpServer http://10.50.50.50:80 # Задание адреса HTTP сервера
set ${next-server} 10.50.50.50:80 # Задание адреса
# Переход к файлу с основным меню
:next
chain --replace --autofree menu.ipxe
Второй файл menu.ipxe, заметьте, что на него направляет boot.ipxe в 8 строчке выше, файл menu.ipxe и будет тем меню, в котором можно выбирать пункты меню для загрузки, общий вид файла menu.ipxe:

menu.ipxe

#!ipxe
######## Главное меню ########
set url http://${next-server}/
set srvip ${net0/next-server}
set netX/next-server 10.50.50.51
set root_path /pxeboot
set server_ip 10.50.50.50
menu
item exit Exit iPXE and continue BIOS boot
item --gap -- ----------- iPXE Install Menu ---------------
item veeam Veeam Recovery Media (UEFI)
item strelec_uefi WinPE Strelec (UEFI)
item strelec_legacy WinPE Strelec (LEGACY)
item memtest Memtest
item --gap -- ----------- Antivirus -----------------------
item krd Kaspersky Remote Disk
item --gap -- ------------Windows Installer ------------------
item win10 Windows 10 installer
item --gap -- ----------- Linux Installer ------------------
item ubuntu Ubuntu Installer 24
item ubuntua Ubuntu Installer 24 (AUTOINSTALL)
item ubuntuserver Ubuntu Server Installer 24
item debian Debian Netinstall
item --gap -- -------------------------------------------------
choose target && goto ${target}
item --gap -- -------- iPXE Utilites --------
item -k c config Start interactive (c)onfiguration tool
item -k s shell Start (S)hell iPXE
choose -d exit -t ${menu-timeout} selected
goto ${selected}
:veeam
sanboot ${httpServer}/images/veem/Veeam.iso || goto error
:strelec_uefi
sanboot --drive 0xe0 ${httpServer}/images/strelecuefi/strelec.iso || goto error
:strelec_legacy
imgfree
kernel ${httpServer}/images/strelec/wimboot gui
initrd -n BCD ${httpServer}/images/strelec/boot/BCD BCD
initrd -n boot.sdi ${httpServer}/images/strelec/boot/boot.sdi boot.sdi
initrd -n BOOTMGR ${httpServer}/images/strelec/BOOTMGR BOOTMGR
initrd -n strelec10x64.wim ${httpServer}/images/strelec/sources/strelec10x64.wim strelec10x64.wim
imgstat
boot || goto error
:memtest
sanboot ${httpServer}/images/memtest/memtest.iso || goto failed
:krd
kernel ${httpServer}/images/krd/live/vmlinuz || goto error
initrd ${httpServer}/images/krd/live/initrd.img || goto error
imgargs vmlinuz initrd=initrd boot=live components locales=ru_RU.UTF-8 netboot=nfs nfsroot=${server_ip}:${root_path}/krd || goto error
boot
:ubuntu
set os_root ubuntu24
kernel ${httpServer}/images/ubuntu24/vmlinuz
initrd ${httpServer}/images/ubuntu24/initrd || goto error
imgargs vmlinuz initrd=initrd ip=dhcp boot=casper netboot=nfs nfsroot=${server_ip}:${root_path}/${os_root} || goto error
boot
:ubuntua
set os_root ubuntu24
kernel ${httpServer}/images/ubuntu24/vmlinuz || goto error
initrd ${httpServer}/images/ubuntu24/initrd || goto error
imgargs vmlinuz initrd=initrd netboot=nfs ip=dhcp nfsroot=${server_ip}:${root_path}/${os_root} systemd.mask=systemd-networkd-wait-online.service \
systemd.mask=NetworkManager-wait-online.service \
network-config=disabled \ autoinstall ds=nocloud-net;s=http://10.50.50.50/images/ubuntu24/autoinstall/ || goto error
boot
:ubuntuserver
set os_root ubuntuserver24
kernel ${httpServer}/images/ubuntuserver24/vmlinuz || goto error
initrd ${httpServer}/images/ubuntuserver24/initrd || goto error
imgargs vmlinuz initrd=initrd root=/dev/nfs netboot=nfs ip=dhcp nfsroot=${server_ip}:${root_path}/${os_root} || goto error
boot
:debian
os_root debian13
kernel ${httpServer}/images/debian13/install.amd/vmlinuz || goto error
initrd ${httpServer}/images/debian13/install.amd/initrd.gz || goto error
boot
:win10
imgexec tftp://${netX/next-server}/boot/x64/wdsmgfw.efi || goto error
boot || goto failed
:exit
echo Boot from disk...
sleep 2
exit
# При ошибках выход на командную строку
:error
echo Failed - have error
sleep 1
goto shell
Как видно по содержимому файла, в каждом пункте кроме Windows 10 installer используется http протокол, так как он работает быстрее и стабильнее tftp, а sanboot работает только в UEFI
Структура и смысл файла крайне прост, в самом верху, после #!ipxe задаются переменные, вы можете задать их в boot.ipxe, но так как menu.ipxe вы будете редактировать чаще, удобнее задать переменные здесь
Дальше настраивается структура меню, через item, принцип создания меню идёт как
item - название - выводимый текст:
menu
item exit Exit iPXE and continue BIOS boot
item --gap -- ----------- iPXE Install Menu ---------------
item veeam Veeam Recovery Media (UEFI)
А уже под структурой меню выдаётся что и как грузить:
:veeam
sanboot ${httpServer}/images/veem/Veeam.iso || goto error

Veeam
На примере загрузки veeam-а, через sanboot грузится Veeam.iso из директории http сервера - ${httpServer}/images/veem/ физически на сервере все директории лежат по пути: /var/www/html/images/
ВАЖНО! Директории images в /var/www/html/images/ у вас может не быть, поэтому командой mkdir вы можете её создать
как видим, если выбрать veeam и загрузиться, то всё работает корректно:
pic
veeam.iso
Так как мы подключили его через sanboot, то загрузился не весь Veeam, а только самое необходимое, поэтому в пункте Bare Metal Recovery нам доступен только Network Stage
С Veeam всё, идём дальше

Strelec WinPE UEFI
Как не трудно догадаться, через: item --gap – ----------- iPXE Install Menu ---------------
выводится текстовое поле без права его выбрать, для визуального отделения от остальных пунктов меню по их логике, антивирусы в антивирусы, Linux в Linux и т.д.
Следующим пунктом добавим Strelec WinPE для UEFI с помощью загрузки .iso образа напрямую как и с Veeam, но из-за принципа работы sanboot, он не грузит по сети все 5гб, а только самое необходимое для загрузки, из-за чего диск и Minst папка со всем необходимым софтом strelec не будут загружены, даже если мы явно через аргумент --filename укажем, что грузить, частично это можно обойти если указать аргумент --drive 0xA0, тогда он будет работать как CD-ROM, но данный метод нас не устраивает, поскольку это долго и это 5гб по сети в ОЗУ, поэтому грузить будем командой:
:strelec_uefi
sanboot --drive 0xe0 ${httpServer}/images/strelecuefi/strelec.iso || goto error
А уже после загрузки через WinPE, модифицировав .wim файл добавим в автозагрузку скрипт, который загрузит и примонтирует необходимые нам диски, но прежде чем модифицировать .wim скриптом, создадим то, что нужно примонтировать и запустить, для этого установим и настроим samba-сервер и TAG

TGT и SAMBA
Сделаем две последовательных команды:
sudo apt install tgt -y #iscsi таргет
sudo apt install samba -y #samba сервер
По порядку, что и зачем нужно:
Отмечу, что TGT выбран из-за простоты и удобства настройки
TGT будет выступать в роли iscsi таргета, который будет подключать "физический" диск strelec по сети, из удобств такого метода это возможность в любой момент модифицировать данный iscsi диск, подключив его к windows с помощью инициатора iscsi поэтому перейдём к его настройке:
sudo nano /etc/tgt/targets.conf
Данный файл можете полностью очистить, нам нужно добавить лишь 5 строк:
include /etc/tgt/conf.d/*.conf #где искать конфиг
<target iqn.2026-02.local.dom.ipxe:strelec> #название iscsi диска (КРИТИЧНО!)
backing-store /disk2/strelec.img #где физически лежит диск на сервере
incominguser iscsi iscsi #логин и пароль (задайте любой) для подключения iscsi (не обязательно)
</target>
Почему название iscsi диска именно iqn.2026-02.local.dom.ipxe:strelec и почему это так критично:
iscsi диск имеет свою логику в названии, которое идёт так: iqn.год-месяц.домен компьютера:название, часть после двоеточия можете уже называть свободно
Как мы видим, в директории disk2/ лежит strelec.img, создадим его с помощью нескольких команд:
mkdir /disk2/strelec #создаём каталог strelec в директории /disk2
touch /disk2/strelec/strelec.img #создаём пустой файл образа с расширением .img
truncate -s 6G /disk2/strelec/strelec.img #выдаём размер файла strelec.img 6 Гб
sudo systemctl restart tgt #перезапускаем службу tgt
На самом деле strelec.img вы можете создавать где угодно, просто затем нацельте на него tgt в третьей строчке файла targets.conf и после любых изменений перезапускайте службу
После перезапуска службы tgt проще всего будет настроить образ на windows, поэтому запускаем инициатор iscsi в ОС Windows и подключаем наш диск по ip адресу Linux ipxe сервера в поле "Объект" вводите ip адрес и нажав "Быстрое подключение" находите там ваш iscsi диск:
pic
iscsi
ВАЖНО! Если вы поставили пароль в 4 строчке файла targets.conf, не забудьте ввести его в "Разрешить вход CHAP" во вкладке "дополнительно"
После подключения iscsi в управлении дисками появится новый неинициализированный диск в статусе "не в сети". ОС Windows автоматически предложит создать новый том и задать диску букву, на этом моменте заострять внимание не буду, поскольку можно оставить настройки по умолчанию.
Дальше скачиваете любой готовый WinPE .iso образ, я же буду проводить дальнейшую работу на примере strelec 2021 (можно новее, не принципиально, методика одна)
После скачивания WinPE образа лучше отключить антивирус, поскольку strelec как и любая другая готовая WinPE сборка с софтом всеми антивирусами считается вредоносной из-за различного ПО по типу сброса паролей администраторов или killprocess и т.д. и просто переносим содержимое образа в корень нового диска, получится нечто подобное:
pic
содержимое iscsi-диска
На этом с iscsi и tgt всё
Переходим к SAMBA-серверу:
Если вы планируете через WinPE разворачивать бекапы или делать их, то в данном случае лучше воспользоваться протоколом samba, который также как и iscsi диск будет подключаться в момент загрузки, установим samba-сервер:
sudo apt install samba -y #установка samba
Сразу же настроим:
sudo nano /etc/samba/smb.conf
В данном файле закомментируйте всё (или очистите его), и в самый низ списка добавьте строчки:
[global]
workgroup = WORKGROUP
server string = Samba Server %v
server role = standalone server
server min protocol = SMB2_10
client max protocol = SMB3
client min protocol = SMB2_10
encrypt passwords = true
restrict anonymous = 2
netbios name = vud-server
security = user
map to guest = never
max log size = 1000
usershare allow guests = Yes
dos charset = 866
unix charset = utf8
lanman auth = yes
ntlm auth = yes
[obraz_ro]
comment = ro
path = /disk2/obraz_ro
public = yes
writable = yes
read only = no
guest ok = yes
create mask = 0775
directory mask = 0775
force create mode = 0775
force directory mode = 0775
[obraz_rw]
comment = rw
path = /disk2/obraz_rw
public = no
writable = yes
read only = yes
guest ok = no
valid users = pxe, samba #имя пользователя кому можно подключаться по smb
write list = samba
create mask = 0775
directory mask = 0775
force create mode = 0775
force directory mode = 0775
inherit owner = yes
В данном конфиге мы отдаём по протоколу samba две папки, obraz_rw и obraz_ro, как не сложно догадаться, одна на чтение, вторая на запись, идея в том, что образы и бекап-файлы будут лежать в ro (поскольку акронису чтения достаточно), а в rw будем заливать бекап клиентской машины, которая загрузилась по ipxe
С SAMBA всё, идём дальше

Модификация wim
Дальше нам необходимо вшить в образ свой скрипт для монтирования iscsi и samba в момент загрузки образа по ipxe, поскольку sanboot его сам не загрузит
Открываем .iso образ с помощью UltraISO или просто распаковываем его в папку (можно даже на сам iscsi диск), и в папке SSTR лежат .wim образы, которые и являются ОС WinPE при загрузке. Находим там strelec10x64.wim и открываем его с помощью того же UltraISO или 7zip, по структуре папок вы заметите, что это обычная ОС, идём по пути: Users\Default\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup\ (если в вашем образе нет Programs\Startup - просто создайте эти две папки) и создаём в ней обычный .bat скрипт, я назвал его start ISCSI.bat, его содержимое:
#пинг является "паузой" для ожидания
ping 127.0.0.1 -n 2
#стартуем службу iscsi (по умолчанию она выключена)
sc start MSiSCSI
#снова ждём
ping 127.0.0.1 -n 5
#нацеливаем "таргетируем" iscsi
iscsicli QAddTarget iqn.2026-02.local.dom.ipxe:strelec 10.50.50.50
ping 127.0.0.1 -n 5
#подключаем "монтируем" диск в системе
iscsicli QLoginTarget iqn.2026-02.local.dom.ipxe:strelec iscsi iscsi
#последняя пауза
ping 127.0.0.1 -n 5
#так как нам неизвестно какой буквой будет диск,
#стартуем ПО MInstlink, у strelec она по умолчанию лежит в system32
#%windir% - является "поиском windows директории"
cmd.exe /c "%windir%\system32\MInstLink.exe
#перед подключением SAMBA попингуем машину, на которой она настроена
ping 10.50.50.50 -n 3
#подключаем папку как сетевой диск K
net use K: \\10.50.50.50\obraz_ro /user:Логин и пароль пользователя у которого есть доступ к папке
# пауза
ping 10.50.50.50 -n 3
#подключаем папку как сетевой диск N
net use N: \\10.50.50.50\obraz_rw /user:Логин и пароль пользователя у которого есть доступ к папке
Пауза между действиями нужна, поскольку запуск службы или таргет на iscsi могут не успеть отработать, а мы уже пытаемся авторизоваться.
Последнее, что можно сделать, это в месте где вы распаковали iso образ запустить ПО MInst.exe, которое находится в SSTR\MInst и добавить VNC в автозапуск (нужно, если планируете управлять WinPE удалённо через DameWare или VNC на Windows. На официальном сайте strelec есть инструкция как туда добавлять свой софт
В данном этапе от iso образа больше ничего не нужно, сохраняем новый .wim с таким же названием и через UltraISO копируем .wim в SSTR с заменой, после чего копируем ваш .iso образ в директорию Linux, проще всего это сделать через команду sc в cmd или WinSCPPortable и добавляем его на http-сервер Linux по пути /var/www/html/images, чтобы не плодить здесь неразбериху, создаём директорию для каждого софта отдельно, поэтому в /var/www/html/images я создал директорию strelecuefi и перенёс в неё .iso образ menu.ipxe добавим строчки:
:strelec_uefi
sanboot --drive 0xe0 ${httpServer}/images/strelecuefi/strelec.iso || goto error
Если всё правильно, то при загрузке ipxe в меню будет пункт WinPE Strelec (UEFI), выбрав его загрузится WinPE образ и в shell:startup мы увидим наш скрипт, который автоматически отработает
Ниже я покажу два скриншота, без скрипта и после скрипта:
pic
загрузка sanboot без скрипта
pic
загрузка sanboot со скриптом
Как видно по скриншотам, запустился и определился весь софт и даже VNC (справа снизу в трее)

Strelec WinPE LEGACY
И если с UEFI WinPE на этом всё, то с Legacy так просто не выйдет
memdisk нас не устраивает, потому что WinPE образ может весить 5-6 гб, и столько ОЗУ в Legacy компьютерах может не быть
а sanboot не умеет грузиться в Legacy, поэтому воспользуемся wimboot-ом, стандартным загрузчиком windows, скачиваем его с гитхаба:
wget https://github.com/ipxe/wimboot/releases/download/v2.9.0/wimboot
И переносим его в директорию http-сервера по пути /var/www/images/strelec
в menu.ipxe добавляем:
:strelec_legacy
imgfree
kernel ${httpServer}/images/strelec/wimboot gui
initrd -n BCD ${httpServer}/images/strelec/boot/BCD BCD
initrd -n boot.sdi ${httpServer}/images/strelec/boot/boot.sdi boot.sdi
initrd -n BOOTMGR ${httpServer}/images/strelec/BOOTMGR BOOTMGR
initrd -n strelec10x64.wim ${httpServer}/images/strelec/sources/strelec10x64.wim strelec10x64.wim
imgstat
boot || goto error
Возвращаемся в папку, где мы распаковали iso образ и модифицировали .wim образ и приводим её к следующему виду:
pic
содержимое образа для legacy
Использовать стандартные пути SSTR мы не можем, поскольку в wimboot нет SSTR и там используются стандартные boot и sources пути
Как видно в menu.ipxe, BCD и boot.sdi запускаются из папки boot, можете их перенести из SSTR в boot, а strelec10x64.wim запускается из sources, поэтому переименовываем SSTR в sources
!КРИТИЧНО ВАЖНО! регистр для Linux и wimboot важен, поэтому если вы назвали файл BOOTMGR, а в menu.ipxe написали bootmgr ipxe выдаст ошибку "File not found" регистр директорий также критично важен!
Теперь нам необходимо модифицировать BCD, запускаем cmd от имени администратора и последовательно вводим команды:
set BCDSTORE=C:\1\pxe\Strelec\boot\BCD (у вас свой путь к папке boot в корне куда распаковали iso)
#Исправляем путь к boot.sdi
bcdedit /store %BCDSTORE% /set {ramdiskoptions} ramdisksdidevice boot
bcdedit /store %BCDSTORE% /set {ramdiskoptions} ramdisksdipath \boot\boot.sdi
#Исправляем пути к wim
bcdedit /store %BCDSTORE% /set {default} device ramdisk=[boot]\sources\strelec10x64.wim,{ramdiskoptions}
bcdedit /store %BCDSTORE% /set {default} osdevice ramdisk=[boot]\sources\strelec10x64.wim,{ramdiskoptions}
p.s одной модификации может не хватить, поскольку загрузчик может ссылаться или искать файлы шрифтов или другие .wim образы, их желательно очистить по аналогии:

Дополнительная очистка BCD, если способ выше всё равно падает в ошибку \SSTR\BCD

set BCDSTORE=C:\1\pxe\Strelec\boot\BCD (у вас свой путь к папке boot в корне куда распаковали iso)
#Узнаём GUID вашего образа
bcdedit /store %BCDSTORE% /create /d "Strelec Win10 x64" /application osloader
#копируем GUID и заменяем его вместо {GUID}, с фигурными скобками
#Вычищаем BCD
bcdedit /store %BCDSTORE% /set {GUID} device ramdisk=[boot]\SSTR\strelec10x64.wim,{ramdiskoptions}
bcdedit /store %BCDSTORE% /set {GUID} osdevice ramdisk=[boot]\SSTR\strelec10x64.wim,{ramdiskoptions}
bcdedit /store %BCDSTORE% /set {GUID} path \windows\system32\boot\winload.exe
bcdedit /store %BCDSTORE% /set {GUID} systemroot \windows
bcdedit /store %BCDSTORE% /set {GUID} detecthal Yes
bcdedit /store %BCDSTORE% /set {GUID} winpe Yes
bcdedit /store %BCDSTORE% /set {GUID} nointegritychecks Yes
bcdedit /store %BCDSTORE% /set {GUID} testsigning Yes
bcdedit /store %BCDSTORE% /set {GUID} nx AlwaysOff
#Удаляем strelec10 x86
bcdedit /store %BCDSTORE% /delete {GUID} /f
#Удаляем strelec8 x86
bcdedit /store %BCDSTORE% /delete {GUID} /f
#Удаляем strelec8NE x86
bcdedit /store %BCDSTORE% /delete {GUID} /f
#Обновляем displayorder - только x64
bcdedit /store %BCDSTORE% /displayorder {default}
#Меню смысла нет показывать если запись одна
bcdedit /store %BCDSTORE% /set {bootmgr} displaybootmenu No
#Удаляем шрифты
bcdedit /store %BCDSTORE% /deletevalue {globalsettings} fontpath
Останется только в корне образа заменить bootmgr, взять его можете из любого iso образа установщика windows 10
Снова через UltraISO создаём iso образ и копируем его на Linux ipxe-сервер, по пути /var/www/images/strelec и распаковываем его там:
sudo 7z x strelec.iso -y #распаковать iso
После чего iso образ нам не нужен, удаляем его. В итоге получится следующий вид:
pic
содержимое каталога strelec для загрузки по legacy
На этом настройка Legacy завершена, при загрузке через ipxe и выборе пункта меню WinPE Strelec (LEGACY) вы получите ту же картину, что и при UEFI с автоматическим запуском скрипта, VNC и монтировании iscsi диска

Kaspersky Remote Disk
Перейдём к Kaspersky Remote Disk и скрипт с автоматическим обновлением/актуализацией дистрибутива раз в неделю
Так как касперский часто обновляет свои базы вирусов, нужно как можно чаще держать его в актуальном состоянии, руками делать подобное нам не подходит, поэтому к нам на помощь приходит планировщик задач Linux - crontab, в Ubuntu 24.04.4 он уже установлен и готов к работе, так как у crontab своя логика и своё понимание когда и что отрабатывать, в сети есть калькулятор crontab, но обо всём по порядку
Внесём в menu.ipxe следующие строки:
:krd
kernel ${httpServer}/images/krd/live/vmlinuz || goto error
initrd ${httpServer}/images/krd/live/initrd.img || goto error
imgargs vmlinuz initrd=initrd boot=live components locales=ru_RU.UTF-8 netboot=nfs nfsroot=${server_ip}:${root_path}/krd || goto error
boot
iso образ касперского это Linux, а ipxe изначально создавался под загрузку Linux по сети, поэтому добавлять Linux системы в ipxe довольно просто, нужен лишь NFS и объяснить что откуда и как грузить
Скачиваем с официального сайта Kaspersky Remote Disk и распаковываем образ в /var/www/html/images/krd и оставляем только 2 файла в каталоге live, vmlinuz и initrd.img, остальное можно удалить, поскольку после выдачи ядра и системы остальное (диск и базы данных) мы будем отдавать через nfs, поэтому его и установим и настроим:
sudo apt install nfs-kernel-server #установить nfs-сервер
sudo nano /etc/exports #переходим к настройке nfs
В файле /etc/exports можно закомментировать или очистить всё и добавляем строчку:
/pxeboot *(ro,sync,no_wdelay,insecure_locks,no_root_squash,insecure,no_subtree_check)
Что делает строчка:
/pxeboot - Папка на которую нацелен nfs (создаётся в корне каталога /, название какое хотите)
* - Разрешить подключение с любого IP-адреса (лучше завернуть в ip адрес вашей сети с маской)
ro - Read-only — только чтение, запись запрещена
sync - Запись на диск синхронно — данные сбрасываются сразу
no_wdelay - Не задерживать запись в ожидании групповых операций
insecure_locks - Не требовать аутентификацию для блокировок файлов
no_root_squash - root на клиенте = root на сервере — не понижать права root
insecure - Разрешить подключения с портов выше 1024 (не только привилегированных)
no_subtree_check - Не проверять что запрашиваемый файл находится внутри экспортируемого дерева
Это вся настройка nfs которая необходима, теперь переходим в корень /pxeboot и создав директорию krd переносим в неё наш iso образ Kaspersky Remote Disk и распаковываем:
sudo 7z x krd.iso
После чего сам iso образ удаляем, а структуру оставляем как есть, получится нечто такое:
pic
содержимое каталога krd
На этом настройка Kaspersky Remote Disk завершена, и при выборе в ipxe Kaspersky Remote Disk автоматически загрузится и дойдёт до рабочего стола, работает как в Legacy так и в UEFI:
pic
krd через ipxe
Как видите диск касперского подключён и никаких дополнительных скриптов для подключения диска или монтирования iscsi как было с sanboot в strelec нам не нужно, всё работает благодаря nfs
Поэтому, перейдём к настройке скрипта, который будет автоматически скачивать iso образ с официального сайта раз в неделю, копировать образ в определённую папку, распаковывать его, удалять iso образ из папки после завершения и писать лог в /var/log, для этого создадим где вам удобно папку script и сам скрипт, я это сделаю в /pxeboot/script:
sudo nano /pxeboot/script/install.krd.sh
Содержимое файла install.krd.sh:
#!/bin/bash
ISO_URL="https://rescuedisk.s.kaspersky-labs.com/latest/krd.iso"
ISO_FILE="krd.iso"
EXTRACT_DIR="/pxeboot/krd"
# Загрузка
echo "Загружаю ISO..."
wget -O "$ISO_FILE" "$ISO_URL"
if [ $? -ne 0 ]; then
echo "Ошибка загрузки"
exit 1
fi
# Распаковка с помощью 7z
echo "Распаковываю ISO..."
7z x -y "$ISO_FILE" -o"$EXTRACT_DIR/"
# Удаление ISO
rm -f "$ISO_FILE"
echo "Готово! Содержимое в: $EXTRACT_DIR"
Не забудьте сделать скрипт активным:
sudo chmod +x /pxeboot/scripts/install.krd.sh
Последним пунктом останется добавить его в планировщик, вводим:
sudo crontab -e #редактировать crontab
И в самый низ списка добавляем строчки:
# Обновлять KRD каждый понедельник в 15 часов дня
00 15 * * 1 /pxeboot/script/install_krd.sh > /var/log/install_krd.log 2>&1
Теперь 1 раз в неделю в 15 часов дня будет срабатывать скрипт и записывать лог в /var/log/install_krd.log, своё время и свою дату вы можете взять из калькулятора crontab

WDS
На этом с Kaspersky Remote Disk закончено, перейдём к WDS
Если у вас есть сервер WDS, то подружить его с ipxe крайне просто, добавим в menu.ipxe строчки:
:win10
imgexec tftp://${netX/next-server}/boot/x64/wdsmgfw.efi || goto error
boot || goto failed
Простота использования WDS в том, что при выборе пункта Windows 10 installer в ipxe, он просто передаёт управление к вашему WDS серверу и дальше всю работу на себя берёт WDS

Linux Ubuntu 24.04.4 autoinstall
Последнее, на чём хотелось бы акцентировать внимание в проекте, это автоматическую установку Linux Ubuntu 24.04.4 (с 25 версией тоже работает)
Добавим в menu.ipxe блок:
:ubuntua
set os_root ubuntu24
kernel ${httpServer}/images/ubuntu24/vmlinuz || goto error
initrd ${httpServer}/images/ubuntu24/initrd || goto error
imgargs vmlinuz initrd=initrd netboot=nfs ip=dhcp nfsroot=${server_ip}:${root_path}/${os_root} systemd.mask=systemd-networkd-wait-online.service \
systemd.mask=NetworkManager-wait-online.service \
network-config=disabled \ autoinstall ds=nocloud-net;s=http://10.50.50.50/images/ubuntu24/autoinstall/ || goto error
boot
В блоке остановлю своё внимание на пояснении только четырёх важнейших аспектах, поскольку остальные никак не отличаются от krd:
  • systemd.mask=systemd-networkd-wait-online.service - отключить ожидание сети при старте
  • systemd systemd.mask=NetworkManager-wait-online.service - отключить ожидание NetworkManager при старте
  • systemd network-config=disabled - отключить cloud-init настройку сети
  • autoinstall ds=nocloud-net;s=http://10.50.50.50/images/ubuntu24/autoinstall/ - путь, откуда Linux Ubuntu брать файл автоматической установки
Прежде чем углубиться в объяснение зачем мы отключаем NetworkManager и cloud-init, объясню структуру, файла автоматической установки, по пути /var/www//images/ubuntu24/autoinstall/ должны находиться два файла, первый meta-data, второй user-data
meta-data обязателен и может быть пустой, а вот user-data имеет язык YAML и должен соответствовать его синтаксису, посмотреть как создать файл автоответа можно на официальном сайте ubuntu
Вот моё содержимое файла автоматических ответов:
#cloud-config
# =======================================================================
# Ubuntu 24.04 : полностью бездиалоговая установка
# =======================================================================
autoinstall:
version: 1 # версия схемы cloud-init autoinstall
# -------------------------------------------------------------------
# Локализация: раскладка, часовой пояс
# -------------------------------------------------------------------
locale: ru_RU.UTF-8
keyboard: {layout: us}
timezone: Europe/Moscow
# -------------------------------------------------------------------
# Идентификация и сеть в интерактивном режиме
# -------------------------------------------------------------------
interactive-sections:
- network
- identity
# -------------------------------------------------------------------
# Подключаемся к репризиторию Ubuntu
# -------------------------------------------------------------------
apt:
preserve_sources_list: false
mirror-selection:
primary:
- country-mirror
- uri: "http://ru.archive.ubuntu.com"
arches: [i386, amd64]
fallback: abort
geoip: true
# -------------------------------------------------------------------
# РАЗМЕТКА ДИСКА: берём всё под корневой раздел (direct layout)
# -------------------------------------------------------------------
storage:
layout:
name: direct
sizing-policy: all # весь диск без ручных диалогов
# -------------------------------------------------------------------
# ИДЕНТИФИКАЦИЯ: имя ПК, пользователь, пароль
# -------------------------------------------------------------------
identity:
hostname: test9
username: user
realname: user # (по умолчанию = username)
password: '$6$wdAcoXrU039hKYPd$508Qvbe7ObUnxoj15DRCkzC3qO7edjH0VV7BPNRDYK4QR8ofJaEEF2heacn0QgD.f8pO8SNp83XNdWG6tocBM1'
# Пароль: "321" (ОБЯЗАТЕЛЬНО СМЕНИТЕ ПОСЛЕ УСТАНОВКИ (можно puppet-ом)
# -------------------------------------------------------------------
user-data:
runcmd:
# Ждём реального DHCP-ответа (спейсер)
- |
until ping -c1 -W1 8.8.8.8 >/dev/null 2>&1; do
echo "Waiting for DHCP…" && sleep 2
done
# -------------------------------------------------------------------
# Команды после окончания установки, но до перезагрузки ОС
# -------------------------------------------------------------------
late-commands:
- curtin in-target -- apt-get update && apt-get upgrade -y
- curtin in-target -- apt-get install -y puppet
- curtin in-target -- apt-get install -y puppet-agent
- curtin in-target -- apt-get install -y mc
- curtin in-target -- apt-get install -y gparted
- curtin in-target -- apt-get install -y ssh
- curtin in-target -- apt-get install -y python3
- curtin in-target -- apt-get install -y winpr-utils
- sudo bash -c 'printf "server = puppet.dom.local\nshow_diff = true\n" > /target/etc/puppet/puppet.conf'
- curtin in-target -- systemctl enable puppet
- sudo reboot
Как видно по коду файла, интерактивными мы оставили network и identity, остальное полностью автоматизировано, зачем это сделано?
Так как в нашей инфраструктуре есть развёрнутый сервер puppet, который имеет агентское приложение, то ссылается он на название ПК, поэтому лучше указывать его имя уникально для каждого клиента, если у вас нет необходимости в puppet, то identity можно удалить из интерактивного режима
Однако, network удалить из интерактивного режима не выйдет, поскольку в момент автоматической установки, система доходит до настроек network, даже если вы там впишите ipv4: dhcp, то в моменте система уронит все сетевые интерфейсы и намертво зависнет установка ОС, победить эту проблему без интерактивного режима не получилось, возможно это баг самой ОС Ubuntu
Остальные шаги прокомментированы в файле, поэтому на них подробно останавливаться не буду
На данном этапе, если выбрать пункт меню Ubuntu Installer 24 (AUTOINSTALL) в ipxe, то после загрузки ОС нужно будет лишь трижды нажать "Next", скриншоты ниже:
pic
network в интерактивном режиме
pic
identity в интерактивном режиме
Как видите, в user-data прописано:
identity:
hostname: test9
username: user
realname: user # (по умолчанию = username)
password: '$6$wdAcoXrU039hKYPd$508Qvbe7ObUnxoj15DRCkzC3qO7edjH0VV7BPNRDYK4QR8ofJaEEF2heacn0QgD.f8pO8SNp83XNdWG6tocBM1'
# Пароль: "321" (ОБЯЗАТЕЛЬНО СМЕНИТЕ ПОСЛЕ УСТАНОВКИ (можно puppet-ом)
Всё, кроме пароля система заполнила
pic
Подтверждение установки
После чего система сама установит весь софт с помощью после-установочных скриптов:
late-commands:
- curtin in-target -- apt-get update && apt-get upgrade -y
- curtin in-target -- apt-get install -y puppet
- curtin in-target -- apt-get install -y puppet-agent
- curtin in-target -- apt-get install -y mc
- curtin in-target -- apt-get install -y gparted
- curtin in-target -- apt-get install -y ssh
- curtin in-target -- apt-get install -y python3
- curtin in-target -- apt-get install -y winpr-utils
- sudo bash -c 'printf "server = puppet.dom.local\nshow_diff = true\n" > /target/etc/puppet/puppet.conf'
- curtin in-target -- systemctl enable puppet
- sudo reboot
Можно добавить любой софт или скрипт/текст-в-файл по аналогии, в конце команда sudo reboot, для перезагрузки, поскольку мне известно о существовании shutdown: reboot в user-data синтаксисе, но он по неизвестной мне причине не сработал
КРАЙНЕ ВАЖНО, у YAML имеется свой синтаксис и он зависит от пробелов с первого символа
Что будет, если в menu.ipxe не добавить строчки:
systemd.mask=systemd-networkd-wait-online.service
systemd systemd.mask=NetworkManager-wait-online.service systemd
network-config=disabled

Данными командами мы насильно отключаем NetworkManager и cloud-init, если их оставить, то при загрузке ОС, nfs соединение будет разрываться и ОС будет уходить в Kernel Panic и попросту зависать, поскольку будет бесконечно ожидать поднятие одного из демонов, NetworkManager или cloud-init, но никогда их не поднимет, ведь nfs соединение разорвано и остались лишь файлы в ОЗУ установки
pic
результат установки
На данном этапе полная настройка ipxe сервера завершена, остальные ОС можно добавлять по аналогии с krd или по аналогии с ubuntu

Итоги
Настроенный и поднятый сервер предназначен для ускорения и упрощения работы с установкой, диагностикой и обслуживанием ОС, в том числе автоматической установкой Ubuntu и возможностью снимать и развёртывать бекапы различных систем по сети, данный сервер работает быстрее обычной флешки, поскольку ограничен лишь скоростью накопителей и сетевой пропускной способностью-Источник
 
Loading...
Error