Wenn man sich schon einmal im BIOS / UEFI umgesehen hat, findet man dort unter den Boot-Optionen neben dem Start von Festplatte, USB oder optischem Medium auch oft den Eintrag PXE-Boot. PXE ist die Abkürzung für „Preboot eXecution Environment“ – schnell und einfach gesagt, bedeutet dies, man startet den Rechner über das Netzwerk – man holt die Daten, die man zum Starten des Rechners benötigt von einem anderen Rechner. Man holt sich das Betriebssystem von einem anderen Rechner.
Genutzt wird PXE-Boot meist, um auf einem Rechner ein neues Betriebssystem aufzusetzen – vor allem dann, wenn man viele solcher Rechner / Laptops aufsetzt – etwa in einer Firma.
Standardmäßig, mit bereits installierten Betriebssystem würde dies also so aussehen – der Rechner startet vom auf der Festplatte installiertem Betriebssystem:

Um ein Betriebssystem zu installieren, startet man hingegen über ein externes Medium – etwa von einer CD/DVD, von einem USB-Stick oder von einer externen Festplatte:

Jetzt gehen wir über zum Start über PXE – der Rechner startet so gesehen über die Netzwerkkarte und holt sich das zu startende Betriebssystem von einem anderen Rechner:

Man kann jedoch nicht ganz einfach auf einem Rechner ein Image hinterlegen und dann per PXE-Boot auf dieses Image zugreifen – man muss den Rechner, auf dem das Image liegt, natürlich vorbereiten, damit ein anderer Rechner auf das Image zugreifen kann.
PXE-Server vorbereiten
In diesem Beispiel nehmen wir Debian als Betriebssystem für einen PXE-Server, dies kann natürlich auch ein Raspberry Pi mit Raspbian OS sein. Auf dem PXE-Server, also Debian – installieren wir über die Paket-Verwaltung das Paket „dnsmasq„. Als Nächstes muss Dnsmasq konfiguriert werden – dazu öffnen wir als root auf dem Terminal die nötige Konfigurationsdatei:
vim /etc/dnsmasq.conf
Oder eben:
nano /etc/dnsmasq.conf
Diese Datei gilt es jetzt an die eigenen Bedürfnisse anzupassen – in der Regel sieht die Konfigurationsdatei anschließend so aus:
enable-tftp
tftp-root=/var/lib/tftpboot
dhcp-boot=/pxelinux.0,0.0.0.0
domain-needed
bogus-priv
listen-address=192.168.56.1
expand-hosts
dhcp-range=192.168.56.10,192.168.56.15,12h
Je nach Debian-Version sind die Zeilen schon vorhanden – ist dies so, entfernen Sie nur die Raute „#“ vor der Zeile und passen die Zeilen an, alternativ fügen Sie diese einfach am Ende der Datei als neue Zeilen hinzu.
Der PXE-Server sollte natürlich eine statische IP-Adresse haben – diese ermitteln Sie am Server mit dem Befehl:
ip a
Die IP-Adresse geben Sie jetzt in der Zeile [c]listen-address=[/c] an. In der Zeile [c]dhcp-range=[/c] können Sie jetzt noch den IP-Bereich anpassen, welche IP-Adressen auf den Server zugreifen dürfen – in der Regel sollte die komplette Zeile, wie beschrieben schon passen (privater Adressbereich). Die Eingabe „12h“ können Sie so belassen, wie es ist.
Jetzt gehen Sie schon an das Eingemachte. Sie erstellen das nötige Verzeichnis:
mkdir /var/lib/tftpboot
Anschließend wechseln Sie in das Verzeichnis:
cd /var/lib/tftpboot/
Jetzt wird das eigentliche Image heruntergeladen – konkreter, wir laden nicht das Image herunter, sondern nur den Installer für die Netinstall. Für Debian Bookworm:
wget https://ftp.debian.org/debian/dists/bookworm/main/installer-amd64/current/images/netboot/netboot.tar.gz
Handelt es sich um eine aktuellere Version – müssen Sie nur „bookworm“ durch das passende Release austauschen, für 32 Bit passen Sie „installer-amd64“ an – öffnen Sie einfach die Adresse im Webbrowser und folgen den Links. Jetzt wird das komprimierte Archiv entpackt:
tar xzvf netboot.tar.gz
Und anschließend werden die Rechte an allen Dateien angepasst:
chown nobody:nogroup -R .
Wichtig – nicht den Punkt am Ende vergessen. Jetzt muss die Netzwerkkarte wissen, wohin Sie Anfragen weiterleiten muss – hierzu nehme ich die Iptables, Minimalkonfiguration am Terminal:
echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -A FORWARD -o eth0 -i eth1 -s 192.168.56.0/24 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
iptables -A POSTROUTING -t nat -j MASQUERADE
Für die Iptables wird es demnächst einen passenden Artikel auf der Linux Bibel geben, natürlich auch für die Nftables. Jetzt wird Dnsmasq neu gestartet:
service dnsmasq restart
Wir bleiben natürlich im Verzeichnis mit dem heruntergeladenen Installer und installieren uns über die Paket-Verwaltung folgende Pakete „pxelinux syslinux„. Anschließend passen wir unseren Installer an, wir modifizieren diesen:
mkdir /tmp/initrd
cd /tmp/initrd/
cat /var/lib/tftpboot/debian-installer/amd64/initrd.gz | gzip -d | cpio -i
cp /root/preseed.cfg .
find | cpio -o --format=newc | gzip -9c > ../initrd.gz
cp ../initrd.gz /var/lib/tftpboot/debian-installer/amd64/
Wie oben schon beschrieben – die Befehle gelten für 64 Bit – passen Sie bei 32 Bit „amd64“ wie in der Verzeichnis-Hierarchie vorgegeben an. Jetzt passen wir die Syslinux-Konfiguration an:
vim /var/lib/tftpboot/debian-installer/amd64/boot-screens/syslinux.cfg
Oder eben:
nano /var/lib/tftpboot/debian-installer/amd64/boot-screens/syslinux.cfg
Diese könnte für Debian Bookworm so aussehen:
# D-I config version 2.0
include debian-installer/amd64/boot-screens/menu.cfg
default debian-installer/amd64/boot-screens/vesamenu.c32
prompt 0
timeout 0
DEFAULT bookworm
LABEL bookworm
kernel debian-installer/amd64/linux
append vga=normal initrd=debian-installer/amd64/initrd.gz auto=true interface=auto netcfg/dhcp_timeout=60 netcfg/choose_interface=auto priority=critical preseed/file=/preseed.cfg IPAPPEND 2
In der Regel müssen Sie nur „bookworm“ durch das gewünschte Release austauschen. Und jetzt das Wichtigste – die Konfiguration des zu installierenden Debian. Wir erstellen diese Konfiguration im aktuellen Verzeichnis:
vim preseed.cfg
Oder eben:
nano preseed.cfg
Eine Beispiel-Konfiguration:
# Locale / Keymap
d-i debian-installer/locale string de_DE.UTF-8
d-i debian-installer/keymap select de-latin1
d-i console-keymaps-at/keymap select de
d-i languagechooser/language-name-fb select German
d-i countrychooser/country-name select Germany
d-i console-setup/layoutcode string de_DE
# Netzwerk-Konfiguration
d-i netcfg/dhcp_timeout string 30
d-i netcfg/choose_interface select eth0
d-i netcfg/hostname string gewünschter_hostname
# Installationsquelle
d-i mirror/country string manual
d-i mirror/http/hostname string ftp.de.debian.org
d-i mirror/http/directory string /debian
d-i mirror/codename string bookworm
d-i mirror/suite string bookworm
d-i mirror/udeb/suite string bookworm
d-i mirror/http/proxy string
d-i mirror/noarch error
# Installer / Apt-Setup
d-i debian-installer/allow_unauthenticated string true
d-i finish-install/reboot_in_progress note
d-i prebaseconfig/reboot_in_progress note
d-i apt-setup/non-free boolean true
d-i apt-setup/contrib boolean true
# Uhr und Zeitzone
d-i clock-setup/utc boolean true
d-i clock-setup/ntp boolean true
d-i clock-setup/ntp-server string 0.pool.ntp.org
d-i time/zone string Europe/Berlin
# Partitionierung / Grub
d-i partman-auto/disk string /dev/sda
d-i partman-auto/method string regular
d-i partman-lvm/device_remove_lvm boolean true
d-i partman-auto/purge_lvm_from_device boolean true
d-i partman-lvm/confirm boolean true
d-i partman/alignment select cylinder
d-i partman/confirm boolean true
d-i partman-basicfilesystems/no_swap boolean false
d-i partman-partitioning/confirm_write_new_label boolean true
d-i partman/choose_partition select finish
d-i partman/confirm_nooverwrite boolean true
d-i grub-installer/only_debian boolean true
# Boot/Root-Partition, Zahlen in MB
d-i partman-auto/expert_recipe string \
condpart :: \
500 500 500 ext4 \
$primary{ } $bootable{ } \
method{ format } format{ } \
use_filesystem{ } filesystem{ ext4 } \
mountpoint{ /boot } \
. \
10240 10240 10240 ext4 \
$primary{ } \
method{ format } format{ } \
use_filesystem{ } filesystem{ ext4 } \
mountpoint{ / } \
. \
# Root User anlegen
d-i passwd/root-login boolean true
d-i passwd/root-password-crypted password passwort
# User anlegen
d-i passwd/user-fullname string Benutzer Name
d-i passwd/username string benutzer
# User-Passwort (hier im Klartext)
d-i passwd/user-password password sicheres_passwort
d-i passwd/user-password-again password sicheres_passwort
# Software Selections
tasksel tasksel/first multiselect ssh-server standard
d-i pkgsel/include string ssh vim ethtool sysstat ntp ntpdate
# Mail-Konfiguration
exim4-config exim4/no_config boolean true
exim4-config exim4/exim3_upgrade boolean true
# SSH-Server
ssh ssh/new_config boolean true
ssh ssh/use_old_init_script boolean true
ssh ssh/protocol2_only boolean true
ssh ssh/run_sshd boolean true
ssh ssh/SUID_client boolean true
ssh ssh/disable_cr_auth boolean false
# Pop-Contest
popularity-contest popularity-contest/participate boolean false
In diesem Fall wird ein Standard-Debian ohne grafische Oberfläche installiert. Die Boot-Partition hat 500 Megabyte, die Systempartition 10 Gigabyte. Den Benutzer erstellen Sie mit der Zeile [c]d-i passwd/user-fullname string Benutzer Name[/c], den Login-Namen mit [c]d-i passwd/username string benutzer[/c]. Das root-Passwort mit [c]d-i passwd/root-password-crypted password passwort[/c], das Passwort des normalen Benutzers mit [c]d-i passwd/user-password password sicheres_passwort[/c] und [c]d-i passwd/user-password-again password sicheres_passwort[/c]. Software installieren Sie mit [c]tasksel tasksel/first multiselect ssh-server standard[/c] – so installieren Sie etwa KDE Plasma als grafische Oberfläche mit:
tasksel tasksel/first multiselect ssh-server standard plasma-desktop
Im Grunde ist die Konfiguration recht verständlich – mehr zur Konfiguration finden Sie unter preseed.cfg. Für ein absolut sicher gehashtes root-Passwort starten Sie noch den Befehl:
printf "sicheres_passwort" | mkpasswd -s -m sha-512
Dies war es schon – jetzt brauchen Sie nur noch auf den zu installierenden Rechnern im BIOS/UEFI auf PXE-Boot umstellen und die IP-Adresse Ihres PXE-Servers angeben.
Noch keine Reaktion