Der Kickstart-Mechanismus ist eine komfortable Methode, um Red Hat Linux vollautomatisch zu installieren. Doch nicht immer passen die mitgelieferten Treiber der Kickstart-Diskette auch zu der verwendeten Hardware – ein bisschen Handarbeit schafft Abhilfe.
Wer Linux auf einer größeren Zahl von Computern installieren muss, will sich nicht an jedem Gerät durch ein Installationsmenü klicken. Auch auf Servern ohne Tastatur und Monitor sind Alternativen gefragt. Mit Kickstart[1] bietet der Red Hat Installer ein passendes Feature: Eine Bootdiskette genügt, um das komplette System übers Netz aufzuspielen. Partitionierung, Paketauswahl, X11-Konfiguration und Ähnliches gibt eine Konfigurationsdatei vor, sodass der Admin an keiner Stelle eingreifen muss.
Falls die mitgelieferte Bootdiskette keine passenden Treiber für die vorhandene Hardware enthält, greift Kickstart auf zusätzliche Treiberdisketten zurück. Sie enthalten die erforderlichen Kernelmodule, der Admin muss die Disketten aber händisch einlegen. Außerdem verlangt die Software dann einige Eingaben – für ein automatisiertes Installieren ohne Tastatur und Monitor ist dieser Mechanismus daher ungeeignet.
Wer dennoch Kickstart einsetzen will, kann die Bootdisketten an seine Hardware anpassen. Er benötigt dazu ein Entwicklungssystem mit Red Hat Linux in der identischen Version, die Hardware dieses Computers spielt dabei keine Rolle. Als Zielrechner dient im Folgenden HPs Proliant-Server DL380 G3: Ausgestattet ist das Testsystem mit zwei CPUs Xeon 2,8 GHz, 6 GByte RAM, einem zusätzlichen RAID-Controller (vier Kanäle, 256 MByte Cache-RAM), sechs Festplatten U160 mit 73 GByte Kapazität sowie zwei 10/100/1000TX-Netzwerkkarten von Broadcom. Die Kickstart-Disketten von Red Hat 7.3 erkennen weder den RAID-Controller noch die beiden Broadcom-Netzwerkkarten.
Die Bootdiskette ist mit einem FAT-Dateisystem formatiert. Lilo startet den Kernel »vmlinuz«, er verwendet dabei die Parameter in »syslinux.cfg« und die vom Benutzer am Bootprompt angegebenen Optionen. Alle Treiber befinden sich in der Imagedatei »initrd.img«. Die Diskette enthält auch Hilfetexte »*.msg«, die der Installer auf Wunsch anzeigt. Es handelt sich dabei um Ascii-Files mit Escape-Sequenzen, die die Farben festlegen. Die Struktur der Kickstart-Diskette ist in Listing 1 zu sehen.
Listing 1: Struktur der Kickstart-Diskette |
/mnt/floppy |-- boot.msg |-- general.msg |-- initrd.img |-- ldlinux.sys |-- param.msg |-- rescue.msg |-- snake.msg |-- syslinux.cfg `-- vmlinuz |
Treiber auspacken
Ein Diskettenimage liegt auf der Red-Hat-CD in »/mnt/cdrom/images/bootnet .img« bereit. Um dessen Inhalt zu ändern, ist eine Kopie nötig: »/tmp/bootnet .img«. Ein Loopback-Mount als »/mnt /loop0« gibt den Zugang zu ihrem Dateisystem frei:
mkdir /mnt/loop0 mount -o loop /tmp/bootnet.img /mnt/loop0
Lilo lädt die Datei »initrd.img« noch vor dem Kernel (»vmlinuz«) und stellt ihm damit eine initiale RAM-Disk mit Treibern, Binaries und Device-Files zur Verfügung. Die Initrd ist mit Gzip komprimiert; sie enthält ein Ext-2-Dateisystem. Um auf ihren Inhalt zuzugreifen, sind folgende Schritte nötig:
cp /mnt/loop0/initrd.img /tmp/initrd.ext2.gz gunzip /tmp/initrd.ext2.gz mkdir /mnt/loop1 mount -o loop /tmp/initrd.ext2 /mnt/loop1
Jetzt ist der Inhalt der Initrd unter »/mnt/loop1« eingebunden. Ihre Struktur ist in Listing 3 dargestellt.
Listing 2: PCI-Tabelle ergänzen |
0x14e4 0x1644 "bcm5700" "BROADCOM NetXtreme 10/100/1000TX [onboard]" 0x14e4 0x1645 "bcm5700" "BROADCOM NetXtreme 10/100/1000TX [onboard]" 0x14e4 0x1646 "bcm5700" "BROADCOM NetXtreme 10/100/1000TX [onboard]" 0x14e4 0x1647 "bcm5700" "BROADCOM NetXtreme 10/100/1000TX [onboard]" 0x14e4 0x164D "bcm5700" "BROADCOM NetXtreme 10/100/1000TX [onboard]" 0x14e4 0x16A6 "bcm5700" "BROADCOM NetXtreme 10/100/1000TX [onboard]" 0x14e4 0x16A7 "bcm5700" "BROADCOM NetXtreme 10/100/1000TX [onboard]" 0x0e11 0x4070 "cciss" "Compaq RAID Controller Card" 0x0e11 0x4080 "cciss" "Compaq RAID Controller Card" 0x0e11 0x4082 "cciss" "Compaq RAID Controller Card" 0x0e11 0x4083 "cciss" "Compaq RAID Controller Card" |
Die Kernelmodule liegen in einem Cpio-Archiv
Die mitgelieferten Treiber befinden sich im Unterverzeichnis »modules«. Die Kernelmodule sind dort im komprimierten Cpio-Archiv »modules.cgz« abgelegt; »pcitable« ordnet den PCI-Identifikationsnummern einen passenden Treiber zu und die Dateien »modules.dep« und »module-info« beschreiben die Abhängigkeiten sowie die Art der Module.
Als nächsten Schritt gilt es, die Treiber aus ihrem Archiv zu holen und uninteressante Exemplare durch selbst kompilierte oder vom Hersteller gelieferte Module zu ersetzen. Das Auspacken mit
gunzip -c /mnt/loop1/modules/modules.cgz > /tmp/modules.cpio cd /tmp cpio -idv < modules.cpio
erzeugt ein neues Verzeichnis. Dessen Name hängt von der verwendeten Red-Hat-Version ab und ist identisch mit der Kernelversion des Boot-Kernels auf der Installationsdiskette. Bei Red Hat 7.3 heißt das Directory »2.4.18-3BOOT«, es enthält folgende Treiber:
- 3c59x.o
- 8390.o
- lockd.o
- vne2k-pci.o
- vpcnet32.o
- vsunrpc.o
- usb-storage.o
- 8139too.o
- eepro100.o
- mii.o
- nfs.o
- scsi_mod.o
- tulip.o
Die nicht benötigten Treiber kann man einfach löschen. Für den Proliant-Server DL380 G3 sind mehrere Module überflüssig und damit Kandidaten für »rm«:
cd 2.4.18-3BOOT rm -f 3c59x.o 8139too.o 8390.o tulip.o eepro100.o mii.o ne2k-pci.o pcnet32.o
Compaq bietet auf den Supportseiten[1] eigene Treiber für die Broadcom-Netzwerkkarten als SRPM an. Für die Smartarray-RAID-Controller empfehlen sich die »cciss«-Treiber des Standard-Linux- Kernels. Um die notwendigen Module zu erzeugen, sind die Kernelsourcen von Red Hat und die passende Konfigurationsdatei auf dem Entwicklungssystem erforderlich:
rpm -i kernel-source-2.4.18-3.i386.rpm cd /usr/src/linux-2.4.18-3 cp configs/kernel*BOOT .config
Damit die neu übersetzten Module die richtige Kernel-Versionsnummer enthalten, ist im Makefile die Zeile »EXTRAVERSIONS« auf den Text »-3BOOT« zu ändern. Bei Red Hat 7.3 muss man zudem die APM-Optionen per »make menuconfig« deaktivieren.
Neue Treiber für Kickstart kompilieren
Bei der Gelegenheit lässt sich auch der Treiber für den Array-Controller als Modul aktivieren: Er befindet sich in dem Kernel-Konfigurationsmenü »Block-Devices« als Punkt »Compaq Smart Array 5xxx support«. Beim nun folgenden Compilerlauf entsteht unter anderem das Modul »cciss.o«, das auf der Kickstart-Diskette landen soll:
make dep clean bzImage make modules modules_install cp /lib/modules/2.4.18-3BOOT/kernel/ drivers/block/cciss.o /tmp/2.4.18-3BOOT/
Das Kompilieren des Compaq-Treibers für die Netzwerkkarten ist dank SRPM einfacher – wichtig ist nur, dass man vorher die beschriebenen Änderungen an ».config« und »Makefile« in den Kernelsourcen durchgeführt hat. Auch das Modul »bcm5700.o« soll mit auf die Diskette kommen:
rpm -i /tmp/bcm5700-*src.rpm cd /usr/src/redhat/SPECS rpm -ba bcm5700.spec rpm -i /usr/src/redhat/RPMS/i386/bcm5700* cp /lib/modules/2.4.18-3BOOT/kernel/ drivers/net/bcm5700.o /tmp/2.4.18-3BOOT/
Ob die Module die korrekte Versionsnummer enthalten, zeigt der Befehl »strings bcm5700.o | grep kernel«. Die Ausgabe muss zur internen Version des »vmlinuz«-Kernels der »bootnet.img«-Diskette passen.
Die zusätzlichen Module automatisch laden
Damit der Kernel die neuen Treiber automatisch lädt, müssen die Modulabhängigkeiten und die Zuordnungen zu den PCI-Identifikationen passen. Die Modulabhängigkeiten sind in »modules.dep« konfiguriert. Für die Standardtreiber des Linux-Kernels eignen sich die Vorlagen in »/lib/modules/2.4.18-3BOOT/modules.dep«, bei anderen Modulen hilft jedoch oft nur Probieren. »cciss.o« und »bcm5700.o« benötigen keine zusätzlichen Module, auch keinen »scsi«-Treiber. Der »cciss«-Treiber stellt ein Blockgerät dar, also sind hierfür keine Änderungen an »modules.dep« nötig.
Die Zuordnung der Treiber zu den PCI-Identifikationsnummern steht in der Konfigurationsdatei »/mnt/loop1/modules/pcitable«. Ihr Inhalt ist in vier Spalten aufgeteilt, die durch Tabulatoren getrennt sind:
- Hersteller-Identifikation
- Geräte-Identifikation
- Modulname
- Beschreibung
Auf der Webseite[2] von Jim Boemler finden sich die möglichen Hersteller- und Geräte-Kennungen. Für den verwendeten Array-Controller und die Netzwerkkarten passen mehrere Einträge (siehe Listing 3), die in »pcitable« zu ergänzen sind.
Listing 3: Struktur der Initrd |
/mnt/loop1
|-- bin -> sbin
|-- dev
| |-- agpgart
| |-- console
| [...]
| |-- ttyS3
| |-- ttyp0
| `-- zero
|-- etc
| |-- fonts.cgz
| |-- keymaps.gz
| |-- kon.cfg
| |-- lang-table
| |-- loader.tr
| |-- minikon.fnt
| |-- mtab -> /proc/mounts
| |-- passwd
| |-- ramfs.img
| `-- terminfo
| |-- k
| | `-- kon
| `-- l
| `-- linux
|-- linuxrc -> /sbin/init
|-- lost+found
|-- modules
| |-- module-info
| |-- modules.cgz
| |-- modules.dep
| `-- pcitable
|-- proc
|-- sbin
| |-- continue -> loader
| |-- init
| |-- insmod -> loader
| |-- loader
| |-- modprobe -> loader
| |-- rmmod -> loader
| `-- sh -> /usr/bin/sh
|-- tmp
`-- var
`-- state
`-- xkb -> /tmp
|
Image neu zusammenstellen
Nun sind die Treiber vollständig und man kann die Bootdiskette aus ihren Teilen neu zusammensetzen. Zunächst sind die Treiber an der Reihe: Cpio-Archiv erzeugen, mit Gzip komprimieren und das Ergebnis in die »initrd.ext2« einfügen – Letztere ist noch als »/mnt/loop1« eingebunden:
cd /tmp find 2.4.18-3BOOT -print -depth | cpio -ov -H crc > modules.cpio gzip -c9 modules.cpio > modules.cgz cp -f modules.cgz /mnt/loop1/modules/
Im nächsten Schritt ist die modifizierte Initrd zurück in das Kickstart-Image zu kopieren – es steht auf »/mnt/loop0« bereit. Das fertige Image lässt sich schließlich mit »dd« auf eine Diskette kopieren:
umount /mnt/loop1 gzip -c9 initrd.ext2 > initrd.img cp initrd.img /mnt/loop0/ umount /mnt/loop0 dd if=/tmp/bootnet.img of=/dev/fd0H1440 bs=512
Nicht immer ist das modifizierte Image klein genug, um auf eine Diskette zu passen. In diesem Fall muss man weitere Treiber aus der Initrd löschen. Dabei ist es nicht ratsam, mehrere Änderungen hintereinander auf der Initrd durchzuführen: Das Ext-2-Dateisystem gibt beim Überschreiben einer Datei zwar die nicht mehr nötigen Blöcke frei, es löscht aber deren Inhalt nicht. Dieser Datenmüll lässt sich nur schlecht komprimieren und vergrößert das Image.
Im Zusammenspiel mit einem Kickstart-Server arbeitet die Bootdiskette zunächst nur nach Eingabe von »ks« am Lilo-Prompt. Um einen Server ohne Tastatur und Rückfrage neu zu installieren, ist in der Datei »syslinux.cfg« die »default«-Zeile auf »default ks« zu ändern.
Red Hat in 15 Minuten
Mit dieser Methode lässt sich Red Hat Linux in nur 15 Minuten auf einen tastaturlosen Proliant-Server DL380 G3 aufspielen. Da über 20 Maschinen dieses Typs zu installieren waren, lohnte sich auch der Aufwand beim Modifizieren der Bootnet-Diskette. (fjl)
Infos |
|
[1] Dokumentation zu Kickstart: [http://www.redhat.com/docs/manuals/linux/RHL-7.3-Manual/custom-guide/] [2] Compaq-Supportseite für Linux-Treiber: [http://h18000.www1.hp.com/support/files/server/us/locOsCat/86.html] [3] PCI Vendor and Device List: [http://www.yourvote.com/pci/] |
Der Autor |
|
Oliver Schade arbeitet als Consultant und Teamleiter im Bereich Linux und Storage bei der Firma Pro Business Berlin AG. Seine Erfahrungen mit Linux reichen bis ins Jahr 1992 und die Kernelversion 0.96b zurück. |





