niedziela, 30 grudnia 2018

Serwer PXE (2)

Kontynuując nasze zmagania rozpoczęte w pierwszej części tego artykułu, pora zmusić nasz serwer PXE, by możliwe było uruchomienie jakiegoś systemu operacyjnego.


Generalnie, sprawa jest prosta - najpierw umieszczamy pliki obrazu systemu na serwerze TFTP, potem informujemy plik konfiguracyjny menu PXE, gdzie należy szukać bootloadera. Sęk w tym, że takie rozwiązanie, choć najprostsze, będzie działać koszmarnie wolno. Jak wolno? Na przykład odpalenie Debiana w wersji netinstall będzie trwało 20-30 minut. No to teraz spróbujcie odpalić Ubuntu :-)

Istnieje na to na szczęście lekarstwo. Wina leży po stronie ślamazarnego TFTP, więc wystarczy go zastąpić czymś szybszym. NFS, FTP, HTTP... Zależy, co kto lubi.

Ja wybrałem opcję HTTP. Lubię kopać się z koniem - to raz, dwa -  docelowo moja maszyna z PXE ma również pełnić rolę lokalnego serwera LAMP (Linux, Apache, MySQL, PHP), więc takie rozwiązanie jest dla mnie najbardziej sensowne i oczywiste.

 

Krok 5 - instalacja serwera WWW.


Czysta instalacja serwera WWW sprowadza się do wydania jednego polecenia:

apt-get install apache2

... i to wszystko, czego na tym etapie potrzebujemy. Zwykle jednak serwer WWW funkcjonuje w zestawie z serwerem MySQL i obsługą PHP. Ten sposób instalacji opisałem tutaj:



Krok 6 - udostępnienie obrazów ISO.


Na początek uwaga techniczna. Nasza stacja kliencka, aby poprawnie uruchomić system przez sieć, musi pobrać jego obraz. Podobno można udostępnić na serwerze HTTP pełny obraz ISO, który po pobraniu w całości na klienta będzie mógł być przez niego uruchomiony. I o ile przy jednym kliencie i małym ISO nie będzie to stanowiło problemu, to już chcąc puścić jednocześnie np. Fedorę na 15 stanowiskach napotkamy wąskie gardło w postaci wydajności sieci.

Rozsądniejszą opcją jest zatem zamontowanie zawartości obrazu płyty w folderze serwera WWW, tak, aby klient mógł pobrać te pliki, których w danej chwili potrzebuje.



 1. Najpierw zakładam w folderze głównym serwera www katalogi iso oraz pxeimages.

mkdir /var/www/html/iso
mkdir /var/www/html/pxeimages


2. Pobieram jakiś obraz płyty - w moim przypadku Clonezilla i umieszczam go w utworzonym katalogu iso.
Polecam zapisywanie nazw obrazów w sposób ogólny, aby przy aktualizacji pliku iso nie trzeba było zmieniać jego nazwy w pliku konfiguracyjnym PXE.


3. Odpalamy w przeglądarce stronę http://localhost/iso  i sprawdzamy, czy nasz plik jest widoczny, i czy jest możliwe jego pobranie.

iso apache2 example

 

Krok 7 - montowanie zawartości obrazu ISO


Zakładamy katalog o nazwie montowanego obrazu, w moim przypadku clonezilla:

mkdir /var/www/html/pxeimages/clonezilla


Montujemy zawartość obrazu do stworzonego folderu. Aby wykonywało się to automatycznie podczas startu systemu, edytujemy plik /etc/fstab, gdzie dodajemy linijkę:

/var/www/html/iso/clonezilla.iso /var/www/html/pxeimages/clonezilla iso9660 ro,auto    0       0


Poleceniem mount -a montujemy zasoby.

 

Podobnie jak poprzednio sprawdzamy, czy pliki montowanego obrazu są widoczne po stronie serwera HTTP:


 

Krok 8 - konfiguracja serwera PXE



Informujemy serwer PXE, gdzie leżą pliki obrazu uruchomieniowego. W tym celu dodajemy do menu wpis:

label Clonezilla
MENU LABEL Clonezilla
KERNEL http://ip_serwera/pxeimages/clonezilla/live/vmlinuz
INITRD http://ip_serwera/pxeimages/clonezilla/live/initrd.img
APPEND boot=live username=user union=overlay config components quiet noswap edd=on nomodeset nodmraid locales= keyboard-layouts= ocs_live_run="ocs-live-general" ocs_live_extra_param="" ocs_live_batch=no net.ifnames=0 nosplash noprompt fetch=http://ip_serwera/pxeimages/clonezilla/live/filesystem.squashfs

Dla każdej dystrybucji wpis wygląda nieco inaczej. Polecam sprawdzić dokumentację uruchamianego systemu. Generalnie, chodzi o lokalizację trzech plików: jądra systemu (vmlinuz,  memdisk, kernel.img itp.), initrd.img oraz filesystem.squashfs (niezbędny przy współpracy z FTP i HTTP, przy NFS można go pominąć). Plus oczywiście opcje uruchomieniowe, specyficzne dla danej dystrybucji.



Jeżeli wszystko poszło zgodnie z planem, powinniśmy zobaczyć na kliencie coś takiego:

pxe filesystem.squashfs

... co oznacza mniej więcej tyle, że bootowanie się udało. A jak wszystkie opcje dla Clonezilli są poprawne, to po kilkunastu sekundach zobaczymy na ekranie coś takiego, czyli ekran konfiguracji uruchomieniowej środowiska Clonezilla :-)





Podsumowanie.

Boot po PXE działa, a co najważniejsze działa z sensowną prędkością. Zamiast HTTP można użyć NFS, oraz FTP. Idea konfiguracji jest ta sama, jedyne różnice wynikają ze sposobu udostępnienia. Swoją drogą ciekawe, czy ktoś kiedyś testował co jest szybsze :-)

Dla pxelinux i syslinux na których opiera się powyższe rozwiązanie istnieją alternatywy w postaci np. iPXE, netboot. Można też użyć obrazu bootującego z jakiejś płyty netinstall, użyć skryptów uruchomieniowych w zależności od wykrytego sprzętu...
Ciekawostką jest fakt, że usługa serwerowa Microsoftu - WDS, również opiera się na bootowaniu PXE i serwerze TFTP.


Dla dociekliwych:
podobno da się bootować bezpośrednio z obrazu ISO. Mnie się nie udało tego dokonać, ale chętnie usłyszę, że komuś to zadziałało.