Подробный гайд по PXE-загрузке: от теории до практики
Практико-ориентированный гайд по PXE-загрузке: как это работает, какие компоненты нужны, как поднять PXE-сервер на Linux, как учесть BIOS/UEFI/Secure Boot, как использовать iPXE/HTTP, что делать с Windows Deployment Services и как диагностировать типовые проблемы.
Подробный гайд по PXE-загрузке
1. Что такое PXE
PXE, Preboot Execution Environment — среда предзагрузочного выполнения, позволяющая компьютеру загрузиться по сети до загрузки операционной системы с локального диска.
Обычно PXE используется для:
- установки ОС по сети;
- загрузки live-систем;
- восстановления систем;
- бездисковых рабочих станций;
- массового развертывания серверов;
- загрузки диагностических утилит;
- сетевой установки Windows через WDS;
- автоматизации provisioning-системами: MAAS, Foreman, FOG, Cobbler, netboot.xyz и т.д. PXE-загрузка начинается в прошивке сетевого адаптера или в UEFI-прошивке материнской платы.
Клиент еще не имеет ОС, поэтому сначала ему нужны:
- IP-адрес — обычно через DHCP.
- Адрес загрузочного сервера — через DHCP-опции.
- Имя загрузочного файла — через DHCP-опции.
- Сам загрузчик — обычно по TFTP, в современных схемах также HTTP/HTTPS.
2. Общая схема работы PXE
Упрощенно процесс выглядит так:
[PXE-клиент]
|
| 1. DHCPDISCOVER с PXE-опциями
v
[DHCP-сервер]
|
| 2. DHCPOFFER / DHCPACK:
| IP-адрес, маска, шлюз,
| next-server, filename
v
[PXE-клиент]
|
| 3. TFTP/HTTP-запрос загрузчика
v
[TFTP/HTTP-сервер]
|
| 4. Отдача NBP:
| pxelinux.0, ipxe.efi, bootx64.efi, grub и т.д.
v
[PXE-клиент]
|
| 5. Загрузчик тянет конфиг,
| kernel, initrd, rootfs
v
[Ядро ОС / installer / live-система]
Основные участники
| Компонент | Назначение |
|---|---|
| PXE-клиент | Сетевая карта или UEFI-прошивка с поддержкой PXE/HTTP Boot |
| DHCP-сервер | Выдает IP-адрес и параметры загрузки |
| TFTP-сервер | Отдает первичный загрузчик |
| HTTP/NFS/SMB/iSCSI | Отдает ядро, initrd, образы, rootfs |
| NBP | Network Bootstrap Program: pxelinux.0, ipxe, grub, wdsnbp.com и т.д. |
| ОС/installer | Linux installer, Windows PE, live-система, diskless-root |
3. Важные DHCP-опции для PXE
Для классической PXE-загрузки чаще всего используются следующие параметры.
| Опция | Название | Зачем нужна |
|---|---|---|
| 60 | Vendor Class Identifier | Клиент сообщает, что он PXE-клиент, например PXEClient |
| 93 | Client System Architecture Type | Тип архитектуры: BIOS, UEFI x86, UEFI x64 и т.д. |
| 97 | Client Machine Identifier | UUID/GUID машины |
| 66 | TFTP Server Name | Имя или IP TFTP-сервера |
| 67 | Bootfile Name | Имя загрузочного файла |
| siaddr / next-server | Boot server address | IP-адрес сервера, с которого клиент будет качать boot-файл |
| 43 | Vendor Specific Information | Дополнительно может использоваться в PXE Boot Server Protocol |
Пример значений архитектуры в DHCP option 93
| Значение | Архитектура |
|---|---|
| 0 | Legacy BIOS x86 |
| 6 | EFI IA32 |
| 7 | EFI x86-64 / EFI BC |
| 9 | EFI x86-64 |
На практике UEFI x64-клиенты могут присылать 7 или 9, поэтому лучше учитывать оба варианта.
4. Что именно загружается по PXE
Зависит от типа прошивки.
Legacy BIOS
Обычно:
pxelinux.0
или:
undionly.kpxe
если используется iPXE.
UEFI x86-64
Обычно один из файлов:
bootx64.efi
grubx64.efi
shimx64.efi
ipxe.efi
wdsmgfw.efi
UEFI IA32
bootia32.efi
ARM64
bootaa64.efi
grubaa64.efi
Важно:
BIOS и UEFI используют разные загрузчики. Если сервер отдает pxelinux.0, а клиент в UEFI-режиме, загрузка не пройдет.
5. Выбор архитектуры PXE-инфраструктуры
Вариант 1: Все на одном Linux-сервере
Самый простой вариант для лаборатории и небольших сетей:
- DHCP:
dnsmasqилиISC DHCP; - TFTP: встроен в
dnsmasqили отдельныйtftpd-hpa; - HTTP: nginx/apache/python для kernel/initrd/iso;
- файлы: PXELINUX, GRUB, iPXE.
Плюсы:
- быстро поднимается;
- удобно отлаживать;
- минимум зависимостей.
Минусы:
- не всегда подходит для крупной корпоративной сети, где DHCP уже занят.
Вариант 2: DHCP уже есть, нужно только PXE
Если DHCP-сервер уже работает и менять его нельзя, есть несколько путей:
- Настроить существующий DHCP на выдачу PXE-опций.
- Использовать ProxyDHCP.
- Использовать маршрутизатор/L3-коммутатор с
ip helper-address, если клиент в другом VLAN. - Поднять отдельный boot-сервер, а в DHCP указать
next-serverиfilename.
Вариант 3: iPXE + HTTP/HTTPS
Классический PXE использует TFTP.
Это просто, но у TFTP есть минусы:
- нет авторизации;
- нет шифрования;
- низкая скорость на больших файлах;
- неудобно вести логи и управление.
Поэтому часто используют цепочку:
PXE ROM -> iPXE -> HTTP/HTTPS -> Linux/Windows/images
iPXE умеет:
- HTTP/HTTPS;
- меню;
- скрипты;
- переменные;
- загрузку по URL;
- проверку подписей и контрольных сумм при правильной настройке.
Вариант 4: Windows Deployment Services
Для установки Windows обычно используют:
- Windows Deployment Services, WDS;
- Windows PE;
- boot.wim;
- install.wim/install.esd;
- DHCP/TFTP в связке с WDS. Это отдельная большая тема, но базовая логика та же: PXE-клиент получает Windows PE по сети, затем запускает установку Windows.
6. Практика: PXE-сервер на Linux с dnsmasq и PXELINUX
Ниже пример для Debian/Ubuntu.
Исходные данные
Будем считать:
- сервер: Linux;
- интерфейс:
enp1s0; - сеть:
192.168.100.0/24; - IP PXE-сервера:
192.168.100.10; - DHCP-сервер в сети отсутствует;
- загружать будем BIOS-клиентов через PXELINUX. Если у вас другая подсеть или интерфейс — замените на свои.
6.1. Назначить IP-адрес серверу
Временно:
sudo ip addr add 192.168.100.10/24 dev enp1s0
sudo ip link set enp1s0 up
Для постоянной настройки используйте netplan, nmcli, /etc/network/interfaces или другой способ, принятый в вашем дистрибутиве.
Пример netplan:
network:
version: 2
ethernets:
enp1s0:
addresses:
- 192.168.100.10/24
Применить:
sudo netplan apply
6.2. Установить пакеты
Для Debian/Ubuntu:
sudo apt update
sudo apt install -y dnsmasq pxelinux syslinux-common
Пакет dnsmasq будет выполнять роли DHCP и TFTP.
6.3. Создать каталог TFTP
sudo mkdir -p /srv/tftp/pxelinux.cfg
6.4. Скопировать файлы PXELINUX
Пути могут немного отличаться в зависимости от дистрибутива.
Обычно:
sudo cp /usr/lib/PXELINUX/pxelinux.0 /srv/tftp/
sudo cp /usr/lib/syslinux/modules/bios/ldlinux.c32 /srv/tftp/
sudo cp /usr/lib/syslinux/modules/bios/libcom32.c32 /srv/tftp/
sudo cp /usr/lib/syslinux/modules/bios/libutil.c32 /srv/tftp/
sudo cp /usr/lib/syslinux/modules/bios/menu.c32 /srv/tftp/
sudo cp /usr/lib/syslinux/modules/bios/vesamenu.c32 /srv/tftp/
Если файл pxelinux.0 не находится, найдите его:
find /usr -name pxelinux.0 2>/dev/null
6.5. Настроить права
Файлы должны быть доступны на чтение:
sudo chmod -R a+rX /srv/tftp
Если TFTP работает от отдельного пользователя, например tftp, можно сделать:
sudo chown -R tftp:tftp /srv/tftp
Но для dnsmasq часто достаточно прав на чтение.
6.6. Конфигурация dnsmasq
Создаем файл:
sudo nano /etc/dnsmasq.d/pxe.conf
Пример минимальной конфигурации для BIOS PXE:
# Слушаем только нужный интерфейс
interface=enp1s0
bind-interfaces
# Отключаем DNS, если он не нужен
port=0
# Диапазон адресов для PXE-клиентов
dhcp-range=192.168.100.50,192.168.100.150,255.255.255.0,12h
# Сервер авторитетен для этой подсети
dhcp-authoritative
# Включаем TFTP
enable-tftp
tftp-root=/srv/tftp
# Boot-файл для BIOS
dhcp-boot=pxelinux.0
# Если сервер является шлюзом, раскомментируйте:
# dhcp-option=3,192.168.100.10
# Логи полезны для диагностики
log-dhcp
log-facility=/var/log/dnsmasq.log
Перезапускаем:
sudo systemctl restart dnsmasq
sudo systemctl enable dnsmasq
Проверка:
sudo systemctl status dnsmasq
tail -f /var/log/dnsmasq.log
6.7. Меню PXELINUX
Создаем конфиг:
sudo nano /srv/tftp/pxelinux.cfg/default
Пример:
UI menu.c32
PROMPT 0
TIMEOUT 300
ONTIMEOUT local
MENU TITLE PXE Boot Menu
LABEL local
MENU LABEL Boot from local disk
LOCALBOOT 0
LABEL example
MENU LABEL Example Linux
KERNEL images/example/vmlinuz
INITRD images/example/initrd.img
APPEND ip=dhcp console=tty0
Где:
LOCALBOOT 0— попытка загрузки с локального диска;KERNEL— путь к ядру относительноtftp-root;INITRD— путь к initrd/initramfs;APPEND— параметры ядра.
Файлы:
/srv/tftp/images/example/vmlinuz
/srv/tftp/images/example/initrd.img
нужно предварительно положить вручную.
6.8. Как PXELINUX ищет конфиг
PXELINUX ищет конфиг примерно в таком порядке:
pxelinux.cfg/<UUID>
pxelinux.cfg/<MAC>
pxelinux.cfg/<IP в hex>
pxelinux.cfg/default
Пример для MAC:
pxelinux.cfg/01-52-54-00-12-34-56
Пример для IP 192.168.100.55:
C0A80137
то есть файл:
pxelinux.cfg/C0A80137
Если нужен индивидуальный конфиг для конкретной машины, можно создать файл по MAC или IP.
7. Поддержка UEFI на том же сервере
Для UEFI нужно отдавать EFI-загрузчик, а не pxelinux.0.
7.1. Определять архитектуру клиента в dnsmasq
Пример конфигурации:
interface=enp1s0
bind-interfaces
port=0
dhcp-range=192.168.100.50,192.168.100.150,255.255.255.0,12h
dhcp-authoritative
enable-tftp
tftp-root=/srv/tftp
# Определение архитектуры
dhcp-match=set:bios,option:client-arch,0
dhcp-match=set:efi32,option:client-arch,6
dhcp-match=set:efi64,option:client-arch,7
dhcp-match=set:efi64,option:client-arch,9
# Выдача загрузчика по архитектуре
dhcp-boot=tag:bios,pxelinux.0
dhcp-boot=tag:efi32,bootia32.efi
dhcp-boot=tag:efi64,EFI/BOOT/bootx64.efi
# Fallback
dhcp-boot=pxelinux.0
log-dhcp
log-facility=/var/log/dnsmasq.log
Если ваш dnsmasq не понимает option:client-arch, попробуйте числовой вариант:
dhcp-match=set:bios,option:93,0
dhcp-match=set:efi32,option:93,6
dhcp-match=set:efi64,option:93,7
dhcp-match=set:efi64,option:93,9
8. UEFI-загрузчик GRUB для PXE
Для UEFI удобно использовать GRUB.
8.1. Установка пакетов
Debian/Ubuntu:
sudo apt install -y grub-efi-amd64-bin grub-common
8.2. Создание сетевой GRUB-директории
sudo grub-mknetdir --net-directory=/srv/tftp --subdir=EFI/BOOT
Если команда требует явно указать цель:
sudo grub-mknetdir \
--net-directory=/srv/tftp \
--subdir=EFI/BOOT \
--target=x86_64-efi
После этого найдите созданные EFI-файлы:
find /srv/tftp -name "*.efi"
Обычно нужен файл вроде:
/srv/tftp/EFI/BOOT/bootx64.efi
В dnsmasq тогда указываем:
dhcp-boot=tag:efi64,EFI/BOOT/bootx64.efi
8.3. Конфиг GRUB
GRUB по сети обычно ищет grub.cfg.
Положите конфиг, например:
sudo nano /srv/tftp/EFI/BOOT/grub.cfg
Пример:
set default=0
set timeout=30
menuentry 'Boot next firmware entry' {
exit
}
menuentry 'Linux netboot' {
linux /images/linux ip=dhcp console=tty0
initrd /images/initrd.img
}
На практике путь и параметры зависят от дистрибутива.
Для совместимости можно также положить:
sudo cp /srv/tftp/EFI/BOOT/grub.cfg /srv/tftp/grub.cfg
9. Secure Boot
Если включен Secure Boot, неподписанный EFI-файл может не загрузиться.
Цепочка доверия обычно такая:
UEFI firmware
-> shimx64.efi
-> grubx64.efi
-> kernel
Варианты:
- Для тестового стенда отключить Secure Boot.
- Использовать подписанные загрузчики дистрибутива.
- Использовать
shim, подписанный ключами Microsoft/дистрибутива. - Использовать MOK, если нужно запускать собственные подписанные модули.
- Для промышленной эксплуатации применять подписанные ядра и initrd там, где это требуется.
Важно:
Сам TFTP не обеспечивает целостность и подлинность файлов. Если важен Secure Boot и безопасность, лучше использовать HTTPS и подписанные образы.
10. iPXE: более гибкая замена классическому TFTP-PXE
10.1. Зачем нужен iPXE
iPXE — сетевой загрузчик с поддержкой:
- HTTP;
- HTTPS;
- скриптов;
- меню;
- загрузки по URL;
- переменных;
- повторных попыток;
- более удобной диагностики.
Типичная цепочка:
PXE ROM -> undionly.kpxe/ipxe.efi -> boot.ipxe -> kernel/initrd по HTTP
10.2. Файлы iPXE
Для BIOS обычно используется:
undionly.kpxe
или:
ipxe.pxe
Для UEFI:
ipxe.efi
10.3. Пример конфигурации dnsmasq для iPXE
interface=enp1s0
bind-interfaces
port=0
dhcp-range=192.168.100.50,192.168.100.150,255.255.255.0,12h
dhcp-authoritative
enable-tftp
tftp-root=/srv/tftp
# iPXE отправляет опцию 175
dhcp-match=set:ipxe,175
# Если клиент уже iPXE — отдаем скрипт
dhcp-boot=tag:ipxe,http://192.168.100.10/boot.ipxe
# Если обычный BIOS PXE — грузим iPXE
dhcp-boot=tag:!ipxe,tag:bios,undionly.kpxe
# Если UEFI PXE — грузим iPXE EFI
dhcp-boot=tag:!ipxe,tag:efi64,ipxe.efi
log-dhcp
log-facility=/var/log/dnsmasq.log
Определение BIOS/UEFI можно добавить так же, как раньше:
dhcp-match=set:bios,option:client-arch,0
dhcp-match=set:efi64,option:client-arch,7
dhcp-match=set:efi64,option:client-arch,9
10.4. Пример скрипта boot.ipxe
#!ipxe
menu
item local Local boot
item alpine Alpine Linux
choose --default local --timeout 30000 target && goto ${target}
:local
exit
:alpine
kernel http://192.168.100.10/alpine/vmlinuz-lts ip=dhcp alpine_repo=http://192.168.100.10/alpine/repo modules=loop,squashfs quiet
initrd http://192.168.100.10/alpine/initramfs-lts
boot
Файл boot.ipxe нужно отдавать по HTTP, например через nginx.
Пример установки nginx:
sudo apt install -y nginx
sudo mkdir -p /var/www/pxe
sudo cp boot.ipxe /var/www/pxe/
В простейшем случае nginx уже будет отдавать /var/www/html или /var/www/pxe, в зависимости от конфигурации.
11. Что загружать после ядра и initrd
PXE-загрузка не заканчивается на получении vmlinuz и initrd. Дальше система должна откуда-то взять корневую файловую систему или установочные файлы.
Основные варианты:
11.1. Установка ОС
Ядро и initrd загружаются по TFTP/HTTP, затем installer сам скачивает пакеты по сети.
Примеры:
- Debian Installer;
- Ubuntu Subiquity / netboot;
- Fedora/Red Hat Kickstart;
- openSUSE YaST;
- Alpine netboot;
- Windows PE через WDS. Параметры ядра зависят от дистрибутива.
11.2. Live-система по HTTP
Многие live-образы умеют монтировать squashfs по HTTP.
Примерный смысл параметров:
ip=dhcp
fetch=http://server/path/filesystem.squashfs
или:
ip=dhcp
url=http://server/path/image.iso
Конкретные параметры зависят от дистрибутива.
11.3. NFS root
Для бездисковых станций часто используют NFS.
Параметры ядра:
ip=dhcp root=/dev/nfs nfsroot=192.168.100.10:/srv/nfs/root rw
На сервере нужен NFS-экспорт:
sudo mkdir -p /srv/nfs/root
sudo nano /etc/exports
Пример:
/srv/nfs/root 192.168.100.0/24(rw,sync,no_root_squash,no_subtree_check)
Применить:
sudo exportfs -rav
sudo systemctl restart nfs-kernel-server
Важно:
Initramfs должен поддерживать NFS. В Debian/Ubuntu это обычно настраивается через initramfs-tools.
11.4. iSCSI / NBD / COW
Для более сложных diskless-схем можно использовать:
- iSCSI root;
- NBD;
- overlayfs;
- copy-on-write;
- squashfs + tmpfs;
- systemd-remount-fs;
- специализированные решения вроде LTSP, DRBL, FOG.
12. Windows Deployment Services, WDS
Если нужно устанавливать Windows, обычно используют WDS.
Базовая логика
- На Windows Server устанавливается роль WDS.
- Настраивается каталог
RemoteInstall. - Добавляется boot image, обычно Windows PE.
- Добавляются install image.
- Клиент загружается по PXE.
- Запускается Windows PE.
- Начинается установка Windows.
Основные компоненты
wdsnbp.com— часто используется для BIOS-загрузки;- EFI-файлы из каталога
Boot— для UEFI; bootmgr.exe;wdsmgfw.efiили аналогичный EFI-загрузчик, в зависимости от версии;boot.wim— Windows PE;install.wim/install.esd— образ установки Windows.
Особенности DHCP для WDS
Если WDS и DHCP стоят на одном сервере:
- часто настраивают WDS так, чтобы он не слушал DHCP-порт;
- добавляют DHCP option 60;
- либо настраивают WDS на совместную работу с DHCP.
Если DHCP отдельный:
- обычно указывают option 66 — сервер WDS;
- option 67 — boot-файл WDS.
Примеры для BIOS/UEFI зависят от версии Windows Server, поэтому лучше сверяться с документацией Microsoft и фактическими файлами в
RemoteInstall\Boot.
13. Корпоративные сетевые нюансы
13.1. VLAN и DHCP relay
Если PXE-клиенты находятся в другом VLAN, DHCP-запросы нужно ретранслировать.
На L3-коммутаторе/маршрутизаторе обычно настраивается:
ip helper-address <IP PXE/DHCP-сервера>
Нужно убедиться, что relay корректно передает DHCP-опции, особенно:
- option 60;
- option 66;
- option 67;
- option 93. Иногда старые relay или оборудование плохо обрабатывают PXE-опции.
13.2. Spanning Tree
PXE-клиент может не дождаться, пока порт перейдет в forwarding.
На коммутаторе для портов с PXE-клиентами включают:
spanning-tree portfast
или аналог:
stp edge port
Также полезен RSTP/MSTP вместо медленного классического STP.
13.3. Firewall
Для классической PXE-схемы нужно разрешить:
UDP 67 DHCP server
UDP 68 DHCP client
UDP 69 TFTP
Также могут понадобиться:
TCP 80 HTTP
TCP 443 HTTPS
TCP/UDP NFS
TCP iSCSI
Для TFTP важно учитывать, что данные идут не только через порт 69. TFTP использует дополнительные UDP-порты, поэтому нужен корректный conntrack или правило для related/established.
Пример для ufw:
sudo ufw allow 67/udp
sudo ufw allow 69/udp
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
Но для production лучше ограничивать по интерфейсу и подсети.
13.4. PXE и Wi-Fi
Обычно Wi-Fi не используется для PXE. PXE чаще всего работает по проводному Ethernet.
Есть исключения:
- некоторые корпоративные решения;
- HTTP Boot поверх Wi-Fi в отдельных UEFI-реализациях;
- специфические прошивки. Но в общем случае ориентируйтесь на Ethernet.
14. Безопасность PXE
PXE — мощный механизм, но при отсутствии контроля он может стать вектором атаки.
Основные риски
- Подмена DHCP-сервера.
- Подмена TFTP/HTTP-сервера.
- Загрузка вредоносной ОС.
- Перехват данных, если используется HTTP без TLS.
- Несанкционированная установка ОС.
- Загрузка live-системы с доступом к локальному диску.
Рекомендации
- Изолируйте PXE-инфраструктуру в отдельном VLAN.
- Используйте DHCP snooping на коммутаторах.
- Ограничивайте доступ к TFTP/HTTP файрволом.
- Не выставляйте TFTP наружу.
- Используйте HTTPS там, где возможно.
- Проверяйте контрольные суммы и подписи образов.
- Для UEFI используйте Secure Boot и подписанные загрузчики.
- Ограничивайте физический доступ к машинам.
- Отключайте PXE там, где он не нужен.
- Логируйте DHCP/TFTP/HTTP-запросы.
- Используйте ACL на сетевом оборудовании.
15. Диагностика и траблшутинг
15.1. Клиент не получает IP-адрес
Проверьте:
- линк на порту;
- VLAN;
- DHCP relay;
- отсутствие другого DHCP-сервера;
- фаервол;
- что
dnsmasqслушает нужный интерфейс; - что интерфейс не заблокирован.
Команды:
sudo tcpdump -i enp1s0 -n -vvv udp port 67
sudo journalctl -u dnsmasq -f
tail -f /var/log/dnsmasq.log
Если в tcpdump есть DHCPDISCOVER, но нет DHCPOFFER:
sudo systemctl status dnsmasq
sudo dnsmasq --test
15.2. IP есть, но нет TFTP-загрузки
Проверьте:
next-server;filename;- option 66;
- option 67;
- доступность TFTP;
- путь к файлу;
- права;
- firewall.
Проверка TFTP вручную:
sudo apt install -y tftp-hpa
tftp 192.168.100.10
Внутри:
binary
get pxelinux.0
quit
Или:
tftp 192.168.100.10 -c get pxelinux.0
Смотрите TFTP-запросы:
sudo tcpdump -i enp1s0 -n -vvv udp port 69
15.3. Файл скачивается, но PXELINUX ругается на отсутствующий файл
Часто не хватает:
ldlinux.c32
libcom32.c32
libutil.c32
menu.c32
vesamenu.c32
Для PXELINUX 6+ ldlinux.c32 обязателен.
Проверьте содержимое:
ls -l /srv/tftp
15.4. PXELINUX запускается, но ядро не грузится
Причины:
- неверный путь к
KERNEL; - неверный путь к
INITRD; - неверные параметры
APPEND; - initrd не содержит нужных драйверов сети;
- initrd не умеет монтировать корень;
- файл слишком большой для TFTP-клиента;
- клиенту не хватает памяти.
Проверьте конфиг:
cat /srv/tftp/pxelinux.cfg/default
Проверьте наличие файлов:
ls -l /srv/tftp/images/example
15.5. UEFI-клиент не грузится
Проверьте:
- отдается ли BIOS-файл вместо UEFI;
- существует ли
bootx64.efi; - включен ли Secure Boot;
- поддерживает ли клиент UEFI PXE;
- включен ли CSM/Legacy;
- правильный ли путь в
dhcp-boot; - использует ли клиент HTTP Boot вместо TFTP.
Проверка логов DHCP:
tail -f /var/log/dnsmasq.log
Ищите option 93.
15.6. Работает в виртуалке, но не работает на железе
Причины:
- PXE ROM старой версии;
- PXE отключен в BIOS/UEFI;
- включен только IPv6 PXE;
- включен Secure Boot;
- используется только HTTP Boot;
- сетевая карта не поддерживает Legacy PXE;
- нужен UEFI-загрузчик;
- STP задерживает порт;
- используется Wi-Fi вместо Ethernet.
15.7. TFTP работает очень медленно
Причины:
- маленький размер блока;
- отсутствие поддержки window size;
- плохой канал;
- фаервол режет UDP;
- перегруженный сервер.
Решения:
- включить поддержку blocksize/window size;
- использовать iPXE + HTTP;
- использовать nginx для больших файлов;
- использовать кэш/CDN внутри сети;
- проверить MTU и дуплекс.
16. Полезные команды для диагностики
Проверка DHCP:
sudo tcpdump -i enp1s0 -n -vvv udp port 67 or udp port 68
Проверка TFTP:
sudo tcpdump -i enp1s0 -n -vvv udp port 69
Логи dnsmasq:
sudo journalctl -u dnsmasq -f
tail -f /var/log/dnsmasq.log
Проверка TFTP-файлов:
ls -lR /srv/tftp
Проверка прав:
namei -l /srv/tftp/pxelinux.0
Проверка слушаемых UDP-портов:
sudo ss -ulpn | grep :69
SELinux, если используется:
sudo ausearch -m avc -ts recent
sudo restorecon -Rv /srv/tftp
17. Пример более полной конфигурации dnsmasq для BIOS + UEFI
Файл:
/etc/dnsmasq.d/pxe.conf
Содержимое:
interface=enp1s0
bind-interfaces
port=0
dhcp-range=192.168.100.50,192.168.100.150,255.255.255.0,12h
dhcp-authoritative
enable-tftp
tftp-root=/srv/tftp
# Определяем архитектуру клиента
dhcp-match=set:bios,option:client-arch,0
dhcp-match=set:efi32,option:client-arch,6
dhcp-match=set:efi64,option:client-arch,7
dhcp-match=set:efi64,option:client-arch,9
# Определяем iPXE
dhcp-match=set:ipxe,175
# Если клиент уже iPXE, отдаем скрипт
dhcp-boot=tag:ipxe,http://192.168.100.10/boot.ipxe
# BIOS без iPXE
dhcp-boot=tag:!ipxe,tag:bios,pxelinux.0
# UEFI без iPXE
dhcp-boot=tag:!ipxe,tag:efi32,bootia32.efi
dhcp-boot=tag:!ipxe,tag:efi64,EFI/BOOT/bootx64.efi
# Fallback
dhcp-boot=pxelinux.0
# Логирование
log-dhcp
log-facility=/var/log/dnsmasq.log
Проверка синтаксиса:
sudo dnsmasq --test
Перезапуск:
sudo systemctl restart dnsmasq
18. Пример структуры файлов на сервере
/srv/tftp/
├── pxelinux.0
├── ldlinux.c32
├── libcom32.c32
├── libutil.c32
├── menu.c32
├── vesamenu.c32
├── undionly.kpxe
├── ipxe.efi
├── pxelinux.cfg/
│ └── default
├── EFI/
│ └── BOOT/
│ ├── bootx64.efi
│ └── grub.cfg
└── images/
├── debian/
│ ├── linux
│ └── initrd.gz
├── ubuntu/
│ ├── vmlinuz
│ └── initrd
└── alpine/
├── vmlinuz-lts
└── initramfs-lts
19. Типовые ошибки
Ошибка: PXE-E32: TFTP open timeout
Причины:
- TFTP-сервер недоступен;
- неверный
next-server; - firewall;
- нет маршрута;
- TFTP-сервис не запущен.
Ошибка: PXE-E11: ARP timeout
Причины:
- нет связи на канальном уровне;
- VLAN;
- порт в blocking состоянии;
- неверный кабель;
- коммутатор не пропустил трафик.
Ошибка: PXE-E53: No boot filename received
Причины:
- DHCP не отдал filename;
- не настроена option 67;
- неверная логика тегов в dnsmasq;
- клиент UEFI, а отдается BIOS-файл;
- DHCP-сервер не ответил PXE-опциями.
Ошибка: No configuration file found у PXELINUX
Причины:
- отсутствует
pxelinux.cfg/default; - неверные права;
- неправильный путь;
- TFTP root не совпадает с ожидаемым.
Ошибка: Could not find ldlinux.c32
Решение:
sudo cp /usr/lib/syslinux/modules/bios/ldlinux.c32 /srv/tftp/
sudo chmod a+r /srv/tftp/ldlinux.c32
Ошибка: Access denied при TFTP
Причины:
- нет прав на чтение;
- SELinux/AppArmor блокирует;
- файл вне
tftp-root; - используется абсолютный путь, который TFTP не разрешает.
20. Рекомендуемая схема для production
Для надежной production-схемы лучше использовать:
DHCP/relay
|
v
PXE-ответ с разделением BIOS/UEFI
|
v
iPXE или GRUB
|
v
HTTP/HTTPS-репозиторий образов
|
v
Подписанные kernel/initrd/bootloader
|
v
Логирование и мониторинг
Желательно:
- отдельный management/provisioning VLAN;
- DHCP snooping;
- HTTPS;
- подписи образов;
- резервный boot-сервер;
- мониторинг TFTP/HTTP-запросов;
- версионирование конфигов через Git;
- автоматизация через Ansible;
- использование netboot.xyz или собственного iPXE-меню;
- контроль доступа по MAC/UUID.
21. Минимальный чек-лист перед запуском
Проверьте:
- [ ] клиент подключен по Ethernet;
- [ ] PXE включен в BIOS/UEFI;
- [ ] выбран правильный режим: Legacy/UEFI;
- [ ] DHCP-сервер раздает IP;
- [ ] DHCP отдает
next-server; - [ ] DHCP отдает
filename; - [ ] TFTP-сервер доступен;
- [ ] файлы лежат в
tftp-root; - [ ] права на файлы разрешают чтение;
- [ ] BIOS-клиент получает
pxelinux.0; - [ ] UEFI-клиент получает
bootx64.efiили аналог; - [ ] firewall разрешает UDP 67/69;
- [ ] spanning-tree не блокирует порт 30 секунд;
- [ ] нет второго конфликтующего DHCP-сервера;
- [ ] логи DHCP/TFTP включены;
- [ ] kernel/initrd существуют;
- [ ] параметры ядра соответствуют способу загрузки;
- [ ] Secure Boot учтен или отключен.
22. Краткая шпаргалка
Самый простой Linux PXE-сервер
sudo apt install -y dnsmasq pxelinux syslinux-common
sudo mkdir -p /srv/tftp/pxelinux.cfg
sudo cp /usr/lib/PXELINUX/pxelinux.0 /srv/tftp/
sudo cp /usr/lib/syslinux/modules/bios/{ldlinux.c32,libcom32.c32,libutil.c32,menu.c32,vesamenu.c32} /srv/tftp/
sudo chmod -R a+rX /srv/tftp
Конфиг:
sudo nano /etc/dnsmasq.d/pxe.conf
Минимально:
interface=enp1s0
bind-interfaces
port=0
dhcp-range=192.168.100.50,192.168.100.150,255.255.255.0,12h
dhcp-authoritative
enable-tftp
tftp-root=/srv/tftp
dhcp-boot=pxelinux.0
log-dhcp
Запуск:
sudo systemctl restart dnsmasq
sudo journalctl -u dnsmasq -f
23. Итог
PXE-загрузка состоит из нескольких простых, но требовательных к деталям этапов:
- Клиент должен получить IP по DHCP.
- DHCP должен сказать, где находится boot-сервер и какой файл грузить.
- Клиент скачивает загрузчик по TFTP или HTTP.
- Загрузчик должен соответствовать BIOS/UEFI-режиму клиента.
- Дальше загружаются kernel/initrd или Windows PE.
- Система должна получить rootfs/install-файлы по сети.
Для небольшой сети проще всего использовать:
dnsmasq + TFTP + PXELINUX/GRUB
Для более гибкой и безопасной схемы лучше использовать:
PXE -> iPXE/GRUB -> HTTP/HTTPS -> подписанные образы
Для Windows-инфраструктуры обычно применяется:
WDS + Windows PE + DHCP/TFTP/HTTP Boot
Мы делимся этой технической информацией, чтобы помочь вам в решении задач — используйте её с пониманием. Статья носит рекомендательный характер, поэтому, пожалуйста, применяйте описанные методы осмотрительно.