Weblog

PXE-Bootumgebung für automatisierte Installationen aufbauen

20.05.2025 4 Min. Lesezeit

Software-Deployments von Hand sind mühsam — darüber sind wir uns vermutlich alle einig. Früher™ war das Ganze sogar noch deutlich unangenehmer. Man denke nur an die Diskettenberge von Novell NetWare oder OS/2 zurück.

Auch heute installieren wir weiterhin Betriebssysteme auf Rechnern — im Grunde also immer noch dasselbe wie früher.

Ein großer Vorteil freier Betriebssysteme besteht jedoch darin, dass sie sich nahezu alle direkt über das Netzwerk booten lassen. Das Stichwort lautet PXE (Preboot Execution Environment). Dadurch entfällt zumindest das Erstellen physischer Installationsmedien.

Was ist PXE?

Mit einem PXE-fähigen Rechner kann anstelle lokaler Medien (Festplatte, DVD, USB-Stick usw.) direkt über das Netzwerk von einem entfernten System gebootet werden.

Dadurch lassen sich beispielsweise:

  • Betriebssysteme zentral installieren,
  • Thin-Client-Umgebungen aufbauen,
  • oder komplette Live-Systeme ohne lokale Datenträger bereitstellen.

Mit einem PXE-fähigen Rechner ist man in der Lage, anstelle von lokalen Medien über ein Netzwerk von einem entfernten Rechner zu booten.

Achtung:
Dieser Artikel ist schon alt. Sehr alt. Bitte beachte, daß sich seit damals viel geändert hat; das Grundkonzept ist aber noch identisch, sofern Du BIOS-Boot nutzt.

Voraussetzungen

Für eine einfache PXE-Umgebung werden benötigt:

  • DHCP
  • TFTP
  • optional NFS für Live-Systeme

In der Praxis ist es natürlich etwas mehr Aufwand.

Im Beispiel wird ein Debian-System als PXE-Server verwendet, das Konzept funktioniert aber ebenso mit anderen Linux-Distributionen oder BSD-Systemen.

Verzeichnisstruktur vorbereiten

Zunächst ein Arbeitsverzeichnis anlegen:

mkdir -p /opt/pxeboot/tftp

syslinux installieren

Für PXE-Boot wird eine aktuelle Version von syslinux benötigt. Diese herunterladen und in das neue Verzeichnis entpacken.

Zusätzlich wird später die Datei menu.c32 benötigt:

cp com32/modules/menu.c32 /opt/pxeboot/tftp/
Debian-Netboot-Dateien herunterladen

Sowohl die i386- als auch die AMD64-Variante des Debian-Installers herunterladen:

wget http://ftp.debian.org/debian/dists/etch/main/installer-i386/current/images/netboot/netboot.tar.gz
tar xzf netboot.tar.gz
rm netboot.tar.gz

wget http://ftp.debian.org/debian/dists/etch/main/installer-amd64/current/images/netboot/netboot.tar.gz
tar xzf netboot.tar.gz
rm netboot.tar.gz

Wichtig:
Beide Archive heißen netboot.tar.gz - nicht versehentlich überschreiben!

Einige Dateien dürfen problemlos ersetzt werden.

Nicht benötigte Dateien entfernen:

rm -rf pxelinux.0 pxelinux.cfg

Diese werden später neu erstellt.

DHCP konfigurieren

Der DHCP-Server muss PXE-Anfragen beantworten können.

Beispielkonfiguration für ISC DHCPd:

subnet 172.30.4.0 netmask 255.255.252.0 {
 range 172.30.6.1 172.30.6.254;
 range dynamic-bootp 172.30.5.240 172.30.5.255;
 option routers 172.30.7.254;

 filename "pxelinux.0";
 next-server 172.30.4.1;
}

Die wichtigen Optionen sind:

  • filename → zu ladende Boot-Datei
  • next-server → TFTP-Server
  • TFTP-Server installieren

Unter Debian:

apt-get install atftpd

Falls atftpd über inetd gestartet wird, folgende Zeile in /etc/inetd.conf ergänzen:

tftp dgram udp wait nobody /usr/sbin/tcpd /usr/sbin/in.tftpd --tftpd-timeout 300 --retry-timeout 5 --mcast-port 1758 --mcast-addr 239.239.239.0-255 --mcast-ttl 1 --maxthread 100 --verbose=5 /opt/pxeboot/tftp

Wichtig:
Die gesamte Konfiguration muss in einer einzigen Zeile stehen.

PXE-Bootmenü erstellen

Verzeichnis anlegen:

mkdir /opt/pxeboot/tftp/pxelinux.cfg

Datei /opt/pxeboot/tftp/pxelinux.cfg/default erstellen:

DEFAULT menu.c32
PROMPT 0
MENU TITLE Automagisches Netzwerk-Booten
TIMEOUT 300

LABEL d
 MENU DEFAULT
 MENU LABEL Boot from ^disk
 localboot 0x80

LABEL di-i386
 MENU LABEL Debian Installer ^i386 - submenu
 KERNEL menu.c32
 APPEND debian-installer/i386/pxelinux.cfg/default

LABEL di-amd64
 MENU LABEL Debian Installer ^amd64 - submenu
 KERNEL menu.c32
 APPEND debian-installer/amd64/pxelinux.cfg/default

LABEL n
 MENU LABEL Try ^next bootdevice
 localboot -1

Anschließend die Datei pxelinux.0 kopieren:

cp /opt/pxeboot/tftp/debian-installer/i386/pxelinux.0 /opt/pxeboot/tftp/

Danach DHCP- und TFTP-Dienste neu starten.

Nun sollten Rechner bereits den Debian-Installer per PXE booten können.

GRML als Live-System integrieren

Für Debugging und Rettungszwecke eignet sich grml hervorragend.

GRML vorbereiten

mkdir /opt/pxeboot/tftp/grml

wget ftp://ftp.uni-erlangen.de/pub/mirrors/grml/grml_1.1.iso

mount -o loop grml_1.0.iso /mnt/tmp/
cp -r /mnt/tmp/* /opt/pxeboot/tftp/grml

cp /mnt/tmp/boot/isolinux/minirt26.gz /opt/pxeboot/tftp/grml/boot/

umount /mnt/tmp

Zusätzliche Netboot-Dateien herunterladen:

wget http://grml.org/terminalserver/grml_netboot_package_1.1.tar.bz2

tar xvjpf grml_netboot_package_1.1.tar.bz2

cp grml_netboot_package_grml_1.1/tftpboot/linux26 /opt/pxeboot/tftp/grml/boot/
cp grml_netboot_package_grml_1.1/tftpboot/minirt26.gz /opt/pxeboot/tftp/grml/boot/
cp grml_netboot_package_grml_1.1/tftpboot/memtest /opt/pxeboot/tftp/grml/boot/

GRML ins PXE-Menü einbinden

Datei pxelinux.cfg/default ergänzen:

LABEL grml
 MENU LABEL ^GRML
 kernel grml/boot/linux26
 append ramdisk_size=24000 root=/dev/ram0 rw init=/etc/init \
 nfsdir=Server-IP-oder-Name:/opt/pxeboot/tftp/grml/ \
 nodhcp noprompt noeject apm=power-off nomce \
 initrd=grml/boot/minirt26.gz vga=normal

NFS-Freigabe konfigurieren

Datei /etc/exports ergänzen:

/opt/pxeboot/tftp/grml/ * (ro,no_root_squash,no_subtree_check)
/opt/pxeboot/tftp/ * (ro,no_root_squash,no_subtree_check)

Danach den NFS-Dienst neu starten.

Jetzt lässt sich GRML direkt über das Netzwerk booten.

FreeBSD per PXE booten

Für FreeBSD ist der Aufwand etwas größer, da zunächst ein PXE-Image erstellt werden muss.

Benötigt wird:

  • ein funktionierendes FreeBSD-System
  • ein bootonly.iso

PXE-Image erzeugen

mdconfig -a -t vnode -f 7.0-RELEASE-i386-bootonly.iso -u1
mount -t cd9660 /dev/md1 /mnt/cdrom

dd if=/dev/zero of=fbsd7R_i386.img bs=1k count=32k

mdconfig -a -t vnode -f fbsd7R_i386.img -u0

bsdlabel -w -B md0 auto
bsdlabel -A md0

newfs -b 8192 -f 1024 /dev/md0a

mount /dev/md0a /mnt/disk

cp -R /mnt/cdrom/boot /mnt/disk/

umount /mnt/disk
umount /mnt/cdrom

mdconfig -d -u0
mdconfig -d -u1

Das erzeugte Image anschließend:

  • auf den PXE-Server kopieren
  • gzip-komprimieren

FreeBSD ins Bootmenü aufnehmen

LABEL fbsd7-i386
 MENU LABEL FreeBSD 7-RELEASE i386
 kernel memdisk
 append initrd=freebsd/fbsd7R_i386.img.gz harddisk noedd

Zusätzlich wird noch memdisk aus dem Syslinux-Paket benötigt:

cp memdisk /opt/pxeboot/tftp/

Fazit

Damit ist die grundlegende PXE-Infrastruktur fertiggestellt:

  • Debian-Installer
  • GRML-Live-System
  • FreeBSD-Netzboot

lassen sich nun bequem direkt über das Netzwerk starten.

Wer das Boot-Menü optisch verbessern möchte, kann sich zusätzlich mit vesamenu.c32 aus syslinux beschäftigen.

Themen Technikzeug
Schlagworte DHCP PXE Netboot TFTP NFS BIOS
π