Преамбула
Я тут много писал о том, как запускать различные дистрибутивы по сети, однако, не написал, как, собственно, настроить 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, загрузчик, структура каталогов