Compilare il kernel Linux da Ubuntu

Questa guida spiega per scopo didattico come compilare il Kernel linux con Ubuntu

Per partire senza intoppi, da una macchina completamente pulita installo una Ubuntu minimal su macchina virtuale.

Installazione dei pacchetti software necessari

Installo i seguenti pacchetti per comodita ma sono opzionali.

net-tools: Aggiunge il comando ifconfig per vedere l'idirizzo ip della macchina
vim: Installo vim come editor testuale, è comunque possibile usare nano.

sudo apt install net-tools vim

Pacchetti necessari:

build-essential: Installa i software di base per compilare
git: Sistema di controllo versione utilizzato dal kernel
libelf-dev: Libreria per la gestione dei file elf
libssl-dev: Permette l'utilizzo delle funzionalità criptografiche.

sudo apt install build-essential git libelf-dev libssl-dev bc

Dowload dei sorgenti di Linux

Scarichiamo l'intero kernel nella versione stabile con:

git clone git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git

Potrebbe richiedere del tempo, questo comando scarica l'intero archivio git del kernel Linux.

Terminato il dowload è il momento di scegliere che versione compilare, con

uname -r

controlliamo la release del Kernel, nel mio caso:

4.15.0-54-generic

Compiliamo la medesima release quindi v4.15.X, scegliendo l'ultima versione stabile.

git tags | grep v4.15

controllo quali tags sono diponibili, al momento in cui scrivo la guida:

v4.15
v4.15-rc1
v4.15-rc2
v4.15-rc3
v4.15-rc4
v4.15-rc5
v4.15-rc6
v4.15-rc7
v4.15-rc8
v4.15-rc9
v4.15.1
v4.15.10
v4.15.11
v4.15.12
v4.15.13
v4.15.14
v4.15.15
v4.15.16
v4.15.17
v4.15.18
v4.15.2
v4.15.3
v4.15.4
v4.15.5
v4.15.6
v4.15.7
v4.15.8
v4.15.9

Scelgo la stable piu recente ovvero la v4.15.18, una buona scelta è usare la versione piu recente.

Con git effettuiamo un checout sui sorgenti alla versione che ci interessa.

git checkout v4.15.18

Git ci restituira un warning

You are in 'detached HEAD' state.

detached HEAD, questo è un problema che rigurada il controllo versione, nel nostro caso un non problema.

Compila dei sorgenti

Entriamo nella cartella del kernel con:

cd linux

Ora vale pena spendere due parole sul Build-System del Kernel linux, Linux utilizza lo storico buildsystem GNU Make, esso si invoca chiamando

make tagert-desiderato

Questo software è standard in moltissimi progetti OpenSource, spesso combinato anche con altri strumenti(autotools).

Considerato che il kernel è un software complesso che puo supportare diversi driver, in molte combinazioni, spesso i driver dipendo uno dal altro:

Non posso compilare un driver di un sesnore SPI, se non ho compilato il subsystem SPI, che a sua volta dipende dai driver generici e cosi via.

Fatte queste cosiderazioni per migliorare la gestibilita delle configurazioni gli autori del kernel hanno sviluppato questo strumento per generare file di configurazione e alcuni header in automatico.

Questo software si chiama Menuconfig o Kconfig.

Fatta questa premessa
Avviamo il target make per prepare il Kernel, e ripulire tutti i file di configurazione e compila, file .config, e .o

make mrproper

A questo punto è necessario configurare il Kernel, scegliendo quali driver, e componenti supportare.
Visto che miriamo a un obbiettivo minimo copiamo la attuale configurazione della macchina su cui stiamo lavorando.
Vedremo in un secondo articolo come effettuare questa operazione con la testa, per escudere tutto quello che non serve, e compilare un kernel molto leggero e minimale.
Copiamo la configurazione della macchina con:

cp -v /boot/config-$(uname -r) .config

Quindi utilizziamo il target make per repplicare la vecchia configurazione con:

make oldconfig

Potrebbe essere che alcune configurazioni non erano supportate nella vecchia versione, e il mantainer ha aggiunto qualche driver.
Dunque Kconfig chiede se desideriamo o meno compilare il suddetto driver. Suggerisco rispondere con la risposta di default.
Riperete per tutte le opzioni richieste da Kconfig

Con un editor di testo modifichiamo il file:

Makefile

Aggiungendo una stringa nota al nostro EXTRAVERSION cosi dare un nome al nostro kernel.

Ora disponiamo di una configurazione valida, siamo pronti per compilare
Compiliamo con:

make bzImage -j 4
make modules -j 4

L'opzione -j permette a Gnu make di compilare piu file conteporaneamente. Una volta compilato tutto si passa alla installazione.

Installare il kernel appena compilato

sudo make modules_install
sudo make install

Riavviamo e da grub scegliamo la versione da noi compilata, ora dovrebbe partire il kernel da noi compilato.