32.8. Plattenloser Betrieb mit PXE

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

Das Intel® Preboot eXecution Environment (PXE) erlaubt es dem Betriebssystem über das Netzwerk zu starten. Zum Beispiel kann ein FreeBSD-System, ohne lokale Festplatte, über das Netzwerk gestartet und betrieben werden. Die Dateisysteme werden dabei über einen NFS-Server eingehangen. PXE-Unterstützung steht in der Regel im BIOS zur Verfügung. Um PXE beim Systemstart zu verwenden, müssen Sie im BIOS des Rechners die Option Über das Netzwerk starten aktivieren. Alternativ können Sie während der PC-Initialisierung auch eine Funktionstaste drücken.

Um die notwendigen Dateien für ein Betriebssystem für den Start über das Netzwerk bereitzustellen, benötigt ein PXE-Setup einen richtig konfigurierten DHCP-, TFTP- und NFS-Server, wobei:

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 erhalten hat, lädt es den Bootloader über TFTP herunter und führt diesen anschließend aus. In FreeBSD ist /boot/pxeboot der Bootloader. Nachdem /boot/pxeboot ausgeführt und der FreeBSD-Kernel geladen wurde, wird mit dem Rest der FreeBSD-Bootsequenz, wie in Kapitel 13, FreeBSDs Bootvorgang beschrieben, fortgefahren.

Dieser Abschnitt beschreibt, wie Sie diese Dienste auf einem FreeBSD-System so konfigurieren, sodass andere Systeme FreeBSD über PXE starten können. Weitere Informationen finden Sie in diskless(8).

Achtung:

Wie beschrieben, ist das System, welches diese Dienste bereitstellt, unsicher. Daher sollte es in einem geschützten Bereich des Netzwerks aufgestellt und von anderen Hosts als nicht vertrauenswürdig eingestuft werden.

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

Beigetragen von Craig Rodrigues.
  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}

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

  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.2. 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.3. 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.4. 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.5. 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.6. 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.7. 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>.