piątek, 28 grudnia 2018

Serwer PXE, czyli bootowanie przez LAN (1)

Wiem wiem - po co to komu w dobie dysków SSD, pojemnych napędów optycznych? Cóż, w niektórych zastosowaniach, szczególnie w warunkach serwisowych przydałaby się opcja zbootowania maszyny po LANie (bo akurat nie ma napędu), albo zwyczajnie nie chce nam się szukać płyty z narzędziami. Więc - do dzieła !!!

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

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 10
  MENU 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:
pxe boot pfsense



Jak nic nie skopaliśmy po drodze, boot po karcie sieciowej powinien działać poprawnie :-)

example pxelinux boot



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....