Linux Kernel unter Ubuntu oder Debian kompilieren
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]
$ 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 localmodconfig
: Update current config disabling modules not loaded, s.a. Linux-Kernel maßgeschneidert (heise.de)
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
- Der Ubuntu Hardware Enablement Stack ist die gängigste Methode, um unter Ubuntu neue Kernel zu installieren, sa. Ubuntu 12.04.2 LTS Enablement Stack liefert neuen Kernel und LTSEnablementStack (wiki.ubuntu.com).
- Ubuntu bietet auch Mainline Builds der Kernel an - MainlineBuilds (wiki.ubuntu.com).
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
- ↑ Kernel/Compile Ubuntu Community Help (help.ubuntu.com)
- ↑ Compiling a Kernel - The Debian Administrator's Handbook (debian-handbook.info)
- ↑ Kernel Doc make help (kernel.org)
- ↑ Backports FAQ (backports.debian.org)
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.
|