Раньше у нас использовалась заливка ОС по PXE с использованием syslinux, но как бывает с самодостаточными системами и без достаточного контроля и внимания - быстро превратилась в кашу из конфигураций, библиотек, загрузчиков.
Так же была необходимость в поддержке заливки разных ОС в режиме EFI - на тот момент заливка была только в Legacy.
В желании разобраться в этом наследстве, упростить и облегчить добавление новых образов в список, я познакомился с iPXE.
Оглавление
- Подготовка стендового сервера
- Сборка загрузчиков
- Написание меню загрузки
- Добавление образов debian, windows, утилит
- Итог
1. Подготовка стенда
Раздел частично отсылает к Загрузочный сервер — как загрузочная флешка..., первичная подготовка схожа - для базы используется чистый Debian Bullseye, но думаю, использование другого дистрибутива не будет сильно отличаться.
Дано
- VM VirtualBox
Ram: 1 Гб
VDI: 8Gb
CPU: 1 Core
Network: - NAT, подсеть 10.0.2.0, без DHCP, шлюз 10.0.2.1 - Debian 11.4
Необходимо установить:
1.1. TFTP
Используется для загрузчиков и ipxe скриптов:
apt install tftpd-hpa
Вношу изменения в /etc/default/tftpd-hpa:
TFTP_USERNAME="tftp" TFTP_DIRECTORY="/srv/tftp" # путь к папке tftp TFTP_ADDRESS="0.0.0.0:69" TFTP_OPTIONS="--secure -l -vvv -r blksize -m /etc/tftpd.remap"
Замена слешей Windows на Linux /etc/tftpd.remap:
rg \\ /
1.2. Samba
Используется для установки Windows-образов, в процессе монтируя папку образа, как диск:
apt install samba
В конце /etc/samba/smb.conf добавил:
[images]
comment = images
path = /srv/tftp/images
create mask = 0660
directory mask = 0771
writable = yes
guest ok = yes
browseable = yes
locking = no
public = yes
Создал папку, выдал права, перезапустил samba:
mkdir /srv/tftp/images
chmod 777 /srv/tftp/images
service smbd restart
1.3. Apache2
Используется для загрузки образа WinPE, Linux и прочих данных по протоколу HTTP (быстрее TFTP):
apt install apache2
Настройки на стенде по умолчанию, в папке /var/www/html/ создаю директории:
- /images/ - для папок ОС
- /photo/ - для фонов меню, но не обязательно
mkdir -p /var/www/html/images/photo
1.4. DHCP-сервер
Выдает IP адреса в сети. Для настройки iPXE на Windows Server лучше обратиться к документации.
apt install isc-dhcp-server
Задаю статический IP адрес для стенда.
/etc/network/interfaces:
allow-hotplug ens0s3
iface ens33 inet static
address 10.0.2.5
netmask 255.255.255.0
broadcast 10.0.2.255
network 10.0.2.0
gateway 10.0.2.1
Назначаю интерфейс для прослушивания запросов.
/etc/default/isc-dhcp-server:
INTERFACESv4="enp0s3"
Формирую DHCP подсеть и добавляю ключи для загрузки с iPXE.
/etc/dhcp/dhcpd.conf:
На всякий случай проверяю синтаксис конфигурации на ошибки:
dhcpd -t -cf /etc/dhcp/dhcpd.conf
Если всё хорошо, указания ошибок в выводе не будет:
Internet Systems Consortium DHCP Server 4.4.1
Copyright 2004-2018 Internet Systems Consortium.
All rights reserved.
For info, please visit https://www.isc.org/software/dhcp/
Config file: /etc/dhcp/dhcpd.conf
Database file: /var/lib/dhcp/dhcpd.leases
PID file: /var/run/dhcpd.pid
Документация:
- Отдача нужного загрузчика, в зависимости от режима загрузки - Legacy/UEFI
2. Сборка загрузчиков iPXE
В данном разделе будет:
- Загрузка пакетов
- Скрипт стартовой настройки
- Сборка загрузчиков
Оглавление
2.1. Загрузка пакетов
После настройки и проверки стенда, необходимо собрать из исходного кода загрузчики iPXE для режимов Legacy и UEFI.
Обязательно потребуется установить зависимости:
- gcc
- binutils
- make
- perl
- liblzma или xz header files
- mtools
apt install gcc binutils make perl liblzma-dev mtools git
Скачиваю архив кода iPXE, либо клонирую репозиторий. Захожу во внутрь:
git clone git://git.ipxe.org/ipxe.git
cd ipxe/src/
Большинство возможностей iPXE по умолчанию закомментировано и при сборке бинарников, будет недоступно. Полный перечень функций указан тут, перебирая разделы можно выбрать, что нужно и где включить.
В текущем случае нужно:
- в файле config/gereral.h раскомментировать строки с CONSOLE_CMD, IMAGE_PNG для команд консоли и png картинок.
- в файле config/console.h раскомментировать строку с CONSOLE_FRAMEBUFFER, тоже для картинок.
2.2. Скрипт стартовой настройки
После загрузки iPXE от DHCP появится приглашение командной строки iPXE. Дальше нужно будет получить ip и начать загрузку скрипта меню. Чтобы этого не делать вручную, можно встроить базовый скрипт в сам бинарник.
Создаю скрипт start.ipxe (имя значения не имеет). Перечень, возможных команд.
#!ipxe :start
# Механизм получения ip. В случае ошибки - предлагает нажать "s" для запуска командной строки. # Иначе - начать снова. dhcp && goto next || prompt --key s --timeout 1500 Press "s" for the iPXE command line... && shell || goto start
:next
# Случае успеха - загрузить "меню" с tftp-сервера (о нём - позже). chain tftp://10.0.2.5/boot.ipxe
2.3. Сборка загрузчиков
Внимание! Строка имени файла является и его целевой конфигурацией, т.е. какое имя будет выбрано, для той платформы и будет сборка. В ключе EMBED= указывается имя ранее созданного скрипта.
Так же в случае ошибок при сборке, необходимо добавить ключ -fno-pie в Makefile.housekeeping на 451 строке. Предполагается, что это из-за ошибок в gcc.
make bin-i386-efi/ipxe.efi EMBED=start.ipxe
make bin-i386-pcbios/undionly.kpxe EMBED=start.ipxe
Копирую полученные загрузчики в папку tftp PXE сервера
cp bin-i386-efi/ipxe.efi /srv/tftp/
cp bin-i386-pcbios/undionly.kpxe /srv/tftp/
3. Написание меню загрузки
Ранее, в загрузчики был встроен скрипт, который в случае успешного получения ip, загружал и запускал скрипт boot.ipxe.
Создаю его по пути /srv/tftp/boot.ipxe:
По пути /var/www/html/images/photo/ кладу подготовленные pcbios.png и efi.png размера 1024х768. В зависимости от того, в каком режиме запустится ПК, у меня всегда будет подсказка на самом фоне меню:
картинки меню
Cоздаю меню загружаемых ОС и утилит.
/srv/tftp/menu.ipxe
4. Добавление образов Linux, Windows, утилит
После написания меню, необходимо подготовить загрузчики и пакеты загружаемых систем.
Разберу примеры:
- Linux
- Windows
- Утилиты
4.1. Добавление Linux
На стенде создаю папки:
mkdir -p /var/www/html/images/bullseye/install.amd # Для загрузчика, файлов ответа mkdir -p /var/www/html/images/bullseye/postinstall # Для скриптов и пакетов пост-установки. Скачиваться будут благодаря команде в файле ответов cd /var/www/html/images/install.amd/
Скачиваю ядро и пакет данных linux:
wget http://ftp.debian.org/debian/dists/stable/main/installer-amd64/current/images/netboot/debian-installer/amd64/linux
wget http://ftp.debian.org/debian/dists/stable/main/installer-amd64/current/images/netboot/debian-installer/amd64/initrd.gz
Скачиваю драйвера и встраиваю их в пакет ядра:
[ -f initrd.gz.orig ] || cp -p initrd.gz initrd.gz.orig
[ -f firmware.cpio.gz ] || wget http://cdimage.debian.org/cdimage/unofficial/non-free/firmware/stable/current/firmware.cpio.gz
cat initrd.gz.orig firmware.cpio.gz > initrd.gz
Создаю 2 файла ответов для debian-installer:
- pxe_efi_preseed.cfg с разметкой диска под UEFI
- pxe_pcbios_preseed.cfg с разметкой диска под Legacy
Кладу их по пути /var/www/html/bullseye/install.amd/:
[drwxr-xr-x 4.0K] bullseye
├── [drwxr-xr-x 4.0K] install.amd
│ ├── [-rw-r--r-- 138M] initrd.gz
│ ├── [-rw-r--r-- 6.5M] linux
│ ├── [-rw-r--r-- 15K] pxe_efi_preseed.cfg
│ └── [-rw-r--r-- 15K] pxe_pcbios_preseed.cfg
└──[drwxr-xr-x 4.0K] postinstall
Если сейчас попытаться загрузить linux, то все получится
4.2 Добавление Windows
Установки Windows через PXE как тачка на прокачку:
- Запускаем PXE ->
- Передаём управление iPXE ->
- Передаём управление wimboot ->
- Передаем управление WinPE ->
- Устанавливаем Windows
Но по порядку.
- Для установки Windows понадобится wimboot - загрузчик для wim образов. Умеет патчить BCD, работать с HTTP, переиспользовать память и т.д.
Скачиваю последнюю стабильную версию и кладу рядом с другими загрузчиками /srv/tftp/wimboot
- Следом понадобится чистый WinPE, а именно его
winpe/media/Boot/BCD
winpe/media/Boot/boot.sdi
winpe/media/sources/boot.wim
Для использования его как "оболочки" для запуска установки Windows.
Их необходимо будет распаковать в /var/www/html/images/winpe/
- В каталог /srv/tftp/images/win10setup/ распаковываю образ установочного диска Windows и создаю там каталог wims - в неё будут складываться пакеты .wim образов и файлы ответов.
- В неё кладу заранее подготовленные:
win10manager2021.wim - пакет корпоративного образа
autounattend_bios_manager.xml и autounattend_efi_manager.xml - файлы ответов к нему для UEFI и Legacy режимов. - Создаю каталоги:
/srv/tftp/configWPE/ - для складывания в него настроек для разных образов (по аналогии с Bullseye)
/srv/tftp/configWPE/win10manager2021/ - для непосредственно скрипта установки - Создаю файл /srv/tftp/configWPE/winpeshl.ini - конфигурация, которая передаваемая ядру и которая указывает, какой скрипт выполнить при запуске:
[LaunchApps]
"install.bat"
- Создаю сам файл:
/srv/tftp/configWPE/win10manager2021/install.bat
При проверке установка успешно запускается (с ошибкой в конце, что на VM мало места, но не суть):
Картинка
По итогу получается:
Дерево каталогов
4.3 Утилиты
Для них на Web-сервере создал подкаталог /var/www/html/images/utils/ и складываю либо *.iso образы для запуска через Memdisk, либо передавая в качестве ядра соответствующие файлы (например Acronis)
5. Итог
По итогу получилась система с минимальным количеством файлов для заливки и добавления:
- 3 загрузчика (Legacy,UEFI,Windows)
- 3 файл WinPE для Windows
- По 2-3 файла непосредственно образа
- По 2 файла ответов на образ
- По 1 скрипту пост-/установки на образ
- Простое меню. Если убрать графику, парольную заглушку и оставить TUI - станет еще меньше.
#windows #linux #загрузкапосети