Lustige Linux Tips

Ulf Kersling Dipl.-Betr.-Wirt (FH) Wirtschaftsinformatik, Lehrer für Fachpraxis

 

 

 

Anleitung - Linux-Kernel kompilieren und installieren

Entnommen von "www.pc-erfahrung.de", Meik Schmidt, erweitert von U. Kersling

Manchmal ist es erforderlich, einen neuen bzw. anderen Linux-Kernel zu kompilieren und zu installieren. Sei es, weil die Entwickler einen neuen Kernel veröffentlicht haben oder vielleicht die eine oder andere Hardware nur mit einer bestimmten Kernel-Version funktioniert. Aber auch wenn man nur Änderungen an dem Kernel vornimmt, muss man den Kernel neu kompilieren. Das Kompilieren stellt an sich gar keine große Schwierigkeiten dar, wenn man einmal die Routine und den Vorgang begriffen hat.

Kernel
Der Kernel hält eine riesige Anzahl an Treibern bereit. Man muss nun die passenden Treiber aktivieren. Dies macht man entweder als Modul oder fest in den Kernel.

Zuerst muss man sich natürlich den geeigneten Kernel von www.kernel.org herunterladen. Hier sei gesagt, dass man von den ungeraden Kernel-Versionen die Finger lassen sollte, denn dies sind Entwickler-Versionen und es nicht garantiert, dass dieser Kernel stabil läuft. Ungerade bedeutet, dass die zweite Ziffer eine ungerade Zahl ist, also 2.3.xx oder 2.5.xx.

Grundlegendes: Welche Hardware habe ich? Als Modul oder fest einkompilieren?

Bevor in diesem Artikel auf das Einrichten und Kompilieren des Kernels eingegangen wird, sollen noch ein paar grundlegende Sachen zum Thema Kernel geklärt sein, denn gerade für den Linux-Einsteiger ist die ganze Thematik doch ein wenig abstrakt. Einer der wichtigsten Aufgaben des Kernels ist es, Treiber für die Hardware des Computers bereit zustellen. Da der Computer nicht nur aus einer Grafikkarte und Prozessor besteht, muss man sich schon ein wenig mehr mit der in seinem Computer verbauten Hardware beschäftigen, denn im Kernel muss man angeben, welcher Chipsatz auf dem Mainboard verbaut, welche Soundkarte man besitzt, ob die Festplatte eine IDE oder SATA-Schnittstelle hat, usw.

Da man detailierte Kenntnisse von seiner Hardware haben muss, stellt sich das Kompilieren und Einrichten des Kernels oftmals als sehr schwierige Angelegenheit dar. Doch mit ein paar Tricks kann auch diese Hürde leicht überprungen werden und man erhält einen optimal auf das System eingestellten und stabilen Kernel.

Eine riesige Hilfe beim Herausfinden der verbauten Hardware stellen so genannte Live-CD's dar. Jeder hat bestimmt schon einmal etwas von den CD's gehört, von denen man ein komplettes Linux-System booten kann, ohne Linux auf dem Rechner vorher installiert zu haben. Bekannte Live-CD's sind Knoppix, die Gentoo- oder Suse-Live-CD. Diese Live-CD's erkennen die Hardware automatisch und nachdem man das Linux-Betriebssystem komplett geladen hat, kann man sich mit dem Befehl "cat" im Verzeichnis /proc/ sämtliche Informationen zu der Hardware im Rechner anzeigen lassen. Gebt einfach mal "cat /proc/" gefolgt von einem doppeltem TAB in die Konsole ein und es erscheint eine Menge an Möglichkeiten, sich Informatuionen anzeigen zu lassen.

   
 

Beispiel: PCI-Geräte anzeigen lassen

cat /proc/pci

Hat man sich ausgiebig über die im Rechner verbaute Hardware informiert, sollte man sich nun an das Einrichten des Kernels machen bzw. die entsprechenden Optionen aktivieren. Die nächste Frage kommt dann automatisch: Als Modul (M) oder fest einkompilieren (*)? Doch was bedeutet überhaupt Modul und fest einkompilieren? Dazu ein kurzer Exkurs in frühere Linux-Tage, als es noch keine Module gab. Hier musste man sich vor dem Kompilieren genauestens Gedanken machen, welche Optionen aktiviert werden und welche nicht, denn die Treiber waren fest im Kernel integriert und wurden immer beim Booten geladen. Wie man im späteren Abschnitt dieses Artikels erfährt, wird nach dem Kompilieren der Kernel in Form einer Datei erstellt. Je mehr Optionen man fest in den Kernel eingebunden hat, desto größer ist die Datei und desto mehr wird beim Booten geladen.

 

TIP:

So schön wie das klingt, bei mir funktioniert dieser Befehl nicht. Irgendetwas an meinem Knoppix 5.0 will noch nicht so, wie ich will.

Ha! Ich hab es herausgefunden:

Der Befehl lautet bei mir: lspci

 

 

Dies hat natürlich den Nachteil, dass auch Treiber geladen werden, die man gerade überhaupt nicht braucht, weil das entsprechende Gerät gar nicht angeschlossen ist (Drucker, Scanner, externe USB-Platte). Außerdem ist man nicht flexibel, beispielsweise wenn man ein neues Gerät anschließt, denn dann muss man den kompletten Kernel neu kompilieren, um den Treiber zu integrieren. Alles in allem ist das feste Einkompilieren nicht sehr praktisch, so dass sich die Linux-Entwickler etwas einfallen lassen haben, nämlich die Module.

config_in_tresor
Damit man die Einstellungen nicht immer wieder vornehmen muss
sollte man die .config-Datei sichern. Darin werden sämtliche Einstellungen gespeichert.

Wenn man einen Treiber als Modul kompiliert, so wird dieser nicht in den Kernel integriert, sondern landet als einzelne Datei im Verzeichnis /etc/modules/. Der Vorteil von Modulen ist zum einen, dass diese nicht automatisch beim Booten geladen werden, sondern der Anwender festlegen kann, was geladen werden soll und was nicht. In einer simplen Textdatei (/etc/modules.autoload/) trägt man nun einfach den Namen des Modules ein, so dass der entsprechende Treiber dann geladen wird. Möchte man aus irgendeinem Grund nicht mehr, dass der Treiber geladen wird, so löscht man den Eintrag wieder. Man kann aber auch während des Betriebs mit dem Befehl "modprobe" ein Modul laden, so dass beispielsweise ein neu angeschlossenes Gerät funktionsbereit ist.

Große Distributionen wie Suse, Mandrake oder RedHat machen sich das Prinzip zu Nutze und kompilieren so gut wie alles als Modul in den Kernel. Wer sich einmal die Kernel-Konfiguration einer solchen Distribution anschaut, wird wahrscheinlich vor lauter M&M's heißhunger auf die gleichnamigen Schokoladen-Trops bekommen :) Beim Booten und während des Betriebs wird dann regelmäßig überprüft, ob neue Hardware hinzugekommen ist, um dann anschließend das Modul zu laden. Ohne die Module müsste hier jedes Mal ein neuer Kernel kompiliert werden, was sehr zeitaufwendig und auf Dauer sehr nervig wäre. Lediglich wenn man zu einer einer anderen Kernel-Version wechselt, müssen auch sämtliche Module neu kompiliert werden, da diese dann nicht mehr kompatibel sind.

   
 

Step By Step

Download und Entpacken

Gehen wir einfach mal davon aus, wir würden den 2.6.18-Kernel kompilieren. Natürlich ist dies nicht mehr der aktuellste Kernel, aber dieses Beispiel funktioniert auch für alle anderen Versionen.Wir laden also die Datei linux-2.6.18.1.tar.bz2 bei www.kernel.org herunter und speichern diese in dem Verzeichnis /usr/src/ . Dieses Verzeichnis beinhaltet in der Regel die Quelldateien von Linux. Nachdem wir also die gepackte Linux-Datei dorthin gespeichert haben, müssen wir diese noch entpacken.

tar xvfj /usr/src/linux-2.6.18.1.tar.bz2

Nachdem dieser Schritt gemacht wurde, kann man nun mit "ls /usr/src/" kontrollieren, ob ein neues Verzeichnis angelegt wurde. Als nächstes müssen wir auf die neuen Linux-Quelldateien zeigen, damit das System weiß, dass in dem neuen Ordner der benötige Quellcode liegt. Hierzu muss der alte Link gelöscht oder umbenannt werden. Das macht man mit folgendem Befehl:

Link löschen
rm /usr/src/linux

Auf neue Linux-Quellen zeigen bzw. neuen Link erstellen
ln -s /usr/src/linux-2.6.18.1/ /usr/src/linux

Kontrolle
ls -n /usr/src/

Bei der Kontrolle müsste ein Eintrag vorhanden sein, der "... linux -> /usr/src/linux-2.6.18.1/" lautet. Ist dies nicht der Fall, löschen Sie den aktuellen Zeiger mit "rm -r /usr/src/linux" und wiederholen Sie den oben genannten Vorgang.

 

TIP:

Das Entpacken dauert auf einem 800 MHz PIII ungefähr 2 Minuten. Die Kernelsourcen sind etwa 40 MB groß.

 

TIP:

Wir haben also die Kernelsourcen heruntergeladen und ins .../src/-Verzeichnis entpackt.

Anschließend haben wir Linux mit Hilfe eines Links gesagt, dass es die neuen Sourcen jetzt im neuen Verzeichnisbaum findet (linux-2.6.18.1)

 

Linux-Kernel konfigurieren

Der nächste Schritt ist der wohl meistgefürchtete Vorgang eines Linux-Users, denn man benötigt nun sämtliche Informationen zu seinem System. In der Konfigurationsdatei des Kernels müssen Sie nun sämtliche Angaben zu Ihrer Hardware machen und die entsprechenden Komponenten in den Kernel einbinden.

Dazu wechseln Sie in das Verzeichnis "/usr/src/linux" und geben den Befehl "make menuconfig" ein. Damit wir den Kernel später überhaupt kompilieren können, benötigt man einen Compiler bzw. eine Programmierumgebung auf dem Linux-System . Sollte eine Meldung a la "Befehl unbekannt" oder ähnliches erscheinen, so sind die Pakete "gcc" und "make" oder die "linux-kernel-headers" nicht auf dem System installiert. Diese muss man noch nachinstallieren. Anschließend erscheint ein textbasierendes Konfigurationsmenü für den Kernel.

In das Linux-Verzeichnis wechseln
cd /usr/src/linux

Aufruf des Konfigurationsmenü
make menuconfig

Nun müssen Sie sich durch die vielen Einstellungsmöglichkeiten durchkämpfen und die entsprechenden Komponenten in den Kernel einbinden.

Alles wunderschön. Ich begreife, wenn überhaupt, nur die hälfte. Toll, was ich alles lerne. Nichtsdestotrotzt soll am Ende eine .config geschrieben werden. Nur wohin bloß? Ich weiß, dass keine Abfrage für den ungeübten User kommt und suche und finde schlußendlich im Verzeichnis /usr/src/linux-2.5.17_old (das ich vorsichtshalber schonmal umbenannt habe, da ich ja langsam auch schlauer werde...) die .config, ha!

 

 

TIP:

Hier liegt eine große Krux begraben. Leider sind nicht immer alle Pakete zum Kompilieren des Kernels installiert. Ich habe Stunden gebraucht, um von einer Fehlermeldung zum richtigen Paket zu kommen.Folgende zusätzliche Pakete werden benötigt, um einen neuen Kernel zu übersetzen:

apt-get install gcc
apt-get install libc5-dev oder besser (weil aktueller) libc6-dev
apt-get install binutils
apt-get install make
apt-get install gawk oder mawk
apt-get install gzip
apt-get install bin86 (auf der i386-Plattform)
apt-get install shellutils
apt-get install grep
apt-get install linux-kernel-headers

Wenn das Kommando make menuconfig zur Kernel-Konfiguration benutzt werden soll, muss das Paket libncurses5-dev installiert sein

apt-get install libncurses5-dev

Einige sind sicherlich bereits installiert. Bei meiner Knoppix 5.0 Installation mussten folgende Pakete mit dem Befehl

apt-get install paketname

apt-get update (ca. 3 Minuten mit DSL)

aktualisiert bzw. nachinstalliert werden, ca. 2 MB:

(ca. 1 Minute)

 

 

Linux-Kernel kompilieren

Ist diese Arbeit erledigt, muss man den Kernel kompilieren. Das macht man mit folgendem Befehl:

(Kernel-Version 2.4)
make dep bzImage modules modules_install

(Kernel-Version 2.6)
make && make modules_install

Die Zeit die mein Rechner für das Kompilieren braucht verwende ich dazu, in der Datei /boot/grub/menu.lst einen neuen Menüeintrag zu erstellen (s. u.)

 

TIP:

"make clean“ <- erklärt sich doch wohl slebst

"make bzImage“ <- Der Kernel wird erstellt

"make modules“ <- Die Kernel-Module werden erstellt

"make modules_install“ <- Die Kernel-Module werden installiert

Der Befehl make && make modules_install dauert etwa 2 bis 3 Stunden auf einem PIII mit 800 MHz.

 

Sie können sich kurz entspannen, einen heißen Tee trinken oder vielleicht eine Zigarette anzünden, denn dieser Vorgang dauert ein paar Minuten. Nachdem der Kernel kompiliert wurde, legt das System den Kernel in dem Verzeichnis "/usr/src/linux/arch/i386/boot" die Datei bzImage an. Diese müssen wir nun in das Bootverzeichnis kopieren. Wichtig dabei ist, dass das Bootverzeichnis auch wirklich gemountet ist, ansonsten wird die Datei nicht kopiert! Vorsichtshalber mit "mount /boot/" das Verzeichnis ins Dateisystem hängen.

Kernel ins Bootverzeichnis kopieren
cp /usr/src/linux/arch/i386/boot/bzImage /boot/vmlinuz-2.6.18.1

Hinweis: Der letzte Teil des Befehls (.../boot/vmlinuz-2.6.18.1) sagt, dass die Datei kopiert und unter dem Namen vmlinuz-2.6.18.1 gespeichert wird. Wählen Sie also einen beliebigen Namen aus, den Sie sich merken können. Haben Sie bis hier alle Punkte erfolgreich durchführen können, können Sie stolz von sich behaupten, dass sie einen Linux-Kernel kompiliert haben.

 

TIP:

Aus irgendeinem Grund besitzen die kompilierten Kernelnamen im Verzeichnis /usr/src/linux/arch/i386/boot die Bezeichnung "vmlinuz-2.6.17". Deshalb nenne ich die neue Kerneldatei "vmlinuz-2.6.18"

Das Programm mkinitrd im Paket initd-tools erzeugt eine Ramdisk mit allen Daten, die zum Kernelstart notwendig sind. Viel später im Bootvorgang wird ja erst das Dateisystem gemountet. Also muss es passend zum Kernel auch eine passene Ramdisk mit -sagen wir mal "Bootdateien"- geben. Von alleine generiert der Aufruf "make" diese Datei nicht.

  Damit Sie nicht immer wieder die Einstellungen erneut auswählen müssen, sollten Sie auf jeden Fall die Datei /usr/src/linux/.config sichern. In dieser Datei werden die Einstellungen gespeichert. Sollten Sie später einen anderen Kernel benutzen, so brauchen Sie nur diese Datei in das /usr/src/linux/ Verzeichnis kopieren und die Einstellungen überprüfen, ob auch alles so weit stimmt. Selbst wenn Sie eine andere Kernel-Version verwenden möchten, kann man die alte .config-Datei benutzen. So ist es nicht mehr erforderlich, sich durch jeden einzelnen Menüpunkt in der Kernelkonfiguration zu "hangeln".  

Die ".config"s finden sich in den Installationsverzeichnissen der Kernelsourcen:

/usr/src/linux-2.6.17.x/.config

/usr/src/linux-2.6.18.1/.config

 

Bootloader einrichten

All diese Vorgänge bleiben wirkungslos, wenn wir dem System nicht sagen, dass er auch den neuen Kernel booten soll. Dazu müssen wir die Booteinstellungen ändern, was wir in diesem Fall über "LILO" machen. LILO ist ein Bootmanager, über den wir Booteinstellungen vornehmen können. Es gibt aber noch einige andere Bootmanager (Grub, etc). Wenn Sie also über einen anderen Bootmanager verfügen, müssen Sie mal einen Blick in die Readme werfen. Das Prinzip ist aber immer dasselbe.

Zuerst öffnen wir mit einem Texteditor (nano oder joe) die Konfigurationsdatei von Lilo, nämlich "lilo.conf". Dazu geben wir folgenden Befehl ein:

LILO-Konfigurationsdatei
nano -w /etc/lilo.conf

 

TIP:

Es gibt den Bootloader in einer neuen Variante: "GRUB". Über die Datei:

/boot/grub/menu.lst werden die Einträge für das Bootmenü vorgenommen. Diverse Links bei anderen Distributionen führen zu Verwirrung:

/etc/grub.conf -> /etc/grub/grub.conf

/etc/grub/grub.conf -> /boot/grub/menu.lst

 

 

Daraufhin sehen wir die Bootroutine, die wir nun ändern müssen. Um auf der sicheren Seite zu sein, legen wir den neu kompilierten Kernel als zusätzliche Bootmöglichkeit an. Sollte der neue Kernel fehlerhaft sein, kann man dann noch von dem altem, funktionierendem Kernel starten. Hier ein Ausschnitt aus der lilo.conf:

image = /boot/bzImage #alter Kernel
root = /dev/hda1
label = linux
read-only

image = /boot/linux-2.6.18 #neuer Kernel
root = /dev/hda1
label = linux
read-only

Wie man gut erkennen kann, haben wir zu dem alten Kernel noch eine alternative Bootmöglichkeit abgegeben. Dazu sollten Sie nach "image =" den Pfad zum neuen Kernel angeben. Da wir im vorigen Schritt den Kernel nach /boot kopiert und ihn linux-2.6.18 genannt haben, müssen wir diesen Pfad nun auch in der lilo.conf angeben. Beim Neustart erscheint dann das Auswahlmenü, wo Sie entscheiden können, ob Sie von dem neuen Kernel oder vom alten Kernel starten möchten.

Die Änderungen in der lilo.conf müssen nun noch gespeichert werden. Dies macht man mit hilfe folgenden Befehls:

Speichern von lilo
/sbin/lilo

Nun können Sie Ihr System neustarten und die vom neuen Kernel booten!

Schlussworte

Lassen Sie sich nicht von dem komplexen Vorgehen entmutigen. Hat man einmal einen Kernel erfolgreich kompiliert und installiert, stellen die nächsten Änderungen am Kernel für Sie keine Probleme mehr da.

Diese Anleitung müssen Sie nicht nur beim installieren eines komplett neuen Kernels benutzen, sondern auch, wenn Sie Änderungen a, aktuellen Kernel vornehmen.

 

Das Booten mit dem neuen Kernel funktioniert nicht. Ich sichere die /usr/src/linux-2.6.18.1/.conf nach /usr/src/linux-2.6.18.1/.conf_1.6.18.1_uk. Ich ersetze die /usr/src/linux-2.6.18.1/.conf mit der /usr/src/linux-2.6.17/.conf. Der Befehl lautet:

cp /usr/src/linux-2.6.17/.conf /usr/src/linux-2.6.18.1/.conf

Ich starte ein neues

make menuconfig.

Die einzige Änderung in der .conf ist die Anpassung des Prozessoreintrags i386 auf den Prozessor PIII, Coppermine. Ich speichere die neue .conf ab.

Es folgt:

make && make modules_install

 


Dateien auf einen anderen Linuxrechner kopieren:

Innerhalb einer Secure-Shell (SSH) können Dateien auf verschiedene Linuxrechner mit dem Befehl "scp" kopiert werden.

Zum Übertragen von einem anderen Server auf den lokalen Rechner:
scp Benutzername@Servername:Quellpfad Zielpfad

Zum Übertragen vom lokalen Rechner auf einen anderen Server:
scp Quellpfad Benutzername@Servername:Zielpfad

Optionen

* -r rekursives Kopieren mehrer Dateien inklusive der Unterverzeichnisse
* -p Änderungs- und Zugriffszeiten der Dateien sowie die Berechtigungen (rwxrwxrwx) werden beim Kopieren beibehalten
* -q deaktiviert die Ausgabe von Statistiken
* -Q aktiviert die Ausgabe von Statistiken
* -l limit begrenzt die benutzte Bandbreite, wird in Kbit/s angegeben
* -o ssh_option hier können ssh Optionen angegeben werden, die nicht explizit für scp definiert wurden. Für mehr Infos siehe ssh_config. 


 



Ein Video mit FFMpeg transcodieren:

(Dank an "hunter" aus dem Linuxforum.de)

Beispiel:

Input: abc.mpg, Mpeg, 30 Bilder/Sek. (NTSC), 128 kBit/s, 48.000 kHz, 400x300
gewünschter Output: abc.avi, mjpeg, 25 Bilder/Sek. (PAL), 224 kBit/s, 44.000 kHz, 352x288

Kommando:

ffmpeg -i abc.mpg -r 25 -ab 224 -ar 44100 -vcodec mjpeg -acodec mp2 -s 352x288 -sameq abc.avi
Die wichtigsten Optionen für De und Encoder:

-b -> Video Bitrate (in kbit/s) -> z.B. 200

-r -> Bilder pro Sekunde -> 25 für PAL (nur wichtig falls Inputfile NTSC = 30 ist)

-sameq -> versucht die Qualität des Eingangsfiles zu erhalten (in der Regel empfohlen)

-pass n -> n = 1 oder n = 2 für 1 Pass Encoding oder 2 Pass Encoding (kann entscheidend für die Qualität sein)


-ab -> Audio bitrate (in kbit/s) -> z.B. 192 für SVCD oder 224 für VCD

-ar -> Audio Samplerate -> in der Regel sollte das 44100 sein


-vcodec -> Der Videocodec des Ausgangsfiles (z.B. mjpeg oder mpeg1video (VCD))

-acodec -> Der Audiocodec des Ausgangsfiles (z.B. mp2 oder mp3)


-s -> Auflösung des Ausgangsfiles -> z.B. 480x576 (SVCD) oder 352x288 (VCD)