32.8. Plattenloser Betrieb mit PXE

Aktualisiert von Jean-François Dockès.
Reorganisiert und erweitert von Alex Dupre.

FreeBSD kann über ein Netzwerk starten und arbeiten, ohne eine lokale Festplatte zu verwenden, indem es Dateisysteme eines NFS-Servers in den eigenen Verzeichnisbaum einhängt. Dazu sind, von den Standardkonfigurationsdateien abgesehen, keine Systemänderungen nötig. Ein solches System kann leicht installiert werden, da alle notwendigen Elemente bereits vorhanden sind:

Um PXE beim Systemstart zu verwenden, müssen Sie im BIOS des Rechner die Option Über das Netzwerk starten aktivieren. Alternativ können Sie während der PC-Initialisierung auch eine Funktionstaste drücken.

Es gibt verschiedene Wege, einen plattenlosen Rechner einzurichten. Viele Elemente sind daran beteiligt, die fast immer an den persönlichen Geschmack angepasst werden können. Im folgenden Abschnitt wird die Installation eines kompletten Systems beschrieben, wobei der Schwerpunkt auf Einfachheit und Kompatibilität zu den Standardstartskripten von FreeBSD liegt. Das beschriebene System hat folgende Eigenschaften:

Achtung:

Das hier beschriebene System ist nicht sicher. Es sollte nur in einem gesicherten Bereich eines Netzwerks verwendet werden und für andere Rechner nicht erreichbar sein.

32.8.1. Hintergrundinformationen

Bei der Einrichtung von plattenlosen Rechnern müssen verschiedene Operationen durchgeführt werden, um das System erfolgreich zu starten:

  • Der Rechner benötigt einige Startparameter, wie seine IP-Adresse, die Namen ausführbarer Dateien, den Servernamen sowie den root-Pfad. Für die Übermittlung dieser Informationen wird entweder das DHCP- oder das BOOTP-Protokoll verwendet. Bei DHCP handelt es sich um eine abwärtskompatible Erweiterung von BOOTP, die die gleichen Portnummern und das gleiche Paketformat verwendet.

    Es ist möglich, das System so zu konfigurieren, dass es nur BOOTP verwendet. Das Serverprogramm bootpd(8) ist bereits im FreeBSD-Basissystem enthalten.

    DHCP hat im Vergleich zu BOOTP allerdings mehrere Vorteile (bessere Konfigurationsdateien, die Möglichkeit zur Verwendung von PXE, sowie viele andere, die nicht in direktem Zusammenhang mit dem plattenlosen Betrieb stehen). Dieser Abschnitt beschreibt die Konfiguration mittels DHCP. Wenn möglich, werden aber entsprechende Beispiele für bootpd(8) angeführt. Die Beispielkonfiguration nutzt das Softwarepaket ISC DHCP.

  • Der Rechner muss den Loader über TFTP starten.

  • Das Root-Dateisystem muss über NFS geladen werden.

  • Die möglichen Bootstrap-Programme und der Kernel müssen initialisiert und ausgeführt werden. Dabei gibt es zwei Möglichkeiten:

    • PXE lädt pxeboot(8). Dabei handelt es sich um eine modifizierte Version des FreeBSD-Loaders der Boot-Phase drei. Der loader(8) beschafft alle für den Systemstart notwendigen Parameter, und hinterlegt diese in der Kernelumgebung, bevor er die Kontrolle übergibt. Es ist hier möglich, den GENERIC-Kernel zu verwenden.

    • Etherboot lädt den Kernel hingegen direkt. Dafür müssen Sie allerdings einen Kernel mit spezifischen Optionen erzeugen.

    PXE und Etherboot sind zwar im Großen und Ganzen gleichwertig, da der Kernel aber viele Aufgaben an loader(8) übergibt, sollte bevorzugt PXE eingesetzt werden.

    Wenn Ihr BIOS und Ihre Netzwerkkarten PXE unterstützen, sollten Sie es auch verwenden.

  • Zuletzt muss der Rechner auf seine Dateisysteme zugreifen können. Dafür wird stets NFS verwendet.

Sie können das Verzeichnis /tftpboot an einem beliebigen Ort auf dem Server ablegen. Stellen Sie aber sicher, dass Sie diesen Ort sowohl in /etc/inetd.conf als auch in /usr/local/etc/dhcpd.conf eingetragen haben.

Weitere Informationen finden Sie in diskless(8).

32.8.2. Einrichtung einer chroot(8)-Umgebung für das NFS-Root-Dateisystem

Beigetragen von Craig Rodrigues.

Das Intel® Preboot eXecution Environment (PXE) erlaubt es, ein Betriebssystem über das Netzwerk zu starten. PXE-Unterstützung wird von modernen Mainboards über das BIOS bereitgestellt, wo Sie es bei den Einstellungen zum Starten über das Netzwerk aktivieren können. Ein voll funktionsfähiges PXE-Setup erfordert zusätzlich einen richtig konfigurierten DHCP- und TFTP-Server.

Sobald das Gastsystem startet, erhält es vom DHCP-Server Informationen, wo der initiale Bootloader per TFTP zu bekommen ist. Nachdem das Gastsystem diese Informationen erhält, lädt es den Bootloader über TFTP herunter und führt diesen anschließend aus. Dieses Verfahren ist in Sektion 2.2.1 der Preboot Execution Environment (PXE) Specification dokumentiert. In FreeBSD ist /boot/pxeboot der Bootloader, der während des PXE-Vorgangs abgerufen wird. Nachdem /boot/pxeboot ausgeführt und der FreeBSD-Kernel geladen wurde, wird mit dem Rest der FreeBSD-Bootsequenz fortgefahren. Weitere Informationen über den Bootvorgang unter FreeBSD finden Sie in Kapitel 13, FreeBSDs Bootvorgang.

  1. Wählen Sie ein Verzeichnis welches eine FreeBSD-Installation enthält und über NFS eingehangen werden kann. Als Beispiel kann das Verzeichnis /b/tftpboot/FreeBSD/install verwendet werden.

    # export NFSROOTDIR=/b/tftpboot/FreeBSD/install
    # mkdir -p ${NFSROOTDIR}
  2. Aktivieren Sie den NFS-Server. Diese Prozedur wird im Kapitel Abschnitt 30.3.2, „NFS einrichten“ beschrieben.

    Exportieren Sie das eben erstellte Verzeichnis über NFS, indem Sie folgende Zeile in /etc/exports hinzufügen:

    /b -ro -alldirs
  3. Starten Sie den NFS-Server neu:

    # /etc/rc.d/nfsd restart
  4. Aktivieren Sie inetd(8) wie im Kapitel Abschnitt 30.2.2, „Einstellungen“ beschrieben.

  5. Fügen Sie folgende Zeilen in /etc/inetd.conf hinzu:

    tftp dgram udp wait root /usr/libexec/tftp tftp -l -s /b/tftpboot
  6. Starten Sie inetd neu:

    # /etc/rc.d/inetd restart
  7. Erstellen Sie einen neues Basissystem und einen FreeBSD-Kernel:

    # cd /usr/src
    # make buildworld
    # make buildkernel
  8. Installieren sie FreeBSD in das Verzeichnis, welches über NFS eingehangen ist:

    # make installworld DESTDIR=${NFSROOTDIR}
    # make installkernel DESTDIR=${NFSROOTDIR}
    # make distribution DESTDIR=${NFSROOTDIR}
              
  9. Testen Sie den TFTP-Server und vergewissern Sie sich, dass Sie den Bootloader herunterladen können, der über PXE bereitgestellt wird:

    # tftp localhost
    tftp> get FreeBSD/install/boot/pxeboot
    Received 264951 bytes in 0.1 seconds
              
  10. Bearbeiten Sie ${NFSROOTDIR}/etc/fstab und erstellen Sie einen Eintrag, um das Root-Dateisystem über NFS einzuhängen:

    # Device                                      Mountpoint    FSType    Options   Dump  Pass
    myhost.example.com:/b/tftpboot/FreeBSD/install    /         nfs       ro        0     0
              

    Ersetzen Sie myhost.example.com durch den Hostnamen oder die IP-Adresse Ihres NFS-Servers. In diesem Beispiel wird das Root-Dateisystem schreibgeschützt eingehangen, um ein potenzielles Löschen des Inhalts durch die NFS-Clients zu verhindern.

  11. Setzen Sie das root-Passwort in der chroot(8)-Umgebung:

    # chroot ${NFSROOTDIR} 
    # passwd

    Damit setzen Sie das root-Passwort für die Client-Maschinen, welche über PXE starten.

  12. Aktivieren Sie ssh(1) root-Logins für Client-Maschinen, die über PXE starten, indem Sie die Option PermitRootLogin in ${NFSROOTDIR}/etc/ssh/sshd_config aktivieren. Dies ist in sshd_config(5) dokumentiert.

  13. Führen Sie weitere Anpassungen der chroot(8)-Umgebung in ${NFSROOTDIR} durch, wie zum Beispiel die Installation weiterer Pakete mittels pkg_add(1), dass Bearbeiten der Passwortdatei mit vipw(8), oder amd.conf(5) für den Automounter. Ein Beispiel:

    # chroot ${NFSROOTDIR}
    # pkg_add -r bash

32.8.3. Konfiguration des ISC DHCP-Servers

PXE benötigt einen konfigurierten TFTP- und DHCP-Server. Der DHCP-Server muss nicht auf der selben Maschine laufen wie der TFTP-Server, aber er muss über das Netzwerk erreichbar sein.

Der ISC DHCP-Server kann Anfragen sowohl von BOOTP als auch von DHCP beantworten.

ISC DHCP ist nicht Teil des Basissystems. Installieren Sie den net/isc-dhcp42-server Port und folgen Sie den Anweisungen in Abschnitt 30.5.7, „Einen DHCP-Server installieren und einrichten“. Stellen Sie sicher, dass /etc/rc.conf und /usr/local/etc/dhcpd.conf richtig konfiguriert sind.

Nachdem ISC DHCP installiert ist, bearbeiten Sie seine Konfigurationsdatei, /usr/local/etc/dhcpd.conf. Konfigurieren Sie die next-server, filename und option root-path Einstellungen, um die IP-Adresse des TFTP-Servers, den Pfad zu /boot/pxeboot in TFTP und den Pfad zum NFS-Root-Dateisystem zu bestimmen. Hierzu ein Beispiel für /usr/local/etc/dhcpd.conf:

subnet 192.168.0.0 netmask 255.255.255.0 {
range 192.168.0.2 192.168.0.3;
option subnet-mask 255.255.255.0;
option routers 192.168.0.1;
option broadcast-address 192.168.0.255;
option domain-name-servers 192.168.35.35, 192.168.35.36;
option domain-name "example.com";

# IP address of TFTP server
next-server 192.168.0.1;

# path of boot loader obtained
# via tftp
filename "FreeBSD/install/boot/pxeboot";

# pxeboot boot loader will try to NFS mount this directory for root FS
option root-path "192.168.0.1:/b/tftpboot/FreeBSD/install/";
}

Die Anweisung next-server bestimmt den TFTP- oder NFS-Server, von dem der Loader oder der Kernel geladen werden (in der Voreinstellung ist das der DHCP-Server selbst).

Die Anweisung filename bestimmt die Datei, die Etherboot als nächstes lädt. Das genaue Format hängt von der gewählten Transfermethode ab. Etherboot kann sowohl mit NFS als auch mit TFTP kompiliert werden. In der Voreinstellung wird der FreeBSD-Port mit NFS-Unterstützung kompiliert. PXE verwendet TFTP, daher wird im Beispiel ein relativer Dateipfad verwendet. Dies kann aber, je nach Konfiguration des TFTP-Servers, auch anders sein. Beachten Sie, dass PXE pxeboot lädt, und nicht den Kernel. Es ist auch möglich, das Verzeichnis /boot einer FreeBSD-CD-ROM von pxeboot laden zu lassen. pxeboot(8) kann einen GENERIC-Kernel laden, dadurch ist es möglich, PXE von einer entfernten CD-ROM zu starten.

Die Option root-path bestimmt den Pfad des root-Dateisystems in normaler NFS-Schreibweise. Wird PXE verwendet, ist es möglich, die IP-Adresse des Rechners wegzulassen, solange nicht die Kerneloption BOOTP aktiviert wird. Der NFS-Server entspricht in diesem Fall dem TFTP-Server.

32.8.4. Vorbereitung des Root-Dateisystems

Wenn Sie PXE verwenden, ist die Erzeugung eines neuen Kernels zwar nicht unbedingt notwendig, es wird allerdings dennoch empfohlen. Die Aktivierung dieser Optionen bewirkt, dass die Anzahl der möglichen DHCP-Anfragen während des Kernelstarts erhöht wird. Ein kleiner Nachteil sind eventuell auftretende Inkonsistenzen zwischen den neuen Werten und den von pxeboot(8) erhaltenen Werten. Der große Vorteil dieser Variante ist es, das dabei der Rechnername gesetzt wird, den Sie ansonsten durch eine andere Methode, beispielsweise in einer clientspezifischen /etc/rc.conf festlegen müssten.

options     BOOTP          # Use BOOTP to obtain IP address/hostname
options     BOOTP_NFSROOT  # NFS mount root file system using BOOTP info

Außerdem können Sie die Optionen BOOTP_NFSV3, BOOT_COMPAT sowie BOOTP_WIRED_TO verwenden (sehen Sie sich dazu auch die Datei NOTES an).

Die Namen dieser Optionen sind historisch bedingt. Sie ermöglichen eine unterschiedliche Verwendung von DHCP und BOOTP innerhalb des Kernels. Es ist auch möglich, eine strikte Verwendung von BOOTP oder DHCP zu erzwingen.

Erzeugen Sie den neuen Kernel (lesen Sie dazu auch Kapitel 9, Konfiguration des FreeBSD-Kernels) und kopieren Sie ihn an den in /usr/local/etc/dhcpd.conf festgelegten Ort.

Sie müssen für den plattenlosen Rechner ein root-Dateisystem erzeugen, und zwar an dem in /usr/local/etc/dhcpd.conf als root-path festgelegten Ort.

make world zum Füllen des Dateisystems einsetzen

Diese schnelle Methode installiert ein komplettes jungfräuliches System (und nicht nur ein root-Dateisystem) nach DESTDIR. Dazu müssen Sie lediglich das folgende Skript ausführen:

#!/bin/sh
export DESTDIR=/data/misc/diskless
mkdir -p ${DESTDIR}
cd /usr/src; make buildworld && make buildkernel
make installworld && make installkernel
cd /usr/src/etc; make distribution

Danach müssen Sie noch die dadurch in DESTDIR erzeugten Dateien /etc/rc.conf sowie /etc/fstab Ihren Wünschen anpassen.

32.8.5. Den Auslagerungsbereich konfigurieren

Falls nötig, kann eine auf dem NFS-Server liegende Datei als Auslagerungsdatei eingerichtet werden.

Der Kernel unterstützt beim Systemstart keine NFS-Auslagerungsdatei. Diese muss daher in den Startskripten aktiviert werden, indem ein beschreibbares Dateisystem eingehängt wird, um dort die Auslagerungsdatei zu erzeugen und zu aktivieren. Um eine Auslagerungsdatei zu erzeugen, gehen Sie wie folgt vor:

# dd if=/dev/zero of=/path/to/swapfile bs=1k count=1 oseek=100000

Um die Auslagerungsdatei zu aktivieren, fügen Sie folgende Zeile in rc.conf ein:

swapfile=/path/to/swapfile

32.8.6. Verschiedenes

Wenn am plattenlosen Rechner Xorg sowie ein schreibgeschütztes /usr läuft, müssen Sie die Konfigurationsdatei von XDM anpassen, da Fehlermeldungen in der Voreinstellung auf /usr geschrieben werden.

Wenn das root-Dateisystem nicht auf einem FreeBSD-Rechner liegt, muss das Dateisystem zuerst unter FreeBSD erzeugt werden. Anschließend wird es beispielsweise mit tar oder cpio an den gewünschten Ort kopiert.

Dabei kann es Probleme mit den Gerätedateien in /dev geben, die durch eine unterschiedliche Darstellung der Major- und Minor-Number von Geräten auf beiden Systemen hervorgerufen werden. Eine Problemlösung besteht darin, das root-Verzeichnis auf einem FreeBSD-Rechner einzuhängen und die Gerätedateien dort mit devfs(5) zu erzeugen.

32.8.7. Speicher-Dateisysteme für /etc/rc.initdiskless

Booten Sie von einem NFS-Root-Volume, so erkennt /etc/rc dies und startet daraufhin das /etc/rc.initdiskless Skript. Lesen Sie die Kommentare in diesem Skript um zu verstehen, was dort vor sich geht. Weil das NFS-Root-Verzeichnis schreibgeschützt ist, wir aber Schreibzugriff für /etc und /var benötigen, müssen wir diese Verzeichnisse über Speicher-Dateisysteme (memory backed file system) einbinden.

# chroot ${NFSROOTDIR}
# mkdir -p conf/base
# tar -c -v -f conf/base/etc.cpio.gz --format cpio
--gzip etc
# tar -c -v -f conf/base/var.cpio.gz --format cpio
--gzip var

Bei Starten werden die Speicher-Dateisysteme für /etc und /var erstellt und eingehangen und der Inhalt der cpio.gz-Dateien in diese hinein kopiert.

32.8.8. Konfiguration des PXE-Clients und Fehlersuche bei Verbindungsproblemen

  1. Sobald die Client-Maschine startet, gehen Sie in die BIOS-Einstellungen und konfigurieren Sie den Start über das Netzwerk (boot from network). Sind Ihre bisherigen Konfigurationsschritte korrekt, sollte alles funktionieren.

  2. Benutzen Sie den net/wireshark Port zur Fehlersuche im Netzwerkverkehr von DHCP und TFTP.

  3. Stellen Sie sicher, dass Sie die pxeboot-Datei über TFTP herunterladen können. Schauen Sie in /var/log/xferlog auf Ihrem TFTP-Server und vergewissern Sie sich, dass die pxeboot-Datei von der richtigen Adresse heruntergeladen wurde. Um die obige Konfiguration von /usr/local/etc/dhcpd.conf zu testen, geben Sie folgendes ein:

    # tftp 192.168.0.1
    tftp> get FreeBSD/install/boot/pxeboot
    Received 264951 bytes in 0.1 seconds

    Weitere Informationen finden Sie in tftpd(8) und tftp(1). Die BUGS-Sektionen dieser Seiten dokumentieren einige Einschränkungen von TFTP.

  4. Achten Sie darauf, dass Sie das Root-Dateisystem über NFS einhängen können. Auch hier können Sie Ihre Einstellungen aus /usr/local/etc/dhcpd.conf wie folgt testen:

    # mount -t nfs 192.168.0.1:/b
    /tftpboot/FreeBSD/install /mnt

Wenn Sie Fragen zu FreeBSD haben, schicken Sie eine E-Mail an <de-bsd-questions@de.FreeBSD.org>.

Wenn Sie Fragen zu dieser Dokumentation haben, schicken Sie eine E-Mail an <de-bsd-translators@de.FreeBSD.org>.