Es ist möglich unter Linux einen neuen Kernel zu kompilieren, anzupassen oder zu patchen. Die Kernelquellen sind auf dem System (falls installiert), im Verzeichnis „/usr/src/“ enthalten. Auf der Internetseite www.kernel.org sind ständig aktelle Kernel und Patches erhältlich.
Grundsätzlich werden zum kompilieren eines Kernels die Programme „gcc“ (GNU Compiler Collection) und „make“, ein Build-Management-Tool um automatisiert Arbeitsschritte zu steuern, benötigt.
In den Beispielen wurde ein Debian 6 Linux mit folgender Kernelversion verwendet.
root@galactica:~# uname -r 2.6.32-5-686
Der gewünschte Kernel kann mit folgenden Kommando heruntergeladen werden.
root@galactica:/usr/src# wget http://www.kernel.org/pub/linux/kernel/v3.0/linux-3.2.35.tar.bz2
Entpacken des Kernels mit folgenden Befehl.
root@galactica:/usr/src# tar -xvjf linux-3.2.35.tar.bz2
Zunächst sollte ein Softlink mit der Bezeichnung „linux“ auf das Verzeichnis mit der Kernelquelle erstellt werden.
root@galactica:/usr/src# ln -s linux-3.2.35/ linux
Um einen Kernel kompilieren zu können, wird vom Kompiler die Datei „.config“ ausgewertet, die entweder aus der bestehenden Kernel konfiguration übernommen („make oldconfig“) oder neu erstellt werden kann. Ist im zu konfigurierenden Kernelverzeichnis keine „.config“ vorhanden, wird in der Regel die bestehende Konfigurationsdatei des aktuellen Kernels verwendet oder komplett neu mit Standardwerten erstellt.
Bei den Abfragen gibt es folgende Einstellungsmöglichkeiten:
Für das Konfigurations Setup der Kernelparameter können nun verschiedene Kommandos verwendet werden.
Der Befehl „make config“ ist jedoch wenig konfortabel, weil hier eine ganze Menge an Parameter über die Kommandzeile abgefragt werden.
root@galactica:/usr/src/linux-3.2.35# make config HOSTCC scripts/basic/fixdep HOSTCC scripts/kconfig/conf.o SHIPPED scripts/kconfig/zconf.tab.c SHIPPED scripts/kconfig/zconf.lex.c SHIPPED scripts/kconfig/zconf.hash.c HOSTCC scripts/kconfig/zconf.tab.o HOSTLD scripts/kconfig/conf scripts/kconfig/conf --oldaskconfig Kconfig # # using defaults found in /boot/config-2.6.32-5-686 # ... * * Linux/i386 3.2.35 Kernel Configuration * * * General setup * Prompt for development and/or incomplete code/drivers (EXPERIMENTAL) [Y/n/?] ...
Benutzt die bestehende Konfiguration eines vorhandenen Kernels und fragt nur Einstellungen ab, die im alten Kernel nicht vorhanden sind.
Um auf das „ncurses“ Bibliothek basierende Konfigurationsmenü zugreifen zu können, muß das Paket „libncurses5-dev“ (Debian ) oder „ncurses-devel“ (Red Hat ) installiert werden und kann dann mit dem Befehl „make menuconfig“ aufgerufen werden.
Ein Konfigurationsfrontend für das ein X-Window System. Hierfür müssen die Pakete „qt3-devel“, „qt4-devel“ (Red Hat ) oder „qt3-dev-tools“, „qt4-dev-tools“ (Debian ) sowie „g++“ und „build-essential“ installiert werden. Bei Fehlermeldungen sollten weitere Abhängigkeiten der Pakete überprüft werden.
Ein Konfigurationsfrontend auf der Basis von GTK+. Um dies zu installieren, bitte alle benötigten Abhängigkeiten der jeweiligen Linux Distributionen überprüfen.
Wurden alle gewünschten Einstellungen vorgenommen, Datei speichern und Konfigurationsprogramm beenden.
# # configuration written to .config #
Zum kompilieren eines Kernels bis zur Version 2.4 sind folgende Kommandos notwendig.
root@galactica:/usr/src/linux-3.2.35# make HOSTLD scripts/kconfig/conf scripts/kconfig/conf --silentoldconfig Kconfig HOSTCC arch/x86/tools/relocs CHK include/linux/version.h UPD include/linux/version.h CHK include/generated/utsrelease.h UPD include/generated/utsrelease.h ... ... ...
Wenn der Kompiliervorgang abgeschlossen ist, kann der statische Teil des Kernels und die Datei „system.map“ nach „/boot“ kopiert werden. Die Dateien kann man manuell kopieren oder automatisch mit.
root@galactica:/usr/src/linux# make install sh /usr/src/linux-3.2.35/arch/x86/boot/install.sh 3.2.35 arch/x86/boot/bzImage \ System.map "/boot"
Die erzeugten Module müssen für den neuen Kernel eingebunden werden.
root@galactica:/usr/src/linux# make modules_install ... ... INSTALL /lib/firmware/sb16/mulaw_main.csp INSTALL /lib/firmware/sb16/alaw_main.csp INSTALL /lib/firmware/sb16/ima_adpcm_init.csp INSTALL /lib/firmware/sb16/ima_adpcm_playback.csp INSTALL /lib/firmware/sb16/ima_adpcm_capture.csp DEPMOD 3.2.35
Die Module für den Kernel 3.2.35 sollten nun im Verzeichnis „/lib/modules“ vorhanden sein.
root@galactica:/lib/modules# ls -l insgesamt 8 drwxr-xr-x 4 root root 4096 11. Dez 18:08 2.6.32-5-686 drwxr-xr-x 3 root root 4096 13. Dez 20:28 3.2.35
Die „initial ramdisk“ ist ein reservierter Bereich im Arbeitsspeicher, der vom Kernel wie eine Festplattenpartition behandelt wird. Die „initial ramdisk“ enthält ein Abbild des Dateisystems und Treiber welche zum Start des Systems benötigt werden.
Zum Erstellen von initrd-Abbildern wird das Programm „mkinitrd“ verwendet. Die „initrd“ ist jedoch mittlerweile veraltet und wurde von „initramfs“ abgelöst. In vielen neueren Linux Systemen funktioniert das Programm „mkinitrd“ auch nicht mehr.
Das „initramfs“ (Initial Ram Filesystem) bezeichnet ein komprimiertes Archiv, das Dateien enthält, die beim Systemstart in den Arbeitsspeicher geladen werden und kann seit dem Kernel 2.5.46 verwendet werden. Zum erstellen eines Initial Ram Filesystems wird das Programm „mkinitramfs“ verwendet.
Um das Programm nutzen zu können muß das Paket „initramfs-tools“ (Debian ) installiert sein.
root@galactica:/usr/src/linux# mkinitramfs -o initrd.img-3.2.35
Erzeugt ein Initial Ram Filesystem für den kompilierten Kernel.
root@galactica:/usr/src/linux# mv initrd.img-3.2.35 /boot
Dies sollte dann noch nach „/boot“ verschoben werden und danach „update-grub“ ausgeführt werden.
Hier liest die Datei initrd.img-3.2.35 die Module von Kernel 2.6.32-5-686 ein.
Danach sollte die Datei „initrd.img-3.2.35“ gelöscht werden.
root@galactica:/boot# rm initrd.img-3.2.35
Und wie folgt neu erstellt werden.
root@galactica:/boot# update-initramfs -cvk initrd.img-3.2.35 ... ... Adding binary /sbin/blkid Adding library /lib/libblkid.so.1 Adding library /lib/libuuid.so.1 Calling hook dmsetup Building cpio /boot/initrd.img-3.2.35.new initramfs
root@galactica:/boot# update-grub Generating grub.cfg ... Found background image: /usr/share/images/desktop-base/desktop-grub.png Found linux image: /boot/vmlinuz-3.2.35 Found initrd image: /boot/initrd.img-3.2.35 Found linux image: /boot/vmlinuz-2.6.32-5-686 Found initrd image: /boot/initrd.img-2.6.32-5-686 done
Bei Debian Systemen kann man das Kommando „update-grub“ verwenden.
# grub.conf generated by anaconda # # Note that you do not have to rerun grub after making changes to this file # NOTICE: You have a /boot partition. This means that # all kernel and initrd paths are relative to /boot/, eg. # root (hd0,0) # kernel /vmlinuz-version ro root=/dev/VolGroup00/LogVol00 # initrd /initrd-version.img #boot=/dev/sda default=0 timeout=5 splashimage=(hd0,0)/grub/splash.xpm.gz hiddenmenu title Scientific Linux SL (2.6.18-308.20.1.el5) root (hd0,0) kernel /vmlinuz-2.6.18-308.20.1.el5 ro root=/dev/VolGroup00/LogVol00 initrd /initrd-2.6.18-308.20.1.el5.img title Scientific Linux SL (2.6.18-308.16.1.el5) root (hd0,0) kernel /vmlinuz-2.6.18-308.16.1.el5 ro root=/dev/VolGroup00/LogVol00 initrd /initrd-2.6.18-308.16.1.el5.img title Scientific Linux (2.6.18-164.2.1.el5) root (hd0,0) kernel /vmlinuz-2.6.18-164.2.1.el5 ro root=/dev/VolGroup00/LogVol00 initrd /initrd-2.6.18-164.2.1.el5.img
Bei Red Hat Systemen muß man die Datei „/boot/grub/grub.conf“ manuell bearbeiten.
Nach einem Neustart sollte es funktionieren.
Das Programm „dracut“ ist eine universelle Schnittstelle zum Erzeugen einer „initramfs“, die von allen Distributionen genutzt werden kann. Hierfür muß das Programm „dracut“ installiert werden.
[root@galactica boot]# dracut initrd-3.2.35.img 3.2.35
Sollen neue Funktionen in die Kernel Quellen integriert werden, können Patches verwendet werden. Viele Linux Distibutionen bieten in ihren Repositories Kernel Patch Dateien an um z.B. zusätzliche Treiber in das System einzubinden. Hierfür wird das Programm „patch“ verwendet.
Syntax:
Optionen:
Beispiel:
root@home:/usr/src# bzip2 -dc patch-3.4.23.bz2 | patch -p1 --dry-run
Hier wird ein Kernelpatch simuliert (--dry-run), die bzip2 Optionen -d dekomprimiert und -c sorgt dafür, dass die Ausgabe nach STDOUT erfolgt.
Dateien, bei denen der Patch fehlgeschlagen ist werden als .rej (reject) Dateien gespeichert.