Tworzymy serwer PXE na Arch Linux

Data: 2016-07-14, autor: Michał Misztal

Welcome, welcome...

Jako, że przyszła pora na aktualizację moich płyt serwisowych to postanowiłem do tematu podejść z nieco innej strony. W 2012 roku opracowalem swoją płytę serwisową z przeróżnymi distrami live + instalki Windows XP (no co? takie czasy). Było tam i GParted i Parted Magic, MHDD, Memtest, DSL, Puppy Linux, Victoria, PLPBT, G4L, NTPASSWD i wiele innych. Całość a'la isolinux uruchamiana z płyty przed systemem. Rok 2014 przyniósł aktualizacje, poprawki i więcej narzędzi.

Jako, że co 2 lata postanowiłem uaktualniać to monstrum które postawiłem do życia to nie mogło być inaczej i w tym roku. W tym roku postanowiłem zrobić to za pośrednictwem PXE (dokładniejsze omówienie tutaj). Szalę przeważyło to, że mamy w serwisie ASUS EeeBox PC i nie bardzo wiemy co z nim zrobić a sam raz nadaje się na serwer. Poza tym obecnie praktycznie każdy (nawet dość stary sprzęt) oferuje obsługę PXE.

Ogólnie to całość nie jest jakoś skomplikowana. Do dzieła. Zakładam, że Arch jest zainstalowany. Powiedzmy, że wykorzystamy DHCP i nasz serwer nie będzie posiadał stałego IP. Na początek lokalizujemy kartę sieciową i włączamy na niej DHCP

[root@komputer]# ip link
1: lo:
2: enp2s0:
[root@komputer]# systemctl start dhcpcd@enp2s0.service && systemctl enable dhcpcd@enp2s0.service

Teraz instalujemy serwer TFTP (Trivial File Transfer Protocol) i Dnsmasq. Do tego jeszcze przyda się MidnightCommander i unzip. Swój serwer tworzę bez środowiska graficznego bo tylko i wyłącznie do tego będzie. Szkoda zasobów.

[root@komputer]# pacman -S tftp-hpa dnsmasq unzip mc_

OK. Teraz przydałaby się jakaś przestrzeń na katalog root. Niech nim będzie domyślny katalog TFTP czyli /srv/tftp. Obrazy płyt będą znajdować się w katalogu /home/user/images o standardowych uprawnieniach i będą montowane jako /srv/tftp/images. Czyli z palca mamy

[root@komputer]# mount --bind /home/user/images /srv/tftp/images_

Dodajemy wpis do /etc/fstab

[root@komputer]# echo /home/user/images /srv/tftp/images none bind 0 0 >> /etc/fstab

Na wszelki wypadek zmieniamy prawa dla podkatalogów i katalogu root

[root@komputer]# chmod 755 -R /srv/tftp_

Oczywiście nic nie stoi na przeszkodzie by całość była w /srv/tftp ale to brzydkie, no i niezbyt bezpieczne. Wszelkie pomniejsze rzeczy powinniśmy zawsze wykonywać z konta zwykłego użytkownika.

Teraz pora na konfigurację całości. /etc/conf.d/tftp można sobie darować, cała konfiguracja będzie w pliku /etc/dnsmasq.conf.

Wypadałoby również zachować jakąś hierarchię katalogów. U mnie to np

root (/srv/tftp) -|
                  |- /images-|
                             |- /Memtest
                             |- /GParted
                             |- /robocze
                             |- ...
                             |- itd

Podkatalogi w /images to katalog główny każdego ładowanego distra. Folder robocze przeznaczyłem na robocze przygotowanie obrazów czyli "śmietki".

Pora na konfigurację /etc/dnsmasq. W zasadzie to wystarczy tylko

port=0                                                      #gdy serwer PXE nie musi pełnić roli serwera DHCP
interface=enp2s0                                            #nasza sieciówka
bind-dynamic                                                #parujemy unterfejsy
dhcp-range=192.168.10.210,192.168.10.219,255.255.255.0,12h  #początkowy, końcowy adres dla końcówki, maska i max czas połączenia
dhcp-boot=/srv/tftp/pxelinux.0                              #program ładowany przez sieć
enable-tftp                                                 #każemy uruchomić tftp wówczas nie trzeba tego roić przez systemd
tftp-root=/srv/tftp                                         #no i jeszcze wskazujemy gdzie jest root

OK. Teraz wystarczy uruchomić demona Dnsmasq

[root@komputer]# systemctl start dnsmasq && systemctl enable dnsmasq_

I tutaj można się zatrzymać. Zamiast pxelinux.0 możemy załadować co nam się podoba. To niech każdy obczai po swojemu. Ja jeszcze napiszę jak zrobić menu pxelinuksa. Krótki manual tutaj. Widzimy, że możemy stworzyć unikalne menu rozruchowe dla każdej maszyny przez UUID, adres MAC interfejsu sieciowego czy poprzez zabawę z adresem sieciowym (konieczna translacja DEC=>HEX). No i jest jeszcze plik default który stoi najniżej w hierarchii i jest ładowany na końcu gdy inne nie spełniają warunków i to właśnie on będzie tutaj nam potrzebny.

Pora na szybko przekopiować sobie kilka plików syslinuxa (syslinux musi być naszym loaderem), powiedzmy

[root@komputer]# cp /usr/lib/syslinux/chain.c32 /srv/tftp
[root@komputer]# cp /usr/lib/syslinux/ldlinux.c32 /srv/tftp
[root@komputer]# cp /usr/lib/syslinux/libcom32.c32 /srv/tftp
[root@komputer]# cp /usr/lib/syslinux/libgpl.c32 /srv/tftp
[root@komputer]# cp /usr/lib/syslinux/libmenu.c32 /srv/tftp
[root@komputer]# cp /usr/lib/syslinux/libutil.c32 /srv/tftp
[root@komputer]# cp /usr/lib/syslinux/memdisk /srv/tftp
[root@komputer]# cp /usr/lib/syslinux/menu.c32 /srv/tftp
[root@komputer]# cp /usr/lib/syslinux/pxelinux.0 /srv/tftp

Skopiujmy sobie również szkielet konfiguracji z naszego własnego systemu który prościej później przerobić niż tworzyć nowy od zera

[root@komputer]# mkdir /srv/tftp/pxelinux.cfg
[root@komputer]# cp /boot/syslinux/syslinux.cfg /srv/tftp/pxelinux.cfg/default

Struktura katalogów wygląda tak

/srv/tftp-|- chain.c32
          |- ldlinux.c32
          |- libcom32.c32
          |- libgpl.c32
          |- libmenu.c32
          |- libutil.c32
          |- memdisk
          |- menu.c32
          |- pxelinux.0
          |- /images       -|- /Memtest
                            |- /GParted
                            |- /robocze
          |- /pxelinux.cfg -|- default

I to tyle. Po zbootowaniu końcówki przez LAN powinno ukazać się menu syslinuksa. Jeszcze ważna uwaga - jeśli korzystamy z rezerwacji adresów w routerze to trzeba je wyłączyć dla serwera PXE. Powód jest trywialny - nasz serwer potrzebuje dwóch różnych adresów a router może przydzielić mu tylko jeden - wówczas nie wystartuje serwer TFTP.

Po uruchomieniu

Ryc 1. Bootujemy
Ryc 2. I jest - pxelinux.0 i konfig w pxelinux.cfg/default

PS. Wpis i cała zabawa z PXE zainspirowana jest programem SERVA który to program zdążyłem hobbystycznie potestować.

PPS. Jeśli chcecie przetestować działanie PXE na VirtualBox to musicie zmienić intefejs na bridged jak na obrazku niżej

Co do VirtualBoxa - należy brać przez palce to w jaki sposób uruchamia maszyny. Np od kilku wydań jest problem z Parted Magic - także nie jest wyznacznikiem. Najlepiej wszystko sprawdzić na prawdziwej maszynie.

Skomentuj lub zgłoś błąd

© Michał Misztal 2023