dnsmasq für PXE boot

Dieser Artikel beschreibt, wie dnsmasq konfiguriert werden kann, um PXE boot für Rechner mit UEFI und traditionellem BIOS bereitzustellen.

Ich will Rechner zentral verwalten und mit Festplattenabbildern bespielen. Ich habe sowohl Recher mit UEFI als auch Rechner mit traditionellem BIOS. Die Rechner mit UEFI beherrschen auch exklusiv nur den EFI Boot. CSM ist auf letzteren zwar verfügbar, auch explizit für PXE, allerdings lässt sich bei aktiviertem CSM ein lokal installiertes Betriebssystem nicht mehr starten. 🤦

Konfiguration dnsmasq

dnsmasq wird als "Proxy DHCP" verwendet, denn in meinem Netzwerk existiert schon ein DHCP-Server und ein DNS-Server.

/etc/dnsmasq.conf

# Configuration file for dnsmasq.

# DNS-Server abschalten (nur DHCP und TFTP sind hier relevant):
port=0

# Proxy DHCP für Netzwerk akticieren:
dhcp-range=172.16.9.0,proxy

# Zeige ein einfaches Menü:
pxe-prompt="Press F8 for menu or proceed with default in", 5

# Standardmäßig soll ein lokaler Start durchgeführt werden
pxe-service=x86PC, "local boot"
pxe-service=X86-64_EFI, "local boot"

# bietet pxelinux.0 für PXE via BIOS an
pxe-service=x86PC, "pxelinux.0", pxelinux
# bietet sys,inux für PXE via UEFI an
pxe-service=X86-64_EFI, "syslinux", syslinux.efi
pxe-service=X86-64_EFI, "syslinux", syslinux.efi

# den TFTP server aktivieren
enable-tftp
tftp-root=/var/tftp

Die Zeile pxe-service=X86-64_EFI, "syslinux",… muss in der Tat zwei mal erwähnt werden, denn es gibt einen bug. Werden nur zwei pxe-service für X86-64_EFI angegeben, wird das Menü nicht gezeigt, sondern direkt der erste Eintrag gestartet. (Es hat lange gedauert, bis ich das herausfand.)

Sollen die Rechner nach dem Einschalten standardmäßig pxelinux bzw. syslinux starten, so können die Einträge für "local boot" auskommentiert, entfernt oder unter die pxelinux/syslinux Einträge verschoben werden. Nach Änderungen an der Konfiguration muss dnsmasq neu gestartet werden.

TFTP Inhalte

pxelinux

pxelinux wird für den PXE boot für Rechner mit traditionellem BIOS verwendet. In Ubuntu ist /usr/lib/PXELINUX/pxelinux.0 im Paket pxelinux enthalten.

syslinux

syslinux kann für den PXE boot für Rechner mit UEFI verwendet werden. In Ubuntu ist /usr/lib/SYSLINUX.EFI/efi64/syslinux.efi im Paket syslinux-efi enthalten.

syslinux 6.03 hat leider einen bug: Beim Boot hängt sich der Rechner auf. ಠ_ಠ Ich verwende daher das syslinux.efi aus syslinux-6.04-pre1.

Damit syslinux einen Linux Kernel laden kann, möchte es ldlinux.e64 vom TFTP Server laden. In Ubuntu ist /usr/lib/syslinux/modules/efi64/ldlinux.e64 im Paket syslinux-common enthalten.

Konfiguration pxelinux und syslinux

pxelinux liest seine Konfiguration vom TFTP Server aus dem Verzeichnis pxelinux.cfg/.

Auch syslinux.efi liest offenbar, wenn über PXE geladen, die Konfiguration auch aus pxelinux.cfg/.

Sowohl pxelinux als auch syslinux können ein wunderschönes Menü anzeigen. Es ist mir jedoch nicht gelungen, das so einzurichten, dass es mit einer Konfigurationsdatei sowohl für UEFI als auch für traditionelles BIOS funktioniert.

Ich habe mich für letztlich für folgende einfache Konfiguration entschieden, um Tiny Core Linux über PXE zu laden:

$ cat /var/tftp/pxelinux.cfg/default
default TCL

label TCL
  kernel /tcl/vmlinuz
  append initrd=/tcl/rootfs.gz,/tcl/modules.gz noswap norestore

Wie genau das geht, und wie Tiny Core Linux angepasst werden kann, ist in diesem Artikel zu lesen.

Auch Clonezilla kann über PXE geladen werden:

label Clonezilla
  kernel /cz/vmlinuz
  append initrd=/cz/initrd.img boot=live username=user union=overlay config components noswap edd=on nodmraid ocs_live_keymap="/usr/share/keymaps/i386/qwertz/de-latin1-nodeadkeys.kmap.gz" ocs_live_run="ocs-live-general" ocs_live_batch=no net.ifnames=0 nosplash noprompt keyboard-layouts=de locales=de_DE.UTF-8 fetch=tftp://172.16.9.42/cz/filesystem.squashfs ocs_daemonon="ssh" usercrypted=ecjSIFRR1COWA

Das Passwort zur Verwendung über ssh lautet "cz".

Clonezilla ist mit über 500 MB relativ groß. Tiny Core Linux misst weniger als 20 MB.

Übersicht

Dies sind nun alle Dateien im TFTP Wurzelverzeichnis:

$ tree /var/tftp/
/var/tftp/
├── syslinux.efi
├── ldlinux.e64 -> /usr/lib/syslinux/modules/efi64/ldlinux.e64
├── pxelinux.0 -> /usr/lib/PXELINUX/pxelinux.0
├── pxelinux.cfg
│   └── default
├── cz
│   └── …
└── tcl
    └── …