HowTo Linux

Come compilare un nuovo kernel Linux

Guida pratica passo passo: preparazione, configurazione, compilazione, installazione, initramfs, aggiornamento bootloader e rollback in caso di problemi.

Se ti scoccia compilare a mano, prova il mio programma di compilazione automatica AV kernel gui: lo trovi nella sezione Download.
Questa guida e' orientata a Slackware. I passaggi mostrano la compilazione del kernel e la gestione dell'initrd con mkinitrd, con note per LILO e GRUB.

1. Prima di iniziare

  • Lavora come root oppure usa sudo dove richiesto.
  • Mantieni almeno un kernel funzionante nel bootloader (non sostituire l'unico).
  • Assicurati di avere spazio libero (alcuni GB in /usr/src e /boot).
  • Annota il kernel attuale:
uname -r
uname -m

2. Pacchetti necessari

Installa gli strumenti di compilazione e le librerie base. I nomi pacchetto possono cambiare.

Pacchetti tipici

  • gcc, make, binutils
  • bc, bison, flex
  • openssl-devel / libssl-dev
  • elfutils, pahole (per BTF)
  • perl, python (alcuni target/scripts)
  • ncurses-devel / libncurses-dev (per menuconfig)

Strumenti utili

  • wget o curl per scaricare sorgenti
  • xz / tar per estrarre archivi
  • git se compili da repository kernel.org
  • mkinitrd (Slackware) per creare l'initrd del kernel generic

3. Ottenere i sorgenti del kernel

Puoi usare i sorgenti della tua distro oppure scaricare il tarball ufficiale. Esempio con tarball:

cd /usr/src
wget https://cdn.kernel.org/pub/linux/kernel/v6.x/linux-6.x.y.tar.xz
tar -xf linux-6.x.y.tar.xz
ln -sfn linux-6.x.y linux
cd linux

Sostituisci 6.x.y con la versione che vuoi compilare.

4. Backup della configurazione attuale

Il modo piu' sicuro e partire dalla configurazione del kernel in uso.

zcat /proc/config.gz > .config

Se /proc/config.gz non esiste, prova con il file della distro:

cp /boot/config-$(uname -r) .config
Fai una copia di sicurezza della config prima di modificarla:
cp .config .config.backup-$(date +%F)

5. Configurare il kernel

  1. Aggiorna la vecchia configurazione ai nuovi sorgenti:
make oldconfig

Se preferisci i default automatici per le nuove opzioni:

make olddefconfig
  1. Apri il configuratore testuale:
make menuconfig

Controlla soprattutto:

  • Driver del disco / controller SATA-NVMe
  • Filesystem del root (ext4, xfs, btrfs, ecc.)
  • Supporto EFI/UEFI se usato
  • Rete (scheda LAN/Wi-Fi)
  • CPU microarchitecture (senza esagerare se vuoi compatibilita')
Se compili come modulo i driver necessari per montare la root, dovrai avere un initramfs corretto. Se non sei sicuro, lascia la configurazione della distro e modifica solo poche opzioni.

6. Compilazione del kernel e dei moduli

Pulisci (solo se parti da albero gia' usato) e compila:

make -j"$(nproc)"

Compila e installa i moduli in /lib/modules/<versione>:

make modules_install
La compilazione puo' richiedere da pochi minuti a molto tempo in base a CPU, numero di core e configurazione.

7. Installazione del kernel

Installa kernel, System.map e config in /boot:

make install

Su alcune distro make install aggiorna anche automaticamente il bootloader; su altre no.

Verifica cosa e' stato creato:

ls -lh /boot
ls -lh /lib/modules | tail

8. Creazione initramfs (se necessario)

Su Slackware, se usi un kernel generic (consigliato), devi creare l'initrd per il nuovo kernel.

Slackware (mkinitrd)

mkinitrd -c -k <nuova-versione-kernel> -f ext4 -r /dev/sdXY -m ahci:ext4

Adatta filesystem, root device e moduli ai tuoi valori reali.

Per un comando piu' preciso e' consigliato usare anche:

/usr/share/mkinitrd/mkinitrd_command_generator.sh -r

9. Aggiornare il bootloader

Non rimuovere la voce del kernel precedente. Aggiungi o rigenera mantenendo almeno una entry di fallback.

GRUB

grub-mkconfig -o /boot/grub/grub.cfg

LILO (ancora comune su Slackware)

Modifica /etc/lilo.conf aggiungendo una nuova immagine e poi:

lilo -v
Se usi LILO e dimentichi di rieseguire lilo dopo le modifiche, il sistema puo' continuare a puntare al vecchio kernel o non avviare la nuova entry.

10. Riavvio e verifica

  1. Riavvia il sistema.
  2. Seleziona il nuovo kernel dal bootloader.
  3. Dopo il login verifica:
uname -r
dmesg | less
lsmod | head

Controlla rete, audio, filesystem, driver video e servizi principali.

11. Procedura di rollback (se qualcosa non va)

  1. Riavvia.
  2. Seleziona il kernel precedente dal bootloader.
  3. Correggi la configurazione e ricompila, oppure rimuovi la nuova entry dal bootloader.
Buona pratica: conserva almeno 2 kernel funzionanti (attuale + precedente) e relativi initramfs in /boot.

12. Nota pratica per Slackware

Su Slackware spesso conviene:

  • Partire dal config del kernel huge/generic installato.
  • Usare kernel generic + initrd per l'uso quotidiano.
  • Aggiornare con attenzione /etc/lilo.conf (o GRUB se usato).
  • Tenere una voce "rescue" o il vecchio kernel.

Checklist finale

[ ] Sorgenti scaricati/estratti
[ ] .config copiato dal kernel attuale
[ ] make oldconfig / menuconfig completati
[ ] make && make modules_install && make install
[ ] initramfs creato (se richiesto)
[ ] bootloader aggiornato
[ ] vecchio kernel mantenuto come fallback
[ ] riavvio e test completati