Der Boot Tracer und Bootchart helfen dabei, den Bootvorgang detailliert zu analysieren. Schon ein paar Maßnahmen später ist das Linux-System spürbar schneller betriebsbereit.
Die heute gängige Bootzeit von ein bis zwei Minuten für ein Desktop-Linux ist nicht gerade beeindruckend. Für den Einsatz im Embedded-Bereich wäre sie geradezu undenkbar. Eine Digitalkamera, die 60 Sekunden zum Hochfahren benötigt, findet nicht viele Käufer, ebenso ein Auto, das nach dem “Keyless Access” zwei Minuten mit der Meldung “Fahrzeug-Informationssystem – Booting” für Stillstand sorgt.
Dabei geht es schneller, wie diverse im Internet publizierte Erfolgsgeschichten belegen. Dort wurden mit überschaubarem Aufwand Bootzeiten im einstelligen Sekundenbereich und teilweise sogar darunter erreicht. So bootet etwa das unter [1] gezeigte Embedded-System auf einem Beagleboard in 630 Millisekunden von Power-on bis in eine Shell.
Für einen möglichst schnellen Bootvorgang gilt es, die Systemkomponenten in Handarbeit anzupassen. Davor ist außerdem eine zeitliche Analyse des Bootvorgangs erforderlich, der sich beim so genannten Cold Boot in die vier Phasen Bootstrap, Bootloader, Kernel und Userland gliedert (siehe Abbildung 1).
Die Phase Bootstrap entspricht dabei dem Bios beziehungsweise der Abarbeitung des Codes, der in einem Festspeicher (ROM) untergebracht ist. Der typischerweise einfache Bootstrap-Code lädt am Ende den Bootloader, der wiederum für das flexible Laden eines Root-Dateisystems und des Betriebssystems zuständig ist.
Seriell beobachtet
Für die zeitliche Analyse der Bootstrap- und der Bootloader-Phase empfehlen die Kernelhacker das Werkzeug Grabserial [2], das sich allerdings nur einsetzen lässt, wenn das zu untersuchende System über eine serielle Schnittstelle verfügt. Grabserial läuft dabei nicht auf dem zu untersuchenden System selbst, sondern auf einem eigenen Host, der die über die serielle Schnittstelle ausgegebenen Bootnachrichten empfängt.
Die Aufgabe ist simpel: Zu jeder Nachricht fügt die Software einen genauen Zeitstempel hinzu. Die Auswertung der zeitbehafteten Nachrichten von Bootstrap und Bootloader bleibt aber Handarbeit für den Entwickler. Auch in der Phase des Kernelboots lässt sich Grabserial einsetzen. Etwas komfortabler geht es aber mit Boot Tracer zu. Das Werkzeug ist seit Version 2.6.28 Teil des Linux-Kernels in der so genannten Tracing-Infrastruktur. Sobald Boot Tracer durch die Bootoption
initcall_debug printk.time=1
aktiviert ist, protokolliert es die Start- und Endzeitpunkte der Kernel-Initialisierungsfunktionen, der so genannten Initcalls (siehe Abbildung 2). Es registriert die Zeitdauer ebenso wie Erfolg oder Misserfolg einer Init-Funktion. Der Kernelhacker Arjan van de Ven hat darüber hinaus mit »bootgraph.pl« ein Perl-Skript geschrieben, das die vom Boot Tracer generierten Informationen grafisch aufbereitet. Torvalds legt dieses Skript seinem Kernel-Quellcode im »scripts« -Verzeichnis bei.

Abbildung 2: Der Boot Tracer protokolliert Zeitverhalten und Returncodes der Initialisierungsfunktionen.
Da Distributionen wie beispielsweise Ubuntu die Tracing-Infrastruktur im Kernel unterstützen, kann der Anwender den Bootprozess mit wenig Aufwand selbst analysieren (siehe Kasten “Boot Tracer im Einsatz”). Das Augenmerk ist in der generierten Grafik auf die lang gezogenen Felder zu richten. Abbildung 4 beispielsweise zeigt die Boot-Tracer-Ausgaben für ein System, das mit den Default-Einstellungen von Buildroot [3] für ARM entstand. Demnach dauert das Booten des Kernels bis zum Mounten des Root-Filesystems unter dem Emulator Qemu 3880 Millisekunden.





