Debian Wheezy PXE-Bootserver einrichten

Einleitung

Ein PXE-Bootserver ist eine praktische Sache. Da inzwischen fast jeder PC via PXE vom Netzwerk booten kann, werden CDs und DVDs überflüssig. Ältere PCs können z.B. über eine Diskette mit gPXE oder iPXE auch zum Starten via PXE gebracht werden.

Man kann verschiedene und immer wieder benötigte Systeme vorhalten, ohne sie auf den einzelnen Rechnern installieren zu müssen und ohne Installations-CDs o.ä. herauskramen oder neu brennen zu müssen.

Ich habe so für verschiedene Situationen immer ein GParted, eine Debian-Installation und ein Debian-Live sowie Memtest zur Hand. Auch das Vorrätighalten einer aktuellen Virenscannerdistribution, wie z.B. Desinfec't ist so leicht gemacht und für alle Clients aktuell zu halten. Daneben lassen sich noch festplattenlose Rechner per NFS betreiben und zentral im Backup berücksichtigen, selbst wenn diese Rechner zum Backupzeitpunkt nicht eingeschaltet sein sollten.

Im Einzelnen:


Voraussetzungen

Es bietet sich für diese Aufgabe ein Rechner an, der ohnehin immer eingeschaltet ist. Das kann auch ein Gateway-Rechner sein, wenn genügend Festplattenplatz vorhanden ist. Es wird angenommen, daß der DHCP-Server aus dem Paket isc-dhcp-server auf einem passenden Rechner installiert ist. PXE-Booten ist auch mit dem kompakten dnsmasq möglich. Darauf gehe ich aber hier nicht weiter ein.

Darüberhinaus wird der TFTP-Server aus dem Paket tftpd-hpa auf einem Fileserver installiert. Für die Varianten, welche auf NFS aufbauen, setze ich den Server aus dem Paket nfs-kernel-server auf dem Fileserver ein.


Einzelne Schritte des Bootens mittels PXE

Das Booten mittels PXE läuft in mehreren Schritten ab:
  1. Das PXE-System wird geladen. Meist ist das bereits ins BIOS eingebaut und braucht nur aktiviert zu werden. Oder es wird z.B. von Diskette ein gPXE gestartet.
  2. Das PXE-System fragt einen DHCP-Server mit Hilfe der MAC-Adresse seiner Netzwerkkarte nach der für sich zu verwendenden IP-Adresse, einem TFTP-Server und einem Dateinamen auf diesem Server, mit dem der nächste Schritt eingeleitet werden kann.
  3. Das PXE-System lädt die angegebene Datei vom TFTP-Server und führt sie aus. Hier wird eine Version von pxelinux.0 verwendet.
  4. Das pxelinux.0 schaut mit Hilfe der MAC-Adresse seiner Netzwerkkarte nach einer speziellen Konfiguration für sich im Verzeichnis /pxelinux.cfg auf dem TFTP-Server oder nach einer default-Datei, wenn keine spezifische Konfigurationsdatei existiert. Diese Datei sorgt für verschiedene Startoptionen und -parameter und ggf. ein entsprechendes Auswahlmenü.
  5. Der Benutzer wählt einen Menüpunkt oder nach einer einstellbaren Wartezeit wird ein Standardpunkt automatisch gewählt.
  6. Die dem Menüpunkt zugeordnete Konfiguration sorgt dafür, dass der passende Kernel und eine zugehörige Initrd mit festgelegten Parametern geladen und ausgeführt wird.
  7. Das Linux läuft an und initialisiert sich so, wie es mit Hilfe der Initrd eingerichtet ist. Ab hier unterscheiden sich verschiedene Systeme:
    • GParted lädt sein Dateisystem-Image von einem HTTP-Server
    • Der Debian-Installer wird ausgeführt und lädt Komponenten von den Debian-Servern nach
    • Debian Live bindet über NFS ein squashfs-Dateisystem-Image ein und arbeitet damit weiter (das ist eine von mehreren Möglichkeiten bei Debian Live)
    • Ein für den Rechner angepaßtes System wird mit dem Root-Dateisystem auf einem NFS-Server direkt eingebunden und gestartet
    • ...und sicherlich gibt es weitere Möglichkeiten...
Damit das alles zusammenspielt und korrekt ineinander greift müssen ein paar Einstellungen vorgenommen werden.

Einrichten des DHCP-Servers

Als DHCP-Server kommt bei mir der isc-dhcp-server zum Einsatz. In dessen Konfigurationsdatei /etc/dhcp/dhcpd.conf wird für jede Maschine, die über PXE booten soll, ein Eintrag wie folgender erzeugt:
host HOSTNAME {
    hardware ethernet xx:xx:xx:xx:xx:xx;         # MAC-Adresse der Netzwerkkarte
    fixed-address HOSTNAME.datenautomat.de;      # DNS-Adresse oder IP-Adresse der Maschine, die über PXE booten soll
    next-server 192.168.1.1;                     # IP-Adresse des TFTP-Servers
    filename "/pxelinux.0";                      # Dateiname der Datei, die den weiteren Bootprozess steuert
}
Daneben sind hier noch folgende allgemeine Einstellungen in der /etc/dhcp/dhcpd.conf eingetragen:
ddns-update-style none;                          # Keine DNS-Aktualisierung durchführen
option domain-name "datenautomat.de";            # Domänenname für gesamte Konfiguration
option domain-name-servers ns.datenautomat.de;   # Zu verwendender DNS-Server
default-lease-time 7200;                         # Standardhaltezeit für Leases 2 Stunden
max-lease-time 14400;                            # Höchsthaltezeit für Leases 4 Stunden
authoritative;                                   # Dies ist der offizielle DHCP-Server für dieses Netz
allow bootp;                                     # BOOTP erlauben

subnet 192.168.1.0 netmask 255.255.255.0 {
    range 192.168.1.172 192.168.1.192;           # Bereich zum automatischen Vergeben von IP-Adressen
    option routers 192.168.1.1;                  # Hauptrouter bekanntgeben
}
Mit /etc/init.d/isc-dhcp-server restart den DHCP-Server neu starten und im Log nachschauen, ob ihm die Änderungen auch passen. Der Server wird recht pingelig auf vergessene Klammern oder Semikolons reagieren...

Einrichten des TFTP-Servers

Danach geht es an die Konfiguration des TFTP-Servers. Ich nehme dafür das Paket tftpd-hpa. Da ich für die NFS-Freigaben und die für den PXE-Bootvorgang benötigten Dateien ein einziges Dateisystem unter /vol/nfs verwenden möchte, konfiguriere ich mir den TFTP-Server in /etc/default/tftpd-hpa wie folgt:
TFTP_USERNAME="tftp"
TFTP_DIRECTORY="/vol/nfs/.tftpboot"
TFTP_ADDRESS="192.168.1.1:69"
TFTP_OPTIONS="--secure"
Wenn das Verzeichnis angelegt wurde, kann der Dienst mit /etc/init.d/tftpd-hpa restart neu gestartet werden.

Einrichten der Bootoption „Debian Wheezy Netinstall“

Im Anschluß hole ich den aktuellen Debian-Installer
wget http://ftp.de.debian.org/debian/dists/wheezy/main/installer-i386/current/images/netboot/netboot.tar.gz
Darin interessieren mich ein paar Dateien, die ich wie folgt anordne:
/vol/nfs/.tftpboot/pxelinux.0
/vol/nfs/.tftpboot/pxelinux.cfg/default
/vol/nfs/.tftpboot/boot/debian/wheezy/initrd.gz
/vol/nfs/.tftpboot/boot/debian/wheezy/linux
Die default-Datei wird dann so gefüllt:
DISPLAY boot/boot.txt
PROMPT 1
TIMEOUT 100

DEFAULT wheezy

LABEL wheezy
KERNEL boot/debian/wheezy/linux
APPEND initrd=boot/debian/wheezy/initrd.gz nouveau.modeset=0 nomodeset
Die Parameter nouveau.modeset=0 nomodeset werden bei mir benötigt, um auf einigen Rechnern im Textmodus zu bleiben, da die angeschlossenen Bildschirme nicht passend erkannt werden und eine zu hohe Auflösung gewählt würde. Mit besseren Monitoren wäre das wohl nicht nötig...

Die Einträge in der pxelinux.cfg/default-Datei gelten für alle Maschinen, für die keine speziellere Datei existiert. Um eine Maschine anders als die anderen booten zu können, legt man eine Datei in pxelinux.cfg an, die die MAC-Adresse der Maschine im Dateinamen enthält in der Form 01-xx-xx-xx-xx-xx-xx, also mit Bindestrichen anstelle der sonst üblichen Doppelpunkte. Der Inhalt entspricht dem der pxelinux.cfg/default-Datei mit den gewünschten Abwandlungen, wie z.B. andere Bootparameter beim APPEND.

Die Datei /vol/nfs/.tftpboot/boot/boot.txt lege ich an mit:


Default PXE boot options:

  wheezy             Debian Wheezy Netinstall

Diese wird während des Bootprozesses angezeigt, damit der Benutzer weiß, was er wählen kann. Hier und in der pxelinux.cfg/default-Datei werden weitere Einträge angelegt, wenn weitere Bootmöglichkeiten dazukommen.

Einrichten der Bootoption „GParted Live“

GParted Live ist eine kleine Distribution rund um ein paar Programme zur Partitionsverwaltung von Datenträgern, vor allem GParted, nach dem es benannt ist. Damit ist es meistens möglich, bestehende Partitionen in der Größe und Position auf der Festplatte an neue Bedürfnisse anzupassen. Das System lädt sich während des Bootens das Root-Dateisystem von einem Webserver in eine RAM-Disk herunter und bindet es ein.

Um diese Distribution über PXE zu booten, besorgt man sich von der Download-Seite die aktuelle Zip-Datei für die eigene Architektur, also z.B. http://sourceforge.net/projects/gparted/files/gparted-live-stable/0.18.0-1/gparted-live-0.18.0-1-i486.zip/download. Daraus werden nur drei Dateien aus dem Unterverzeichnis live/ benötigt: Die filesystem.squashfs wird auf einen geeigneten Webserver geladen und ggf. umbenannt. Diese Position wird später in der pxelinux.cfg/default beim APPEND bekanntgegeben. Die Dateien vmlinuz und initrd.img werden in ein Verzeichnis /vol/nfs/.tftpboot/boot/gparted/ kopiert. Es folgt der obligatorische Eintrag in der pxelinux.cfg/default-Datei oder in einer der für die einzelne Maschine spezialisierten Datei:

LABEL gparted
KERNEL boot/gparted/vmlinuz
APPEND initrd=boot/gparted/initrd.img boot=live config union=aufs noswap noprompt vga=788 fetch=http://www.datenautomat.de/download/gparted.fs.squashfs
Nach dem Erweitern der zugehörigen boot.txt-Datei um die Zeile
  gparted            GParted Live
ist das Einrichten dieser Bootoption bereits erledigt.

Einrichten der Bootoptionen „memtest“, „memtest+“ und „memtest-multiboot“

Um auf jedem Rechner im Netz ohne größeren Aufwand einen Speichertest durchführen zu können, bietet es sich an, die Programme memtest86 bzw. memtest86+ zu verwenden. Aus den gleichnamigen Debian-Paketen werden nur die unter /boot/ zu findenden Dateien benötigt.

Ich lege diese Dateien unter /vol/nfs/.tftpboot/boot/memtest/ ab. Da es bei einigen PXE-Systemen zu Problemen bei der Behandlung von Dateien mit der Endung .bin gibt, benenne ich sie um oder lege einen Symlink an:

memtest            ->  memtest86.bin
memtest+           ->  memtest86+.bin
memtest-multiboot  ->  memtest86+_multiboot.bin
Dann wird wieder die pxelinux.cfg/default-Datei erweitert:
LABEL memtest
KERNEL boot/memtest/memtest

LABEL memtest+
KERNEL boot/memtest/memtest+

LABEL memtest-multiboot
KERNEL boot/memtest/memtest-multiboot
Zum Abschluß wird auch die zugehörige boot.txt erweitert:
  memtest            Memtest86
  memtest+           Memtest86+
  memtest-multiboot  Memtest86+ Multiboot

Einrichten der Bootoption „Debian Wheezy Live“

Das Debian Live-Projekt bietet mehrere unterschiedliche vorkonfigurierte Systeme an. Ich beschränke mich hier auf die rescue-Variante, das Einrichten der übrigen Varianten geht analog genauso. Auf der Projektseite ist auch beschrieben, wie sich das System an eigene Bedürfnisse anpassen läßt, indem die Root-Dateisystemdatei neu erstellt wird. Das Root-Dateisystem liegt, wie bei GParted, in einer .squashfs-Datei vor. Es ließe sich auch genau wie bei GParted von einem Webserver herunterladen und einbinden. Nur ist diese Datei derartig groß, daß nach dem Herunterladen auf den meisten meiner Maschinen nicht mehr genügend Arbeitsspeicher übrig ist. Daher wird diese Datei via NFS im Nur-Lesen-Modus freigegeben und auf diesem Weg zur Verfügung gestellt.

Die benötigten Dateien werden von http://cdimage.debian.org/debian-cd/current-live/i386/webboot/ heruntergeladen. Ich verwende die Variante 1, welche für i486 anstelle für i686-pae erstellt wurde.

Die Dateien debian-live-7.4-i386-rescue.vmlinuz1 und debian-live-7.4-i386-rescue.initrd1.img werden nach /vol/nfs/.tftpboot/debian/ kopiert. Die Datei debian-live-7.4-i386-rescue.squashfs wird nach /vol/nfs/debian/debian-live-7.4-i386-rescue/live/ kopiert und in filesystem.squashfs umbenannt. Dann wird das Verzeichnis noch mit Hilfe der Datei /etc/exports über NFS freigegeben:

/vol/nfs/debian	192.168.1.*(ro,nohide,no_root_squash,no_subtree_check,insecure)
Anschließend wird der NFS-Server angewiesen die Konfigurationsdatei neu einzulesen: /etc/init.d/nfs-kernel-server reload. Dann wird die Datei pxelinux.cfg/default erweitert:
LABEL live
KERNEL boot/debian/debian-live-7.4-i386-rescue.vmlinuz1
APPEND initrd=boot/debian/debian-live-7.4-i386-rescue.initrd1.img boot=lie config netboot=nfs nfsroot=192.168.1.1:/vol/nfs/debian/debian-live-7.4-i386-rescue quiet vga=normal nouveau.modeset=0 nomodeset
und die zugehörige boot.txt erweitert:
  live               Debian Live Rescue
Fertig.

Verweise

Weitere Webseiten rund um dieses Thema: