[Tutorial] Raspberry Pi als PXE Server

  • Nachdem ich selber einen Raspberry PI als PXE Server nutzen wollte und mich durch diverse Probleme und Artikel gekämpfen hatte, beschloss ich dazu ein Tutorial zu erstellen.
    Grundsätzlich orientieren sich die Informationen an der Anleitung für Bootserver-VM Thread von mrshadowtux . Dennoch sind für Raspbian einige Configs anders.

    Getestet am 26.4.2014 mit Rasbian
    Linux RPI-PXE 3.10.25+ #622 PREEMPT Fri Jan 3 18:41:00 GMT 2014 armv6l GNU/Linux

    SD Karte: 8GB


    Vorgängige Info
    Als Editor wird nano verwendet. In allen Befehlen wo nano vorkommt kann das Wort durch den jeweiligen Editor Namen verwenden.
    Um Schwierigkeiten zu vermeiden wird hier mit nur einem Netz gearbeitet.
    Hier 192.168.1.xx. Bei anderen Netzen ist die Zahl mit der roten Farbe jeweils anzupassen.
    Mit grüner Farbe werden die Anpassungen angezeigt.
    Vor Beginn sollten noch alle Pakete auf den neusten Stand gebracht werden_
    sudo apt-get update
    sudo apt-get upgrade
    sudo apt-get dist-upgrade


    Statische IP Adresse
    Es wird eine fixe IP Adresse benötigt. Als IP Adresse kommt eure IP hinein. Hier lege ich die IP meines RPI als 192.168.1.4 fest. Dafür wird die Datei /etc/network/interfaces editiert.
    sudo nano /etc/network/interfaces

    auto lo
    iface lo inet loopback

    auto eth0
    #iface eth0 inet dhcp
    iface eth0 inet static
    address 192.168.1.4 #IP des Raspberry
    netmask 255.255.255.0
    gateway 192.168.1.1 #IP eures Rauters, häufig 1
    network 192.168.1.0

    allow-hotplug wlan0
    iface wlan0 inet manual
    wpa-roam /etc/wpa_supplicant/wpa_supplicant.conf
    iface default inet dhcp

    Einrichtung des DHCP-Server
    Der DHCP Server wird folgendermassen installiert:
    sudo apt-get install isc-dhcp-server

    Während der Installation wird versucht den DHCP-Server zu starten. Wegen der Standart-Konfiguration erscheint aber eine Fehlermeldung. Darum muss jetzt
    die Konfigurationsdatei /etc/default/isc-dhcp-server angepasst werden:
    sudo nano /etc/default/isc-dhcp-server

    Darin wird folgende Zeile verändert:
    INTERFACES="eth0"

    eth0 ist die Netzwerkschnitstelle des DHCP Servers.
    Jetzt folgt die eigentliche DHCP Konfiguration. Die originale Konfigurationsdatei wird gesichern und eine neue erstellt.
    sudo mv /etc/dhcp/dhcpd.conf /etc/dhcp/dhcpd.conf.orginial
    sudo nano /etc/dhcp/dhcpd.conf

    folgenden Zeilen werden eingefügt:

    Nachdem die Konfigurationsdatei erstellt wurde, wird der DHCP Server neugestartet und ein Reboot gemacht:
    sudo service isc-dhcp-server start
    sudo reboot


    Einrichtung von tftpd-hpa
    Zuerst muss das Paket tftpd-hpa installiert werden:
    sudo apt-get install tftpd-hpa

    Wichtig: Der Service tftpd-hpa wird hier direkt versucht zu starten was mit einer Fehlermeldung fehlschlägt.
    Das ist nicht weiter schlimm, denn jetzt muss noch die Konfigurationsdatei /etc/default/tftpd-hpa angepasst werden:
    sudo nano /etc/default/tftpd-hpa

    Die Datei /etc/default/tftpd-hpa wird folgendermassen angepasst :

    # /etc/default/tftpd-hpa

    TFTP_USERNAME="tftp"
    TFTP_DIRECTORY="/srv/tftp"
    TFTP_ADDRESS="0.0.0.0:69"
    TFTP_OPTIONS="--secure --ipv4"

    Der TFTP-Server erwartet in der Voreinstellung einen IPv6-Socket, was zunächst zu
    einer Fehlermeldung führt. Darum muss hier der Eintrag --ipv4 hinzugefügt werden.
    Danach wird tftpd-hpa neugestartet:
    sudo service tftpd-hpa start


    Einrichten des NFS-Servers
    Damit der Netzwerkstart von Rettungssystemen funktioniert muss der RasPi die Möglichkeit haben, Verzeichnisse über NFS im Netz bereitzustellen.
    sudo apt-get update
    sudo apt-get install nfs-kernel-server

    Die Warnung danach kann getrost ignoriert werden. Sie kommt daher, dass in der Datei /etc/exports noch keine Freigaben definiert sind.
    Wir erstellen den Ordner /srv/nfs .An dieser Stelle werden die Dateisysteme der Clients hinterlegt.
    cd /srv/
    sudo mkdir nfs

    Die Datei /etc/exports wird jetzt folgendermassen angepasst.
    sudo nano /etc/exports

    /srv/nfs 192.168.1.0/24(ro,sync,no_root_squash,no_subtree_check)

    Erklärung:
    Die Konfiguration ist für Clients des Netzwerk 192.186.1.0
    ro (read only): Der Client kann im exportierten System nur lesen
    sync: Synchroner Datentransfer
    no_root_squash: Root Benutzer eines Clients darf mit root Erlaubnis schreiben
    no_subtree_check: Ausschalten des Subtree-Checking. Nur wenn komplettes Dateisystem freigegeben
    Weiter Optionen unter NFS Ubuntu Wiki

    Dienste:
    Jetzt müssen 3 installierte Dienste aktiviert werden. Zuerst muss aber in der Datei /etc/netconfig die ipv6 Unterstützung deaktiviert werden:
    sudo nano /etc/netconfig
    Die Zeilen mit udp6 und tcp6 werden durch Voranstellen von # auskommentiert.
    Danach starten wir die 3 Dienste:
    sudo service rpcbind start
    sudo service nfs-common start
    sudo service nfs-kernel-server start

    Der Befehl sudo showmount -e zeigt unser freigegebenes Verzeichniss an also /srv/nfs für 192.168.1.0/24.

    Leider werden die Dienste rpcbind und nfs-common nicht automatisch gestartet. Darum müssen noch folgende Anpassungen gemacht werden:

    Bestehende Skripte löschen:
    Zuerst müssen bestehende Skripte gelöscht werden und mit überprüft ob gewisse Skripte manuell gelöscht werden müssen:
    sudo insserv -r nfs-kernel-server
    find /etc/rc* -name *nfs-kernel-server

    sudo insserv -r nfs-common
    find /etc/rc* -name *nfs-common

    sudo insserv -r rpcbind
    find /etc/rc* -name *rpcbind

    Falls ein Skript nicht automatisch gelöscht wurde und mit "find" gefunden wurde kann es folgendermassen gelöscht werden:
    sudo rm -f "pfad zur datei"
    Danach sollte nochmals mit "find" eine Überprüfung durchgeführt werden.

    Skripte neu anlegen
    sudo insserv rpcbind
    sudo insserv nfs-common
    sudo insserv nfs-kernel-server

    Mit "find" kann wiederum überprüft werden ob für Start und Kill Skripte vorhanden sind.

    Jetzt muss der RPI noch neugestartet werden mit
    sudo reboot


    Einrichtung des PXE Server (Syslinux)
    Jetzt wird das Packet syslinux-common installiert und danach werden die benötigten Dateien aus dem Syslinux-Installationsverzeichnis ins TFTP-Verzeichnis kopiert. Für die PXE Konfigurationsdateien muss noch ein neues Verzeichniss pxelinux.cfg im TFTP-Hauptverzeichnis erstellt werden.

    sudo apt-get install syslinux-common
    sudo cp /usr/lib/syslinux/chain.c32 /usr/lib/syslinux/menu.c32 /usr/lib/syslinux/vesamenu.c32 /usr/lib/syslinux/pxelinux.0 /srv/tftp/
    sudo mkdir /srv/tftp/pxelinux.cfg

    Nun wird eine simple config Datei erstellt, welche von allen Clients geladen wird wenn keine MAC-Adresse spezifische config gefunden wird.
    sudo nano /srv/tftp/pxelinux.cfg/default

    In die Datei /srv/tftp/pxelinux.cfg/default wird folgendes eingetragen:

    DEFAULT vesamenu.c32
    PROMPT 0
    TIMEOUT 300
    MENU TITLE PXE Network Boot Menu

    LABEL local
    MENU LABEL Von Festplatte starten
    MENU DEFAULT
    LOCALBOOT 0

    Wenn gewünscht kann ein Hintergrundbild gesetzt werden. Das Bild muss eine Auflösung von 640x480 haben und idealerweise im JPG-Format sein. Das Bild kommt nach /srv/tftp/ und in der /srv/tftp/pxelinux.cfg/default muss noch folgender Eintrag gemacht werden
    MENU BACKGROUND dateiname.jpg


    Memtest86+
    Da Raspbian wegen der ARM Architektur keinen Memtest von zu Hause aus mit sich bringt muss dieser für das PXE Menu heruntergeladen werden.
    Dazu wird wird ein neues Verzeichnis erstellen und memtest86+ gedownloadet.
    cd /srv/tftp/
    sudo mkdir memtest86+
    cd memtest86+
    sudo wget http://www.memtest.org/download/4.20/memtest86+-4.20.bin.gz

    Die Datei wird entpackt :
    sudo gzip -d memtest86+-4.20.bin.gz

    Die Endung .bin muss entfernt werden damit memtest über das Netwerk gebootet werden kann.
    sudo mv memtest86+-4.20.bin memtest86+-4.20

    Die Datei /srv/tftp/pxelinux.cfg/default wird um folgendes ergänzt:
    sudo nano /srv/tftp/pxelinux.cfg/default

    LABEL memtest86+
    MENU LABEL Speichertest mit memtest86+ v4.20
    KERNEL memtest86+/memtest86+-4.20


    Abschliessendes für den ersten Teil
    Jetzt muss der RPI noch neugestartet werden mit
    sudo reboot
    Auf den Clients muss jetzt PXE Boot aktiviert und beim Booten ausgewählt werden. Danach sollte es folgendermassen aussehen:

    Wir haben jetzt folgende Verzeichnisstruktur:
    /srv/tftp/ ist das Rootverzeichnis des tftp-Servers. Hier werden die Kernel bzw. die zu bootenden Daten hinterlegt. Des Weiteren beinhaltet dieses Verzeichnis das Konfigurationsverzeichnis pxelinux.cfg.
    /srv/tftp/pxelinux.cfg/ ist das Konfigurationsverzeichnis. Darin muss die Datei default enthalten sein.
    /srv/nfs/ ist das Rootverzeichnis des Clients. An dieser Stelle werden die Dateisysteme der Clients hinterlegt.


    MS DOS 6.22 Bootdisk
    Zuerst muss das Programm memdisk von /usr/lib/syslinux/ nach /srv/tftp/ kopiert werden.
    sudo cp /usr/lib/syslinux/memdisk /srv/tftp/memdisk

    Neues Verzeichnis erstellen und ima Datei downloaden.
    cd /srv/tftp/
    sudo mkdir msdos622
    cd msdos622
    sudo wget http://www.pixelbanane.de/yafu/2114918939/dos622boot.IMA
    cd ..

    Die Datei /srv/tftp/pxelinux.cfg/default wird um folgendes ergänzt:
    sudo nano /srv/tftp/pxelinux.cfg/default

    LABEL msdos622
    MENU LABEL MS-DOS 6.22 Bootdisk
    KERNEL memdisk
    APPEND raw initrd=msdos622/dos622boot.IMA

    LABLE muss der Name des Ordners wo die img Datei liegt, hier msdos622, sein.
    Bei initrd muss der Pfad der img Datei relativ zur default Datei angegeben werden.
    Jetzt muss der RPI noch neugestartet werden mit
    sudo reboot


    Norton SI
    Hier richten wir eine Bootdisk mit Norton SI und MSD ein.
    Neues Verzeichnis erstellen und ima Datei downloaden (memdisk muss vorhanden sein, siehe oben).
    cd /srv/tftp/
    sudo mkdir nortonsi
    cd nortonsi
    sudo wget http://www.pixelbanane.de/yafu/2371754617/NortonSIboot.IMA
    cd ..

    Die Datei /srv/tftp/pxelinux.cfg/default wird um folgendes ergänzt:
    sudo nano /srv/tftp/pxelinux.cfg/default

    LABEL nortonsi
    MENU LABEL Norton SI + MSD auf Bootdisk
    KERNEL memdisk
    APPEND raw initrd=nortonsi/NortonSIboot.IMA

    Jetzt muss der RPI noch neugestartet werden mit
    sudo reboot


    FreeDOS 1.1 Setup
    Neues Verzeichnis erstellen und iso Datei downloaden (memdisk muss vorhanden sein, siehe oben).
    cd /srv/tftp/
    sudo mkdir freedos
    cd freedos
    sudo wget http://www.freedos.org/download/download/fd11src.iso
    cd ..

    Die Datei /srv/tftp/pxelinux.cfg/default wird um folgendes ergänzt:
    sudo nano /srv/tftp/pxelinux.cfg/default

    LABEL freedos
    MENU LABEL FreeDOS 1.1 Setup
    KERNEL memdisk
    APPEND iso initrd=freedos/fd11src.iso

    Jetzt muss der RPI noch neugestartet werden mit
    sudo reboot


    Damn Small Linux (DSL) 4.4.10 Live CD
    Neues Verzeichnis erstellen und iso Datei downloaden.
    cd /srv/tftp/
    sudo mkdir dsl
    cd dsl
    sudo wget http://distro.ibiblio.org/damnsmall/curr…4.10-initrd.iso

    Jetzt müssen wir das Image mounten und die benötigen Dateien kopieren:
    sudo mount -o loop dsl-4.4.10-initrd.iso /mnt
    sudo cp /mnt/boot/isolinux/linux24 /mnt/boot/isolinux/minirt24.gz /srv/tftp/dsl/

    Nachdem alle Dateien kopiert wurden wird das iso Image wieder ausgehängt und gelöscht:
    sudo umount /mnt
    sudo rm /srv/tftp/dsl/dsl-4.4.10-initrd.iso

    Die Datei /srv/tftp/pxelinux.cfg/default wird um folgendes ergänzt:
    sudo nano /srv/tftp/pxelinux.cfg/default

    LABEL dsl
    MENU LABEL Damn Small Linux 4.4.10 Live CD
    KERNEL dsl/linux24
    APPEND initrd=dsl/minirt24.gz ramdisk_size=100000 init=/etc/init lang=de quiet vga=791

    Jetzt muss der RPI noch neugestartet werden mit
    sudo reboot

    Anmerkung: Das Laden über PXE dauert eine Weile und es wird kein Bootbild angezeigt. Der Client hat sich also nicht aufgehängt, wenn das PXE Bootmenü länger stehen bleibt. Einfach Geduld haben.


    Debian 6.0.9 Netinstall
    Neues Verzeichnis erstellen und iso Datei downloaden:
    cd /srv/tftp
    sudo mkdir debian
    cd debian
    sudo wget http://ftp.debian.org/debian/dists/s…ller/i386/linux
    sudo wget http://ftp.debian.org/debian/dists/s…/i386/initrd.gz

    Die Datei /srv/tftp/pxelinux.cfg/default wird um folgendes ergänzt:
    sudo nano /srv/tftp/pxelinux.cfg/default

    LABEL debian
    MENU LABEL Debian 6.0.9 Netinstall
    KERNEL debian/linux
    APPEND initrd=debian/initrd.gz

    Jetzt muss der RPI noch neugestartet werden mit
    sudo reboot


    GParted Live 0.18.0-2 i486
    Im Gegensatz zum empfohlenen HTTP Server benützen wir unseren NFS Server, der installiert sein muss (siehe oben).
    Neues Verzeichnis erstellen und iso Datei downloaden.
    cd /srv/tftp/
    sudo mkdir gparted
    cd /srv/nfs/
    sudo mkdir gparted
    cd gparted
    sudo mkdir live
    sudo wget -O gparted-live-0.18.0-2-i486.iso "http://sourceforge.net/projects/gpart…86.iso/download" #Gänsefüschen nicht vergessen!

    Jetzt müssen wir das Image mounten und die benötigen Dateien kopieren:
    sudo mount -o loop gparted-live-0.18.0-2-i486.iso /mnt
    sudo cp -a /mnt/live/initrd.img /mnt/live/vmlinuz /srv/tftp/gparted/
    sudo cp -a /mnt/live/initrd.img /mnt/live/vmlinuz /srv/nfs/gparted/
    sudo cp -a /mnt/live/filesystem.squashfs /srv/nfs/gparted/live

    Nachdem alle Dateien kopiert wurden wird das iso Image wieder ausgehängt und gelöscht:
    sudo umount /mnt
    sudo rm /srv/nfs/gparted/gparted-live-0.18.0-2-i486.iso

    Die Datei /srv/tftp/pxelinux.cfg/default wird um folgendes ergänzt:
    sudo nano /srv/tftp/pxelinux.cfg/default

    LABEL gparted
    MENU LABEL GParted Live i486
    KERNEL /gparted/vmlinuz
    APPEND initrd=gparted/initrd.img boot=live noswap noprompt nosplash vga=788 netboot=nfs nfsroot=192.168.1.4:/srv/nfs/gparted --


    antiX
    basiert auf Debian Testing
    3.14.1 custom kernel
    Läuft unter PII,PIII, min RAM = 64 - 128MB
    Infos unter: http://antix.mepis.org/index.php?title=Main_Page


    Kaspersky Rescue Disk 10
    cd /srv/tftp
    sudo mkdir kaspersky
    cd kaspersky
    sudo wget http://rescuedisk.kaspersky-labs.com/rescuedisk/upd…v_rescue_10.iso

    to be continued....


    Grml Live Linux
    Weitere Infos unter Booting Grml without grml-terminalserver


    PXE Bootdisk für ältere Clients ohne PXE fähige Netzwerkkarte
    Weiter Infos unter: http://www.syslinux.org/wiki/index.php…ith_PXELINUX.3F

    MS DOS 6.22 Installation (Floppy)

    Für Windows und weitere Linux Distributionen verweise ich gerne auf den schon oben erwänten Thread von mrshadowtux.

    KOMMT BALD, Ich werde dieses Tutorial laufend ergänzen.

  • Auf welche Distribution bezieht sich das auf dem Pi? Raspbian? Danke für das Tutorial, an sowas hatte ich auch schon gedacht, meinen zweiten Pi zu verwenden. Bisher hatt ich nur noch keine Zeit das zu machen.

  • Ja ist Raspbian ;). Würde ich auch empfehlen. Falls du zB den Fedora Remix benutzt gibt es ein paar Sachen die anders sind. Grundsätzlich ist das Vorgehen aber das Gleiche.
    Wenn jemand eine speziellen Wunsch hat kann ich das bei bedarf auch noch ins Tutorial einbinden.

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!