Загрузка ОС по сети: DHCP, TFTP и PXE
PXE (Preboot eXecution Environment) — это возможность загрузить операционную систему по сети, вообще без локального носителя. Пригождается при массовой установке на «голое» железо, в тонких клиентах, в recovery-сценариях и для бездисковых машин.
Вся загрузка строится на трёх вещах: DHCP (получить адрес и узнать, что грузить), TFTP (скачать начальный загрузчик) и самом загрузчике, который дальше тянет ядро и систему.
Роли в процессе
- DHCP-сервер выдаёт клиенту IP и, главное, две опции:
66(TFTP Server Name) — адрес TFTP-сервера, и67(Bootfile Name) — имя файла, который нужно скачать. - TFTP-сервер отдаёт начальный загрузчик. TFTP — простой протокол на UDP (порт 69), без аутентификации, с маленькими блоками (512 байт), поэтому он годится для компактного загрузчика, но медленный для больших образов.
- Загрузчик (pxelinux, GRUB, iPXE) уже умеет читать свой конфиг и качать остальное — в том числе по HTTP, который заметно быстрее 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-система ====
- Машина с поддержкой PXE (включена в BIOS/UEFI) делает обычный DHCP-запрос, добавив опцию 60 со значением
PXEClient. - DHCP-сервер в ответе вместе с адресом отдаёт опции 66 и 67 — куда идти за загрузчиком.
- Клиент по TFTP скачивает bootfile.
- Загрузчик читает свой конфиг и подтягивает ядро с initrd (по TFTP или HTTP).
- Ядро стартует, initrd монтируется — дальше установщик или live-система.
BIOS против UEFI
Загрузчик для BIOS (pxelinux.0) не подходит для UEFI и наоборот — для UEFI нужен grubx64.efi или shimx64.efi. Чтобы сервер сам выдавал нужный файл, DHCP-запрос несёт опцию 93 (Client System Architecture):
0— BIOS;7/9— UEFI x64.
Сервер, видя опцию 93, подставляет правильный bootfile, и один и тот же конфиг обслуживает и старые, и новые машины.
iPXE
iPXE — продвинутый загрузчик, который сильно расширяет стандартный PXE:
- умеет качать по HTTP/HTTPS (быстрее TFTP);
- поддерживает скрипты и меню;
- умеет «цеплять» другой загрузчик (chainloading).
Его можно либо прошить в сетевую карту, либо отдавать как 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 не аутентифицируют участников, поэтому сетевая загрузка имеет смысл только в доверенной сети:
- посторонний может получить загрузку по сети или подменить TFTP-сервер;
- для ненадёжных сетей используйте iPXE с HTTPS и подписанные загрузчики (Secure Boot + shim);
- изолируйте загрузочную сеть от остального трафика, если это возможно.
Итог
PXE-загрузка — это связка DHCP (адрес + «куда идти»), TFTP (маленький загрузчик) и загрузчика (ядро и система, уже по быстрому HTTP). Для ручной настройки достаточно dnsmasq, а если хочется готовое меню из ISO-образов — берём iVentoy от проекта Ventoy.