Come compilare un kernel Linux

Rispondi
Avatar utente
openresource
Administrator
Administrator
Messaggi: 384
Iscritto il: mar gen 28, 2020 9:52 pm
Reactions score: 4
Località: varese
Contatta:
apr 2020 20 06:41

Come compilare un kernel Linux

Messaggio da openresource

Nell'informatica, un kernel è il software di basso livello che gestisce la comunicazione con l'hardware e il coordinamento generale del sistema. A parte alcuni firmware iniziali integrati nella scheda madre del tuo computer, quando si avvia il computer, il kernel è ciò che fornisce consapevolezza che ha un disco rigido e uno schermo, una tastiera e una scheda di rete. È anche compito del kernel garantire che sia dato uguale tempo (più o meno) a ciascun componente in modo che la grafica, l'audio, il filesystem e la rete funzionino senza intoppi, anche se vengono eseguiti contemporaneamente.

La ricerca del supporto hardware, tuttavia, è in corso, poiché più hardware viene rilasciato, più cose un kernel deve adottare nel suo codice per far funzionare l'hardware come previsto. È difficile ottenere numeri precisi, ma il kernel Linux è sicuramente tra i kernel migliori per compatibilità hardware. Linux gestisce innumerevoli computer e telefoni cellulari, sistemi integrati su schede a chip (SoC) per hobby e usi industriali, schede RAID, macchine da cucire e molto altro.

Nel 20 ° secolo (e persino nei primi anni del 21 °), non era irragionevole per un utente Linux aspettarsi che quando avessero acquistato un nuovo hardware, avrebbero dovuto scaricare il codice sorgente del kernel più recente, compilarlo e installarlo in modo che possano ottenere supporto per il dispositivo. Ultimamente, però, sarebbe difficile trovare un utente Linux che compili il proprio kernel tranne per divertimento o profitto tramite hardware personalizzato altamente specializzato. Di solito in questi giorni non è necessario compilare il kernel Linux da soli.

Ecco i motivi per cui, oltre a un breve tutorial su come compilare un kernel quando è necessario.

Aggiorna il tuo kernel esistente
Che tu abbia un laptop nuovo di zecca con una nuova scheda grafica o un chipset WiFi o hai appena portato a casa una nuova stampante, il tuo sistema operativo (chiamato GNU + Linux o solo Linux, che è anche il nome del kernel ) ha bisogno di un driver per aprire i canali di comunicazione verso quel nuovo componente (scheda grafica, chip WiFi, stampante o altro). Può essere ingannevole, a volte, quando si collega un nuovo dispositivo e il computer sembra riconoscerlo. Ma non lasciarti ingannare. A volte è tutto ciò di cui hai bisogno, ma altre volte il tuo sistema operativo utilizza solo protocolli generici per sondare un dispositivo collegato.

Ad esempio, il tuo computer potrebbe essere in grado di identificare la tua nuova stampante di rete, ma a volte questo è solo perché la scheda di rete nella stampante è programmata per identificarsi in una rete in modo che possa ottenere un indirizzo DHCP. Ciò non significa necessariamente che il tuo computer sappia quali istruzioni inviare alla stampante per produrre una pagina di testo stampato. In effetti, potresti obiettare che il computer non sa nemmeno "sapere" che il dispositivo è una stampante; potrebbe solo mostrare che esiste un dispositivo sulla rete a un indirizzo specifico e che il dispositivo si identifica con la serie di caratteri della stampante . Le convenzioni del linguaggio umano non hanno senso per un computer; ciò di cui ha bisogno è un autista.

Gli sviluppatori di kernel, i produttori di hardware, i tecnici di supporto e gli appassionati sanno tutti che il nuovo hardware viene costantemente rilasciato. Molti di essi forniscono driver, inviati direttamente al team di sviluppo del kernel per l'inclusione in Linux. Ad esempio, i driver della scheda grafica Nvidia sono spesso scritti nel modulo del kernel Nouveau e, poiché le schede Nvidia sono comuni, il codice è generalmente incluso in qualsiasi kernel distribuito per uso generale (come il kernel che si ottiene quando si scarica Fedora o Ubuntu . Nvidia è meno comune, ad esempio nei sistemi embedded, il modulo Nouveau è solitamente escluso Esistono moduli simili per molti altri dispositivi: le stampanti beneficiano di Foomatic e CUPS , le schede wireless hannomoduli b43, ath9k, wl e così via.

Le distribuzioni tendono a includere quanto più ragionevolmente possibile nelle loro build del kernel Linux perché vogliono che tu sia in grado di collegare un dispositivo e iniziare a usarlo immediatamente, senza l'installazione di driver richiesta. Per la maggior parte, è quello che succede, soprattutto ora che molti produttori di dispositivi stanno ora finanziando lo sviluppo di driver Linux per l'hardware che vendono e inviando tali driver direttamente al team del kernel per la distribuzione generale.

A volte, tuttavia, stai eseguendo un kernel che hai installato sei mesi fa con un nuovo dispositivo emozionante che è appena arrivato nei negozi una settimana fa. In quel caso, il tuo kernel potrebbe non avere un driver per quel dispositivo. La buona notizia è che molto spesso, un driver per quel dispositivo potrebbe esistere in una versione molto recente del kernel, il che significa che tutto ciò che devi fare è aggiornare ciò che stai eseguendo.

Generalmente, questo viene fatto tramite un gestore di pacchetti. Ad esempio, su RHEL, CentOS e Fedora:

Codice: Seleziona tutto

$ sudo dnf update kernel

Su Debian e Ubuntu, prima procurati la versione corrente del kernel:

Codice: Seleziona tutto

$ uname -r

4.4.186
Cerca versioni più recenti:

Codice: Seleziona tutto

$ sudo apt update
$ sudo apt cerca linux-image

Installa l'ultima versione che trovi. In questo esempio, l'ultimo disponibile è 5.2.4:

Codice: Seleziona tutto

$ sudo apt install linux-image-5.2.4

Dopo un aggiornamento del kernel, è necessario riavviare (a meno che non si stia usando kpatch o kgraft). Quindi, se il driver di dispositivo necessario è nell'ultimo kernel, l'hardware funzionerà come previsto.

Installa un modulo del kernel
A volte una distribuzione non prevede che i suoi utenti utilizzino spesso un dispositivo (o almeno non abbastanza che il driver del dispositivo debba trovarsi nel kernel di Linux). Linux adotta un approccio modulare ai driver, quindi le distribuzioni possono fornire pacchetti di driver separati che possono essere caricati dal kernel anche se il driver non è compilato nel kernel stesso. Questo è utile, sebbene possa complicarsi quando un driver non è incluso in un kernel ma è necessario durante l'avvio, o quando il kernel viene aggiornato da sotto il driver modulare. Il primo problema è risolto con un initrd (disco RAM iniziale) e non rientra nell'ambito di questo articolo, mentre il secondo è risolto da un sistema chiamato kmod .

Il sistema kmod assicura che quando viene aggiornato un kernel, vengono aggiornati anche tutti i driver modulari installati accanto ad esso. Se installi un driver manualmente, perdi l'automazione fornita da kmod, quindi dovresti optare per un pacchetto kmod ogni volta che è disponibile. Ad esempio, mentre i driver Nvidia sono integrati nel kernel come driver Nouveau, i driver Nvidia ufficiali sono distribuiti solo da Nvidia. È possibile installare manualmente i driver con marchio Nvidia accedendo al sito Web, scaricando il .runfile ed eseguendo lo script di shell fornito, ma è necessario ripetere lo stesso processo dopo aver installato un nuovo kernel, poiché nulla indica al gestore pacchetti che è stato installato manualmente un driver del kernel. Poiché Nvidia guida la tua grafica, l'aggiornamento manuale del driver Nvidia di solito significa che devi eseguire l'aggiornamento da un terminale, perché non hai grafica senza un driver grafico funzionale.

Immagine

Tuttavia, se si installano i driver Nvidia come pacchetto kmod, l'aggiornamento del kernel aggiorna anche il driver Nvidia. Su Fedora e relativi:

Codice: Seleziona tutto

$ sudo dnf install kmod-nvidia

Su Debian e relativi:

Codice: Seleziona tutto

$ sudo apt update
$ sudo apt installa nvidia-kernel-common nvidia-kernel-dkms nvidia-glx nvidia-xconfig nvidia-settings nvidia-vdpau-driver vdpau-va-driver

Questo è solo un esempio, ma se stai installando i driver Nvidia nella vita reale, devi anche inserire nella blacklist il driver Nouveau. Consulta la documentazione della tua distribuzione per i passaggi migliori.

Scarica e installa un driver
Non tutto è incluso nel kernel e non tutto il resto è disponibile come modulo del kernel. In alcuni casi, è necessario scaricare un driver speciale scritto e raggruppato dal fornitore dell'hardware e altre volte, si dispone del driver ma non del frontend per configurare le opzioni del driver.

Due esempi comuni sono le stampanti HP e le tavolette illustrative Wacom . Se ottieni una stampante HP, probabilmente hai driver generici che possono comunicare con la tua stampante. Potresti anche essere in grado di stampare. Tuttavia, il driver generico potrebbe non essere in grado di fornire opzioni specializzate specifiche per il modello in uso, come la stampa fronte-retro, fascicolazione, opzioni del vassoio della carta e così via. HPLIP (il sistema di imaging e stampa HP Linux) offre opzioni per gestire i lavori, regolare le opzioni di stampa, selezionare i vassoi per la carta ove applicabile e così via.

HPLIP è generalmente raggruppato in gestori di pacchetti; basta cercare "hplip".

Immagine

Allo stesso modo, i driver per i tablet Wacom, i principali tablet di illustrazioni per artisti digitali, sono generalmente inclusi nel kernel, ma le opzioni per ottimizzare le impostazioni, come la sensibilità alla pressione e la funzionalità dei pulsanti, sono accessibili solo attraverso il pannello di controllo grafico incluso di default con GNOME ma installabile come pacchetto aggiuntivo kde-config-tablet su KDE.

Ci sono probabilmente alcuni casi limite che non hanno driver nel kernel ma offrono versioni kmod dei moduli driver come file RPM o DEB che è possibile scaricare e installare tramite il proprio gestore pacchetti.

Patch e compilazione del proprio kernel
Anche nell'utopia futuristica del 21 ° secolo, ci sono venditori che non comprendono abbastanza l'open source da fornire driver installabili. A volte, tali società forniscono il codice sorgente per un driver ma si aspettano che tu scarichi il codice, patch un kernel, compila e installi manualmente.

Questo tipo di modello di distribuzione presenta gli stessi svantaggi dell'installazione di driver impacchettati al di fuori del sistema kmod: un aggiornamento del kernel rompe il driver perché deve essere reintegrato manualmente nel kernel ogni volta che il kernel viene sostituito con uno nuovo.

Questo è diventato raro, felicemente, perché il team del kernel Linux ha fatto un ottimo lavoro chiedendo a gran voce alle aziende di comunicare con loro e perché le aziende stanno finalmente accettando che l'open source non scomparirà presto. Ma ci sono ancora novità o dispositivi iper-specializzati là fuori che forniscono solo patch del kernel.

Ufficialmente, ci sono preferenze specifiche per la distribuzione su come compilare un kernel per coinvolgere il gestore dei pacchetti nell'aggiornamento di una parte così vitale del sistema. Ci sono troppi gestori di pacchetti per coprire ciascuno; ad esempio, ecco cosa succede dietro le quinte quando usi strumenti come rpmdev su Fedora o build-essential e devscripts su Debian.

Innanzitutto, come al solito, scopri quale versione del kernel stai eseguendo:

Codice: Seleziona tutto

$ uname -r

Nella maggior parte dei casi, è sicuro aggiornare il kernel se non l'hai già fatto. Dopotutto, è possibile che il tuo problema sia risolto nell'ultima versione. Se l'hai provato e non ha funzionato, dovresti scaricare il codice sorgente del kernel che stai eseguendo. La maggior parte delle distribuzioni fornisce un comando speciale per questo, ma per farlo manualmente, puoi trovare il codice sorgente su kernel.org .

È inoltre necessario scaricare qualunque patch sia necessaria per il proprio kernel. A volte, queste patch sono specifiche della versione del kernel, quindi scegli attentamente.

È tradizionale, o almeno era quando le persone compilavano regolarmente i propri kernel, per posizionare il codice sorgente e le patch in / usr / src / linux .

Annullare l'archiviazione del sorgente del kernel e dei file di patch secondo necessità:

Codice: Seleziona tutto

$ cd / usr / src / linux
$ bzip2 --decompress linux-5.2.4.tar.bz2
$ cd  linux-5.2.4
$ bzip2 -d .. / patch * bz2

Il file patch può avere istruzioni su come eseguire la patch, ma spesso sono progettati per essere eseguiti dal livello superiore dell'albero:

Codice: Seleziona tutto

$ patch -p1 < patch*example.patch

Una volta patchato il codice del kernel, è possibile utilizzare la vecchia configurazione per preparare la configurazione del kernel con patch:

Codice: Seleziona tutto

$ make oldconfig

Il comando make oldconfig ha due scopi: eredita la configurazione del kernel corrente e consente di configurare le nuove opzioni introdotte dalla patch.

Potrebbe essere necessario eseguire make menuconfigcomando, che avvia un elenco basato su menu, basato su ncurses, di possibili opzioni per il tuo nuovo kernel. Il menu può essere travolgente, ma poiché inizia con la tua vecchia configurazione come base, puoi guardare attraverso il menu e disabilitare i moduli per l'hardware che sai di non avere e che non prevedi di averne bisogno. In alternativa, se sai di avere un pezzo di hardware e vedi che non è incluso nella tua configurazione attuale, puoi scegliere di costruirlo, sia come modulo che direttamente nel kernel. In teoria, questo non è necessario perché presumibilmente, il tuo kernel attuale ti stava trattando bene ma per la patch mancante, e probabilmente la patch che hai applicato ha attivato tutte le opzioni necessarie richieste da qualunque dispositivo ti abbia spinto a patchare il tuo kernel in primo luogo .

Quindi, compilare il kernel e i suoi moduli:

Codice: Seleziona tutto

$ make bzImage
$ make modules

Questo ti lascia con un file chiamato vmlinuz , che è una versione compressa del tuo kernel avviabile. Salva la tua vecchia versione e posiziona quella nuova nella tua directory / boot :

Codice: Seleziona tutto

$ sudo mv / boot / vmlinuz / boot / vmlinuz.nopatch
$ sudo cat arch / x86_64 / boot / bzImage > / boot / vmlinuz
$ sudo mv / boot / System.map / boot / System.map.stock
$ sudo cp System. map / boot / System.map

Finora, hai patchato e creato un kernel e i suoi moduli, hai installato il kernel, ma non hai installato alcun modulo. Questo è l'ultimo passaggio di costruzione:

Codice: Seleziona tutto

$ sudo make modules_install

Il nuovo kernel è attivo e i suoi moduli sono installati.

Il passo finale è aggiornare il tuo bootloader in modo che la parte del tuo computer che si carica prima che il kernel sappia dove trovare Linux. Il bootloader GRUB rende questo processo relativamente semplice:

Codice: Seleziona tutto

$ sudo grub2-mkconfig

Compilazione del mondo reale
Naturalmente, nessuno esegue questi comandi manuali ora. Invece, fai riferimento alla tua distribuzione per istruzioni su come modificare un kernel usando il set di strumenti per sviluppatori che usano i manutentori della tua distribuzione. Questo set di strumenti creerà probabilmente un nuovo pacchetto installabile con tutte le patch incorporate, avviserà il gestore pacchetti dell'aggiornamento e aggiornerà il bootloader per te.

Immagine
Rispondi