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.
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.