Come compilare il kernel

Da Wiki di NetBSD Italia.

In questa breve guida si illustrerà come compilare il kernel NetBSD. Il sistema che si è usato per questo howto è un sistema NetBSD/i386 4.0_RC3 ma molto probabilmente i vari procedimenti/approcci affrontati sono portabili in tutti gli altri port facendo attenzione soltanto alle opzioni legate esclusivamente ad un port (per esempio vesafb(4) si può usare solo sul port i386).

Questa guida presuppone delle conoscenze base riguardanti pkgsrc e del sistema NetBSD. Il processo di compilazione del kernel è semplicissimo, veloce, elegante e soprattutto accessibile a tutti (in perfetta filosofia NetBSD).


Indice

Introduzione

Ci sono due metodi per ricompilare il kernel, questa guida li affronterà entrambi ma è caldamente consigliato l'uso del secondo metodo. Il primo metodo consiste nel prendere il file di configurazione del kernel e poi commentare/decomentare tutto con l'ausilio di un editor, chiameremo questo metodo: metodo oldschool. Il secondo metodo invece consiste di usare l'apposito tool adjustkernel.

Perché compilare il kernel

In alcuni casi non siamo soddisfatti del kernel in uso precompilato. Ad esempio nel kernel GENERIC non c'è il supporto per PF, non c'è il supporto per i sensori dell'hardware (hardware monitors). In effetti il kernel GENERIC non è un kernel pieno di caratteristiche. Tutto ciò è giustificato da ragioni di dimensione, un kernel con tutti i supporti è senza dubbio più pesante e in alcuni casi ci potrebbero essere delle caratteristiche non solo che non vogliamo ma che risultano instabili per certi elaboratori mentre per altri no.

È quindi semplice comprendere che in alcuni casi siamo costretti a compilare il kernel per i seguenti motivi:

  • abilitare un'opzione
  • disabilitare un'opzione

È infatti inutile, per esempio, avere un kernel con supporto della tecnologia AMD Cool`n'Quiet (POWERNOW_K8) quando in realtà abbiamo un processore pentium che supporta la tecnologia Enhanced SpeedStep (ENHANCED_SPEEDSTEP).

Ottenere i sorgenti

Per ottenere i sorgenti basta cercare l'apposito tarball sul nostro server FTP preferito, per esempio:

$ cd $HOME
$ mkdir builds
$ cd builds/
$ ftp ftp://ftp.netbsd.org/pub/NetBSD/NetBSD-4.0_RC3/source/sets/syssrc.tgz

Una volta che il tarball è scaricato (sono circa 33Mb) lo si deve esplodere nel seguente modo:

$ tar xzf syssrc.tgz

Ora abbiamo tutti sorgenti del kernel, siamo quindi pronti alla ricompilazione del kernel.

Compilazione del kernel

Come conforme a Organizzazione dei contenuti faccio notare che tutti i comandi vanno fatti da utente normale e non da superutente. Questo infatti è l'approccio più corretto, si utilizzerà l'utente root soltanto per copiare il kernel prodotto.

Old school

Illustriamo prima come si ricompila il kernel alla vecchia maniera. Una volta estratto il tarball dobbiamo posizionarci sulla directory in cui ci sono i file di configurazione del kernel:

$ cd usr/src/sys/arch/`uname -m`/conf
$ ls
ALL                  GENERIC_DIAGNOSTIC   INSTALL_TINY         XEN2_DOM0
BIANCONIGLIO         GENERIC_ISDN         INSTALL_XEN2_DOMU    XEN2_DOMU
[...]

Possiamo osservare tutte le varie configurazioni, iniziamo quindi ad editare la nostra configurazione. Un buon metodo per iniziare è usare la configurazione GENERIC o quella che preferite.

$ cp GENERIC MIOKERNEL

Altra ottima idea è quella di ottenere la configurazione dal kernel che stiamo attualmente utilizzando il tool config(1):

$ config -x /netbsd > MIOKERNEL

Infine modificare con l'editor di testo preferito il file risultante, MIOKERNEL. Il nome del kernel (in questo caso MIOKERNEL) è libero, si consiglia comunque un nome significativo, un ottima idea è quella di usare come nome l'hostname (per esempio BIANCONIGLIO nel precedente caso) in modo tale che in situazioni di necessità troviamo facilmente il nostro file di configurazione.

Ora possiamo iniziare ad editare il file di configurazione, c'è una sola regola il # significa questa riga è commentata e quindi non la terrò in considerazione, non ci soffermeremo su cosa abilitare e cosa disabilitare perché tutto ciò è compito dell'utente (in realtà il compito sarebbe di adjustkernel, ma procediamo un passo alla volta).

Quindi per esempio commentiamo quello che non ci serve:

[...]
# CPU support.  At least one is REQUIRED.
#options        I386_CPU
#options         I486_CPU
#options         I586_CPU
options         I686_CPU  # ho un pentium3, quindi 686
[...]
#options         COMPAT_FREEBSD # non voglio la compatibilità binaria FreeBSD
options        COMPAT_DARWIN  # ...però voglio quella con Darwin
[...]
#file-system     NTFS  # non ho partizione NTFS e non mi interessano
[...]
options        ALTQ  # (per PF)
[...]
options        WS_DEFAULT_FG=WSCOL_GREEN  # console verde?
options        WS_DEFAULT_BG=WSCOL_BLACK  # ...con sfondo nero
[...]
# VIA VT82C686A hardware monitor
viapm* at pci? dev ? function ?  # la mia scheda madre ha questi sensori
viaenv* at viapm?
[...]
pseudo-device  pf                      # PF packet filter (voglio PF)
pseudo-device  pflog                   # PF log if
[...]

Una volta finito ad editare il file di configurazione per il nostro kernel siamo pronti a generare tutti i file che ci servono:

$ config MIOKERNEL
Build directory is ../compile/MIOKERNEL
Don't forget to run "make depend"

Perfetto, sembra che tutto sia andato per il meglio, è giunto il momento di compilare:

$ cd ../compile/MIOKERNEL
$ make depend && make

Se abbiamo fatto tutto per bene dopo un paio di minuti (variano dalla macchina che si ha) abbiamo il nostro kernel. Solo qui ci servirà loggarci da superutente per compiare il kernel (che è un semplice file):

$ file netbsd
netbsd: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), statically
linked, not stripped
$ su
# cp /netbsd /onetbsd
# gzip -c netbsd > /netbsd 

Abbiamo fatto il backup del vecchio kernel in modo tale che se qualche cosa va storto possiamo avviare quel kernel vecchio, cioè onetbsd con la direttiva al boot, per esempio:

boot hd0a:onetbsd

Siamo quindi pronti per provare il nuovo kernel:

# reboot

New school

Il metodo sopra illustrato può essere ritenuto piuttosto noioso e ripetitivo, non trovate? Sì, credo che sia abbastanza ripetitivo, quindi è stato scritto un apposito tool per non far annoiare gli amministratori di sistema, questo tool è adjustkernel.

Hubert Feyrer e Martin Laubach hanno deciso di scrivere questo script Perl per semplificare e velocizzare la compilazione del kernel. adjustkernel infatti non fa altro che prendere un file di configurazione da noi deciso e commentare tutto ciò che non ci serve.

Installare adjustkernel è semplicissimo, su pkgsrc si trova in sysutils/adjustkernel:

$ cd ${PKGSRCDIR}/sysutils/adjustkernel/
$ make install clean-depends clean

Una volta installato siamo pronti per utilizzarlo:

$ cd $HOME/builds/usr/src/sys/arch/`uname -m`/conf/
$ adjustkernel GENERIC -o MIOKERNEL

Qualche piccolo ritocco però è da fare, ma questi ritocchi sono di solito molto semplici e molto facili anche da identificare. Infatti se adjustkernel trova qualche cosa che non corrisponde aggiunge alla fine del file di configurazione una serie di NOTE che facilitano la correzione, per esempio:

# NOTE: NoMatch: spkr0 at pcppi0
# NOTE: NoMatch: atabus0 at viaide0 channel 0
# NOTE: NoMatch: atabus1 at viaide0 channel 1

Dovremo quindi provvedere a correggere questi piccoli errori a mano aprendo nuovamente il file con un editor di testo:

[...]
spkr0  at pcppi?               # PC speaker
[...]
atabus* at ata?
[...]

Una volta corretti l'approccio finale da seguire è identico a quello affrontato con il vecchio metodo:

$ config MIOKERNEL
$ cd ../compile/MIOKERNEL
$ make depend && make
$ su
# cp /netbsd /onetbsd
# gzip -c netbsd > /netbsd

Conclusioni

Da come si è potuto osservare ricompilare il kernel è un gioco da ragazzi. NetBSD vanta infatti di tool quali adjustkernel e config che rendono la compilazione del kernel una bazzecola se paragonata all'approccio seguito da altri kernel, quali per esempio Linux.

Strumenti personali