Мультизагрузочный сервер для PXE и UEFI network boot (Сегодня сделаем загрузку по сети для старых и новых компьютеров!)

Полезные советы и программы от пользователей нашего форума.

Модератор: Модераторы разделов

Аватара пользователя
kasak
Сообщения: 887
ОС: OpenBSD

Мультизагрузочный сервер для PXE и UEFI network boot

Сообщение kasak »

Коллеги линуксойды, из-за очень малого количества информации в интернетах по вопросам uefi network boot, я решил восполнить этот пробел, и рассказать сам, как организовать мультизагрузочный сервис, со всякими разными линуксами, доступный одновременно через старый Legacy PXE и через новомодный UEFI Network Stack.

Статью я разделю на три части, первая будет о том как настроить базовый сервер для загрузки, то есть 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;
куда-либо в конфиг. Поскольку у меня всё не очень осложнено, все эти конструкции добавлены в глобальный конфиг, но можно добавить это всё в описание subnet.

Разберёмся по пунктам:
1) Когда pxe клиент получает ip адрес, он возвращает опцию vendor-class-identifier,
которая выглядит так:

Код: Выделить всё

vendor-class-identifier = "PXEClient:Arch:00000:UNDI:002001";
такую строку клиент вернёт если будет грузится по legacy pxe.
А вот такую если по UEFI:

Код: Выделить всё

set vendor-class-identifier = "PXEClient:Arch:00007:UNDI:003016";
Как нетрудно догадаться, наш оператор сравнения, отрезает от этой опции 15 байт ( PXEClient:Arch: )
После чего берёт следующие 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
Правда в openbsd такой способ включения сервисов уже устарел.
Сейчас модно добавлять все через rcctl:

Код: Выделить всё

rcctl enable tftpd 
rcctl set tftpd flags "-v /tftpboot"
По умолчанию директории /tftpboot не существует.
Да и нам будет неудобно всё время лазить по файловой системе в её поисках. Разумно создать эту директорию в домашнем каталоге пользователя и сделать на неё ссылку:

Код: Выделить всё

cd ~
mkdir tftpboot
ln -s ~/tftpboot /tftpboot
обратите внимание, tftpd работает не от root, это значит что для доступа к нужной директории, весь путь должен иметь бит x.
например у меня директория /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
добавить в /etc/exports:

Код: Выделить всё

/home/kasak/tftpboot 192.168.0.0/12 
выполнить exportfs и добавить nfs в фаервол:

Код: Выделить всё

firewall-cmd --permanent --add-service=nfs
firewall-cmd --permanent --add-service=rpcbind
firewall-cmd --permanent --add-service=mountd
Настройка http

Последняя утилита которая очень поможет нам, это 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
вот эта белиберда b8945.... это UUID материнской платы, уникальный для каждого компьютера.
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 --
Я думаю тут всё понятно без особенного расписывания, однако обратите внимание на vesamenu.c32
нам для отображения меню потребуется ещё вот эта штуковина. Найти её можно в каталоге скачанного 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'
Давайте пока на этом остановимся, и будем считать что с этой частью мы закончили. Добавлением всяких украшательств займемся чуть позже, а пока давайте приготовим платформу для uefi.

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
а внутри папок EFI и bios есть ссылочка ведущая на ../d:

Код: Выделить всё

lrwxr-xr-x  1 kasak  kasak       4 Mar  5  2018 d -> ../d
таким образом можно сохранить на tftp сервере некоторый порядок. Однако вам не обязательно повторять за мной, вы можете создать свою структуру.

Теперь в папке d достаточно создать подпапки с разными дистрибутивами, и добавить в конфиги pxelinux и grub.cfg ссылки на них.

Я спрячу под спойлер множественные примеры работающих конфигураций для pxelinux и grub:

для pxelinux:
Spoiler
label Загрузка с первого диска
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
для grub.cfg:
Spoiler
submenu "Arch Linux" {

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
}
}
Часть 5. Украшательства, и косяки с которыми вы можете столкнуться:

Украшательства:
Дабы немного разукрасить скучный вид, можно добавить русский язык в pxelinux. Для этого просто конвертируйте файл с русским шрифтом при помощи iconv:

Код: Выделить всё

iconv -f utf-8 -t cp866 default_rus > default
и добавьте на верх файла

Код: Выделить всё

default: font Cyr_a8x16.psf
Так же можно добавить обои в pxelinux и менять их в процессе перехода по разным менюшкам. Для этого нужно добавить строку в default:

Код: Выделить всё

menu background back.png
такую же строку следует добавить в подменю, если вы хотите чтобы в подменю картинка менялась. так можно добавить картинку например убунты в меню с убунтами.

Картинка должна иметь разрешение 640x480 и цветность 16 бит. Как сконвертировать есть в интернете.

GFXTERM В грабе позволяет устанавливать картинки на экран и меняет разрешение на адекватное. Чтобы включить добавьте в начало конфига это:

Код: Выделить всё

insmod all_video
insmod png
loadfont unicode
terminal_output gfxterm

background_image boot/grub2/tux.png
Картинку 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.
Последний раз редактировалось kasak 01.02.2021 08:53, всего редактировалось 10 раз.
Linux kasakoff 5.10.7-200.fc33.x86_64 #1 SMP Tue Jan 12 20:20:11 UTC 2021 x86_64 x86_64 x86_64 GNU/Linux
Спасибо сказали:

Аватара пользователя
SerW
Сообщения: 221
ОС: Fedora Workstation Latest

Re: Мультизагрузочный сервер для PXE и UEFI network boot

Сообщение SerW »

Это полу-машинный перевод?
Сергей Швайко » DragonSerW.RU
Спасибо сказали:

Аватара пользователя
UnixNoob
Сообщения: 578
ОС: Slackware

Re: Мультизагрузочный сервер для PXE и UEFI network boot

Сообщение UnixNoob »

kasak писал:
26.01.2021 16:40
Для загрузки через uefi мы будем использовать разумеется grub2 (потому что в принципе иных вариантов у нас и нет, не пытайтесь использовать pxelinux.efi, он не работает)
Есть, как минимум, rEFInd. Его конфиг лежит в разделе EFI,и искать его на диске другом он не будет.
Спасибо сказали:

Аватара пользователя
kasak
Сообщения: 887
ОС: OpenBSD

Re: Мультизагрузочный сервер для PXE и UEFI network boot

Сообщение kasak »

UnixNoob писал:
26.01.2021 18:18
kasak писал:
26.01.2021 16:40
Для загрузки через uefi мы будем использовать разумеется grub2 (потому что в принципе иных вариантов у нас и нет, не пытайтесь использовать pxelinux.efi, он не работает)
Есть, как минимум, rEFInd. Его конфиг лежит в разделе EFI,и искать его на диске другом он не будет.
rEFInd itself will normally be installed locally. (You can deliver rEFInd as a network-boot image, but that image will be able to boot only OSes on the local disk.)
Linux kasakoff 5.10.7-200.fc33.x86_64 #1 SMP Tue Jan 12 20:20:11 UTC 2021 x86_64 x86_64 x86_64 GNU/Linux
Спасибо сказали:

Аватара пользователя
UnixNoob
Сообщения: 578
ОС: Slackware

Re: Мультизагрузочный сервер для PXE и UEFI network boot

Сообщение UnixNoob »

kasak, понятно. Вы это писали с точки зрения поддержки загрузки по сети, а прозвучало как-будто с efi никакой загрузчик не работает. Значит я не так понял.
Спасибо сказали:

Аватара пользователя
xsacha
Сообщения: 24
ОС: Solaris 10

Re: Мультизагрузочный сервер для PXE и UEFI network boot

Сообщение xsacha »

Подскажите как запустить на установку windows 10 например у меня такой конфиг

Код: Выделить всё

menuentry "Windows 10" {
  echo "Entering windows installation environment..."
  insmod part_gpt
  insmod ntfs
  insmod chain
  insmod memdisk
  loopback loop images/windows10/winpe.iso
}
но винда не стартует и вообще любой iso Образ как запустить на установку ?
Последний раз редактировалось Bizdelnick 03.06.2021 13:00, всего редактировалось 1 раз.
Причина: тег [code]
Спасибо сказали:

Аватара пользователя
Bizdelnick
Модератор
Сообщения: 18483
Статус: grammatikführer
ОС: Debian GNU/Linux

Re: Мультизагрузочный сервер для PXE и UEFI network boot

Сообщение Bizdelnick »

xsacha писал:
03.06.2021 12:52
Подскажите как запустить на установку windows 10 например у меня такой конфиг

Код: Выделить всё

menuentry "Windows 10" {
  echo "Entering windows installation environment..."
  insmod part_gpt
  insmod ntfs
  insmod chain
  insmod memdisk
  loopback loop images/windows10/winpe.iso
}
но винда не стартует и вообще любой iso Образ как запустить на установку ?
Так Вы ничего и не запускаете в этом конфиге. Подгрузили модули, подцепили образ и на этом остановились. Дальше должно быть что-то вроде

Код: Выделить всё

set root=(loop)
chainloader /efi/boot/bootx64.efi
Но я не уверен, что таким образом в принципе можно заставить работать инсталлятор винды. Мой опыт (возможно, устаревший) говорит о том, что если он и запустится, то всё равно не найдёт установочные файлы.
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:

Аватара пользователя
ormorph
Сообщения: 1764
ОС: Gentoo

Re: Мультизагрузочный сервер для PXE и UEFI network boot

Сообщение ormorph »

Пробовал давно на syslinux, тут кое что описано. Т.е. можно будет скопировать файл memdisk из syslinux, и с помощью его уже запускать образ диска винды в grub2.
Спасибо сказали:

Аватара пользователя
xsacha
Сообщения: 24
ОС: Solaris 10

Re: Мультизагрузочный сервер для PXE и UEFI network boot

Сообщение xsacha »

Bizdelnick писал:
03.06.2021 13:05
xsacha писал:
03.06.2021 12:52
Подскажите как запустить на установку windows 10 например у меня такой конфиг

Код: Выделить всё

menuentry "Windows 10" {
  echo "Entering windows installation environment..."
  insmod part_gpt
  insmod ntfs
  insmod chain
  insmod memdisk
  loopback loop images/windows10/winpe.iso
}
но винда не стартует и вообще любой iso Образ как запустить на установку ?
Так Вы ничего и не запускаете в этом конфиге. Подгрузили модули, подцепили образ и на этом остановились. Дальше должно быть что-то вроде

Код: Выделить всё

set root=(loop)
chainloader /efi/boot/bootx64.efi
Но я не уверен, что таким образом в принципе можно заставить работать инсталлятор винды. Мой опыт (возможно, устаревший) говорит о том, что если он и запустится, то всё равно не найдёт установочные файлы.
А как заставить работать инсталятор, все ПК уже на UEFI в режиме bios я настроил все работает но это устаревший режим скоро его вообще не будет и нужно заставить работать в uefi
Спасибо сказали:

Аватара пользователя
Bizdelnick
Модератор
Сообщения: 18483
Статус: grammatikführer
ОС: Debian GNU/Linux

Re: Мультизагрузочный сервер для PXE и UEFI network boot

Сообщение Bizdelnick »

xsacha писал:
04.06.2021 13:37
А как заставить работать инсталятор, все ПК уже на UEFI в режиме bios я настроил все работает но это устаревший режим скоро его вообще не будет и нужно заставить работать в uefi
Я не знаю, надо пробовать. Принципиальной разницы между EFI- и legacy-загрузкой для инсталлятора нет.
Вы хотя бы то, что я написал, сделали? Каков результат?
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:

Аватара пользователя
SwapON
Сообщения: 4
ОС: Arch linux

Re: Мультизагрузочный сервер для PXE и UEFI network boot

Сообщение SwapON »

В принципе всё взлетело. Центос по сети встаёт. Но пробую дебиано-подобные ОСи ставить, на этапе установки говорит что не найдет привод, с которого хочет подгрузить дополнительные компоненты. Ну и установка дальше не идёт... :cray:
Спасибо сказали:

Аватара пользователя
Bizdelnick
Модератор
Сообщения: 18483
Статус: grammatikführer
ОС: Debian GNU/Linux

Re: Мультизагрузочный сервер для PXE и UEFI network boot

Сообщение Bizdelnick »

SwapON писал:
15.07.2021 09:28
пробую дебиано-подобные ОСи ставить, на этапе установки говорит что не найдет привод, с которого хочет подгрузить дополнительные компоненты
Это читали? Грузите netboot?
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:

Аватара пользователя
SwapON
Сообщения: 4
ОС: Arch linux

Re: Мультизагрузочный сервер для PXE и UEFI network boot

Сообщение SwapON »

Bizdelnick писал:
15.07.2021 09:46
SwapON писал:
15.07.2021 09:28
пробую дебиано-подобные ОСи ставить, на этапе установки говорит что не найдет привод, с которого хочет подгрузить дополнительные компоненты
Это читали? Грузите netboot?
Ну если честно, то у нас на работе импортозамещение. Необходимо на 316 АРМ'ов установить астру + для каждого отдела софт. В основном у всех он одинаковый. Дабы всё автоматизировать, было принято решение развернуть PXE, положить туда астру + preseed. Сопсна затык на установке астры. Ну ща почитаю что Вы предложили, думаю разберусь. Спасибо...! ;)
Спасибо сказали:

Аватара пользователя
SwapON
Сообщения: 4
ОС: Arch linux

Re: Мультизагрузочный сервер для PXE и UEFI network boot

Сообщение SwapON »

Bizdelnick писал:
15.07.2021 09:46
SwapON писал:
15.07.2021 09:28
пробую дебиано-подобные ОСи ставить, на этапе установки говорит что не найдет привод, с которого хочет подгрузить дополнительные компоненты
Это читали? Грузите netboot?
Вот я балбес...! Там на диске с астрой, в папке install-doc для тугодумов вся пошагово расписано...! Сделал всё по мануалу, всё взлетело...!
Спасибо сказали: