Un kernel è la parte essenziale di un sistema operativo per computer, il cuore che fornisce funzionalità per tutto l'altro software. Consiste fondamentalmente di servizi di basso livello (gestore di interrupt, schedulatore di processi, eccetera), driver hardware e pseudo-driver e un insieme di chiamate di sistema che rendono disponibili le funzionalità del kernel al sistema operativo e ad altre applicazioni di livello più alto.
Ogni sistema operativo possiede un kernel, ma alcuni sono distribuiti sotto licenze proprietarie e non hanno il sorgente disponibile pubblicamente così li lasceremo fuori dal nostro campo di studio.
Probabilmente il più popolare kernel libero oggi è Linux e molte delle così dette distribuzioni si sono sviluppate intorno ad esso. È molto importante notare che Debian GNU non è una tipica distribuzione Linux perché non è legata esclusivamente al kernel Linux; altri port Debian comprendono GNU/Hurd, GNU/NetBSD e GNU/FreeBSD.
Se si ha la necessità di ricompilare il proprio kernel (sia per il proprio personale piacere, che per reale necessità), si proceda con la lettura; altrimenti si eviti questo capitolo e si salti semplicemente avanti per vedere come installare kernel precompilati.
È ancora oggetto di discussione il fatto che la ricompilazione del kernel fornisca qualche vantaggio reale, specialmente se si sta valutando tra la ricompilazione e l'uso di un pacchetto precompilato che ha le ottimizzazioni per il proprio tipo di processore (per esempio AMD K7), ma la ricompilazione non può fare danni e secondo la mia esperienza, è sempre una buona idea. A prescindere dall'ottenere una immagine del kernel maggiormente ottimizzata e generalmente migliori prestazioni di I/O per il disco, è utile come una sorta di test di carico sforzo per la propria macchina.
Notare: | |
---|---|
Per testare le prestazioni I/O del proprio disco, si provi quanto segue (ovviamente si dovrebbe fare il test prima e dopo l'avvio con il nuovo kernel): # apt-get install hdparm # init s # sync; sync # hdparm -tT /dev/hda # init 2 |
In aggiunta, si ottiene l'albero dei sorgenti del kernel con il .config, tutti i file *.o e modversion configurati, che aiuteranno in seguito a compilare moduli addizionali e componenti del kernel che si inseriscano direttamente nel kernel in esecuzione, senza la necessità di una completa ricompilazione o riavvio.
Per prima cosa ci si assicuri di avere tutti gli ingredienti necessari:
# apt-get install gcc make patch bin86 kernel-package libncurses5-dev libc6-dev
Il pacchetto bin86 è necessario solamente sull'architettura ia32 (Intel e compatibili) e libc6-dev non è strettamente necessario per il momento, ma quasi sicuramente lo sarà più avanti.
Poi ricercare nel database di apt le versioni dei sorgenti del kernel disponibili e installare quella appropriata (abitualmente la più recente a meno che non si abbiano alcune necessità specifiche). I sorgenti del kernel verranno posizionati in un archivio compresso (/usr/src/kernel-source-<versione>.tar.bz2), così dopo l'installazione dobbiamo estrarre l'archivio e creare /usr/src/linux (per convenzione, un collegamento simbolico che punta al sorgente del kernel):
$ apt-cache search kernel-source- # apt-get install kernel-source-2.4.18 # cd /usr/src/ # tar jxf kernel-source-2.4.18.tar.bz2 # ln -sf kernel-source-2.4.18 linux # cd /usr/src/linux/
Notare: | |
---|---|
Spesso capita che siano rilasciate nuove versioni di kernel Linux, ma non sembrano disponibili come pacchetti Debian (al momento). Non c'è nulla di grave; non ci si lamenti e si usi semplicemente la versione più recente che è disponibile tra i pacchetti Debian. Le persone di Debian responsabili per i pacchetti decisamente fanno il proprio lavoro molto bene, così se una particolare versione non è disponibile è perché necessita di maggiore collaudo prima dell'inclusione e dell'utilizzo comune, oppure perché contiene soprattutto caratteristiche e strutture frutto di backport, qualcosa che non si ha la necessità di conoscere nel 90% dei casi. Per verificare le versioni del kernel Linux attualmente disponibili, si può utilizzare lo strumento tradizionale finger (che non è più di uso comune in parte a causa di un ricco insieme di problemi di sicurezza nel demone finger e in parte a causa di una generale ignoranza): # apt-get install finger $ finger @kernel.org |
Se si vogliono inserire moduli addizionali del kernel nella compilazione (i cui sorgenti siano forniti come pacchetto Debian, com'è per "i2c" e "lm-sensors" nel nostro esempio), si installino semplicemente i loro pacchetti, li si scompatti (verranno correttamente estratti in /usr/src/modules/) e si proceda:
# apt-get install i2c-source lm-sensors-source # cd /usr/src/ # tar zxf i2c.tar.gz # tar zxf lm-sensors.tar.gz
Per scoprire velocemente tutti i sorgenti di moduli aggiuntivi che sono disponibili, si dovrebbe digitare qualcosa di simile a questo (fornisce dei risultati piuttosto esatti):
$ apt-cache search -- -source | grep "source "
Moduli non standard che non hanno disponibile il sorgente in un pacchetto Debian esistente, non sono gestiti in questo stadio e ne parlo nella prossima sezione.
A questo punto, è necessario preconfigurare il nuovo kernel. Per farlo, avviare make menuconfig e si selezionino le proprie opzioni tramite una interfaccia molto amichevole basata sulle librerie ncurses (che è il motivo per il quale è stato installato libncurses5-dev).
I nuovi utenti trovano questo passo un po' problematico perché vengono presentate letteralmente centinaia di opzioni e non tutte hanno uno scopo ovvio o una buona documentazione disponibile. È sufficiente sapere che il pacchetto precompilato dal proprio repository (kernel-image-2.4.18 nel nostro caso) contiene il file /boot/config-2.4.18, che è praticamente una copia delle opzioni con le quali è stato compilato il kernel Debian predefinito. Così prendere quel file e copiarlo in /usr/src/linux/.config dovrebbe aiutare a procedere:
# apt-get --download-only kernel-image-2.4.18 # dpkg -x /var/cache/apt/archives/kernel-image-2.4.18*.deb /tmp/kernel-2.4.18/ # cp /tmp/kernel-2.4.18/boot/config-* /usr/src/linux/.config
Opzionalmente, si potrebbe sempre eseguire make menuconfig ed escludere le opzioni e i driver dei quali si sa di non avere bisogno, solo per ridurre il tempo di compilazione totale (tuttavia, servono solitamente meno di 15 minuti su PC con processori con frequenza di circa 1GHz). Di fatto, si vorrà eseguirlo per cambiare il tipo di processore; quella opzione si trova da qualche parte in cima ed è molto utile impostarla in modo da descrivere al meglio il proprio hardware.
Perfetto. Ora abbiamo solo bisogno di specificare un campo VERSIONE-EXTRA per il nostro kernel (una stringa aggiunta al nome del kernel e ai percorsi dei file, useremo doc1.0 in questo esempio) e possiamo avviare la compilazione:
# cd /usr/src/linux # perl -p -i,orig -e 's/^EXTRAVERSION =.*/EXTRAVERSION = doc1\.0/' Makefile # make-kpkg --revision=doc1.0 kernel_image # make-kpkg --revision=doc1.0 modules_image
Se tutto fila liscio (come dovrebbe), si dovrebbero vedere alcuni nuovi file .deb generati nella directory /usr/src/. Il kernel è stato compilato :)
Volendo ricompilare il kernel nuovamente (dopo aver modificato opzioni o altro), ci si assicuri di incrementare il numero di revisione (doc1.0); non si possono creare due pacchetti con la stessa revisione (questo ha a che fare con il file GNU ChangeLog).
Notare: | |
---|---|
Qui abbiamo utilizzato il metodo ufficiale Debian per ricompilare il kernel (make-kpkg). Tuttavia, la guida generica per la compilazione del kernel (che si trova in /usr/src/linux/Documentation/) suggerisce un differente metodo manuale (make dep; make clean; make bzImage...) e difatti, alcune persone insistono ad utilizzare questo approccio "minimale". Posso comprendere le loro motivazioni, il contatto con RedHat o SuSE Linux fa venir voglia di scappare a gambe levate a qualsiasi riferimento a "metodi distribuzione-specifici", ma posso assicurare che questo non è vero nel nostro caso. make-kpkg è un potente strumento che non viola quei principi validi e, allo stesso tempo, fa un sacco di cose che si perderebbero se si operasse manualmente (impostare initrd e System.map ad esempio). Perciò si rimanga fedeli a GNU Debian e alle sue tecniche superiori per divertimento e profitto. |
Dopo l'installazione del kernel e il riavvio, utilizzare uname -a solo per essere certi di stare realmente usando il nuovo kernel e, opzionalmente, si configurino i moduli del kernel utilizzando lo strumento modconf.
Se si è ricompilato il proprio kernel, si dovrebbero vedere uno o più (a seconda di eventuali moduli aggiuntivi con cui è stato compilato) file .deb nella directory /usr/src/. Si possono copiare nel luogo corretto del proprio repository apt locale (e installarli con apt-get, proprio come ogni altra cosa) oppure installarli direttamente con il comando dpkg.
# cd /usr/src/ # dpkg -i kernel-image-2.4.18doc1.0_doc1.0_i386.deb
Nel caso si desideri aggiungere un modulo non standard (o per esempio i driver proprietari nVidia, che io preferisco compilare manualmente benché esista il pacchetto nvidia-kernel-source), si dovrebbe farlo successivamente, dopo avere compilato, installato e avviato il proprio nuovo kernel. Solitamente i moduli non standard compilati a partire dal sorgente richiedono solo di avere il kernel appropriato in esecuzione e i suoi sorgenti corrispondenti in /usr/src/linux/, e verranno compilati in maniera pulita. Si può poi copiare il/i file del modulo risultante da qualche parte sotto /lib/modules/`uname -r` ed eseguire depmod -a. È superfluo dire che non si dovrebbe mai eseguire make clean o make distclean all'interno del proprio albero del kernel (a meno che non si intenda ricompilare tutto nuovamente), perché il primo causerebbe problemi con modversions e il secondo cancellerebbe il proprio file /usr/src/linux/.config così che i nuovi moduli non riuscirebbero a corrispondere al kernel esistente.
In caso non si sia ricompilato il kernel da soli e si desideri solo utilizzare alcuni dei pacchetti del kernel Debian esistenti, si può fare così:
Come al solito, per primo si recuperino le versioni di kernel disponibili (ottimizzate per i processori della serie AMD k7):
$ apt-cache search kernel-image- | grep k7
Si noti quindi come ogni versione del kernel sia divisa in molteplici file .deb:
$ apt-cache search 2.4.18
(Naturalmente avrete bisogno solo di kernel-image-2.4.18-k7 per iniziare). Installiamolo semplicemente:
# apt-get install kernel-image-2.4.18-k7