Jako punkt wyjścia, po przekopaniu się przez materiały w Internecie, przyjąłem serwer oparty o Debiana.
A więc - do dzieła :-)
Krok 1 - Instalacja Debiana
Instalacja Debiana w wersji 9 z nośnika netinst nie powinna przysporzyć kłopotów. Osobiście, ponieważ nie lubię konsoli, doinstalowałem środowisko LXDE. Może się także przydać SSH.
Nie musi to być jakaś mocna maszyna. U mnie stoi np. leciwy HP z Intel Core 2 Duo i 2GB RAM.
Krok 2 - Serwer TFTP
Bootowanie przy pomocy PXE wymaga do transferu plików protokołu TFTP - który nie dość, że nie ma żadnych zabezpieczeń, to jeszcze jest koszmarnie wolny. Niemniej jednak, musimy zacząć od instalacji serwera TFTP, najlepiej z pakietu tftpd:
apt-get install tftpd-hpa
Domyślnie, podczas instalacji zostanie utworzony plik /etc/default/tftpd-hpa, którego zawartość jest następująca:
TFTP_USERNAME="tftp"
TFTP_DIRECTORY="/srv/tftp"
TFTP_ADDRESS="0.0.0.0:69"
TFTP_OPTIONS="--secure"
Status usługi sprawdzamy poleceniem:
systemctl status tftpd-hpa
Aby zrestartować usługę, należy wydać polecenie:
systemctl restart tftpd-hpa
... i tu ciekawostka. Nie wiedzieć czemu, czasami nasz daemon tftp nie wstaje poprawnie po starcie systemu. Podejrzewam jakiś problem z identyfikacją ustawień sieciowych, bo to samo działo się u mnie na usłudze udhcpd, którą stawiałem na wirtualnej maszynie. Może interfejs się nie zdążył podnieść przed startem usług? Najprościej zrobić sobie skrypt, który uruchamiany wraz ze startem systemu na wszelki wypadek zrestartuje usługę.
Krok 3 - pliki uruchomieniowe
Aby komputery klienckie były w stanie się poprawnie uruchomić po sieci, nasz serwer musi być wyposażony w środowisko uruchomieniowe PXE. W zasadzie sprowadza się to do skopiowania odpowiednich plików do głównego katalogu serwera TFTP. Źródłem plików może być w zasadzie każda dystrybucja linuxa obsługująca instalację sieciową. Ja przyjąłem, że chcę mieć możliwość uruchomienia kilku systemów operacyjnych, więc zrobiłem to przy pomocy syslinux.
Najpierw instalujemy dodatkowe paczki, poleceniem:
apt-get install syslinux pxelinux
Potrzebne pliki znajdziemy w katalogach /usr/lib/syslinux/ i /usr/lib/pxelinux/ :
chain.c32
ldlinux.c32
libcom32.c32
libutil.c32
memdisk
menu.c32
gpexelinux.0
pxelinux.0
lpxelinux.0
vesamenu.c32
Jak widać, pliki obrazu bootowania PXE są trzy: pxelinux.0, gpexlinux.0, lpelinux.0. Na czym polega różnica?
Pxelinux.0 jest najprostszy i najlżejszy, gpxelinux.0 jest rozbudowany o możliwości graficzne, ale może nie zadziałąć na starszym sprzęcie (rozmiar pamięci na karcie sieciowej). Natomiast lpxelinux.0 zawiera biblioteki lightweight IP, niezbędne do współpracy z HTTP i FTP.
Następnym krokiem jest utworzenie domyślnej konfiguracji. W tym celu zakładamy w głównym folderze katalog pxelinux.cfg, a w nim umieszczamy plik default o zawartości podobnej do tej:
MENU TITLE Serwer PXE
DEFAULT vesamenu.c32
MENU ROWS 10MENU TABMSGROW 15
MENU CMDLINEROW 17
MENU TIMEOUTROW 20
LABEL hdd
MENU LABEL Boot from First HDD (default)
KERNEL chain.c32
APPEND sd0
TIMEOUT 30
Krok 4 - konfiguracja serwera DHCP
Aby komputer uruchomił się przez sieć, karta sieciowa musi wiedzieć, że jest taka możliwość. W tym celu musimy przekonfigurować serwer DHCP.
Konfiguracja jest zależna od routera, generalnie sprowadza się do trzech rzeczy:
- włączenia obsługi TFTP,
- podania adresu IP dla serwera TFTP
- podanie nazwy pliku obrazu, w naszym przypadku pxelinux.0
W przypadku pfsense którego używam wygląda to następująco:
Jak nic nie skopaliśmy po drodze, boot po karcie sieciowej powinien działać poprawnie :-)
W dalszym toku postępowania musimy zmusić nasze PXE aby można było wybrać obraz do uruchomienia, i co ważne - nieco go przyspieszyć, żeby ładowanie np. Clonezilli nie trwało pół godziny....