Netboot per PXE

Erste Schritte mit Netboot per PXE (Preboot Execution Environment).

Nach dem plötzlichen Ableben meines bisherigen PCs, wollte ich die Chance nutzen und mir eine Erleichterung beim Aufsetzen neuer Rechner schaffen. PXE kam mir da sehr gelegen.

Das Preboot Execution Environment (PXE) beschreibt im Grunde eine Ausführungsschicht in Intel Computersystmen, mit dessen Hilfe man nach dem BIOS und vor dem Start des lokal installierten Betriebssystem ein anderes, alternatives OS über das Netzwerk laden und starten kann. Die meisten neuen Rechner können heutzutage per PXE booten.

Mein Ziel ist nun mit Hilfe von PXE auf das Brennen von DVDs mit aktueller Software, wie Ubuntu, zu verzichten und stattdessen direkt die ISO Datei vom NAS zu laden.

Hardware-Setup

  • Router mit DHCP (z.B. Fritz!Box)
  • Synology NAS mit PXE Service und DSM 6+
  • PXE-fähigen PC, bevorzugt amd64, x86_64.
  • Korrekte, funktionierende Verkabelung untereinander

Software-Setup

Wichtig: Alle Treiber der Komponenten sind up-to-date.

Mein DHCP-Service des Routers verteilt Adressen im IP4-Bereich zwischen 192.168.0.20 und 192.168.0.200. Es sind also ein paar Adressen nach unten und nach oben frei für Experimente. Neue Geräte können sich so am Router eine IP in dem Bereich abholen und im Netz kommunizieren.

Beim NAS müssen nun einige Handgriffe durchgeführt werden, damit der PXE-Service seinen Dienst antreten kann.

Angenommen das NAS heißt in meinem "Fritz!Box" Ökosystem plump "nas", dann sollte es im Netzwerk unter "nas.fritz.box" auffindbar sein.

$ ping nas.fritz.box
PING nas.fritz.box (192.168.0.70): 56 data bytes
64 bytes from 192.168.0.70: icmp_seq=0 ttl=64 time=0.190 ms
64 bytes from 192.168.0.70: icmp_seq=1 ttl=64 time=0.222 ms
^C
--- nas.fritz.box ping statistics ---
2 packets transmitted, 2 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 0.190/0.206/0.222/0.016 ms

Binaries und Konfiuraiton

Das NAS Webadmin-Interface erreicht man nun, indem man http://nas.fritz.box:5000 im Browser öffnet.

Nach der Anmeldung steht der Konfiguration nichts mehr im Weg.

Für den Betrieb eines PXE-Dienstes brauchen wir einen Ordner auf der Platte, der, neben dem Bootloader und den Konfigurationsdateien, auch die ISO-Dateien bereithält. Nennen wir ihn mal einfach "PXE".

PXE-Ordner anlegen

Schreibberechtigung für den Ordner erhält selbstverständlich der Admin, die Gäste nur Leseberechtigungen.

Nun geht es darum die Grundlagen eines PXE-Linux zu schaffen, damit überhaupt ein Booten stattfinden kann.

Sicherlich kann man die folgenden Schritte auch auf dem NAS direkt erledigen, ich wechsle hierzu aber lieber zurück in meine gewohnte Umgebung. Dort erledige ich alles in Bash.

Die nötigen Binaries befinden sich etwas verstreut in den Archiven von Kernel.org.

Ich empfehle einen Blick in die aktuellen Downloads, denn unter Umständen sind bereits neue Versionen verfügbar.

$ curl -o ~/syslinux-6.03.zip https://www.kernel.org/pub/linux/utils/boot/syslinux/syslinux-6.03.zip
$ unzip -d ~/syslinux-latest -x syslinux-6.03.zip

Folgende Dateien sind für das minimale Setup notwendig, also kopiert man sie in einen Ordner pxelinux-core.

$ mkdir ~/pxelinux-core

$ cd ~/syslinux-latest/bios

$ cp core/pxelinux.0 ~/pxelinux-core
$ cp memdisk/memdisk ~/pxelinux-core
$ cp com32/menu/menu.c32 ~/pxelinux-core
$ cp com32/mboot/mboot.c32 ~/pxelinux-core
$ cp com32/chain/chain.c32 ~/pxelinux-core

Nun kann man sich ein beliebiges ISO-Image herunterladen und im images Ordner ablegen. Ich hab mich für den Ubuntu 16.10 Netinstaller entschieden.

$ mkdir -P ~/pxelinux-core/images/ubuntu
$ co ~/pxelinux-core/images/ubuntu
$ curl -o ubuntu-16.10-x64-netboot.iso \
    http://archive.ubuntu.com/ubuntu/dists/yakkety/main/installer-amd64/current/images/netboot/mini.iso

Nun legt man einen Ordner für die Menü-Konfiguration an und füllt diesen mit einer einfachen Menükonfiguration:

$ mkdir ~/pxelinux-core/pxelinux.cfg

$ echo '
default menu.c32
prompt 0
timeout 300

ONTIMEOUT chainlocal

LABEL local
    MENU LABEL Boot local harddisk
    LOCALBOOT 0

LABEL chainlocal
    MENU LABEL Chain boot local harddisk
    KERNEL chain.c32
    APPEND hd0

LABEL ubuntu
    MENU LABEL Ubuntu 16.10 x64 Yakkety Yak (57 MB)
    KERNEL memdisk
    INITRD images/ubuntu/ubuntu-16.10-x64-netboot.iso
    APPEND iso raw
' > ~/pxelinux-core/pxelinux.cfg/default

Sind alle Dateien in ~/pxelinux-core/ verstaut, muss dessen Inhalt lediglich auf das NAS in den dafür vorgesehenen PXE Ordner übertragen werden.

Services

Damit nun das NAS die Images sinnvoll anbietet, muss man einen weiteren DHCP-Server, das Trivial File Transfer Protokoll (TFTP) und den PXE-Dienst auf dem NAS aktivieren. Deshalb findet die restliche Konfiguration wieder im Webadmin des NAS http://nas.fritz.box:5000 im Browser statt.

Das bisherige Setup hat nun folgenden Aufbau:

PXE-Ordner anlegen

Wie man sieht, habe ich bereits weitere Images ins Portfolio aufgenommen, u.a. auch einige gängige Reparaturtools.

Im ersten Schritt muss das TFTP aktiviert werden. Es dient dem einfachen Zugriff auf Dateien im Netzwerken. Das geht einfach unter Systemsteuerung > Dateidienste > TFTP. Hier braucht man lediglich einen Haken bei TFTP-Dienst aktivieren zu setzen und dann den PXE-Hauptordner auszuwählen, also den Ordner "PXE".

PXE-Ordner anlegen

Weiter gehts beim DHCP-Server. Die Einstellungen befinden sich unter Systemsteuerung > DHCP-Server > Netzwerkschnittstelle.

Der DHCP Server muss auf dem NAS so konfiguriert werden, dass er IP4-Adressen aus dem Adressraum oberhalb von 192.168.0.200 bezieht. In meinem Fall reichen maximal 10 Adressen aus, da ich nie mehr als 10 Geräte zugleich per Netboot starten will.

Ich habe dem Primären DNS auf den Router gelegt, da er sich weiterhin um die lokale Namensauflösung kümmern soll.

PXE-Ordner anlegen

Nachdem man gewarnt wird, nicht mehrere DHCP-Server in einem Netzwerk zu betreiben, kann die eigentliche PXE-Konfiguration beginnen. Dazu wechselt man in den Reiter PXE und setzt den Haken bei PXE-aktivieren (Pre-boot Execution Environment).

Zuletzt muss noch Lokaler TFTP-Server ausgewählt werden und der Bootloader pxelinux.0 ausgewählt werden.

PXE-Ordner anlegen

Fertig.

Der Server steht sofort bereit und kann genutzt werden.

BIOS-Einstellungen

Achtung! Im BIOS bitte unbedingt jegliche Änderung gründlich überdenken. Ein falsch konfiguriertes BIOS kann unter Umständen zu viel Frust und vielleicht sogar zu Datenverlust führen.

Damit der Netboot-fähige Rechner seine Netzwerkkarte nutzt, um ein fernes Image zu laden, braucht es evtl. etwas Hilfe. In meinem Fall war, aus Sicherheitsgründen, die Option per Netzwerkkarte zu booten deaktiviert. Das ist auch gut so. Aber für mein Ziel ist eine Ausnahme dieser Policy nötig.

Da es verschiedene BIOS Hersteller und Versionen gibt, ist es schwer ein einheitliches Vorgehen zu beschreiben. Im Grunde aber lassen sich die nötigen Einstellungen unter Security und unter Bootreihenfolge finden.

In meinem Fall erreiche ich das BIOS per ESC-Taste. Es gibt aber auch BIOS-Konfigurationen, die auf F2, F8, F10, F12 reagieren.

Tipp: Wenn man einen brandneuen PC besitzt, der so schnell lädt, dass man das BIOS nicht zu Gesicht bekommt, es mit einem Hersteller-Logo zugekleistert ist oder ein KVM mit HDMI nutzt, das den Monitor und die Tastatur erst spät aktiviert, sollte man unbedingt den Monitor per VGA und die Tastatur per USB direkt an den Rechner anschließen. Damit hat das System gleich beim Start die Möglichkeit zu zeigen welche Taste es zum Starten des BIOS vorgesehen hat und es reagiert auch sofort auf die Tastendrucke.

Lessons Learned

Mit PXE kann ich nun endlich auf die Images meiner Betriebssysteme zugreifen, ohne ständig DVDs oder USB-Sticks brennen zu müssen. Zudem kann ich nun ein Menü aufbauen, das sich in Systeme, Architekturen oder Werkzeugtypen gliedert. Vorstellbar sind Tools zur Datenrettung, Systempflege, Backup-Tools... u.s.w.

Rückschlag

Einen kleinen Rückschlag habe ich mit PXE aber auch erlebt, so konnte ich es bisher nicht anstellen, einen alten MacBook Air 1,1 von 2009 zum Laden des Netinstallers zu bewegen. Hier bleibt mir lediglich der Umweg hin zu Ubuntu über einen USB-Stick...

Weiterführende Dokumentation