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 = No
workgroup
- рабочая группа (поменяйте на свою)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.rpc
chmod 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.c32
PROMPT 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/default
memdisk
- специальный модуль, выполненный как псевоядро Линукс, может загружать образы 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