Linux Kernel kompilieren

Aus Secure Solutions Wiki
Wechseln zu:Navigation, Suche

In diesem Artikel geht es darum den Linux Kernel selbst zu bauen.

Linux Quelltext besorgen

Als ersten Schritt besorgen wir den Quelltext (auch Sourcecode) von Linux. Diesen findet man bei Kernel.org.
Wir empfehlen den neusten stabilen Kernel zu wählen.

Das Kompilieren vorbereiten

Stellen Sie zunächst sicher, dass Sie die neusten Updates in Ihr System eingespielt haben.

Abhängigkeiten installieren

Debian / Ubuntu

Mit Root Privilegien
apt install kernel-package libncurses5-dev fakeroot wget bzip2 build-essential

CentOS / Fedora / RHEL

Mit Root Privilegien
sudo dnf install gcc flex make bison openssl-devel elfutils-libelf-devel ncurses-devel qt-devel rpm-build

Arch

Mit Root Privilegien
pacman -S base-devel

Entpacken

Es sollte ein neues Verzeichnis erstellt werden um den Kernel zu bauen.
mkdir linux

Im nächsten Schritt wird das Linux Tar Archiv (auch Tarball) entpackt.
tar -xvf linux-5.8.15.tar.xz

Abschluss der Vorbereitung

Das Verzeichnis zum Kernelsource wechseln.
cd linux-5.8.15

Um die Vorbereitung zum Kompilieren abzuschließen, sollte mrproper ausgeführt werden.
make mrproper

Linux Konfiguration

Anmerkung: Es ist nicht notwendig Root Rechte für das Konfigurieren und Kompilieren zu verwenden.

Die Konfiguration des Kernels wird als .config gespeichert.

Eine laufende Konfiguration verwenden

In einigen Fällen ist die derzeit laufende Kernelkonfiguration in /proc/ verfügbar. Um auf /proc/config.gz zugreifen zu können, muss die Option im Kernel aktiv sein:
General Setup -> Kernel .config Support

Laufende Kernelkonfiguration verwenden:
zcat /proc/config.gz > .config

Alternativ kann man sich in /usr/src/ umsehen. Dort sollte ein Verzeichnis namens Linux oder Kernel zu finden sein. In diesem befindet sich eine generische .config Datei.

Eine angepasste Konfiguration erstellen

Nur aktive Module verwenden

Um eine möglichst perfekte Kernel Konfiguration zu erstellen, gehen Sie sicher, dass alle Geräte, die Sie verwenden möchten, zu diesem Zeitpunkt mit Ihrem System verbunden sind! Mittels make localmodconfig ist es möglich, nur die derzeit laufenden Module (auch Treiber) für das Kompilieren zu wählen.

Anmerkung: Localmodconfig reicht nicht aus um einen guten Kernel zu bauen! Betrachten Sie es nur als gute Grundlage für die weitere Konfiguration.

Wenn Sie localmodconfig verwenden, sollten Sie auf jeden Fall folgendes ans Ende Ihrer .config Datei hinzufügen:
# DOS/FAT Filesystems
CONFIG_FAT_FS=m
CONFIG_MSDOS_FS=m
CONFIG_VFAT_FS=m
CONFIG_FAT_DEFAULT_CODEPAGE=437
CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1"

Oft gibt es Probleme mit dem Dateisystem Fat32, welches sich heutzutage noch immer großer Verbreitung erfreut. Diese Zeilen sollten alle Fat Probleme vermeiden.

Anmerkung: FAT ist das einzige Dateisystem, welches auf Windows, Mac OS X, GNU/Linux und BSD läuft!

Menuconfig

Anmerkung: menuconfig erstellt eine .config Datei, wenn Sie sie noch nicht existiert. Diese kann auch verwendet werden um einen sog. Generic Kernel zu bauen. Dieser ist jedoch nicht besonders auf Ihr System optimiert und enthält viele Module die Sie niemals verwenden werden oder wollen.

Mit menuconfig eine Kernelkonfigurationsdatei bearbeiten/erstellen:
make menuconfig

Den Kernelnamen festlegen:
General Setup -> Local version - append to kernel release

Kernelkonfiguration als /proc/config.gz anbieten:
General Setup -> Kernel .config support

Kernelkompression wählen:
General Setup -> Kernel .config support

Festlegen ob auf Größe oder Geschwindigkeit optimiert werden soll:
General Setup -> Compiler optimization level

Aktivieren Sie den Schutz vor freelist exploit methods:
General Setup -> Harden slab freelist metadata

Stellen Sie sicher, dass diese Option nicht aktiviert ist:
Processor type and features -> Ancient loading interface

Anmerkung: Wir empfehlen den wechsel von SELinux zu AppArmor. Bitte beachten Sie, dass Sie um AppArmor nutzen zu können, dies noch zusätzlich auf Ihrem System installieren und konfigurieren müssen!

Deaktivieren von NSA/SELinux:
Security Options -> NSA SELinux Support

Aktivieren von AppArmor:
Security Options -> AppArmor Support

Setzen des major LSM auf AppArmor:
Security Options -> First legacy 'major LSM' to be initialized

Aktivieren von Kernel syslog Re­s­t­rik­ti­onen:
Security Options -> Restrict unprivileged access to kernel syslog

Aktivieren von Network Security Hooks:
Security Options -> Socket and Networking Security Hooks

Aktivieren von LSM Kernel lockdown:
Security Options -> Basic module for enforcing kernel lockdown

Linux Kompilieren

Anmerkung: Sie können mit dem Parameter -j weitere Kerne Ihrer CPU zum kompilieren verwenden, um den Vorgang zu beschleunigen. In den meisten Fällen ist die beste Option, die Anzahl Ihrer Kerne + 1. Dies muss jedoch nicht immer die richtige Lösung sein. Beispiel bei einem Quadcore: make -j5

Linux kompilieren (Alle Distributionen)

make

Linux kompilieren (Debian)

Auf Debian kann ein .deb Paket vom Linux Kernel erstellt werden:
make deb-pkg

Linux installieren

Debian / Ubuntu

Die gebauten .deb Pakete einspielen:
Navigieren Sie in das Verzeichnis über dem Kernel Source.
cd ..

Anmerkung: Es reicht aus nur das Linux Image zu installieren. Der Rest ist optional.

Installation des Linux Kernel:
sudo dpkg -i linux-image-5.8.15-kernelname_5.8.15-kernelname-1_amd64.deb

Installation der Linux Kernel Headers:
sudo dpkg -i linux-headers-5.8.15-kernelname_5.8.15-kernelname-1_amd64.deb

Installation von libc-dev:
sudo dpkg -i linux-libc-dev-5.8.15-kernelname_5.8.15-kernelname-1_amd64.deb

Installation Linux Kernel Debugging:
sudo dpkg -i linux-image-5.8.15-kernelname-dbg_5.8.15-kernelname-1_amd64.deb

CentOS / Fedora / RHEL

sudo make install
sudo make modules_install

Arch

Installation der Module:
sudo make modules_install

Installation des Linux Image:
cp -v arch/x86_64/boot/bzImage /boot/vmlinuz-kernelname

Erstelle initramfs Konfiguration:
cp /etc/mkinitcpio.d/linux.preset /etc/mkinitcpio.d/linux-kernelname.preset

Bearbeiten Sie die Einträge von /etc/mkinitcpio.d/linux-kernelname.preset und fügen Sie Ihren Kernelnamen hinzu:
# mkinitcpio preset file for the 'linux' package
ALL_config="/etc/mkinitcpio.conf"
ALL_kver="/boot/vmlinuz-linux-kernelname"
PRESETS=('default' 'fallback')
#default_config="/etc/mkinitcpio.conf"
default_image="/boot/initramfs-linux-kernelname.img"
#default_options=""
#fallback_config="/etc/mkinitcpio.conf"
fallback_image="/boot/initramfs-linux-kernelname-fallback.img"
fallback_options="-S autodetect"

Baue initramfs:
sudo mkinitcpio -p linux-kernelname

Grub update

Nun ist es an der Zeit dem Bootloader zu sagen, dass es neue Kernel gibt, die er starten kann.
Dafür muss ein Grub Update gemacht werden:
sudo grub-mkconfig -o /boot/grub/grub.cfg