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.
# 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
[nach /dev/rant]
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!
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.
VN:F [1.4.6_730]
Rating: 10.0/10 (3 votes cast)
Sebastian SysAdmin, help me booting it up