Linux Booten übers Netz (PXE)
PXE steht für Preboot eXecution Environment und beschreibt einen hauptsächlich von Intel initiierten Standard für einen netzwerkbasierten Bootvorgang.
Die zwei Standard-Dienste auf die sich PXE stützt sind DHCP und TFTP. Dabei sorgt ein DHCP Server für die Verteilung der nötigen Netzeinstellungen an die Clienten, die anschließend ihre Boot-Image per TFTP von Server holen und ausführen.
Obwohl die meisten PXE-Implementierungen in Form einer Firmware in die Netzwerkhardware integriert sind, gibt es schon seit geraumer Zeit auch reine Software-Lösungen - die meisten davon jedoch kostenpflichtig. Die fehlende Firmware wird dabei meist durch eine Bootdiskette ersetzt. Erst seit Version 5.4.0 des Etherboot-Projektes beherrscht auch ein freie Software diesen Standard für eine große Anzahl unterschiedlicher Netzwerkkarten. Die Verwendung ist denkbar einfach:
linux~ > tar xjf etherboot-5.4.0.tar.bz2
linux~ > cd etherboot-5.4.0/src
linux~ > make allzdsks
linux~ > cat bin/3c90x.zdisk > /dev/fd0
Mit diesen Schritten wird die Software entpackt, die Boot-Images erstellt und anschließend (eines davon) auf Diskette geschrieben. Natürlich sollte man beim letzten Schritt das zur verwendeten Netzwerkkarte passende .zdisk-Image verwenden.
Setup
DHCP
Um die Vorteile von PXE nutzen zu können müssen folglich zuerst der DHCP Server konfiguriert werden:
Eine kleine Beispiel-Config für /etc/dhcpd.conf kann so aussehen:
ddns-update-style none; ddns-updates off;
ignore unknown-clients;
group {
filename "/pxelinux/pxelinux.0";
use-host-decl-names on;
subnet 192.168.0.0 netmask 255.255.255.0 {
# tftp server
next-server 192.168.0.2;
option broadcast-address 192.168.0.255;
option routers 192.168.0.1;
option domain-name "rrze.uni-erlangen.de";
option domain-name-servers 192.168.0.1, 192.168.0.5;
option perform-mask-discovery false;
option router-discovery false;
option default-ip-ttl 10;
}
host rrze-pc1 {
hardware ethernet 00:01:02:03:04:05;
fixed-address client1.rrze.uni-erlangen.de; # 192.168.0.10
}
TFTP
Die Konfiguration des TFTP Servers hängt stark von der Version ab. Es gibt einige Stand-Alone TFTP Server, andere wiederum müssen über inetd bzw. xinetd gestartet werden. Bei der ersten Variante reicht das Starten per Init-Skript, bei der zweiten muß die Konfigurationsdatei des (x)inetd angepasst werden.
Vorsicht! Viele TFTP Server laufen in einer chroot()-Umgebung (häufig im Verzeichnis /tftpboot. Alle Pfade die bzgl. TFTP angegeben werden sind dementsprechend relativ zu diesem Pfad!
PXELinux
In der Konfiguration des DHCP Servers gibt die Option filename die Datei an, die der PXE Client per TFTP vom Server (Option: next-server) holt, und ausführt.
Im obigen Beispiel handelt es sich um den PXE Boot-Loader des Syslinux Projektes (Syslinux Homepage). Während der Ausführung versucht der Loader eine Konfigurationsdatei einzulesen, die den weiteren Boot-Prozess beschreibt. Diese werden im Unterverzeichnis pxelinux.cfg gesucht. Spezielle Einstellungen für ausgewählte Rechner oder Rechnergruppen lassen sich an Hand von MAC- oder IP-Adressen (HEX-codiert) erstellen. Der folgende Ausschnitt zeigt das Protokoll eines PXELinux Bootvorgangs, bei dem nur eine Grundkonfiguration (in default) existierte.
RRQ from 192.168.0.10 filename /pxelinux/pxelinux.0
RRQ from 192.168.0.10 filename /pxelinux/pxelinux.cfg/01-00-56-45-43-11-79
RRQ from 192.168.0.10 filename /pxelinux/pxelinux.cfg/C0A8000A
RRQ from 192.168.0.10 filename /pxelinux/pxelinux.cfg/C0A8000
RRQ from 192.168.0.10 filename /pxelinux/pxelinux.cfg/C0A800
RRQ from 192.168.0.10 filename /pxelinux/pxelinux.cfg/C0A80
RRQ from 192.168.0.10 filename /pxelinux/pxelinux.cfg/C0A8
RRQ from 192.168.0.10 filename /pxelinux/pxelinux.cfg/C0A
RRQ from 192.168.0.10 filename /pxelinux/pxelinux.cfg/C0
RRQ from 192.168.0.10 filename /pxelinux/pxelinux.cfg/C
RRQ from 192.168.0.10 filename /pxelinux/pxelinux.cfg/default
Der Inhalt dieser Dateien kann so wie das folgende Beispiel aussehen:
default suse92
prompt 1
timeout 10
label suse92
kernel /SuSE-9.2/i386/linux
append initrd=/SuSE-9.2/i386/initrd vga=0x314 \
install=nfs://131.188.3.145/proj.stand/suse/suse9.2
label local
LOCALBOOT 0
Auch hierbei kann man die angeforderten Dateien wieder im Syslog beobachten:
RRQ from 192.168.0.10 filename /pxelinux/SuSE-9.2/i386/linux
RRQ from 192.168.0.10 filename /pxelinux/SuSE-9.2/i386/initrd
Vorsicht! Alle TFTP Pfade von PXELinux werden relativ zu dem Verzeichnis behandelt, in dem sich der eigentliche Bootloader pxelinux.0 befindet!
PXEGrub
Alternativ PXELinux kann man auch die PXE Erweiterung von Grub nutzen um über PXE zu booten. Dazu muss nach dem Compilieren der PXE Bootloader erstellt werden. Das funktioniert bei neuen Versionen folgendermassen:
linux~ > tar xzf grub-1.93.tar.gz
linux~ > cd grub-1.93
linux~ > ./configure
linux~ > ./grub-mkimage -d . -v -o core.img *.mod
linux~ > cat pxeboot.img core.img > pxegrub
Die resultierende Datei pxegrub wird kann dann als Ersatz für pxelinux.0 dienen (wobei sich die weitere Konfiguration natürlich unterscheidet.
SuSE
Die Dateien linux und initrd in unserem Beispiel findet man einfach auf der SuSE CD/DVD unter boot/loader/.
Die Optionen die man bei einer SuSE-Installation übergeben kann sind auf der SuSE Autoinstall Homepagebeschrieben.
elilo (Itanium/IA64)
Auch die 64-bit Prozessoren der Firma Intel unterstützen PXE. Da es sich hierbei um eine neue Architektur (IA64) mit neuem Befehlssatz handelt, kann das auf die i386-Architektue ausgelegte PXELinux auf solchen Maschinen nicht zum Einsatz kommen. Als Ersatz kommt hier beispielsweise elilo (EFI Linux Boot Loader) in Frage. Wer bisher keine Erfahrungen mit EFI gemacht hat, sollte den praktischen Teil vorerst überspringen und zuerst einen kurzen Blick auf den Abschnitt EFI werfen.
SuSE
Genau wie auf i386-Systemen braucht man auch bei Itanium Systemen folgende Komponenten: Boot-Loader (und Konfiguration), Kernel, Initial Ramdisk, nur das diese nicht ganz so einfach zu finden sind. Bei näherer Untersuchung der Datei boot/image stellt sich jedoch heraus, dass darin ein FAT-Dateisystem enthalten ist:
linux~ > file boot/image
boot/image: x86 boot sector, code offset 0xfe, \
OEM-ID "SUSE ", sectors/cluster 2, \
root entries 16, sectors 25200 (volumes <=32 MB) , \
Media descriptor 0xf8, sectors/FAT 50, heads 16
Um auf den Inhalt eines solchen Images zugreifen zu können bindet man die Datei ähnlich wie ein normales Block-Device ins Dateisystem ein:
linux~ > mount -o loop boot/image /mnt
linux~ > ls /mnt/boot/efi
bootia64.efi elilo.conf initrd linux textmenu
linux~ > cp /mnt/boot/efi/* /tftpboot/efi/
Neben Kernel (linux) und Ramdisk (initrd) findet sich dort auch der Bootmanager (bootia64.efi) sowie dessen Konfiguration (elilo.conf). Die Konfiguration ist der des LILO sehr ähnlich:
prompt
timeout=100
default=linux
chooser=textmenu
message=textmenu
relocatable
# default
image=linux
label=linux
description = "Installation"
initrd=initrd
append="ramdisk_size=131072"
Die ersten Schritte beim Booten von Itanium-Systemen verlaufen genau analog zu denen der i386-Generation: DHCP-Anfrage stellen, und danach den zugewiesenen Boot-Manager per TFTP vom Server laden und ausführen. Der muss natürlich bei Itanium-Systemen in der Datei /etc/dhcpd.conf ausgetauscht werden:
...
filename "/efi/bootia64.efi";
...
Wenn der Inhalt des Images wie oben beschrieben bereits in das Verzeichnis des TFTP-Servers kopiert wurde, so steht einem ersten PXE-EFI-Boot nichts mehr im Wege. Die Debug-Ausgabe des TFTP-Servers verrät außerdem noch, dass auch der ELILO die Verwendung von Rechner-spezifischen Konfigurationen erlaubt - auch hier wird wieder die hexadezimal codierte IP-Adresse genutzt (/efi/C0A8000A.conf):
RRQ from 192.168.0.10 filename /efi/bootia64.efi
RRQ from 192.168.0.10 filename /efi/C0A8000A.conf
RRQ from 192.168.0.10 filename /efi/elilo-ia64.conf
RRQ from 192.168.0.10 filename /efi/elilo.conf
RRQ from 192.168.0.10 filename /efi/textmenu
RRQ from 192.168.0.10 filename /efi/linux
RRQ from 192.168.0.10 filename /efi/initrd
EFI
Zum Verständnis des Boot-Konzepts auf IA64-Maschinen, sollte man ein paar Dinge wissen: EFI steht für Extensible Firmware Interface und stellt in etwa den Nachfolger des altbekannten BIOS dar. Die Vorteile die das neue System bieten soll, sind (neben der längst überfälligen Abschaffung von 16-bit Code im BIOS) die klaren Spezifikationen und die leichte Erweiterbarkeit.
Diese Erweiterbarkeit wird interessant wenn man ein Itanium System installieren bzw. dessen Boot-Konfiguration ändern will. EFI ist bereits in der Lage Dateisysteme (um genau zu sein ein Dateisystem, nämlich FAT) zu lesen, und daraus z.B. Dienstprogramme oder auch Boot-Manager auszuführen, vorausgesetzt sie liegen dort in Form eines EFI-Programms (Endung .efi) vor. Das bedeutet aber auch, dass jede bootfähige Festplatte oder CD ein FAT-Dateisystem enthalten muss.