Leserartikel Netzwerkboot mit PXE

Gamienator

Lt. Junior Grade
Registriert
Apr. 2011
Beiträge
495
HowTo zum einrichten einer Bootumgebung in Debian mit Beispielen zum Einfügen verschiedener Images​


Inhaltsverzeichnis:




Einleitung


Mit diesem HowTo möchte ich ein Thema anschneiden, dass mir sehr viel Zeit und auch Nerven gekostet hat. Dieses System hat bestimmt jeder von euch schon einmal gesehen, sei es in der Schule oder auf der Arbeit. Neben den gängigen Methoden wie DVDs oder USB Sticks kann ein Betriebssystem auch über das Netzwerk bereitgestellt werden. In der Theorie mag dies einfach sein, jedoch habe ich mehrere Jahre gebraucht um ein funktionierendes Bootsystem zu erstellen, ob es jetzt an mangelnden deutschen Anleitungen oder an der fehlenden Lebenserfahrung lag möchte ich jetzt mal nicht thematisieren. :D Das Endergebnis ist für mich aber einfach großartig: Ich brauche mir keine Sorgen mehr zu machen wegen DVD Images, USB Sticks usw. Will ich ein Betriebssystem starten/installieren überlasse ich meinem Netzwerk die Arbeit. Und wie das möglich ist zeige ich euch in diesem HowTo.

Jeder User ist willkommen hier beizutragen oder Fehler zu korrigieren! Dafür gibt es ja den Diskussionsthread. Sollte ich Begriffe wie Bootloader etc. falsch in Verbindung gebracht haben sagt es ruhig, aber bitte in einem angemessenen Ton! Ich selber nutze auch nicht Linux täglich und da kann es mal passieren, dass man einen Begriff durcheinander wirft.


Aufbau


Der Aufbau ist wie folgt: Als erstes möchte ich über die Grundvoraussetzungen reden. Anschließend zeige ich euch, wie ihr in Debian alles benötigte einrichtet um euer Netzwerk die Systeme anbieten zu können inkl. kleiner Erläuterungen für die Konfigurationsdateien. Als letztes gebe ich euch dann Beispiele, wie ihr folgende Systeme einbindet:

  1. Lokaler Festplattenstart
  2. memtest 86+
  3. Debian 7 Netzwerkinstallation
  4. Linux Mint Live DVD
  5. GParted
  6. Windows Installationsumgebung

Kleine Linux Kenntnisse sind hier von Vorteil! (Zum Beispiel der Aufbau des Speichersystems, das es nicht wie in Windows unter verschiedenen Buchstaben abgespeichert wird). Dieses HowTo soll aber auch dazu dienen, dass jeder eine Bootumgebung einrichten kann, deshalb versuche ich jeden Befehl zu erläutern.

Wenn ich sage, bearbeite Datei /etc/blablabla.conf ist es euch überlassen, mit welchem Editor es macht. Erfahrene Linuxer nehmen vi oder nano. Eine Änderung der Textdateien unter Windows ist z. B. über das kostenlose WinSCP möglich. WinSCP eignet sich hervorragend, da auch Dateien einfach übertragen werden können. Und für Linux Neulige aus der Windows Welt gibt es auch noch den Hinweis: Im Gegensatz zu Windows ist es bei Linux nicht nötig bei jeder Datei eine Endung wie z.B. .txt zu haben. Das bedeutet z. B. im Ordner /tftpboot/pxelinux.cfg liegt die Datei default

Dieses HowTo ist aber nicht gedacht, einfach blind jeden Befehl abzutippen! Ich versuche jeden Schritt zu erklären, welche Auswirkung es hat etc. Bitte nehmt euch die Zeit und liest es in Ruhe einmal durch!


Grundlegendes


Für diese Technik wird das Protokoll PXE (Preboot Execution Environment) verwendet und benötigt zwei Dinge:

  1. Einen DHCP Server
  2. Einen TFTP Server

Dabei ist der Ablauf recht simpel. Beim Hochfahren fragt die Netzwerkkarte, ob es einen PXE-Boot Server gibt und wo der zu finden ist. Wenn der DHCP Server die Anfrage beantwortet, lädt die Netzwerkkarte den Bootloader vom TFTP Server in den Arbeitsspeicher. Alles Weitere wird dann vom Bootloader erledigt. Dieses kann über verschiedene Wege realisiert werden, auch Windows DHCP Server sind in der Lage die Anfragen zu beantworten.

Bei TFTP handelt es sich um ein vereinfachtes FTP Protokoll. Es wird nur der Transfer von Daten unterstützt, spezielle Rechtevergabe wie chmod etc. ist bei TFTP nicht vorgesehen.

Ist beides vorhanden, steht alles bereit. Ob es nun auf Windows, Linux oder sogar auf einem Router mit veränderter Firmware liegt ist dabei egal. (Ich nutze meinen Asus RT-N56U mit Custom Firmware, da die DHCP Config angepasst werden kann)


Realisierung in diesem Beispiel


In diesem HowTo erkläre ich euch, wie ihr unter Debian alles einrichtet. Ob dies dabei unter einer VM in VirtualBox / VMWare oder auf richtiger Hardware geschieht, ist dabei euch überlassen! Wichtig ist nur zu wissen, dass der Server vorhanden sein muss, wenn ihr per Netzwerk booten wollt. Also bringt es nichts die VM auf dem Rechner zu haben, auf dem ihr gleichzeitig das Betriebssystem installieren wollt. Wenn ihr euch extra Debian installiert, ist eine grafische Oberfläche nicht notwendig!

Als IP-Adresse verwenden wir ein klassisches privates Netzwerk mit den Adressen 192.168.0.0/24 (Also sind die Adressen 192.168.0.1 – 192.168.0.254 benutzbar).

Die Daten des TFTP Server werden in /tftpboot gespeichert sein


Installieren aller nötigen Pakete


Als erstes wollen wir alle nötigen Pakete installieren. Dieses geschieht ganz einfach mit dem Befehl

Code:
apt-get update
apt-get install dnsmasq syslinux

apt-get ist der Paketverwalter in Linux. Dieser muss immer mit root rechten ausgeführt werden! apt-get update dient dazu, eure Paketlisten zu aktualisieren, mit apt-get install installiert ihr nun die Pakete.

dnsmasq ist ein mächtiges Tool und stellt alles bereit was wir brauchen! DHCP und TFTP Server in einem. Somit ist bei der richtigen Konfiguration alles möglich.

syslinux ist ein Bootloader. Aus diesem Paket werden einige Dateien benötigt, um ein passendes Bootmenü erstellen zu können.


Einrichten von dnsmasq


Beim Einrichten von dnsmasq gibt es zwei Möglichkeiten: Es gibt bereits einen DHCP Server im Netzwerk (z. B. im Router) oder nicht. Da sich zwei DHCP Server im selben Netzwerk gar nicht leiden können, müssen wir dnsmasq anders konfigurieren, ich zeige euch nun die zwei Möglichkeiten:

dnsmasq ohne vorhandenem DHCP Server im Netzwerk

Die Konfigurationsdatei ist /etc/dnsmasq.conf und sollte ungefähr so aussehen:

Code:
# Disable DNS
port=0
enable-tftp
tftp-root=/tftpboot
dhcp-range=192.168.0.100,192.168.0.254,12h
dhcp-boot=/pxelinux.0,0.0.0.0
pxe-prompt="F8 druecken fuer Bootoptionen", 3
pxe-service=X86PC, "Netzwerkboot", /pxelinux

Code:
# Disable DNS
port=0
sorgt dafür, dass der DNS Dienst von dnsmasq abgeschaltet wird. Solltet ihr keinen DNS Server im Netzwerk haben, kann dieser natürlich aktiviert bleiben!

Code:
enable-tftp
aktiviert den TFTP Server

Code:
tftp-root=/tftpboot
gibt den Speicherort des TFTP Servers an. Dieser kann beliebig gewählt werden, in unserem Beispiel ist es /tftpboot

Code:
dhcp-range=192.168.0.100,192.168.0.254,12h
gibt an, welcher IP-Bereich vergeben werden soll! Mit diesen Einstellungen erhalten Clients eine IP im Bereich 192.168.0.100 und 192.168.0.254. Die 12h geben dabei die Leasetime an.

Code:
dhcp-boot=/pxelinux.0,0.0.0.0
gibt an, welche Datei gebootet werden soll und wo der TFTP Server liegt. Bei der Angabe 0.0.0.0 nimmt dnsmasq an, dass der TFTP Server auf demselben Rechner liegt, wo dnsmasq ausgeführt wird.

Code:
pxe-prompt="F8 druecken fuer Bootoptionen", 3
pxe-service=X86PC, "Netzwerkboot", /pxelinux

An diesem Punkt kann man bereits Bootoptionen einbinden wie Boote, Windows, Linux etc. Dies habe ich hier aber bewusst ausgelassen, da ich im Bootmenu alles regeln möchte. Die ,3 in der ersten Zeile gibt die Wartezeit in Sekunden an, bis die erste Option automatisch ausgewählt wird.

dnsmasq mit bereits vorhandenem DHCP Server

Wenn ein DHCP Server bereits vorhanden ist, muss die Zeile dhcp-range wie folgt aussehen:

Code:
dhcp-range=192.168.0.0,proxy

Der Rest kann aus der oberen Konfiguration entnommen werden! Mit dem Zusatz ,proxy wird dnsmasq zu einem ProxyDHCP. Während der erste DHCP Server Informationen wie IP-Adresse, Gateway etc. vergibt, reagiert dnsmasq nur auf die Anfrage über einen vorhandenen TFTP Server und dessen Bootdatei.


Debian eine fest IP-Adresse zuweisen


Auch wenn ein DHCP Server vorhanden ist, ist es sinnvoll der Debianmaschine eine feste IP-Adresse zuzuweisen! Am einfachsten ist es, wenn ihr direkt eure Konfigurationsdatei ändert. Das ist die /etc/network/interfaces und sieht normalerweise so aus:

Code:
# The loopback interface
auto lo
iface lo inet loopback

# The first network card - this entry was created during the Debian installation
auto eth0
iface eth0 inet dhcp

Die Zeilen mit dem interface lo interessieren uns nicht. Wichtig sind die Zeilen mit eth0. (Wer mehrere Netzwerkkarten hat, wird dementsprechend auch noch eth1, eth2 etc. finden. Passt dies natürlich eurer Umgebung an!) Diese werden dann wie folgt abgeändert:

Code:
iface eth0 inet static
address 192.168.0.10
network 192.168.0.0
broadcast 192.168.0.255
netmask 255.255.255.0
gateway 192.168.0.1
dns-nameservers 192.168.0.1

Code:
address 192.168.0.10
ist dann die von euch festgelegte IP-Adresse des Debian. Die Einträge
Code:
gateway
&
Code:
dns-nameservers
geben an, welche IP-Adressen der Router hat, auch hier bitte dementsprechend eurem Netz anpassen!


Erstellen und kopieren der Bootdateien für TFTP


Jetzt gilt es die Ordnerstruktur und die passenden Dateien zu kopieren. Auch das folgende sollte über root erfolgen:

Code:
mkdir -p /tftpboot/boot tftpboot/pxelinux.cfg
chmod 777 /tftpboot
cp -p /usr/lib/syslinux/pxelinux.0 /tftpboot
cp -p /usr/lib/syslinux/menu.c32   /tftpboot
cp -p /usr/lib/syslinux/memdisk    /tftpboot/boot

Die Befehle machen nun folgendes:

Code:
mkdir -p /tftpboot/boot tftpboot/pxelinux.cfg
erstellt die benötigten Ordner wie in den Angaben der dnsmasq Konfiguration

Code:
chmod -R 777 /tftpboot
sort dafür, dass jeder auf den Ordner zugreifen kann

Code:
cp -p /usr/lib/syslinux/pxelinux.0 /tftpboot
cp -p /usr/lib/syslinux/menu.c32   /tftpboot
cp -p /usr/lib/syslinux/memdisk    /tftpboot/boot

cp ist ein einfacher Kopierbefehl. Mit diesen drei Zeilen habt ihr nun alle nötigen Dateien kopiert.

Erstellen der Konfigurationsdatei zum Booten


Im Ordner /tftpboot/pxelinux.cfg werden die Konfigurationsdateien für den Bootloader abgelegt, dabei kann für jede MAC-Adresse oder IP-Adresse eine eigene Konfiguration angelegt werden! Sollte keine spezielle Konfiguration gefunden werden, wird die datei default verwendet. Ich möchte euch den Bootvorgang mal in einem Bild zeigen:

Code:
/tftpboot/pxelinux.cfg/01-88-99-aa-bb-cc-dd
/tftpboot/pxelinux.cfg/C0A80066
/tftpboot/pxelinux.cfg/C0A8006
/tftpboot/pxelinux.cfg/C0A800
/tftpboot/pxelinux.cfg/C0A80
/tftpboot/pxelinux.cfg/C0A8
/tftpboot/pxelinux.cfg/C0A
/tftpboot/pxelinux.cfg/C0
/tftpboot/pxelinux.cfg/C
/tftpboot/pxelinux.cfg/default

Der Rechner hatte die MAC-Adresse 88:99:aa:bb:cc:dd und bekam die IP-Adresse 192.168.0.102 Als erstes wurde nach einer speziellen MAC-Adressen Einstellung gesucht (dabei wird immer 01- davor geschrieben) Bei Misserfolg sucht er dann nach einer IP-Adressen Einstellung, dabei wird die IP-Adresse in Hexdezimal umgerechnet! Ist es wieder in Misserfolg, zieht er die letzte stelle ab usw. Am Ende lädt er dann die Datei default.

Also erstellen wir uns nun die Datei. Der komplette Pfad ist also /tftpboot/pxelinux.cfg/default und das Grundgerüst der Datei sieht dann so aus:

Code:
DEFAULT menu.c32
PROMPT 0
MENU TITLE CSG PXE Boot Menu
TIMEOUT 100

Code:
DEFAULT menu.c32
sagt aus, dass die Datei menu.c32 geladen werden soll. Diese hatten wir aus dem SYSLINUX Paket kopiert.

Code:
MENU TITLE stellt
die Überschrift ein.

Code:
TIMEOUT
sagt aus, nach wie viel Zeit die erste Zeile ausgewählt werden soll (es kann auch eine andere Zeiel als default markiert werden, aber da sehe ich kaum Sinn dahinter). Bei einem Timeout von 100 von nach 10 Sekunden die Option ausgewählt!

Das war es schon! Der TFTP Server läuft und wenn man einen Rechner per Netzwerk booten will, greift das PXE Protokoll und es kann los gehen. Jedoch wurde kein Image und auch kein Betriebssystem eingebunden. Dies wird alles in der Datei /tftpboot/pxelinux.cfg/default geregelt. Wie ihr einzelne Systeme nun anbindet zeige ich euch.

Am ende möchte ich euch nochmal zeigen, wie eure Ordner dann aussehen sollten:

Beispiel PXE.png


Lokale Festplatte booten


Was im ersten Moment unsinnig erscheint kann am Ende doch hilfreich sein. Um nämlich nicht jedesmal die Bootreihenfolge ändern zu müssen, kann man doch sagen, das bei Inaktivität ganz normal die erste Festplatte starten soll. Dies ist auch das einfachste Image ;) Das einzige was ihr dazu machen müsst, ist eure /tftpd/pxelinux.cfg/default um folgende Zeilen zu erweitern:

Code:
LABEL localhdd1
MENU LABEL Lokaler Boot
LOCALBOOT  0

Code:
LABEL localhdd1
ist der interne Label für menu.c32 und sollte einmalig sowie einfach sein! Umlaute, Sonderzeichen etc. wird gar nicht gern gesehen!

Code:
MENU LABEL Lokaler Boot
stellt ein, was auf dem Bildschirm zu sehen ist.

Code:
LOCALBOOT  0
ist der code, der bei Auswahl ausgeführt wird.


Das Einbinden weiterer Systeme wird in den nächsten Tagen hoffentlich online sein.
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: PERKELE
Ein schönes Tutorial. Ich will in den nächsten tagen meinen Banana Pi einrichten der nur herumliegt.
Gamienator schrieb:
Das Einbinden weiterer Systeme wird in den nächsten Tagen hoffentlich online sein.
Geändert von Gamienator (24.07.2014 um 21:15 Uhr)
Auf deinem screenshot ist eine bootmgr.exe zu sehen, sie wird aber nicht in deinem tutorial erwähnt.
Wenn dein PXE service noch läuft, könntest deine default config oder andere menus mit uns zu teilen?
Die Windows ISO's müssen vermutlich für syslinux enptackt werden?

EDIT:
Meine services laufen. Ich habe diesen Ansatz in der Konfiguration des Syslinux verfolgt:
syslinux.org/wiki/index.php/PXELINUX-Multi-Arch#Distinct_directory_common_kernel_path
Fand ich für moderne Systeme angebrachter. Mein neuer PC ist leider noch nicht fertig. Der Skylake i7 ist im augenblick nur für 100€ extra zu bekommen. Mein alter PC ist ein AMD von 2009. Also kann ich im augenlick nur die Bios varionate von Syslinux testen. Ich schaffe es aber nicht die Imeges richtig zu laden. Es treten beim starten Fehler auf.

EDIT2:
Bis jetzt funktioniert bei mir nur die Debian/Ubuntu Netinstaller.
Ich verweise auf das Menü von Debian
Die "::" stehen für das Wurzelverzeichnis des tftp servers.
Die Pfade in den configs von debian wurden von mir auch manipuliert damit es funktioniert.
Überall wurde ein "::boot/debian_jessie/" hinzugefügt.
Das steht in meiner default config:
Code:
LABEL debian netinstall
  MENU LABEL debian jessie netinstall
  KERNEL vesamenu.c32
  APPEND ::boot/debian_jessie/debian-installer/amd64/pxelinux.cfg/default

Als nächstes kommt clonezilla dran.
 
Zuletzt bearbeitet:
Zurück
Oben