Capitolo 7. Compilare il kernel

Sommario
7.1. Installare i sorgenti
7.2. Modifiche al layout della tastiera
7.3. Ricompilare il kernel
7.4. Modificare il file di configurazione del kernel
7.5. Configurare il kernel
7.6. Generare le dipendenze e ricompilare
7.7. Se qualcosa è andato male

La maggior parte degli utenti di NetBSD finisce, prima o poi, per compilare un kernel personalizzato. In questo modo si ottengono vari risultati apprezzabili:

7.1. Installare i sorgenti

Il programma di installazione (sysinst) non installa i sorgenti del kernel, che devono quindi essere estratti a mano. L'archivio che li contiene è syssrc.tgz che si trova nella directory source/sets. Il file si scompatta con

# gzip -dc syssrc.tgz | (cd / ; tar xvf -)    

Bisogna avere un po' di pazienza perché i file da estrarre sono molti e l'operazione dura parecchi minuti. I sorgenti vengono estratti nella directory /usr/src/sys; per accedervi si può anche usare il link simbolico /sys. Pertanto i comandi

# cd /usr/src/sys
# cd /sys
    

sono equivalenti.

Terminata l'installazione è possibile rimuovere i sorgenti relativi alle architetture che non ci interessano e risparmiare un po' di spazio su disco (se questo è un problema). Per fare questo bisogna portarsi nella directory /sys/arch ed eliminare le sottodirectory non necessarie. Per esempio, per il port-i386 è sufficiente conservare la directory i386 Per altri port può essere necessario conservare più di una directory sorgente in quanto vi possono essere delle dipendenze.

Tutto è pronto per creare un kernel personalizzato. Compilare un nuovo kernel è tutt'altro che difficile; le operazioni da eseguire (quattro o cinque in tutto) sono descritte sul sito di NetBSD.

7.2. Modifiche al layout della tastiera

Una volta installati i sorgenti del kernel, prima di ricompilare conviene effettuare una piccola modifica al layout della tastiera italiana contenuto nel file /sys/dev/pckbc/wskbdmap_mfii.c. Nella disposizione di default mancano alcuni caratteri utili per i programmatori, in particolare parentesi graffe e tilde. Io utilizzo queste impostazioni

static const keysym_t pckbd_keydesc_it[] = {
...
KC(8),   KS_7,          KS_slash,       KS_braceleft,
KC(9),   KS_8,          KS_parenleft,   KS_bracketleft,
KC(10),  KS_9,          KS_parenright,  KS_bracketright,
KC(11),  KS_0,          KS_equal,       KS_braceright,
KC(12),  KS_apostrophe, KS_question,    KS_grave,
KC(13),  KS_igrave,     KS_asciicircum, KS_asciitilde,
KC(26),  KS_egrave,     KS_eacute,      KS_bracketleft, KS_braceleft,
KC(27),  KS_plus,       KS_asterisk,    KS_bracketright,KS_braceright,
...    

Con il codice precedente si ottengono queste corrispondenze

7.3. Ricompilare il kernel

La ricompilazione del kernel è descritta in modo semplice e preciso sul sito di NetBSD e, quindi, consiglio di fare riferimento a quelle istruzioni. Tuttavia, nel seguito riporto qualche indicazione, giusto per dare un'idea del procedimento.

Per poter ricompilare il kernel è necessario aver installato il set del compilatore (comp.tgz). La ricompilazione del kernel consiste dei seguenti passi

7.4. Modificare il file di configurazione del kernel

Il file di configurazione del kernel definisce il tipo, il numero e le caratteristiche dei dispositivi che devono essere supportati dal kernel. Il file si trova nella directory /sys/arch/i386/conf; per creare un file personalizzato conviene utilizzare come base una delle configurazioni esistenti. Per la maggior parte delle piattaforme la configurazione GENERIC è un buon punto di partenza; fare riferimento agli esempi presenti nella directory /sys/arch/<arch>/conf. Molte opzioni sono descritte da commenti nel file di configurazione; molte altre sono descritte in options(4).

# cd /sys/arch/i386/conf/
# cp GENERIC MYKERNEL
# vi MYKERNEL
    

Quando si modifica un file di configurazione del kernel si compiono, in sostanza, due tipi di operazioni:

  1. si disabilita il supporto per le periferiche non presenti sul sistema e si abilita il supporto per quelle presenti (per esempio, chi non ha dispositivi SCSI può disabilitare il supporto per l'interfaccia SCSI nel kernel).

  2. si abilita/disabilita il supporto delle caratteristiche supportate dal kernel (per esempio, il supporto per la compatibilità Linux, ecc.).

  3. si ottimizzano i parametri del kernel.

Per disabilitare una linea del file di configurazione bisogna aggingere un carattere "#" all'inizio della linea stessa. Un buon punto di partenza per determinare cosa si può eliminare è lo studio dell'output del comando dmesg: per ogni linea del tipo

<XXX> at <YYY>    

è necessario che nel file di configurazione siano presenti sia XXX sia YYY. Prima di arrivare a una configurazione minima è necessaria un po' di sperimentazione; per un sistema desktop, senza periferiche SCSI e schede PCMCIA si può arrivare a produrre un kernel di dimensioni meno che dimezzate rispetto a quello generico.

Conviene anche dare un'occhiata alle opzioni presenti nel file di configurazione, disabilitando quelle che non interessano. Ogni opzione è accompagnata da una breve descrizione; molte opzioni sono descritte più approfonditamente su options(4). Prima di ricompilare conviene sistemare le opzioni per il supporto della tastiera italiana e per il fuso orario:

options RTC_OFFSET=-60
...
options PCKBD_LAYOUT="KB_IT"    

Esiste anche un script Perl che genera automaticamente un file di configurazione ridotto analizzando l'output di dmesg. Questo script si può installare con la collezione dei package (pkgsrc/sysutils/adjustkernel). Per poterlo eseguire, naturalmente, è necessario avere installato Perl sul sistema, il che è tutt'altro che difficile: vedere il Capitolo 8. A titolo di anticipazione, un modo semplicissimo di installare Perl consiste nel procurarsi il package precompilato perl-5.00404.tgz e poi dare il comando:

# pkg_add perl-5.00404.tgz    

A questo punto Perl è installato, configurato e pronto per lavorare: più facile di così...

Lo script si esegue con:

# cd /sys/arch/i386/conf
# perl adjustkernel GENERIC > MYKERNEL
    

Personalmente, ho usato una sola volta questo script e ha dato ottimi risultati. Si faccia attenzione però al fatto che lo script configura le righe relative ai dispositivi, non quelle delle opzioni.

7.5. Configurare il kernel

Dopo aver modificato a piacere il file di configurazione del kernel (che supporremo si chiami MYKERNEL), dare il comando

# config MYKERNEL    

Se MYKERNEL non contiene errori il programma creerà i file necessari per poter compilare il kernel. In caso contrario si deve tornare al punto precedente e sistemare gli errori. Il programma config analizza il file di configurazione indicato come parametro e crea i file necessari per la compilazione, abilitando i dispositivi richiesti.

7.6. Generare le dipendenze e ricompilare

Portarsi nella directory creata da config nel passo precedente, dare il comando make depend e, infine, il comando make.

# cd ../compile/MYKERNEL
# make depend
# make
    

In compilazione si possono verificare degli errori, nel qual caso la compilazione stessa si arresta. Se ciò avviene significa che il file di configurazione non è stato modificato correttamente e bisogna controllarlo e ripetere il procedimento. Un esempio tipico è il seguente: l'opzione B, che richiede l'opzione A, è attiva; l'opzione A, però, è commentata.

Una compilazione completa può durare da pochi minuti a molte ore, a seconda dell'hardware utilizzato. La tabella seguente contiene alcuni esempi:

Al termine della compilazione nella directory corrente sarà stato creato il file netbsd. L'ultimo passo da compiere è la copia del nuovo kernel in / (previo salvataggio del kernel precedente, mi raccomando).

# mv /netbsd /netbsd.old
# mv netbsd /
    

Come già detto, personalizzando il kernel se ne possono ridurre le dimensioni in modo considerevole. Per esempio, al termine delle precedenti operazioni si ha:

-rwxr-xr-x  1 root  wheel  1342567 Nov 13 16:47 /netbsd
-rwxr-xr-x  1 root  wheel  3111739 Sep 27 01:20 /netbsd.old    

A questo punto non rimane che riavviare il sistema con un bel reboot.

7.7. Se qualcosa è andato male

È sempre possibile che al riavvio qualcosa non vada come sperato; al limite il nuovo kernel potrebbe non riuscire nemmeno a avviarsi. In questo caso non bisogna disperare; basta ripristinare il precedente kernel, che avevamo provvidenzialmente salvato, in modalità mono utente in questo modo: