Aus Linux-Magazin 04/2003

Kickstart-Disketten mit neuen Treibern ausstatten

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.

LINUX-MAGAZIN KAUFEN
EINZELNE AUSGABE Print-Ausgaben Digitale Ausgaben
ABONNEMENTS Print-Abos Digitales Abo
TABLET & SMARTPHONE APPS Readly Logo
E-Mail Benachrichtigung
Benachrichtige mich zu:
0 Kommentare
Älteste
Neuste Beste Bewertung
Inline Feedbacks
Alle Kommentare anzeigen
Nach oben