PXEboot

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.