Сразу: без корректной разметки сети загрузка по PXE не стартует. Забудьте про импровизацию. Первый шаг – сегмент сети должен видеть TFTP и DHCP. Никаких NAT. IP-адрес сервера фиксированный, шлюз по умолчанию – в сторону клиентов. DHCP – с точной выдачей опций 66 и 67.
Файл конфигурации для dnsmasq, если всё разворачивается в изоляции:
interface=eth0
bind-interfaces
dhcp-range=192.168.0.100,192.168.0.200,12h
dhcp-boot=pxelinux.0,pxeserver,192.168.0.1
enable-tftp
tftp-root=/srv/tftp
Сервер загрузки должен находиться в одной подсети с получателями. Red-системы не прощают лень – syslinux не в том месте, или не тот initrd – ничего не загрузится. Больше никаких волшебных кнопок. Всё вручную. Всё явно.
Важно: в каталоге TFTP не должно быть симлинков, большинство клиентов по PXE их игнорирует. Только реальные файлы, только хардкор.
Далее – образ системы. Не копировать ISO целиком. Монтировать. Вытаскивать ядро и initrd. Они в /isolinux/ или /wp-content/uploads/2025/05/pxeboot/, зависит от редакции. Red OS меняет расположение между мажорными версиями. Проверяйте. Не гадайте.
Пример строки загрузки в pxelinux.cfg/default:
LABEL redos
KERNEL vmlinuz
APPEND initrd=initrd.img inst.repo=http://192.168.0.1/RedOS mountdir method
HTTP-сервер обязателен. Лучше – httpd, стандартный Apache. Убедитесь, что SELinux не блокирует доступ. На Red OS это частая ловушка. Разрешаем:
setsebool -P httpd_read_user_content 1
chcon -R -t httpd_sys_content_t /var/www/html
Помните: без доступного kickstart-файла массовый деплой невозможен. Ручная установка с PXE – это 2009 год.
Kickstart-файл кладётся рядом с образом. В конфигурации ядра добавляется:
inst.ks=http://192.168.0.1/ks.cfg
Файл должен быть строго валиден. Red OS парсит его без предупреждений. Ошибка – тишина. Проверка – через ksvalidator из пакета pykickstart.
И да, DNS не обязателен. PXE – про IP. Без лишних зависимостей. Чем проще, тем надёжнее. Хотите автоматизацию – Ansible. Хотите контроль – всё руками.
Содержание статьи
Подготовка сетевой инфраструктуры для PXE-загрузки
Сначала отключите DHCP на всех активных маршрутизаторах. Никаких двойных раздач. Конфликты по IP убивают авторазвёртывание на корню. Только один узел в сети должен отвечать на DHCP-запросы. Не угадывайте, проверяйте tcpdump -i eth0 port 67 or port 68.
IP-схема должна быть предельно прозрачной. Сервер загрузки – фиксированный IP, желательно в начале диапазона, например 192.168.10.1. Диапазон выдачи DHCP – выше. Минимум помех, максимум предсказуемости. Пример конфигурации:
interface=ens33
dhcp-range=192.168.10.100,192.168.10.200,6h
dhcp-boot=pxelinux.0,bootnode,192.168.10.1
enable-tftp
tftp-root=/var/lib/tftpboot
Порты 67 UDP и 69 UDP должны быть открыты. Если на машине firewall – не забудьте:
firewall-cmd --add-port=67/udp --permanent
firewall-cmd --add-port=69/udp --permanent
firewall-cmd --reload
Важно, чтобы имя загрузочного файла (опция 67) соответствовало реально существующему в tftp-root файлу. Ошибка – и клиент зависает в ожидании. Не дожидайтесь. Проверяйте руками. Клиенты не подсказывают, где сбой. Они просто молчат.
Внимание! Используйте только кабельное подключение. PXE через Wi-Fi – бессмысленная затея. MAC-адреса, broadcast, DHCPDISCOVER – всё ляжет под натовскими точками доступа.
Проверьте, не блокирует ли коммутатор broadcast-пакеты. Если включён IGMP Snooping – беда. Отключайте или настраивайте исключения. PXE – не про многоадресную маршрутизацию. Ему нужен шум в эфире.
Если клиент не получает адрес – первое, что смотрим: journalctl -u dnsmasq. Лог не врет. Ошибка конфигурации – сразу видно. Не читайте форумов, читайте логи.
В случае сетей с VLAN – убедитесь, что tagged-трафик не мешает PXE-запросам. Не все прошивки поддерживают 802.1Q. Вешайте сервер и клиентов на одну плоскую VLAN. Примитивно, зато работает.
Помните: если один узел отвечает дольше остальных – клиент может выбрать неправильный DHCP. Всегда контролируйте задержки. Проверяйте ping с клиента перед стартом. Меньше 1 мс – хорошо. Больше – ищите, кто тормозит.
Физика важнее логики. Кабели. Коммутаторы. Порты. PXE – это не про магию. Это про прямые руки и последовательность.
Установка и настройка TFTP-сервера для передачи загрузочных файлов
Ставим tftp-server и xinetd. Да, xinetd, а не systemd-сокеты. Надежнее. Меньше сюрпризов. В Red-системах он штатный:
dnf install -y tftp-server xinetd
Файл /etc/xinetd.d/tftp обязан быть приведен к такому виду:
service tftp
{
socket_type = dgram
protocol = udp
wait = yes
user = root
server = /usr/sbin/in.tftpd
server_args = -s /var/lib/tftpboot
disable = no
}
Папка /var/lib/tftpboot должна существовать. Права 0755. Владелец – root. Никаких симлинков. Никаких лишних точек монтирования. Только голые файлы. Внимание на SELinux:
chcon -R -t tftpdir_t /var/lib/tftpboot
restorecon -Rv /var/lib/tftpboot
Запуск:
systemctl enable xinetd
systemctl start xinetd
Проверка доступности с клиента:
tftp 192.168.10.1
tftp> get pxelinux.0
Received 12345 bytes in 0.1 seconds
Важно помнить: если TFTP не отвечает – виноват не он. Проверяйте firewall. Проверяйте SELinux. Проверяйте лог xinetd:
journalctl -u xinetd.
Пакет syslinux обязателен. Без него нет pxelinux.0, ldlinux.c32, menu.c32. Все они кладутся в /var/lib/tftpboot вручную:
dnf install -y syslinux
cp /usr/share/syslinux/pxelinux.0 /var/lib/tftpboot/
cp /usr/share/syslinux/*.c32 /var/lib/tftpboot/
Каталог /var/lib/tftpboot/pxelinux.cfg обязателен. В нем конфигурации. Файл default – минимум. Без него меню не появится, клиент просто повиснет на точке.
- Права на файлы – 0644
- Права на каталог – 0755
- Файлы копировать, не перемещать. Иначе потеря контекста безопасности
Проверяйте всё с tcpdump. Простой способ отследить попытку клиента:
tcpdump -i eth0 udp port 69
Помните: tftp – тупой как пробка. Он не ругается, не пишет в лог, не подсказывает. Или работает, или молчит. Проверка – только с клиента.
Ждите от него отказов, если клиент просит файл, которого нет. Или если SELinux блокирует доступ. Логов ноль. Диагностика – через руки и нервную систему.
Настройка DHCP-сервера с параметрами PXE-загрузки
Не используйте dnsmasq, если сеть сложная. Берите isc-dhcp-server. Он точнее. Он прямее. Он предсказуем. Установка:
dnf install -y dhcp-server
Файл /etc/dhcp/dhcpd.conf. Без ошибок. Без сокращений. Всё явно. Пример рабочего фрагмента:
option domain-name "local";
option domain-name-servers 192.168.0.1;
default-lease-time 600;
max-lease-time 7200;
authoritative;
subnet 192.168.0.0 netmask 255.255.255.0 {
range 192.168.0.100 192.168.0.200;
option routers 192.168.0.1;
next-server 192.168.0.1;
filename "pxelinux.0";
}
next-server – IP узла, который отдаёт через TFTP. Не hostname. Не доменное имя. Только IP. filename – имя файла, которое клиент запрашивает первым. Не угадывайте. Откройте /var/lib/tftpboot и убедитесь, что он там лежит.
Важно: большинство UEFI-клиентов не загружаются через
pxelinux.0. Им нуженgrubx64.efi. Это значит: конфигурация должна учитывать архитектуру. Иначе – тишина и черный экран.
Вариант с архитектурным разделением. Это уже продакшн-уровень. Используем классы клиентов:
class "pxeclients" {
match if substring(option vendor-class-identifier, 0, 9) = "PXEClient";
next-server 192.168.0.1;
filename "pxelinux.0";
}
class "uefi-clients" {
match if substring(option vendor-class-identifier, 0, 20) = "HTTPClient:Arch:00007";
next-server 192.168.0.1;
filename "grubx64.efi";
}
Запуск:
systemctl enable dhcpd
systemctl start dhcpd
Проверка состояния:
journalctl -u dhcpd
Если ругается на интерфейс – пропишите его в /etc/sysconfig/dhcpd:
DHCPDARGS=eth0
После правок перезапуск обязателен:
systemctl restart dhcpd
Помните: без правильной опции
filenameклиент уйдёт в перезагрузку или повиснет в ожидании. Никаких сообщений. Просто мрак.
Если всё задано, но клиент не грузится – снимайте трафик:
tcpdump -i eth0 port 67 or port 68
Пакет должен уходить. Ответ должен приходить. Нет ответа – значит сервер молчит. Лезьте в /var/log/messages или journalctl. Ошибки там.
Аргумент next-server игнорируется, если клиент получил предложение от другого DHCP. Убедитесь, что в сети нет конкурентов. Один DHCP. Один голос.
Размещение установочного образа Red OS и настройка kickstart-файла
Сначала монтируем ISO. Никаких архиваторов. Только loop. Только mount.
mkdir -p /mnt/redos
mount -o loop /tmp/ROSA.ISO /mnt/redos
HTTP-сервер обязателен. Вариантов нет. Копируем содержимое ISO в доступный каталог:
mkdir -p /var/www/html/isos/ros
cp -r /mnt/redos/* /var/www/html/isos/ros/
chown -R apache:apache /var/www/html/isos/ros
SELinux режет всё подряд? Команда одна:
chcon -R -t httpd_sys_content_t /var/www/html/isos/ros
Проверка:
curl http://192.168.0.1/isos/ros/.treeinfo
Если 404 – каталог пустой или SELinux. Не угадывайте, смотрите логи.
Теперь kickstart. Строго в UTF-8 без BOM. Лежит рядом, в той же директории:
/var/www/html/isos/ros/ks.cfg
Минимальный пример работающего ks-файла:
#version=DEVEL
install
url --url=http://192.168.0.1/isos/ros
lang ru_RU.UTF-8
keyboard ru
timezone Europe/Moscow
rootpw redos123
firewall --disabled
authconfig --enableshadow --passalgo=sha512
selinux --disabled
firstboot --disable
reboot
%packages
@core
%end
Внимание! Не вставляйте лишние пробелы в блоках
%packagesи%end. Один пробел – и скрипт не работает. Клиент зависает без сообщений об ошибке.
Ссылка на ks-файл указывается в конфигурации PXE:
LABEL auto
KERNEL vmlinuz
APPEND initrd=initrd.img inst.repo=http://192.168.0.1/isos/ros inst.ks=http://192.168.0.1/isos/ros/ks.cfg
Проверьте: файл должен открываться из браузера. Не открывается – нет доступа. Проверьте права. Проверьте SELinux. Проверьте httpd. Не гадайте. Работайте с фактами.
Помните: без
.treeinfoустановщик не распознает структуру дистрибутива. Даже если всё лежит правильно, путь обязан быть валидным, как в ISO.
Не забудьте про ksvalidator. Это ваш единственный способ узнать, что синтаксис ks-файла не мусор:
dnf install -y pykickstart
ksvalidator /var/www/html/isos/ros/ks.cfg
Любое предупреждение – повод переписать раздел. Установка пойдет – но с сюрпризами. Или не пойдет вообще. Лучше сразу всё проверить, чем потом дебажить по PXE-логу.

