Найти в Дзене
Калейдоскоп эмоций

iPXE — заливка linux, windows и утилит по сети

Раньше у нас использовалась заливка ОС по PXE с использованием syslinux, но как бывает с самодостаточными системами и без достаточного контроля и внимания - быстро превратилась в кашу из конфигураций, библиотек, загрузчиков. Так же была необходимость в поддержке заливки разных ОС в режиме EFI - на тот момент заливка была только в Legacy. В желании разобраться в этом наследстве, упростить и облегчить добавление новых образов в список, я познакомился с iPXE. Оглавление 1. Подготовка стенда Раздел частично отсылает к Загрузочный сервер — как загрузочная флешка..., первичная подготовка схожа - для базы используется чистый Debian Bullseye, но думаю, использование другого дистрибутива не будет сильно отличаться. Дано Необходимо установить: 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 blksi
Оглавление

Раньше у нас использовалась заливка ОС по PXE с использованием syslinux, но как бывает с самодостаточными системами и без достаточного контроля и внимания - быстро превратилась в кашу из конфигураций, библиотек, загрузчиков.

Так же была необходимость в поддержке заливки разных ОС в режиме EFI - на тот момент заливка была только в Legacy.

В желании разобраться в этом наследстве, упростить и облегчить добавление новых образов в список, я познакомился с iPXE.

Оглавление

  1. Подготовка стендового сервера
  2. Сборка загрузчиков
  3. Написание меню загрузки
  4. Добавление образов debian, windows, утилит
  5. Итог

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

Документация:

  1. Отдача нужного загрузчика, в зависимости от режима загрузки - Legacy/UEFI

2. Сборка загрузчиков iPXE

В данном разделе будет:

  1. Загрузка пакетов
  2. Скрипт стартовой настройки
  3. Сборка загрузчиков

Оглавление

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, утилит

После написания меню, необходимо подготовить загрузчики и пакеты загружаемых систем.

Разберу примеры:

  1. Linux
  2. Windows
  3. Утилиты

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

Но по порядку.

  1. Для установки Windows понадобится wimboot - загрузчик для wim образов. Умеет патчить BCD, работать с HTTP, переиспользовать память и т.д.

Скачиваю последнюю стабильную версию и кладу рядом с другими загрузчиками /srv/tftp/wimboot

  1. Следом понадобится чистый WinPE, а именно его
    winpe/media/Boot/
    BCD
    winpe/media/Boot/boot.sdi
    winpe/media/sources/boot.wim

Для использования его как "оболочки" для запуска установки Windows.

Их необходимо будет распаковать в /var/www/html/images/winpe/

  1. В каталог /srv/tftp/images/win10setup/ распаковываю образ установочного диска Windows и создаю там каталог wims - в неё будут складываться пакеты .wim образов и файлы ответов.
  2. В неё кладу заранее подготовленные:
    win10manager2021.wim - пакет корпоративного образа
    autounattend_bios_manager.xml и autounattend_efi_manager.xml - файлы ответов к нему для UEFI и Legacy режимов.
  3. Создаю каталоги:
    /srv/tftp/configWPE/ - для складывания в него настроек для разных образов (по аналогии с Bullseye)
    /srv/tftp/configWPE/win10manager2021/ - для непосредственно скрипта установки
  4. Создаю файл /srv/tftp/configWPE/winpeshl.ini - конфигурация, которая передаваемая ядру и которая указывает, какой скрипт выполнить при запуске:

[LaunchApps]
"install.bat"

  1. Создаю сам файл:

/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 - станет еще меньше.
  • Возможность работать с HTTP (..., iSCSI SAN, AoE SAN и т.д.), что ускоряет загрузку.

Источник

#windows #linux #загрузкапосети