PXE-сервер, сервер для загрузки различных ОС через сеть.

Преамбула

Я тут много писал о том, как запускать различные дистрибутивы по сети, однако, не написал, как, собственно, настроить PXE-сервер. Исправляю досадное упущение. Сервер поднимался на Slackware 14.2, на других линуксах должно быть примерно так же, за исключением того, что некоторый софт придется поставить. В Slackware все, кроме TFTP, было уже «из коробки», оставалось только настроить.

Структура каталогов

PXE-сервер занимает со всеми дистрибутивами довольно много места, у меня был довольно большой раздел /home, вот в нем я и создал подкаталог pxe, в котором создал два подкаталога scripts, для хранения скриптов, дополнительных утилит и бэкапов конфигов, и tftp — будущий корень TFTP-сервера, где завел отдельные подкаталоги для дистрибутивов (distrib) модулей сетевого загрузчика (modules) и загрузочного меню (pxelinux.cfg). В подкаталоге distrib для каждого дистрибутива по возможности создавался отдельный подкаталог. Пример дерева каталогов на PasteBin

TFTP

Ставим 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

Сам сервер был доступен «из коробки»
Для виндовых дистрибутивов надо поднять 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

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)

DHCP

Загрузка по сети устроена так, что 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

На самом деле, загрузчик 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/pub/linux/utils/boot/syslinux/4.xx/$SYSLINUXNAME.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 с

Описание некоторых модулей SYSLINUX

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

Осталось наполнить наш PXE-сервер

конкретными дистрибутивами Windows, Linux и другими (копия)

Источники

1. Загрузочный сервер — как загрузочная флешка, только сервер и по сети Копия в PDF Копия в DOC

Скачать

atftp 0.7.1 (готовый пакет для Skackware)
Конфиги
Меню
Скрипты
Дополнительные утилиты
Модули PXELINUX, загрузчик, структура каталогов

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *