Перейти к содержанию

▍ IPXE

Сетевая загрузка операционных систем через Mikrotik

Склонируем исходный код ipxe, чтобы можно было в него встроить наш скрипт загрузки меню

git clone https://github.com/ipxe/ipxe.git

cd ipxe/src

Сам скрипт загрузки меню

nano srv.ipxe
#!ipxe
:start
# Механизм получения ip. В случае ошибки - предлагает нажать "s" для запуска командной строки.
# Иначе - начать снова.
dhcp && goto next || prompt --key s --timeout 1500 Press "s" for the iPXE command line... && shell || goto start
:next
# Случае успеха - загрузить "меню" с tftp-сервера.
chain tftp://router/menu

Меняем настройки:

nano config/general.h
#define CERT_CMD              /* Certificate management commands */
#define CONSOLE_CMD           /* Console command */
#define DIGEST_CMD            /* Image crypto digest commands */
#define DOWNLOAD_PROTO_HTTPS  /* Secure Hypertext Transfer Protocol */
#define IMAGE_COMBOOT         /* COMBOOT */
#define IMAGE_TRUST_CMD       /* Image trust management commands */
#define IMAGE_GZIP            /* GZIP image support */
#define IMAGE_PNG             /* PNG image support */
#define IMAGE_ZLIB            /* ZLIB image support */
#define NET_PROTO_IPV6        /* IPv6 protocol */
#define NET_PROTO_LLDP        /* Link Layer Discovery protocol */
#define NSLOOKUP_CMD          /* DNS resolving command */
#define NTP_CMD               /* NTP commands */
#define PARAM_CMD             /* Form parameter commands */
#define PCI_CMD               /* PCI commands */
#define PING_CMD              /* Ping command */
#define POWEROFF_CMD          /* Power off commands */
#define REBOOT_CMD            /* Reboot command */
#define TIME_CMD              /* Time commands */
#define VLAN_CMD              /* VLAN commands */

Немного красоты:

nano config/colour.h
#undef COLOR_NORMAL_FG
#undef COLOR_NORMAL_BG
#undef COLOR_SELECT_FG
#undef COLOR_SELECT_BG
#undef COLOR_SEPARATOR_FG
#undef COLOR_SEPARATOR_BG
#undef COLOR_EDIT_FG
#undef COLOR_EDIT_BG
#undef COLOR_ALERT_FG
#undef COLOR_ALERT_BG
#undef COLOR_URL_FG
#undef COLOR_URL_BG
#undef COLOR_PXE_FG
#undef COLOR_PXE_BG
#define COLOR_NORMAL_FG     COLOR_CYAN
#define COLOR_NORMAL_BG     COLOR_BLACK
#define COLOR_SELECT_FG     COLOR_WHITE
#define COLOR_SELECT_BG     COLOR_BLUE
#define COLOR_SEPARATOR_FG  COLOR_WHITE
#define COLOR_SEPARATOR_BG  COLOR_BLACK
#define COLOR_EDIT_FG       COLOR_BLACK
#define COLOR_EDIT_BG       COLOR_CYAN
#define COLOR_ALERT_FG      COLOR_WHITE
#define COLOR_ALERT_BG      COLOR_RED
#define COLOR_URL_FG        COLOR_CYAN
#define COLOR_URL_BG        COLOR_BLUE
#define COLOR_PXE_FG        COLOR_BLACK
#define COLOR_PXE_BG        COLOR_WHITE

Устанавливаем необходимые программы для сборки:

sudo apt-get install gcc mtools 

Собираем:

make bin/undionly.kpxe EMBED=srv.ipxe

Создаем само меню boot.ipxe

#!ipxe

console --picture tftp://router/bg
# Boot <boot-url>/<boot-dir>/mac-010203040506.ipxe if script is present
chain --replace --autofree mac-${mac:hexraw} ||

isset ${hostname} && set initiator-iqn ${base-iqn}:${hostname} || set initiator-iqn ${base-iqn}:${mac}

set iscsi-server        192.168.0.10         
set base-url            http://192.168.0.10/iso
set nfs-server          192.168.0.10
set nfs-mountpt         /srv/netinstall
set base                nfs://${nfs-server}${nfs-mountpt}
set nfsroot             ${nfs-server}:${nfs-mountpt}
set nfs-linux-live      nfs://${nfs-server}${nfs-mountpt}

set language            en
set layoutcode          en
set locale              ru_RU.UTF-8
set timezone            Europe/Moscow
set keymap              en

# Some menu defaults
set menu-timeout 2000
set submenu-timeout ${menu-timeout}
isset ${menu-default} || set menu-default kubuntu

# Figure out if client is 64-bit capable
cpuid --ext 29 && set arch x64 || set arch x86
cpuid --ext 29 && set archl amd64 || set archl i386

###################### MAIN MENU ####################################

:start
menu iPXE boot menu for ${mac:hexraw}
item --gap --                ------------------------- Operating systems --------------------------------
item xterm                   Boot XFCE Terminal from iSCSI
item ubuntu                  Boot Ubuntu Terminal from iSCSI
item kubuntu                 Boot Kubuntu Terminal from iSCSI
item alt                     Boot Alt Workstation K10 from iSCSI
item winpe1064               Boot Windows 10 21H2 PE 64-bit
item winpe1032               Boot Windows 10 PE 32-bit
item anti                    Boot antiX 22 32bit from ISO
item slax                    Boot SLAX 9.11.0 64bit from ISO
item hiren                   Boot Hiren Boot CD 15.2
item memtest                 Boot Memtest86 5.01
item victoria                Boot Victoria 3.5
item clonezilla              Boot Clonezilla x64
item --gap --                ------------------------- Install OS ---------------------------------------
item menu-install            Installers...
item --gap --                ------------------------- Advanced options ---------------------------------
item pxelinux                Load PXELinux menu
item config                  Configure settings
item shell                   Drop to iPXE shell
item reboot                  Reboot computer
item
item --key x e(x)it          Exit iPXE and continue BIOS boot

choose --timeout ${menu-timeout} --default ${menu-default} os || goto cancel
set menu-timeout 0
echo ${os}
goto ${os}

############################ INSTALLER MENU #########################

:menu-install
menu Installers for ${mac:hexraw}

item --gap --                ------------------------- ALT Server 10.1 ----------------------------------
item alt-server              Install ALT Server 10.1
item --gap --                ------------------------- Ubuntu 20.04 -------------------------------------
item u20-04-64               Boot Ubuntu 20.04 Installer (Network)

item
item --key 0x08 back         Back to top menu...

iseq ${menu-default} menu-install && isset ${submenu-default} && goto menu-install-timed ||
choose selected && goto ${selected} || goto start
:menu-install-timed
choose --timeout ${submenu-timeout} --default ${submenu-default} selected && goto ${selected} || goto start

:cancel
echo You cancelled the menu, dropping you to a shell

:shell
echo Type 'exit' to get the back to the menu
shell
set menu-timeout 0
set submenu-timeout 0
goto start

:failed
echo Booting failed, dropping to shell
goto shell

:reboot
reboot

:exit

:config
config
goto start

:back
set submenu-timeout 0
clear submenu-default
goto start

############ MAIN MENU ITEMS ############

:xterm
sanboot iscsi:${iscsi-server}:::1:xterm || goto failed
goto start

:ubuntu
sanboot iscsi:${iscsi-server}:::1:ubuntu || goto failed
goto start

:kubuntu
sanboot iscsi:${iscsi-server}:::1:kubuntu || goto failed
goto start

:alt
sanboot iscsi:${iscsi-server}:::1:alt || goto failed
goto start

:bootiso
dhcp
initrd ${base-url}/${iso-file}
chain  ${base-url}/memdisk iso raw

:winpeload
dhcp
kernel  ${base}/wimpe/wimboot pause gui
initrd  ${base}/wimpe/${pearch}/media/Boot/bcd          BCD
initrd  ${base}/wimpe/${pearch}/media/Boot/boot.sdi     boot.sdi
initrd  ${base}/wimpe/${pearch}/media/sources/boot.wim  boot.wim
imgstat
boot

:winpe1064
set pearch win10pe64
goto winpeload

:winpe1032
set pearch win10pe32
goto winpeload

:anti
initrd ${base-url}/antiX-22-net_386-net.iso
chain ${base-url}/memdisk iso || goto failed
goto start

:slax
kernel ${base-url}/MISC/SLAX/vmlinuz
initrd ${base-url}/MISC/SLAX/initrfs.img
imgargs vmlinuz vga=normal load_ramdisk=1 prompt_ramdisk=0 rw printk.time=0 from=${base-url}/MISC/slax-64bit-9.11.0.iso
boot || goto failed
goto start

:hiren
initrd ${base-url}/BOOT/Hirens.BootCD.15.2.iso
chain ${base-url}/memdisk iso raw       || goto failed
goto start

:memtest
kernel ${base}/memdisk                  || read void
initrd ${base}/boot/memtest86+-5.01.iso || read void
imgargs memdisk iso raw                 || read void
boot                                    || read void

:victoria
kernel ${base}/memdisk                  || read void
initrd ${base}/boot/victoria3.5.iso     || read void
imgargs memdisk iso raw                 || read void
boot                                    || read void

:clonezilla     
set custom   -- locales=${locale} keyboard-layouts=${layoutcode} utc=no timezone=${timezone}
set options  nfsroot=${nfsroot}/${os} ro netboot=nfs boot=live config username=user hostname=clonezilla union=overlay components noswap edd=on nomodeset nodmraid ocs_live_run=ocs-live-general ocs_live_extra_param= ocs_live_batch=no net.ifnames=0 nosplash noprompt ocs_repository="smb://daffin@srv-nas/images/"
imgselect  ${base}/${os}/live/vmlinuz  ${options}  ${custom}  || goto failed
imgfetch   ${base}/${os}/live/initrd.img                      || goto failed
imgexec                                                       || goto failed
goto start

:pxelinux
set 210:string tftp://router/
chain ${210:string}pxelinux.0 || goto failed
goto start

############################ INSTALLER MENU #########################

:alt-server
kernel ${base}/${os}/10.1/vmlinuz initrd=${base}/${os}/10.1/initrd.img   root=bootchain bootchain=fg,altboot ip=dhcp4 changedisk fastboot live automatic=method:nfs,network:dhcp,server:${nfs-server},directory:${nfs-mountpt}/${os}/10.1/iso  stagename=altinst showopts lang=ru_RU
initrd ${base}/${os}/10.1/initrd.img 
boot || goto failed
goto start

:u20-04-64 
echo Install Ubuntu 20.04 Installer (Network)
kernel http://archive.ubuntu.com/ubuntu/dists/focal-updates/main/installer-amd64/current/legacy-images/netboot/ubuntu-installer/amd64/linux
initrd http://archive.ubuntu.com/ubuntu/dists/focal-updates/main/installer-amd64/current/legacy-images/netboot/ubuntu-installer/amd64/initrd.gz
boot || goto failed
goto start

Копируем bin/undionly.kpxe и boot.ipxe в Mikrotik:

Mikrotik files

Настраиваем TFTP сервер:

Mikrotik tftp

Настраиваем DHCP сервер:

Mikrotik dhcp

Добавляем правило на фаерволе:

ip firewall filter add chain=input dst-port=69 protocol=udp src-address=192.168.0.0/24

Теперь при загрузке по сети наблюдаем следующее меню:

IPXE menu

К началу