Настраиваем сетевую загрузку с помощью mikrotik, ipxe, bios, uefi

Настраиваем сетевую загрузку с помощью mikrotik, ipxe для bios, uefi.

Intro

Купил себе два HP Proliant Microserver Gen8, один рабочий, другой не рабочий. Обновил bios, iLO. До последних версии. В принципе покупал сервера только из-за наличия iLO4, с надеждой, что можно эти сервера настроить и отправить в сельскую местность, в случае неисправности через iLO4 можно решить вопросы.

Так же есть слот MicroSD. Куда можно разместить emmc и установить систему, но их у меня пока нет.

Но сервера старые, там нет возможности загрузить с UEFI (и это для 2012 года, вроде тогда уже везде было).

Помучался несколько дней, для себя нашел верный вариант, загружаемся по сети, загружаем ipxe, затем уже в ipxe загружаемся с 0 диска. Ну еще для себя написал небольшое меню с возможностью установить Rocky Linux 8 версии. Другие версии и дистрибутивы в принципе тоже можно добавить. Просто нет такого желания.

Что используем?

  • mikrotik router - как dhcp-server и откуда указываем где tftp-сервер и какие файлы нужно загрузить;
  • h96max tv box - используется как tftp-сервер и http сервер. Отсюда загружаются нужные нам файлы;
  • ipxe - создаем два образа для сетевой загрузки - для BIOS и для UEFI;
  • podman - в контейнере собираем ipxe.

Podman

Где нибудь на сервере и (или) рабочей машине под платформой AMD64 будем запускать podman необходимой нам для сборки ipxe.

Для начала создадим ipxe embedded script файл.

mkdir -p ipxe
cd ipxe

cat<<EOF | tee ipxe myscript.ipxe
#!ipxe

dhcp
chain http://192.168.1.18/default.ipxe
EOF
podman run -it --rm -v $(pwd):/app debian:12 bash

apt update -y
apt install build-essential git liblzma-dev -y
git clone https://github.com/ipxe/ipxe.git

cd ipxe/src
make bin/undionly.kpxe EMBED=/app/myscript.ipxe
cp bin/undionly.kpxe /app
make bin-x86_64-efi/ipxe.efi EMBED=/app/myscript.ipxe
cp bin-x86_64-efi/ipxe.efi /app
exit

Полученные файлы undionly.kpxe, ipxe.efi нам нужно скопировать на h96max.

Mikrotik

Скопирую свои настройки, нужно просто адаптировать под свои нужды

[admin@MikroTik] /ip dhcp-server> export 

/ip dhcp-server

add address-pool=dhcp disabled=no interface=bridge name=defconf

/ip dhcp-server option

add code=66 name=TFTP value="'192.168.1.18'"

add code=67 name=Bootfile value="'undionly.kpxe'"

add code=67 name=UEFI value="'ipxe.efi'"

/ip dhcp-server option sets

add name=TFTPD options=Bootfile,TFTP

add name=UEFI options=TFTP,UEFI

/ip dhcp-server network

add address=192.168.1.0/24 comment=defconf dhcp-option-set=TFTPD dns-server=192.168.1.3 gateway=192.168.1.1 next-server=192.168.1.18

По умолчанию сетевая загрузка проходит в BIOS Legacy режиме, если нам нужно загрузить систему через UEFI, то нужно в Mikrotik UI выбрать lease и изменить options sets - выставить UEFI.

После этого данный lease host будет загружать ipxe.efi.

H96Max

Данную железку я купил по совету “У Павла”, в 2025 по сути стоящая замена для raspberry pi. Так как их наштамповали миллионы и продается не дорого.

Также хорошо, что есть emmc на 32 и 64 ГБ.

Также я туда перенес pi.hole.

Нужно установить tftp и http сервера.

sudo apt update -y
sudo apt install -y tftp-hpa tftpd-hpa nginx

sudo mkdir -p /srv/tftp
sudo chown tftp:tftp -R /srv/tftp

cat<<EOF | sudo tee /etc/default/tftpd-hpa
# /etc/default/tftpd-hpa
TFTP_USERNAME="tftp"
TFTP_DIRECTORY="/srv/tftp"
TFTP_ADDRESS=":69"
TFTP_OPTIONS="--secure --create"
EOF

cp /tmp/undionly.kpxe /srv/tftp
cp /tmp/ipxe.efi /srv/tftp

sudo systemctl enable --now tftpd-hpa.service
sudo systemctl enable --now nginx.service

cat<<EOF | sudo tee /var/www/html/default.ipxe
#!ipxe

# Define variables for server details
set serverip 192.168.1.18  # Replace with your HTTP/NFS server IP
set repo mirror.ps.kz
set webpath /rocky/8.10/BaseOS/x86_64/os        # Path on your web server where Rocky Linux 8 ISO content is extracted
set ksfile ks.cfg          # Kickstart file name

menu
  item --gap -- -------------------------- Rocky Linux 8 Installation --------------------------
  item rocky8_install Install Rocky Linux 8 (HTTP)
  item rocky8_install_ks Install Rocky Linux 8 (HTTP + Kickstart)
  item --gap -- ----------------------------------------------------------------------------------
  item boot_from_hdd0 Boot from HDD0
  item boot_from_hdd1 Boot from HDD1
  item boot_from_hdd2 Boot from HDD2
  item boot_from_hdd3 Boot from HDD3
  item boot_from_hdd4 Boot from HDD4
  item boot_from_hdd5 Boot from HDD5
  item --gap -- ----------------------------------------------------------------------------------
  item reboot Reboot
  item exit Exit iPXE

# Default boot option
choose --default boot_from_hdd0 --timeout 15000 target && goto ${target}

:rocky8_install
  kernel http://${serverip}/vmlinuz inst.repo=http://${repo}${webpath} ip=dhcp
  initrd http://${serverip}/initrd.img
  boot

:rocky8_install_ks
  kernel http://${serverip}/vmlinuz inst.repo=http://${repo}${webpath} ip=dhcp inst.ks=http://${serverip}/${ksfile}
  initrd http://${serverip}/initrd.img
  boot

:boot_from_hdd0
  sanboot --no-describe --drive 0x80

:boot_from_hdd1
  sanboot --no-describe --drive 0x81

:boot_from_hdd2
  sanboot --no-describe --drive 0x82

:boot_from_hdd3
  sanboot --no-describe --drive 0x83

:boot_from_hdd4
  sanboot --no-describe --drive 0x84

:boot_from_hdd5
  sanboot --no-describe --drive 0x85

:reboot
  reboot

:exit
  exit
EOF

Ну вроде все настроено и теперь можем использовать сетевую загрузку для различных задач.