prima parte, tutto non lo prendeva
codice:
+--------------------La compilazione del kernel bignamizzata-------------------+
Bisogna premettere che la compilazione, o la ricompilazione del kernel, spesso
non e' necessaria. E' possibile infatti scaricare i file binari gia' compilati
dal sito della propria distribuzione. Vista la crescita esponenziale delle 
capacita' dell'hardware, la compilazione si rende utile o in presenza di 
hardware non supportato, o per alcune vecchie macchine che hanno bisogno di 
configurazioni "ad hoc" per il corretto funzionamento. Tuttavia essendo nello 
spirito del sistema operativo e' possibile farlo anche solo per ottenere uno 
snellimento del kernel, evitando riferimenti a hardware che non si possiede,
o a software per noi inutile. La compilazione e la ricompilazione del kernel non
portano a notevoli miglioramenti prestazionali, fatte salve le introduzioni
innovative che fanno testo a parte, infatti, vista la standardizzazione a cui
sono costrette per compatibilita' le distribuzioni, la maggior parte dei 
pacchetti software sono compilati seguendo standard non certo ottimizati, per
permettere a tutti di usufruirne. Avremmo sicuramente piu' benefici con la 
ricompilazione "in primis" delle principali librerie standard C (glibc,ecc),
e successivamente delle applicazioni piu' usate, ottimizzandole per il nostro
hardware, visto che sono quasi tutte compilate per i386, tipo di macchina un po'
in disuso, ma che definisce uno standard. 
Non ultimo il problema delle versioni personalizzate, i kernel di molte 
distribuzioni commerciali viene pesantemente modificato, nella red-hat, ma 
anche nella mandrake vengono applicate piu' di 250 patch percui su questi
sistemi e' sconsigliabile usare il kernel originale disponibile su kernel.org
perche' le modifiche da apportare richiedono tempo e conoscenza, e qualche
applicazione o comando potrebbe avere strani comportamenti, insomma un 
sistema potenzialmente instabile. Gli utenti Slackware potranno tranquillamente
usare i sorgenti originali, gli altri dovranno aspettare che la distribuzione
pubblichi i sorgenti e usare quelli.
Terminata questa piccola ma doverosa introduzione possiamo cominciare.
Dobbiamo per prima cosa creare un floppy di avvio del sistema, utile nel caso
qualche operazione non andasse a buon fine. Spesso un operazione di ripristino
puo' essere effettuata avviando la macchina con il cd di installazione della 
propria distribuzione, avendo cura di abilitare l'avvio da cd-rom nel bios.
E' comunque molto piu' pratico avere un floppy di avvio, procedura che spesso
viene fatta dal processo d'installazione. Noi lo creeremo "ex novo".
Inserite un floppy nel lettore e dalla shell, o da un terminale digitate:
fdformat /dev/fd0H1440
il comando fdformat dovrebbe farvi vedere il suo output.
Se ricevete un messaggio di errore, probabilmente la vostra distribuzione adotta
una denominazione della periferica diversa. Per scoprirla digitate:
ls /dev/fd*
vi fara' vedere tutti i device che cominciano con fd (Floppy Drive) presenti
nella directory /dev del sistema, in genere il primo o il secondo funziona.
Finita la formattazione, possiamo usare il programma mkbootdisk per creare un
disco di avvio, gli utenti Slackware come me useranno il comando makebootdisk.
Questi programmi, spesso modificati a seconda della distribuzione cercheranno
il file vmlinuz-VERSIONE_KERNEL (vmlinuz per la Slackware) nella directory /boot
( / per la Slackware), VERSIONE_KERNEL e' in genere uguale al'output del comando
uname -r
digitatelo per sapere la vostra versione.
Vi consiglio di testare il disco di avvio facendo ripartire la macchina da 
floppy.
Prima di fare qualsiasi operazione dobbiamo controllare alcune cose.
Portiamoci nella directory /usr/src con il comando
cd /usr/src
e controlliamo il contenuto con
  ls -l
a questo punto davanti a voi avrete un file chiamato linux che altro non e' che
in collegamento simbolico che punta, o ai sorgenti del kernel installato, o alla
directory che ha lo stesso nome del kernel che contiene i file include, che 
sonofile del kernel necessari al compilatore per compilare i sorgenti dei 
programmi.Rimuoviamo questo file con il comando
  rm linux
Con questo non rimuoveremo nessuna directory ma solo il collegamento, lo 
facciamo perche' quando decomprimeremo il nuovo kernel verra' creata quasi
sempre, tranne i kernel disponibili solo per alcune distribuzioni a cui vengono
applicate alcune patch o correzioni che vengono numerati sequenzialmente, una
cartella chiamata linux, ma lo vedremo in seguito.
Se non fossero presenti i sorgenti ma solo la cartella dei file include e'
ovvio che non possiamo ricompilare sorgenti che non abbiamo, dovremo trovare
i sorgenti per compilarci un nuovo kernel. 
Essendo i moderni kernel modulari, consentono cioe' il caricamento di moduli,
generalmente driver, successivamente all'avvio, quando noi compiliamo o 
ricompiliamo il kernel dovremo gestire piu' file, il kernel vero e proprio e
numerosi altri file come i moduli di solito con estensione .o oppure .o.gz che 
verranno installati nella cartella /lib/modules/VERSIONE_KERNEL, oltre al file
System.map che rappresenta una sorta di instantanea del sistema reponsabile
spesso del fatidico messaggio
kernel: Symbol table has incorrect version number
Quando noi compiliamo un kernel di versione differente da quello installato
i moduli verranno copiati in /lib/modules/VERSIONE_KERNEL, differendo le 
versioni non verranno toccati i precedenti moduli...ma se ricompiliamo il
kernel gia' installato? In questo caso dovremo mettere al sicuro i file 
funzionanti per permetterci di ripristinare lo "status quo antea". Per farlo
dobbiamo fare una copia di riserva dei nostri file. Portiamoci nella directory
dei moduli e facciamocene una copia digitando
  cd /lib/modules
  ls 
nel mio caso l'output e'
  2.4.17/
facciamoci una copia digitando
  tar cfv modules.tar 2.4.17/
ovviamente sostituite il numero di versione con il vostro. Dato che abbiamo
usato l'opzione "v" del comando tar vi passeranno davanti tutti i file, finita
l'esecuzione del comando avremo una copia di ripristino perche' l'installazione
dei moduli sovrascrivera' la directory in caso di ricompilazione. C'e' anche
un'altra strada ma per le prime volte ve la sconsiglio (lo so e' come se vi
avessi detto fatela..), si potrebbe una volta scompressi i file sorgenti del
kernel modificare il file "Makefile" nella riga che definisce la variabile
EXTRAVERSION, se modificassi la variabile cosi':
EXTRAVERSION = PP
dove PP sono semplicemente le mie iniziali e otterrei in fase di installazione
la creazione della cartella /lib/modules/VERSIONE_KERNEL-PP evitando di 
sovrascrivere la cartella gia' presente. Non modificate altre variabili che si
riferiscono alla versione perche' sono usate da altre applicazioni.
Per compilare il kernel il vostro sistema deve soddisfare i requisiti minimi
definiti nella cartella (che ancora non creiamo) 
  /usr/src/linux/Documentation/Changes 
nella sezione Current Minimum Requirements. Molti di questi pacchetti sono
installati in molti sistemi, ma a scanso si equivoci e' meglio controllare che
ci siano nel proprio sistema.
+--Software--+----+--per controllare da shell--+----------------+  
|  Gnu C                  # gcc --version	                | 		
|  Gnu make               # make --version                      |
|  binutils               # ld -v                               |
|  util-linux             # fdformat --version                  |
|  modutils               # insmod -V                           |
|  e2fsprogs              # tune2fs                             |
|  PPP                    # pppd --version                      |
|  isdn4k-utils           # isdnctrl 2>&1|grep version          |
+---------------------------------------------------------------+
Per installare i sorgenti esistono diversi metodi a seconda del formato in cui
saranno impacchettati, se red-hat o simili avremo un file con estensione .rpm,
per altri sara' un normalissimo file con estensione .tar.gz o simili.
Per usare gli strumenti di configurazione del kernel un tantino piu' evoluti
del semplice "config" da riga di comando, devono essere installate (normalmente
ci sono) le librerie ncurses per il comando "menuconfig" oppure il server
grafico XFree per usare il comando "xconfig". Se dovessimo applicare delle patch
al kernel queste andranno chiaramente applicate successivamente l'installazione
dei sorgenti, e prima della compilazione. Ammettiamo che abbiate i sorgenti del
kernel in formato .tar.gz . Per farla semplice copiamo il file nella directory
che normalmente contiene i sorgenti (ricordarsi di cancellare il collegamento 
di cui abbiamo parlato prima) digitando
  cp VERSIONE_KERNEL.tar.gz /usr/src
poi ci rechiamo in suddetta cartella con
  cd /usr/src
e lo scomprimiamo con
  tar xvzf VERSIONE_KERNEL.tar.gz
ci creera' una cartella, normalmente chiamata linux rinominiamola con la 
versione corrente e ricreiamo il collegamento simbolico linux che cosi' puntera'
alla versione appena installata
  mv linux linux-VERSIONE_KERNEL
  ln -s linux-VERSIONE_KERNEL linux
se a questo punto abbiamo bisogno di applicare patch dobbiamo rispettare 
l'ordine di rilascio dal piu' basso al piu' alto, per esempio
   cp patch01.gz /usr/src/linux
   cd /usr/src/linux
   gunzip patch01.gz
   patch -p1 < patch01
o piu' sinteticamente
   cd /usr/src gzip -cd patch01.gz | patch -p0
o per il formato bzip   
   cd /usr/src bunzip2 -dc patch01.bz2 | patch -p0
Bisognera' ripetere il procedimento per tutte le patch in ordine stando 
attenti all'eventuale creazione di file .rej (rejected, rifiutato) che 
indicherebbero errori nell'applicazione della patch. Esiste anche uno script 
che automatizza la procedura cercando nella directory tutti i file patch da voi
scompressi al suo interno.
  cd /usr/src/linux/scripts
  ./patch-kernel
segue in basso...