GNU/Linux >> Linux Esercitazione >  >> Linux

Come compilare un kernel Linux nel 21° secolo

Nell'informatica, un kernel è il software di basso livello che gestisce la comunicazione con l'hardware e il coordinamento generale del sistema. A parte qualche firmware iniziale integrato nella scheda madre del tuo computer, quando avvii il tuo computer, il kernel è ciò che fornisce la consapevolezza che ha un disco rigido e uno schermo, una tastiera e una scheda di rete. È anche compito del kernel garantire che venga concesso lo stesso tempo (più o meno) a ciascun componente in modo che la grafica, l'audio, il filesystem e la rete funzionino tutti senza intoppi, anche se funzionano contemporaneamente.

La ricerca del supporto hardware, tuttavia, è in corso, perché più hardware viene rilasciato, più elementi 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 migliori kernel per la compatibilità hardware. Linux gestisce innumerevoli computer e telefoni cellulari, schede embedded system on a chip (SoC) per uso hobbistico e industriale, schede RAID, macchine da cucire e molto altro.

Contenuti correlati

Nel 20° secolo (e anche nei primi anni del 21°), non era irragionevole per un utente Linux aspettarsi che quando acquistava un hardware molto nuovo, avrebbe dovuto scaricare l'ultimo codice sorgente del kernel, compilalo e installalo in modo che possano ottenere supporto per il dispositivo. Ultimamente, però, sarebbe difficile trovare un utente Linux che compila il proprio kernel tranne che per divertimento o profitto tramite hardware personalizzato altamente specializzato. In genere non è richiesto al giorno d'oggi compilare da soli il kernel Linux.

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

Aggiorna il tuo kernel esistente

Sia che tu abbia un laptop nuovo di zecca con una nuova scheda grafica o un chipset WiFi o che tu abbia appena portato a casa una nuova stampante, il tuo sistema operativo (chiamato GNU+Linux o semplicemente Linux, che è anche il nome del kernel ) necessita di un driver per aprire canali di comunicazione a quel nuovo componente (scheda grafica, chip Wi-Fi, stampante o altro). Può essere ingannevole, a volte, quando colleghi un nuovo dispositivo e il tuo computer appare per 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 è solo perché la scheda di rete nella stampante è programmata per identificarsi in una rete in modo che possa ottenere un indirizzo DHCP. 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 veramente che il dispositivo è una stampante; può mostrare solo che c'è un dispositivo sulla rete a un indirizzo specifico e il dispositivo si identifica con la serie di caratteri p-r-i-n-t-e-r . Le convenzioni del linguaggio umano sono prive di significato per un computer; ciò di cui ha bisogno è un driver.

Gli sviluppatori del kernel, i produttori di hardware, i tecnici di supporto e gli hobbisti sanno tutti che il nuovo hardware viene costantemente rilasciato. Molti di loro 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 è solitamente incluso in qualsiasi kernel distribuito per uso generale (come il kernel che ottieni quando scarichi Fedora o Ubuntu. Dove Nvidia è meno comune, ad esempio nei sistemi embedded, il modulo Nouveau è solitamente escluso.Moduli simili esistono per molti altri dispositivi:le stampanti beneficiano di Foomatic e CUPS, le schede wireless hanno moduli b43, ath9k, wl e così via.

Le distribuzioni tendono a includere quanto 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 che sia richiesta l'installazione di driver. Per la maggior parte, questo è ciò che accade, soprattutto ora che molti fornitori di dispositivi stanno finanziando lo sviluppo di driver Linux per l'hardware che vendono e inviando quei 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 eccitante dispositivo che è arrivato nei negozi una settimana fa. In tal caso, il tuo kernel potrebbe non avere un driver per quel dispositivo. La buona notizia è che molto spesso un driver per quel dispositivo può esistere in un'edizione 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:

$ sudo dnf update kernel

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

$ uname -r
4.4.186

Cerca le versioni più recenti:

$ sudo apt update
$ sudo apt search linux-image

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

$ sudo apt install linux-image-5.2.4

Dopo un aggiornamento del kernel, devi riavviare (a meno che tu non stia usando kpatch o kgraft). Quindi, se il driver di dispositivo di cui hai bisogno è nel kernel più recente, il tuo hardware funzionerà come previsto.

Installa un modulo del kernel

A volte una distribuzione non si aspetta che i suoi utenti utilizzino spesso un dispositivo (o almeno non abbastanza perché il driver del dispositivo debba essere nel kernel Linux). Linux adotta un approccio modulare ai driver, quindi le distribuzioni possono spedire pacchetti di driver separati che possono essere caricati dal kernel anche se il driver non è compilato nel kernel stesso. Questo è utile, anche se può 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 viene 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 garantisce che quando un kernel viene aggiornato, vengano aggiornati anche tutti i driver modulari installati insieme 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. Puoi installare manualmente i driver a marchio Nvidia andando sul sito Web e scaricando .run file ed eseguendo lo script della shell che fornisce, ma devi ripetere lo stesso processo dopo aver installato un nuovo kernel, perché nulla dice al tuo gestore di pacchetti che hai 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.

Tuttavia, se installi i driver Nvidia come pacchetto kmod, l'aggiornamento del kernel aggiorna anche il tuo driver Nvidia. Su Fedora e affini:

$ sudo dnf install kmod-nvidia

Su Debian e correlati:

$ sudo apt update
$ sudo apt install 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 lista nera 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 altro è disponibile come modulo del kernel. In alcuni casi, devi scaricare un driver speciale scritto e fornito in bundle dal fornitore dell'hardware e altre volte hai il driver ma non il frontend per configurare le opzioni del driver.

Due esempi comuni sono le stampanti HP e le tavolette per illustrazioni Wacom. Se ottieni una stampante HP, probabilmente hai driver generici in grado di comunicare con la tua stampante. Potresti anche essere in grado di stampare. Ma il driver generico potrebbe non essere in grado di fornire opzioni specializzate specifiche per il tuo modello, come la stampa fronte-retro, la fascicolazione, la scelta 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 della carta ove applicabile e così via.

HPLIP è solitamente fornito in bundle nei gestori di pacchetti; cerca semplicemente "hplip".

Allo stesso modo, i driver per i tablet Wacom, i principali tablet per 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 tramite il pannello di controllo grafico incluso per impostazione predefinita con GNOME ma installabile come pacchetto extra kde-config-tablet su KDE.

È probabile che alcuni casi limite non abbiano driver nel kernel ma offrono versioni kmod dei moduli driver come file RPM o DEB che puoi scaricare e installare tramite il tuo gestore di pacchetti.

Applicare patch e compilare il tuo kernel

Anche nell'utopia futuristica che è il 21° secolo, ci sono fornitori che non capiscono abbastanza l'open source per fornire driver installabili. A volte, tali aziende forniscono il codice sorgente per un driver ma si aspettano che tu scarichi il codice, aggiusti un kernel, compili e installi manualmente.

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

Questo è diventato raro, fortunatamente, perché il team del kernel Linux ha fatto un ottimo lavoro implorando ad alta voce le aziende di comunicare con loro e perché le aziende stanno finalmente accettando che l'open source non scomparirà presto. Ma ci sono ancora dispositivi nuovi o iperspecializzati che forniscono solo patch del kernel.

Ufficialmente, ci sono preferenze specifiche della distribuzione su come compilare un kernel per mantenere il tuo gestore di pacchetti coinvolto nell'aggiornamento di una parte così vitale del tuo sistema. Ci sono troppi gestori di pacchetti per coprirli tutti; ad esempio, ecco cosa succede dietro le quinte quando utilizzi strumenti come rpmdev su Fedora o build-essenziali e devscript su Debian.

Per prima cosa, come al solito, scopri quale versione del kernel stai utilizzando:

$ uname -r

Nella maggior parte dei casi, è sicuro aggiornare il kernel se non l'hai già fatto. Dopotutto, è possibile che il tuo problema venga 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.

Devi anche scaricare qualsiasi patch di cui hai bisogno per il tuo kernel. A volte, queste patch sono specifiche della versione del kernel, quindi scegli con attenzione.

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

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

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

Il file della patch può contenere istruzioni su come eseguire la patch, ma spesso sono progettate per essere eseguite dal livello più alto del tuo albero:

$ patch -p1 < patch*example.patch

Una volta che il codice del kernel è stato corretto, puoi usare la tua vecchia configurazione per preparare la configurazione del kernel modificata:

$ make oldconfig

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

Potrebbe essere necessario eseguire il make menuconfig comando, che avvia un elenco di opzioni possibili per il tuo nuovo kernel basato su ncurses e guidato da menu. 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 aver bisogno. In alternativa, se sai di avere un pezzo di hardware e vedi che non è incluso nella tua configurazione attuale, puoi scegliere di compilarlo, sia come modulo che direttamente nel kernel. In teoria, questo non è necessario perché presumibilmente il tuo attuale kernel ti stava trattando bene, tranne per la patch mancante, e probabilmente la patch che hai applicato ha attivato tutte le opzioni necessarie richieste da qualunque dispositivo ti abbia chiesto di patchare il tuo kernel in primo luogo .

Quindi, compila il kernel e i suoi moduli:

$ make bzImage
$ make modules

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

$ 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 costruito un kernel e i suoi moduli, hai installato il kernel, ma non hai installato alcun modulo. Questo è il passaggio finale di costruzione:

$ sudo make modules_install

Il nuovo kernel è a posto e i suoi moduli sono installati.

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

$ sudo grub2-mkconfig

Compilazione nel mondo reale

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

kernel

I sistemi operativi e i kernel sono cose misteriose, ma non ci vuole molto per capire su quali componenti sono costruiti. La prossima volta che ottieni un pezzo di tecnologia che sembra non funzionare su Linux, fai un respiro profondo, esamina la disponibilità dei driver e segui il percorso di minor resistenza. Linux è più facile che mai, e questo include il kernel.


Linux
  1. Come Linux è arrivato al mainframe

  2. Il ciclo di vita dei test del kernel Linux

  3. Come aggiornare il kernel su desktop Linux

  4. Linux:come determinare quale modulo contamina il kernel?

  5. Come si imposta a livello di codice l'orologio hardware su Linux?

Come aggiornare il kernel Linux su CentOS 7

Come compilare un kernel - Il modo Debian

Come installare l'ultimo kernel Linux su CentOS 7

Come visualizzare le informazioni sull'hardware in Linux

Come compilare il kernel Linux dal sorgente per creare un kernel personalizzato

In che modo Linux carica l'immagine "initrd"?