201.2 Einen Kernel kompilieren Gewichtung 3
201.2 Einen Kernel kompilieren
Ich mache das nur auf meinem Ubuntu.
Debian-Quellen eventuell freischalten
Damit diese installiert werden können, muss man die URLs für diese Paketquellen in der Datei /etc/apt/sources.list
freischalten, also auskommentieren.
Ich habe folgende auslommentiert:
root@ubuntu:~# grep deb-src /etc/apt/sources.list
deb-src http://us.archive.ubuntu.com/ubuntu bionic main restricted
deb-src http://us.archive.ubuntu.com/ubuntu bionic-updates main restricted
deb-src http://us.archive.ubuntu.com/ubuntu bionic universe
deb-src http://us.archive.ubuntu.com/ubuntu bionic-updates universe
deb-src http://us.archive.ubuntu.com/ubuntu bionic multiverse
deb-src http://us.archive.ubuntu.com/ubuntu bionic-updates multiverse
deb-src http://us.archive.ubuntu.com/ubuntu bionic-backports main restricted universe multiverse
# deb-src http://archive.canonical.com/ubuntu bionic partner
deb-src http://security.ubuntu.com/ubuntu bionic-security main restricted
deb-src http://security.ubuntu.com/ubuntu bionic-security universe
deb-src http://security.ubuntu.com/ubuntu bionic-security multiverse
root@ubuntu:~# apt-get update
den Kernel kompilieren
Warum man einen Kernel kompilieren sollte? Siehe https://www.makeuseof.com/tag/3-reasons-compile-kernel-linux/
Pakete installieren:
time sudo apt install linux-source build-essential kernel-package libssl-dev
Dann als nicht root-User die Kernelquelldateien entpacken
mkdir ~/kernel
cd ~/kernel
time tar xvjf /usr/src/linux-*tar.bz2
tar-option -j
verwendet bzip2.
Dann in das Unterverzeichnis wechseln und die Konfigurationsdatei .config
erstellen.
cd linux-source-*
Die Datei .config
enthält die Parameter die zum Kompilieren letztlich verwendet werden, diese wird nun erstellt. Hier gibt es unterschiedliche Methoden. Ich möchte in diesem Beispiel einen kleinen Kernel bauen, der nur die von meinem System benötigten Module enthält.
make localyesconfig
Nun ist die Datei .config
erstellt und enthällt alle notwendigen Informationen zum Kompilieren. Mit make menuconfig
könnte man nun auf dem Terminal noch komfortabel weitere Module auswählen, die mit in den Kernel kommen und damit die .config
ändern.
make menuconfig
Falls der folgende Fehler kommt: fatal error: curses.h
, muss noch eine Libary nachinstalliert werden mit sudo apt-get install libncurses5-dev
. Wenn man keine weiteren Treiber braucht, kann man das Bearbeiten der .config
überspringen.
Jetzt kompilieren, damit wir hier nicht solange warten müssen, teilen wir make
mit, dass er bis zu 4 Jobs parallel ausführen kann. Das geht mit der Option -j 4
. Die Zahl hängt nur davon ab, wieviele Prozessoren man hat. Aktives Hyperthreading verdoppelt diese Zahl noch.
Meine CPUs:
lscpu | grep '^CPU(s):'
CPU(s): 4
Ob Hyperthreading aktiv ist, findet man mit:
if [ "$(grep -c processor /proc/cpuinfo)" \
-gt "$(grep "cores" /proc/cpuinfo | grep -o "[[:digit:]]" | uniq)" ]
then echo "Hyperthreading aktiviert"; else echo "Kein Hyperthreading"; fi
make clean
time make -j 4 bzImage modules
...
LD arch/x86/boot/setup.elf
OBJCOPY arch/x86/boot/setup.bin
BUILD arch/x86/boot/bzImage
Setup is 17020 bytes (padded to 17408 bytes).
System is 7533 kB
CRC 8642c0a1
Kernel: arch/x86/boot/bzImage is ready (#1)
real 6m15.774s
user 19m36.102s
sys 3m3.109s
Je nach Anzahl CPUs, Speicher und Schreibgeschwindigkeit auf das Speichermedium kann das jetzt etwas dauern. Bei mir waren es 6 Minuten (8 GB RAM, 4 CPU, SSD).
Hinweis: früher hatte man auch zImage
statt bzImage
für kleinere Kernel bis 512Kb Größe verwendet.
Der frisch kompilierte Kernel und die kompilierten Module werden nun mit root Rechten in das System installiert:
sudo make modules_install install
Hier werden bereits der Bootloader grub2 und die initiale RAM-Disk aktualisiert. Das heißt nach /boot/
kopiert und als neues submenu in /boot/grub/grub.cfg
eingetragen. Nun müssen wir grub noch beibringen, dass er den neuen Kernel bootet. Aktuell ist der Default Kernel noch der erste Eintrag im Hauptmenü von Grub:
grep -P '^\s+set default' /boot/grub/grub.cfg
set default="${next_entry}"
set default="0"
Die Datei /boot/grub/grub.cfg
wird durch den Befehl grub-update
aktualisiert. Wir müssen raussuchen an welcher Stelle unser neuer Kernel in der Datei /boot/grub/grub.cfg
und dann nach den in https://help.ubuntu.com/community/Grub2/Setup beschriebenen Regeln von der Datei /etc/default/grub
darauf verweisen.
Hilfreich ist folgendes Kommando:
gaida@ubuntu:~$ grep -P '^\s*(submenu|menuentry) ' /boot/grub/grub.cfg \
| awk -F"'" '{print $1 "\"" $2 "\""}'
menuentry "Ubuntu"
submenu "Advanced options for Ubuntu"
menuentry "Ubuntu, with Linux 4.15.18"
menuentry "Ubuntu, with Linux 4.15.18 (recovery mode)"
menuentry "Ubuntu, with Linux 4.15.0-74-generic"
menuentry "Ubuntu, with Linux 4.15.0-74-generic (recovery mode)"
menuentry "Ubuntu, with Linux 4.15.0-55-generic"
menuentry "Ubuntu, with Linux 4.15.0-55-generic (recovery mode)"
gaida@ubuntu:~$
Daraus leitet sich für mich der Eintrag GRUB_DEFAULT="1>Ubuntu, with Linux 4.15.18"
in der Datei /etc/default/grub
ab.
Neuer Inhalt von /etc/default/grub
:
# see https://help.ubuntu.com/community/Grub2/Setup
GRUB_DEFAULT="1>Ubuntu, with Linux 4.15.18"
GRUB_HIDDEN_TIMEOUT=5
GRUB_HIDDEN_TIMEOUT_QUIET=true
GRUB_TIMEOUT=10
GRUB_DISTRIBUTOR=`lsb_release -i -s 2> /dev/null || echo Debian` GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"
GRUB_CMDLINE_LINUX=""
# Uncomment to enable BadRAM filtering, modify to suit Tour
dann die Grub-Konfiguration neu schreiben lassen
sudo update-grub
Nun enthält die Datei /boot/grub/grub.cfg
unter anderem folgendes:
set default="1>Ubuntu, with Linux 4.15.18"
Hinweis:
zImage- und bzImage-Dateien haben unterschiedliche Layouts und Ladealgorithmen. Die maximal zulässige Kernelgröße für ein zImage beträgt 512 KB, wobei ein bzImage diese Beschränkung nicht darstellt. Daher ist der bzImage-Kernel der bevorzugte Image-Typ für größere Kernel. zImage wird in einen niedrigen Arbeitsspeicher geladen, und bzImage kann bei Bedarf auch in einen hohen Arbeitsspeicher geladen werden.
Quellen:
- https://wiki.ubuntuusers.de/Kernel/Kompilierung/
- https://www.heise.de/ct/artikel/Linux-Kernel-massgeschneidert-1402386.html
- https://help.ubuntu.com/community/Grub2/Setup
Screencast
Ich habe von dem ganzen auch einen Screencast erstellt, der ist hier zu sehen: