Dimensione: 10532
Commento:
|
← Versione 101 del 09/10/2021 16.46.41 ⇥
Dimensione: 13903
Commento:
|
Le cancellazioni sono segnalate in questo modo. | Le aggiunte sono segnalate in questo modo. |
Linea 1: | Linea 1: |
## page was renamed from CompilazioneKernel ## ecco il thread sul forum http://forum.ubuntu-it.org/viewtopic.php?t=51517 |
|
Linea 3: | Linea 5: |
[[BR]] ||<tablestyle="font-size: 18px; text-align:center; width:100%; background:red; margin: 0 0 0 0;" style="padding:0.5em;">'''ATTENZIONE: Questa pagina è in revisione.[[BR]][[BR]]La procedura è sconsigliata ad utenti inesperti'''|| [[BR]] ||<tablebgcolor="#f1f1ed" tablewidth="40%" tablestyle="margin: 0pt 0pt 1em 1em; float: right; font-size: 0.9em;"style="padding: 0.5em;">[[TableOfContents(2)]]|| |
<<BR>> <<Indice(depth=2)>> <<Informazioni(forum="http://forum.ubuntu-it.org/viewtopic.php?t=635920"; rilasci="20.04 18.04 16.04 14.04")>> |
Linea 9: | Linea 10: |
In informatica, il '''kernel''' costituisce il '''nucleo''' di un sistema operativo. Si tratta di un software avente il compito di fornire ai processi in esecuzione sull'elaboratore un accesso sicuro e controllato all'hardware. Dato che possono esserne eseguiti simultaneamente più di uno, il kernel ha anche la responsabilità di assegnare una porzione di tempo-macchina e di accesso all'hardware a ciascun programma ([http://it.wikipedia.org/wiki/Multitasking multitasking]). Compilare il codice sorgente del '''kernel''', anziché installare uno dei pacchetti pre-compilati, assicura certamente alcuni vantaggi, tra cui: * Un avvio più veloce perché i moduli da caricare sono solo quelli della vostra macchina e non ce ne sono di inutili. * Un sistema operativo più veloce perché potete ottimizzare il codice sul vostro processore. * La possibilità di attivare opzioni che non sono presenti nei kernel pre-compilati. Compilare un kernel, però , '''non è necessario nei casi in cui il nostro hardware funzioni alla perfezione e\o le periferiche vengono completamente riconosciute'''. Inoltre l'aumento di prestazioni avviene in gran parte solo al boot senza che vi sia un reale aumento di prestazioni generali nella sessione di root vera e propria, ma non è sempre così. Si tenga ben presente che compilare un nuovo kernel significa nella sostanza cambiare sistema operativo, in quanto esso ne costituisce il "motore"; inoltre è richiesta un buona conoscenza del proprio hardware. |
In informatica, il '''kernel''' costituisce il nucleo di un sistema operativo. Si tratta di un software con il compito di fornire ai processi in esecuzione sull'elaboratore un accesso sicuro e controllato all'hardware e una porzione di tempo-macchina ([[http://it.wikipedia.org/wiki/Multitasking|multitasking]]). Installare un kernel ricompilato anziché uno di quelli precompilati forniti da Ubuntu può portare alcuni vantaggi, come: * avere una configurazione diversa e più adatta alla propria macchina. * velocizzare l'avvio di sistema, nel caso non si usi l'initrd. * avere un sistema operativo leggermente più reattivo grazie all'ottimizzazione basata sul tipo di processore. {{{#!wiki tip Non è necessario compilare un kernel nei casi in cui l'hardware non funzioni alla perfezione o le periferiche non vengano completamente riconosciute. A volte per far riconoscere correttamente al sistema una data periferica basta caricare i moduli necessari con le dovute opzioni. È utile ricompilare il kernel solo se tali moduli non sono presenti o se si è certi che i driver della periferica sono presenti solo in una versione diversa da quella attualmente in uso. Inoltre, l'aumento di prestazioni tende a essere irrilevante, soprattutto su computer già veloci.}}} È bene tenere presente che compilare un nuovo kernel significa, nella sostanza, cambiare sistema operativo, in quanto esso ne costituisce il ''motore''; inoltre è richiesta un buona conoscenza del proprio hardware. |
Linea 24: | Linea 26: |
== Installare le varie dipendenze == Il processo di compilazione richiede l'installazione di alcuni pacchetti specifici, da synaptic installare: ''build-essential bin86 kernel-package libncurses5 libncurses5-dev '', o più semplicemente digitare da terminale: {{{ sudo apt-get install build-essential bin86 kernel-package libncurses5 libncurses5-dev fakeroot }}} Se si vuole configurare il kernel tramite un'interfaccia grafica, cioè usando i comandi {{{make gconfig}}} o {{{make xconfig}}}, è necessaria l'installazione dei seguenti pacchetti: * ''libglade2-dev'' per poter usare il comando {{{make gconfig}}} * ''libqt3-headers'' e ''libqt3-mt-dev'' per {{{make xconfig}}}. == Scaricare i sorgenti del kernel == Sarà necessario scaricare i sorgenti del kernel. Ci sono due possibili strade: * scaricare il pacchetto da questo indirizzo: [http://www.kernel.org].[[BR]] In questo modo si avrà la possibilità di installare l'ultima versione stabile del kernel, la cosiddetta versione '''Vanilla'''. Una volta scaricato il pacchetto, sarà necessario decomprimerlo e copiarlo nella cartella ''/usr/src/''. [[Immagine(Icone/Piccole/note.png,,center)]]È consigliato scompattare e compilare il kernel da utente normale. Il proprietario , per policy debian, della cartella /usr/src è il gruppo src. Per assegnare al vostro utente i diritti di scrittura e lettura è quindi necessario e sufficiente inserire il proprio utente in questo gruppo con il comando {{{sudo adduser utente src}}}. Qualora il gruppo src non avesse più i diritti di scrittura (perché di default li ha) sulla cartella ''src'' questi dovranno essere ripristinati con : {{{sudo chmod -R g+wr /usr/src/* }}} Ora scompattiamo e copiamo i sorgenti nella cartella di destinazione: {{{ sudo tar -xvjf linux-[VERSIONE_CHE_AVETE_SCARICATO].tar.bz2 && cp -r linux-[VERSIONE_CHE_AVETE_SCARICATO] /usr/src/ }}} |
== Installare le dipendenze == Il processo di compilazione richiede l'installazione di diversi pacchetti. Per semplificare la procedura copiare ed incollare nel terminale uno dei seguenti comandi, in funzione del rilascio in cui si compila il kenel. Dal rilascio '''20.04''':{{{ sudo apt install build-essential bin86 byacc elfutils fakeroot kernel-package libbison-dev liblz4-dev liblz4-tool libelf-dev libfl-dev ubuntu-dev-tools }}} Fino al rilascio '''18.04''':{{{ sudo apt install build-essential bin86 byacc elfutils fakeroot kernel-package libbison-dev liblz4-dev liblz4-tool libelf-dev libfl-dev ubuntu-core-libs-dev }}} Inoltre, se si desidera usare un'interfaccia grafica per configurare il kernel, è necessario installare uno dei seguenti pacchetti: * [[apt://libglade2-dev | libglade2-dev]], se si usa '''Ubuntu''' o le derivate escluse quelle del punto successivo. * [[apt://qttools5-dev | qttools5-dev]], se si usa '''Kubuntu''' o '''Lubuntu''' con '''!LxQt'''. * [[apt://libncurses5-dev | libncurses5-dev]], per avere una interfaccia grafica direttamente dentro il terminale e spostarsi tra i menu usando la sola tastiera (utile per computer poco potenti o senza server grafico). == Scaricare l'archivio dei sorgenti del kernel == * Se si desidera usare l'ultima versione stabile del kernel Linux ufficiale (la cosiddetta versione ''vanilla''), scaricare il pacchetto da [[http://www.kernel.org|questo]] indirizzo. * Se si desidera usare la versione del kernel Linux modificata dagli sviluppatori di Ubuntu, è possibile prelevarla dai [[Repository|repository]], installando il pacchetto [[apt://linux-source | linux-source]]. Questa versione ha il vantaggio di contenere driver e componenti aggiuntivi che gli sviluppatori di Ubuntu hanno ritenuto di integrare nel kernel, ma per contro potrebbe non essere sempre aggiornata rispetto all'ultima versione del kernel Linux ufficiale. <<Anchor(estrarre)>> == Estrarre i sorgenti == Sebbene non sia strettamente necessario, la policy Debian consiglia di usare la directory `/usr/src` per compilare il kernel.<<BR>> Il gruppo proprietario della cartella `/usr/src` è il gruppo '''src'''. * Per inserire il proprio utente nel gruppo '''src''' è sufficiente digitare il seguente comando in un [[AmministrazioneSistema/Terminale|terminale]], sostituendo alla dicitura «`nomeutente`» il proprio nome utente:{{{ sudo adduser nomeutente src }}} * Qualora il gruppo '''src''' non avesse più i diritti di scrittura sulla cartella `/usr/src`, questi dovranno essere ripristinati con il seguente comando: {{{ sudo chmod -R g+wr /usr/src }}} {{{#!wiki tip La modifica verrà applicata all'accesso successivo.}}} * Scompattare e spostare i sorgenti nella cartella di destinazione con il seguente comando:{{{ tar -xJf linux-[VERSIONE_SCARICATA].tar.xz mv linux-[VERSIONE_SCARICATA] /usr/src/ }}} = Compilazione e installazione = Entrare nella directory dei sorgenti del kernel appena scaricati:{{{ cd /usr/src/linux-[VERSIONE_SCARICATA] }}} == Applicare le patch == A questo punto, se necessario, sarà possibile applicare una o più ''patch'' al kernel. ## ##Tra le più diffuse si possono trovare quelle di: ## ## * [[http://www.kernel.org/pub/linux/kernel/people/ck/patches/2.6/|Con Kolivas]] (per kernel vanilla fino al 2.6.22) ## * [[ftp://ftp.kernel.org/pub/linux/kernel/people/alan/|Alan Cox]] ## * [[ftp://ftp.kernel.org/pub/linux/kernel/people/akpm/|Andrew Morton]] Di solito le ''patch'' vengono applicate utilizzando l'insieme di due comandi: '''patch''' e '''cat''' (o anche '''bzcat''' se il file ha estensione {{{.bz2}}}). 0. Copiare la ''patch'' nella directory dei sorgenti del kernel e digitare il seguente comando:{{{ bzcat [NOME_DELLA_PATCH].bz2 | patch -p1 --dry-run }}} L'opzione '''--dry-run''' permette di simulare l'applicazione della ''patch'' senza modificare realmente i file. 0. Se non vengono visualizzati errori, si può procedere con l'applicazione della stessa rieseguendo il comando precedente senza l'opzione '''--dry-run''':{{{ bzcat [NOME_DELLA_PATCH].bz2 | patch -p1 }}} 0. Se il procedimento non dovesse andare a buon fine, sarà necessario verificare di aver scaricato la versione corretta della ''patch'' e ripetere il procedimento. == Configurazione == Per personalizzare la configurazione, ci sono diverse modalità: * grafica su '''Ubuntu''' o le derivate escluse quelle del punto successivo (usando le librerie gtk) {{{ make gconfig }}} * grafica su '''Kubuntu''' e ''''Lubuntu''' con '''LXQt''' (usando le librerie qt){{{ make xconfig }}} * pseudo-grafica nel terminale (usando le librerie ncurses): {{{ make menuconfig }}} * testuale nel terminale: {{{ make config }}} ## Potrete cercare le varie opzioni di configurazione di ogni versione del kernel in questo utilissimo sito: [[http://kernel.xc.net/|Linux Kernel Configuration Archive]] {{{#!wiki important L'errata configurazione di un semplice modulo può compromettere l'intero sistema. Per cercare di ridurre al minimo gli errori, usare il comando «lshw» per visualizzare il proprio hardware.}}} È possibile importare la configurazione di un altro kernel e partire da questa per effettuare ulteriori personalizzazioni. I file di configurazione per i kernel attualmente installati nel sistema si trovano nella directory `/boot` e hanno un nome che segue lo standard `config-versione_kernel` (ad esempio `config-4.15.0-58-generic`). È comunque possibile importare un qualunque file di configurazione valido. {{{#!wiki tip Lo stesso risultato è possibile raggiungerlo copiando a mano un file di configurazione per il kernel all'interno della directory con i sorgenti e rinominando il file in `.config`, dopodichè si avvia il programma di configurazione. In alternativa, se non si vuole utilizzare l'interfaccia grafica, il comando `make oldconfig` importa direttamente la configurazione del kernel attualmente in esecuzione sul computer e, con un'interfaccia a linea di comando, propone una ad una tutte le opzioni presenti nel nuovo sorgente. }}} Terminata la procedura, la configurazione viene salvata all'interno del file `.config` presente nella cartella del kernel. Si consiglia di farne una copia, se si è soddisfatti del lavoro svolto. === Impostazioni consigliate === Seguire quanto descritto per evitare problemi indesiderati: |
Linea 51: | Linea 129: |
* scaricare il pacchetto dai repository di Ubuntu (kernel ufficiale di Ubuntu), da terminale dare il seguente comando: {{{ sudo apt-get install linux-source }}} Ubuntu, purtroppo, non fornisce tutte le versioni dei kernel più aggiornate, scegliendo infatti questa opzione si correrà il rischio di non avere l'ultimo kernel stabile. = Compilazione e installazione = Entrare nella directory dei sorgenti del kernel appena scaricati: {{{ cd /usr/src/linux-[VERSIONE_CHE_AVETE_SCARICATO] }}} == Eventuali patch == A questo punto, se necessario, sarà possibile applicare una o più '''patch''' al kernel. Tra le più diffuse si possono trovare quelle di: * [http://www.kernel.org/pub/linux/kernel/people/ck/patches/2.6/ Con Kolivas] * [ftp://ftp.kernel.org/pub/linux/kernel/people/alan/ Alan Cox] * [ftp://ftp.kernel.org/pub/linux/kernel/people/akpm/ Andrew Morton] Di solito le patch vengono applicate utilizzando l'insieme di due comandi: '''patch''' e '''cat''' (o anche '''bzcat''' se il file ha estensione ''.bz2''). Copiare la patch nella directory dei sorgenti del kernel e digitare: {{{ bzcat [NOME_DELLA_PATCH].bz2 | patch -p1 }}} Se il procedimento non andrà a buon fine, sarà necessario cancellare tutto quanto e ricominciare dall'inizio. == Configurazione == È possibile importare una vecchia configurazione di un altro kernel. Se si dispone del file `.config` è sufficiente copiarlo all'interno della directory dei sorgenti. Se si vuole utilizzare la configurazione del kernel attualmente in uso, è sufficiente digitare, all'interno della directory dei sorgenti: {{{ sudo make oldconfig }}} Per personalizzare la configurazione eliminando eventuali moduli, o per crearne una nuova, ci sono diverse modalità: * Grafica: * usando le librerie gtk (consigliato su Ubuntu){{{ make gconfig }}} * usando le librerie qt (consigliato su Kubuntu){{{ make xconfig }}} * Pseudo-grafica: {{{ make menuconfig }}} Per l'utente più inesperto è consigliabile effettuare la configurazione con il metodo grafico. Potrete cercare le varie opzioni di configurazione di ogni versione del kernel in questo utilissimo sito: [http://kernel.xc.net/ Linux Kernel Configuration Archive] [[Immagine(Icone/Piccole/note.png,,center)]]'''Attenzione a come vi muovete: la cancellazione di un semplice modulo può compromettere l'intero sistema! Per cercare di ridurre al minimo gli errori digitate da terminale ''lshw'', per visualizzare il vostro hardware.''' Alla fine la configurazione sarà all'interno del file `.config` presente nella cartella del kernel. È consigliato farne una copia, se si è soddisfatti del lavoro svolto. === Configurazione standard === Seguire quanto descritto per evitare spiacevoli inconvenienti in fase di compilazione: 1. In «'''General Setup'''» attivare: |
0. In «'''General Setup'''» attivare: |
Linea 117: | Linea 133: |
1. In «'''Processor type and features'''»: | 0. In «'''Processor type and features'''»: |
Linea 126: | Linea 142: |
1. In «'''Graphics Support'''» * Disabilitare '''NVIDIA RIVA''' se si usano driver Nvidia proprietari. 1. In «'''Block layer -> IO Schedulers'''» lasciare solo «'''CFQ I/O scheduler'''», otterrete una migliore performance. 1. In «'''Kernel hacking'''» deselezionare «'''Kernel debugging'''». == Compilare == Finita la fase di personalizzazione, per compilare, digitare: {{{ fakeroot make-kpkg clean }}} In questo modo vengono puliti i sorgenti. Non digitare tale comando se non si è mai ricompilato il kernel. E successivamente: {{{ fakeroot make-kpkg --append-to-version=-custom --initrd kernel_image kernel_headers modules_image }}} Il flag di revisione è opzionale ed è solamente utile per visualizzare il nome del kernel attraverso il comando: {{{ |
0. In «'''Block layer -> IO Schedulers'''» lasciare solo «'''CFQ I/O scheduler'''», otterrete una migliore performance. 0. In «'''Kernel hacking'''» deselezionare «'''Kernel debugging'''». 0. In «'''Device Drivers -> Character devices'''» selezionare «'''Virtual terminal'''». == Compilazione == Finita la fase di personalizzazione, occorre procedere con la compilazione. * Nel caso in cui si possiede un sistema multiprocessore è possibile impostare la variabile ''CONCURRENCY_LEVEL'' affinché vengano eseguite più compilazioni in parallelo. Ad esempio per un processore con 2 core è possibile impostare tale valore a 2: {{{ export CONCURRENCY_LEVEL=2 }}} * Qualora i sorgenti fossero già stati compilati in passato e si desiderasse ripulirli (ri-eseguire la compilazione di tutti i pacchetti): {{{ make-kpkg --rootcmd fakeroot clean }}} Il comando consigliato per compilare il kernel è: {{{ make-kpkg --rootcmd fakeroot --initrd kernel_image kernel_headers modules_image }}} * L'opzione «'''--rootcmd'''» è necessaria perchè alcuni passaggi nella creazione del pacchetto richiedono un ambiente di root, che fakeroot simula. *L'opzione «'''--initrd'''» serve a creare un file immagine di una partizione speciale (initial ram disk), che all'avvio del sistema verrà caricata nella ram, montata temporaneamente come directory root e usata per caricare i moduli strettamente necessari per l'avvio del sistema, prima di venire sostituita dalla partizione contenente il sistema reale. L'immagine initrd è usata soprattutto nei kernel ufficiali, che devono supportare un gran numero di chipset, file system, dischi fissi ecc... e perciò caricano tutti questi moduli nell'initrd. Serve anche nel caso si desideri avere un bootsplash. Perché l'initrd funzioni, è necessario che l' opzione 'RAM disk support' nella sezione 'Block Device' della configurazione del kernel sia abilitata. Per poter fare a meno di questa opzione è necessario, nella sezione '''Device Drivers''', compilare staticamente nel kernel sia il modulo relativo al chipset della propria scheda madre, sia il modulo relativo al filesystem usato nella partizione di root (in questo modo l'avvio risulterà anche un po' più veloce). * L'opzione «'''--append-to-version'''», facoltativa, serve a definire un suffisso personalizzato per il proprio kernel, visualizzabile attraverso il comando: {{{ |
Linea 146: | Linea 170: |
C'è la possibilità di scrivere tutto ciò che si vuole al posto di «'''-custom'''» (esempio: dopo il trattino "-10.k7" in base al tipo di processore disponibile sulla propria macchina). Generalmente i kernel Ubuntu usano un '''initrd''', per crearlo è sufficiente aggiungere l'opzione «'''--initrd'''» al comando precedente. [[Immagine(Icone/Piccole/note.png,,center)]] * L'opzione '''--initrd''' viene usata per il così detto '''ramdisk''': una porzione di ram che viene usata per caricare i moduli necessari al sistema per avviare la sessione. Non è un'opzione essenziale in quanto se si compilano i moduli relativi al filesistem sulla quale fa il boot e i moduli del chipset , non c'è bisogno dell'immagine initrd.Inoltre il boot risulta un pò più veloce. Serve invece nei kernel ufficiali che devono supportare un gran numero di chipset, filesistem, hd ecc. e per ciò si caricano tutti questi moduli. Serve anche nel caso si debba usare un bootsplash. Si possono usare tool come '''mkinitrd.yaird''' per creare ramdisk esclusivamente con i moduli necessari all'avvio. Purtroppo mkinitrd.yaird non supporta ancora partizioni ext3 e xfs. Poiché vi sia la ''Ram disk'' è necessario che l' opzione 'RAM disk support' nella sezione 'Block Device' del kernel, sia abilitata. * L'opzione '''kernel_image''' compila tutti i moduli del kernel che abbiamo scelto nella configurazione e ne crea un pacchetto .deb * L'opzione '''kernel_headers''' crea un pacchetto (sempre in in .deb) con una serie di files, script che consentono di compilare sorgenti esterni. * L'opzione '''modules_image''' compila i sorgenti (dei driver video, per esempio) dei moduli esterni presenti in ''/usr/src''. == Installare == Entrare nella cartella superiore: {{{ |
Si può scrivere anche un'altra denominazione, purché scritta in minuscolo senza punti e senza caratteri extra. * I target specificano quali pacchetti '''deb''' verranno creati: * Il target '''kernel_image''' compila il kernel e tutti i moduli scelti nella configurazione, e ne crea un pacchetto `.deb`. * Il target '''kernel_headers''' crea un pacchetto `.deb` con una serie di file e script che consentono di compilare moduli esterni in un secondo momento. Non è necessario, in quanto gli stessi sorgenti del kernel servono già allo scopo, ma se si desidera eliminare in seguito i sorgenti del kernel (magari per liberare spazio su disco) è bene specificare anche questo target. * Il target '''modules_image''' compila i sorgenti dei moduli esterni scaricati a parte e posizionati in `/usr/src/modules` (come i moduli per i driver video proprietari). Se non ce ne fossero, non serve aggiungere questo parametro. == Installazione == 0. Spostarsi nella cartella superiore: {{{ |
Linea 169: | Linea 182: |
E installare i pacchetti appena creati (dovrebbero essere due). Da terminale digitare: {{{ |
0. Installare i pacchetti appena creati digitando da terminale: {{{ |
Linea 174: | Linea 186: |
'''Grub verrà aggiornato automaticamente.''' Riavviare e all'avvio scegliere il nuovo kernel installato. Se ci sono problemi, riavviare la macchina e utilizzare il vecchio kernel. |
Nelle ultime versioni l'immagine del kernel è denominata come `linux-image-[VERSIONE_KERNEL]_[ARCHITETTURA].deb`.<<BR>> Il boot loader [[AmministrazioneSistema/Grub|GRUB]] verrà aggiornato automaticamente. 0. Riavviare il computer e quindi scegliere dal menu di GRUB il nuovo kernel installato. Qualora si riscontrino problemi, riavviare il sistema e selezionare la versione del kernel precedentemente utilizzata. |
Linea 183: | Linea 193: |
* [http://massimo.solira.org/pcikl/index.html Progetto Configurazione Italiana del Kernel Linux] | * [[https://help.ubuntu.com/community/Kernel/Compile|Guida su help Ubuntu internazionale]] (in inglese) * [[https://wiki.ubuntu.com/Kernel/BuildYourOwnKernel|Guida su wiki Ubuntu internazionale]] (in inglese) * [[https://wiki.archlinux.org/index.php/Kernels/Compilation/Traditional_(Italiano)|Compilazione tradizionale]] (Wiki di Arch) * [[http://guide.debianizzati.org/index.php/LKN:_Personalizzare_un_Kernel|Personalizzare kernel]] (Guida Debianizzati) *[[http://guide.debianizzati.org/index.php/Debian_Kernel_Howto#Bisogna_usare_l.27initrd_oppure_no.3F|Usare l'initrd?]] (Guida Debianizzati; si consiglia la consultazione dell'intera guida) * [[http://www.kroah.com/lkn/|Linux Kernel in a Nutshell]] * [[http://guide.debianizzati.org/index.php/Linux_Kernel_in_a_Nutshell|Linux Kernel in a Nutshell]] (Traduzione a cura di Debianizzati) |
Linea 185: | Linea 203: |
CategoryDaRevisionare | CategoryAmministrazione CategoryProgrammazione |
Guida verificata con Ubuntu: 20.04
Problemi in questa pagina? Segnalali in questa discussione
Introduzione
In informatica, il kernel costituisce il nucleo di un sistema operativo. Si tratta di un software con il compito di fornire ai processi in esecuzione sull'elaboratore un accesso sicuro e controllato all'hardware e una porzione di tempo-macchina (multitasking).
Installare un kernel ricompilato anziché uno di quelli precompilati forniti da Ubuntu può portare alcuni vantaggi, come:
- avere una configurazione diversa e più adatta alla propria macchina.
- velocizzare l'avvio di sistema, nel caso non si usi l'initrd.
- avere un sistema operativo leggermente più reattivo grazie all'ottimizzazione basata sul tipo di processore.
Non è necessario compilare un kernel nei casi in cui l'hardware non funzioni alla perfezione o le periferiche non vengano completamente riconosciute. A volte per far riconoscere correttamente al sistema una data periferica basta caricare i moduli necessari con le dovute opzioni. È utile ricompilare il kernel solo se tali moduli non sono presenti o se si è certi che i driver della periferica sono presenti solo in una versione diversa da quella attualmente in uso. Inoltre, l'aumento di prestazioni tende a essere irrilevante, soprattutto su computer già veloci.
È bene tenere presente che compilare un nuovo kernel significa, nella sostanza, cambiare sistema operativo, in quanto esso ne costituisce il motore; inoltre è richiesta un buona conoscenza del proprio hardware.
Preparativi
Installare le dipendenze
Il processo di compilazione richiede l'installazione di diversi pacchetti. Per semplificare la procedura copiare ed incollare nel terminale uno dei seguenti comandi, in funzione del rilascio in cui si compila il kenel.
Dal rilascio 20.04:
sudo apt install build-essential bin86 byacc elfutils fakeroot kernel-package libbison-dev liblz4-dev liblz4-tool libelf-dev libfl-dev ubuntu-dev-tools
Fino al rilascio 18.04:
sudo apt install build-essential bin86 byacc elfutils fakeroot kernel-package libbison-dev liblz4-dev liblz4-tool libelf-dev libfl-dev ubuntu-core-libs-dev
Inoltre, se si desidera usare un'interfaccia grafica per configurare il kernel, è necessario installare uno dei seguenti pacchetti:
libglade2-dev, se si usa Ubuntu o le derivate escluse quelle del punto successivo.
qttools5-dev, se si usa Kubuntu o Lubuntu con LxQt.
libncurses5-dev, per avere una interfaccia grafica direttamente dentro il terminale e spostarsi tra i menu usando la sola tastiera (utile per computer poco potenti o senza server grafico).
Scaricare l'archivio dei sorgenti del kernel
Se si desidera usare l'ultima versione stabile del kernel Linux ufficiale (la cosiddetta versione vanilla), scaricare il pacchetto da questo indirizzo.
Se si desidera usare la versione del kernel Linux modificata dagli sviluppatori di Ubuntu, è possibile prelevarla dai repository, installando il pacchetto linux-source. Questa versione ha il vantaggio di contenere driver e componenti aggiuntivi che gli sviluppatori di Ubuntu hanno ritenuto di integrare nel kernel, ma per contro potrebbe non essere sempre aggiornata rispetto all'ultima versione del kernel Linux ufficiale.
Estrarre i sorgenti
Sebbene non sia strettamente necessario, la policy Debian consiglia di usare la directory /usr/src per compilare il kernel.
Il gruppo proprietario della cartella /usr/src è il gruppo src.
Per inserire il proprio utente nel gruppo src è sufficiente digitare il seguente comando in un terminale, sostituendo alla dicitura «nomeutente» il proprio nome utente:
sudo adduser nomeutente src
Qualora il gruppo src non avesse più i diritti di scrittura sulla cartella /usr/src, questi dovranno essere ripristinati con il seguente comando:
sudo chmod -R g+wr /usr/src
- La modifica verrà applicata all'accesso successivo.
Scompattare e spostare i sorgenti nella cartella di destinazione con il seguente comando:
tar -xJf linux-[VERSIONE_SCARICATA].tar.xz mv linux-[VERSIONE_SCARICATA] /usr/src/
Compilazione e installazione
Entrare nella directory dei sorgenti del kernel appena scaricati:
cd /usr/src/linux-[VERSIONE_SCARICATA]
Applicare le patch
A questo punto, se necessario, sarà possibile applicare una o più patch al kernel.
Di solito le patch vengono applicate utilizzando l'insieme di due comandi: patch e cat (o anche bzcat se il file ha estensione .bz2).
Copiare la patch nella directory dei sorgenti del kernel e digitare il seguente comando:
bzcat [NOME_DELLA_PATCH].bz2 | patch -p1 --dry-run
L'opzione --dry-run permette di simulare l'applicazione della patch senza modificare realmente i file.
Se non vengono visualizzati errori, si può procedere con l'applicazione della stessa rieseguendo il comando precedente senza l'opzione --dry-run:
bzcat [NOME_DELLA_PATCH].bz2 | patch -p1
Se il procedimento non dovesse andare a buon fine, sarà necessario verificare di aver scaricato la versione corretta della patch e ripetere il procedimento.
Configurazione
Per personalizzare la configurazione, ci sono diverse modalità:
grafica su Ubuntu o le derivate escluse quelle del punto successivo (usando le librerie gtk)
make gconfig
grafica su Kubuntu e 'Lubuntu con LXQt (usando le librerie qt)
make xconfig
pseudo-grafica nel terminale (usando le librerie ncurses):
make menuconfig
testuale nel terminale:
make config
L'errata configurazione di un semplice modulo può compromettere l'intero sistema. Per cercare di ridurre al minimo gli errori, usare il comando «lshw» per visualizzare il proprio hardware.
È possibile importare la configurazione di un altro kernel e partire da questa per effettuare ulteriori personalizzazioni. I file di configurazione per i kernel attualmente installati nel sistema si trovano nella directory /boot e hanno un nome che segue lo standard config-versione_kernel (ad esempio config-4.15.0-58-generic). È comunque possibile importare un qualunque file di configurazione valido.
Lo stesso risultato è possibile raggiungerlo copiando a mano un file di configurazione per il kernel all'interno della directory con i sorgenti e rinominando il file in .config, dopodichè si avvia il programma di configurazione. In alternativa, se non si vuole utilizzare l'interfaccia grafica, il comando make oldconfig importa direttamente la configurazione del kernel attualmente in esecuzione sul computer e, con un'interfaccia a linea di comando, propone una ad una tutte le opzioni presenti nel nuovo sorgente.
Terminata la procedura, la configurazione viene salvata all'interno del file .config presente nella cartella del kernel. Si consiglia di farne una copia, se si è soddisfatti del lavoro svolto.
Impostazioni consigliate
Seguire quanto descritto per evitare problemi indesiderati:
In «General Setup» attivare:
- -Support for paging of anonymous memory (swap)
- --Support for prefetching swapped memory
- -Support for paging of anonymous memory (swap)
In «Processor type and features»:
In «Processor family» scegliere il modello del processore.
Attivare Preemption Model-> Voluntary Kernel Preemption (Desktop)
In «High Memory Support» scegliere:
off se si possiede meno di 1 GB di RAM
1GB Low Memory Support se si possiede 1GB di RAM
4GB se si possiede più di 1GB di RAM
In «Timer frequency» abilitare: 1000 Hz
In «Block layer -> IO Schedulers» lasciare solo «CFQ I/O scheduler», otterrete una migliore performance.
In «Kernel hacking» deselezionare «Kernel debugging».
In «Device Drivers -> Character devices» selezionare «Virtual terminal».
Compilazione
Finita la fase di personalizzazione, occorre procedere con la compilazione.
Nel caso in cui si possiede un sistema multiprocessore è possibile impostare la variabile CONCURRENCY_LEVEL affinché vengano eseguite più compilazioni in parallelo. Ad esempio per un processore con 2 core è possibile impostare tale valore a 2:
export CONCURRENCY_LEVEL=2
Qualora i sorgenti fossero già stati compilati in passato e si desiderasse ripulirli (ri-eseguire la compilazione di tutti i pacchetti):
make-kpkg --rootcmd fakeroot clean
Il comando consigliato per compilare il kernel è:
make-kpkg --rootcmd fakeroot --initrd kernel_image kernel_headers modules_image
L'opzione «--rootcmd» è necessaria perchè alcuni passaggi nella creazione del pacchetto richiedono un ambiente di root, che fakeroot simula.
L'opzione «--initrd» serve a creare un file immagine di una partizione speciale (initial ram disk), che all'avvio del sistema verrà caricata nella ram, montata temporaneamente come directory root e usata per caricare i moduli strettamente necessari per l'avvio del sistema, prima di venire sostituita dalla partizione contenente il sistema reale. L'immagine initrd è usata soprattutto nei kernel ufficiali, che devono supportare un gran numero di chipset, file system, dischi fissi ecc... e perciò caricano tutti questi moduli nell'initrd. Serve anche nel caso si desideri avere un bootsplash. Perché l'initrd funzioni, è necessario che l' opzione 'RAM disk support' nella sezione 'Block Device' della configurazione del kernel sia abilitata. Per poter fare a meno di questa opzione è necessario, nella sezione Device Drivers, compilare staticamente nel kernel sia il modulo relativo al chipset della propria scheda madre, sia il modulo relativo al filesystem usato nella partizione di root (in questo modo l'avvio risulterà anche un po' più veloce).
L'opzione «--append-to-version», facoltativa, serve a definire un suffisso personalizzato per il proprio kernel, visualizzabile attraverso il comando:
uname -r
Si può scrivere anche un'altra denominazione, purché scritta in minuscolo senza punti e senza caratteri extra.I target specificano quali pacchetti deb verranno creati:
Il target kernel_image compila il kernel e tutti i moduli scelti nella configurazione, e ne crea un pacchetto .deb.
Il target kernel_headers crea un pacchetto .deb con una serie di file e script che consentono di compilare moduli esterni in un secondo momento. Non è necessario, in quanto gli stessi sorgenti del kernel servono già allo scopo, ma se si desidera eliminare in seguito i sorgenti del kernel (magari per liberare spazio su disco) è bene specificare anche questo target.
Il target modules_image compila i sorgenti dei moduli esterni scaricati a parte e posizionati in /usr/src/modules (come i moduli per i driver video proprietari). Se non ce ne fossero, non serve aggiungere questo parametro.
Installazione
Spostarsi nella cartella superiore:
cd ..
Installare i pacchetti appena creati digitando da terminale:
sudo dpkg -i kernel-image-[VERSIONE_DEL_KERNEL].deb sudo dpkg -i linux-headers-[VERSIONE_DEL_KERNEL].deb
Nelle ultime versioni l'immagine del kernel è denominata come linux-image-[VERSIONE_KERNEL]_[ARCHITETTURA].deb.
Il boot loader GRUB verrà aggiornato automaticamente.- Riavviare il computer e quindi scegliere dal menu di GRUB il nuovo kernel installato.
Qualora si riscontrino problemi, riavviare il sistema e selezionare la versione del kernel precedentemente utilizzata.
Ulteriori risorse
Guida su help Ubuntu internazionale (in inglese)
Guida su wiki Ubuntu internazionale (in inglese)
Compilazione tradizionale (Wiki di Arch)
Personalizzare kernel (Guida Debianizzati)
Usare l'initrd? (Guida Debianizzati; si consiglia la consultazione dell'intera guida)
Linux Kernel in a Nutshell (Traduzione a cura di Debianizzati)