ГлавнаяСтатьиПроект YvixSlideCraft

Загрузка ОС по сети: DHCP, TFTP и PXE

PXE (Preboot eXecution Environment) — это возможность загрузить операционную систему по сети, вообще без локального носителя. Пригождается при массовой установке на «голое» железо, в тонких клиентах, в recovery-сценариях и для бездисковых машин.

Вся загрузка строится на трёх вещах: DHCP (получить адрес и узнать, что грузить), TFTP (скачать начальный загрузчик) и самом загрузчике, который дальше тянет ядро и систему.

Роли в процессе

TFTP в двух словах

TFTP (Trivial File Transfer Protocol) умеет только читать и писать файлы. Никакой аутентификации, каталогов и листинга. Именно из-за простоты его прошивают в сетевые карты: PXE-код умеет «из коробки» качать файлы по TFTP.

На практике файлы для загрузки кладут в каталог, например /srv/tftp:

/srv/tftp/pxelinux.0            # загрузчик для BIOS
/srv/tftp/ldlinux.c32           # модули syslinux
/srv/tftp/pxelinux.cfg/default  # конфиг загрузчика
/srv/tftp/kernel/vmlinuz        # ядро
/srv/tftp/initrd/initrd.img     # initrd

Цепочка загрузки

 Клиент (PXE)                 DHCP-сервер                  TFTP-сервер
     |                            |                            |
     |-- DHCP Discover ---------->|                            |
     |   (option 60: PXEClient)   |                            |
     |<- Offer: IP + 66,67 -------|                            |
     |-- DHCP Request ----------->|                            |
     |<- Ack ---------------------|                            |
     |                                                        |
     |-- TFTP: скачать bootfile ----------------------------> |
     |<- загрузчик (pxelinux.0 / grubx64.efi / ipxe) -------- |
     |                                                        |
     |-- читает конфиг, качает ядро + initrd (TFTP или HTTP)  |
     |<- ядро + initrd -------------------------------------- |
     |                                                        |
     |== старт ядра, дальше установка или live-система ====
  1. Машина с поддержкой PXE (включена в BIOS/UEFI) делает обычный DHCP-запрос, добавив опцию 60 со значением PXEClient.
  2. DHCP-сервер в ответе вместе с адресом отдаёт опции 66 и 67 — куда идти за загрузчиком.
  3. Клиент по TFTP скачивает bootfile.
  4. Загрузчик читает свой конфиг и подтягивает ядро с initrd (по TFTP или HTTP).
  5. Ядро стартует, initrd монтируется — дальше установщик или live-система.

BIOS против UEFI

Загрузчик для BIOS (pxelinux.0) не подходит для UEFI и наоборот — для UEFI нужен grubx64.efi или shimx64.efi. Чтобы сервер сам выдавал нужный файл, DHCP-запрос несёт опцию 93 (Client System Architecture):

Сервер, видя опцию 93, подставляет правильный bootfile, и один и тот же конфиг обслуживает и старые, и новые машины.

iPXE

iPXE — продвинутый загрузчик, который сильно расширяет стандартный PXE:

Его можно либо прошить в сетевую карту, либо отдавать как bootfile через TFTP, а дальше он уже работает сам.

Минимальный пример на dnsmasq

dnsmasq умеет быть одновременно DHCP- и TFTP-сервером — удобно для теста:

# /etc/dnsmasq.conf
interface=lan0
dhcp-range=192.0.2.100,192.0.2.200,255.255.255.0,12h

# TFTP-сервер и файл загрузчика (для BIOS)
dhcp-option=66,"192.0.2.10"
dhcp-option=67,"pxelinux.0"

enable-tftp
tftp-root=/srv/tftp

Для UEFI можно задавать файл по архитектуре через dhcp-match + dhcp-boot — суть та же, только выбирается grubx64.efi вместо pxelinux.0.

Ventoy и iVentoy

Ventoy — известный инструмент мультизагрузки: на флешку просто копируешь ISO-образы, и при старте получаешь меню выбора. У проекта есть и сетевая версия — iVentoy.

iVentoy — это, по сути, PXE-сервер с той же идеей: кладёшь ISO в каталог, и они становятся доступны для загрузки по сети. Он сам поднимает DHCP/PXE/TFTP (и HTTP), отдаёт меню выбора образа и умеет грузить как в BIOS, так и в UEFI. Работает на Linux и Windows, есть готовые Docker-образы — это самый быстрый способ «поднять PXE-сервер» без ручной возни с pxelinux и конфигами.

Безопасность

DHCP и TFTP не аутентифицируют участников, поэтому сетевая загрузка имеет смысл только в доверенной сети:

Итог

PXE-загрузка — это связка DHCP (адрес + «куда идти»), TFTP (маленький загрузчик) и загрузчика (ядро и система, уже по быстрому HTTP). Для ручной настройки достаточно dnsmasq, а если хочется готовое меню из ISO-образов — берём iVentoy от проекта Ventoy.