GNU/Linux >> Linux Esercitazione >  >> Debian

Kernel personalizzati in Ubuntu/Debian:come, quando e perché

Quindi, hai deciso di provare questa cosa di cui hai sentito parlare altri, chiamata "compilazione di un kernel personalizzato". Se lo stai provando per hobby o perché vuoi imparare una nuova abilità, molto bene, continua a leggere.

Tuttavia, prima di iniziare, cercheremo di spiegare le situazioni in cui si presenta questa necessità e come affrontarla. Nota che questo è un argomento ampio che ha bisogno di molto di più in termini di spazio di quello che forniremo qui. Imparerai le basi, cosa ti serve, cosa fare e cosa otterrai.

Per maggiori informazioni, come al solito, Google è tuo amico; inoltre, la documentazione residente nell'albero dei sorgenti del kernel risponderà a molte domande. Quindi, cominciamo dall'inizio, con un'ultima nota:se necessario, pubblicheremo altri articoli relativi alla compilazione del kernel relativi ad altre distribuzioni.

Quando dovrai compilare il tuo kernel

La prima situazione sarebbe quando hai bisogno di un kernel più nuovo di quello fornito dalla tua distribuzione, specialmente quando esegui una distribuzione stabile (ad es. Debian stable, CentOS), perché il tuo kernel non supporta alcune funzionalità/driver di cui hai bisogno, o semplicemente perché ritieni vuoi provare l'ultima e la migliore.

Un avvertimento, tuttavia: se vuoi eseguire un kernel all'avanguardia, assicurati che sia compatibile con altri componenti chiave del tuo sistema (come glibc), ricorda che più recente significa meno test e (probabilmente) più instabilità; i manutentori del kernel della tua distribuzione di solito fanno un buon lavoro nel backport di alcune nuove funzionalità su kernel più vecchi e più stabili, quindi assicurati di aver davvero bisogno dell'avanguardia. Il nostro consiglio è di non usare questi kernel (i kernel a lungo termine farebbero un'eccezione qui) sui sistemi di produzione. Come detto, fidati dei manutentori della tua distribuzione.

La seconda situazione è che senti di eseguire un kernel gonfio, con molti componenti non necessari. Mentre il kernel carica solo i moduli corrispondenti a un componente hardware esistente, un footprint di memoria più piccolo del kernel di solito aiuta a velocizzare e tempo di avvio.

# lspci -vv
# lsusb
# hwinfo
# cat /proc/cpuinfo

I comandi sopra ti aiutano a conoscere meglio il tuo hardware. Annota ciò che hai trovato e assicurati di eseguire i comandi ls* sopra come root, per ulteriori informazioni.

Un'altra situazione sarebbe che tu voglia aiutare a testare il kernel eseguendo l'ultima sul tuo sistema. Si applicano le stesse avvertenze di cui sopra:fallo sui sistemi di test, tieniti in contatto con l'upstream nel caso in cui trovi un bug (lkml.org è la mailing list principale del kernel – traffico elevato) e cerca di essere il più utile possibile quando ti vengono richieste informazioni .Questo non può essere sottolineato abbastanza:leggi la documentazione, o perché ti trovi in ​​una brutta situazione, vuoi segnalare un bug o semplicemente hai domande.

Successivamente, potresti voler essere il ragazzo più cool del blocco ed eseguire l'ultimo e il migliore, magari dando un'occhiata alla fonte (a condizione che tu sia coinvolto e tu abbia alcune conoscenze di C e ASM) e persino inviare patch. Potresti voler guardare prima se la tua distribuzione non offre già un pacchetto del kernel più recente, ad esempio puoi installare i kernel da Debian sperimentale su un sistema di test, se modifichi il tuo sources.list di conseguenza. Ancora una volta, lavora con i manutentori se ti imbatti in un bug.

Terminologia

Prima di approfondire ulteriormente questo argomento alquanto arcano, dovremmo chiarire alcuni termini di base (er); questo è essenziale per comprendere le parti chiave del test e della compilazione del kernel.

  • kernel – Il cuore del sistema operativo, responsabile della gestione delle risorse hardware (I/O, networking, CPU, memoria...). Fondamentalmente, è la parte essenziale del sistema operativo responsabile di tutto il lavoro sporco. I programmi utente comunicano con il kernel, richiedendo tempo CPU o altre risorse dalle librerie di sistema che fungono da intermediari tra userland (vedi sotto) e kernel/hardware. I kernel possono essere monolitici e microkernel (per ulteriori informazioni, se sei interessato, consulta Approcci di progettazione a livello di kernel su Wikipedia.org . I microkernel (come Minix) utilizzano uno schema di progettazione che divide il core dal resto del kernel e che il resto è diviso in componenti, ognuno dei quali fa qualcosa di specifico:I/O, networking, ecc. I kernel monolitici (Linux, BSD, Solaris), come suggerisce il nome, comprendono la maggior parte del kernel in un'unità, avendo funzionalità extra (ad es. driver ) forniti dai moduli. Esistono anche kernel ibridi, una combinazione tra i due, un buon esempio è il kernel di Windows.
  • paese utente – si dice che tutto in un sistema operativo che non fa parte del kernel (librerie, applicazioni) faccia parte di userland. Il nome è così ovvio.
  • modulo – come mostrato prima, un modulo del kernel è un pezzo di software binario che fondamentalmente "insegna" al kernel come "parlare" con un pezzo di hardware o fornire alcune funzionalità (es. nfs)
  • compilatore – il compilatore è un'applicazione che fondamentalmente prende il codice scritto, scaricato da te da kernel.org, e lo trasforma in binari. Il compilatore che si trova nelle distribuzioni Linux si chiama 'gcc', e sta per GNU Compiler Collection, che ha anche bisogno di componenti essenziali per costruire software:utilità che si trovano in binutils come l'assembler (as) o l'archiviatore di librerie (ar). Sui sistemi Debian, o Ubuntu, si può trovare a quale pacchetto appartiene un file installando ed eseguendo apt-file. A proposito, vediamo quali pacchetti dobbiamo installare per una corretta compilazione del kernel.
  • Nocciolo di vaniglia – questo è il nome usato per il kernel upstream, come si trova su kernel.org, quindi senza patch specifiche per la distribuzione.

Tieni presente che ogni volta che vedi un comando in questo documento che inizia con il prompt '$' ciò significa che il comando dovrà essere eseguito come un normale utente quotidiano; ogni volta che vedi il '#' prompt, ciò significa che il comando deve essere eseguito come root (usiamo sudo, ma non è obbligatorio). La directory corrente, se non diversamente specificato, è quella che contiene il tuo albero dei sorgenti, in questo caso, linux-2.6.

Cosa devi installare

  • gcc – ovviamente il compilatore è essenziale
  • binutils:questo pacchetto contiene il linker, l'assembler e altre utilità vitali per la compilazione di programmi scritti in C.
  • gcc-doc – il manuale e le pagine di informazioni per gcc. Utile se vuoi sporcarti e modificare alcuni flag di compilazione. Utile comunque se vuoi scrivere o compilare pacchetti C.
  • gdb – Il debugger GNU. Non obbligatorio ma utile se qualcosa va storto. Gdb-doc aiuterà anche.
  • libreadline5-dev – per usare l'interfaccia basata su ncurses di configurazione del kernel. Puoi usare altre interfacce (vedi sotto).
  • make – verrà installato come dipendenza, ma sono necessarie poche parole. Consultate il manuale oi libri, perché non è un argomento da spiegare alla leggera in così poco spazio. Make è un'utilità utilizzata durante la compilazione di programmi C/C++ e ciò che fa è apparire in un Makefile, contenente regole su come e in quale ordine dovrebbe avvenire la compilazione, e tenta di eseguire quelle direttive. Leggi i Makefile nell'albero dei sorgenti per dare un'occhiata.
  • git – Git è un VCS (sistema di controllo della versione), che fa ciò che fa cvs o subversion, ovvero tenerti aggiornato con l'ultimo albero del kernel.

Ottenere il sorgente del kernel

Se vuoi installare il sorgente dalla tua distribuzione, usa

# apt-get install linux-source-<version>

dove è possibile raccogliere dall'emissione:

uname -r

Usalo se vuoi modificare il tuo kernel esistente (aggiunta di driver, taglio, ecc.). Altrimenti, vuoi il nocciolo di vaniglia. Puoi ottenerlo da www.kernel.org (suggeriamo wget o curl qui come download manager) o, se vuoi l'ultimo, utilizzerai git. Ti consigliamo di memorizzare il sorgente nella home directory del tuo utente e il comando per ottenere l'ultimo albero della linea principale è ( vedi man git ):

$ git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6.git linux-2.6

In passato abbiamo trovato utile il mini-howto su http://linux.yyz.us/git-howto.html; controlla anche kernelnewbies.org . Il comando precedente creerà una cartella nella directory corrente denominata linux-2.6, che può essere aggiornata in seguito facendo cd in essa ed emettendo un semplice

make clean; git pull 

Ora, dopo aver ottenuto il codice sorgente, dovremo configurare il kernel .

Configurazione e costruzione

Se hai un file .config esistente (il file che contiene le opzioni per la creazione del kernel – cosa entra e cosa no), copialo in linux-2.6 (da /boot/config- o /proc/config .gz – la configurazione corrente). Se non vuoi modificare il .config esistente, emetti semplicemente

$ make oldconfig

Altrimenti, continua a leggere. Se vuoi modificare la configurazione esistente, emetti

$ make menuconfig

(raccomandazione:puoi usare make config per molte domande sulle opzioni nel kernel, o make xconfig , che richiede librerie qt, per un menu grafico più gradevole), e selezionare "Load an Alternative Configuration File" e premere invio per .config , il nome predefinito del file di configurazione, oppure digita un nome file alternativo già salvato in linux-2.6.

Dopodiché, inizia a scorrere i menu per apportare le modifiche necessarie La regola pratica qui è "se non sai cosa fa, non scherzare", almeno fino a quando non avrai una certa esperienza. Alla fine, dal menu in alto, seleziona “Salva un file di configurazione alternativo”, premi invio per il nome predefinito (.config – consigliato) e poi “Esci” dal basso. Se vuoi iniziare da zero, dimentica il passaggio "Carica un file di configurazione alternativo" e continua. Alla prossima compilazione del kernel, dopo aver pulito e aggiornato l'albero, usa 'make oldconfig' come sopra per usare la vecchia configurazione. OK, ora abbiamo la configurazione su misura per le nostre esigenze che aspetta solo di essere costruita. Costruire un kernel è semplice come configurarlo (!). Basta digitare make e l'output dovrebbe apparire come di seguito:

$ make 

  HOSTCC  scripts/basic/fixdep 
  HOSTCC  scripts/kconfig/conf.o 
  SHIPPED scripts/kconfig/zconf.tab.c 
  SHIPPED scripts/kconfig/zconf.lex.c 
  SHIPPED scripts/kconfig/zconf.hash.c 
  HOSTCC  scripts/kconfig/zconf.tab.o 
  HOSTLD  scripts/kconfig/conf 
  
  CHK     include/linux/version.h 
  UPD     include/linux/version.h 
  CHK     include/generated/utsrelease.h 
  UPD     include/generated/utsrelease.h 
  CC        kernel/bounds.s 
  GEN     include/generated/bounds.h 
  CC        arch/x86/kernel/asm-offsets.s 
...

e, dopo un po', a seconda della tua macchina e della configurazione del kernel, sarà fatto. Se vuoi velocizzare un po' le cose, usa il flag -jn per fare, dove n è il numero di processori/core + 1. Fai attenzione, tuttavia, questo può esporre bug nel kernel o costruire l'infrastruttura, quindi se qualcosa va storto, riprova usando semplicemente make senza flag. Se dopo aver letto il manuale di gcc (e se sei ancora sano di mente), ti senti avventuroso e vuoi modificare alcuni flag specifici dell'hardware, o hai voglia di ottimizzare il codice, usa la pagina di manuale make per scoprire come (principalmente COPTS e CFLAGS ). Tuttavia, ottimizzazioni maggiori di -O2 sono rischiose.

Fai attenzione e aspettati che si rompa, il kernel potrebbe essere compilato senza problemi, ma può comportarsi in modo strano. Ricordarsi di digitare tutti i comandi come utente normale. Non c'è bisogno di compilare come root e gli sviluppatori del kernel disapprovano l'idea.

Installazione

Ora installiamo i moduli:questo deve essere fatto come root, poiché i moduli sono installati in /lib e l'utente normale non ha accesso in scrittura lì. Allora,

# make modules_install 

fa proprio questo, e questo deve essere fatto prima di installare il kernel in modo che i moduli e il kernel installato siano sincronizzati. Usa

# make install 

per installare il kernel su /boot, quindi

# depmod 

e prepararsi per la creazione di un initramfs (filesystem RAM iniziale), che è un filesystem temporaneo caricato nella RAM nelle prime fasi di avvio, e viene utilizzato per fornire driver di base e altre strutture in modo che il filesystem di root venga montato. Maggiori informazioni possono essere trovate nella pagina Initrd di Wikipedia. Il comando necessario per l'attività è update-initramfs (questo viene invocato anche ogni volta che viene installato un nuovo kernel, attivato dal gestore pacchetti) che può creare un initramfs ( -c ) o aggiornarne uno esistente ( -u ) . Il comando completo è

# update-initramfs -c -k  

La versione è quella che vedrai al termine di "make modules_install" (l'ultima riga del suo output sarà "DEPMOD"). Se vuoi avere il numero di versione esatto e più lungo, puoi dire agli sviluppatori quale "git moment" hai utilizzato, seleziona "Impostazioni generali" → "Aggiungi automaticamente le informazioni sulla versione alla stringa della versione" dopo aver emesso menuconfig. L'output sul mio sistema Ubuntu è simile a questo:

update-initramfs: Generating /boot/initrd.img-3.1.0-rc3+
...

Aggiorna il tuo Grub in modo che noti il ​​tuo nuovo kernel con

# update-grub

Sulla mia macchina di test Debian, l'output è simile a questo:

Generating grub.cfg ... 
Found background image: /usr/share/images/desktop-base/desktop-grub.png 
Found linux image: /boot/vmlinuz-3.0.0-1-amd64 
Found initrd image: /boot/initrd.img-3.0.0-1-amd64 
Found linux image: /boot/vmlinuz-3.0.0-rc6-amd64 
Found initrd image: /boot/initrd.img-3.0.0-rc6-amd64 
Found linux image: /boot/vmlinuz-2.6.39-07727-gbd1bfe4 
Found initrd image: /boot/initrd.img-2.6.39-07727-gbd1bfe4 
Found linux image: /boot/vmlinuz-2.6.39-2-amd64 
Found initrd image: /boot/initrd.img-2.6.39-2-amd64 
Found linux image: /boot/vmlinuz-2.6.39-rc7-amd64 
Found initrd image: /boot/initrd.img-2.6.39-rc7-amd64 
Found linux image: /boot/vmlinuz-2.6.38.5 
Found initrd image: /boot/initrd.img-2.6.38.5 
Found linux image: /boot/vmlinuz-2.6.38.4-00001-gfaa8ee7 
Found initrd image: /boot/initrd.img-2.6.38.4-00001-gfaa8ee7 
Found linux image: /boot/vmlinuz-2.6.38.4 
Found initrd image: /boot/initrd.img-2.6.38.4 
Found linux image: /boot/vmlinuz-2.6.38-2-amd64 
Found initrd image: /boot/initrd.img-2.6.38-2-amd64 
Found linux image: /boot/vmlinuz-2.6.32-5-amd64 
Found initrd image: /boot/initrd.img-2.6.32-5-amd64 
Found memtest86+ image: /memtest86+.bin 
Found memtest86+ multiboot image: /memtest86+_multiboot.bin 
done 

Ovviamente, il tuo output non sarà esattamente lo stesso, ma il contorno dovrebbe essere lo stesso; infine, ricorda:se vuoi, modifica /etc/default/grub per modificare alcune opzioni prima di update-grub e, incrociando le dita, riavvia la macchina per testare il nuovo kernel.

Se qualcosa va storto

Le situazioni più comuni in cui il tuo nuovo kernel è inutilizzabile è che non puoi avviarlo in primo luogo, o che si avvia e non ha alcuni driver essenziali (ad esempio driver di rete). Di solito, update-grub fa un buon lavoro nello scrivere il file del menu di grub, ma potresti volerlo controllare comunque. Se passi grub, è probabile che tu sia diventato troppo zelante e abbia eliminato un driver essenziale per il sistema, come le parti relative al disco (ATA, SATA, SCSI...), o forse NFS, se hai una root montata su NFS. Avvia un kernel funzionante e riconfiguralo, utilizzando Google e possibili altre fonti, come IRC .

È probabile che qualcuno sia già incappato nel tuo problema in passato e tu abbia possibilità di trovare una risposta. Se il problema è più serio e sei sicuro di aver letto sulla netiquette e su come inviare messaggi alla mailing list del kernel, chiedi gentilmente. Ci sono molte persone simpatiche e disponibili là fuori, ma tendono a non essere così gentili quando non hai fatto i compiti e/o hai perso tempo. Se hai un /boot separato, tieni presente che di solito non è molto grande e potrebbe riempirsi rapidamente di kernel. Inoltre /lib/modules tende ad accumulare molto spazio in /, quindi assicurati di fare un po' di pulizia di tanto in tanto. Ricorda che il kernel è un software complesso e molte cause possono essere alla radice dei tuoi problemi. Se non hai avuto problemi a seguire questa guida, sei pronto per una configurazione del kernel Linux più avanzata.


Debian
  1. Come installare Python 3.7 su Ubuntu, Debian e LinuxMint

  2. Debian:come fare prima di eseguire il dual-boot di Windows 7 e Debian su Efi?

  3. Perché Ubuntu ha bisogno di due kernel?

  4. Come installare Monit (monitoraggio di processi e servizi) su Ubuntu / Debian

  5. Come compilare e installare wxWidgets su Ubuntu/Debian/Linux Mint

Come installare l'ultimo kernel su Debian 11 e derivati

Come installare Zoom Ubuntu e derivati ​​Debian

Come installare Jitsi Meet su Debian e Ubuntu

Come installare ONLYOFFICE Docs su Debian e Ubuntu

Come creare un utente Sudo su Ubuntu e Debian

Come installare Grafana su Ubuntu 18.04 e Debian 8