Как я устал настраивать PXE ради одного сервера и написал генератор ISO для автоматической установки Linux
Привет! Наверное каждый, кто хоть раз устанавливал Linux на удаленный сервер через IPMI/KVM с лагающей мышкой, знает эту боль. А что если нужно установить систему на 10 серверов? Конечно лучше поднять свой PXE-сервер, настроить TFTP, DHCP, загрузчики, написать конфиги kickstart. Но что делать если удаленные серверы в разных вланах или в разных ДЦ?
Я решил попробовать автоматизировать этот процесс в результате чего и появился net2boot.xyz — бесплатный сервис, который генерирует крошечный ISO размером всего 2 МБ для полной автоматической установки системы.
Сначала я с помощью grub2-mkrescue вручную собирал образ - редактировал grub.cfg, kickstart.cfg, т.к. разбивка дисков на всех серверах была одинаковой, то требовалось только изменить настройки сети и хостнейм. Размер образа учитывая, что он содержал ядро и initrd, составлял порядка 120 МБ. Это помогло упростить установку - достаточно было подключить образ через ipmiview или idrac, перезагрузить сервер и выбрать в качестве загрузочного устройства cdrom. Но если при редактировании конфигурационных файлов была допущена ошибка - то приходилось заново вносить изменения, пересобирать и подключать образ, но на этапе поиска решения это не вызывало особых проблем.
И вот вроде бы отличное решение для автоматизации - самодостаточный образ для автоматической установки. Но меня в нем не устраивал размер самого образа и то что нужно было передавать mac-адрес в параметрах ядра загрузчика - иначе если активных линков на сервере несколько, то ядро не могло настроить сеть. Поэтому выбор пал на сетевой загрузчик ipxe - теперь ядро и intrd загружались по сети, а скрипт сам перебирает сетевые интерфейсы, пока не найдет нужный линк. Размер образа при этом сократился до 2 МБ.
Автоматическая разбивка. Следующим этапом стала автоматическая разбивка - задачей стало поддерживать наиболее распространенные схемы и типы дисков. В современных версиях (RHEL 9, AlmaLinux 9, Fedora 43) инсталлятор падает с ошибкой, если попытаться разместить раздел /boot внутри программного RAID 10. Генератор автоматически определяет эту ситуацию. Если вы выбрали RAID 10, скрипт создаст /boot на отдельном RAID 1 (зеркале из первых двух дисков), а корень / и данные положит на RAID 10 (на все 4 диска). Это происходит прозрачно для пользователя.
Какой диск выбрать? На сервере может быть несколько дисков: 2 маленьких SSD под систему и 4 больших HDD под данные. Или NVMe вперемешку с SATA. В генераторе я написал логику умной сортировки. Скрипт проверяет тип диска (rotational или non-rotational). Сортирует диски по размеру: от меньшего к большему. ОС всегда ставится на самые маленькие диски выбранного типа. Пример: Если вы выбрали тип "SSD" и схему "RAID 1", а в сервере стоят два SSD по 240 ГБ и два по 1 ТБ, система встанет на те, что по 240 ГБ. Но стоит обратить внимание - если на сервере используется аппаратный RAID-контроллер и диски подключены в RAID-режиме, необходимо выбирать тип диска HDD. Это же относится и к виртуальным машинам, если вы решите протестировать образ в VM.
Что в итоге получилось? Заходите на сайт - переходите к форме создания образа. Вводите настройки сети, хеш пароля (обратите внимание на подсказки), выбираете схему дисков Standard, LVM, RAID 1/10 и тип SSD/NVMe/HDD. В ISO зашит загрузчик iPXE, а также сгенерированный kickstart-файл. При загрузке он настраивает сеть и скачивает ядро Linux с официальных зеркал. Запускается Anaconda и ставит систему без единого клика.
Работает и с Legacy BIOS, и с UEFI. Безопасность: Пароли не хранятся и не передаются в открытом виде (приниматся только SHA-512 хэш). Поддержка: AlmaLinux, RockyLinux, CentOS Stream и Fedora.
Проект бесплатный, делал для себя, чтобы не писать конфиги руками каждый раз. Буду рад, если кому-то это сэкономит время и нервы.