Статью я разделю на три части, первая будет о том как настроить базовый сервер для загрузки, то есть dhcp+tftp+nfs+http и т.д.
Вторая будет о legacy PXE, третья о UEFI.
1 Часть. Подготовка сервера.
Вообще необязательно что это будет один сервер, вполне вероятно что у вас для этих целей могут быть разные сервера.
Начнём с DHCP.
Лично я использую ISC DHCPD там где нужна расширенная конфигурация (прямо как сейчас)
Возможно в будущем я сделаю такие же статьи о kea, но пока что dhcpd будет моей платформой для рассказа.
Если вы не используете у себя dhcpd и по какой-то причине не хотите использовать, вам придётся додумать это колдунство самостоятельно.
На самом деле настроить dhcpd для наших целей очень просто. Достаточно добавить в конфиг следующую конструкцию:
Код: Выделить всё
if substring (option vendor-class-identifier, 15, 5) = "00000" {
filename "bios/lpxelinux.0";
} elsif substring (option vendor-class-identifier, 15, 5) = "00007" {
filename "EFI/grubx64.efi";
} else {
filename "bios/pxelinux.0";
}
Код: Выделить всё
next-server 192.168.0.5;
Разберёмся по пунктам:
1) Когда pxe клиент получает ip адрес, он возвращает опцию vendor-class-identifier,
которая выглядит так:
Код: Выделить всё
vendor-class-identifier = "PXEClient:Arch:00000:UNDI:002001";
А вот такую если по UEFI:
Код: Выделить всё
set vendor-class-identifier = "PXEClient:Arch:00007:UNDI:003016";
После чего берёт следующие 5 байт 00007 и сравнивает со строкой (именно строкой а не числом!) после знака =
В зависимости от результата, передаёт клиенту тот или иной filename. Что это такое на filename я объясню чуть позже.
Если вы хотите увидеть ещё один способ реализации той же самой задачи, посмотрите мою статью про dhcpd.
ISC DHCPD - разделяем клиентов на классы
директива next-server передаёт клиенту ip адрес сервера, с которого нужно скачать загрузочный файл. Подразумевается разумеется
tftp сервер. Поэтому, разумеется следующим пунктом у нас будет настройка tftp сервера.
Итак после запроса ip, наш сервер передаст клиентам адрес сервера 192.168.0.5 и путь bios/lpxelinux.0 или EFI/grubx64.efi
tftp сервер:
Мне очень нравится tftp сервер в openbsd. Потому что его настройка очень легкая и понятная. Знаете что нужно для его настройки?
Ничего.
Но, чтобы вам было проще диагностировать ту или иную неисправность в вашей системе, разумно включить режим verbose.
Для этого в openbsd добавим следующую строку в rc.conf.local:
Код: Выделить всё
tftpd_flags=-v /tftpboot
Сейчас модно добавлять все через rcctl:
Код: Выделить всё
rcctl enable tftpd
rcctl set tftpd flags "-v /tftpboot"
Да и нам будет неудобно всё время лазить по файловой системе в её поисках. Разумно создать эту директорию в домашнем каталоге пользователя и сделать на неё ссылку:
Код: Выделить всё
cd ~
mkdir tftpboot
ln -s ~/tftpboot /tftpboot
например у меня директория /home/kasak имеет права drwxr-xr-x, это не всегда хороший вариант. Но в моём случае это сделано лишь для удобства.
Скорее всего у читателя не BSD а линукс, и честно говоря я боюсь описывать конкретику по кажой реализации tftp во всех дистибутивах.
Для редхэт-подобных я могу лишь посоветовать установить пакет tftp-server и включить:
Код: Выделить всё
firewall-cmd --permanent --add-service=tftp
systemctl enable tftp.socket.
Папка для загрузок будет находится в /var/lib/tftpboot
NFS сервер:
Так же будет не лишним настроить nfs сервер, в основном если вы собираетесь загружать убунто-подобные дистрибутивы. Это в значительной степени ускорит процесс запуска.
в openbsd для этого нужно добавить в /etc/exports строку
Код: Выделить всё
/home/kasak/tftpboot -alldirs -ro -mapall=kasak -network=192.168.0.0 -mask=255.255.255.0
-mapall совершенно излишняя и добавлена для исправления возможных косяков с правами доступа. (опция превращает всех гостей в пользователя kasak)
-alldirs нужна обязательно. она разрешает маунтить любую директорию внутри экспортированной.
-ro необязательна, запрещает запись.
-network и -mask я думаю понятно что такое.
Разумеется nfs нужно ещё активировать. В openbsd:
Код: Выделить всё
rcctl enable portmap mountd nfsd
Нужно установить пакет nfs-utils,
включить
Код: Выделить всё
systemctl enable nfs-server
Код: Выделить всё
/home/kasak/tftpboot 192.168.0.0/12
Код: Выделить всё
firewall-cmd --permanent --add-service=nfs
firewall-cmd --permanent --add-service=rpcbind
firewall-cmd --permanent --add-service=mountd
Последняя утилита которая очень поможет нам, это http сервер, как показывает практика, по http значительно быстрее раздавать файлы чем по tftp.
В Openbsd я просто использую встроенный http с таким конфигом:
Код: Выделить всё
ext_addr="*"
chroot "/"
logdir "/var/www/logs"
server "default" {
listen on $ext_addr port 80
connection { max request body 10000000000 }
location "/tftpboot*" {
directory auto index
root "/home/kasak"
}
}
2 Часть. Работа с legacy pxe.
Наконец-то у нас есть платформа для работы, и теперь можно наконец создавать все эти файлы, для загрузки.
Я начал с pxe, поскольку с ним проще.
Для загрузки нам потребуется syslinux, он доступен по ссылке: https://mirrors.edge.kernel.org/pub/linux/utils/boot/syslinux/
на сегодняшний день самая свежая версия 6.03. и я сомневаюсь что когда-либо её обновят. Но сейчас это не важно.
Нас интересуют в первую очередь файлы bios/core/lpxelinux.0 и bios/core/pxelinux.0
По существу разница в том что lpxelinux.0 умеет загружать образы по http, а pxelinux.0 более совместим с разными машинами.
Однако практика показала что lpxelinux.0 работает во всех случаях. Но для приличия, я всё таки рассказать должен.
Эти оба файла положите в директорию bios, которую вы создадите в директории tftpboot.
(обратите внимание на опции dhcpd из первой части)
там же в директории bios создайте директорию pxelinux.cfg
При загрузке, lpxelinux.0 будет искать в этой директории конфиг следующим образом:
Код: Выделить всё
/pxelinux.cfg/b8945908-d6a6-41a9-611d-74a6ab80b83d
/pxelinux.cfg/01-88-99-aa-bb-cc-dd
/pxelinux.cfg/C000025B
/pxelinux.cfg/C000025
/pxelinux.cfg/C00002
/pxelinux.cfg/C0000
/pxelinux.cfg/C000
/pxelinux.cfg/C00
/pxelinux.cfg/C0
/pxelinux.cfg/C
/pxelinux.cfg/default
01-88-99... это разумеется мак адрес клиента.
а C000025B это ip адрес клиента конвертированный в 16ричный формат. в данном случае это адрес 192.0.2.91.
каждый раз pxelinux будет отчекрыживать по 1 цифре, пока наконец не расстроится окончательно и не попытается загрузить файл default.
ВОТ! Именно этот файл мы и создадим.
и отредактируем его вашим любимым редактором.
Начало файла у нас будет таким:
Код: Выделить всё
default vesamenu.c32
prompt 0
timeout 1200
label Загрузка с первого диска
localboot 0x80
menu begin
menu title Ubuntu based
label ..
menu exit
label Ubuntu
linux d/ubuntu/casper/vmlinuz
append boot=casper ip=dhcp netboot=nfs nfsroot=192.168.0.5:/home/kasak/tftpboot/d/ubuntu NFSOPTS="rsize=8192,wsize=8192" initrd=d/ubuntu/casper/initrd.lz locale=ru_RU.UTF-8 quiet splash --
нам для отображения меню потребуется ещё вот эта штуковина. Найти её можно в каталоге скачанного syslinux: bios/com32/menu.
Для работы этой штуковины, нужны ещё другие штуковины:
bios/com32/elflink/ldlinux/ldlinux.c32
bios/com32/libutil/libutil.c32
bios/com32/lib/libcom32.c32
Зачем всё это нужно даже не спрашивайте. Просто смиритесь с этим фактом, и положите это всё в папку bios в tftpboot.
Теперь при загрузке наш клиент будет запрашивать файлы вот в такой последовательности:
Код: Выделить всё
read request for 'bios/lpxelinux.0'
read request for 'bios/lpxelinux.0'
read request for 'bios/ldlinux.c32'
read request for 'bios/pxelinux.cfg/01-b4-96-91-63-3a-53'
read request for 'bios/pxelinux.cfg/AC100EE3'
read request for 'bios/pxelinux.cfg/AC100EE'
read request for 'bios/pxelinux.cfg/AC100E'
read request for 'bios/pxelinux.cfg/AC100'
read request for 'bios/pxelinux.cfg/AC10'
read request for 'bios/pxelinux.cfg/AC1'
read request for 'bios/pxelinux.cfg/AC'
read request for 'bios/pxelinux.cfg/A'
read request for 'bios/pxelinux.cfg/default'
read request for 'bios/vesamenu.c32'
read request for 'bios/libcom32.c32'
read request for 'bios/libutil.c32'
read request for 'bios/pxelinux.cfg/default'
3 Часть. Загрузчик UEFI.
Друзья, вот именно по этой теме информации в сети достаточно мало, поэтому я считаю необходимым разложить всё по полочкам и объяснить как что работает.
Для загрузки через uefi мы будем использовать разумеется grub2 (потому что в принципе иных вариантов у нас и нет, не пытайтесь использовать pxelinux.efi, он не работает). И писать конфиг для него будем ручками. Не бойтесь, конфиг граба очень простой, просто в нём очень часто много лишнего.
Для того чтобы приступить к работе, вам ОБЯЗАТЕЛЬНО потребуется установленный дистибутив linux. в моём случае это fedora. И в этом линуксе нужно установить пакет grub2-efi-x64-modules, чтобы мы могли создать образ граба конкретно под наш случай.
ВНИМАНИЕ!!! Брать где-то готовый бинарник абсолютно бесполезно, мы должны создать конкретно свой!!!
Как это делатся сейчас поясню.
Первое что делает граб, когда грузится - ищет свой grub.cfg внутри директории $prefix
А любой дистрибутив имеет в prefix что? всё что угодно, но не tftp адрес.
То есть если вы просто возьмёте grub который установлен в дистибутиве, после загрузки он попытается загрузить grub/grub.cfg
c жесткого диска, и разумеется, не найдёт там его. Нам нужно создать свой бинарник, который при загрузке, будет искать свой конфиг не на диске а в tftp, в определённом месте, и уже оттуда будем вести наши дела. Кроме того, мы сделаем бинарник очень маленького размера, без встроенных лишних модулей. Мы будем подгружать их уже из конфигурационного файла, а сам grub будет иметь только минимально нужное: поддержку сети и tftp.
для этого выполните команду:
Код: Выделить всё
grub2-mkimage -p '(tftp,192.168.0.5)/EFI' -O x86_64-efi -o grubx64.efi tftp efinet
(tftp,192.168.0.5) - адрес tftp сервера. /EFI - директория с грабом на этом сервере (внутри /tftpboot разумеется).
-O x86_64-efi говорит грабу о том для какой архитектуры создавать бинарник
tftp efinet - это два модуля которые граб включит в бинарник, чтобы граб мог работать с сетью и tftp.
Вот и всё. Нужный бинарник готов. но это конечно не простой путь, а сложный.
Есть путь проще, воспользоваться утилитой grub2-mknetdir, которая создаст бинарники самостоятельно.
Но я же должен был рассказать вам, как это работает, верно?
Разумеется я вам рекомендую использовать grub2-mknetdir в ваших установках, но я должен был показать вам что будет происходить и как создать тоже самое руками.
Итак, если вы пошли моим путём и собрали свой бинарник, вам ещё нужны модули, их можно взять тоже из дистибутива linux, например в федоре они установлены в /usr/lib/grub. переместите папку x86_64-efi в папку EFI на сервере.
Так же желательно переместить шрифт unicode.ps2 в папку EFI/fonts. Поищите этот шрифт в своём дистрибутиве linux, вполне вероятно он лежит в grub prefix вашей установки.
Так же создайте первоначальный grub.cfg в паке EFI на сервере:
Код: Выделить всё
function load_video {
insmod efi_gop
insmod efi_uga
insmod video_bochs
insmod video_cirrus
insmod all_video
}
load_video
set gfxpayload=keep
set gfxmode=auto
loadfont unicode
font=unicode
insmod gfxterm
insmod gzio
insmod png
submenu "Arch Linux" {
menuentry "Arch Linux" {
linux d/archiso/arch/boot/x86_64/vmlinuz archiso_basedir=arch archiso_http_srv=http://192.168.0.5/tftpboot/d/archiso/ ip=:::::eth0:dhcp
initrd d/archiso/arch/boot/intel_ucode.img d/archiso/arch/boot/x86_64/archiso.img
}
menuentry "Manjaro Linux" {
linux d/manjaro/boot/vmlinuz-x86_64 miso_basedir=manjaro miso_http_srv=http://192.168.0.5/tftpboot/d/manjaro/ ip=:::::eth0:dhcp
initrd d/manjaro/boot/intel_ucode.img d/manjaro/boot/initramfs-x86_64.img
}
} #Конец меню Arch
Часть 4. Наполнение контентом и конфиги.
Как вы можете видеть, я не просто так засунул один загрузчик в папку bios, а второй в папку efi. можно было бы конечно кинуть всё это в корень tftpboot, но тогда бы такой бардак наступил, просто ужас.
Именно поэтому все мои конфиги ссылаются на папку d/
это просто ссылочка, если вы выполните ls -l в папке /tftpboot увидите примерно следующее:
Код: Выделить всё
drwxr-xr-x 4 kasak kasak 512 Dec 29 15:41 EFI
drwxr-xr-x 3 kasak kasak 512 Mar 6 2018 bios
drwxr-xr-x 28 kasak kasak 512 Jan 11 15:03 d
Код: Выделить всё
lrwxr-xr-x 1 kasak kasak 4 Mar 5 2018 d -> ../d
Теперь в папке d достаточно создать подпапки с разными дистрибутивами, и добавить в конфиги pxelinux и grub.cfg ссылки на них.
Я спрячу под спойлер множественные примеры работающих конфигураций для pxelinux и grub:
для pxelinux:
Spoiler
localboot 0x80
menu begin
menu title Ubuntu based
label ..
menu exit
label Ubuntu
linux d/ubuntu/casper/vmlinuz
initrd d/ubuntu/casper/initrd
append ip=dhcp boot=casper netboot=nfs nfsroot=192.168.0.15:/home/kasak/tftpboot/d/ubuntu locale=ru_RU.UTF-8 quiet splash --
label Mint Cinnamon 64 bit
linux d/mint/casper/vmlinuz
initrd d/mint/casper/initrd.lz
append ip=dhcp boot=casper netboot=nfs nfsroot=192.168.0.15:/home/kasak/tftpboot/d/mint locale=ru_RU.UTF-8 quiet splash --
label Elementary OS
linux d/elementary/casper/vmlinuz
initrd d/elementary/casper/initrd.lz
append ip=dhcp boot=casper netboot=nfs nfsroot=192.168.0.15:/home/kasak/tftpboot/d/elementary locale=ru_RU.UTF-8 quiet splash --
label KDE Neon
linux d/kdeneon/casper/vmlinuz
initrd d/kdeneon/casper/initrd
append ip=dhcp boot=casper netboot=nfs nfsroot=192.168.0.15:/home/kasak/tftpboot/d/kdeneon locale=ru_RU.UTF-8 quiet splash --
menu end
menu begin
menu title Debian
label ..
menu exit
label Debian 10 netinst
linux d/debian/vmlinuz
initrd d/debian/initrd.gz
append --- quiet
menu end
menu begin
menu title Arch Linux
label ..
menu exit
label Arch Linux
linux d/archiso/arch/boot/x86_64/vmlinuz
initrd d/archiso/arch/boot/intel_ucode.img,d/archiso/arch/boot/x86_64/archiso.img
append archiso_basedir=arch archiso_http_srv=http://192.168.0.15/tftpboot/d/archiso/ ip=:::::eth0:dhcp
label Manjaro Linux
linux d/manjaro/boot/vmlinuz-x86_64
initrd d/manjaro/boot/intel_ucode.img,d/manjaro/boot/initramfs-x86_64.img
append miso_basedir=manjaro miso_http_srv=http://192.168.0.15/tftpboot/d/manjaro/ ip=:::::eth0:dhcp
label Manjaro Linux via NFS
linux d/manjaro/boot/vmlinuz-x86_64
initrd d/manjaro/boot/intel_ucode.img,d/manjaro/boot/initramfs-x86_64.img
append miso_basedir=manjaro miso_nfs_srv=192.168.0.15:/tftpboot/d/manjaro/ ip=:::::eth0:dhcp
menu end
menu begin
menu title System Rescue CD
label ..
menu exit
LABEL Boot SystemRescue (NFS)
LINUX d/sysrcd/sysresccd/boot/x86_64/vmlinuz
INITRD d/sysrcd/sysresccd/boot/intel_ucode.img,d/sysrcd/sysresccd/boot/amd_ucode.img,d/sysrcd/sysresccd/boot/x86_64/sysresccd.img
APPEND archisobasedir=sysresccd ip=dhcp archiso_nfs_srv=192.168.0.15:/home/kasak/tftpboot/d/sysrcd
LABEL Boot SystemRescue (HTTP)
LINUX d/sysrcd/sysresccd/boot/x86_64/vmlinuz
INITRD d/sysrcd/sysresccd/boot/intel_ucode.img,d/sysrcd/sysresccd/boot/amd_ucode.img,d/sysrcd/sysresccd/boot/x86_64/sysresccd.img
APPEND archisobasedir=sysresccd ip=dhcp archiso_http_srv=http://192.168.0.15/tftpboot/d/sysrcd
menu end
menu begin
menu title Утилиты
label ..
menu exit
label Memtest86+
kernel d/memtest/memtest
label MHDD Диагностика диска
linux /boot/memdisk
initrd http://192.168.0.15/tftpboot/d/mhdd/mhdd32ver4.6.img
append floppy
label Victoria Диагностика диска
linux /boot/memdisk
initrd http://192.168.0.15/tftpboot/d/victoria/Victoria_v.3.52.3.ima
append floppy
label Western Digital Data Lifeguard Diag
linux /boot/memdisk
initrd http://192.168.0.15/tftpboot/d/dosdlg/dosdlg.img
append harddisk
label Seagate Seatools
linux d/seatools/boot/64bit/vmlinuz_4817_64-signed
initrd d/seatools/boot/64bit/modules_4817_64.gz,d/seatools/boot/32bit/rootfs_4817_32.gz
append nfsmount=192.168.0.15:/home/kasak/tftpboot/d/seatools tce=nfs/tce lst=onboot_STB_Xorg.lst desktop=xfwm4 xexec="ST4L --exitPowerOff" mydata=mydata_STB quiet
label Dr. Web Live CD
linux d/drweb/casper/vmlinuz
initrd d/drweb/casper/initrd.lz
append ip=dhcp boot=casper union=aufs maybe-ubiquity netboot=nfs nfsroot=192.168.0.15:/home/kasak/tftpboot/d/drweb quiet splash --
label Hiren's boot CD диагностика системы
linux /boot/memdisk
initrd http://192.168.0.15/tftpboot/d/hirens/hiren.iso
append iso
label Parted Magic
linux d/pmagic/bzImage
initrd d/pmagic/initrd.img,d/pmagic/fu.img,d/pmagic/m.img
append edd=on vga=normal netsrc=wget neturl="http://192.168.0.15/tftpboot/d/pmagic/pmodules"
label GParted редактор разделов
linux d/gparted/vmlinuz
initrd d/gparted/initrd.img
append boot=live config components union=overlay quiet username=user noswap noeject locales=ru_RU.UTF-8 keyboard-layouts=en gl_batch vga=788 fetch=http://192.168.0.15/tftpboot/d/gparted/filesystem.squashfs
label CloneZilla
linux d/clonezilla/vmlinuz
initrd d/clonezilla/initrd.img
append boot=live union=overlay quiet config components noswap locales=en_US.utf8 edd=on ocs_live_run="ocs-live-general" ocs_live_extra_param="" keyboard-layouts=NONE ocs_live_batch="no" nosplash noprompt fetch=http://192.168.0.15/tftpboot/d/clonezilla/filesystem.squashfs
menu end
menu begin
menu title Минималистичные дистрибутивы
label ..
menu exit
label TinyCore Linux
kernel d/tinycore/boot/vmlinuz
initrd d/tinycore/boot/core.gz
append nfsmount=192.168.0.15:/home/kasak/tftpboot/d/tinycore tce=nfs/cde
label Минималистичная ОС Колибри
linux /boot/memdisk
initrd /d/kolibri/kolibri.img
append raw
label Quirky Linux
linux /d/quirky/vmlinuz
initrd http://192.168.0.15/tftpboot/d/quirky/initrd.q
label Damn Small Linux
linux /boot/memdisk
initrd /d/dsl/current.iso
menu end
menu begin
menu title Red Hat based distros
label ..
menu exit
menu begin
menu title CentOS
label ..
menu exit
label CentOS 7 install
linux centos7/images/pxeboot/vmlinuz
initrd d/centos7/images/pxeboot/initrd.img
append repo=http://192.168.0.15/tftpboot/d/centos7
label CentOS 8 install
linux centos8/images/pxeboot/vmlinuz
initrd d/centos8/images/pxeboot/initrd.img
append repo=http://192.168.0.15/tftpboot/d/centos8
menu end
menu begin
menu title Fedora
label ..
menu exit
label Fedora Workstation Live (slow)
linux fedora/live/images/pxeboot/vmlinuz
initrd d/fedora/live/images/pxeboot/initrd.img
append root=live:http://192.168.0.15/tftpboot/d/fedora/live/LiveOS/squashfs.img rd.live.image quiet
menu end
menu end
menu begin
menu title Установка Windows
menu background boot/winburn.png
label ..
menu exit
label Установка Windows 10
linux d/clonezilla/vmlinuz
initrd d/clonezilla/initrd.img
append boot=live union=overlay quiet config components noswap locales=en_US.utf8 edd=on ocs_live_run="ocs-sr -g auto -e1 auto -e2 -r -j2 -scr -p cmd restoredisk win10 ask_user" ocs_repository="smb://guest:NULL@192.168.2.50/images" ocs_live_extra_param="" keyboard-layouts=NONE ocs_live_batch="no" nosplash noprompt fetch=http://192.168.0.15/tftpboot/d/clonezilla/filesystem.squashfs nomodeset vga=791
text help
ВНИМАНИЕ!!! Установщик удалит все данные на выбранном диске и установит образ Windows 10 Профессиональная 64 бита (UEFI).
endtext
Spoiler
menuentry "Arch Linux" {
linux d/archiso/arch/boot/x86_64/vmlinuz archiso_basedir=arch archiso_http_srv=http://192.168.0.15/tftpboot/d/archiso/ ip=:::::eth0:dhcp quiet
initrd d/archiso/arch/boot/intel_ucode.img d/archiso/arch/boot/x86_64/archiso.img
}
menuentry "Manjaro Linux" {
linux d/manjaro/boot/vmlinuz-x86_64 miso_basedir=manjaro miso_http_srv=http://192.168.0.15/tftpboot/d/manjaro/ ip=:::::eth0:dhcp quiet
initrd d/manjaro/boot/intel_ucode.img d/manjaro/boot/initramfs-x86_64.img
}
menuentry "Manjaro Linux via NFS" {
linux d/manjaro/boot/vmlinuz-x86_64 miso_basedir=manjaro miso_nfs_srv=192.168.0.15:/home/kasak/tftpboot/d/manjaro/ ip=:::::eth0:dhcp quiet
initrd d/manjaro/boot/intel_ucode.img d/manjaro/boot/initramfs-x86_64.img
}
} #Конец меню Arch
submenu "Ubuntu based" {
menuentry "Ubuntu" {
linux d/ubuntu/casper/vmlinuz boot=casper ip=dhcp netboot=nfs nfsroot=192.168.0.15:/home/kasak/tftpboot/d/ubuntu locale=ru_RU.UTF-8 quiet splash --
initrd d/ubuntu/casper/initrd
}
menuentry "Mint Cinnamon" {
linux d/mint/casper/vmlinuz boot=casper ip=dhcp netboot=nfs nfsroot=192.168.0.15:/home/kasak/tftpboot/d/mint locale=ru_RU.UTF-8 quiet splash --
initrd d/mint/casper/initrd.lz
}
menuentry "Elementary OS" {
linux d/elementary/casper/vmlinuz boot=casper ip=dhcp netboot=nfs nfsroot=192.168.0.15:/home/kasak/tftpboot/d/elementary locale=ru_RU.UTF-8 quiet splash --
initrd d/elementary/casper/initrd.lz
}
menuentry "KDE Neon" {
linux d/kdeneon/casper/vmlinuz boot=casper ip=dhcp netboot=nfs nfsroot=192.168.0.15:/home/kasak/tftpboot/d/kdeneon locale=ru_RU.UTF-8 quiet splash --
initrd d/kdeneon/casper/initrd
}
} #Конец меню убунт
submenu "Utilities" {
menuentry "Parted Magic" {
linux d/pmagic/bzImage edd=on vga=normal netsrc=wget neturl="http://192.168.0.15/tftpboot/d/pmagic/pmodules/"
initrd d/pmagic/initrd.img d/pmagic/fu.img d/pmagic/m.img
}
menuentry "GParted partition editor" {
linux d/gparted/vmlinuz boot=live config components union=overlay quiet username=user noswap noeject locales=ru_RU.UTF-8 keyboard-layouts=en gl_batch vga=788 fetch=http://192.168.0.15/tftpboot/d/gparted/filesystem.squashfs
initrd d/gparted/initrd.img
}
menuentry "CloneZilla" {
linux d/clonezilla/vmlinuz boot=live union=overlay quiet config components noswap locales=en_US.utf8 edd=on ocs_live_run="ocs-live-general" ocs_live_extra_param="" keyboard-layouts=NONE ocs_live_batch="no" nosplash noprompt fetch=http://192.168.0.15/tftpboot/d/clonezilla/filesystem.squashfs
initrd d/clonezilla/initrd.img
}
menuentry "change windows password" {
linux d/ntpass/vmlinuz rw vga=1 loglevel=1
initrd d/ntpass/initrd.czg d/ntpass/scsi.cgz
}
menuentry "Dr.Web Live CD" {
linux d/drweb/casper/vmlinuz ip=dhcp boot=casper union=aufs maybe-ubiquity netboot=nfs nfsroot=192.168.0.15:/home/kasak/tftpboot/d/drweb quiet splash --
initrd d/drweb/casper/initrd.lz
}
menuentry "Seagate Seatools" {
linux d/seatools/boot/64bit/vmlinuz_4817_64-signed nfsmount=192.168.0.15:/home/kasak/tftpboot/d/seatools tce=nfs/tce lst=onboot_STB_Xorg.lst desktop=xfwm4 xexec="ST4L --exitPowerOff" mydata=mydata_STB quiet
initrd d/seatools/boot/64bit/modules_4817_64.gz d/seatools/boot/32bit/rootfs_4817_32.gz
}
menuentry "Memtest86 free" {
insmod chain
chainloader (http,192.168.0.15)/tftpboot/d/memtest86/BOOTX64.efi
}
} #Конец меню утилит
submenu "CentOS" {
menuentry "CentOS 7 install" {
linux centos7/images/pxeboot/vmlinuz repo=http://192.168.0.15/tftpboot/d/centos7
initrd d/centos7/images/pxeboot/initrd.img
}
menuentry "CentOS 8 install" {
linux centos8/images/pxeboot/vmlinuz repo=http://192.168.0.15/tftpboot/d/centos8
initrd d/centos8/images/pxeboot/initrd.img
}
} #Конец меню центосей
submenu "Install windows must die" {
background_image bios/boot/winburn.png
menuentry "Windows 10" {
linux d/clonezilla/vmlinuz boot=live union=overlay quiet config components noswap locales=en_US.utf8 edd=on ocs_live_run="ocs-sr -g auto -e1 auto -e2 -r -j2 -scr restoredisk win10 ask_user" ocs_repository="smb://guest:NULL@192.168.2.50/images" ocs_live_extra_param="" keyboard-layouts=NONE ocs_live_batch="no" nosplash noprompt fetch=http://192.168.0.15/tftpboot/d/clonezilla/filesystem.squashfs nomodeset vga=791
initrd d/clonezilla/initrd.img
}
}
Украшательства:
Дабы немного разукрасить скучный вид, можно добавить русский язык в pxelinux. Для этого просто конвертируйте файл с русским шрифтом при помощи iconv:
Код: Выделить всё
iconv -f utf-8 -t cp866 default_rus > default
Код: Выделить всё
default: font Cyr_a8x16.psf
Код: Выделить всё
menu background back.png
Картинка должна иметь разрешение 640x480 и цветность 16 бит. Как сконвертировать есть в интернете.
GFXTERM В грабе позволяет устанавливать картинки на экран и меняет разрешение на адекватное. Чтобы включить добавьте в начало конфига это:
Код: Выделить всё
insmod all_video
insmod png
loadfont unicode
terminal_output gfxterm
background_image boot/grub2/tux.png
Возможные проблемы:
Я не рекомендую использовать русский язык в grub. На некоторых машинах с ним нет никаких проблем, а на некоторых русские буквы просто пропадают.
Существуют проблемы с запуском убунт и их клонов с загрузкой из nfs когда сервер НЕ linux (в моём случае OpenBSD). Для этого нужно добавить опции NFSOPTS="rsize=8192,wsize=8192" к опциям загрузки, тогда всё пройдёт гладко.
Будьте предельно внимательны при копировании дистрибутива убунты на сервер. там есть скрытая папка .disk без которой убунта не загрузится!
Не пытайтесь в uefi загрузить старинные досовские утилиты, они не загрузятся.
Именно поэтому, придётся держать два отдельных конфига под pxe и uefi, иначе получится что в uefi не будет грузится часть досовских прог, а в pxe не будут грузится уефные бинарники
В грабе будьте внимательны с переменными и командами. Например terminal_output это команда, и знак = после неё не нужен. а gfxmode= это переменная, и знак = после неё нужен! Лучше поначалу вообще не используйте никакие переменные, чтобы не путаться.
Так же при загрузке через uefi, отключайте secure boot.
Теоретически, можно около бинарника граба поместить shimx64.efi, но лучше просто выключить secure boot.
seagate seatools можно загрузить через pxe и в режиме bios и в uefi. Он основан на tiny core linux. но к сожалению он не принимает nfsopts и заставить его понизить rsize и wsize нереально, поэтому nfs сервер под bsd не пойдёт.
western digital data lifeguard можно загрузить только в режиме legacy bios. но придётся вручную создать толстый дос диск.
я сделал это так:
1) создал в виртуалбоксе виртуальную машину с диском на 40-50 мегабайт. 2) установил туда фридос 3) скопировал туда dlg, и добавил в autoexec.bat путь к нему. 4) загрузил в этой виртуальной машине линукс и через dd скопировал весь диск в файл img. этот файл и нужно передать программе memdisk.
Часть 6. Заключительная
Возможно вы хотите задать вопросы, поэтому я сразу кое что проясню.
Q: Почему я сразу не использовал grub-mknetdir чтобы упростить себе и вам задачу, а не разводить тут писанину.
Отвечаю: Я поставил перед собой задачу рассказать вам как это происходит, как это работает, хотел показать разные варианты решения этих задач.
Q: Почему я не использовал тот же grub для legacy pxe?
A: Я мог бы, однако, опять же, хотел показать что не одним грабом можно решить эту задачу, и кроме того, pxelinux существует уже очень давно, и я пользуюсь им уже больше 10 лет.
Q: Как я смог загрузить N по сети? Я вижу в конфигах этот пункт!
A: Я давний член unixforum, вы читаете не перевод и не копипасту, а мои (kasak) статьи. Вы можете связаться со мной в личном сообщении, я рад помочь всем кто идёт по жизни с linux и bsd.