10.6. Costruire un kernel personalizzato

Se usate Linux su un sistema dotato di hardware o volete usare caratteristiche non supportate dallo stock kernel, o forse volete ridurre la quantità di memoria occupata dal kernel per utilizzare al meglio la memoria del vostro sistema, allora potreste trovare necessario personalizzare il vostro kernel.

Aggiornare il kernel comporta configurare i moduli desiderati, compilare il kernel e i moduli, e finalmente installare l'immagine del kernel. Tutto ciò è seguito da un reboot del sistema (tenendo le dita incrociate!) per caricare il nuovo kernel. Potete trovare la documentazione nel file "README" che accompagna ogni pacchetto kernel. Ulteriori informazioni posso essere reperite nella subdirectory "Documentation/". Un file particolarmente utile è "Configure.help" che contiene informazioni dettagliate sulle opzioni disponibili per la compilazione del kernel e dei moduli.

Quello che segue è un esempio dimostrativo per la messa a punto di un kernel personalizzato, versione 2.0.36 su piattaforma Intel. Di solito costruire un kernel personalizzato è solo questione di configurazione, compilazione e installazione, ma talvolta (di solito in caso di nuovo hardware) è necessario scaricare driver addizionali nel caso il vostro hardware non sia ancora supportato dalla versione del kernel che state compilando.

Il primo passo è quello di scaricare e installare il codice sorgente del kernel o tramite RPM o con tarball. Si veda la Sezione 10.4 per scoprire come ottenere i file appropriati.

Dopo di che, usate l'utilità "rpm" (oppure "tar") per installare i file "kernel source" e "headers". Per esempio, per installare i file RPM del kernel 2.0.36-3:

rpm -Uvh kernel-source-2.0.36-3.i386.rpm kernel-headers-2.0.36-3.i386.rpm
rpm -Uvh kernel-ibcs-2.0.36-3.i386.rpm

se Linux è su un notebook, probabilmente installerete anche il file "kernel-pcmcia-cs-2.0.36-3.i386.rpm" che contiene caratteristiche per la gestione dell'alimentazione.

Dopo aver installato i file del kernel, dovreste trovare l'albero del sorgente del kernel nella directory "/usr/src/linux/".

Il passo seguente è quello di scaricare ogni driver addizionale (se applicabile) e installarli nel nuovo albero del sorgente del kernel. Per esempio, per avere il supporto del controller Mylex DAC960 per hardware RAID, dovrò scaricare il driver dal sito http://www.dandelion.com/. Sfortunatamente, tale driver viene spesso fornito come tarball e quindi dovrete usare l'utilità "tar". Per esempio.

cd /usr/src/
tar zxvpf DAC960-2.0.0-Beta4.tar.gz

Dovete leggere la documentazioni fornita con il driver. Per esempio, il driver DAC960 comprende un file "README" che fornisce istruzioni su dove mettere i nuovi file scaricati e come applicare la patch al kernel:

mv README.DAC960 DAC960.[ch] /usr/src/linux/drivers/block
patch -p0 < DAC960.patch

Poi, assicuratevi che i link simbolici del vostro sistema siano coerenti con il nuovo albero del kernel. In realtà, ciò deve essere fatto una sola volta, quindi quanto segue deve essere fatto solo se non avete mai compilato prima un kernel personalizzato.

mail:/usr/src# cd /usr/include
mail:/usr/include# rm -rf asm linux scsi
mail:/usr/include# ln -s /usr/src/linux/include/asm-i386 asm
mail:/usr/include# ln -s /usr/src/linux/include/linux linux
mail:/usr/include# ln -s /usr/src/linux/include/scsi scsi

Nota

Quanto visto sopra non è più necessario per le versioni di kernel 2.2.x o superiori.

Il passo successivo è configurare le impostazioni del kernel. Questa è la parte più importante. Se disabilitate le impostazioni sbagliate, potreste non avere più il supporto per alcune caratteristiche o per l'hardware di cui avete bisogno. Comunque, se attivate le impostazioni sbagliati, aumenterete le dimensioni del kernel e sprecherete la preziosa memoria del vostro sistema (probabilmente è meglio sbagliare su quest'ultimo punto che non sul primo).

Il miglior modo per compilare correttamente il kernel è sapere di quali caratteristiche avrete bisogno, e quale hardware avete nel vostro sistema. Dopo che avrete sperimentato un po' di volte la personalizzazione del kernel, questo processo diventerà "banale" e non vi intimorirà più!

Digitate quanto segue per iniziare il processo di configurazione:

mail:/usr/include# cd /usr/src/linux
mail:/usr/src/linux# make mrproper
mail:/usr/src/linux# make menuconfig

Potete digitare "make xconfig" invece di "make menuconfig" se avete in esecuzione il sistema X Window; si veda il Capitolo 5 per informazioni su come far funzionare X.

Per configurare il vostro kernel, passate attraverso le varie configurazioni e selezionate (attivate) quelli di cui avete bisogno, e deselezionate (disattivate) quelli inutili. Potete scegliere tra l'avere un determinato supporto integrato nel kernel, o averlo come modulo che viene caricato e scaricato dal Kernel a seconda dei bisogni. (Se compilate qualche caratteristica di cui avete bisogno al momento del boot del sistema (come un driver SCSI), come modulo, avrete bisogno di creare una immagine ram disk o il vostro sistema non si avvierà. Questo viene fatto con il comando "mkinitrd"; questa procedura viene descritta più avanti nel documento.

Quando passate tra le varie configurazioni, potete selezionare <Help> per sapere a cosa serve una determinata opzione.

Dopo aver configurato il vostro kernel, digitate quanto segue per compilarlo:

mail:/usr/src/linux# make dep ; make clean
mail:/usr/src/linux# make bzImage
mail:/usr/src/linux# make modules

Se state ricompilando lo stesso kernel che avevate prima (2.0.36-3 nell'esempio), probabilmente vorrete spostare i moduli esistenti in una directory di backup; ecco il comando:

mail:/usr/src/linux# mv /lib/modules/2.0.36-3 /lib/modules/2.0.36-3-backup

Adesso, digitate questo comando per installare i nuovi moduli:

mail:/usr/src/linux# make modules_install

Adesso bisogna copiare il kernel nella directory "/boot/" e usare LILO per aggiornare il boot record in modo che il nuovo kernel venga riconosciuto. I comandi che seguono effettueranno una copia di backup del kernel esistente, copieranno il kernel nuovo e poi aggiorneranno il boot record di LILO:

mail:/usr/src/linux# cd /boot
mail:/boot# cp vmlinuz vmlinuz.OLD
mail:/boot# cp /usr/src/linux/arch/i386/boot/bzImage vmlinuz-2.0.36
mail:/boot# /sbin/lilo

Infine, dovrete editare il file "/etc/lilo.conf" e assicurarvi che "image" punti al nuovo kernel. Dovrete aggiungere anche una sezioni che punti al backup del kernel, chiamato, ad esempio, "OldLinux". Ecco un esempio:

boot=/dev/hda
map=/boot/map
install=/boot/boot.b
prompt
timeout=50
image=/boot/vmlinuz
	label=Linux
	root=/dev/hdb1
	read-only
image=/boot/vmlinuz.OLD
	label=OldLinux
        read-only

Aggiungendo le informazioni sul kernel di backup, in caso il nuovo kernel non dovesse avviarsi regolarmente (può darsi che un dispositivo non sia stato riconosciuto, oppure un demone non si avvia come dovrebbe), potete semplicemente digitare "OldLinux" per avviare il vecchio kernel e scoprire il problema.

Nota

Come detto prima se avete compilato una caratteristica in modo che venga avviata come modulo, dovrete creare una immagine ram disk iniziale per fare il boot del vostro sistema. Non dimenticate di compilare il kernel con il supporto per questa immagine iniziale.

La procedura per creare e usare un immagine ram disk iniziale è la seguente:

A questo punto, spegnete il sistema e fate il boot del nuovo kernel!

mail:/boot# /sbin/shutdown -r now

Se il kernel si rifiuta di partire completamente, non fatevi prendere dal panico! Utilizzate il boot disk che avete creato durante il processo di installazione di Linux. Se non avete copie di questo disco, dovreste riuscire a crearne uno dal CD di Red Hat. Inserite il dischetto nel drive e fate un reboot. Quando si veda il prompt, digitate:

mount root=/dev/hda1

Il comando sopra presuppone che la vostra partizione "/" (root) si trovi su /dev/hda1.

Linux dovrebbe avviarsi normalmente (sebbene finche usate il kernel del boot disk, non tutti i servizi o i dispositivi possono funzionare correttamente), e potrete recuperare il vostro vecchio kernel e reinstallare le informazioni del boot loader LILO (cioè "mv /vmlinuz.old /vmlinuz ; /sbin/lilo"), quindi spegnere e riavviare. Potete in un secondo tempo provare a ricompilare il kernel con differenti opzioni e riprovare a farlo funzionare.