Подробный гайд по PXE-загрузке: от теории до практики

Полный гайд по PXE-загрузке: от теории до практики. Разбираем настройку dnsmasq, DHCP, TFTP, iPXE, GRUB и поддержку BIOS/UEFI для сетевой установки ОС.

2026.08.09                  


Подробный гайд по PXE-загрузке: от теории до практикиПодробный гайд по 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-прошивке материнской платы.

Клиент еще не имеет ОС, поэтому сначала ему нужны:

  1. IP-адрес — обычно через DHCP.
  2. Адрес загрузочного сервера — через DHCP-опции.
  3. Имя загрузочного файла — через DHCP-опции.
  4. Сам загрузчик — обычно по 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-сервер уже работает и менять его нельзя, есть несколько путей:

  1. Настроить существующий DHCP на выдачу PXE-опций.
  2. Использовать ProxyDHCP.
  3. Использовать маршрутизатор/L3-коммутатор с ip helper-address, если клиент в другом VLAN.
  4. Поднять отдельный 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


Варианты:

  1. Для тестового стенда отключить Secure Boot.
  2. Использовать подписанные загрузчики дистрибутива.
  3. Использовать shim, подписанный ключами Microsoft/дистрибутива.
  4. Использовать MOK, если нужно запускать собственные подписанные модули.
  5. Для промышленной эксплуатации применять подписанные ядра и 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.

Базовая логика

  1. На Windows Server устанавливается роль WDS.
  2. Настраивается каталог RemoteInstall.
  3. Добавляется boot image, обычно Windows PE.
  4. Добавляются install image.
  5. Клиент загружается по PXE.
  6. Запускается Windows PE.
  7. Начинается установка 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 — мощный механизм, но при отсутствии контроля он может стать вектором атаки.

Основные риски

  1. Подмена DHCP-сервера.
  2. Подмена TFTP/HTTP-сервера.
  3. Загрузка вредоносной ОС.
  4. Перехват данных, если используется HTTP без TLS.
  5. Несанкционированная установка ОС.
  6. Загрузка 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-загрузка состоит из нескольких простых, но требовательных к деталям этапов:

  1. Клиент должен получить IP по DHCP.
  2. DHCP должен сказать, где находится boot-сервер и какой файл грузить.
  3. Клиент скачивает загрузчик по TFTP или HTTP.
  4. Загрузчик должен соответствовать BIOS/UEFI-режиму клиента.
  5. Дальше загружаются kernel/initrd или Windows PE.
  6. Система должна получить rootfs/install-файлы по сети.

Для небольшой сети проще всего использовать:

dnsmasq + TFTP + PXELINUX/GRUB

Для более гибкой и безопасной схемы лучше использовать:

PXE -> iPXE/GRUB -> HTTP/HTTPS -> подписанные образы

Для Windows-инфраструктуры обычно применяется:

WDS + Windows PE + DHCP/TFTP/HTTP Boot

Мы делимся этой технической информацией, чтобы помочь вам в решении задач — используйте её с пониманием. Статья носит рекомендательный характер, поэтому, пожалуйста, применяйте описанные методы осмотрительно.


Статью подготовил: Аверко Денис Сергеевич @Nymexis г. Омск (5)(· · · — — — · · ·)(30)

Комментарии

Загрузка...
Если комментарии не загружаются, можете попробовать отключить блокировщик рекламы для этого сайта