home-harmening:tools:pxe:pxe_server_installieren

Dies ist eine alte Version des Dokuments!


PXE Server auf Debian 12 installieren

Hier installiere ich eine PXE Umgebung auf einem Debian 12 System. Die PXE Umgebung ist ausschließlich für
UEFI Umgebungen gedacht. Der Testclient ist ein HP Prodesk 600.

Ein für mich geeignetes efi File ist ein selbkompiliertes File auf Basis von ipxe.org.

Auf dem Server werden folgende Pakete benötigt:

NameFunktion
isc-dhcp-serverDHCP Server für das eigene Netzwerk\\oder die Installationsumgebung.
apache2Webserver über den die benötigten Dateien für die\\Betriebssysteme geladen werden.
tftpd-hpaTFTP Server der das Bootimage bereitstellt.
syslinux-efiUEFI Bootimage.


apt install isc-dhcp-server apache2 tftpd-hpa


Zunächst klone ich das Git Repository von ipxe.org

git clone https://github.com/ipxe/ipxe.git

Installiere alle Abhängigkeiten zum kompilieren

apt install gcc binutils make perl lzma lzma-dev mtools mkisofs syslinux syslinux-efi

Jetzt wird in das ipxe Verzeichnis gewechselt und mit zwei make Befehlen wird die Umgebung installiert

make
make bin-x86_64-efi/ipxe.efi


Nun müssen wir eine Prekonfigurationsskript für das efi File erstellen.
In diesem Prekonfigurationskript legen wir Fest wo später unser Bootmenü gefunden wird.
embedded.ipxe

#!ipxe
dhcp
chain http://SERVER-IP/${net0/mac}.ipxe || \
chain http://SERVER-IP/default.ipxe || \
exit 1

Bei diese Prekonfigurationsskript wird zunächst eine IP Adresse per dhcp geholt.
Danach wird versucht ein Bootmenü speziell für die eigene MAC Adresse zu erhalten. Schlägt dies fehl
wird ein Standard Bootmemü geladen. Schlägt auch die fehlt wird ipxe beendet.

Jetzt wird das neue ipxe.efi file mit dem Prekonfigurationsskript erstellt

make bin-x86_64-efi/ipxe.efi EMBED=embedded.ipxe

Nach Abschluss kann die Datei bin-x86_64-efi/ipxe.efi nach /pxe-boot/ kopiert werden

cp bin-x86_64-efi/ipxe.efi /pxe-boot/


Embedded Skript mit statischer IP Adresse

Falls man (leider wie ich) in manchen Situationen kein DHCP Server am laufen hat. Kann man die ipxe.efi Datei auch mit statischer
IP Konfiguration erstellen. Diese Datei kann man auf einem FAT32 formatieren USB Stick speichern und von diesesm aus booten. Alternativ ist
es auch möglich über einen GRUB Eintrag die Datei zu starten.

#!ipxe
set net0/ip 10.0.0.50
set net0/netmask 255.255.255.0
set net0/gateway 10.0.0.1
 
ifclose net0
ifopen net0
 
chain http://10.0.0.100/${net0/mac}.ipxe || \
chain http://10.0.0.100/default.ipxe || \
exit 1

Der TFTP Server übergibt später das efi Bootimage dem Client.
Hierzu muss der Pfad festgelegt werden, der über den tftpd-server angeboten wird.
/etc/default/tftpd-hpa

TFTP_USERNAME="tftp"
TFTP_DIRECTORY="/pxe-boot" # Pfad des TFTP Ordners
TFTP_ADDRESS=":69"
TFTP_OPTIONS="--secure"


Jetzt die efi Datei in das TFTP Verzeichnis kopieren

cp /usr/lib/SYSLINUX.EFI/efi64/syslinux.efi /pxe-boot/

Bei mancher Hardware gibt es hier Probleme. Man kann auch Alternativen verwenden z.B. ipxe.efi von ipxe.org

Ordner erstellen und Rechte setzen

mkdir -p /pxe-boot
chown tftp: /pxe-boot


Server neustarten

systemctl restar tftpd-hpa


Dazu muss zunächst festgelegt werden, an welcher Netzwerkschnittstelle der DHCP Server
arbeiten soll. Dazu wird die Datei /etc/default/isc-dhcp-server bearbeitet.
/etc/default/isc-dhcp-server

...
INTERFACESv4="enp6s19" # <- Hier die Netzwerkschnittstelle eintragen
INTERFACESv6=""
...


Jetzt wird der eigentliche DHCP Server konfiguriert. /etc/dhcp/dhcpd.conf

subnet 10.0.0.0 netmask 255.255.255.0 {         # <- Netz ID
    range 10.0.0.50 10.0.0.99;                  # <- Bereich den der DHCP Server verwenden soll
    option domain-name-servers 8.8.8.8;         # <- DNS Server
    option domain-name "example.net";           # <- Domain Name       
    option routers 10.0.0.100;                  # <- Default Gateway
    option broadcast-address 10.0.0.255;        # <- Broadcast Adresse
    default-lease-time 600;                     # <- Standard Leasing Zeit für eine IP Adresse. Hier 10min.
    max-lease-time 7200;                        # <- Maximal Leasing Zeit. Hier 2h.
    next-server 10.0.0.100;                     # <- IP des Servers der die efi Datei bereitstellt
    filename "ipxe.efi";                    # <- Bei mancher Hardware gibt es hier Probleme. Man kann auch Alternativen verwenden z.B. ipxe.efi von https://ipxe.org
}


DHCP Server neu starten

systemctl restart isc-dhcp-server


Es sollte zumindest die Datei /var/www/html/index.html gegen eine neue ausgetauscht werden.
Falls eine Auflistung aller Dateien erwünscht ist. Wird die index.html gelöscht und das Directory Indexing für
den Ordner aktiviert.

An dem Beispiel clonezilla möchte ich demonstrieren welche Dateien für ein Betriebssystem
benötigt und wohin diese gespeichert werden.

Anlegen des Zielordners

mkdir -p /var/www/html/clonezilla/live


Download der zip Datei von clonezilla.org

wget https://downloads.sourceforge.net/project/clonezilla/clonezilla_live_alternative/20250620-plucky/clonezilla-live-20250620-plucky-amd64.zip?ts=gAAAAABoynhSmdxihZan28Q8wXjUWD657zEcORlu3bIIrKGXd03DSxWvZLm-TXk6AA7AmClI53b-9HHuempgOhQnIQQhWDJaRQ%3D%3D&r=https%3A%2F%2Fsourceforge.net%2Fprojects%2Fclonezilla%2Ffiles%2Fclonezilla_live_alternative%2F20250620-plucky%2Fclonezilla-live-20250620-plucky-amd64.zip%2Fdownload%3Fuse_mirror%3Ddeac-riga


Datei entpacken

unzip clonzilla*.zip

Kopieren der benötigten Dateien in das Zielverzeichnis

cp -v clonezilla/live/filesystem.squashfs clonezilla/live/initrd.img clonezilla/live/vmlinuz /var/www/html/clonezilla/live


Das Bootmenü ist die Datei welche von der ipxe.efi geholt und angezeigt wird. Innerhalb des Bootmenüs
konfigurieren wir unsere Betriebssysteme (hier Clonezilla).

Das Bootmenü kann speziell für einen bestimmten Client anhand der MAC Adresse erstellt werden z.B. 00:12:ac:43:55:fg.ipxe oder
falls dieses nicht vorhanden ist erstelle ich hier eine default.ipxe Datei.

/var/www/html/default.ipxe

#!ipxe
 
:custom_menu
menu Mein Standard Menue                        # <- Menü Titel
item --gap -- Custom Options:
 
item clonezilla_live Boot Clonezilla Live       # <- Menü Punkte. Das erste Wort ist das Label wonach gesucht wird. Der String danach ist der angezeigte Text.
#item ubuntu Boot Ubuntu Install                # <- Zweiter Menüpunkt. Hier auskommentiert.
item return Return to Main Menu                 # <- Dritter Menüpunkt
 
choose --default return --timeout 10000 target && goto ${target}
 
:clonezilla_live                                # Hier beginnt die Konfiguration für Clonezilla. Es werden Tastaturlayout und Sprache vordefiniert. Es muss noch die Server IP angepasst werden
echo Booting Clonezilla...
kernel http://SERVER-IP/clonezilla/live/vmlinuz boot=live fetch=http://SERVER-IP/clonezilla/live/filesystem.squashfs boot=live username=user union=overlay config components quiet noswap edd=on nomodeset nodmraid locales=de_DE.UTF-8 keyboard-layouts=de ocs_live_extra_param="" ocs_live_batch=no net.ifnames=0 nosplash noprompt
initrd http://SERVER-IP/clonezilla/live/initrd.img
boot
 
#:ubuntu                                         # Hier beginnt der zweite Eintrag für Ubuntu. Auskommentiert
#echo Booting Ubuntu Installer...
#kernel http://SERVER-IP/ubuntu/vmlinuz
#initrd http://SERVER-IP/ubuntu/initrd.gz
#boot
 
:return
exit