Logo Matteo Salonia
Kernel Personalizzato

Se usate una distribuzione di GNU/Linux, e se siete in grado di compilare il vostro Kernel, in questa pagina troverete alcune modifiche che ho apportato al mio Kernel, e uno script per facilitare le modifiche alla configurazione del Kernel, e la compilazione.

Vai a:
Introduzione Configurazione default Uso script Performance Codice sorgente

Premetto col dire che io uso la distribuzione Gentoo Linux arrow_forward — è una distribuzione di GNU/Linux in cui tutti i pacchetti (programmi) vanno compilati dal codice sorgente, piuttosto che usare pacchetti binari pre-compilati da terzi, che non possono essere configurati. Questo approccio permette all'utente di scegliere quali parti del proprio sistema compilare, e quali pacchetti specifici installare, in modo tale da rendere possibili configurazioni che usano pochissime risorse (anche meno di 100MB di RAM!), totalmente funzionanti e molto efficienti. Infatti, come avrete ben capito, è anche possibile configurare il proprio Kernel per poi compilarlo in un secondo momento. Sul mio laptop ThinkPad T440p, uso il Kernel pf-sources arrow_forward, che include le patch del Kernel Gentoo (genpatches), e molte altre patch che permettono al kernel di operare in maniera più rapida.

Questo Kernel viene aggiornato regolarmente, con supporto continuo per il mio laptop, ThinkPad T440p, rimuovendo quindi funzionalità non necessarie, come NUMA, NVIDIA, AMD, e così via. In questa guida vedrete che bisogna modificare alcune impostazioni, come la cartella in cui è contenuta la sorgente del Kernel, ecc. In più, se usate configurazioni diverse dalla mia (esempio: usate un computer diverso dal mio ThinkPad), bisognerà rivedere la configurazione del Kernel, specialmente il numero massimo di CPU (impostato a 8), le GPU massime (impostato a 2), ecc.

Assicuratevi di aver clonato la repository:

git clone "https://github.com/saloniamatteo/kernel" usr-kernel
cd usr-kernel

Scegliete una versione del Kernel da compilare, secondo le versioni disponibili. In questo esempio, andrò a compilare la versione del Kernel 5.19_p1-pf:

cd 5.19_p1-pf

Anche se non avete questa versione precisa, è possibile modificare lo script per includere la versione precisa; in questo caso uso l'editor di testo vim, ma potete usarne uno qualsiasi:

vim build.sh

Per modificare la versione, osservate le seguenti variabili:

KVER="5.19"
PVER="_p1-pf"

KVER contiene la versione primaria del Kernel (5.19), mentre PVER contiene la versione delle patch (_p1-pf). Insieme vanno a formare KERNVER, la versione completa del Kernel (quindi 5.19_p1-pf). Ad esempio, se la vostra versione personalizzata avesse la stessa versione primaria del Kernel (5.19), ma una versione di patch diversa, ad esempio _mykernel, allora dovrete impostare le variabili nel seguente modo:

KVER="5.19"
PVER="_mykernel"

Nello script, build.sh, è presente una variabile, ARCHVER. Questa variabile contiene un numero da 1 a 41; ogni numero rappresenta una famiglia di processore diversa. Sempre nello stesso file, è presente una lista che spiega quale numero utilizzare, in base alla famiglia del processore.

Nella mia configurazione, questa variabile è impostata nel seguente modo:

ARCHVER=24

ARCHVER è impostato a 24 per il fatto che 24 rappresenta la famiglia di processori Intel Haswell:

# Note: ARCHVER is the sub-architecture number,
# which will be used to apply optimizations for your specific CPU.
# Down below is a list of numbers and their corresponding CPU.
[ ... ]
# 24. Intel Haswell (MHASWELL)

Vi consiglio di cambiare questo numero, perchè l'impatto sulla performance è notevole. Ecco la lista completa:

# 1. AMD Opteron/Athlon64/Hammer/K8 (MK8)
# 2. AMD Opteron/Athlon64/Hammer/K8 with SSE3 (MK8SSE3)
# 3. AMD 61xx/7x50/PhenomX3/X4/II/K10 (MK10)
# 4. AMD Barcelona (MBARCELONA)
# 5. AMD Bobcat (MBOBCAT)
# 6. AMD Jaguar (MJAGUAR)
# 7. AMD Bulldozer (MBULLDOZER)
# 8. AMD Piledriver (MPILEDRIVER)
# 9. AMD Steamroller (MSTEAMROLLER)
# 10. AMD Excavator (MEXCAVATOR)
# 11. AMD Zen (MZEN)
# 12. AMD Zen 2 (MZEN2)
# 13. AMD Zen 3 (MZEN3)
# 14. Intel P4 / older Netburst based Xeon (MPSC)
# 15. Intel Core 2 (MCORE2)
# 16. Intel Atom (MATOM)
# 17. Intel Nehalem (MNEHALEM)
# 18. Intel Westmere (MWESTMERE)
# 19. Intel Silvermont (MSILVERMONT)
# 20. Intel Goldmont (MGOLDMONT)
# 21. Intel Goldmont Plus (MGOLDMONTPLUS)
# 22. Intel Sandy Bridge (MSANDYBRIDGE)
# 23. Intel Ivy Bridge (MIVYBRIDGE)
# 24. Intel Haswell (MHASWELL)
# 25. Intel Broadwell (MBROADWELL)
# 26. Intel Skylake (MSKYLAKE)
# 27. Intel Skylake X (MSKYLAKEX)
# 28. Intel Cannon Lake (MCANNONLAKE)
# 29. Intel Ice Lake (MICELAKE)
# 30. Intel Cascade Lake (MCASCADELAKE)
# 31. Intel Cooper Lake (MCOOPERLAKE)
# 32. Intel Tiger Lake (MTIGERLAKE)
# 33. Intel Sapphire Rapids (MSAPPHIRERAPIDS)
# 34. Intel Rocket Lake (MROCKETLAKE)
# 35. Intel Alder Lake (MALDERLAKE)
# 36. Generic-x86-64 (GENERIC_CPU)
# 37. Generic-x86-64-v2 (GENERIC_CPU2)
# 38. Generic-x86-64-v3 (GENERIC_CPU3)
# 39. Generic-x86-64-v4 (GENERIC_CPU4)
# 40. Intel-Native optimizations autodetected by GCC (MNATIVE_INTEL)
# 41. AMD-Native optimizations autodetected by GCC (MNATIVE_AMD)

È una buona pratica controllare la configurazione del Kernel prima di compilarlo. Per fare ciò, lo script build.sh rende possibile la modifica della configurazione, eseguendo make menuconfig nella directory in cui è presente il Kernel, con l'opzione di copiare quella di default, o senza copiarla, per usare il proprio file di configurazione.

Assicuratevi di avere i permessi di amministratore prima di eseguire questo comando; se non siete amministratori, ponete all'inizio del comando sudo oppure doas, in base a quale usate.

dangerous Se non avete capito cosa c'è scritto qui sopra, interrompete immediatamente la configurazione del Kernel, per non rischiare di rendere il vostro sistema inutilizzabile. Anche se il rischio non è elevato, è meglio prevenire ulteriori problemi. Continuate a vostro rischio e pericolo.

warning Ricordatevi di salvare/copiare il file .config al termine della configurazione!

# Apri il menu di configurazione, copiando la configurazione di default
./build.sh -m

# Apri il menu di configurazione, senza copiare la configurazione di default
./build.sh -c -m

Dopo aver applicato le ottimizzazioni CPU e aver rincontrollato la configurazione del Kernel, È tempo di scegliere le impostazioni per migliorare notevolmente la performance. Ecco la lista delle opzioni:

flag Flag corta

Flag lunga

Descrizione

-e
--ccache
Usa ccache per velocizzare la compilazione. È consigliato usare quest'opzione se si compila il Kernel almeno due volte, per velocizzare le compilazioni successive. (Vedi articolo)
-f
--fastmath
Compila il Kernel usando Matematica Veloce non sicura. Tipicamente non ha nessun effetto collaterale e la performance è migliore rispetto a Matematica Veloce sicura.
-F
--fastmath-s
Compila il Kernel usando Matematica Veloce sicura. Da usare se Matematica Veloce non sicura non sicura riporta problemi, in casi rari.
-g
--graphite
Compila il Kernel usando Graphite. Tipicamente quest'opzione riduce leggermente la performance.
-l
--clearl-ps
Compila il Kernel applicando le patch di Clear Linux. Queste patch sono volte all'incremento ulteriore della performance, e vengono applicate direttamente dalla repository di Clear Linux. Molto consigliato per CPU Intel.
-p
--patches
Compila il Kernel applicando le patch incluse. Anche queste patch sono volte all'incremento ulteriore della performance — la maggior parte di queste patch proviene da LKML.

Dopo aver scelto le flag da applicare, e dopo aver scelto se copiare il file .config con la flag "-c", siete pronti per compilare il Kernel.

# Esempio 1: compila il Kernel, copiando il file di configurazione di default,
# applicando le patch di Clear Linux e quelle incluse,
# migliorando la performance con le flag sopra indicate
./build.sh -f -l -p

# Esempio 2: compila il Kernel, copiando il file di configurazione di default,
# usando ccache per velocizzare la compilazione,
# applicando le patch di Clear Linux e quelle incluse,
# migliorando la performance con le flag sopra indicate
./build.sh -e -f -l -p

# Esempio 3: compila il Kernel, senza copiare il file di configurazione
# dato che il file personalizzato è già presente in /usr/src/linux/.config,
# applicando le patch di Clear Linux e quelle incluse,
# migliorando la performance con le flag sopra indicate
./build.sh -c -f -l -p

Per stabilire quale fosse il kernel più performante, ho eseguito 4 compilazioni con flag diverse, usando la stessa configurazione del Kernel. Questi test sono stati eseguiti sul mio laptop, ThinkPad T440p, con CPU Intel Core i7-4700MQ, 8GB RAM, Kernel Gentoo Linux 5.16.0-pf2. Per ottenere il Kernel più performante, ho usato ogni singolo Kernel con il programma XMRig, eseguendolo per 5 minuti, e vedendo l'hashrate massimo. Lista compilazioni, dalla più performante alla meno performante:

settings Impostazioni

schedule Tempo compilazione

Max H/s

Matematica Veloce non sicura, Patch Clear Linux, Patch incluse

7m, 7s

1715

Matematica Veloce non sicura, Graphite, Patch Clear Linux, Patch incluse

7m, 3s

1500

Patch Clear Linux, Patch incluse

7m

1463

Patch incluse

7m

1460