Booten vom Netzwerk
__ Das booten eines Betriebssystems oder Installation eines Betriebssystems über einen so genannten "Netzwerk-Boot" wäre eine praktische Sache: So könnte man die Server installieren ohne ein CD-ROM Laufwerk einzubauen, oder man könnte eine "Notfall-Konsole" vom Netzwerk aus starten wenn das Betriebssystem mal kaputt ist um es zu reparieren und seine Daten zu Retten.Mit einem zusätzlichen Webserver lassen sich dann auch komplexe automatisierte Installationen machen.
Hier wollen wir mal Schritt für Schritt beschreiben wie man einen Netzwerkboot einrichtet. __
Übersicht
Für unseren Netzwerkboot braucht es einige Anforderungen, die jedoch in den meisten Fällen nicht sonderlich kompliziert sind. Wie auch immer, durchschnittliche Linux Kenntnisse sollten aber vorhanden sein, was jedoch kein Problem darstellen sollte, da Leute die sich einen Netzwerkboot einrichten wollen, haben zumeist sowieso ein Netzwerk mit Linux als Server.Was wir brauchen für unseren Netzwerkboot:
- Ein Linux (Wir nehmen und empfehlen hier CentOS Linux)
- DHCP Server
- TFTP (Trivial FTP)-, bzw. Booting Server
- Ein, übers Netzwerk bootbarer bootloader (meistens sysLinux)
- ggf. ein Webserver um Konfigurationen und grössere boot-images zu laden
- Ein PC, der von der Netzwerkkarte Booten kann ;-)
Falls der DHCP Server in einer gesicherten Umgebung liegt, bzw. nicht direkt am Internet angeschlossen ist, kann man den TFTP-Server getrost auf der gleichen Maschine wie der DHCP installieren und von diesem aus booten.
Falls nicht, sollte man den TFTP Server nach Möglichkeit auf eine andere Maschine legen. Da TFTP keinerlei Sicherheitsmassnahmen implementiert hat ist dieses Protokoll sehr unsicher.
Der Webserver selbst kann vollständig losgelöst sein, es reicht, wenn man auf diesen Dateien hoch- und über eine HTTP-Adresse die Dateien wieder runter laden kann.
Da man den "Booting-Server" aber ja in der Regel nicht immer braucht, reicht es hier auch mit VMWARE eine Virtuelle Maschine zu erstellen und darauf Linux mit einem TFTP Server und dem Bootimage zu installieren. - Dies haben wir so gemacht bei unseren Tests und hat übrigens prima geklappt! ;-)
Im Nachfolgenden werden wir, soweit möglich auf beide Varianten eingehen: Entweder alles auf einer Maschine, oder ein DHCP-Server und ein TFTP-Server auf getrennten Rechnern, da es sich nur minimal unterscheidet.
Der Vorgang ist dabei relativ simpel: Zuerst holt der Client sich vom DHCP-Server eine IP-Adresse. Dieser gibt dem client die IP und dazu gleich auch noch den Namen der bootloader-Datei: "pxelinux.0" (dies ist der SYSLINUX bootloader).
Der Client holt sich dann über tftp diesen bootloader und lädt ihn.
Der bootloader zeigt dann ganz normal einen Boot prompt an; standardmässig ist dessen Konfiguration in der Datei: "./pxelinux.cfg/default"
Diese default-datei sieht ähnlich aus wie eine ganz normale bootloader-Konfiguration:
SAY Initialisiere Netzwerk-Boot...
PROMPT 1
TIMEOUT 0
DEFAULT install
DISPLAY boot.txt
F1 f1.txt
F2 f2.txt
F3 usw.txt
LABEL install
kernel debian-installer/i386/linux
append vga=normal initrd=debian-installer/i386/initrd.gz --Diese gibt folgendes an:
SAY: Gibt eine Meldung am Bildschirm aus, kurz bevor der Booloader startet
PROMT: Damit wird der "boot:" promt angezeigt oder unterdrückt
TIMEOUT: Gibt die Zeit in 1/10 Sekunden an, nach dieser automatisch der default-kernel gestartet wird; 0 deaktiviert das timeout
DEFAULT: Gibt den default-kernel an
DISPLAY: Definiert eine Datei, die der Bootloader anzeigt; dies kann z.B ein boot-menü sein
F1-F9: Diese Textdateien werden angezeigt, wenn man F1, F2, usw. drückt; so kann man zusätzliche "Hilfeseiten" einbauen
LABEL Definition des Kernels und dessen append-parameter
Hinweis: Auf der SYSLINUX Seite finden sich noch erweiterte Konfigurationsoptionen dieser Datei.
Vorbereitung: Eine einfache Netwerkboot-Umgebung einrichten
Hier installieren wir alles, inkl. Webserver auf dem selben Rechner mit der IP 10.0.0.1
Bevor wir beginnen, sollte noch die firewall (temporär) abgeschaltet werden, um Probleme zu verhindern. - Klappt alles, kann man diese wieder aktivieren und ggf. entsprechend konfigurieren:
/etc/init.d/iptables stop
TFTP-Server
Nun geht es darum einen TFTP-Server einzurichten.TFTP steht für (T)rivial (F)ile (T)ransfer (P)rotocol und ist so was wie eine extrem abgespeckte Variante des FTP Protokolls.
Den tftp-client installieren wir auch gleich dazu, weil man damit gut die Verbindung zum tftp-server testen kann:
yum install tftp tftp-server
Nun erstellen wir noch einen tftp Benutzer:
useradd -c 'TFTP User' -d /tftpboot -s '/sbin/nologin' -r tftp
Danach muss man den TFTP-Server konfigurieren, bei CentOS z.B. in der Datei: /etc/xinetd.d/tftp
/etc/xinetd.d/tftp
service tftp
{
socket_type = dgram
protocol = udp
wait = yes
user = root
server = /usr/sbin/in.tftpd
server_args = -s /tftpboot -u tftp
disable = no
per_source = 11
cps = 100 2
flags = IPv4
}
Der tftp-server MUSS zuerst als root starten! - Erst dann, kann man ihn mit -u tftp anweisen den tftp user zu nehmen.
Es muss einfach konfiguriert werden dass der tftp-server automatisch startet und welches Verzeichnis (hier: boot/tftpboot) als "home-Verzeichnis" gebraucht wird.
Bootloader
Als nächstes installieren wir den bootloader und kopieren diesen ins TFTP-Verzeichnis:yum install syslinux cp -pv /usr/lib/syslinux/pxelinux.0 /tftpboot/
Als letztes muss nun noch das Konfigurations-Verzeichnis (pxelinux.cfg) erstellt- und die Berechtigungen gesetzt werden:
mkdir -pv /tftpboot/pxelinux.cfg chown -vR tftp:tftp /tftpboot chmod -v 755 /tftpboot find /tftpboot/ -type d |xargs chmod -v 755 find /tftpboot/ -type f |xargs chmod -v 644
Damit der tftp-server funktioniert müssen alle files für JEDEN lesbar sein ( -r--r--r-- ), bzw. chmod 444 (für Verzeichnisse: chmod 555)
Damit man nun auch was sieht erstellen wir ein einfache Bootloader-Konfiguration, mit der man dann von der lokalen Festplatte starten kann.
Dazu legen wir das file /tftpboot/pxelinux.cfg/default an:
/tftpboot/pxelinux.cfg/default
SAY Initialisiere Network-Boot... PROMPT 1 TIMEOUT 0 DEFAULT local DISPLAY boot.txt LABEL hd1 default localboot 0x80
Anstelle vom file: default kann man auch ein file mit entweder der MAC-Adresse oder dem HEX-Code der IP-Adresse, des bootenden hosts erstellen und so pro host ein individuelles boot menu anzeigen.
Den HEX-Code der IP-Adresse findet man mit dem Befehl: "gethostip" raus, z.B.:
Am besten verlinkt man diesen noch mit dem Namen des Hosts um nicht den Überblick zu verlieren:
Den HEX-Code der IP-Adresse findet man mit dem Befehl: "gethostip" raus, z.B.:
# gethostip 10.0.0.70 10.0.0.70 10.0.0.70 0A000046
Am besten verlinkt man diesen noch mit dem Namen des Hosts um nicht den Überblick zu verlieren:
cp -pv /tftpboot/pxelinux.cfg/default /tftpboot/pxelinux.cfg/0A000046 ln -sv /tftpboot/pxelinux.cfg/0A000046 /tftpboot/pxelinux.cfg/host1
Und noch ein file /tftpboot/boot.txt um das "menu" Anzuzeigen:
/tftpboot/boot.txt
BOOTMENU ----------- Bitte: "hd1" angeben um von der ersten lokalen Festplatte zu starten.
Das wars schon. Nun sollte man testen, ob alles klappt:
cd /root/ chkconfig xinetd on /etc/init.d/xinetd start tftp localhost get /pxelinux.0 quit ls
Sehen wir nun ein 'pxelinux.0' File und bekommen keine Fehlermeldung hat alles geklappt!
DHCP-Server
Im zweiten Schritt muss nun ein funktionierender Linux DHCP-Server eingerichtet werden. Wie das geht, steht im Beitrag: DHCP.Nun müssen wir in der Datei /etc/dhcpd.conf im subnet-Block noch zwei Zeilen hinzufügen:
subnet 10.0.0.0 netmask 255.255.255.0
{
# [...]
next-server 10.0.0.1;
filename "/pxelinux.0";
}Diese Zeilen bedeuten:
filename: Dies ist die bootloader Datei, die dem Client übergeben wird.
next-server: Dies der Name oder IP Adresse des Servers auf dem das Bootimage liegt; wenn...
- TFTP auf dem gleichen Rechner läuft ist diese Zeile nicht notwendig, bzw. es sollte die IP Adresse des boot-servers da stehen
- TFTP auf einem separaten 'booting-server' liegt, muss man hier der Name, bzw. IP Adresse dieses Servers geben, von diesem wird dann das Bootimage über TFTP geladen
Dies ist eigentlich auch schon der einzige unterschied zwischen einem und zwei Servern... ;-)
Nun kann man die Datei speichern und den dhcpd mit:
/etc/init.d/dhcpd restartNeustarten.
Nun den Netzwerk-bootfähigen PC starten; es sollte nach dem initialisieren der Netzwerkkarte das Boot-Menu erscheinen. - Man kann nun, durch Eingabe von: hd1 von der ersten lokalen Festplatte booten! ;-)
Zugegebenermassen ist dies noch nicht wirklich berauschend, deshalb werden wir den Server gleich so Einrichten, dass auch Betriebssysteme und installer vom Bootserver gestartet werden können.
Nach Gruppen sortieren
Das ganze lässt sich jetzt noch etwas optimieren; vielleicht will man ja nur einigen PCs das booten per Netzwerk erlauben, oder für verschiedene PCs andere Systeme ab Netzwerk booten?Deswegen ist es am besten man legt einen neuen group{} Block an:
# NET BOOT
group
{
filename "/debian/pxelinux.0";
server-name "gateway";
next-server 10.0.0.3;
host netboottest
{
hardware ethernet 00:10:DC:1D:D5:32;
fixed-address 10.0.0.70;
}
}In diesem Beispiel darf nur der PC 'netboottest' mit der MAC-Adresse: '00:10:DC:1D:D5:32' vom Netzwerk starten; er bekommt eine statische IP (10.0.0.70) und als Bootimage: 'pxelinux.0' zugewiesen.
Nun kann man die im oberen Teil angegebenen Werte auch überschreiben; es wird so möglich pro host auch einen individuellen bootloader anzugeben.
Die folgende Erweiterung des obigen Beispiels illustriert das:
# NET BOOT
group
{
filename "/pxelinux.0";
server-name "gateway";
next-server 10.0.0.3;
host netboottest
{
hardware ethernet 00:10:DC:1D:D5:32;
fixed-address 10.0.0.70;
}
host debianhost
{
hardware ethernet 00:10:DC:1D:D5:33;
filename "/debian/pxelinux.0";
}
}Hier lädt der Host netboottest normal den bootloader /pxelinux.0, während der neue Host debianhost stattdessen den bootloader /debian/pxelinux.0 lädt.
Und da diesmal keine fixe IP angegeben ist, holt er sich einfach eine aus dem DHCP-Pool.
Webserver
Ein zusätzlicher Webserver auf dem boot-server erlaubt es später Konfigurations-Scripts nachzuladen oder ganze repositories lokal zu führen.Dieser braucht keine besonderen Anforderungen, es reicht wenn man einfach Files über HTTP von diesem runter laden kann.
Wir installieren hier lokal einen apache:
yum install httpd chkconfig httpd on /etc/init.d/httpd start
Denen die lieber einen anderen, externen Webserver verwenden sei gesagt, dass alles was sich hier im Verzeichnis: /var/www/html/ befindet, dann entsprechend auf dem externen Webserver sein muss.
Betriebssysteme übers Netzwerk starten
Nachfolgend werden wir verschiedene Systeme einrichten, die dann übers Netzwerk gestartet werden können.
Es gibt für fast jedes (Linux-) Betriebssystem die Möglichkeit dieses übers Netzwerk zu starten, ABER es braucht einen speziellen "PXE-Bootfähigen" Kernel.
Deshalb am besten jeweils nach: " +PXE boot" suchen.
Deshalb am besten jeweils nach: "
Lokale Festplatte booten
Falls man den Netzwerk-Boot Server grundsätzlich immer starten will, jedoch Standardmässig nach einem kurzen Timeout von der lokalen Festplatte booten will erweist sich folgendes in der default bootloader Konfiguration (pxelinux.cfg/default) als ganz nützlich:TIMEOUT 120 DEFAULT local LABEL local localboot 0
CentOS installer
Nun richten wir den CentOS 32bit pxe-installer ein:mkdir -pv /tftpboot/centos cd /tftpboot/centos wget http://mirror.switch.ch/ftp/mirror/centos/6.0/os/i386/images/pxeboot/vmlinuz wget http://mirror.switch.ch/ftp/mirror/centos/6.0/os/i386/images/pxeboot/initrd.img mv -v vmlinuz vmlinuz32 mv -v initrd.img initrd32.img
Will man anstelle des 32bit installers den 64bit installer, dann das: i386 einfach mit: x86_64 ersetzen.
Nun müssen wir dies noch im PXE-bootloader eintragen.
Dazu hängen wir folgende Zeilen an das Ende von: /tftpboot/pxelinux.cfg/default an:
/tftpboot/pxelinux.cfg/default
LABEL centos32 KERNEL centos/vmlinuz32 APPEND ksdevice=eth0 local_ramdisk=1 prompt_ramdisk=0 ramdisk_size=16384 initrd=centos/initrd32.img network
Startet man den PC jetzt vom Netzwerk kann man zusätzlich durch Eingabe von: "centos32" den CentOS 32bit installer booten.
Notfallkonsole vom Netzwerk booten
systemrescuecd eignet sich herrovorangend für eine Notfallkonsole, die vom Netzwerk bootet.Also richten wir systemrescuecd entsprechend ein:
mkdir -pv /tftpboot/sysrescuecd mkdir -pv /mnt/SystemRescueCd wget https://sourceforge.net/projects/systemrescuecd/files/sysresccd-x86/2.4.0/systemrescuecd-x86-2.4.0.iso/download mount -o loop systemrescuecd-x86-2.4.0.iso /mnt/SystemRescueCd/ cd /mnt/SystemRescueCd/ cp -v bootdisk/* /tftpboot/sysrescuecd/ cp -v isolinux/* /tftpboot/sysrescuecd/
Jetzt kopieren wir das ca. 150MB grosse Systemimage ins Verzeichnis des webservers - Dies, weil tftp nicht für grosse Dateien gemacht wurde und diese auch nicht laden kann.
mkdir -pv /var/www/html/pxe/systemrescuecd/ cp -v /mnt/SystemRescueCd/sysrcd.dat /var/www/html/pxe/systemrescuecd/ cp -v /mnt/SystemRescueCd/sysrcd.md5 /var/www/html/pxe/systemrescuecd/ cd ~ umount /mnt/SystemRescueCd/ rm -v systemrescuecd-x86-2.4.0.iso
Dann editieren wir die Datei: /tftpboot/pxelinux.cfg/default und hängen an den Schluss folgendes an:
/tftpboot/pxelinux.cfg/default
LABEL rescue KERNEL sysrescuecd/rescuecd APPEND initrd=sysrescuecd/initram.igz setkmap=sg boothttp=http://<WEBSERVER_IP>/pxe/systemrescuecd/sysrcd.dat ar_source=http://<WEBSERVER_IP>/pxe/systemrescuecd/ ar_nowait
("keymap=" regelt das Tastaturlayout. sg steht hier für Schweizer deutsche Tastatur. Dieser Wert nach belieben anpassen)
Gibt man nun beim Netzwerk-Boot "rescue" ein, startet sysrescuecd vom Netzwerk, cool nicht? ;-)
Weitere Anwendungsbeispiele
RedHat / CentOS automatisiert installieren
Danke an die Zeitschrift: internet-professionell für den Beitrag: Server-Installationen automatisieren
Mit "kickstart" bieten RedHat und CentOS eine einzigartige Möglichkeit Systeme übers Netzwerk zu installieren.
Für dieses Beispiel solltest du bereits einen webserver (z.B apache) auf deinem boots-server installiert- und so konfiguriert haben,
dass: http://dein-server/
auf: /var/www/html zeigt (Standard beim apache).
dass: http://dein-server/
Hierzu definieren wir zuerst eine IP-Adresse die das System während der Installation haben wird; dies kann, muss aber nicht die selbe IP-Adresse sein, die das System nach der Installation erhält.
Wir nehmen hier als Beispiel 10.0.0.90
Nun muss die MAC-Adresse des neuen Hosts herausgefunden werden; diese wird meist während dem Netzwerk-Boot angezeigt; wir nehmen hier als Beispiel einfach: 08:00:20:ae:fd:7e
Im DHCP-Server definieren wir nun, das der Host mit der MAC-Adresse: 08:00:20:ae:fd:7e die IP: 10.0.0.90 bekommt und den pxe bootloader lädt:
host testsystem
{
hardware ethernet 08:00:20:ae:fd:7e;
fixed-address 10.0.0.90;
filename "/pxelinux.0";
}Nun legen wir für diesen Host noch eine Konfigurationsdatei an. Dazu müssen wir die IP-Adresse in der hexadezimalen Form haben, welche wir mit "gethostip" raus kriegen:
# gethostip 10.0.0.90
Ausgabe: 10.0.0.90 10.0.0.90 0A00005A
Nun wird das Konfigurationsfile mit dem hex-wert als namen angelegt und gleich verlinkt:
touch /tftpboot/pxelinux.cfg/0A00005A ln -sv /tftpboot/pxelinux.cfg/0A00005A /tftpboot/pxelinux.cfg/testsystem
Das verlinken ist nicht zwingend nötig, gewöhne dir aber am besten gleich an, das für jeden host zu machen,
da es die Überischtlichkeit (vor allem bei mehreren Systemen) enorm vereinfacht.
da es die Überischtlichkeit (vor allem bei mehreren Systemen) enorm vereinfacht.
In die Datei /tftpboot/pxelinux.cfg/0A00005A schreiben wir nun:
default kickstart label kickstart kernel centos/vmlinuz32 append ksdevice=eth0 local_ramdisk=1 prompt_ramdisk=0 ramdisk_size=16384 initrd=centos/initrd32.img network ks=http://<WEBSERVER-IP>/pxe/centos/kickstart/testsystem.ks
Auf dem webserver Nun muss noch das kickstart file und die dazugehörigen Verzeichnisse erstellt werden:
mkdir -pv /var/www/html/pxe/centos/kickstart/
In die Datei /var/www/html/pxe/centos/kickstart/testsystem.ks kommt nun:
/var/www/html/pxe/centos/kickstart/testsystem.ks
install url --url http://mirror.switch.ch/ftp/mirror/centos/5.5/os/i386 lang en_US.UTF-8 keyboard sg network --device eth0 --bootproto dhcp rootpw --iscrypted $1$jiosajd98sas9d3 firewall --enabled --port=22:tcp authconfig --enableshadow --enablemd5 selinux --permissive timezone --utc Europe/Zurich %packages @core @editors
Über die pxelinux.cfg kann für jeden Host eine Datei erstellt werden; darin kann man dann auch für jeden Host eine eigene kickstart.ks angeben.
Die sog. "kickstart-installationen" von RHEL/CentOS sind noch einiges mächtiger als hier beschrieben; so hat man z.B. die Möglichkeit vor- und nach der Installation beliebige scripts auszuführen, womit man dann perfekt vollautomatisch vorkonfigurierte Systeme erstellen kann.
Das Kapitel: Kickstart Installations
Windows (unattended) install booten
Beschreibt wie man die Windows-Installation (ggf. vollautomatisch) booten vom Netzwerk booten kann.
Related Links
| Link | Beschreibung |
| Debian Handbuch: Netzwerkboot | Das Debian Handbuch beschreibt in seinem Netzwerkboot Kapitel alles was man wissen muss um ein Debian übers Netzwerk zu booten |
| Man-page zur dhcpd.conf | Beschreibt die Einstellungen des DHCPD-Servers, falls man mal genauer wissen möchte was einzelne statements in der Konfigurationsdatei des DHCP-Servers bedeuten |
| Damn small Linux | Ein komplettes Linux auf 50 MB grösse |
| sysLinux | Der sysLinux bootloader; sehr gut geignet für Netzwerk-boots |
| internet-proffessionell: Server-Installationen automatisieren | Ein sehr gutes tutorial der Zeitschrift "Internet Proffessionell" |
| thegibson.org: More pxelinux tricks | Einige nützliche tips&tricks zum PXE-Boot |
| CentOS-Doku: Kickstart Installations | Hier erfährt man, was man genau alles mit kickstart machen kann; sehr lesenswert um die Installationen zu optimieren |
| How to make SystemRescueCD PXE bootable | Beschreibung wie man die sysrescuecd per pxe booten kann. |
| dodhcp workaround | Workaround für den dodhcp-bug ab neueren sysrescuecd Versionen |
Related Downloads
| File | Beschreibung |
| Debian NETBOOT Images | Hier findet man die image Dateien um das Debian Linux installationsprogramm vom Netzwerk aus zu starten |
| Gentoo install images | Das Gentoo installations image, dass im Beitrag gebraucht wird |
| CentOS install images | Das CentOS installations image, dass im Beitrag gebraucht wird |
| sysrescuecd | Eine excelente Linux-Konsole die sich gut zum booten per pxe eignet. |

Neuen Kommentar posten