Preboot Execution Environment ist ein Protokoll für den (Bootvorgang) Startvorgang eines Betriebsystems über das Netzwerk. Der Client benötigt dafür nicht zwangsläufig eine Festplatte. In Unternehmen findet man häufig festplattenlose ThinClients, die über das Netzwerk ein minimales Linuxsystem booten. Der Anwender startet dann auf diesem Thinclient eine RDP-Client (Remote Desktop Client), um dann eine Verbindung zum Terminalserver herzustellen.
Zum besseren Verständnis folgende Erklärung:
1) Der Client nutzt die PXE Boot Funktion der Netzwerkkarte. Das lässt sich meist im BIOS/UEFI aktivieren. Er stellt im Netzwerk einen DHCP-Discover und erhält vom DHCP Server eine IP-Adresse, Netzmask, (meist) Gateway und DNS. Außerdem bekommt er zusätzlich noch einen "next-server" mitgeteilt. Das ist der PXE Boot Server.
2) Der Client nutzt die im "next-server" angegebene IP und spricht ihn an. Dieser Server stellt die Startdateien für den Bootvorgang mittels TFTP bereit, die der Client lädt und seinen Startvorgang einleitet.
Das ist im Groben und Ganzen alles.
Warum TFTP?
Der TFTP (Triviale File Transfer Protocol) ist eine abgespeckte Variante eines normalen FTP und funtioniert fast genau so mit einigen Veränderungen: Er lauscht auf Port UDP 69. Es findet keine Authentifizierung statt und der TFTP Server beherrscht nur die folgenden Kommandos: Connect, Quit, Get, Put, Mod, Verbose, Trace, Status, Binary, ASCII, RESMT TIMEOUT.
Testumgebung
Für die Einrichtung habe ich einen CentOS 7.5 Server eingerichtet in Minimalkonfiguration. Die Netzwerkschnittstelle eth0 ist für das Netzwerk korrekt konfiguriert. Die Firewall ist für diesen Test abgeschaltet und SELinux disabled. In einer Produktivumgebung sind diese natürlich entsprechend einzurichten.
Eine Besonderheit gibt es aber noch: Die Konfiguration sieht vor, dass der Start von CentOS7 über den lokalen Server stattfindet, aber alles, was für das Setup benötigt wird, wird von mirror.centos.org heruntergeladen. Das bedeutet, dass man das nur so machen sollte, wenn man eine Internetverbindung mit genug Bandbreite hat. 10 Mbit reichen aus, aber mehr ist nicht verkehrt. Hat man nur eine kleine 2 Mbit Leitung, dann wäre es sinnvoller einen lokalen Mirror anzulegen. Das zeige ich später wie das funktioniert.
PXE Boot einrichten
Syslinux installieren
Zunächst installieren wir Syslinux mit folgendem Befehl:
yum install syslinux
PXEboot vorbereiten
Danach muss pxelinux konfiguriert werden bzw. einige Dateien/Verzeichnisse erstellt/kopiert werden, um es nutzbar zu machen. Die folgenden Kommandos können per Copy/Paste ausgeführt werden:
mkdir -p /tftpboot/pxelinux.cfg
cp /usr/share/syslinux/chain.c32 /usr/share/syslinux/menu.c32 \
/usr/share/syslinux/vesamenu.c32 \ /usr/share/syslinux/pxelinux.0
/tftpboot/
Bootmenü erstellen
Nun erstellen wir die Datei "default", um uns ein Bootmenü bereitzustellen.
vi /tftpboot/pxelinux.cfg/default
Darin ist nun folgender Inhalt reinzukoperen:
default menu.c32
prompt 0
timeout 300
ONTIMEOUT local
menu title PXE Boot Options
menu background menu.png
label 1
menu label CentOS 7 x64 with http://mirror.centos.org Repo
kernel /centos7/x86_64/vmlinuz
append initrd=/centos7/x86_64/initrd.img method=http://mirror.centos.org/centos/7/os/x86_64/ devfs=nomount ip=dhcp
Kernel und Initrd holen
Zunächst in der Verzeichnis wechseln wo die vmlinuz und initrd hin soll. Das wäre in diesem Fall in /tftpboot/centos7/x86_64/ und dort dann die Dateien mittels wget abholen:
wget http://mirror.centos.org/centos/7/os/x86_64/images/pxeboot/vmlinuz
wget http://mirror.centos.org/centos/7/os/x86_64/images/pxeboot/initrd.img
DHCP einrichten
BIOS/Legacy
Nun müssen wir im DHCP noch zwei Optionen eintragen, sodass er diese an den Client übergeben kann. Wie man einen DHCP einrichtet, kann man hier sehen.
next-server 192.168.10.100;
filename "/pxelinux.0";
UEFI
Sollte UEFI zum booten verwendet werden, so ist natürlich entsprechender Bootloader zu verwenden.
next-server 192.168.2.222;
filename "debian-installer/amd64/bootnetx64.efi";
Mehr Info für UEFI PXE Boot
UEFI für Debian: https://www.debian.org/releases/stable/amd64/ch04s05.en.html
UEFI für alles Andere: https://github.com/tianocore/tianocore.github.io/wiki/Configuring-PXE-Boot-Servers-for-UEFI
TFTP und xinetd installieren
Nun brauchen wir den TFTP-Server. Wie immer mit dem Paketmanager yum/apt/dnf oder der, der für deine Distribution der richtige ist.
yum install tftp-server xinetd
Im nächsten Schritt passen wir die Datei /etc/xinetd.d/tftp an. Es sind nur die folgenden beiden Zeilen zu verändern:
server_args = -s /tftpboot
disable = no
Dann Xinetd neu starten mit: systemctl restart xinetd
Nun ist die Zeit wo man ausprobieren kann, ob das so funktioniert wie gewollt. Dazu einfach eine VM erstellen und sie per PXEBoot starten. Es kann aber auch ein Laptop oder ein anderes echtes Gerät sein. Hauptsache, es bootet per Netzwerk.
Wenn alles richtig gelaufen ist, dann gelangt man in der PXEboot-Menü und kann dort CentOS 7 x64 with http://mirror.centos.org Repo
auswählen.