Для чего данная заметка:
Сервис tftpd будет осуществлять подгрузку установочных файлов для последующего развертывания систем через PXE. Я выбрал данный сервис потому, как я уже опубликовывал на своем блоге, но повторюсь мне нужен сервис задачей которого будет просто принимать/загружать файлы без возможностей аутентификации. Некоторые нюансы правильных настроек я возьму отсюда.
Заметка является продолжением той где я рассмотрел, как поднять шлюз в локальной сети.
На заметку: под tftpd каталог советую выделить отдельный логический диск (lvm), чтобы в последствии можно было его увеличить если возникнет такая потребность.
Что ж пожалуй начнем: –
приводим к своего собственному представлению как это должно быть в итоге на шлюзе, настраиваем сервис tftpd:
ekzorchik@srv-serv:~$ sudo apt-get install tftpd-hpa
ekzorchik@srv-serv:~$ sudo mkdir -p /media/pxeboot
ekzorchik@srv-serv:~$ sudo chmod -R 777 /media/pxeboot/
ekzorchik@srv-serv:~$ sudo chown -R nobody:nogroup /media/tfpdconf/
ekzorchik@srv-serv:~$ sudo cp /etc/default/tftpd-hpa /etc/default/tftpd-hpa.backup
ekzorchik@srv-serv:~$ sudo nano /etc/default/tftpd-hpa
TFTP_USERNAME="tftp"
TFTP_DIRECTORY="/media/pxeboot
TFTP_ADDRESS="0.0.0.0:69"
TFTP_OPTIONS="--secure"
ekzorchik@srv-serv:~$ sudo service tftpd-hpa restart
ekzorchik@srv-serv:~$ sudo netstat -tulpn | grep :69
udp 0 0 0.0.0.0:69 0.0.0.0:* 1592/in.tftpd
Также не забываем настроить правила брандмауэра для интерфейса смотрящего в локальную сеть, а именно eth1:
ekzorchik@srv-serv:~$ sudo iptables -A INPUT -s 10.9.9.0/24 -m tcp -p tcp —dport 69 -j ACCEPT
ekzorchik@srv-serv:~$ sudo iptables -A INPUT -s 10.9.9.0/24 -m tcp -p udp —dport 69 -j ACCEPT
Сохраняем дополненные настройки правил брандмауэра в файл:
ekzorchik@srv-serv:~$ sudo bash -c "iptables-save > /etc/ip"
Перезапускаем службу сети:
ekzorchik@srv-serv:~$ sudo /etc/init.d/networking restart
Т.к. файл сетевого загрузчика у меня будет лежать в каталоге /media/pxeboot, то нужно создать директорию Ubuntu (права nobody), чтобы в нее сложить установочные файлы инсталляции:
ekzorchik@srv-serv:~$ sudo -u nobody sh -c "mkdir -p /media/pxeboot/ubuntu/x86"
ekzorchik@srv-serv:~$ sudo -u nobody sh -c "mkdir -p /media/pxeboot/ubuntu/amd64"
Теперь потребуется скачать любым способом установочный диск, к примеру с архитектурой x86 системы Ubuntu 12.04.4 server:
ekzorchik@srv-serv:~$ wget -c http://mirror.yandex.ru/ubuntu-releases/12.04.4/ubuntu-12.04.4-server-i386.iso
после завершения скачивания, нужно смонтировать образ и извлечь нужные файлы, а именно 2 файла: linux и initrd.gz месторасположение которых в образе: /install/netboot/ubuntu-installer/i386 и перенести в директорию созданную выше: /media/pxeboot/ubuntu/x86
ekzorchik@srv-serv:~$ sudo mkdir /media/iso
ekzorchik@srv-serv:~$ sudo mount -o loop ~/*.iso /media/iso
mount: warning: /media/iso seems to be mounted read-only.
ekzorchik@srv-serv:~$ sudo -u nobody sh -c "cp /media/iso/install/netboot/ubuntu-installer/i386/initrd.gz /media/pxeboot/ubuntu/x86"
ekzorchik@srv-serv:~$ sudo -u nobody sh -c "cp /media/iso/install/netboot/ubuntu-installer/i386/linux /media/pxeboot/ubuntu/x86"
После чего установочный образ больше не нужен и его можно отмонтировать, а в последствии удалить:
ekzorchik@srv-serv:~$ sudo umount /media/iso
Аналогичные действия проводим и для архитектуры amd64, сейчас я не буду заострять на них внимание, но после я конечно же вернусь, нет уже лучше ничего не откладывать на потом, так что ж:
ekzorchik@srv-serv:~$ wget -c http://mirror.yandex.ru/ubuntu-releases/12.04.4/ubuntu-12.04.4-server-amd64.iso
ekzorchik@srv-serv:~$ sudo mount -o loop ~/ubuntu-12.04.4-server-amd64.iso /media/iso
mount: warning: /media/iso seems to be mounted read-only
ekzorchik@srv-serv:~$ sudo -u nobody sh -c "cp /media/iso/install/netboot/ubuntu-installer/amd64/initrd.gz /media/pxeboot/ubuntu/amd64"
ekzorchik@srv-serv:~$ sudo -u nobody sh -c "cp /media/iso/install/netboot/ubuntu-installer/amd64/linux /media/pxeboot/ubuntu/amd64"
ekzorchik@srv-serv:~$ sudo umount /media/iso
Сейчас активируем связку TFTP сервера загружающего PXE загрузчик, для этого снова смонтируем скачанный образ (это может быть установочный дистрибутив Ubuntu – разрядность значения не имеет, а вот версию лучше брать наипоследнюю)
ekzorchik@srv-serv:~$ sudo mount -o loop ~/*.iso /media/iso
mount: warning: /media/iso seems to be mounted read-only.
Находим файл pxelinux.0 (это и есть загрузчик) и копируем его в директорию нашего tftpd сервера:
ekzorchik@srv-serv:~$ sudo -u nobody sh -c "cp /media/iso/install/netboot/ubuntu-installer/i386/pxelinux.0 /media/pxeboot/"
Также, нам понадобится, само boot–меню, которое можно взять на том же диске, в директории boot-screens файл с именем vesamenu.c32 и копируем его в туже директорию что и загрузчик:
ekzorchik@srv-serv:~$ sudo -u nobody sh -c "cp /media/iso/install/netboot/ubuntu-installer/i386/boot-screens/vesamenu.c32 /media/pxeboot/"
ekzorchik@srv-serv:~$ ls /media/pxeboot/
pxelinux.0 ubuntu vesamenu.c32
Далее настраиваем содержимое PXE меню: – состоящее из 2х пунктов.
Первый: загрузка с локального диска. Этот пункт будет пунктом по умолчанию, если пользователь загрузил ПК по PXE и в течении 15 сек. не выполнил никаких действий, то система автоматически загрузится с локального диска
Второй:назовем его Testing Внутри данного меню будет находиться, пункт с возможностью загрузки Memtest x86+. Данная программа всегда будет полезна в диагностике проблем рабочих станций и серверов (я тестировал работоспособность сервера SUPERMICRO перед тем как ввести его в эксплуатацию), в общем, вещь нужная, в хозяйстве системного администратора пригодится…
Создадим директорию для конфигурационных файлов с именем pxelinux.cfg – имя критично для работы!!!
ekzorchik@srv-serv:~$ sudo -u nobody sh -c "mkdir /media/pxeboot/pxelinux.cfg"
Теперь создадим конфигурационный файл с параметрами пунктов меню, с именем default:
ekzorchik@srv-serv:~$ sudo -u nobody sh -c "nano /media/pxeboot/pxelinux.cfg/default"
default vesamenu.c32
prompt 0
menu title PXE Boot Menu
MENU AUTOBOOT Starting Local System in # seconds
label Boot from local drive
menu label ^Boot from local drive
menu default
localboot 0
timeout 150
TOTALTIMEOUT 9000
LABEL Testing
MENU LABEL ^Testing
KERNEL vesamenu.c32
APPEND pxelinux.cfg/testing.menu
Наиболее наблюдательные, заметили что в предыдущем файле у нас появилась запись которая касается другого файла testing.menu, в нем у нас будут находиться параметры настройки пункта Testing.
Создадим данный файл:
ekzorchik@srv-serv:~$ sudo -u nobody sh -c "nano /media/pxeboot/pxelinux.cfg/testing.menu"
MENU TITLE Testing
LABEL Test software
MENU LABEL ^Return to Main Menu
KERNEL vesamenu.c32
APPEND pxelinux.cfg/default
label Memory Test
menu label ^Memory Test: Memtest86+ v4.20
kernel memtest/mt86plus
Первый пункт меню, будет отвечать за возврат в предыдущее меню, а второй за загрузку Memtest86+ v4.20
Все ничего, но мы не создали директорию где хранится файл Memtest, это мы сейчас исправим, давайте создадим соответствующую директорию.
Сделаем это:
ekzorchik@srv-serv:~$ sudo -u nobody sh -c "mkdir /media/pxeboot/memtest"
Нам осталось добавить исполняемый файл самого Memtest86+, его можно найти на установочном диске, в директории /install/ нас интересует файл mt86plus нам его необходимо скопировать в директорию memtest, чтобы путь к нему выглядел:
ekzorchik@srv-serv:~$ sudo -u nobody sh -c "cp /media/iso/install/mt86plus /media/pxeboot/memtest/"
На этом мы закончили с tftp сервером, нам осталось немного допилить DHCP сервер.
Нужно настроить взаимодействие tftpd и dnsmasq, делается это так:
ekzorchik@srv-serv:~$ sudo nano /etc/dnsmasq.conf
dhcp-boot=pxelinux.0
enable-tftp
tftp-root=/media/pxeboot
ekzorchik@srv-serv:~$ sudo service dnsmasq restart
* Restarting DNS forwarder and DHCP server dnsmasq
dnsmasq: failed to create listening socket for port 69: Address already in use
…fail!
/usr/sbin/dnsmasq –test
dnsmasq: syntax check OK.
Нужно сперва перезагрузить сервис tftpd, а потом dnsmasq и ошибки не будет:
ekzorchik@srv-serv:~$ sudo service tftpd-hpa restart
tftpd-hpa stop/waiting
tftpd-hpa start/running
ekzorchik@srv-serv:~$ sudo service dnsmasq restart
* Restarting DNS forwarder and DHCP server dnsmasq
…done.
Разобрался с ошибкой, идем дальше.
Теперь мы можем подключить к нашей локальной сети устройство которое поддерживает загрузку PXE и в котором эта функция включена (смотрите документацию к своему оборудованию) или подключить виртуальную машину, а адаптером подключенным в режиме моста и без загрузочного носителя.
Если вы все сделали правильно, то меню будет иметь следующий вид:
а если перейти в меню Testing то у видим:
Если выбрать пункт с Memtest то запустится тест памяти.
Другие пункты меню добавляются соответствующим образом.
Представим ситуацию, что вам требуется предоставить доступ к одному из меню, ограниченному кругу лиц. С этой целью на пункт меню можно установить пароль, сделать это можно следующим образом.
ekzorchik@srv-serv:~$ sudo -u nobody sh -c "nano /media/pxeboot/pxelinux.cfg/testing.menu"
Нам необходимо добавить запись: (где password – это пароль, который нужно заменить на свой персональный)
MENU PASSWD password
Тогда файл принимает вид:
MENU TITLE Testing
LABEL Test software
MENU LABEL ^Return to Main Menu
KERNEL vesamenu.c32
APPEND pxelinux.cfg/default
label Memory Test
MENU PASSWD password
menu label ^Memory Test: Memtest86+ v4.20
kernel memtest/mt86plus
Сохраняем внесенные изменения.
ekzorchik@srv-serv:~$ sudo service tftpd-hpa restart
tftpd-hpa stop/waiting
tftpd-hpa start/running
ekzorchik@srv-serv:~$ sudo service dnsmasq restart
* Restarting DNS forwarder and DHCP server dnsmasq
…done.
Защита конечно, так себе, но от обычных пользователей может помочь.
Тогда при попытке запуска выйдет окно:
если ввести правильный пароль, то запустится Memtest.
Таким способом можно скрывать целые меню или блокировать доступ к отдельным его пунктам.
В случае внесения изменения в эти конфигурационные файлы, DHCP сервер перезапускать нет необходимости, достаточно перезагрузить клиентский ПК если он загрузился по PXE.
По поводу скорости работы tftp, скорость работы не высока, и если вы решите перекачивать большие объемы информации, старайтесь использовать для этого WEB или FTP сервер, готовьтесь затратить на это некоторое количество времени. Если есть необходимость загрузить какой-то дистрибутив, то лучше загрузить ОС небольшого размера, примером может служить Windows PE, ну или миниатюрный дистрибутив Linux. Вот собственно и все, с уважением автор блога ekzorchik.