Con Aruba, a lezione di cloud #lezione 10 - parte 1: 'Configurazione server d...
Compilazione Kernel
1. compilazione kernel linux
Compilazione kernel Linux
Introduzione
Il seguente how-to andrà a spiegare come compilare un kernel linux. Si avranno così cenni su:
• Architettura kernel linux;
• Configurazione e compilazione;
• Installazione;
• Boot del sistema;
• Conclusioni
La distribuzione linux che prenderemo in considerazione sarà Ubuntu 8.10 e in kernel in uso all'atto del download,
2.6.27-7. Proveremo il tutto su una virtual machine, virtualizzata con vmware.
Dopo aver dato le seguenti direttive iniziamo con la spiegazione.
Architettura Kernel Linux
Iniziamo col dire che il kernel è il cuore del sistema operativo, esso costituisce il codice che viene eseguito dalla
CPU in modalità supervisore, ad esempio quando si tratta di chiamate di sistema, gestori di interrupt. Il kernel di
Linux è Unix-like, implementa cioè le stesse interfacce, ha molte funzionalità comuni, ma altre sono implementate
per le specifiche Linux.
Il sistema operativo linux è un sistema monolitico, tutto il codice è contenuto in un unico eseguibile venendo poi
eseguito entro un unico spazio di indirizzamento.
Il kernel di Linux è modulare, ciò implica che l'architettura Monolitica, abbia una lista a puntatori di Moduli
(girano nello stesso spazio di indirizzamento del kernel). Questo moduli sono dei file separati, ulteriore codice, che
il kernel permette di caricare a tempo di esecuzione. Viene perciò caricato solo il codice strettamente necessario al
sistema, ma si anche la possibilità di caricare codice di terze parti (questo implica anche una falla nella sicurezza
dei sistemi linux, in quanto se riesco ad inserire un modulo ho accesso completo al sistema;).
Struttura concettuale:
Giuseppe_N3mes1s (1)
2. compilazione kernel linux
Configurazione e Compilazione
La compilazione del kernel ha vari vantaggi, elenchiamone qualcuno:
• Minore occupazione di memoria e di spazio su disco da parte del kernel e dei relativi moduli;
• Abilitazione/Disabilitazione di driver e/o funzionalità specifiche;
• Ottimizzazione.
Prima di iniziare la compilazione abbiamo bisogno di pacchetti contenti i sorgenti del kernel, i tool e le librerie
necessarie.
In questo caso (relativo ad Ubuntu 8.10) useremo Synaptic.
Iniziamo con scaricare i sorgenti del kernel (che varieranno a secondo della distribuzione usata, da noi la 8.10,
avrà i sorgenti 2.6.27, ma nessuno vi vieta di scaricare anche kernel di ultimo sviluppo dal relativo sito che darò
in seguito).
Nel nostro specifico caso useremo apt.
#apt-get install linux-source
oppure semplicemente trovate i relativi pacchetti consoni alla vostro versione.
Al prossimo punto andiamo a scaricare il pacchetto build-essential, che nel suo interno avrà il compilatore GCC ,
make ecc. necessari per la compilazione.
#apt-get install build-essential
Ora non facciamo altro che scaricare le librerie a noi necessarie per la configurazione grafica del kernel. Nel
nostro caso useremo le libqt, ma potete benissimo anche scaricare altre librerie: ncurses, gtk ecc.
Andiamo a scaricare la libreria che ci servirà per configurare graficamente il nostro kernel.
#apt-get install libqt3-mt-dev
Come già detto possiamo anche scegliere di configurare il nostro kernel con altri tool grafici:
libncurses5-dev
gtk2.0-*
Abbiamo anche la possibilità di configurare il kernel senza nessun tool grafico, ma questo sarà spiegato al
prossimo passo.
Bene, ora che siamo in possesso di tutto il necessario passiamo alla configurazione del nostro kernel.
Rechiamoci nella cartella dove sono stati scaricati i source:
Giuseppe_N3mes1s (2)
3. compilazione kernel linux
#cd /usr/src
Dando il comando:
#ls -l
possiamo notare il file appena scaricato:
linux-source-2.6.27.tar.bz2
Ora passiamo a spacchettare il file ed entrare nella cartella ottenuta e visualizzarne il contenuto, procediamo per
ordine:
#tar jxf linux-source-2.6.27.tar.bz2
#cd linux-source-2.6.27
#ls
Il contenuto della cartella sarà questo:
Bene, ora passiamo alla vera è propria configurazione del nostro kernel.
Come già detto in precedenza varie volte, noi useremo il tool grafico datoci dalle librerie qt scaricate in
precedenza.
Per configurare con le altre librerie oppure senza:
#make gconfig //librerie gtk
Giuseppe_N3mes1s (3)
4. compilazione kernel linux
#make menuconfig //librerie ncurses
#make menu //nessuna libreria necessaria
Questo ultimo comando si presenterà con una serie di comandi relativi alla configurazione del nostro kernel, per
scegliere i vari set e i vari moduli, diciamo in modo procedurale, se sbagliate qualcosa dovete ricominciare tutto
d'accapo, è il metodo sconsigliato, sopratutto per chi non ha esperienza con la configurazione.
Ora passiamo alla configurazione da noi scelta, diamo il seguente comando per avere l'interfaccia grafica utile per
la configurazione con le qt:
#make xconfig
non fate caso ai vari warning che vi si presenteranno, il risultato finale del comando sarà questa interfaccia:
Ora non facciamo altro che configurare a nostro piacimento il kernel.
Ciascuna opzione può essere compilata all'interno del kernel, all'interno di un modulo separato, oppure escluso.
Ogni opzione può avere delle sotto-opzioni, le sotto-opzioni di un modulo sono incluse nel modulo stesso di cui
fanno parte e perciò non vengo incluse nel kernel. Alcune opzioni richiedono dei valori numerici, mentre altri
Giuseppe_N3mes1s (4)
5. compilazione kernel linux
richiedono delle stringhe. Prendiamo in esempio LOCALVERSION , che sarà il nome che sarà attribuito alla
versione del kernel da noi compilato(nel nostro caso inseriamo : “-nemesis”, così da ottenere la nostra versione
come 2.6.27.18-nemesis).
Per compilare direttamente opzioni nel kernel la spunta sarà diversa da quella che indicherà i moduli:
indica che sono opzioni aggiunte al kernel;
indica che sarà compilato come modulo.
Scelta Configurazione
Molte delle opzioni che ci si presentano riguardano la configurazione hardware della macchina su cui il kernel
sarà eseguito una volta compilato. Occorre perciò raccogliere informazioni riguardanti il nostro hardware per
selezionare poi quello che serve, o almeno il minimo indispensabile. Altre opzioni non richiedono la conoscenza
dell'hardware, ad esempio firewall, gestione energetica, ipv.
Linux ci mette a disposizione alcune utility per conoscere le info della macchina su cui stiamo operando:
• lscpi
• cat /proc/cpuinfo
• hal-device-manager (tool grafico)
• lsmod (elenca i moduli attualmente in uso)
Questi sono tutti comandi da dare da shell per ottenere, come già detto, info sul nostro hardware.
La figura mostra un esempio di un'architettura con bus di I/O PCI e ISA.
Giuseppe_N3mes1s (5)
6. compilazione kernel linux
Una volta configurato il nostro kernel non facciamo altro che cliccare sul floppy in alto a sinistra.
Il quale comando andrà a salvare il nostro kernel configurato nel file .config, nella cartella in cui ci troviamo, cioè
/usr/src/linux.-sources-2.6.27.
Ora non ci resta altro che compilare il tutto.
Compilazione
Alcuni how-to fanno riferimento a diversi tipi di compilazione, diciamo separata, con vari comandi.
# make bzImage //per compilare l'immagine del kernel
# make modules //per compilare eventuali moduli
Ma con gli ultimi kernel è possibile compilare il tutto con un unico comando, come andremo a fare noi:
#make
Ora non bisogna fare altro che aspettare che la compilazione termini, e se abbiamo configurato bene il tutto non
otterremo nessun errore (non fate caso ai vari warning che vi si presenteranno).
NB
Se abbiamo già compilato il kernel una volta, oppure a causa di un errore, ci tocca ricompilarlo, dobbiamo dare il
comando:
#make clean
Non fa altro che rimuovere i file oggetto di una compilazione precedente.
/NB
Installazione
Dopo aver terminato la compilazione, e sperando che il tutto sia andata a buon fine, non ci rimane altro che
copiare tutto il necessario ottenuto.
Per prima cosa diamo il comando:
Giuseppe_N3mes1s (6)
7. compilazione kernel linux
#make modules_install
il quale non fa altro che copiare i moduli in /lib/modules/MIAVERSIONE in questo caso, il risulatato del
comando:
#ls /lib/modules/2.6.27.18-nemesis
sara l'output di tutti i moduli appena installati:
Passiamo ora a copiare l'immagine del kernel (fate attenzione a non sovrescrivere altre immagini del kernel,
rinominandola a vostro piacimento).
#cp arch/i386/boot/bzImage /boot/vmlinuz-MIAVERSIONE
Poi andiamo, per comodità, a salvare anche il file di configurazione del kernel:
#cp .config /boot/config-MIAVERSIONE
Il risultato ottenuto lo possiamo vedere andando a controllare il contenuto della cartella /boot/:
#ls -l /boot/
ritroviamo così i file appena creati: vmlinuz-2.6.27.18-nemesis, config-2.6.27.18-nemesis.
Per il prossimo passaggio abbiamo bisogno di una spiegazione di come funziona il boot del sistema.
A grandi linee il sistema si divide in 8 passaggi fondamentali; andiamo ad esporli per poi così capire la creazione
Giuseppe_N3mes1s (7)
8. compilazione kernel linux
del prossimo file a cosa serve:
1. Accensione;
2. Il BIOS inizializza l'hardware;
3. Il BIOS carica in RAM il bootloader dai primi settori del disco;
4. Il bootloader entra in esecuzione;
5. Il bootloader carica in RAM dal disco l'immagine del kernel;
6. Il bootloader carica in RAM dal disco un archivio (initrd.img) con alcuni moduli (opzionale);
7. Il kernel inizializza i vari sottosistemi e i driver;
8. Il kernel “monta” il filesystem ed avvia il primo processo (INIT).
La parte che ci interessa è la 6.
L'initrd, che sta per Initial RAM Disk, è un file caricato in memoria dal bootloader, ed acceduto poi a sua volta
dal kernel come se fosse un disco. Questo perchè alcuni driver sono necessari al kernel per effettuare il boot e
caricare i moduli, il problema sorge se questi driver sono compilati a sua volta come moduli? Il filesystem non
può essere montato se il modulo del driver risiede proprio sul filesystem.
Passiamo ora alla creazione dell' Initial RAM Disk.
Alcune distrubuzioni e altri how-to fanno riferimento a diversi comandi per creare l'initrd, noi useremo questo
comando per crearlo:
#mkinitramfs -o /boot/initrd.img-MIAVERSIONE MIAVERSIONE2
dove MIAVERSIONE sarà il nome del file creato, così come nei precedenti casi, mentre MIAVERSIONE2 sta
per la path che è stata creata con i moduli. Nel nostro caso ad esempio:
#mkinitramfs -o /boot/initrd.img-2.6.27.18-nemesis 2.6.27.18-nemesis
Così avremo creato il file nella cartella /boot: initrd.img-2.6.27.18-nemesis.
NB: il comando va eseguito dopo aver installato i moduli, proprio perchè serve la path di essi per ottenere il file.
Bootloader
Passiamo alla parte finale del nostro how-to.
Il bootloader è un piccolo programma che viene eseguito all'avvio del computer, esso viene prelevato dal BIOS
dai primi settori del disco. Il bootloader permette di selezionare quale sistema operativo avviare, nel nostro caso
dobbiamo modificare il bootloader per utilizzare il kernel appena ri/compilato.
Abbiamo vari tipi di bootloader, ma noi prenderemo in considerazione quello a nostra disposizione, cioè GRUB.
Per andare a modificare il nostro bootloader, in modo che carichi il kernel appena ricompilato, andiamo ad
editare, con un qualsiasi editor, il file /boot/grub/menu.lst.
Consiglio a tutti di creare un file di backup se è la prima volta che editate il file.
La configurazione contiene alcune voci generali nella parte iniziale del file, per ciascun sistema operativo da
avviare va inserita una nuova voce in coda.
Giuseppe_N3mes1s (8)
9. compilazione kernel linux
Nel mio specifico caso andrò ad inserire:
Salvate il tutto.
NB: ripeto, nel mio caso specifico ho modificato il file menu.lst in una certa maniera, prendete come esempio il
file del kernel originale di boot e modificate solo le voci riguardanti il title, kernel e initrd.
Conclusioni
Ecco che siamo giunti alla vera e propria fine, non ci tocca che riavviare, nel nostro caso la nostra macchina
virtuale, attendere il GRUB:
Selezioniamo il nostro kernel, nel mio caso: Ubuntu 8.10, kernel 2.6.27.18-nemesis, attendiamo il boot del
sistema, e se tutto e andato per il verso giusto diamo il comando:
$ uname -a
Giuseppe_N3mes1s (9)
10. compilazione kernel linux
Ottenendo così come output le info sul kernel in uso:
Nel mio caso il kernel in uso:
2.6.27.18-nemesis
Con questa ultima cosa termino il mio how-to, spero di essere stato chiaro e conciso sulle cose sovra-esposte, per
ogni dubbio non esitate a contattarmi.
Vi lascio con dei link che potranno tornare utili per guida:
• Ottenere Ubuntu
• The Linux Kernel Archives
• Vmware Workstation
• Kernel Linux
Ringraziamenti:
#HUF
ExploisIT
Contact Me:
mail: n3mes1s.OxOO@gmail.com
IRC: /server irc.hackers-uf.org @ #huf
Cordiali Saluti Giuseppe_N3mes1s
Giuseppe_N3mes1s ( 10 )