La maggior parte degli utenti di NetBSD finisce, prima o poi, per compilare un kernel personalizzato. In questo modo si ottengono vari risultati apprezzabili:
si riducono considerevolmente le dimensioni del kernel (per es. da 2.5 MB a 1 MB) e quindi l'occupazione di memoria. Sulla versione 1.5 di NetBSD creando un kernel personalizzato si può passare da 4.7 MB a meno di due MB.
si migliorano le prestazioni.
si ottimizza il sistema.
si risolvono problemi di conflitti/riconoscimenti di periferiche.
si approfondisce la conoscenza del sistema.
si personalizzano alcune opzioni (per esempio il tipo di tastiera, l'offset dell'orologio BIOS, ecc.).
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.
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
Combinazione | Carattere |
---|---|
Alt Gr + 7 | { |
Alt Gr + 8 | [ |
Alt Gr + 9 | ] |
Alt Gr + 0 | } |
Alt Gr + ' | ` |
Alt Gr + ì | ~ |
Alt Gr + é | [ |
Alt Gr + + | ] |
Shift + Alt Gr + è | { |
Shift + Alt Gr + + | } |
Driver di console: dalla versione 1.4 NetBSD utilizza il driver multipiattaforma wscons per la gestione dello schermo e della tastiera. Le versioni precedenti utilizzavano pccons oppure pcvt. Per maggiori dettagli, vedere il Capitolo 13.
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
Compilazione del kernel
Modificare il file di configurazione del kernel
Configurare il kernel
Generare le dipendenze
Ricompilare
Installare il nuovo 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
Nomi: tradizionalmente i nomi utilizzati per i file di configurazione sono in maiuscolo.
Quando si modifica un file di configurazione del kernel si compiono, in sostanza, due tipi di operazioni:
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).
si abilita/disabilita il supporto delle caratteristiche supportate dal kernel (per esempio, il supporto per la compatibilità Linux, ecc.).
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.
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.
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.
È 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:
Riavviare la macchina
Premere la barra spazio quando compare il prompt del boot durante il conto alla rovescia di 5 secondi
boot:
Dare il comando
> boot netbsd.old -s
Dare i seguenti comandi
fsck / mount / mv netbsd.old netbsd exit