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
└── …