Linux Kernel unter Ubuntu oder Debian kompilieren

Aus Thomas-Krenn-Wiki
Zur Navigation springen Zur Suche springen

Einen Linux Kernel zu kompilieren ist für die meisten Administratoren keine alltägliche Angelegenheit. Umso wichtiger ist es die richtigen Werkzeuge zu kennen, wenn es doch soweit ist. Der folgende Artikel zeigt Beispiele, wie Mainline/Vanilla Kernel und der distributions-spezifische Kernel kompiliert werden.

Benötigte Software installieren

Zum Kompilieren werden folgende Packages benötigt:[1]

$ sudo apt-get install fakeroot build-essential devscripts libncurses5 libncurses5-dev
$ sudo apt-get build-dep linux

Die Pakete sind für folgende Zwecke:

  • fakeroot: Werkzeug zur Simulation von Root-Privilegien; ermöglicht Benutzern .deb-Archive zu erzeugen, die Root-Dateien enthalten
  • build-essential: Liste von Paketen, die zum Erzeugen von .deb-Archiven erforderlich sind
  • devscripts: Entwickler-Skripte für Debian-Entwickler

Die Bibliothek ncurses muss nur dann installiert werden, wenn make menuconfig zum Einsatz kommt.

Linux Kernel Source herunterladen

An den Kernel Quellcode gelangt man über mehrere Wege. Distributions-Kernel enthalten dabei immer Patches vom jeweiligen Kernel-Team der Distribution. Der Mainline/Vanilla Kernel enthält diese Patches nicht. Für Ubuntu gibt es eine Kernel Mapping Table (canonical.com), die eine Zuordnung zwischen Mainline und Ubuntu Kernel darstellt.

Traditionellerweise wurden Kernel zumeist unter /usr/src als root kompiliert. Aktuell ist es nicht mehr nötig, zum Kompilieren root Rechte zu verwenden. Das tar-Archiv kann daher als normaler User im Home-Verzeichnis entpackt werden. Wird der Linux Quellcode über apt als Package installiert, bleibt jedoch /usr/src in Verwendung.[2] Dort werden dann wieder root Rechte benötigt.

Mainline/Vanilla Kernel

Der Mainline Kernel, ohne Patches der Distributionen, wird auf kernel.org verwaltet. Als Download steht ein tar-Archiv, XZ komprimiert zur Verfügung.

$ wget https://kernel.org/pub/linux/kernel/v3.x/linux-3.17.2.tar.xz
$ tar xf linux-source-3.17.tar.xz

Kernel Packages in Repos

In den Repositories befindet sich der Linux Quellcode als Package, die Linux Sourcen werden per apt-get installiert:

$ apt-cache search linux-source
linux-source - Linux kernel source with Ubuntu patches
linux-source-3.13.0 - Linux kernel source for version 3.13.0 with Ubuntu patches
$ sudo apt-get install linux-source
[...]
/usr/src$ sudo tar xjf linux-source-3.2.tar.bz2

Kernel Teams

Die Schritte zum Kernel Kompilieren sind sowohl für das tar.gz als auch das linux-source Package identisch. Wird der Kernel in /usr/src kompiliert, was bei linux-src per default der Fall ist, werden root Rechte benötigt.

Konfiguration erstellen

Die Kernel-Konfiguration definiert, wie und welche Teile des Kernels kompiliert werden. Am besten verwendet man zum Starten die vorhandene .config Datei der Distribution. Zum Editieren der Konfiguration stehen außerdem mehrere make Targets zur Verfügung.[3]

make menuconfig ist ein interaktives Menü zum anpassen der Kernel config Datei
$ cp /boot/config-`uname -r` .config
$ make silentoldconfig
$ make menuconfig
  • make silentoldconfig: Same as oldconfig, but quietly, additionally update deps
  • Achtung: Wenn make localmodconfig verwendet wird, werden alle aktuell nicht geladenen Module in der Konfiguration deaktiviert! Es kann daher z.B. auch sein, dass der USB-Modultreiber herausfällt, wenn kein USB-Medium angeschlossen ist. Dieses make Target verwenden Sie daher nur, wenn Sie einen maßgeschneiderten Kernel für das zugehörige System erstellen wollen.
  • make menuconfig: Update current config utilising a menu based program

Kompilieren und installieren

Der Kernel wird entweder über make oder über make deb-pkg kompiliert. Letzteres erstellt .deb Packages und erleichtert damit die Installation des Kernels über mehrere Systeme hinweg.

make und install

make alleine erstellt das Kernel Image bzImage, die Targets make modules_install und make install installieren die Kernel Module, den Kernel, das initramfs und führen ein GRUB-Update durch.

Im folgenden Beispiel wird der Kernel über das Archiv linux-3.17.2.tar.xz kompiliert:

$ make -j5
  SYSTBL  arch/x86/syscalls/../include/generated/asm/syscalls_32.h
  SYSHDR  arch/x86/syscalls/../include/generated/asm/unistd_32_ia32.h
  SYSHDR  arch/x86/syscalls/../include/generated/asm/unistd_64_x32.h
[...]
  LD [M]  sound/pci/hda/snd-hda-intel.ko
  LD [M]  sound/pci/snd-als300.ko
  LD [M]  sound/soundcore.ko
$ sudo make modules_install
  INSTALL arch/x86/crypto/aes-x86_64.ko
  INSTALL arch/x86/crypto/aesni-intel.ko
[...]
  INSTALL sound/pci/snd-als300.ko
  INSTALL sound/soundcore.ko
  DEPMOD  3.17.2
$ sudo make install
sh ./arch/x86/boot/install.sh 3.17.2 arch/x86/boot/bzImage \
		System.map "/boot"
run-parts: executing /etc/kernel/postinst.d/apt-auto-removal 3.17.2 /boot/vmlinuz-3.17.2
run-parts: executing /etc/kernel/postinst.d/initramfs-tools 3.17.2 /boot/vmlinuz-3.17.2
update-initramfs: Generating /boot/initrd.img-3.17.2
run-parts: executing /etc/kernel/postinst.d/pm-utils 3.17.2 /boot/vmlinuz-3.17.2
run-parts: executing /etc/kernel/postinst.d/update-notifier 3.17.2 /boot/vmlinuz-3.17.2
run-parts: executing /etc/kernel/postinst.d/zz-update-grub 3.17.2 /boot/vmlinuz-3.17.2
Generating grub configuration file ...
Warning: Setting GRUB_TIMEOUT to a non-zero value when GRUB_HIDDEN_TIMEOUT is set is no longer supported.
Found linux image: /boot/vmlinuz-3.17.2
Found initrd image: /boot/initrd.img-3.17.2
[...]

make deb-pkg

Wie bereits erwähnt erstellt make deb-pkg Debian Packages nach dem Kompilieren. Zum Einrichten des Kernels genügt es, die generierten Packages per dpkg zu installieren.

Im folgenden Beispiel wurde das Package linux-source installiert und der Kernel in /usr/src kompiliert, daher wird sudo verwendet:

$ sudo make -j5 deb-pkg LOCALVERSION=-custom KDEB_PKGVERSION=1
  CHK     include/config/kernel.release
  UPD     include/config/kernel.release
make KBUILD_SRC=
  SYSHDR  arch/x86/syscalls/../include/generated/uapi/asm/unistd_32.h
  SYSHDR  arch/x86/syscalls/../include/generated/uapi/asm/unistd_64.h
[...]
dpkg-deb: building package `linux-headers-3.13.11.8-custom' in `../linux-headers-3.13.11.8-custom_1_amd64.deb'.
dpkg-deb: building package `linux-libc-dev' in `../linux-libc-dev_1_amd64.deb'.
dpkg-deb: building package `linux-image-3.13.11.8-custom' in `../linux-image-3.13.11.8-custom_1_amd64.deb'.
dpkg-deb: building package `linux-image-3.13.11.8-custom-dbg' in `../linux-image-3.13.11.8-custom-dbg_1_amd64.deb'.
$ cd ..
$ sudo dpkg -i linux-image-3.13.11.8-custom_1_amd64.deb
[...]
Preparing to unpack linux-image-3.13.11.8-custom_1_amd64.deb ...
Unpacking linux-image-3.13.11.8-custom (1) ...
Setting up linux-image-3.13.11.8-custom (1) ...
update-initramfs: Generating /boot/initrd.img-3.13.11.8-custom
Generating grub configuration file ...
Found linux image: /boot/vmlinuz-3.13.11.8-custom
Found initrd image: /boot/initrd.img-3.13.11.8-custom
[...]

Weitere Wege zu neuem Kernel

Abschließend weitere Möglichkeiten, um neue Kernel zu installieren, ohne selber kompilieren zu müssen.

Ubuntu

Debian

  • Unter Debian kann über das Backport-Repository ein neuerer Kernel installiert werden. Achtung: Sicherheits-Updates werden bei Backports nur nach best-effort verteilt![4]
# echo "deb http://http.debian.net/debian wheezy-backports main 
deb-src http://http.debian.net/debian wheezy-backports main" > /etc/apt/sources.list.d/backports.list
# apt-get update
# apt-get install -t wheezy-backports linux-image-amd64 linux-headers-amd64

Einzelnachweise


Foto Georg Schönberger.jpg

Autor: Georg Schönberger

Georg Schönberger, Abteilung DevOps bei der XORTEX eBusiness GmbH, absolvierte an der FH OÖ am Campus Hagenberg sein Studium zum Bachelor Computer- und Mediensicherheit, Studium Master Sichere Informationssysteme. Seit 2015 ist Georg bei XORTEX beschäftigt und arbeitet sehr lösungsorientiert und hat keine Angst vor schwierigen Aufgaben. Zu seinen Hobbys zählt neben Linux auch Tennis, Klettern und Reisen.


Das könnte Sie auch interessieren

Festplatte formatieren / partitionieren und mounten unter Debian Linux
NIC Bonding unter Debian
Perl warning Setting locale failed unter Debian