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

от автора

Предисловие

Полагаю буду следующим в серии статей-альтернатив:

  1. Раз!

  2. Два!

Раньше у нас использовалась заливка ОС по 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. TFTP

  2. Samba

  3. Apache2

  4. DHCP

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/smd.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:
option domain-name "local.loc"; option domain-name-servers 10.0.2.1; # Переменная для определения архитектуры клиента: option arch code 93 = unsigned integer 16; # Объявляю пространство имен для ipxe option space ipxe; option ipxe.no-pxedhcp code 176 = unsigned integer 8; default-lease-time 600; max-lease-time 7200; ddns-update-style none; # Возможность получать клиентам IP-адреса authoritative; # Выделение подсети subnet 10.0.2.0 netmask 255.255.255.0 { range 10.0.2.100 10.0.2.200; option domain-name-servers 10.0.2.1; option domain-name "local.loc"; option routers 10.0.2.1; option broadcast-address 10.0.2.255; default-lease-time 600; max-lease-time 7200; } # Отключение задержки в iPXE ожидания прокси DHCP. # Экономит пару секунд. option ipxe.no-pxedhcp = 1; # Используя ранее установленную переменную, # в зависимости от режима загрузки клиента, # идет выбор, какой загрузчик отправить клиенту: if option arch != 00:00 { filename "ipxe.efi"; } else { filename "undionly.kpxe"; } # Установка корневой директории с загрузчиками и конфигурациями next-server 10.0.2.5; option tftp-server-name "10.0.2.5"; option root-path "tftp://10.0.2.5:/srv/tftp/";

На всякий случай проверяю синтаксис конфигурации на ошибки:

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. Настройка DHCP для PXE

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

  3. Список кодов DHCP сервера

Оглавление Начало раздела

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:
#!ipxe # Глобальные параметры set pass pAsWoRd                    # Установка пароля на вход в iPXE set httpServer http://10.0.2.5:80 # Задание адреса HTTP сервера set menu-timeout 10000 # таймаут выхода из меню #############################  ########## Графика ##########  # Меняю цвет фона на серый colour --rgb 0x999999 6  # Цвет по-умолчанию (индекс 0) # Буквы - черный, фон букв - прозрачный cpair -f 0 -b 4 0  # Фоновое изображение и рамка # ${platform} - переменная iPXE, определяет в каком режиме загружен клиент- pcbios или efi # Задаю параметры окна, картинку фона (загрузив её по http) console -l 32 -r 32 -t 32 -b 32 -k --x 1024 --y 768 -d 24 -p {platform}.png  # После установки фона, удаляю картинку из памяти - # иначе она ломает wimboot загрузку WinPE imgfree ${platform}.png #########################  :login # Запрашивается пароль. Если будет нажат Ctrl+C или Esc будет выход и загрузка с диска # В идеале, можно использовать для авторизации в сервисах, но в данном случае играет роль заглушки login || goto cancel  #Если пароль верен, перейти "дальше"-к меню загрузок, иначе - таймаут 5 секунд и повторный запрос пароля iseq ${password} ${pass} && goto next || goto error_pass  :error_pass echo Error password. Repeat after 5 seconds sleep 5 goto login  :cancel echo You change "Exit". Boot from disk... sleep 1 exit  # Переход к файлу с меню :next chain --replace --autofree menu.ipxe

По пути /var/www/html/images/photo/ кладу подготовленные pcbios.png и efi.png размера 1024х768. В зависимости от того, в каком режиме запустится ПК, у меня всегда будет подсказка на самом фоне меню:

картинки меню

Cоздаю меню загружаемых ОС и утилит.

/srv/tftp/menu.ipxe
#!ipxe # После предыдущего скрипта, настройки остаются прежними, # потому переопределяю их, чтобы было видно текст  ######## Графика ########  # Цвет по-умолчанию (индекс 0) # Буквы - черный, фон-прозрачный cpair -f 0 -b 4 0  # Нормальный текст (индекс 1) # Буквы - черный, фон - прозрачный cpair -f 0 -b 4 1  # Разделители (индекс 3) # Буквы - красный, фон - прозрачный cpair -f 1 -b 4 3  #########################  ######## Главное меню ########  # На данный момент "всё в одном", но можно разделить как по разным меню, так и по разным файлам :start  # Составляю меню https://ipxe.org/cmd/menu menu iPXE boot menu item -k e exit (E)xit and boot from disk item item --gap -- -------- Windows Images -------- item -k a win10manager2021 Windows 10 M(a)nager 2021 item item --gap -- -------- Debian Images -------- item debian11 Debian 11 Bullseye item item --gap -- -------- Acronis Images -------- item acronis2021x64 Acronis 2021 64-bit item  # Для режима Legacy, добавляю утилиты использующие Memdisk iseq ${platform} pcbios && item --gap -- -------- BIOS Utilites -------- || iseq ${platform} pcbios && item memtest Memtest86+ (v5.31) || iseq ${platform} pcbios && item mhdd Mhdd (v4.6) || iseq ${platform} pcbios && item hddtolls HDDtools || iseq ${platform} pcbios && item victory Victory || iseq ${platform} pcbios && item diskGenius DiskGenius (disk diagnostics) || iseq ${platform} pcbios && item ||  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}  ######## # Пункты меню # В среднем состоят из трёх пунктов: # kernel - передаю ядро linux и аргументы для запуска # initrd - пакет данных для ядра # boot - команда передачи управления ядру linux  ######## :debian11 # В данном случае, в kernel передаётся ссылка linux ядра на http-сервере и аргументы запуска kernel {httpServer}/images/bullseye/install.amd/pxe_${platform}_preseed.cfg netcfg/dhcp_failed=note netcfg/dhcp_options="Retry network autoconfiguration" netcfg/get_domain=  --- quiet initrd=initrd.gz  # так же, ссылкой на http, передается пакет данных для ядра initrd ${httpServer}/images/bullseye/install.amd/initrd.gz  # команда передачи управления ядру linux и в случае ошибки - переход к обоку обработки ошибок boot || goto error goto start  # Разбор файлов для linux - будет ниже :win10manager2021 # wimboot - загрузчик .wim файлов установщика Windows, который сам патчит BCD, запускает установку и подтягивает скрипты запуска # https://ipxe.org/wimboot kernel wimboot ########################################### # Неизменный блок для любого образа Windows ########################################### initrd ${httpServer}/images/winpe/Boot/BCD BCD           # Стандартный BCD WinPE initrd ${httpServer}/images/winpe/Boot/boot.sdi boot.sdi # Стандартный boot.sdi WinPE initrd ${httpServer}/images/winpe/boot.wim boot.wim      # Стандартный boot.wim initrd configWPE/winpeshl.ini winpeshl.ini               # Конфиг запускающий скрипт установки. ###########################################  # Изменяемые данные в зависимости от образа initrd configWPE/win10manager2021/install.bat install.bat   # Скрипт установки образа boot || goto error  goto start ############################# # Утилиты загружаемые с iPXE ############################# # Acronis images  :acronis2021x64 kernel ${httpServer}/images/utils/acr2021/dat10.dat initrd=dat11.dat initrd=dat12.dat vga=vesa MBRCRCS force_modules=usbhid quiet initrd ${httpServer}/images/utils/acr2021/dat11.dat initrd ${httpServer}/images/utils/acr2021/dat12.dat boot || goto error goto start # Утилиты загружаются через Memdisk и доступны только для BIOS режима  :memtest kernel memdisk || goto error initrd ${httpServer}/images/utils/memtest86+-5.31b.iso || goto error imgargs memdisk iso raw || goto error boot || goto error goto start  :victory kernel memdisk || goto error initrd ${httpServer}/images/utils/vcr35r.iso || goto error imgargs memdisk iso raw || goto error boot || goto error goto start  :mhdd kernel memdisk || goto error initrd ${httpServer}/images/utils/mhdd32ver4.6.iso || goto error imgargs memdisk iso raw || goto error boot || goto error goto start  :hddtools kernel memdisk || goto error initrd ${httpServer}/images/utils/hddtools.iso || goto error imgargs memdisk iso raw || goto error boot || goto error goto start  :diskGenius kernel memdisk || goto error initrd ${httpServer}/images/utils/DiskGenius.iso || goto error imgargs memdisk iso raw || goto error boot || goto error goto start  # Интерактивное меню редактирования конфигурация iPXE и сетевой карты :config config goto start  # Командная строка iPXE :shell shell goto start  :exit echo Boot from disk... sleep 2 exit  # При ошибках выход на командную строку :error echo Failed - have error sleep 1 goto shell ##############################

Оглавление Начало раздела

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
@echo off echo wpeinit start  :: Инициализация среды WinPE wpeinit  :: Задержка для гарантированного запуска сетевой карты и получение IP echo We are waiting for 15 seconds for the network card to start ping -4 -n 15 -w 1000 "">nul ipconfig /renew  echo echo wait 5 second pre-mount share folder with distr ping -4 -n 5 1000 "">nul  ::Монтирование каталога с установщиком Windows net use Y: \10.0.2.5\images\win10setup /user:anonymous anonymous  :: Получение информации, в каком режиме запущен пк - UEFI или Legacy echo check boot-mode wpeutil UpdateBootInfo for /f "tokens=2* delims=        " %%A in ('reg query HKLM\System\CurrentControlSet\Control /v PEFirmwareType') DO SET Firmware=%%B  :: В зависимости от режима выше - выбор нужного образа установки и файла ответов echo start Setup win10 if %Firmware%==0x1 Y:\sources\setup.exe /unattend:Y:\wims\autounattend_bios_manager.xml /installfrom:Y:\wims\win10manager2021.wim if %Firmware%==0x2 Y:\sources\setup.exe /unattend:Y:\wims\autounattend_efi_manager.xml /installfrom:Y:\wims\win10manager2021.wim cmd.exe

При проверке установка успешно запускается (с ошибкой в конце, что на VM мало места, но не суть):

Картинка

По итогу получается:

Дерево каталогов
# Web-сервер images ├── bullseye         # Файлы образа Linux │   ├── install.amd/ # Ядро и файлы ответов │   └── postinstall/ # Скрипты и пакеты для пост-установки ├── photo            # Необязательный каталог для фонов меню │   ├── efi.png │   └── pcbios.png └── winpe            # Файлы для запуска WinPE     ├── BCD     ├── boot.sdi     └── boot.wim Tftp/Samba-серва tftp ├── boot.ipxe            # Установка переменных среды iPXE ├── configWPE            # Хранилище конфигураций образов Windows │   ├── win10manager2021 │   │   └── install.bat  # Скрипт запуска установки, где меняются samba пути │   └── winpeshl.ini     # Общая для всех конфигурация, запускающая скрипт установки ├── images │   └── win10setup       # Каталог стандартного установочного диска Windows │       ├── autorun.inf │       ├── boot/ │       ├── bootmgr/ │       ├── bootmgr.efi │       ├── efi/ │       ├── setup.exe │       ├── sources/ │       ├── support/ │       └── wims/        # Пакеты *.wim и файлы ответов │           ├── autounattend_bios_manager.xml │           ├── autounattend_efi_manager.xml │           └── win10manager2021.wim ├── ipxe.efi             # Загрузчик для UEFI ├── menu.ipxe            # Меню iPXE ├── undionly.kpxe        # Загрузчик для Legacy └── wimboot              # Загрузчик для Windows

Оглавление Начало раздела

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 и т.д.), что ускоряет загрузку.

Оглавление

Ожидаю вашего мнения в комментариях

P.S. Первая статья и тонна мучений с редактором.

  • Использую Firefox, при нажатии на «/» в большинстве случаев ничего не появляется, либо стало появляться только после отключения всех AdBlock-еров.

  • Предпросмотра для ссылок нет — перепроверить ссылки внутри статьи не могу

  • В плане оформления помог плагин Unotes который конвертировал мой markdown в WYSIWYG, но потом вносил коррективы. Если что-то не будет работать — буду исправлять по мере обнаружения.


ссылка на оригинал статьи https://habr.com/ru/post/681142/


Комментарии

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *