Ankündigung

Einklappen
Keine Ankündigung bisher.

Howto: Ein neuer Kernel unter Debian

Einklappen
Das ist ein wichtiges Thema.
X
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

    Howto: Ein neuer Kernel unter Debian

    Ein neuer Kernel unter Debian


    1) Einführung

    Der letzte offizielle Release zum Zeitpunkt der Erstellung dieses Tutorials ist vom Jahr 2005 mit dem Projektnamen Sarge. Sarge kommt von Haus aus mit der Kernelversion 2.4.x, man kann ihn zudem mit einem Kernel 2.6.8 installieren. Der derzeitige Stand der Kernelentwicklung beläuft sich auf Version 2.6.16 (Mai 2006). Hierbei sind einige wichtige Neuerungen im Kernel integriert die auch sicherheitstechnisch von hoher Relevanz sind. Deshalb kann es ratsam sein, seinen Kernel auf die letzte Version zu bringen.
    Ab der Kernelversion 2.6.15 findet kein Support mehr für das devfs System sondern es wurde komplett auf das UDEV System umgestellt. Dieses ist dafür zuständig, neue Geräte in das System dynamisch einzubinden. Hierbei arbeitet UDEV wesentlich flexibler als das devfs. Weitere Hinweise zum Thema UDEV finden sich hier: http://de.wikipedia.org/wiki/Udev
    Das Problem ist nun, dass man somit nicht ohne größere Arbeit von einem 2.6.8er Kernel auf einem Kernel > 2.6.14 patchen kann. Hier bleiben somit drei Möglichkeiten:

    a) Nicht höher als Version 2.6.14 patchen
    b) Manuell das System auf UDEV umstellen und devfs entfernen
    c) Sarge via distupgrade auf eine unstable Version bringen
    d) Eine aktuelle unstable Debian Version installieren


    a) Nicht höher als Version 2.6.14 patchen


    Dies halte ich für die unglücklichste Lösung, denn wir wollen unser System immer aktuell halten. Deshalb sollten wir einen anderen Weg finden, einen aktuellen Kernel auf unser System zu bringen

    b) Manuell auf das UDEV umstellen

    Das ist eine Möglichkeit, die sicherlich funktioniert. dennoch muss hierzu tief in die Systemkonfiguration eingegriffen werden. Zudem ist aber auch nach erfolgreicher Umstellung nicht immer gewährleistet, dass das System auch in allen Bereichen wie gewünscht funktioniert. Eine Anleitung zur Umstellung erspare ich mir allerdings und verweise hierzu auf eine gute Anleitung auf der Wiki der archlinux.org:
    http://wiki.archlinux.org/index.php/DevFS_to_Udev
    Hier kann man sehr schön sehen, was bei der Umstellung notwendig ist.

    c) Sarge via distupgrade auf eine unstable Version bringen

    Eine elegante Lösung, nur hatte ich in meinen Fall bis jetzt weniger Glück. Es werden hierbei sehr viele Pakete ausgetauscht und leider blieb bei mir das System an manchen Stellen hängen. Zudem sollte man aufpassen, einige Paket in bestimmter Reihenfolge zu installieren, da man dabei schnell in eine Sackgasse geraten kann. Von einer Minimalinstallation ausgehend könnte der Weg von Erfolg gekrönt sein, aber dann kann man eventuell gleich auf Version d) zurückgreifen:

    d) Eine aktuelle unstable Debian Version installieren

    Hierzu zieht man sich ein kleines Netinstall-Image von folgender URL:
    http://www.debian.de/devel/debian-installer/
    Hierzu kann man sich für sein system einen passenden Installer aussuchen (in der Regel wird es das i386 für 32bit Maschinen sein oder das amd64 für die 64bit Athlons). Dieser wird auf CD gebrannt und die Kiste damit gestartet. Nachdem ein minimales Installationssystem auf die Platte gebracht wird zieht der Installer alle weiteren Pakete aus dem Netz. Gut gemeinter Ratschlag: Hierbei sollte eine DSL Leitung verwendet werden. Praktisch hierbei ist, wenn der Rechner via Netzwerkkarte an einem Router hängt, der mit DHCP läuft. So erspart man sich eine oftmals komplizierte Einrichtung des Onlineverbindung, denn dies erledigt dann der Router und Debian selbst. Da einige Daten aus dem Netz gezogen werden gilt auch hier die Devise bei der DSL Verbindung: Je schneller, desto gut

    Eine Anleitung zur Debianinstallation erfolgt an der Stelle nicht, das würde am Thema vorbei führen. Die Installationsanleitung für einen neuen Kernel sollte sowohl für die 2.4er Kernelversion als auch für alle 2.6er Versionen funktionieren.

    Ich verwende in meinem Beispiel die Version 2.6.16.10 auf einem AMD64 System. Solltet Ihr eine andere Kernelversion verwenden, so ist die Versionsnummer in den hier aufgeführten Befehlen entsprechend abzuändern.

    2) Vorbereitung

    Nachdem wir nun einlauffähiges System haben (Hinweis: UDEV bei höheren Kernelversionen nicht vergessen!) benötigen wir als nächstes ein paar Standardpakete zum Installieren.
    Hierzu binden wir noch entsprechend eine Quelle in der /etc/sources.list mit ein:
    Code:
    deb ftp://ftp.de.debian.org/debian/ unstable main
    Diese wird sich vermutlich schon in der Liste befinden, wenn wir einen unstable-Install gemacht haben.

    Per apt benötigte Pakete:
    Code:
    apt-get install kernel-package
    apt-get install libncurses5-dev
    apt-get install build-essential
    apt-get install initrd-tools
    Ebenso ist es ratsam, den Gnu-Kompiler auf eine Version > 4.0ß zu bringen. Wer die unstable Version installiert hat ist hierbei auf der sicheren Seite, denn das sit damit schon erledigt.

    3) Der neue Kernel auf die Platte

    Nun holen wir uns einen neuen Vanilla Kernel direkt von der Kernel.org ab. Entweder macht Ihr das über Eueren Webbrowser und kopiert die Kernelsourcen als tar.bz2 nach
    /usr/src
    oder Ihr bleibt in der Konsole und zieht den Kernel als Root mittels wget. Hierbei müsst Ihr Euch bereits im Verzeichnis /usr/src/ befinden. Für den kernel 2.6.16.10 lautet der Befehl dann beispielsweise:

    Code:
    wget ftp://ftp.kernel.org/pub/linux/kernel/v2.6/linux-2.6.16.10.tar.bz2
    Jetzt können wir das Teil auspacken (bitte den Code gemäß der jeweiligen Version abändern):

    Code:
    tar xvfj linux-2.6.16.10.tar.bz2
    Jetzt müssen wir einen Symlink auf die entpackten Kernelquellen legen, der auf das Verzeichnis /usr/src/linux zeigt. Sollte bereits ein Symlink darauf bestehen, so muss dieser vorher mit rm entfernt werden:
    Code:
    rm linux
    Dann den neuen Symlink anlegen:
    Code:
    ln -s linux-2.6.16.10 linux
    Damit sind die Vorbereitungen abgeschlossen.




    4) Kernel übersetzen


    Zuerst stellen wir sicher, dass alles aufgeräumt ist (sollte auch gemacht werden, wenn bereits kompiliert wurde und man den Vorgang auf sauberer Basis wiederholen möchte). Hierzu in das Verzeichnis /usr/src/linux wechseln und folgenden Befehl absetzen:

    Code:
    make mrproper
    Danach wird die Konfigurationsdatei angelegt. Wir übernehmen diese einfach aus der vorhergehenden Version (die Kernekonfiguration muss dabei unter /boot vorhanden sein, was auch für Gewöhnlich der Fall ist):

    Code:
    make oldconfig
    Wenn neue Optionen hinzugekommen sind, wird der Vorgang danach fragen, ob diese aktiviert werden soll oder nicht. Sind die Versionssprünge gering, werden es nicht allzu viele Neuerungen sein. Sollten es mehrere sein, dann kann das einige Zeit in Anspruch nehmen, sofern man sich erstmal jede neue Funktion etwas genauer ansieht.

    Optional:
    Sollten weitere Änderung gewünscht sein, oder wollt Ihr die eine oder andere Einstellung kontrollieren, kann man auch ein Konfigurationsmenü zusätzlich aufrufen:
    Code:
    make menuconfig
    Hier erledigt Ihr dann zusätzliche Einstellungen und speichert diese ab.

    Jetzt bauen wir den Kernel. Hierbei wollen wir das alles gleich als installierbares Debian Paket verarbeiten. Der Vorteil dabei ist, dass man seinen gebauten Kernel auch auf ein anderes System transferieren kann.
    Code:
    make-kpkg kernel_image --revision KernelRebuild.01
    Nach der Option --revision gebt Ihr dann einen persönlichen Namen ein. Das wird später dem Debian-Paket angefügt und Ihr habt dann den besseren Überblick über verschiedene Compile-Versuche.

    Der Vorgang kann nun einwenig dauern, je nachdem wie schnell Euer Rechner ist. Wenn fertig, dann findet Ihr das fertige Debianpaket unter /usr/src.
    Wechselt nun in das Verzeichnis /usr/src und isnatlliert den neuen Kernel mit folgendem Befehl:
    Code:
    dpkg -i kernel-image-2.6.16.10_KernelRebuild.01_i386.deb
    Der Output sollte ungefähr so aussehen:
    Code:
    (Lese Datenbank ... 144757 Dateien und Verzeichnisse sind derzeit installiert.)
    Entpacke linux-image-2.6.16.10 (aus linux-image-2.6.16.10_KernelRebuild.01_amd64.deb) ...
    Done.
    Richte linux-image-2.6.16.10 ein (KernelRebuild.01) ...
    Running depmod.
    Running postinst hook /sbin/update-grub.
    Searching for GRUB installation directory ... found: /boot/grub
    Testing for an existing GRUB menu.list file ... found: /boot/grub/menu.lst
    Searching for splash image ... none found, skipping ...
    Found kernel: /boot/vmlinuz-2.6.16.10
    Found kernel: /boot/vmlinuz-2.6.15-1-amd64-generic
    Updating /boot/grub/menu.lst ... done
    Wollt Ihr aus irgendeinem Grund den Kernel nochmals backen, dann wird es vermutlich eine Fehlermeldung bezüglich der bereits vorhandenen Revision geben. Diese setzt Ihr dann damit zurück:

    Code:
    make-kpkg clean


    5) Ramdisk und booten

    Über den Installationsvorgang wurde der Kernel normal auch in das Startsystem eingebunden. Ich beschreibe den weiteren Vorgang für den im Moment weitgehend allgemein gebräuchlichen Bootmanager GRUB.

    Zuerst wird eine neue Ramdisk gebaut:
    Code:
    mkinitrd -o /boot/initrd.img-2.6.16.10 2.6.16.10
    diese wird dann als initrd.img-2.6.16.10 nach initrd.img-2.6.16.10 automatisch kopiert. Sollten hier Fehlermeldungen erscheinen ist das ein sicherer Hinweis, dass was beim Kompilieren des Kernels falsch gelaufen ist. Testet zuerst, ob der Kernel dennoch startet. Falls nicht, muss die Konfiguration dem Fehler entsprechend überarbeitet werden. Danach muss die Ramdisk auch noch in die Datei /boot/grub/menu.lst eingetragen werden.
    Sucht dazu den Abschnitt, der nun neu für Eueren neuen Kernel bereits integriert wurde. z.B.:
    Code:
    root            (hd0,0)
    kernel          /boot/vmlinuz-2.6.16.10 root=/dev/sda1 ro
    savedefault
    boot
    Hier fügt nun die Zeile initrd /boot/initrd.img-2.6.16.10 ein:
    Code:
    root            (hd0,0)
    kernel          /boot/vmlinuz-2.6.16.10 root=/dev/sda1 ro
    initrd          /boot/initrd.img-2.6.16.10
    savedefault
    boot
    Speichert das nun ab. Jetzt wird der neue Kernel in Euerem Bootmanager Startmenü zur Auswahl stehen.

    Bootet nun Eueren neuen Kernel.


    5) Pimp my Kernel!

    Um einwenig mehr Performance aus dem Kernel zu quetschen gibt es die Möglichkeit, diesen in der Performance mit Hilfe einiger Patche zu trimmen. Hierbei gibt es einen Spezialisten, der dafür entsprechenden Patches zu den aktuellen Kernel schreibt. Kon Kolivas Overloaded Kernel dürften ziemlich bekannt sein. Das wollen wir nun auch in unseren Kernel einbauen.

    Legt dazu erstmal neue Kernelquellen unter /usr/src an. Verwendet dazu den ungepatchten Kernel 2.6.16 . Mittels den CKO Patches werden auch die aktuellen Patche eingespielt, die in höheren Versionsnummern zu finden sind (derzeit der Kernel 2.6.16.11). Das Verzeichnis linux-2.6.16, das nach dem Entpacken der Quellen entstanden ist benenne ich jetzt einfach in linux-2.6.16.ck8-gargi um. Legt jetzt einen Symlink auf /usr/src/linux wie oben beschrieben an. Damit dann auch alles schön personalisiert wird und der eigene Name später als Kernel-Name mittels uname abrufbar ist, editieren wir noch schnell das Makefile:

    Code:
    vi /usr/src/linux/Makefile
    und ändern die Zeile EXTRAVERSION gleich am Anfang dieser Datei ab. Bei mir steht hier nun ".ck8-gargi" gemäß meines Verzeichnisses der Kernelquelle ändere. Speichert diese nun ab.

    Ladet Euch nun den COK Patch für Eueren Kernel von folgender Seite herunter:

    http://members.optusnet.com.au/ckolivas/kernel/

    Achtet dabei auf die korrekte Version für Eueren Kernel!

    In meinen Fall wäre das für die Konsolenfans folgender Befehl:

    Code:
    wget http://www.kernel.org/pub/linux/kernel/people/ck/patches/2.6/2.6.16/2.6.16-ck8/patch-2.6.16-ck8.bz2
    Bei mir landet der Patch in das Verzeichnis /usr/src . Jetzt wechselt in Euer Quelverzeichnis /usr/src/linux und spielt den Patch von dort aus mit folgendem Befehl ein:

    Code:
    bzcat /usr/src/patch-2.6.16-ck8.bz2 | patch -p1
    Wechselt also nun in Euer Quellverzeichnis und bereitet wie bereits beschrieben den Kernel zum Kompilieren vor. Wenn Ihr den make oldconfig absetzt werden einige neue Optionen auftauchen. Ich persönlich übernehme immer erstmal alles, wie vorgeschlagen. Ihr werdet hierbei nach der Timer Frequenzy zusätzlich gefragt. Stellt diese auf "1000" ein.
    Wenn das Script durch ist ruft auf jeden Fall nochmal den make menuconfig auf. Hier stellen wir nun ein, dass richtig Druck gemacht wird. Geht dazu bitte in das Untermenü "Processor Type and Features" -> "Preemption Model" und wählt "Preemptible Kernel (low latency desktop)" aus. Verlasst das Untermenü. Direkt darunter steht dann noch die Option "Preempt the big Kernel Lock" . Diese bitte ebenso auswählen und als festen Bestandteil (nicht als Modul) in den Kernel kompilieren! Dies sollte dann wie folgt aussehen:


    Speichert nun Euere neue Konfiguration ab und kompiliert Eueren Kernel wie in diesem Howto bereits beschrieben. Die Installation des Kernels erfolgt dann ebenso wie beim ungepatchten Kernel.

    Viel Spaß beim Kernelbauen!

    Literatur:
    Frank Ronneburg: Debian GNU/Linux Anwenderhandbuch (Verlag: Addison-Wesley)
    Nicholas Petreley & Jono Bacon: Linux Desktop Hacks (Verlag: O'Reilly)


    cu
    Gargi
    - Linux macht sexy! -
Lädt...
X