Software-Deployment per PXE/Netboot
Software-Deployment von Hand ist grausam - da sind wir uns wohl alle einig. Früher™ war es durchaus etwas grausamer - ich erinnere mich grade an das Disketten-Gebirge von Novell Netware oder OS/2 zurück - doch auch heute schubsen wir immernoch Betriebssystem auf Rechner, also eigentlich genau wie früher.
Ein schöner Vorteil der “freien” Betriebssysteme ist an dieser Stelle, daß man sie nahezu alle auch aus dem Netzwerk booten kann - Stichwort PXE - und somit zumindest das Erstellen von Installationsmedien entfällt.
Mit einem PXE-fähigen Rechner ist man in der Lage, anstelle von lokalen Medien (Festplatte, Diskette, CD etc.) über ein Netzwerk (Ethernet) von einem entfernten Rechner zu booten. Dies kann dazu dienen, auf einem Rechner ohne Zufügen von Medien (CDs, DVDs etc.) ein Betriebssystem zu installieren oder auch ein Thinclient-System aufzubauen, in dem die Client-Rechner gar keine Laufwerke benötigen, und dem Nutzer dennoch ein komplett nutzbares Betriebssystem zur Verfügung gestellt wird.
[nach wikipedia]
Wie baut man denn jetzt ein solches PXE-Environment auf? Naja - eigenlich recht einfach. Man benötigt nur den Dienst DHCP, eine Portion TFTP und später etwas NFS - schon fertig. In der Realität ist’s natürlich ein kleines bisselchen mehr Aufwand…
Zuerst suchen wir uns eine Maschine im Netz, auf der das PXE-System laufen soll. In meinem Falle ist das eine Debian Maschine, konzeptionell funktioniert das aber auch wunderbar mit anderen Distributionen oder den BSD-Geschmacksrichtungen. Ich habe mir vor einiger Zeit mal angewöhnt solche Installationen getrennt vom restlichen Betriebssystem zu verwalten, daher wähle ich einen Pfad unterhalb von /opt - das steht natürlich jedem frei.
# mkdir /opt/pxeboot/tftp
Was wir auf jeden Fall brauchen, ist eine aktuelle Version von syslinux - runterladen und in diesem neuen Verzeichnis entpacken.
Den Debian-Installer laden wir als nächstes. Heute gibt es durchaus Sinn sowohl den i386- als auch den AMD64-Zweig anzubieten, daher laden wir beide nacheinander runter und entpacken die Files ebenfalls nach /opt/pxeboot/tftp.
# wget http://ftp.debian.org/debian/dists/etch/main/installer-i386/current/images/netboot/netboot.tar.gz
# tar xzf netboot.tar.gz
# rm netboot.tar.gz
# wget http://ftp.debian.org/debian/dists/etch/main/installer-amd64/current/images/netboot/netboot.tar.gz
# tar xzf netboot.tar.gz
# rm netboot.tar.gz
Beide Dateien heißen netboot.tar.gz, also nicht aus Versehen gegenseitig überschreiben. Ein paar Dateien sind in beiden Archiven enthalten - einfach ignorieren, die dürfen ruhig überschrieben werden. Ebenfalls brauchen wir zwei Symlinks nicht mehr - pxelinux.0 und pxelinux.cfg sollten auch gleich gelöscht werden - wir legen sie später neu an.
Aus dem syslinux-Paket stibitzen wir noch die Datei com32/modules/menu.c32 und kopieren sie nach /opt/pxeboot/tftp.
Dem DHCP-Server in unserem Netz muß noch erklärt werden, daß er den Clients auf PXE-Anfragen antwortet. Beim ISC DHCPd3 geht das sehr schmerzfrei, auch bei anderen DHCP-Servern sollte das kein Problem sein. (moemoe beschreibt das mit dnsmasq)
subnet 172.30.4.0 netmask 255.255.252.0 {
range 172.30.6.1 172.30.6.254;
range dynamic-bootp 172.30.5.240 172.30.5.255;
option routers 172.30.7.254;
filename “pxelinux.0″;
next-server 172.30.4.1;
}
Die beiden hervorgehobenen Zeilen teilen dem Client mit welche Datei er von welchem Server per TFTP anfordern soll. Installieren wir noch einen TFTP-Server! Wer Debian einsetzt kann sich jetzt glücklich schätzen, denn was gibt es schon schöneres als apt-get?
# apt-get install atftpd
Bei mir wird der atftpd per inetd gestartet, also muß eine entsprechende Zeile in die /etc/inetd.conf
tftp dgram udp wait nobody /usr/sbin/tcpd /usr/sbin/in.tftpd --tftpd-timeout 300 --retry-timeout 5 --mcast-port 1758 --mcast-addr 239.239.239.0-255 --mcast-ttl 1 --maxthread 100 --verbose=5 /opt/pxeboot/tftp Einfach ganz unten anhängen - sofern da noch nix von tftp steht - und darauf achten, daß es wirklich alles eine Zeile ist.
Jetzt noch das Boot-Menü anpassen.
In /opt/pxeboot/tftp ein neues Verzeichnis namens pxelinux.cfg erstellen und darin eine Datei namens default in den Editor laden.
DEFAULT menu.c32
PROMPT 0
MENU TITLE Automagisches Netzwerk-Booten
TIMEOUT 300
LABEL d
MENU DEFAULT
MENU LABEL Boot from ^disk
localboot 0x80
LABEL di-i386
MENU LABEL Debian Installer ^i386 - submenu
KERNEL menu.c32
APPEND debian-installer/i386/pxelinux.cfg/default
LABEL di-amd64
MENU LABEL Debian Installer ^amd64 - submenu
KERNEL menu.c32
APPEND debian-installer/amd64/pxelinux.cfg/default
LABEL n
MENU LABEL Try ^next bootdevice
localboot -1
Aus dem Debian-Installer i386 (/opt/pxeboot/tftp/debian-installer/i386) noch die Datei pxelinux.0 nach /opt/pxeboot/tftp kopieren und fertig sind wir - für den ersten Schritt. Den DHCP-Server und den inetd noch kurz mit der neuen Konfiguration vertraut machen (also known as durchstarten) und schon sollten die Maschinen per PXE den Debian Installer booten können.
Allerdings - zumindest mir - reicht das noch nicht. Für’s Debugging eignet sich noch ein Live-System, außerdem muß noch der Installer von FreeBSD mit in’s Boot-Menü.
Grade für Debugging hat sich bei mir grml bewährt.
grml is a bootable CD (Live-CD) originally based on Knoppix and nowadays based on Debian. grml includes a collection of GNU/Linux software especially for system administrator and users of texttools. grml provides automatic hardware detection. You can use grml (for example) as a rescue system, for analyzing systems/networks or as a working environment. It is not necessary to install anything to a harddisk; you don’t even need a harddisk to run it. Due to on-the-fly decompression grml includes about 2.1GB of software and documentation on the CD.
[grml]
Aus dem grml-ISO basteln wir eine NFS-Freigabe und laden zusätzlich noch die speziellen Files für den grml-Netboot.
# mkdir /opt/pxeboot/tftp/grml
# wget ftp://ftp.uni-erlangen.de/pub/mirrors/grml/grml_1.1.iso
# mount -o loop grml_1.0.iso /mnt/tmp/
# cp -r /mnt/tmp/* /opt/pxeboot/tftp/grml
# cp /mnt/tmp/boot/isolinux/minirt26.gz /opt/pxeboot/tftp/grml/boot/
# umount /mnt/tmp
# wget http://grml.org/terminalserver/grml_netboot_package_1.1.tar.bz2
# tar xvjpf grml_netboot_package_1.1.tar.bz2
# cp grml_netboot_package_grml_1.1/tftpboot/linux26 /opt/pxeboot/tftp/grml/boot/
# cp grml_netboot_package_grml_1.1/tftpboot/minirt26.gz /opt/pxeboot/tftp/grml/boot/
# cp grml_netboot_package_grml_1.1/tftpboot/memtest /opt/pxeboot/tftp/grml/boot/
Sowohl das ISO als auch den Inhalt von grml_netboot_package_1.1.tar.bz2 benötigen wir danach nicht mehr.
Die Datei /opt/pxeboot/tftp/pxelinux.cfg/default noch um den grml-Eintrag anpassen:
LABEL grml
MENU LABEL ^GRML
kernel grml/boot/linux26
append ramdisk_size=24000 root=/dev/ram0 rw init=/etc/init nfsdir=Server-IP-oder-Name:/opt/pxeboot/tftp/grml/ nodhcp noprompt noeject apm=power-off nomce initrd=grml/boot/minirt26.gz vga=normal
Was jetzt noch fehlt, ist der NFS-Export von /opt/pxeboot/tftp/grml - aber auch das ist kein größeres Problem. Die Datei /etc/exports um die entsprechenden Einträge ergänzen und den NFS-Dienst ebenfalls neu starten.
/opt/pxeboot/tftp/grml/ * (ro,no_root_squash,no_subtree_check)
/opt/pxeboot/tftp/ * (ro,no_root_squash,no_subtree_check)
That’s it - jetzt ist auch grml über das Netzwerk startbar. Fehlt noch FreeBSD.
Leider ist der Aufwand bei FreeBSD etwas größer als bei Linux, denn für das Erstellen eines PXE-Images benötigt man ein funktionierendes FreeBSD-System und ein bootonly.iso.
[nach /dev/rant]
# mdconfig -a -t vnode -f 7.0-RELEASE-i386-bootonly.iso -u1 ; mount -t cd9660 /dev/md1 /mnt/cdrom
# dd if=/dev/zero of=fbsd7R_i386.img bs=1k count=32k
# mdconfig -a -t vnode -f fbsd7R_i386.img -u0
# bsdlabel -w -B md0 auto; bsdlabel -A md0
# newfs -b 8192 -f 1024 /dev/md0a
# mount /dev/md0a /mnt/disk
# cp -R /mnt/cdrom/boot /mnt/disk/
# umount /mnt/disk
# umount /mnt/cdrom ; mdconfig -d -u0 ; mdconfig -d -u1
Das entstandende Image fbsd7R_i386.img auf den PXE-Server kopieren, gzipen und in pxelinux.cfg/default mit eintragen.
LABEL fbsd7-i386
MENU LABEL FreeBSD 7-RELEASE i386
kernel memdisk
append initrd=freebsd/fbsd7R_i386.img.gz harddisk noedd
Die Datei memdisk ebenfalls noch aus syslinux ins Verzeichnis /opt/pxeboot/tftp kopieren, denn die benötigt der FreeBSD Start-Vorgang. Auch FreeBSD hat einen AMD64-Zweig. Der wird entsprechend der Anleitung oben für i386 gebaut.
Das war’s - das Gröbste ist erledigt. Wem die Menüs noch nicht gefallen kann sich an syslinux noch ein bisselchen verkünsteln - Stichwort: vesamenu.c32.
Ich habe das ganze vor einer Weile für unser Büro-Netzwerk gebaut, und bin bisher sehr zufrieden. Wirklich geholfen haben mir die folgenden Postings, danke an die Autoren!
- PXE-Bootmenü für Debian-Installer und GRML
- Convert FreeBSD ISO image for PXE bootstrap
- pxelinux BSD installs
Ebenfalls ganz interessant ist ein Eintag von RoudyBob.NET, für alle, die versuchen Microsoft Virtual PC 2004 per PXE zu booten. Ohne ein spezielles Floppy-Image funktioniert das nämlich nicht.
Related:
on April 23rd, 2008 at 17:22
Hallo.
Erstmal cooles howto. Genau das was ich gebraucht habe. Jedenfalls
bin ich auch gerade dabei das nachzubauen. Jetzt ist mein Problem folgendes.
# cp /mnt/tmp/boot/isolinux/minirt26.gz /opt/pxeboot/tftp/grml/boot/
Diesen Befehl kann ich nicht machen, da in dem ISO kein minirt26.gz existiert. (jedenfalls beim neuesten)
Da das ja weiter unten nochmal von einer anderen Quelle kopiert wird ist das ja egal.
mein Problem ist, dass mein Server alles macht, die Daten auch überträgt bis zu minirt26.gz. Das wird noch übertragen. Dann fängt der Bootvorgang an und bleibt an einer Stelle stehen. Und zwar beim erstellen des root filesystems. Nach einer gewissen Zeit bricht er ab und springt in eine shell mit wenigen Commandos. Ich glaube der Verweis auf das nfs stimmt nicht.
In exports sind alle Pfade vertreten. Kannst du mir etwas helfen wenn ich dir die Fehlermeldungen schicke oder lehnst du das grundsätzlich ab?
Ich hoffe es ist in Ordnung wenn ich du sage.
Mit freundlichem Gruß Stui
on April 23rd, 2008 at 19:37
Hallo Stui,
klar - poste hier einfach die Fehlermeldung, dann kann ich Dir vielleicht helfen. (ich übernehme mal frecherweise das Du)
Gruß,
Sebastian
on April 24th, 2008 at 7:25
Hallo,
also der Server bleibt bei
Mounting root filesystem stehen kurz nach init-premount
in der live.log steht
/init: /init: 169 cannot open dev/hdb stdin error 0
unable to find a medium containing a live file system
Hört sich ja einleuchtend an. Mit einer Netwerkübersicht sehe ich, dass nach der minirt26.gz keine Kommunikation mehr mit dem Server besteht. Her müsste doch jetzt der nfs gelten.
nfs server läuft, bringt keine fehler beim force-reload
Diese Zeile verstehe ich nicht ganz:
append ramdisk_size=24000 root=/dev/ram0 rw init=/etc/init nfsdir=:/opt/pxeboot/tftp/grml/ nodhcp noprompt noeject apm=power-off nomce initrd=grml/boot/minirt26.gz vga=normal
ramdisk ok, root=/dev/ram0 ? kann ich hier nicht den nfs pfad angeben?
nfsdir ist auch klar. Aber weiß er welcher Server (IP?) bei mir ist nfs und PXE im Moment noch auf einem Server. danach ist eigentlich alles klar.
Gruß Stui
on April 24th, 2008 at 10:14
Hi
noch eine anschließende frage wegen der Ramdisk.
Müsste ich diese nicht erst erstellen und formattieren?
mke2fs /dev/ram0 ?? und dann mounten?
eine Meldung sehe ich noch als Fehler.
mounting dev/ram0 on /root funktioniert nicht. er findet so ein Verzeichnis nicht.
Was kann ich tun?
Gruß Stui
on April 29th, 2008 at 8:57
Sorry Stui, ich kam noch nicht dazu. Und für diese Woche kann ich Dir auch keine Antwort versprechen. Aber ich hab Dich nicht vergessen.
on May 15th, 2008 at 14:59
Wenn ich es richtig verstehe, brauchst du das minirt26.gz von der CD gar nicht. Du nimmst am Ende ja das vom grml_netboot_package_grml_1.1
den append-teil in der default habe ich nur folgendermassen angepasst:
append root=/dev/nfs rw nfsroot=192.168.1.2:/PFADzurCD boot=live lang=de nomce quiet apm=power-off noswap noprompt noeject initrd=minirt26.gz vga=normal
So läuft es zumindeste bei mir…
Die CD bootet und kann dann normal genutzt werden. Das einzige Problem ist, das ein poweroff nicht richtig funktioniert.
eth0 wird vor dem umount der Filesysteme runtergefahren. Somit bleibt er beim umount hängen, da kein Kontakt zum NFS-Server möglich ist. An der Stelle hilft dann auch kein Strg-Alt-Entf oder ähnliches. Nur noch der druck auf den Resetknopf
on May 20th, 2008 at 11:31
@Sebastian:
minirt26.gz brauchst Du genau dann von der CD, wenn Du den Punkt mit grml überspringen möchtest. Nicht jeder will ja zwingend ein grml haben.
Was poweroff angeht, ist mir bisher noch nicht untergekommen, da ich die Maschinen per PXE immer nur installiere und danach vom Debian-Installer der reboot sauber durchläuft.
on May 20th, 2008 at 11:33
@Stui:
Was die append-Zeile angeht, da hab ich nicht aufgepasst. HTML hat mir da einen kleinen Strich durch die Rechnung gemacht.
Die Zeile oben ist schon korrigiert, sie muß
append ramdisk_size=24000 root=/dev/ram0 rw init=/etc/init nfsdir=Server-IP-oder-Name:/opt/pxeboot/tftp/grml/ nodhcp noprompt noeject apm=power-off nomce initrd=grml/boot/minirt26.gz vga=normallauten. Oder die von Sebastian angepasste Version, sollte beides tun.on June 21st, 2008 at 20:39
Toll! Danke!
on July 25th, 2008 at 15:35
danke für den Artikel, speziell die Idee mit dem submenu finde ich gut.
Das kann man nämlich sehr gut mit “MENU PASSWORD” schützen.
7horsten
on July 25th, 2008 at 18:14
Danke Thorsten.
Stimmt - der Gedanke mit einem Passwort ist gar nicht schlecht. Sonst installiert noch aus Versehen noch jemand ein grml auf seiner Workstation weil $user nicht wußte “was er drücken muß wenn das so komisch aussieht”.
Sebastian
on August 23rd, 2008 at 1:44
ganz oben: ftfp?
on August 23rd, 2008 at 12:14
Ähm!
tftpnatürlich!on September 18th, 2008 at 15:23
Hallo,
Meine frage ich habe meine eigene linux distribution fertig gestellt, als basis system habe ich ubuntu verwendet.
Jetzt versuche ich mein Abmlinux image zu booten auf einem anderen Rechner per PXE , meine Frage wie schaffe ich meine eigene “netboot.tar.gz” zu erzeugen.
Vielen dank