Eigenen Kernel erstellen: Unterschied zwischen den Versionen

Aus wiki.archlinux.de
GerBra (Diskussion | Beiträge)
Start
 
GerBra (Diskussion | Beiträge)
Erster Entwurf
Zeile 1: Zeile 1:
Eigener Kernel
==Eigener Kernel unter ArchLinux==
Anleitung zum Bau eines eigenen Kernels. Gedacht als „Reserve-Kernel“ sowie auch um eigene Änderungen zum Standard-Kernel einzubinden. Dieser Kernel soll nicht einen bereits installierten Arch-Kernel überschreiben, oder von diesem überschrieben werden.
 
Vorgestellt werden Wege ohne und mit dem ArchLinux-Paketmanagement.<br>
Es bietet sich an, diesen Beitrag einmal komplett durchzulesen. Wenn man das Prinzip einmal verstanden, und ein paar Gehversuche hinter sich hat, dann ist das Thema recht einfach. Nur: Am Anfang haben die Götter den Schweiß gesetzt ;-)
 
#eigener Kernel ohne das Paketmanagement („the old way“)
#:Vorteile
#::*Man kommt schnell zum eigenen Kernel, weniger Vorarbeiten
#::*Extrem gut an die eigene Hardware anpassbar
#:Nachteile
#::*Konfiguration erfordert etwas Erfahrung
#::*Nachträglich schwerer wartbar
#eigener Kernel mit dem Paketmanagement ("the arch way")
#:'''Achtung''':Dieser Teil ist noch nicht fertig!(Siehe Diskussion)
#:Vorteile
#::*Extrem gut an die eigene Hardware anpassbar
#::*Nachträglich gut wartbar
#:Nachteile
#::*Erfordert einiges an Vorarbeiten
#den ArchLinux-Standardkernel als eigener Kernel anpassen.
#:Vorteile
#::*Nachträglich gut wartbar
#::*Hat alle Treiber und Patches, die der Arch-Kernel auch hat
#::*Die schnellste Methode um an einen **lauffähigen** Kernel zu kommen
#:Nachteile
#::*Erfordert einiges an Vorarbeiten
 
=== Vorarbeiten ===
Das ArchBuildSystem(ABS) sollte eingerichtet sein und synchronisiert.
pacman -Sy cvsup wget
abs
 
=== Kernel "the old way" ===
Diese Methode zeigt, wie ein eigener Kernel auf "althergebrachte" Art gebaut und installiert werden kann. Also ohne diesen mit pacman installieren bzw. deinstallieren zu können. Dieser Kernel enthält kein Initrd-Image (gelogen...).
 
'''Kernel-Sourcecode besorgen'''
 
Kernelsourcen von http://www.kernel.org besorgen.<br>
Hier exemplarisch für den 2.6.22.
 
'''Auspacken'''
<pre>
cp $downloaddir/linux-2.6.22.tar.bz2 /usr/src/
cd /usr/src
tar xvjf linux-2.6.22.tar.bz2
cd /usr/scr/linux-2.6.22
</pre>
 
'''Kernel konfigurieren'''
 
Hier wird der Kernel an die eigene Hardware angepaßt. Das ist nur etwas für erfahrene User (oder welche, die lernen wollen). Es sollte unbedingt die README im Kernel-Source-Verzeichniss gelesen werden.
 
Zwei Wege werden vorgestellt: Die Config selbst erstellen (ggf. unter Verwendung einer Vorlage eines anderen Kernels) und die, bei der einfach die config des Arch-Standard-Kernels genutzt wird.
 
1. Eigene Konfig
Da keine initrd erstellt wird '''müssen''' alle zum Booten benötigten Treiber (Harddisk-Controller, Root-Dateisystem) fest in den Kernel kompiliert werden. Also nicht als ladbare Module!
Den Kernel konfigurieren mit einem der Front-Ends:
:* make menuconfig
:* make xconfig
:* make gconfig
Dies erstellt uns die Konfiguration .config im Kernelsource-Verzeichniss.
 
2. Konfig des Arch-Standard-Kernels als Grundlage nehmen
Ausgang sei hier der Arch-Kernel 2.6.22. Fallstrick: Diese Config basiert auch auf den im ArchLinux-Kernel installierten bzw. hinzugefügten Patches. Die Weiterverwendung dieser Config kann also gutgehen, muß aber nicht.
cp /boot/kconfig26 /usr/src/linux-2.6.22/.config</pre>
make oldconfig
Die Datei .config mit einem Editor öffnen. Folgendes ändern:
#
# General setup
#
CONFIG_LOCALVERSION="-ARCH"
CONFIG_LOCALVERSION_AUTO=y
CONFIG_SWAP=y
Hier CONFIG_LOCALVERSION ändern zu ="".<br>
Was dieser Parameter bewirkt siehe [[Eigener_Kernel_erstellen#Welche Parameter bewirken Namensänderungen?]].
 
'''Kompilieren'''
 
Der Kernel und die Module werden kompiliert mit:
  make
 
'''Kernel und Module installieren'''
 
Ich gehe hier von einer 32bit-Architektur aus. Für 64bit die Pfade entsprechend anpassen.<br>
'''Hilfe''': Kann das jemand für 64bit ergänzen/anpassen?<br>
Das Kernel-Image wird so nach /boot installiert:
  cp arch/i386/boot/bzImage /boot/vmlinuz
  cp System.map /boot/
  cp .config /boot/kconfig
Die Module installieren:
  make modules_install
 
'''(Doch) eine initrd erzeugen'''
 
Achtung: dieser Schritt wird nur benötigt, wenn oben die ArchLinux-Config als Vorlage genommen wurde (''Konfig des Arch-Standard-Kernels als Grundlage nehmen''). Bei der ArchLinux-Config sind die meisten Treiber als ladbare Module konfiguriert, deshalb muß zwingend auch für diesen Kernel eine initrd erstellt werden.
  mkinitcpio -k 2.6.22 -g /boot/initrd.img
Weiterhin muß im nächsten Abschnitt (Boot-Loader) diese erstelle initrd in den Grub-Eintrag hinzugefügt werden.
 
'''Boot-Loader (Grub) anpassen'''
 
Die Datei /boot/grub/menu.list um folgenden Eintrag erweitern. Die Einträge zu root und root= analog der eigenen menu.list anpassen!
<pre>
# Eigener Kernel
title  Eigener Kernel
root  (hd0,0)
kernel /vmlinuz root=/dev/sda3 ro
</pre>
oder wenn oben eine initrd erstellt wurde:
<pre>
# Eigener Kernel
title  Eigener Kernel
root  (hd0,0)
kernel /vmlinuz root=/dev/sda3 ro
initrd /initrd.img
</pre>
 
'''Was ist alles wo installiert, wie lösche ich den Kernel wieder?'''
Ziel war, daß dieser Kernel nicht mit einem Arch-Kernel kollidiert. Folgende Einzel-Dateien bzw. Verzeichnisse wurden installiert und können problemlos wieder von Hand gelöscht werden:
* /boot/vmlinuz (der Kernel)
* /boot/System.map (Debug/Modul-Symboltabelle)
* /boot/initrd.img (wenn ein initrd image erstellt wurde)
* /boot/kconfig (Die Kernel-Konfig-Datei als Vorlage für spätere Änderungen)
* /lib/modules/2.6.22 (das Verzeichniss mit den ladbaren Modulen)
* /usr/src/linux-2.6.22 (die Kernel-Sources)
Der Kernel meldet sich so:
[gbdev@archdev ~]$ uname -r
2.6.22
 
=== Den ArchLinux Standard-Kernel als eigener, zusätzlicher Kernel ===
 
Unser Kernel soll ein eigenständiger Kernel sein, mit dem Namen 2.6.22-custom.
 
ABS aktualisieren
  abs
Kernel-Steuerdateien in eigenes Verzeichniss kopieren
  cp -R /var/abs/kernels/kernel26 /var/abs/local/
  cd /var/abs/local
  mv kernel26 kernel26custom
  cd kernel26custom
Dateien an eigenen Namen anpassen
  mv mkinitcpio-kernel26.conf mkinitcpio-kernel26custom.conf
  mv kernel26.install kernel26custom.install
  mv kernel26.preset kernel26custom.preset
Jetzt müssen einige Dateien editiert werden. Ich dokumentiere diese Änderungen anhand von diff-Vergleichen. Die Zeilen mit @@ enthalten Zeilen/Spaltennummern zum schnelleren Auffinden der Textstellen. Textänderungen sind so dokumentiert, daß die Zeile mit dem Minus(-) zur folgenden Zeile mit dem Plus(+) abgeändert werden muß. Wenn eine Zeile nur ein Plus hat (wie _ownver), dann ist diese Zeile an dieser Stelle hinzuzufügen.
 
'''PKGBUILD'''<br>
Als erstes in dieser Datei den gesamten Block md5sum=(xyz) löschen. Das sind Prüfsummen um die Integrität der Dateien beim Bauen zu überprüfen. Da wir einige Dateien ändern müssen wir diese Prüfsummen später neu berechnen lassen.
<pre>
@@ -1,15 +1,16 @@
# $Id: PKGBUILD,v 1.247 2007/08/15 21:08:35 thomas Exp $
# Maintainer: Tobias Powalowski <tpowa@archlinux.org>
# Maintainer: Thomas Baechler <thomas@archlinux.org>
-pkgname=kernel26
+pkgname=kernel26custom
_basekernel=2.6.22
pkgver=2.6.22.3
+_ownver=custom
pkgrel=1
-pkgdesc="The Linux Kernel and modules"
+pkgdesc="The Linux Kernel and modules (Custom)"
arch=(i686 x86_64)
license=('GPL2')
url="http://www.kernel.org"
-backup=('boot/kconfig26' etc/mkinitcpio.d/${pkgname}.preset)
+backup=('boot/kconfig26${_ownver}' etc/mkinitcpio.d/${pkgname}.preset)
depends=('module-init-tools' 'mkinitcpio>=0.5.15')
# pwc, ieee80211 and hostap-driver26 modules are included in kernel26 now
# nforce package support was abandoned by nvidia, kernel modules should cover everything now.
@@ -18,7 +19,7 @@
          'alsa-driver' 'ieee80211' 'hostap-driver26'
          'pwc' 'nforce' 'squashfs' 'unionfs' 'ivtv'
          'zd1211' 'kvm-modules')
-install=kernel26.install
+install=kernel26custom.install
source=(ftp://ftp.kernel.org/pub/linux/kernel/v2.6/linux-$_basekernel.tar.bz2
        #http://www.kernel.org/pub/linux/kernel/v2.6/testing/patch-2.6.22-rc7.bz2
        #http://www.kernel.org/pub/linux/kernel/v2.6/snapshots/patch-2.6.22-rc7-git2.bz2
@@ -27,7 +28,7 @@
        logo_linux_clut224.ppm
        logo_linux_mono.pbm
        logo_linux_vga16.ppm
-        kernel26.preset
+        kernel26custom.preset
        mkinitcpio-$pkgname.conf
        acpi-dsdt-initrd-v0.8.4-2.6.21.patch
        toshiba-bluetooth.patch
@@ -108,15 +109,15 @@
  make bzImage modules || return 1
  mkdir -p $startdir/pkg/{lib/modules,boot}
  make INSTALL_MOD_PATH=$startdir/pkg modules_install || return 1
-  cp System.map $startdir/pkg/boot/System.map26
-  cp arch/$KARCH/boot/bzImage $startdir/pkg/boot/vmlinuz26
+  cp System.map $startdir/pkg/boot/System.map26${_ownver}
+  cp arch/$KARCH/boot/bzImage $startdir/pkg/boot/vmlinuz26${_ownver}
  install -D -m644 Makefile \
    $startdir/pkg/usr/src/linux-${_kernver}/Makefile
  install -D -m644 kernel/Makefile \
    $startdir/pkg/usr/src/linux-${_kernver}/kernel/Makefile
  install -D -m644 .config \
    $startdir/pkg/usr/src/linux-${_kernver}/.config
-  install -D -m644 .config $startdir/pkg/boot/kconfig26
+  install -D -m644 .config $startdir/pkg/boot/kconfig26${_ownver}
  mkdir -p $startdir/pkg/usr/src/linux-${_kernver}/include
 
  mkdir -p $startdir/pkg/usr/src/linux-${_kernver}/arch/$KARCH/kernel
@@ -185,6 +186,6 @@
  install -m644 -D $startdir/src/${pkgname}.preset $startdir/pkg/etc/mkinitcpio.d/${pkgname}.preset || return 1
  install -m644 -D $startdir/src/mkinitcpio-$pkgname.conf $startdir/pkg/etc/mkinitcpio.d/$pkgname-fallback.conf || return 1
  # set correct depmod command for install
-  sed -i -e "s/KERNEL_VERSION=.*/KERNEL_VERSION=${_kernver}/g" $startdir/kernel26.install
+  sed -i -e "s/KERNEL_VERSION=.*/KERNEL_VERSION=${_kernver}/g" $startdir/kernel26${_ownver}.install
  echo -e "# DO NOT EDIT THIS FILE\nALL_kver='${_kernver}'" > ${startdir}/pkg/etc/mkinitcpio.d/${pkgname}.kver
}
</pre>
 
'''kernel26custom.preset'''<br>
<pre>
@@ -1,14 +1,14 @@
-# mkinitcpio preset file for kernel26
+# mkinitcpio preset file for kernel26custom
 
########################################
# DO NEVER EDIT THIS LINE:
-source /etc/mkinitcpio.d/kernel26.kver
+source /etc/mkinitcpio.d/kernel26custom.kver
########################################
 
PRESETS=('default' 'fallback')
 
default_config="/etc/mkinitcpio.conf"
-default_image="/boot/kernel26.img"
+default_image="/boot/kernel26custom.img"
 
-fallback_config="/etc/mkinitcpio.d/kernel26-fallback.conf"
-fallback_image="/boot/kernel26-fallback.img"
+fallback_config="/etc/mkinitcpio.d/kernel26custom-fallback.conf"
+fallback_image="/boot/kernel26custom-fallback.img"
</pre>
 
'''kernel26custom.install'''<br>
<pre>
@@ -1,7 +1,8 @@
# arg 1:  the new package version
# arg 2:  the old package version
 
-KERNEL_VERSION=2.6.22-ARCH
+KERNEL_VERSION=2.6.22-custom
+_ownver=custom
 
post_install () {
  # updating module dependencies
@@ -17,11 +18,11 @@
  echo ""
  echo ">>> Generating initial ramdisk, using mkinitcpio.  Please wait..."
if [ "`vercmp $2 2.6.19`" -lt 0 ]; then
-  /sbin/mkinitcpio -p kernel26 -m "ATTENTION:\nIf you get a kernel panic below
+  /sbin/mkinitcpio -p kernel26${_ownver} -m "ATTENTION:\nIf you get a kernel panic below
and are using an Intel chipset, append 'earlymodules=piix' to the
kernel commandline"
else
-  /sbin/mkinitcpio -p kernel26
+  /sbin/mkinitcpio -p kernel26${_ownver}
fi
if [ "`vercmp $2 2.6.21`" -lt 0 ]; then
  echo ""
@@ -136,11 +137,11 @@
  echo ""
  echo ">>> Generating initial ramdisk, using mkinitcpio.  Please wait..."
if [ "`vercmp $2 2.6.19`" -lt 0 ]; then
-  /sbin/mkinitcpio -p kernel26 -m "ATTENTION:\nIf you get a kernel panic below
+  /sbin/mkinitcpio -p kernel26${_ownver} -m "ATTENTION:\nIf you get a kernel panic below
and are using an Intel chipset, append 'earlymodules=piix' to the
kernel commandline"
else
-  /sbin/mkinitcpio -p kernel26
+  /sbin/mkinitcpio -p kernel26${_ownver}
fi
if [ "`vercmp $2 2.6.21`" -lt 0 ]; then
  echo ""
</pre>
 
'''config'''<br>
<pre>
#
# General setup
#
-CONFIG_LOCALVERSION="-ARCH"
+CONFIG_LOCALVERSION="-custom"
CONFIG_LOCALVERSION_AUTO=y
</file>
 
**config.x86_64**\\
<file>
#
# General setup
#
-CONFIG_LOCALVERSION="-ARCH"
+CONFIG_LOCALVERSION="-custom"
CONFIG_LOCALVERSION_AUTO=y
</pre>
 
Das war's jetzt mit dem Editieren, Ehrenwort ;-)
 
Jetzt laden wir den Kernelsource und die Patches aus dem Internet und lassen uns Prüfsummen generieren. Dank makepkg wird uns das ganz einfach gemacht.
  makepkg -g >> PKGBUILD
Nun können wir endlich den Computer etwas arbeiten lassen und uns einen Kaffee/Tee gönnen
  makepkg
Wenn das Kompilieren/Bauen fertig ist sehen wir am Ende folgende Meldungen:
  ==> Compressing package...
  ==> Finished making: kernel26custom  (Wed Aug 15 08:59:23 CEST 2007)
In unserem aktuellen Verzeichnis finden wir jetzt unser Kernel-Paket
  kernel26custom-2.6.22.3-1-i686.pkg.tar.gz
Dieses Paket werden wir jetzt mit pacman installieren. Bei der Installation verhält es sich so, wie wir es von "normalen" Kernel-Installationen gewohnt sind.
  pacman -U kernel26custom-2.6.22.3-1-i686.pkg.tar.gz
Jetzt fehlt lediglich noch der Eintrag im Bootloader (Grub) für unseren neuen Kernel.  Die Einträge zu root und root= analog der eigenen menu.list anpassen!
<pre>
# Eigener Kernel 2
title  Eigener Kernel (custom)
root  (hd0,0)
kernel /vmlinuz26custom root=/dev/sda3 ro
initrd /kernel26custom.img
 
# (1) Arch Linux
title  Eigener Kernel (custom) Fallback
root  (hd0,0)
kernel /vmlinuz26custom root=/dev/sda3 ro
initrd /kernel26custom-fallback.img
</pre>
 
=== Kernel "the arch way" ===
Ziel ist es, einen eigenen Kernel basierend auf den Sourcen von [http://www.kernel.org] zu bauen, diesmal aber als Arch-Paket. Dieses Paket wird über pacman installiert und kann so auch einfach aktualisiert oder entfernt werden.
 
Dafür werden wir u.a. eine PKGBUILD Steuerdatei erstellen, die sich prinzipiell an der orientiert, die auch zum Bauen des Arch-Standardkernels verwendet wird.<br>
Der so erstellte Kernel soll einen eigenen Namen bekommen. Für dieses Beispiel anhand des 2.6.22 Kernels soll dieser nacher 2.6.22-custom heißen.
 
Um die notwendigen Vorlagen zu bekommen (natürlich kann man auch die Beispiele hieraus verwenden) sollte das [Abs|ArchBuildSystem(ABS)] auf dem PC eingerichtet und synchronisiert sein.
  pacman -Sy cvsup wget
  abs
Die von uns als Vorlagen nötigen Dateien befinden sich in /var/abs/kernels/kernel26.
 
Zum Bauen erstellen wir ein eigenes Verzeichniss, hier als Beispiel im $HOME-Verzeichniss.
  mkdir $HOME/kernel26-custom
  cd $HOME/kernel26-custom
Wir benötigen fünf Dateien, die wir entweder dem Arch-Kernel aus dem ABS klauen oder hier aus den Beispielen kopieren/abschreiben.
<pre>
ls -1 $HOME/kernel26-custom
PKGBUILD
kernel26custom-fallback.conf
kernel26custom.conf
kernel26custom.install
kernel26custom.preset
</pre>
Hier jetzt die Dateien. Die Stellen, an denen wir unseren Zusatz custom ergänzen müssen, habe ich mit <pre>***custom***</pre> markiert. Die 3 Sterne (*) um das Wort custom dienen lediglich zur Kenntlichmachung und müssen in den Dateien entfernt werden.<br>
Prinzipiell kann man in der PKGBUILD nach kernel26 suchen und dort seine Endung anhängen
 
'''PKGBUILD'''<br>
<pre>
# Contributor: Hier dein Name
 
pkgname=kernel26***custom***
basekernel=2.6.22
pkgver=2.6.22.***custom***
pkgrel=1
pkgdesc="The Linux Kernel and modules  (Eigener Kernel)"
url=""
license="GPL"
arch=('i686')
backup=('boot/kconfig26***custom***' 'etc/mkinitcpio.d/kernel26***custom***.preset')
depends=('module-init-tools' 'mkinitcpio>=0.5.11')
install=kernel26***custom***.install
source=(ftp://ftp.kernel.org/pub/linux/kernel/v2.6/linux-${basekernel}.tar.bz2 \
        kernel26***custom***.preset \
        kernel26***custom***-fallback.conf \
        )
build() {
  KARCH=i386
  cd $startdir/src/linux-${basekernel}
 
  # load configuration
  #yes "" | make config
  #make oldconfig || return 1
  ##make menuconfig || return 1
  make defconfig || return 1
  make menuconfig || return 1
  #make gconfig || return 1
  . ./.config
  _kernver="${basekernel}${CONFIG_LOCALVERSION}"
 
# build!
  make bzImage modules || return 1
  mkdir -p $startdir/pkg/{lib/modules,boot}
  make INSTALL_MOD_PATH=$startdir/pkg modules_install || return 1
  cp System.map $startdir/pkg/boot/System.map26***custom***
  cp arch/$KARCH/boot/bzImage $startdir/pkg/boot/vmlinuz26***custom***
  install -D -m644 Makefile \
    $startdir/pkg/usr/src/linux-${_kernver}/Makefile
  install -D -m644 kernel/Makefile \
    $startdir/pkg/usr/src/linux-${_kernver}/kernel/Makefile
  install -D -m644 .config \
    $startdir/pkg/usr/src/linux-${_kernver}/.config
  install -D -m644 .config $startdir/pkg/boot/kconfig26***custom***
  mkdir -p $startdir/pkg/usr/src/linux-${_kernver}/include
 
  mkdir -p $startdir/pkg/usr/src/linux-${_kernver}/arch/$KARCH/kernel
  for i in acpi asm-generic asm-$KARCH config linux math-emu media net pcmcia scsi sound video; do
    cp -a include/$i $startdir/pkg/usr/src/linux-${_kernver}/include/
  done
 
  # copy files necessary for later builds, like nvidia and vmware
  cp Module.symvers $startdir/pkg/usr/src/linux-${_kernver}
  cp -a scripts $startdir/pkg/usr/src/linux-${_kernver}
  # fix permissions on scripts dir
  chmod og-w -R $startdir/pkg/usr/src/linux-${_kernver}/scripts
  mkdir -p $startdir/pkg/usr/src/linux-${_kernver}/.tmp_versions
 
  cp arch/$KARCH/Makefile $startdir/pkg/usr/src/linux-${_kernver}/arch/$KARCH/
  cp arch/$KARCH/Makefile.cpu $startdir/pkg/usr/src/linux-${_kernver}/arch/$KARCH/
  cp arch/$KARCH/kernel/asm-offsets.s $startdir/pkg/usr/src/linux-${_kernver}/arch/$KARCH/kernel/
 
  # add headers for lirc package
  mkdir -p $startdir/pkg/usr/src/linux-${_kernver}/drivers/media/video
  cp drivers/media/video/*.h  $startdir/pkg/usr/src/linux-${_kernver}/drivers/media/video/
  for i in bt8xx cpia2 cx25840 cx88 em28xx et61x251 pwc saa7134 sn9c102 usbvideo zc0301; do
  mkdir -p $startdir/pkg/usr/src/linux-${_kernver}/drivers/media/video/$i
  cp -a drivers/media/video/$i/*.h $startdir/pkg/usr/src/linux-${_kernver}/drivers/media/video/$i
  done
  # add dm headers
  mkdir -p $startdir/pkg/usr/src/linux-${_kernver}/drivers/md
  cp drivers/md/*.h  $startdir/pkg/usr/src/linux-${_kernver}/drivers/md
  # add inotify.h
  mkdir -p $startdir/pkg/usr/src/linux-${_kernver}/include/linux
  cp include/linux/inotify.h $startdir/pkg/usr/src/linux-${_kernver}/include/linux/
  # add CLUSTERIP file for iptables
  mkdir -p $startdir/pkg/usr/src/linux-${_kernver}/net/ipv4/netfilter/
  cp net/ipv4/netfilter/ipt_CLUSTERIP.c $startdir/pkg/usr/src/linux-${_kernver}/net/ipv4/netfilter/
  # copy in Kconfig files
  for i in `find . -name "Kconfig*"`; do
    mkdir -p $startdir/pkg/usr/src/linux-${_kernver}/`echo $i | sed 's|/Kconfig.*||'`
    cp $i $startdir/pkg/usr/src/linux-${_kernver}/$i
  done
 
  cd $startdir/pkg/usr/src/linux-${_kernver}/include && ln -s asm-$KARCH asm
 
  chown -R root.root $startdir/pkg/usr/src/linux-${_kernver}
  cd $startdir/pkg/lib/modules/${_kernver} && \
    (rm -f source build; ln -sf ../../../usr/src/linux-${_kernver} build)
  # for binary modules make prepare
  cd $startdir/pkg/lib/modules/${_kernver}/build
  make prepare
  # install fallback mkinitcpio.conf and kernel preset files
  install -m644 -D $startdir/src/kernel26***custom***.preset $startdir/pkg/etc/mkinitcpio.d/kernel26***custom***.preset
  install -m644 -D $startdir/src/kernel26***custom***-fallback.conf $startdir/pkg/etc/mkinitcpio.d/kernel26***custom***-fallback.conf
  # set correct depmod command for install
  sed -i -e "s/KERNEL_VERSION=.*/KERNEL_VERSION=${_kernver}/g" $startdir/kernel26***custom***.install
  echo -e "# NEVER EDIT THIS FILE\nALL_kver='${_kernver}'" > ${startdir}/pkg/etc/mkinitcpio.d/kernel26***custom***.kver
}
</pre>
makepkg -g make menuconfig → General setup→ Local version = -custom
 
=== Welche Parameter bewirken Namensänderungen? ===
Es gibt bei den vorgestellten Verfahren mehrere Parameter in verschiedenen Configs, die später eine Auswirkung darauf haben:
* wie der Kernel "heißt" (uname -r)
* wie daß Verzeichniss heißt, in dem die Module installiert werden (/lib/modules/$name)
* wie das ArchLinux-Paket heißt (unser Paket darf im Paketsystem z.B. nicht mit dem Paket kernel26 kollidieren)
'''''.config'''''<br>
Die Kernel-Config, die wir z.B. mit make menuconfig erstellen oder die beim Arch-Standard-Kernel analog obigen Beispielen in $HOME/kernel26-custom als config bzw. config.x86_64 liegt.
<pre>
#
# General setup
#
CONFIG_LOCALVERSION="-custom"
</pre>
Was wir hier eintragen wird intern an den Kernel-Namen angehängt und bewirkt u.a. auch, wie das Modul-Verzeichniss heißt. Wenn wir CONFIG_LOCALVERSION="-custom" eintragen, dann wird der Kernel die Module in /lib/modules/2.6.22-custom suchen.
 
'''''PKGBUILD'''''<br>
Wenn wir einen Kernel mit dem Paketmanagement bauen, dann haben Parameter darin Auswirkungen wie später das gebaute Paket heißt und welchen Namen der Kernel in der Paketdatenbank hat. Dies müssen wir anpassen um nicht mit den Standard-Kerneln zu kollidieren.
  pkgname=kernel26custom
Dies bewirkt, wie das Paket zum Installieren heißt (blabla.pkg.tar.gz), welchen Namen Verzeichnisse und Kernel bzw. initrd-Image haben.
  _ownver=custom
Dies ist ein eigener Parameter, den wir benutzen um in der Steuerdatei unseren Versionszusatz an z.B. Kopieraktionen anzuhängen.
  pkgrel=1
Wenn wir unseren eigenen Kernel später mal verändern, dann sollten wir diesen Parameter um Eins erhöhen. Dadurch können wir mit pacman unser Paket leicht aktualisieren.


== test ==


[[Kategorie:Unvollständig]]
[[Kategorie:Unvollständig]]

Version vom 16. August 2007, 09:48 Uhr

Eigener Kernel unter ArchLinux

Anleitung zum Bau eines eigenen Kernels. Gedacht als „Reserve-Kernel“ sowie auch um eigene Änderungen zum Standard-Kernel einzubinden. Dieser Kernel soll nicht einen bereits installierten Arch-Kernel überschreiben, oder von diesem überschrieben werden.

Vorgestellt werden Wege ohne und mit dem ArchLinux-Paketmanagement.
Es bietet sich an, diesen Beitrag einmal komplett durchzulesen. Wenn man das Prinzip einmal verstanden, und ein paar Gehversuche hinter sich hat, dann ist das Thema recht einfach. Nur: Am Anfang haben die Götter den Schweiß gesetzt ;-)

  1. eigener Kernel ohne das Paketmanagement („the old way“)
    Vorteile
    • Man kommt schnell zum eigenen Kernel, weniger Vorarbeiten
    • Extrem gut an die eigene Hardware anpassbar
    Nachteile
    • Konfiguration erfordert etwas Erfahrung
    • Nachträglich schwerer wartbar
  2. eigener Kernel mit dem Paketmanagement ("the arch way")
    Achtung:Dieser Teil ist noch nicht fertig!(Siehe Diskussion)
    Vorteile
    • Extrem gut an die eigene Hardware anpassbar
    • Nachträglich gut wartbar
    Nachteile
    • Erfordert einiges an Vorarbeiten
  3. den ArchLinux-Standardkernel als eigener Kernel anpassen.
    Vorteile
    • Nachträglich gut wartbar
    • Hat alle Treiber und Patches, die der Arch-Kernel auch hat
    • Die schnellste Methode um an einen **lauffähigen** Kernel zu kommen
    Nachteile
    • Erfordert einiges an Vorarbeiten

Vorarbeiten

Das ArchBuildSystem(ABS) sollte eingerichtet sein und synchronisiert.

pacman -Sy cvsup wget
abs

Kernel "the old way"

Diese Methode zeigt, wie ein eigener Kernel auf "althergebrachte" Art gebaut und installiert werden kann. Also ohne diesen mit pacman installieren bzw. deinstallieren zu können. Dieser Kernel enthält kein Initrd-Image (gelogen...).

Kernel-Sourcecode besorgen

Kernelsourcen von http://www.kernel.org besorgen.
Hier exemplarisch für den 2.6.22.

Auspacken

cp $downloaddir/linux-2.6.22.tar.bz2 /usr/src/
cd /usr/src
tar xvjf linux-2.6.22.tar.bz2
cd /usr/scr/linux-2.6.22

Kernel konfigurieren

Hier wird der Kernel an die eigene Hardware angepaßt. Das ist nur etwas für erfahrene User (oder welche, die lernen wollen). Es sollte unbedingt die README im Kernel-Source-Verzeichniss gelesen werden.

Zwei Wege werden vorgestellt: Die Config selbst erstellen (ggf. unter Verwendung einer Vorlage eines anderen Kernels) und die, bei der einfach die config des Arch-Standard-Kernels genutzt wird.

1. Eigene Konfig Da keine initrd erstellt wird müssen alle zum Booten benötigten Treiber (Harddisk-Controller, Root-Dateisystem) fest in den Kernel kompiliert werden. Also nicht als ladbare Module! Den Kernel konfigurieren mit einem der Front-Ends:

  • make menuconfig
  • make xconfig
  • make gconfig

Dies erstellt uns die Konfiguration .config im Kernelsource-Verzeichniss.

2. Konfig des Arch-Standard-Kernels als Grundlage nehmen Ausgang sei hier der Arch-Kernel 2.6.22. Fallstrick: Diese Config basiert auch auf den im ArchLinux-Kernel installierten bzw. hinzugefügten Patches. Die Weiterverwendung dieser Config kann also gutgehen, muß aber nicht.

cp /boot/kconfig26 /usr/src/linux-2.6.22/.config

make oldconfig

Die Datei .config mit einem Editor öffnen. Folgendes ändern:

#
# General setup
#
CONFIG_LOCALVERSION="-ARCH"
CONFIG_LOCALVERSION_AUTO=y
CONFIG_SWAP=y

Hier CONFIG_LOCALVERSION ändern zu ="".
Was dieser Parameter bewirkt siehe Eigener_Kernel_erstellen#Welche Parameter bewirken Namensänderungen?.

Kompilieren

Der Kernel und die Module werden kompiliert mit:

 make

Kernel und Module installieren

Ich gehe hier von einer 32bit-Architektur aus. Für 64bit die Pfade entsprechend anpassen.
Hilfe: Kann das jemand für 64bit ergänzen/anpassen?
Das Kernel-Image wird so nach /boot installiert:

 cp arch/i386/boot/bzImage /boot/vmlinuz
 cp System.map /boot/
 cp .config /boot/kconfig

Die Module installieren:

 make modules_install

(Doch) eine initrd erzeugen

Achtung: dieser Schritt wird nur benötigt, wenn oben die ArchLinux-Config als Vorlage genommen wurde (Konfig des Arch-Standard-Kernels als Grundlage nehmen). Bei der ArchLinux-Config sind die meisten Treiber als ladbare Module konfiguriert, deshalb muß zwingend auch für diesen Kernel eine initrd erstellt werden.

 mkinitcpio -k 2.6.22 -g /boot/initrd.img

Weiterhin muß im nächsten Abschnitt (Boot-Loader) diese erstelle initrd in den Grub-Eintrag hinzugefügt werden.

Boot-Loader (Grub) anpassen

Die Datei /boot/grub/menu.list um folgenden Eintrag erweitern. Die Einträge zu root und root= analog der eigenen menu.list anpassen!

# Eigener Kernel
title  Eigener Kernel
root   (hd0,0)
kernel /vmlinuz root=/dev/sda3 ro

oder wenn oben eine initrd erstellt wurde:

# Eigener Kernel
title  Eigener Kernel
root   (hd0,0)
kernel /vmlinuz root=/dev/sda3 ro
initrd /initrd.img

Was ist alles wo installiert, wie lösche ich den Kernel wieder? Ziel war, daß dieser Kernel nicht mit einem Arch-Kernel kollidiert. Folgende Einzel-Dateien bzw. Verzeichnisse wurden installiert und können problemlos wieder von Hand gelöscht werden:

  • /boot/vmlinuz (der Kernel)
  • /boot/System.map (Debug/Modul-Symboltabelle)
  • /boot/initrd.img (wenn ein initrd image erstellt wurde)
  • /boot/kconfig (Die Kernel-Konfig-Datei als Vorlage für spätere Änderungen)
  • /lib/modules/2.6.22 (das Verzeichniss mit den ladbaren Modulen)
  • /usr/src/linux-2.6.22 (die Kernel-Sources)

Der Kernel meldet sich so:

[gbdev@archdev ~]$ uname -r
2.6.22

Den ArchLinux Standard-Kernel als eigener, zusätzlicher Kernel

Unser Kernel soll ein eigenständiger Kernel sein, mit dem Namen 2.6.22-custom.

ABS aktualisieren

 abs

Kernel-Steuerdateien in eigenes Verzeichniss kopieren

 cp -R /var/abs/kernels/kernel26 /var/abs/local/
 cd /var/abs/local
 mv kernel26 kernel26custom
 cd kernel26custom

Dateien an eigenen Namen anpassen

 mv mkinitcpio-kernel26.conf mkinitcpio-kernel26custom.conf
 mv kernel26.install kernel26custom.install
 mv kernel26.preset kernel26custom.preset

Jetzt müssen einige Dateien editiert werden. Ich dokumentiere diese Änderungen anhand von diff-Vergleichen. Die Zeilen mit @@ enthalten Zeilen/Spaltennummern zum schnelleren Auffinden der Textstellen. Textänderungen sind so dokumentiert, daß die Zeile mit dem Minus(-) zur folgenden Zeile mit dem Plus(+) abgeändert werden muß. Wenn eine Zeile nur ein Plus hat (wie _ownver), dann ist diese Zeile an dieser Stelle hinzuzufügen.

PKGBUILD
Als erstes in dieser Datei den gesamten Block md5sum=(xyz) löschen. Das sind Prüfsummen um die Integrität der Dateien beim Bauen zu überprüfen. Da wir einige Dateien ändern müssen wir diese Prüfsummen später neu berechnen lassen.

@@ -1,15 +1,16 @@
 # $Id: PKGBUILD,v 1.247 2007/08/15 21:08:35 thomas Exp $
 # Maintainer: Tobias Powalowski <tpowa@archlinux.org>
 # Maintainer: Thomas Baechler <thomas@archlinux.org>
-pkgname=kernel26
+pkgname=kernel26custom
 _basekernel=2.6.22
 pkgver=2.6.22.3
+_ownver=custom
 pkgrel=1
-pkgdesc="The Linux Kernel and modules"
+pkgdesc="The Linux Kernel and modules (Custom)"
 arch=(i686 x86_64)
 license=('GPL2')
 url="http://www.kernel.org"
-backup=('boot/kconfig26' etc/mkinitcpio.d/${pkgname}.preset)
+backup=('boot/kconfig26${_ownver}' etc/mkinitcpio.d/${pkgname}.preset)
 depends=('module-init-tools' 'mkinitcpio>=0.5.15')
 # pwc, ieee80211 and hostap-driver26 modules are included in kernel26 now
 # nforce package support was abandoned by nvidia, kernel modules should cover everything now.
@@ -18,7 +19,7 @@
           'alsa-driver' 'ieee80211' 'hostap-driver26'
           'pwc' 'nforce' 'squashfs' 'unionfs' 'ivtv'
          'zd1211' 'kvm-modules')
-install=kernel26.install
+install=kernel26custom.install
 source=(ftp://ftp.kernel.org/pub/linux/kernel/v2.6/linux-$_basekernel.tar.bz2
         #http://www.kernel.org/pub/linux/kernel/v2.6/testing/patch-2.6.22-rc7.bz2
        #http://www.kernel.org/pub/linux/kernel/v2.6/snapshots/patch-2.6.22-rc7-git2.bz2
@@ -27,7 +28,7 @@
         logo_linux_clut224.ppm
         logo_linux_mono.pbm
         logo_linux_vga16.ppm
-        kernel26.preset
+        kernel26custom.preset
         mkinitcpio-$pkgname.conf
         acpi-dsdt-initrd-v0.8.4-2.6.21.patch
         toshiba-bluetooth.patch
@@ -108,15 +109,15 @@
   make bzImage modules || return 1
   mkdir -p $startdir/pkg/{lib/modules,boot}
   make INSTALL_MOD_PATH=$startdir/pkg modules_install || return 1
-  cp System.map $startdir/pkg/boot/System.map26
-  cp arch/$KARCH/boot/bzImage $startdir/pkg/boot/vmlinuz26
+  cp System.map $startdir/pkg/boot/System.map26${_ownver}
+  cp arch/$KARCH/boot/bzImage $startdir/pkg/boot/vmlinuz26${_ownver}
   install -D -m644 Makefile \
     $startdir/pkg/usr/src/linux-${_kernver}/Makefile
   install -D -m644 kernel/Makefile \
     $startdir/pkg/usr/src/linux-${_kernver}/kernel/Makefile
   install -D -m644 .config \
     $startdir/pkg/usr/src/linux-${_kernver}/.config
-  install -D -m644 .config $startdir/pkg/boot/kconfig26
+  install -D -m644 .config $startdir/pkg/boot/kconfig26${_ownver}
   mkdir -p $startdir/pkg/usr/src/linux-${_kernver}/include

   mkdir -p $startdir/pkg/usr/src/linux-${_kernver}/arch/$KARCH/kernel
@@ -185,6 +186,6 @@
   install -m644 -D $startdir/src/${pkgname}.preset $startdir/pkg/etc/mkinitcpio.d/${pkgname}.preset || return 1
   install -m644 -D $startdir/src/mkinitcpio-$pkgname.conf $startdir/pkg/etc/mkinitcpio.d/$pkgname-fallback.conf || return 1
   # set correct depmod command for install
-  sed -i -e "s/KERNEL_VERSION=.*/KERNEL_VERSION=${_kernver}/g" $startdir/kernel26.install
+  sed -i -e "s/KERNEL_VERSION=.*/KERNEL_VERSION=${_kernver}/g" $startdir/kernel26${_ownver}.install
   echo -e "# DO NOT EDIT THIS FILE\nALL_kver='${_kernver}'" > ${startdir}/pkg/etc/mkinitcpio.d/${pkgname}.kver
 }

kernel26custom.preset

@@ -1,14 +1,14 @@
-# mkinitcpio preset file for kernel26
+# mkinitcpio preset file for kernel26custom

 ########################################
 # DO NEVER EDIT THIS LINE:
-source /etc/mkinitcpio.d/kernel26.kver
+source /etc/mkinitcpio.d/kernel26custom.kver
 ########################################

 PRESETS=('default' 'fallback')

 default_config="/etc/mkinitcpio.conf"
-default_image="/boot/kernel26.img"
+default_image="/boot/kernel26custom.img"

-fallback_config="/etc/mkinitcpio.d/kernel26-fallback.conf"
-fallback_image="/boot/kernel26-fallback.img"
+fallback_config="/etc/mkinitcpio.d/kernel26custom-fallback.conf"
+fallback_image="/boot/kernel26custom-fallback.img"

kernel26custom.install

@@ -1,7 +1,8 @@
 # arg 1:  the new package version
 # arg 2:  the old package version

-KERNEL_VERSION=2.6.22-ARCH
+KERNEL_VERSION=2.6.22-custom
+_ownver=custom

 post_install () {
   # updating module dependencies
@@ -17,11 +18,11 @@
   echo ""
   echo ">>> Generating initial ramdisk, using mkinitcpio.  Please wait..."
 if [ "`vercmp $2 2.6.19`" -lt 0 ]; then
-  /sbin/mkinitcpio -p kernel26 -m "ATTENTION:\nIf you get a kernel panic below
+  /sbin/mkinitcpio -p kernel26${_ownver} -m "ATTENTION:\nIf you get a kernel panic below
 and are using an Intel chipset, append 'earlymodules=piix' to the
 kernel commandline"
 else
-  /sbin/mkinitcpio -p kernel26
+  /sbin/mkinitcpio -p kernel26${_ownver}
 fi
 if [ "`vercmp $2 2.6.21`" -lt 0 ]; then
   echo ""
@@ -136,11 +137,11 @@
   echo ""
   echo ">>> Generating initial ramdisk, using mkinitcpio.  Please wait..."
 if [ "`vercmp $2 2.6.19`" -lt 0 ]; then
-  /sbin/mkinitcpio -p kernel26 -m "ATTENTION:\nIf you get a kernel panic below
+  /sbin/mkinitcpio -p kernel26${_ownver} -m "ATTENTION:\nIf you get a kernel panic below
 and are using an Intel chipset, append 'earlymodules=piix' to the
 kernel commandline"
 else
-  /sbin/mkinitcpio -p kernel26
+  /sbin/mkinitcpio -p kernel26${_ownver}
 fi
 if [ "`vercmp $2 2.6.21`" -lt 0 ]; then
   echo ""

config

 #
 # General setup
 #
-CONFIG_LOCALVERSION="-ARCH"
+CONFIG_LOCALVERSION="-custom"
 CONFIG_LOCALVERSION_AUTO=y
</file>

**config.x86_64**\\
<file>
 #
 # General setup
 #
-CONFIG_LOCALVERSION="-ARCH"
+CONFIG_LOCALVERSION="-custom"
 CONFIG_LOCALVERSION_AUTO=y

Das war's jetzt mit dem Editieren, Ehrenwort ;-)

Jetzt laden wir den Kernelsource und die Patches aus dem Internet und lassen uns Prüfsummen generieren. Dank makepkg wird uns das ganz einfach gemacht.

 makepkg -g >> PKGBUILD

Nun können wir endlich den Computer etwas arbeiten lassen und uns einen Kaffee/Tee gönnen

 makepkg

Wenn das Kompilieren/Bauen fertig ist sehen wir am Ende folgende Meldungen:

 ==> Compressing package...
 ==> Finished making: kernel26custom  (Wed Aug 15 08:59:23 CEST 2007)

In unserem aktuellen Verzeichnis finden wir jetzt unser Kernel-Paket

 kernel26custom-2.6.22.3-1-i686.pkg.tar.gz

Dieses Paket werden wir jetzt mit pacman installieren. Bei der Installation verhält es sich so, wie wir es von "normalen" Kernel-Installationen gewohnt sind.

 pacman -U kernel26custom-2.6.22.3-1-i686.pkg.tar.gz

Jetzt fehlt lediglich noch der Eintrag im Bootloader (Grub) für unseren neuen Kernel. Die Einträge zu root und root= analog der eigenen menu.list anpassen!

# Eigener Kernel 2
title  Eigener Kernel (custom)
root   (hd0,0)
kernel /vmlinuz26custom root=/dev/sda3 ro
initrd /kernel26custom.img

# (1) Arch Linux
title  Eigener Kernel (custom) Fallback
root   (hd0,0)
kernel /vmlinuz26custom root=/dev/sda3 ro
initrd /kernel26custom-fallback.img

Kernel "the arch way"

Ziel ist es, einen eigenen Kernel basierend auf den Sourcen von [1] zu bauen, diesmal aber als Arch-Paket. Dieses Paket wird über pacman installiert und kann so auch einfach aktualisiert oder entfernt werden.

Dafür werden wir u.a. eine PKGBUILD Steuerdatei erstellen, die sich prinzipiell an der orientiert, die auch zum Bauen des Arch-Standardkernels verwendet wird.
Der so erstellte Kernel soll einen eigenen Namen bekommen. Für dieses Beispiel anhand des 2.6.22 Kernels soll dieser nacher 2.6.22-custom heißen.

Um die notwendigen Vorlagen zu bekommen (natürlich kann man auch die Beispiele hieraus verwenden) sollte das [Abs|ArchBuildSystem(ABS)] auf dem PC eingerichtet und synchronisiert sein.

 pacman -Sy cvsup wget
 abs

Die von uns als Vorlagen nötigen Dateien befinden sich in /var/abs/kernels/kernel26.

Zum Bauen erstellen wir ein eigenes Verzeichniss, hier als Beispiel im $HOME-Verzeichniss.

 mkdir $HOME/kernel26-custom
 cd $HOME/kernel26-custom

Wir benötigen fünf Dateien, die wir entweder dem Arch-Kernel aus dem ABS klauen oder hier aus den Beispielen kopieren/abschreiben.

ls -1 $HOME/kernel26-custom
PKGBUILD
kernel26custom-fallback.conf
kernel26custom.conf
kernel26custom.install
kernel26custom.preset

Hier jetzt die Dateien. Die Stellen, an denen wir unseren Zusatz custom ergänzen müssen, habe ich mit

***custom***

markiert. Die 3 Sterne (*) um das Wort custom dienen lediglich zur Kenntlichmachung und müssen in den Dateien entfernt werden.

Prinzipiell kann man in der PKGBUILD nach kernel26 suchen und dort seine Endung anhängen

PKGBUILD

# Contributor: Hier dein Name

pkgname=kernel26***custom***
basekernel=2.6.22
pkgver=2.6.22.***custom***
pkgrel=1
pkgdesc="The Linux Kernel and modules  (Eigener Kernel)"
url=""
license="GPL"
arch=('i686')
backup=('boot/kconfig26***custom***' 'etc/mkinitcpio.d/kernel26***custom***.preset')
depends=('module-init-tools' 'mkinitcpio>=0.5.11')
install=kernel26***custom***.install
source=(ftp://ftp.kernel.org/pub/linux/kernel/v2.6/linux-${basekernel}.tar.bz2 \
        kernel26***custom***.preset \
        kernel26***custom***-fallback.conf \
        )
build() {
  KARCH=i386
  cd $startdir/src/linux-${basekernel}

  # load configuration
  #yes "" | make config
  #make oldconfig || return 1
  ##make menuconfig || return 1
  make defconfig || return 1
  make menuconfig || return 1
  #make gconfig || return 1
  . ./.config
  _kernver="${basekernel}${CONFIG_LOCALVERSION}"

# build!
  make bzImage modules || return 1
  mkdir -p $startdir/pkg/{lib/modules,boot}
  make INSTALL_MOD_PATH=$startdir/pkg modules_install || return 1
  cp System.map $startdir/pkg/boot/System.map26***custom***
  cp arch/$KARCH/boot/bzImage $startdir/pkg/boot/vmlinuz26***custom***
  install -D -m644 Makefile \
    $startdir/pkg/usr/src/linux-${_kernver}/Makefile
  install -D -m644 kernel/Makefile \
    $startdir/pkg/usr/src/linux-${_kernver}/kernel/Makefile
  install -D -m644 .config \
    $startdir/pkg/usr/src/linux-${_kernver}/.config
  install -D -m644 .config $startdir/pkg/boot/kconfig26***custom***
  mkdir -p $startdir/pkg/usr/src/linux-${_kernver}/include

  mkdir -p $startdir/pkg/usr/src/linux-${_kernver}/arch/$KARCH/kernel
  for i in acpi asm-generic asm-$KARCH config linux math-emu media net pcmcia scsi sound video; do
    cp -a include/$i $startdir/pkg/usr/src/linux-${_kernver}/include/
  done

  # copy files necessary for later builds, like nvidia and vmware
  cp Module.symvers $startdir/pkg/usr/src/linux-${_kernver}
  cp -a scripts $startdir/pkg/usr/src/linux-${_kernver}
  # fix permissions on scripts dir
  chmod og-w -R $startdir/pkg/usr/src/linux-${_kernver}/scripts
  mkdir -p $startdir/pkg/usr/src/linux-${_kernver}/.tmp_versions

  cp arch/$KARCH/Makefile $startdir/pkg/usr/src/linux-${_kernver}/arch/$KARCH/
  cp arch/$KARCH/Makefile.cpu $startdir/pkg/usr/src/linux-${_kernver}/arch/$KARCH/
  cp arch/$KARCH/kernel/asm-offsets.s $startdir/pkg/usr/src/linux-${_kernver}/arch/$KARCH/kernel/

  # add headers for lirc package
  mkdir -p $startdir/pkg/usr/src/linux-${_kernver}/drivers/media/video
  cp drivers/media/video/*.h  $startdir/pkg/usr/src/linux-${_kernver}/drivers/media/video/
  for i in bt8xx cpia2 cx25840 cx88 em28xx et61x251 pwc saa7134 sn9c102 usbvideo zc0301; do
   mkdir -p $startdir/pkg/usr/src/linux-${_kernver}/drivers/media/video/$i
   cp -a drivers/media/video/$i/*.h $startdir/pkg/usr/src/linux-${_kernver}/drivers/media/video/$i
  done
  # add dm headers
  mkdir -p $startdir/pkg/usr/src/linux-${_kernver}/drivers/md
  cp drivers/md/*.h  $startdir/pkg/usr/src/linux-${_kernver}/drivers/md
  # add inotify.h
  mkdir -p $startdir/pkg/usr/src/linux-${_kernver}/include/linux
  cp include/linux/inotify.h $startdir/pkg/usr/src/linux-${_kernver}/include/linux/
  # add CLUSTERIP file for iptables
  mkdir -p $startdir/pkg/usr/src/linux-${_kernver}/net/ipv4/netfilter/
  cp net/ipv4/netfilter/ipt_CLUSTERIP.c $startdir/pkg/usr/src/linux-${_kernver}/net/ipv4/netfilter/
  # copy in Kconfig files
  for i in `find . -name "Kconfig*"`; do
    mkdir -p $startdir/pkg/usr/src/linux-${_kernver}/`echo $i | sed 's|/Kconfig.*||'`
    cp $i $startdir/pkg/usr/src/linux-${_kernver}/$i
  done

  cd $startdir/pkg/usr/src/linux-${_kernver}/include && ln -s asm-$KARCH asm

  chown -R root.root $startdir/pkg/usr/src/linux-${_kernver}
  cd $startdir/pkg/lib/modules/${_kernver} && \
    (rm -f source build; ln -sf ../../../usr/src/linux-${_kernver} build)
  # for binary modules make prepare
  cd $startdir/pkg/lib/modules/${_kernver}/build
  make prepare
  # install fallback mkinitcpio.conf and kernel preset files
  install -m644 -D $startdir/src/kernel26***custom***.preset $startdir/pkg/etc/mkinitcpio.d/kernel26***custom***.preset
  install -m644 -D $startdir/src/kernel26***custom***-fallback.conf $startdir/pkg/etc/mkinitcpio.d/kernel26***custom***-fallback.conf
  # set correct depmod command for install
  sed -i -e "s/KERNEL_VERSION=.*/KERNEL_VERSION=${_kernver}/g" $startdir/kernel26***custom***.install
  echo -e "# NEVER EDIT THIS FILE\nALL_kver='${_kernver}'" > ${startdir}/pkg/etc/mkinitcpio.d/kernel26***custom***.kver
}

makepkg -g make menuconfig → General setup→ Local version = -custom

Welche Parameter bewirken Namensänderungen?

Es gibt bei den vorgestellten Verfahren mehrere Parameter in verschiedenen Configs, die später eine Auswirkung darauf haben:

  • wie der Kernel "heißt" (uname -r)
  • wie daß Verzeichniss heißt, in dem die Module installiert werden (/lib/modules/$name)
  • wie das ArchLinux-Paket heißt (unser Paket darf im Paketsystem z.B. nicht mit dem Paket kernel26 kollidieren)

.config
Die Kernel-Config, die wir z.B. mit make menuconfig erstellen oder die beim Arch-Standard-Kernel analog obigen Beispielen in $HOME/kernel26-custom als config bzw. config.x86_64 liegt.

#
# General setup
#
CONFIG_LOCALVERSION="-custom"

Was wir hier eintragen wird intern an den Kernel-Namen angehängt und bewirkt u.a. auch, wie das Modul-Verzeichniss heißt. Wenn wir CONFIG_LOCALVERSION="-custom" eintragen, dann wird der Kernel die Module in /lib/modules/2.6.22-custom suchen.

PKGBUILD
Wenn wir einen Kernel mit dem Paketmanagement bauen, dann haben Parameter darin Auswirkungen wie später das gebaute Paket heißt und welchen Namen der Kernel in der Paketdatenbank hat. Dies müssen wir anpassen um nicht mit den Standard-Kerneln zu kollidieren.

 pkgname=kernel26custom

Dies bewirkt, wie das Paket zum Installieren heißt (blabla.pkg.tar.gz), welchen Namen Verzeichnisse und Kernel bzw. initrd-Image haben.

 _ownver=custom

Dies ist ein eigener Parameter, den wir benutzen um in der Steuerdatei unseren Versionszusatz an z.B. Kopieraktionen anzuhängen.

 pkgrel=1

Wenn wir unseren eigenen Kernel später mal verändern, dann sollten wir diesen Parameter um Eins erhöhen. Dadurch können wir mit pacman unser Paket leicht aktualisieren.