View Single Post
Old 27-01-2003, 10:22   #16
ilsensine
Senior Member
 
L'Avatar di ilsensine
 
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
COMPILARE IL KERNEL

Autore: AnonimoVeneziano

Perchè dovremmo volere COMPILARE UN KERNEL?

Bhe, solitamente i kernel delle Distribuzioni + famose inglobano gran parte dei supporti disponibili per il più gran numero di periferiche possibile.In poche parole distro come RedHat creano kernel di dimensione anke 3Mb che sono pesantissimi , occupano tanta memoria ma hanno il supporto un po' per tutto, tutte le schede audio , tutte le schede di rete etc... perchè appunto la RedHat o la Mandrake o la Debian non su quale Hardware il proprio utente installerà la Distro.Soprattutto in distro come RedHat o mandrake dove l'utente medio è l'utente appena sfornato da Windows è necessario che il kernel compilato dal produttore sia il più statico possibile in modo da poter evitare all' utente anke il compito di caricare i moduli che gli servono. (Debian risolve questo problema infischiandosene e dando all' utente invece questo compito durante l'installazione ottenedo perchiò un kernel standard più leggero) questo comporta he il kernel è lento e pesante e fa + fatica a girare su macchine un po' + datate o con poca memoria (RedHat 8 fa un po' di fatica a girare di defaut con 64 Mb di mem, merito anke di Blue Curve), allora ricompilando il kernel si ottiene un kernel + adatto alle proprie esigenze , e più leggero.
Un altro motivo è l'uscita di una nuova versione del Kernel che potrebbe introdurre nuove features al quale l'utente è interessato, e comunque l'aggiornamento del kernel è sempre una buona Operazione.

Nozioni di Base:

COS'E' UN MODULO CARICABILE?

I cosìddetti LOADBLE MODULES sono particolare modi di concepire il kernel.Quando linux nacque non si necessitava di MODULI, i supporti alle varie periferiche erano poche e si potevano integrare tutte tranquillamente nel kernel, con l'avvento delle nuove periferiche e di un ampliazione del supporto l'utente potrebbe volere il supporto a un gran numero di periferiche , ma che non usa sempre, che anzi potrebbe usare sporadicamente, il quale supporto verrebbe comunque caricato ad ogni avvio perchè facente parte integrante del kernel occupando memoria.Allora vennero introdotti i MODULI CARICABILI , ovvero , se si compila un supporto ad una certa periferica come modulo , ad esempio il supporto al CDROM , questo non verrà compilato nel kernel stesso , ma in un file a parte *.o (nel caso del cdrom questo sarà "cdrom.o").All' avvio del kernel quindi non viene caricato il supporto al CDROM che non potremo quindi usare , per poterlo usare dovremo caricare il modulo relativo al CDROM usando ad esempio "modprobe" che carica i moduli all' interno del kernel space (l'area di memoria dove risiede il KERNEL) facendo diventare quindi i dati contenuti nel modulo parte integrante del kernel e aggiungendone quindi il supporto.

I MODULI NON SONO MENO PERFORMANTI DELLA COMPILAZIONE INTEGRATA NEL KERNEL quindi se ne può fare un abuso , se una cosa è compilabile sia come modulo che come statica è quasi sempre meglio compilarla come modulo per poterla controllare.

COS'E' UN KERNEL MONOLITICO?

Ci sono due diverse interpretazione di kernel monolitico , una è quella che lo vede contrapposto al MICROKERNEL ( ma non ci interessa ) l' altra è quella all' interno del kernel linux (che tra MICROKERNEL e MONOLITICO è monolitico tanto per la cronaca) che è la differenza tra kernel monolitico e modulare.Si parla di KERNEL COMPILATO MONOLITICAMENTE quando si è compilato il kernel senza avvalersi dei moduli

COS'E' UN KERNEL MODULARE?

E' un kernel compilato con il supporto ai moduli.

Parte pratica :

Cosa ci serve?

Per compilare il Kernel ci serve un compilatore (GCC) il make , automake e autoconf . Ovviamente dovremo anke ottenere una copia dei sorgenti del kernel da www.kernel.org oppure dal sito del produttore della nostra distribuzione che solitamente forniscono kernel leggermente diversi rispetto a quello originale.

Scaricate il kernel (piccola nota , scaricate solo i kernel con il secondo numero PARI , tipo 2.4.19 , quelli con il secondo numero DISPARI ,tipo 2.5.40 sono considerati kernel di sviluppo e quindi potenzialmente instabili, anzi, molte volte manko si compilano), piazzatelo nella cartella /usr/src e decomprimetelo con tar.

tar xvzf nomepacchetto.tar.gz (se compresso con gzip)

tar xvjf nome pacchetto.tar.bz2 (se compresso con bzip2)

Si crerà una cartella chiamata non so come (cambia a seconda del kernel) fate un link simbolico alla cartella che si chiami "linux" con "ln -s nome_cartella_kernel linux" Questo comando crea appunto un link simbolico alla cartella dei sorgenti di nome linux.

Entriamo nella cartella con "cd linux"

Ora iniziamo la configurazione, ovvero la determinazione di quali supporti inserire nel kernel o come moduli ( e quindi la determinazioni di quali periferiche vorremo usare o quali features usare)
PICCOLO APPUNTO , SE E' LA PRIMA VOLTA CHE COMPILATE IL KERNEL VI CONSIGLIO DI CARICARE LA CONFIGURAZIONE DEL VOSTRO KERNEL ATTUALE E MAGARI DI MODIFICARLA IN MODO DA TOGLIERE IL SUPPORTO A PERIFERICHE CHE NON VI SERVONO, OPPURE SE NON CI CAPITE PROPRIO NULLA LASCIARLO COSI' COM'E' E PROVARE A COMPILARE per fare ciò usate la seguente procedura: In /boot ci sarà un file tipo "config-2.4.18-xxx-xx" questo file contiene la configurazione usata per il kernel di default, copiare questo file con "cp /boot/config-2.4.18-xyz /usr/src/linux/.config" fatto ciò avrete caricato la vostra vecchia configurazione. a questo punto potete o provare a configurare partendo da questa configurazione come base invece che da zero (togliendo quindi le varie cose che non vi servono , perchè da aggiungere solitamente c'è molto poco) oppure compilare direttamente, saltando la sezione CONFIGURAZIONE, se decidete di tentare di configurate togliete solo i supporti alle cose che siete sicuri non userete , tipo il supporto alle schede PCMCIA se non avete un supporto di tale genere

Per iniziare la config scrivete "make config" per il tools testuale, se volete qualcosa di più grafico (consigliabile) "make menuconfig" , necessiterete però delle librerie ncurses , se avete X è consigliabile usare "make xconfig" ma necessiterete delle librerie tcltk.
Ecco quindi che iniziamo a configurare il kernel.Da qui in poi io parlerò come se aveste usato make menuconfig o xconfig.

Vi parlerò dei supporti da attivare genericamente e delle dritte per certi supporti che potreste avere o no:

Attivate il supporto ai drivers e supporti in sviluppo in Code maturity level options

Attivate il supporto ai moduli per un kernel modulare(quindi tutte e tre le voci ) in Loadable module support

Attivate in Processor type and features MTRR support , Intel Microcode , Model-specific register support , Machine Check Exception e scegliete la Processor Family che più si adatta alla vostra.

In General setup disabilitate il supporto alle PCMCIA (se non le usate) , abilitate BSD Process Accounting , abilitate come moduli o integrati il supporto ai binari a.out e MISC , lasciate il kernel in formato ELF, abilitate poi se vi aggrada il supporto a ACPI o APM.

Potete abilitare il supporto alle porte parallele in Parallel port setup

Il supporto al plug and play in Plug and Play configuration

In block devices il supporto al floppy e ai vecchi HD.

Supporto al RAID in Multi-device support (RAID and LVM)

Il supporto a vari protocolli di comunicazione via rete in Networking options

L'importante supporto agli HD e device IDE in generis in ATA/IDE/MFM/RLL support se il vostro disco fisso è IDE non inserite il supporto come modulo o non partirà il PC
nella sub sezione IDE , ATA .... c'è anke il supporto all' emulazione SCSI per i masterizzatori il supporto a diversi chipset IDE e RAID.

In SCSI support si può avviare il supporto al subsistema SCSI , come dischi , CDROM etc.Per l'emulazione SCSI per i masterizzatori attivare il supporto generale SCSI come modulo o integrato e poi il supporto per i CDROM SCSI.

Saltiamo a Network device support perchè le altre sezioni sovrastanti parlano da sole , qua possiamo attivare il supporto a diversi modelli di schede di rete Ethernet oltre al supporto di diversi protocolli di comunicazione quale anke l'importate PPP (Point to Point Protocol) necessario per la navigazione internet.Quindi abilitate come modulo o integrato il supporto al PPP + bsd compression e Deflate compression, se usate adsl Ethernet PPP over Ethernet è da aggiungere.

Se avete ISDN configurate ISDN Subsection

Saltiamo a Input core support da configurare le periferiche all' interno di questa sezione se avete Mouse o Tastiere o altro USB.

Ora andiamo nell' importate Sezione Character Devices attiviamo il standard/generic serial support come inegrato o modulo , integrato nel kernel il REAL TIME CLOCK support , come modulo l' L'AGP gart , il supporto ai vari chip mobo (VIA, INTEL etc...) ai moduli DRI per il Direct Rendering Infrastructure e quindi l'accellerazione 3d delle skede video non Nvidia.
ATTENZIONE, NON DISABILITATE VIRTUAL TERMINAL O NON RIUSCIRETE AD ACCEDERE ALLA VOSTRA LINUX BOX SE NON TRAMITE UN TERMINALE

Saltiamo all' importante sezione FIle Systemsqua dovremo inserire il supporto ai vari file system che vogliamo usare. IMPORTANTISSIMO CHE IL SUPPORTO AL FILE SYSTEM DI ROOT SIA INTEGRATO NEL KERNEL E NON COME MODULO, quindi se il nostro file system / è ReiserFS ad esempio dovremo inserire il supporto come statico e non come modulo , poichè dato che i moduli si trovano sul File system di root è improbabile che il kernel li vada a cercare senza il supporto , inseriamo poi il supporto a tutti gli altri file system che vogliamo usare, inseriamo il supporto al /proc file system, /dev (bisognerà installare DEVFSD, se non sapete che sia evitate di inserirlo) in caso non abbiate abilitato /dev abilitate il supporto a /dev/pts.Poi il supporto al Virtual Memory Filesystem (SWAP) e all' ISO9660 (CDROM).

In Console Drivers spuntiamo Video mode selection support e poi entriamo nella sub sezione (SE NON SAPETE COSA SIA FRAME BUFFER SALTATE QUESTA PARTE, oppure leggete la documentazione))Frame-buffer support attiviamo il supporto al frame buffer, poi il supporto al VESA frame buffer, o a uno della vostra scheda video , quindi radeonfb matroxfb etc... se avete una scheda Nvidia non usate rivafb, da solo problemi, usate VESA.

In Sound abilitate il supporto alla vostra scheda audio come modulo possibilmente.

In USB support Abilitate il supporto all' USB e alle periferiche USB che possedete (tastiere , mouse, Joysticks , scanners , stampanti.....)

Le seguenti sezioni se non sapete cosa sono lasciatele perdere.

Il segreto è quindi abilitare ciò che ci serve (supporto a schede che abbiamo o a features che ci servono) e togliere possibilmente quello che non necessitiamo, ma attenzione, togliete solo ciò di cui siete sicuri, se una cosa vi potrebbe sembrare una cosa ma non siete sicuri non disabilitatela

Ora salviamo e usciamo con Save and Exit in xconfig ,in menuconfig invece scegliamo exit e ci chiederà lui se vogliamo salvare.


FINITA LA CONFIGURAZIONE , ora dobbiamo compilare tramite i seguenti comandi:

make clean (pulisce i sorgenti dalle zozzerie in modo da avere un kernel pulito che non ci darà problemi nella compilazione, non sarebbe necessario se non abbiamo mai compilato il kernel da quei sorgenti, ma ormai è diventato una convenzione)

make dep (controlla il file di configurazione determinando quali saranno i file sorgenti da compilare e quali no a seconda di cosa abbiamo scelto durante la configurazione e se questi sono da compilare staticamente o come moduli)

make bzImage (questo comando inizia la vera e propria compilazione del kernel, con questo comando verrà creata l'immagine del kernel (quella statica, quindi i vari supporti ai moduli qui non vengono compilati) che verrà lanciata all' avvio dal boot loader)

make modules (durante questo passaggio avviene la compilazione dei moduli e la creazione quindi dei relativi files *.o)

make modules_install (copia i moduli dove di dovere , ovvero nella directory /lib/modules/[versione_kernel])

make install (questo comando copia l'immagine del kernel nella cartella /boot , poi modifica il file /etc/lilo.conf in modo da caricare il nuovo kernel al posto del precedente, se avete grub dovrete modificare manualmente il file di configurazione (almeno, mi sembra che modifichi anke il /etc/lilo.conf , non uso + questa procedura da un bel po' da quando ho debian) )

lilo (aggiorna il boot loader lilo secondo le nuove impostazioni del file /etc/lilo.conf per caricare il nuovo kernel)

grub (idem con patate come per lilo, solo che qua la procedura è entrare nel setup di grub appunto scrivendo "grub" da console come root, poi (presumendo che la partizione di root di linux sia la prima partizione del primo disco e che sempre sul MBR del primo disco vogliate installare il bootloader scrivete : "root (hd0,0) [Invio] setup (hd0) [Invio] quit [invio]" anke grub è installato)

il kernel è a questo punto installato e potete riavviare, al riavvio dovrete caricare i moduli per le varie periferiche oppure le features che avete deciso di compilare con modprobe , e magari di modificare il file /etc/modules o /etc/modules.autoload determinando al suo interno i nomi dei moduli da caricare all' avvio.

PER LA DEBIAN :

Installare il pacchetto KERNEL-PACKAGE (apt-get install kernel-package) sempre i tools di compilazione , inoltre libncurses5 , libncurses5-dev per il menuconfig o tk8.4 per xconfig (apt-get install libncurses5 libncurses5-dev tk8.4) andare nei sorgenti del kernel , configurare come descritto sopra, poi eseguire il comando :

make-kpkg clean (pulisce i sorgenti del kernel come make clean)

make-kpkg kernel_image (crea un pacchetto .deb comprendete il kernel appena compilato con i moduli ank essi appena compilati durante la procedura.)

a questo punto fate cd .. per tornare in /usr/src, il pacchetto dell' immagine del kernel sarà un qualcosa tipo "kernel-image-2.4.19-10+0+0.Custom.....deb" insomma un file del genere , non lo si può mancare, basta installarlo con :

dpkg -i nome_immagine_kernel.deb e riavviare il sistema


A questo punto anke per la debian il kernel è installato.



ATTENZIONE, LA COMPILAZIONE DEL KERNEL è UNA PROCEDURA CHE PUO' ANKE IMPEDIRE AL COMPUTER DI RICARICARSI ALL' AVVIO, E' CONSIGLIABILE STARCI ATTENTI E FARE UN BACKUP DEI DATI SE NON SI E' SICURI. IO NON MI ASSUMO NESSUNA RESPONSABILITA' SULLE VOSTRE AZIONI.

Ciao

Nota: COME APPLICARE UNA PATCH AI SORGENTI DEL KERNEL
Una patch contiene le differenze tra i file di due versioni diverse del kernel. Sono un utile metodo per passare da una versione alla successiva, senza doversi riscaricare l'intero tarball dei sorgenti, oppure per aggiungere funzionalità specifiche, o per passare dal ramo "ufficiale" al ramo mantenuto da altri, quali Alan Cox, Russel King, Andrea Arcangeli ecc.
Normalmente una patch deve essere applicata a una versione _specifica_ del kernel; a meno di casi semplici, l'applicazione fallirà se fatta su un kernel diverso da quello indicato. Qui potete trovare le patch per passare a due versioni successive del ramo stabile; ad es. per passare dal kernel 2.4.18 al 2.4.19 dovrete utilizzare, sul 2.4.18, il file patch-2.4.19.bz2 oppure .gz. Da notare che il kernel 2.4.18 deve essere quello "ufficiale" (chiamato anche "vanilla") distribuito da kernel.org, non quello (modificato) trovato nelle distribuzioni. Altro caso notevole è passare, da un kernel ufficiale, alla prerelease del kernel successivo: qui potete trovare le patch necessarie (da applicare alla versione _stabile_ precedente), qui le patch incrementali, da applicare alla _prerelease_ precedente.
Come dicevo, esistono patch che consentono di passare dal ramo ufficiale al ramo di altri mantainer; generalmente devono essere applicate o al kernel "vanilla" cui si riferiscono, o a una sua prerelease. Normalmente è chiaro dal contesto come procedere: ad esempio se vogliamo ottenere il kernel 2.4.21-pre3-ac5, dovremo prima patchare il kernel 2.4.20 per passare al 2.4.21-pre3, quindi applicare la patch per passare dal 2.4.21-pre3 al 2.4.21-pre3-ac5. A titolo informativo, qui potete trovare le patch per i rami di diversi mantainer.

Come applicare una patch: da console, entrate nella directory contenente i sorgenti del vostro kernel (normalmente /usr/src/linux, o qualsiasi altra posizione scegliate) ed eseguite il comando:
bzcat /path/al/file/patch.bz2 | patch -p1
oppure
zcat /path/al/file/patch.gz | patch -p1
a seconda del formato di compressione della patch in vostro possesso. E' possibile anche "invertire" il processo di patch, aggiungendo l'opzione -R al comando patch.
-- ilsensine
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al
andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12

Ultima modifica di ilsensine : 03-12-2003 alle 08:19.
ilsensine è offline