Завантаження та установка ОС з PXE-сервера.

pxe logo
Частково по необхідності, частково для саморозвитку.

Windows

Для максимально швидкого розвертання PXE-сервера у Windows використовую на даний момент Serva. Обмеження безкоштовної версії:

  • Сервер піднятий “тільки” 50хв., після чого треба перезапустити;
  • 7с очікування при запуску;
  • Конфіг одночасно може бути налаштований на запуск/установку тільки 2 різних систем;

Останній пункт робить безкоштовну версію непридатною до розвертання як постійного тестувально/установочного сервера, але якщо треба дуже швидко і Windows то краще поки не бачив. Скріншоти налаштувань, використовуються лише закладки TFTP та DHCP

serva
serva

Після конфігурації програму закриваємо. Тепер у директорії .\serva_stor створюємо директорії WIA_WDS - для Windows та NWA_PXE - для Linux і робимо їх доступними по мережі з іменами WIA_WDS_SHARE та NWA_PXE_SHARE. Розпаковуємо туди необхідні дистрибутиви і запускаємо сервер. Решту директорій і меню-завантаження сервер згенерує сам. При бажанні можна облагородити, меню знаходиться в директорії .\serva_stor\BM\PXESERVA, окремо для BIOS та EFI. Фінальне дерево каталогів буде якесь таке:

serva-dir

Linux

А тепер на стільки на скільки це можна комфортно, практично реалізовувалося на Linux Mint XFCE:

  • Сервер повинен мати статичну ip-адресу, так пишуть, з динамічною не перевіряв;
  • Встановлюємо dnsmasq, nfs-kernel-server
apt install -y dnsmasq nfs-kernel-server
  • Файл конфігурації /etc/dnsmasq.conf
# Don't function as a DNS server:
port=0

# Log lots of extra information about DHCP transactions.
log-dhcp

# Set the root directory for files available via FTP.
tftp-root=/netboot/tftp
enable-tftp

# The boot filename, Server name, Server Ip Address
dhcp-boot=x86PC,pxelinux.0,192.168.7.13

# Disable re-use of the DHCP servername and filename fields as extra
# option space. That's to avoid confusing some old or broken DHCP clients.
dhcp-no-override

# inspect the vendor class string and match the text to set the tag
dhcp-vendorclass=BIOS,PXEClient:Arch:00000
dhcp-vendorclass=UEFI32,PXEClient:Arch:00006
dhcp-vendorclass=UEFI,PXEClient:Arch:00007
dhcp-vendorclass=UEFI64,PXEClient:Arch:00009

# Set the boot file name based on the matching tag from the vendor class (above)
#dhcp-boot=net:UEFI32,i386-efi/ipxe.efi,,192.168.7.13
#dhcp-boot=net:UEFI,bootx64.efi,,192.168.7.13
dhcp-boot=net:UEFI64,bootx64.efi,,192.168.7.13

# PXE menu.  The first part is the text displayed to the user.  The second is the timeout, in seconds.
pxe-prompt="Press F8 for PXE Network boot...", 10

# The known types are x86PC, PC98, IA64_EFI, Alpha, Arc_x86,
# Intel_Lean_Client, IA32_EFI, BC_EFI, Xscale_EFI and X86-64_EFI
# This option is first and will be the default if there is no input from the user.
pxe-service=x86PC, "Install OS via PXE", pxelinux
pxe-service=X86-64_EFI, "Grrrrrr", bootx64.efi
#pxe-service=BC_EFI, "Boot to FOG UEFI PXE-BC", bootx64.efi

dhcp-range=192.168.7.13,proxy

Це з претензією на автовизначення bios/ufi, але на даний момент з EFI по суті не працює(тільки syslinux, але він в EFI катастрофічно тормозний, при тому що він і в BIOS, і напряму з флешки тормозніший за grub.) Тому реально конфіг можна укоротити до такого:

# Don't function as a DNS server:
port=0

# Log lots of extra information about DHCP transactions.
log-dhcp

# Set the root directory for files available via FTP.
tftp-root=/netboot/tftp
enable-tftp

# The boot filename, Server name, Server Ip Address
dhcp-boot=x86PC,pxelinux.0,192.168.7.13

# Disable re-use of the DHCP servername and filename fields as extra
# option space. That's to avoid confusing some old or broken DHCP clients.
dhcp-no-override

# PXE menu.  The first part is the text displayed to the user.  The second is the timeout, in seconds.
pxe-prompt="Press F8 for PXE Network boot...", 10
pxe-service=x86PC, "Install OS via PXE", pxelinux

# Respond to PXE requests for the specified network;
# run as DHCP proxy
dhcp-range=192.168.7.13,proxy
  • Якщо треба щоб dnsmasq ще й як dhcp-сервер працював треба додати
dhcp-range=eth0,192.168.7.100,192.168.7.240,255.255.255.0,8h # карта, діапазон адрес що видаються, маска, час на який видаються
dhcp-option=option:dns-server,192.168.7.13
dhcp-option=option:dns-server,8.8.8.8
  • Перезапускаємо dnsmasq
sudo systemctl restart dnsmasq
  • Створюємо основну директорію
sudo mkdir -p /netboot/tftp
  • Створюємо директорію nfs-сервера
sudo mkdir -p /netboot/nfs
  • Додаємо рядок в кінець файла /etc/exports
/netboot/nfs  *(ro,sync,no_wdelay,insecure_locks,no_root_squash,insecure,no_subtree_check)
  • І робимо спільний ресурс доступним
sudo exportfs -a
  • Встановлюємо syslinux та pxelinux
sudo apt install syslinux pxelinux
  • Копіюємо чи створюємо посилання на файл /usr/lib/syslinux/memdisk необхідного для завантаження напряму з iso-образу
sudo ln -s /usr/lib/syslinux/memdisk /netboot/tftp
  • Створюємо директорії з яких будуть ставитися linux-системи, Linux Mint 19 XFCE, у нашому випадку
sudo mkdir /netboot/nfs/mint19
sudo mkdir /netboot/tftp/net/mint19
  • Монтуємо образ лінукса і копіюємо всі файли до /netboot/nfs/mint19
sudo mount -o loop isoname.iso /mnt
sudo cp -Rfv /mnt/* /netboot/nfs/mint19/
  • А до /netboot/tftp/net/mint19 копіюємо тільки те що необхідно щоб почати завантаження по мережі
sudo cp -v /netboot/nfs/mint19/casper/{vmlinuz,initrd.lz} /netboot/tftp/net/mint19/
  • Ставимо syslinux
sudo apt install -y syslinux pxelinux
  • Копіюємо необхідні файли syslinux в основну директорію
sudo cp -v /usr/lib/syslinux/modules/bios/{ldlinux.c32,libcom32.c32,libutil.c32,vesamenu.c32} /netboot/tftp
sudo cp -v /usr/lib/PXELINUX/pxelinux.0 /netboot/tftp/
  • Створюємо конфігураційні файли завантажувача
sudo mkdir /netboot/tftp/pxelinux.cfg
sudo touch /netboot/tftp/pxelinux.cfg/default
  • Окультурений зразок основного конфігураційного файла
default vesamenu.c32
TIMEOUT 150
MENU BACKGROUND pxelinux.cfg/back.webp
MENU COLOR border 30;40 #00000000 #00c1c1c1 none

label install1
menu label ^Linux Mint 19 XFCE x64
menu default
kernel net/mint19/vmlinuz
append initrd=net/mint19/initrd.lz boot=casper netboot=nfs nfsroot=192.168.7.13:/netboot/nfs/mint19/ splash toram ---

label windows10
menu label ^WinPE10 PRO x64 Original
kernel /memdisk
initrd iso/winpe/winpe.iso
append iso raw

label windowsxpe10
menu label ^WinXPE10 x64
kernel /memdisk
initrd iso/winpe/Win10XPE_x64.ISO
append iso raw

label acronis
menu label ^TeraByte WinPE Acronis + TC
kernel /memdisk
initrd iso/acronis/Acronis10PE_26.11.2018.iso
append iso raw

label acronisPE
menu label ^All Acronis 2020
kernel /memdisk
initrd iso/acronis/acronis_mod31.iso
append iso raw

label Testing_tools
menu label ^Testing tools
kernel vesamenu.c32
append pxelinux.cfg/hard_test
  • Роздаємо права
sudo chmod -Rfv 777 /netboot

Плюс описаного вище підходу з використанням Syslinux в його більшій простоті в порівнянні з Grub, мінус в тому що він адекватно працює тільки з legacy bios, коли маємо EFI починаються кошмарні тормоза. Тому є сенс використовувати grub з перспективою завантажуватися і з EFI.

  • Встановлюємо, якщо не встановлено, grub-pc
sudo apt-get install grub-pc
  • Генеруємо завантажувач
cd /netboot/tftp
grub-mkimage -d /usr/lib/grub/i386-pc/ -O i386-pc-pxe -o ./booti386.0 -p '/grub' pxe tftp
  • Копіюємо файли grub
sudo rsync -vua /usr/lib/grub/i386-pc /netboot/tftp/grub/
  • Створюємо файл конфігурації завантаження
sudo touch /netboot/tftp/grub/grub.cfg
  • Замінимо у файлі dnsmasq.conf секцію PXE menu наступною
# PXE menu.  The first part is the text displayed to the user.  The second is the timeout, in seconds.
pxe-prompt="Press F8 for PXE Network boot...", 10
pxe-service=x86PC, "Boot from local disk"
pxe-service=x86PC, "Run Syslinux via PXE", pxelinux
pxe-service=x86PC, "Run Grub via PXE", booti386

На даний момент не можу змусити завантажуватися у варіанті EFI Grub, хоча в режимі legacy bios навіть пункт pxe-service=Х86-64_EFI, “Run EFI Grub via PXE”, bootx64.efi ігнорується і не відображається, що очевидно правильно. Також в результаті незрозумілим є параметр dhcp-boot бо без нього все працює. Файл тестової конфігурації в результаті скорочується до наступного:

port=0
log-dhcp
tftp-root=/netboot/tftp
enable-tftp
dhcp-no-override
dhcp-range=192.168.7.13,proxy

pxe-prompt="Press F8 for PXE Network boot...", 10
pxe-service=x86PC, "Boot from local disk"
pxe-service=x86PC, "Run Syslinux via PXE", pxelinux
pxe-service=x86PC, "Run Grub via PXE", booti386
pxe-service=x86-64_EFI, "Run EFI Grub via PXE", bootx64.efi