Schnelle PXE Server Anleitung auf dem RasPi
**** Anleitung ist BETA - ich muß nochmal in ruhe drüber schauen -- Feedback durchaus erwünscht****
Hallo zusammen,
kurz ein wenig über mich. Ich bin hier meist nur lesend unterwegs und dann meist auch im Bereich Storage und Server. Ich habe beruflich seit etwa 20 Jahren mit IT zu tun und war lange Zeit (~15 Jahre) nur im Windows Lager unterwegs, bin aber sozusagen "fließend" in die Linux-Ecke abgewandert. Praktisch mit Win 7 habe ich mich privat bis auf einen einzigen Rechner völlig von Windows gelöst.
Ich bin zumeist bei den Meisterkühlern aktiv, man findet mich dort unter dem Usernamen "spokekiller".
Ich will heute meine Erkenntnisse zum Aufbau und Betrieb eines PXE Bootservers auf einem Raspberry Pi hier ausbreiten. Ich erhebe nicht den Anspruch auf "die beste Lösung" sondern einzig, daß ich - und meine Ansprüche sind sicher nicht gering - eine für mich sehr gut pflegbare und leicht reparable Lösung gefunden habe, die auf dem Raspi sogar erstaunlich flink ist.
Was sollte man schon können / haben?
- je mehr Linuxkenntnisse desto besser -- wobei wir hier nicht in die Tiefen der DHCP Server gehen, aber Paketinstallation, SUDO etc. sollten Euch ein Begriff sein
- einen frei verfügbaren Raspberrypi oder Cubieboard o.ä. mit einem Debian-basierten Linux (Raspbian, Lubuntu, Debian Wheezy o.ä.) -- getestet habe ich auf Raspbian Wheezy und Ubuntu 12.04 (dürfte sicher aber auch mit 14.04 gehen)
- einen existierenden DHCP Server -- das kann oder sollte Euer Router sein. An dessen Konfig müßt Ihr für PXE nichts ändern.
- Einen Test-Client (zweiter Rechner), der über eine Netzwerkkarte mit BootROM verfügt, bzw einem PXE Stub, was heute so zuiemlich bei jedem Gerät der mindestens letzten 5 Jahre der Fall sein sollte. Ihr müßt ggf Euer BIOS umstellen, um "Boot via PXE" oder "Boot via Network" zu aktivieren. Kleine Anmerkung: Wirelesskarten gehen nicht. Es muß kabelgebunden sein (kann sein, daß es das gibt, aber ich habe es noch nie gesehen oder gelesen)
- Ein wenig Zeit und etwas mehr Geduld
PXE, so heißt das Preboot eXecution Environment, mit dem wir uns hier befassen - werde ich nicht näher erklären. Allerdings hilft es, ein wenig zu verstehen, wie es grundsätzlich funktioniert. Das Netz ist in diesem Falle Euer Freund.
So, los gehts. Zugegeben hat mich das Thema damals einige graue Haare gekostet, da ich damals der sonst von mir so geliebten C'T gefolgt bin (Ausgabe 15/2012, S.154f) und deren Anleitung war sogar teilweise schlicht falsch -- das kann vorkommen, hat mich aber dennoch sehr geärgert.
Benötigte Pakete:
nfs-kernel-server
nfs-common
syslinux-common
dnsmasq
Bootimages, bspw c't desinfect oder Ubuntu
Warum kein TFTP? TFTP Pakete, wie den so oft genutzten tftp-hpa, brauchen wir gar nicht, da wir in dnsmasq den internen TFTP aktivieren.
Auf NFS könnten wir auch erst mal verzichten, aber es macht Sinn, das gleich zu erledigen, weil wir es spätestens für größere Images brauchen werden und es auch schneller ist. Aber das wird aus dem Hergang bzw der Beispielkonfig klarer.
Man braucht im Wesentlichen nur einmal ein Grundgerüst aufbauen, dann kann man das beliebig erweitern. Das eigentlich Schwierige ist an sich, zu wissen, wie man CDs oder DVDs PXE-bootfähig "macht". So ist es (stark) unterschiedlich, ob man ein ubuntu_live oder einen clonezilla booten will. Zumeist finden sich Anhaltspunkte auf der jeweiligen Supportseite, bzw via google. Wenn man das aber einmal verstanden hat, dann ist es meist nicht schwer, neue Images einzubinden.
Für diese Anleitung liegen unsere PXE-images und alle dafür notwendigen configs unter /srv/pxe (kann beliebig gewählt werden, lediglich die Struktur darunter muß so heißen wie hier beschrieben).
Außerdem ist "der Server" in unserem Falle der Raspi und "der Client" das Testgerät, das das Image booten soll.
Auf dem Server zunächst alle Pakete installieren. Wenn Ihr nicht wißt, wie das geht, dann rate ich dringend das Wissen dafür ggf bei wiki.ubuntuusers.de o.ä. einzuholen und dann erst über Dinge wie PXE nachzudenken.
Ordnerstruktur / Config-Files
Für den nfs-kernel-server die Datei /etc/exports um diese Zeile ergänzen. Davor fährt er nicht hoch, da er keine "Shares" konfiguriert findet:
/srv/pxe 192.168.200.0/24(ro,no_subtree_check)
Ihr müßt die obige Netzwerkrange entsprechend Eures Aufbaus anpassen /24 ist dabei eine andere Ausdrucksweise für ein volles Class-C subnet (hier: 192.168.200.1-192.168.200.254, mit .255 als Broadcast Adresse).
Diese NFS-Konfiguration ist recht offenherzig. Da das System aber keine crosslinks ins übrige Filesystem enthält (das würde auch nicht tun, wegen Securityfeatures des nfs servers) ist das an sich problemlos. Außerdem ist der export nur RO, als "nur lesen".
Syslinux-common stellt diverse Dinge bereit, die man für das Errichten einer Boot-Umgebung braucht. Unterhalb von /srv/pxe kann man nun beginnen, das erwähnte Grobgerüst zu erstellen.
Dazu suchen wir uns diese Dateien zusammen (auf dem aktuellen System jetzt zu finden, bspw unter /usr/lib/syslinux/):
- memdisk
- menu.c32 (optional vesamenu.c32)
- pxelinux.0
... und kopieren diese direkt unter /srv/pxe.
Außerdem setzen wir für den Anfang für alle Dateien unterhalb /srv/pxe die Berechtigung 777, damit es nicht zu Zugriffsproblemen kommt. Es sollte allerdings auch mit 644 gehen. Ich habe mir in meinem privaten Netz nie die Mühe gemacht das so eng zu sehen.
Code:
sudo chmod -R 777 /srv/pxe
Sodann erstellt man unter /srv/pxe das Verzeichnis
Und bitte aufpassen! Das Dir soll wirklich "wie eine Datei" heißen.
Unterhalb/innerhalb desselben erstellt man dann eine Textdatei namens "default". In dieser ist die eigentliche Bootkonfiguration enthalten.
Ein Beispiel für eine funktionierende (alte) Datei ist:
Code:
DEFAULT menu.c32
ALLOWOPTIONS 0
PROMPT 0
TIMEOUT 0
MENU TITLE Server PXE Boot Menu
LABEL desinfect2012
MENU LABEL ^desinfect2012
KERNEL desinfect/casper/vmlinuz
APPEND boot=casper initrd=desinfect/casper/initrd.lz netboot=nfs nfsroot=192.168.100.44:/srv/pxe/desinfect quiet splash -- debian-installer/language=de console-setup/layoutcode?=de
label ubuntu12.04_live_i386
menu label ^Ubuntu 12.04 Live i386
kernel 1204live/casper/vmlinuz
append boot=casper initrd=1204live/casper/initrd.lz netboot=nfs nfsroot=192.168.100.44:/srv/pxe/1204live ro file=/cdrom/preseed/ubuntu.seed locale=de_DE bootkbd=de console-setup/layoutcode=de --
LABEL Clonezilla i686
MENU LABEL Clonezilla Live 1.2.12 for i^686
KERNEL clonezilla686/live/vmlinuz
APPEND initrd=clonezilla686/live/initrd.img boot=live union=aufs config noswap nolocales noprompt edd=on nomodeset ocs_live_run="ocs-live-general" ocs_live_extra_param="" ocs_live_keymap="" ocs_live_batch="no" ocs_lang="" vga=788 nosplash noprompt fetch=tftp://192.168.100.44/pxe/clonezilla686/live/filesystem.squashfs nfsroot=192.168.200.44:/srv/pxe/clonezilla686
LABEL Clonezilla i486
MENU LABEL Clonezilla Live 1.2.12 for i^486
KERNEL clonezilla486/live/vmlinuz
APPEND initrd=clonezilla486/live/initrd.img boot=live union=aufs config noswap nolocales noprompt edd=on nomodeset ocs_live_run="ocs-live-general" ocs_live_extra_param="" ocs_live_keymap="" ocs_live_batch="no" ocs_lang="" vga=788 nosplash noprompt fetch=tftp://192.168.100.44/pxe/clonezilla486/live/filesystem.squashfs nfsroot=192.168.100.44:/srv/pxe/clonezilla486
LABEL UBCDcustom
MENU LABEL Ultimate BootCD w/ WDIDLE 1.05
KERNEL menu.c32
APPEND ubcd/menus/syslinux/main.cfg
# MS-DOS Loader for Wdidle 1.00
LABEL WD Idle v1.00
MENU LABEL WD Idle v1.00 Floppy image
KERNEL memdisk
APPEND initrd=wdidle100_floppy.img vga=1
Die Pfade, bspw zum NFS-Server, können/müssen natürlich angepaßt werden. Dabei ist zu beachten, daß der NFS-Server wohl immer den vollen Pfad braucht.
Den Bootvorgang selbst kann man wunderbar im syslog beobachten. Ich denke die default-config oben zeigt auch recht eindeutig, wie alles zurecht zu biegen ist. Die meisten Fehler über diese wenigen Schritte hinaus habe ich durch falsche Pfade verursacht.
Ohne Eingriffe in den DHCP - wie geht das?
Um nicht in den DHCP Server eingreifen zu müssen werden wir dnsmasq nutzen, welches einen DHCP-Proxy mit "sexy" Zusatzfeatures bereitstellt. DNSMASQ hat den Vorteil, daß man den DHCP-Päckchen noch extra Optionen mitgeben oder unterschieben kann. Die config für dnsmasq passen wir an, indem wir unter /etc/dnsmasq.d/ eine Datei "pxedefault" mit nachfolgendem Inhalt anlegen. Diese stellt das ABSOLUTE MINIMUM dar.
Code:
port=0
log-dhcp
enable-tftp
[B]tftp-root=/srv/pxe[/B] <<---- hier war ein Fehler, korrigiert am 18.12.2014
dhcp-range=192.168.100.0,proxy
pxe-service=X86PC,"dummy",pxelinux
Man muß in diesem Setup an /etc/dnsmasq.conf NICHTS anpassen, weil wir den tftp und die relay options schon in pxedfault gesetzt haben.
Und das wars im Prinzip schon. Wie ich schon oben schrieb, die eigentliche Schwierigkeit liegt im "Image". Man kann aber einfach mal anhand der obigen Beispieldatei spielen. Wichtig ist es m.E., einmal erfolgreich zu booten und den Bootvorgang parallel dazu im Syslog zu verfolgen.
Es ist mir durchaus bewußt, daß man damit nur das absolute Minimum aufgezeigt hat. In dnsmasq und co stecken noch eine Menge andere tolle Features. Man kann u.a. auch konfigurieren, daß Rechner, deren MAC-Adressen einem bestimmten String entsprechen ein eigenes Image "zwangsegebootet" bekommen. Aber es ist jetzt erst mal wichtig die Grundlagen zu verstehen. Die meisten der tollen Features braucht man in einem Heimnetz wohl so gut wie nie.
Aber ich schwafele....
Der letzte Schritt dürfte ein Reboot des Raspi sein. Bevor wir das machen, noch ein "Known Issue", das wohl oft auftritt.
Unter raspbian hatte ich beim Start des nfs-kernel-servers diese Warnmeldung:
Code:
[warn] Not starting: portmapper is not running ...o (warning).
... und damit startet der NFS-Server dann nicht.
Das Urproblem ist, daß der nfs daemon unter raspbian nicht sauber durchkonfiguriert ist/war. Das kann so behoben werden:
Code:
sudo update-rc.d rpcbind enable
sudo update-rc.d nfs-common enable
sudo /etc/init.d/rpcbind start
sudo /etc/init.d/nfs-kernel-server restart
So. Dann der Einfachheit halber noch schnell rebooten und danach schauen, ob alles funktioniert.
Wie? Was jetzt? Schon fertig? Ja schon fertig.
Für die Novizen jetzt: den Client ins physisch gleiche Netz hängen wie den Server, kalt hochfahren und bspw F12 für "Boot via Network" drücken. Jetzt MUSS der PXE Stub der Netzwerkkarte erscheinen und ihr seht, wie er versucht eine NEtzwerkadresse zu bekommen.
Kurz danach sieht man das "dummy" aufflackern, was dann gleich darauf ins PXE-Menü umleitet.
Ihr könnt für den Anfang auch einfach die Menuedatei von oben nehmen, auch ohne die Images. Ein echter Bootvorgang wird Euch dann immerhin bis zum Menue bringen.
All diese Schritte sieht man ausgiebig im syslog... dort erscheint die gesamte DHCP-Kontaktaufnahme und Ihr könnt schön sehen, was da genau passiert.
Solltet Ihr noch Fragen haben oder sollte ich mich in der Hektik verhaspelt haben, dann meldet Euch bitte bei mir. Ich helfe gerne, soweit es meine Zeit zuläßt.