Содержание:
1. Настройка TFTP для загрузки по сети с Mikrotik
2. Настраиваем Syslinux и GRUB для PXE
3. Поднимаем NAS через WoL после загрузки необходимых файлов через TFTPБонус
На текущем этапе у нас есть настроенный TFTP и сконфигурированный DHCP сервер на Mikrotik, теперь необходимо организовать загружаемые данные т.е. загрузчик, его конфигурационные файлы и то что мы будем загружать.
Примечание:
Заранее оговорюсь, что мы создаем некое SOHO решение, в котором по условиям задачи у нас есть только hAP^2 или иной роутер с TFTP,DHCP-Server и USB и ничего более! При решении задачи в среднем офисе или на предприятии для загрузки больших дистрибутивов следует применять любое доступное решение в виде http, ftp или nfs, но в отдельно взятой квартире может не найтись места для сервера работающего 24/7.
Для Syslinux содержимое папки disk1/tftp на Mikrotik будет выглядеть так:
В корне каталога создаем папку boot и в нее складываем модули chain.c32, ldlinux.c32, libcom32.c32, libcom32.elf, libutil.c32, linux.c32, memdisk, menu.c32, poweroff.c32, reboot.c32, vesamenu.c32. В корень кидаем ldlinux.c32, libcom32.c32, lpxelinux.0, pxelinux.0.
Создаем папку pxelinux.cfg и в нее кладем пустой файл default.
Создаем папку images ее можно назвать как вам угодно по желанию =) где будет содержаться все что мы будем грузить.
Если вы хотите больше узнать о дополнительных модулях, то можно почитать тут: https://wiki.syslinux.org/wiki/index.php?title=Category:Modules . Так же в дальнейшем для написание конф файлов вам понадобиться описание всех ключевых слов https://wiki.syslinux.org/wiki/index.php?title=Config#PXE .
Необходимые файлы загрузчика можете взять тут ( https://mirrors.edge.kernel.org/pub/linux/utils/boot/syslinux/ ), не стесняйтесь берите 6.03 свежее уже не будет. С 2014 г. новых релизов нет, хоть в гите автора проекта присутствуют свежие коммиты, но релиз кандидатов там не наблюдается =(.
Ниже продемонстрирую свой маленький конф файл для Syslinux:
menu title Boot menu PXE
DEFAULT boot/menu.c32
PATH boot/
TIMEOUT 50
label tinycore
MENU LABEL Tiny core v15 6.6.8
LINUX images/tinyCore/vmlinuz
INITRD images/tinyCore/core.gz
append loglevel=3
label bootkalibrios
MENU LABEL Boot from Kalibri OS
kernel boot/memdisk
initrd images/kolibri.img
# label tinycoreiso
# MENU LABEL ISO Tiny-Core
# LINUX boot/memdisk
# append iso initrd=images/Core-current.iso raw
label acronistdd12
MENU LABEL Acronis Disk Director 2012
linux images/add1296/dat2.dat
INITRD images/add1296/dat3.dat,images/add1296/dat4.dat quiet
label acronisti18
MENU LABEL Acronis True Image 2018
linux images/ati18/dat2.dat
INITRD images/ati18/dat3.dat,images/ati18/dat4.dat force_modules=usbhid quiet
LABEL memtest
MENU LABEL Memtest86+
kernel boot/memdisk
initrd images/memtest86+/memtest86
label reboot
MENU LABEL Reboot
COM32 reboot.c32
label poweroff
MENU LABEL Power Off
COM32 poweroff.c32
Блок с ISO Tiny-Core помещен в комментарии так как он тут приведен для примера, как можно загружать ISO образы в Syslinux, так сложилось что каноничный вариант из документации:
LABEL hdt_iso
LINUX memdisk
INITRD hdt.iso
APPEND iso raw
или вариант с одного известного ресурса
kernel boot/memdisk iso
initrd images/xxx.iso
append iso raw
данный метод загрузки рассчитан на чистый ISO образы, а не гибридные как пишет Wiki Syslinux если на образе ISO стоит boot флаг, то он считается гибридным т.е. его можно смело лить dd (утилита из состава Unix подобных ОС ) на флешку и он будет грузиться и вы можете попробовать с ним работать как с образом диска, но такой вариант тоже мне не помог.
Для загрузки продуктов Acronis достаточно разместить в папке ядро и ramdisk см. конф файл. (initramfs может состоять из нескольких файлов, смотрите bootwiz.cfg на iso Acronis).
Ограничения:
Syslinux позволяет загружать 16-bit и 32-bit ОС и программы в защищенном режиме, но не поддерживает U/EFI загрузку, если вам нужно загружать Kolibri OS, Tiny Core x86 то это ваш вариант, при условии что ваш парк машин работает на классическом BIOS или поддерживает legacy режим загрузки PXE при наличии UEFI на борту. Так как Mikrotik не позволяет нам настроить что отдавать TFTP клиенту в зависимости от параметров PXE то мы вынуждены задуматься над тем с каким загрузчиком будем работать.
На 2024 г. почти все кто мог (OpenSource проекты) перешли на загрузку с UEFI, есть memtest86, редакция Tiny Core x86_64, да и последнии версии Acronis замечательно грузятся, в довесок GRUB (как вариант UEFI загрузчика который мы будем рассматривать) активно развивается и имеет множество модулей, все зависит от ваших потребностей.
Второе ограничение вытекает из условий задачи, это объем который позволяет прокачать TFTP сервер при работе загрузчика. Из чего он вытекает? Вытекает из RFC 1350 в котором сказано что размер который отдает сервер привязано к 65535*block size, а у нас в конфигурации это было 512 т.е. 31 мб. В такие габариты влезает только Tiny Core x86, Acronis True Image 2010 г., memtest x86 v 4. Можно увеличить размер блока до 8192, что в теории позволит качать файлы до 500 мб, на практике удвоило скорость до 20-25 мбит/c с 10 при 512.
Настроить данный параметр можно и через Winbox и через Terminal:
/ip tftp settings set max-block-size=8192
Хотя syslinux не имеет ключевых слов для настройки размера блока это не мешает ему загружаться, вторым способом увеличить размер загрузки файлов это изменить параметр allow-rollover для конкретного правила в TFTP.Данный параметр в Mikrotik можно изменить только с помощью терминала:
/ip tftp set numbers=0 allow-rollover=yes
Это позволит серверу не прерывать отдачу файла при переполнении счетчика пакетов который ограничен 65535.
Теперь когда мы имеем минимальную рабочую конфигурацию и оговорили ограничения связанные с TFTP перейдем к работе с GRUB и PXE через UEFI.
Загрузка через UEFI с GRUB
Для начала потребуется UNIX подобная система с ядром Linux для создания базового окружения в корне TFTP сервера.
Для этого загружаемся в наш Linux смело прыгаем на любой терминал и в созданную папку скидываем файлы:
grub.cfg – конфигурационный файл который будет читать загрузчик
grubx64.efi – сам загрузчик чуть дальше мы его создадим
unicode.pf2 – шрифт необходимый загрузчику, он же дублируется в папке fonts (по образу как в настольной системе)
images – то что будем грузить
x86_64-efi – папака с модулями которые сможет погружать grub в процессе работы
Структура каталогов представлена ниже:
Для создания загрузчика необходимо в терминале выполнить команду:
grub2-mkimage -p '(tftp,10.1.1.7)/' -O x86_64-efi -o grubx64.efi tftp efinet
В начале идет протокол и ip адрес TFTP сервера разделенный запятой, после под какую архитектуру создается загрузчик. С выбором архитектуры вы не ограничены, но предустановлены в дистрибутиве обычно только модули для текущего ядра(создать для i386 на x86_64 с ходу не получится) остальное необходимо устанавливать через пакетный менеджер.
Далее указываются модули которые размещаются непосредственно в загрузчике, у нас это работа с tftp и efinet для UEFI.
В моей системе модули для GRUB были размещены в каталоге /usr/lib/grub, если Вам нужен загрузчик для 32-битных систем без UEFI его можно достать с любого Live-CD того же Linux Mint.
Не забываем изменить параметр отдаваемого файла TFTP, теперь это grubx64.efi
/ip dhcp-server option set name=boot-file-value value="'grubx64.efi'"
Далее размещаем все подготовленное содержимое в корне TFTP сервера и после непродолжительной паузы получаем меню GRUB.
Как видно на изображении в моем варианте есть базовый набор инструментов для восстановления, легковесный дистрибутив TinyCore, Memtest и загадочный Start local NAS, об это поговорим в следующей части.
Содержимое grub.cfg
menuentry 'TinyCore v15' {
insmod chain
linux (tftp,10.1.1.7)/images/tinycore/vmlinuz-focal64
initrd (tftp,10.1.1.7)/images/tinycore/dCore-focal64.gz
}
menuentry 'Clonzilla amd64 3.1.2-22' {
insmod chain
echo 'Loading kernel...'
linux (tftp,10.1.1.7)/images/czilla/vmlinuz boot=live username=user union=overlay config components quiet noswap edd=on nomodeset nodmraid locales= keyboard-layouts= ocs_live_run="ocs-live-general" ocs_live_extra_param="" ocs_live_batch=no net.ifnames=0 nosplash noprompt fetch=tftp://10.1.1.7/images/czilla/filesystem.squashfs
echo 'Loading Initramfs...'
initrd (tftp,10.1.1.7)/images/czilla/initrd.img
}
menuentry 'GParted amd64 1.6.0-3' {
insmod chain
echo 'Loading kernel...'
linux (tftp,10.1.1.7)/images/gpart/vmlinuz boot=live config components union=overlay username=user noswap noeject vga=788 fetch=tftp://192.168.88.1/images/gpart/filesystem.squashfs
echo 'Loading Initramfs...'
initrd (tftp,10.1.1.7)/images/gpart/initrd.img
}
menuentry 'Acronis True Image 18' {
insmod chain
echo 'Loading kernel...'
linux (tftp,10.1.1.7)/images/ati18/dat10.dat force_modules=usbhid quiet
echo 'Loading Initramfs...'
initrd (tftp,10.1.1.7)/images/ati18/dat11.dat \
(tftp,10.1.1.7)/images/ati18/dat12.dat \
}
menuentry 'Acronis Disk Director 12' {
insmod chain
echo 'Loading kernel...'
linux (tftp,10.1.1.7)/images/add12/dat6.dat quiet
echo 'Loading Initramfs...'
initrd (tftp,10.1.1.7)/images/add12/dat7.dat \
(tftp,10.1.1.7)/images/add12/dat8.dat \
}
menuentry 'Memtest86 x64 v10.7' {
insmod chain
echo 'Loading kernel...'
chainloader (tftp,10.1.1.7)/images/memtest86/BOOTX64.efi
}
menuentry 'Reboot' {
reboot
}
menuentry 'Shutdown' {
halt
}
Полезные ссылки:
- Документация на GRUB (https://www.gnu.org/software/grub/manual/grub/grub.html)
- Мультизагрузочный сервер для PXE и UEFI (https://unixforum.org/viewtopic.php?t=151291)
Подводим итоги
На текущий моменты мы имеем две минимальные конфигурации для решения задачи по восстановлению ПК после падения и сбоя или для просто систематического съема бэкапов. Указанные выше ссылки помогут Вам дополнить ваши конфигурации для GRUB и Syslinux.
А мы переходим к следующей главе это включение NAS после загрузки определенного образа или по пункту меню загрузчика.