PXE-сервер, сервер для загрузки различных ОС через сеть.
Я тут много писал о том, как запускать различные дистрибутивы по сети, однако, не написал, как, собственно, настроить PXE-сервер. Исправляю досадное упущение. Сервер поднимался на Slackware 14.2, на других линуксах должно быть примерно так же, за исключением того, что некоторый софт придется поставить. В Slackware все, кроме TFTP, было уже "из коробки", оставалось только настроить.
PXE-сервер занимает со всеми дистрибутивами довольно много места, у меня был довольно большой раздел
/home, вот в нем я и создал подкаталог pxe, в котором создал два подкаталога scripts, для хранения скриптов, дополнительных утилит и бэкапов конфигов, и tftp - будущий корень TFTP-сервера, где завел отдельные подкаталоги для дистрибутивов (distrib) модулей сетевого загрузчика (modules) и загрузочного меню (pxelinux.cfg). В подкаталоге distrib для каждого дистрибутива по возможности создавался отдельный подкаталог. Пример дерева каталогов на PasteBinСтавим TFTP-сервер, я поставил такой же, как в статье, на которой основывался, настраивая сервер [1],
atftp, а именно atftp-0.7.1. Поставил через sbopkg. На всякий случай готовый пакетПоставили, теперь создадим файл
/etc/tftpd.rules и запишем в него одну строку:rg \\ /Небольшое пояснение: Сетевой загрузчик, о котором будет сказано далее, обращается к TFTP-серверу на удаленной машине, чтобы подгрузить основные файлы - ядра Linux-дистрибутивов, собственные модули, файлы инициализационных RAM-дисков (
initrd[.gz]), файлы образов ISO, дискет или жестких дисков. Файл /etc/tftpd.rules и правило rg \\ / нужно, чтобы TFTP-сервер распознал файлы, запрошенные Windows-загрузчиками (т.к. в Windows в качестве разделителя пути используется \, а в Linux /).Команда запуска TFTP-сервера:
in.tftpd -s /home/pxe/tftp --secure -l -v -r blksize -m /etc/tftpd.rules --blocksize 1456
Без параметра
-r blksize у меня TFTP глючил (о чем есть примечание в [1]), --blocksize 1456 несколько ускорил загрузку.Параметр
-s путь устанавливает корневой каталог TFTP-сервера (там будут лежать сетевой загрузчик, дополнительные модули и сами дистрибутивы, поэтому потребуется достаточно места).-v - заставляет сервер писать логи.Остальные взял из [1]
Просмотр логов:
TFTP пишет логи в
/var/log/messages и некоторые сообщения в /var/log/syslog.Соответственно команды:
grep tftp /var/log/messagesи
grep tftp /var/log/syslogКоманды остановки сервера:
pkill in.tftpd
sleep 5Сам сервер был доступен "из коробки"
Для виндовых дистрибутивов надо поднять Samba. Производим основные настройки в файле
/etc/samba/smb.conf[global]
workgroup = WORKGROUP
netbios name = PXE
server string = Local PXE
interfaces = 10.10.0.120
map to guest = bad user
security = USER
unix extensions = no
wide links = yes
follow symlinks = yes
log file = /var/log/samba/log.%m
max log size = 50
dns proxy = No
load printers = no
show add printer wizard = no
printcap name = /dev/null
disable spoolss = Yes
[printers]
comment = All Printers
path = /var/spool/samba
printable = Yes
browseable = Noworkgroup - рабочая группа (поменяйте на свою)netbios name - имя компьютераserver string - описание (видно в "Сетевом окружении" из Windows)interfaces - сетевой интерфейс, который будет прослушивать Samba-сервер. Можно выставить имена сетевых устройств (например, eth0) или задать IPДелаем доступ к каталогам, открытым в Samba анонимным (без логина и пароля):
map to guest = bad user
security = USERСледующие 3 строки нужны, чтоб Samba стал поддерживать символические ссылки. У меня, например, дистрибутивы Windows 7 и 10 фактически лежат в каталоге FTP-сервера, а в каталоге дистрибутивов созданы символически ссылки, расшаренные в Samba:
unix extensions = no
wide links = yes
follow symlinks = yes log file - куда писать логmax log size - и его максимальный размерПо умолчанию отключаем DNS-proxy и доступ к принтерам:
dns proxy = No
load printers = no
show add printer wizard = no
printcap name = /dev/null
disable spoolss = YesСекцию
[printers] оставляем по умолчанию (все равно все настройки принтеров вырублены в [global], да и принтеров у меня на этом сервере не было).Для запуска Samba в Slackware достаточно дать права на исполнение файлу
/etc/rc.d/rc.samba и дать команду на запуск:chmod 744 /etc/rc.d/rc.samba
/etc/rc.d/rc.samba startОстановка:
/etc/rc.d/rc.samba stop
Если не надо, чтоб сервер Samba стартовал при загрузке ОС, отбираем права на исполнение:chmod 644 /etc/rc.d/rc.sambaШары расписаны отдельно для конкретных дистрибутивов в соответствующих заметках, полный пример конфига на PasteBin
NFS нужен для запуска на удаленной машине некоторых дистрибутивов Linux. Смотрите подробности в соответствующих разделах, посвященных данным дистрибутивам.
В Slackware он так же шел "из коробки", а в конфиге нужно было прописать только конкретные каталоги, открытые для доступа по NFS.
Для запуска NFS нужно поставить права на исполнение следующим файлам:
/etc/rc.d/rc.nfsd
/etc/rc.d/rc.rpcchmod 744 /etc/rc.d/rc.nfsd
chmod 744 /etc/rc.d/rc.rpcи запустить NFS-сервер:
/etc/rc.d/rc.nfsd startОстановка NFS-сервера:
/etc/rc.d/rc.nfsd stopЕсли не хотите, чтоб NFS автоматически поднимался при загрузке ОС, отберите права на исполнение:
chmod 644 /etc/rc.d/rc.nfsd
chmod 644 /etc/rc.d/rc.rpcПолный пример конфига NFS (изменения вносятся в файл
/etc/exports)Загрузка по сети устроена так, что BIOS (или EFI) целевой машины передает управление специальной микропрограмме-загрузчику, встроенному в микросхему сетевой карты. Тот пытается получить IP по DHCP, а потом подгрузить с машины, выдавшей IP, основной сетевой загрузчик. В некоторых случаях, если в сети уже есть другой DHCP это может вызвать глюки при загрузке (подробнее см. [1], там описаны конфигурации для сервера, если в сети, например, присутствует маршрутизатор CISCO, раздающий IP по DHCP).
Итак, DHCP надо настроить.
У меня с установкой соответствующего софта опять же, проблем не было, DHCP-сервер шел вместе с ОС, оставалось только настроить.
Копируем старый конфиг куда-нибудь, у меня DHCP до этого был не настроен, потому конфиг был пустой
Составляем конфиг для PXE
Для корректной работы сервера, он должен быть сохранен под именем
/etc/dhcpd.conf.Если не нужно, чтобы DHCP-сервер стартовал постоянно, а, например, только на время работы PXE, то делаем так:
Старт DHCP-сервера:
echo "Copy DHCP daemon PXE config..."
#pxe config must be in current dir.
CURDIR=`pwd`
cp "$CURDIR/dhcpd.conf" /etc/dhcpd.conf
echo "Starting DHCP daemon..."
dhcpd
sleep 5Остановка DHCP-сервера:
echo "Stopping DHCP daemon..."
pkill dhcpd
sleep 5
echo "Restore DHCP daemon original config file..."
#original config must be in current dir.
CURDIR=`pwd`
cp "$CURDIR/dhcpd.conf.orig" /etc/dhcpd.confОбъединим все команды для запуска PXE-сервера в один скрипт
start-pxe:#!/bin/bash
echo "Starting TFTP server..."
in.tftpd -s /home/pxe/tftp --secure -l -v -r blksize -m /etc/tftpd.rules --blocksize 1456
sleep 5
echo "Copy DHCP daemon PXE config..."
#pxe config must be in current dir.
CURDIR=`pwd`
cp "$CURDIR/dhcpd.conf" /etc/dhcpd.conf
echo "Starting DHCP daemon..."
dhcpd
sleep 5
#winxp samba
echo "Starting samba server"
chmod 744 /etc/rc.d/rc.samba
/etc/rc.d/rc.samba start
sleep 5
#NFS for live linux
echo "Starting NFS..."
chmod 744 /etc/rc.d/rc.nfsd
chmod 744 /etc/rc.d/rc.rpc
/etc/rc.d/rc.nfsd start
sleep 5
echo "Complete!"И для остановки (
stop-pxe):#!/bin/bash
echo "Stopping TFTP server..."
pkill in.tftpd
sleep 5
echo "Stopping DHCP daemon..."
pkill dhcpd
sleep 5
echo "Restore DHCP daemon original config file..."
#original config must be in current dir.
CURDIR=`pwd`
cp "$CURDIR/dhcpd.conf.orig" /etc/dhcpd.conf
echo "Stopping samba server"
/etc/rc.d/rc.samba stop
chmod 644 /etc/rc.d/rc.samba
sleep 5
#stop NFS
echo "Stopping NFS..."
ip netns exec provns /etc/rc.d/rc.nfsd stop
chmod 644 /etc/rc.d/rc.nfsd
chmod 644 /etc/rc.d/rc.rpc
sleep 5
echo "Complete!"start-pxe и stop-pxe на PasteBin.На самом деле, загрузчик SYSLINUX - это целый комплекс загрузчиков, на все случаи жизни, здесь есть и сетевой - PXELINUX, и загрузчик для ISO-образов ISOLINUX и просто загрузчик ОС с жесткого диска. Пока нам потребуется только сетевой. SYSLINUX представляет собой операционную систему в миниатюре, загрузчик с помощью специальных команд, прописываемых в загрузочном меню, может выполнять специальные функции, сохраняемые в исполняемых файлах особого формата - модулях загрузчика. Обычно они имеют расширение
*.c32, и плюс некоторые специальные файлы, например модуль memdisk, загружающий в память ISO-, Floppy- или HDD-образы.Получение загрузчика: Проще всего его получить с официального сайта, скачав специальным скриптом. Скрипт разберет полученный архив на части, отдельно найдет в скачанном архиве модули
*.32, memdisk и сетевой загрузчик pxelinux.0.#!/bin/bash
SYSLINUXNAME="syslinux-4.02"
SYSLINUXADDR="https://www.kernel.org/pu b/linux/utils/boot/syslinux/4.xx/$SYSLIN UXNAME.tar.gz" #на Хабре использовали эту, пока оставим
WORKDIR="/tmp"
SERVERDIR="/home/pxe/tftp"
cd $WORKDIR
wget $SYSLINUXADDR
tar -xf "$SYSLINUXNAME.tar.gz"
cd "$SYSLINUXNAME/"
find ./ -name "memdisk" -type f|xargs -I {} cp '{}' $SERVERDIR
find ./ -name "pxelinux.0"|xargs -I {} cp '{}' $SERVERDIR
find ./ -name "*.c32"|xargs -I {} cp '{}' $SERVERDIRСкрипт на PasteBin
В оригинальной статье [1], была использована версия 4.02, если подумаете использовать какую-то другую, достаточно поменять данные в строке
SYSLINUXNAME и/или SYSLINUXADDRДалее перенесем все файлы
*.c32 и memdisk в подкаталог modules (чтоб не мозолили глаза), а сетевой загрузчик pxelinux.0 оставим в корневом каталоге TFTP-сервера.Теперь пишем минимальное тестовое меню, и проверяем запуск системы.
Добавим в меню загрузку с первого жесткого диска и перезагрузку машины:

Меню по умолчанию описывается в файле
default, находящемся в подкаталоге pxelinux.cfg PXE-сервера, там же находятся и дополнительные меню, вызываемые из основного.Пример тестового меню на PasteBin
Сначала мы подгружаем специальный модуль пользовательского интерфейса
modules/menu.c32, который отвечает за загрузку текстового интерфейса меню (подходит для любых компьютеров, даже самых слабых)ui modules/menu.c32PROMPT 0 - отключение специального приглашения командной строки.menu title ChaosServer PXE boot menu - заголовок меню.Далее идут описания конкретных пунктов меню:
LABEL bootlocal
menu label Boot from first HDD
kernel modules/chain.c32
append hd0 0
timeout 11120
LABEL reboot
menu label Reboot
kernel modules/reboot.c32параметр
timeout включает отсчет времени до загрузки определенного пункта меню 1 единица после параметра timeout составляет 0.1 сchain.c32 - переключает на следующий загрузчик (grldr, ntldr или просто на загрузчик, установленный на разделе HDD)reboot.c32 - перезагрузка компьютераmenu.c32 - при использовании в меню, может загружать дополнительные меню (подменю), или производить переход назад/между меню. Пример использования:Загрузка меню с утилитами Acronis:
LABEL acronis
menu label Acronis utilities
kernel modules/menu.c32
append pxelinux.cfg/acrВозврат в основное меню:
LABEL back
menu label Back to main menu
kernel modules/menu.c32
append pxelinux.cfg/defaultmemdisk - специальный модуль, выполненный как псевоядро Линукс, может загружать образы ISO, HDD или дискет в оперативную память и передавать им дальнейшую загрузку. Пример использования:LABEL acronis2011
menu label Acronis True Image 2011
kernel modules/memdisk
initrd distrib/acr/acronis2011/loader.iso
append iso raw
На PasteBin
-
createiso - скрипт для создания ISO-образов-
mknetboot.sh (скрипт для Puppy Slacko и подготовки к PXE-запуску этого дистрибутива)-
syslinux-install.bash - скрипт для скачивания SYSLINUXконкретными дистрибутивами Windows, Linux и другими (копия)
1. Загрузочный сервер — как загрузочная флешка, только сервер и по сети Копия в PDF Копия в DOC
-
atftp 0.7.1 (готовый пакет для Skackware)- Конфиги
- Меню
- Скрипты
- Дополнительные утилиты
- Модули PXELINUX, загрузчик, структура каталогов
Это репост с сайта http://tolik-punkoff.com
Оригинал: http://tolik-punkoff.com/2019/03/08/pxe-s