EeePC: Ubuntu 8.04 Initramfs-Tuning

Ubuntus Standard-Initrds sind eine feine Sache, laufen sie doch auf fast jeder gewöhnlichen PC-Hardware und erlauben auch den problemlosen Umzug einer Festplatte in einen anderen Rechner. Der Nachteil der ganzen Sache ist allerdings, dass die Initrd ganze sieben Megabyte groß ist. Die müssen gleich beim Systemstart geladen und entpackt werden. Dazu kommt, dass die vielen enthaltenen Treiber einzeln geladen werden und nach der für sie bestimmten Hardware suchen. Hier kann man für eine genau spezifizierte Hardware-Kombination gut ausmisten und so tunen. Das resultierende Initramfs ist noch 3MB klein:

  • Zunächst wird die Konfigurationsdatei /etc/initramfs-tools/initramfs.conf angepasst. Uns interessiert insbesondere die Variable MODULES=most, die auf MODULES=list umgestellt wird.

  • Nun muss eine Modullliste /etc/initramfs-tools/modules erstellt werden. Meine enthält Treiber für die interne SSD und USB-Massenspeicher:

    ext3
    ext2
    jbd
    mbcache
    usbhid
    hid
    usb_storage
    libusual
    sg
    sd_mod
    ahci
    libata
    scsi_mod
    ehci_hcd
    uhci_hcd
    usbcore
    ata_piix

    Wenn Sie nur von SSD booten, können Sie alle USB-Module entfernen, analog beim Start von USB die SATA- und ATA-Treiber.

  • Sichern Sie die alte Initrd, bitte nicht die Endung .bak verwenden!

  • Erzeugen Sie eine neue Initrd

    mkinitramfs -o /boot/initrd.img-$( uname -r )

  • Rebooten Sie um sicherzustellen, dass die neue Initrd richtig startet

  • Tragen Sie Module, die nun fehlen, aber dennoch gleich dem Start benötigt werden in die Datei /etc/modules ein.

  • Optional: Blockieren Sie nicht benötigte Module via /etc/modprobe.d/blacklist

    # Geraete, die der EeePC nie benoetigen wird
    blacklist lp
    blacklist parport
    blacklist parport_pc
    blacklist ppdev
    blacklist joydev
    blacklist serio_raw
    blacklist ata_generic
    blacklist pata_acpi
    blacklist pci_hotplug
    blacklist shpchp
    blacklist ipv6

Was ist die Initrd/das Initramfs?

Früher war es üblich, einen Linux-Kernel genau auf eine Hardware abgestimmt zu backen. So musste man beim Systemstart lediglich den Namen des Gerätes übergeben, welches das Root-Dateisystem enthielt. Doch die Zeiten ändern sich, in vielen Fällen sorgen Wechseldatenträger dafür, dass sich Gerätenamen ändern und Linuxe sollen auch von CD oder USB-Stick starten. Die Lösung schufen zunächst sogenannte Initrds (“initiale Ramdisks”). Dabei handelte es sich um Images von Partitionen, die formatiert und mit Daten versehen waren. Auf ihnen war ein Script untergebracht, das nach dem Laden der Initrd ausgeführt wurde und beispielsweise Module lud oder die Root-Partition suchte. War das Script fertig, übergab es an die Bootsequenz auf Festplatte. So konnte Logik aus dem Kernel ferngehalten und leicht gewartet werden. Allerdings ist die Initrd nicht gerade effizient, da freier Platz auf der Initrd ungenutzt im Speicher verbleibt und gleichzeitig Schreibzugriffe an die Größenbegrenzungen der Initrd stoßen. Nachfolger der Initrd ist daher das Initramfs (“initial RAM file system”), das letztlich ein gepacktes CPIO-Archiv ist und effizienter mit dem Speicher umgeht als die Initrd.

Bei den meisten Linux-Bootloadern heisst der Parameter zur Übergabe von Initrd/Initramfs noch immer initrd. Ich verwende daher Initrd als Sammelbegriff für Initrd und Initramfs, auch wenn dies technisch nicht immer korrekt ist…

Nachtrag, 14. Mai: Mit dem Image vom 7. Mai funktioniert dieses Initramfs sowohl von SD-Karte als auch von interner SSD. Hat noch jemand anderes die Bootprobleme, die untergeek beschreibt?