Compilazione Kernel

2,242 views

Published on

How-to Italian that explain of compilation kernel linux

Published in: Technology
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
2,242
On SlideShare
0
From Embeds
0
Number of Embeds
14
Actions
Shares
0
Downloads
70
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Compilazione Kernel

  1. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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 )

×