[hack] Corso intermedio di ieri sera

Giacomo Bagnoli johndoe@pctuner.net
Ven 30 Gen 2004 19:30:39 CET


Come promesso, ecco qua un riassuntino per la ricompilazione del kernel

Allora, prima di tutto una cosa: il procedimento non è rischioso, in
quanto si può avere quanti kernel si vuole... basta scegliere quella da
bootare (TM) all'avvio della macchina, qundi si può sperimentare quanto
ci pare... basta stare attenti a quello che si fa!

La prima cosa da fare è scaricare i sorgenti...
Sono una 30-ina di mb, e si prendono da www.kernel.org , esistono molte
varianti, io vi consiglio di restare (a meno di necessità) sul vanilla,
che è il "flavour " ufficiale.

Il pacchetto averà un nome del genere:

---code:
linux-x.y.z.tar.bz2
-------

x: numero della versione principale, attualmente è la 2
y: numero della versione secondaria, qui è importante prendere l'ultimo
numero pari (attualmente 4). Quelli con numero y dispari son development
kernel, e son un po' particolari... sopratutto non sono stabili, anzi, a
volte non compilano nemmeno...
z: prendete sempre l'ultimo numero disponibile , attualmente è il 20
anche se siamo vicini al 21

Una volta scaricato, copiate il pacchetto (ammettiamo che avete preso il
.tar.bz2 che è più piccolo ) nella directory /usr/src e scompattatelo

---code:
# cp -v linux-x.y.z.tar.bz2 /usr/src
# cd /usr/src
# tar -xvjf linux-x.y.z.tar.bz2
-------


Quindi vi troverte una cartella "linux-x.y.z" nella directory /usr/src,
contenente i sorgenti del kernel.
Create un softlink di nome linux alla nuova cartella e entrateci

---code:
# ln -s linux-x.y.z linux
# cd linux
-------


Due parole: probabilmente la vostra distribuzione mette a disposizione
il file di configurazione del kernel che usa: cercatela, è molto più
semplice partire da una base e togliere quello che non ci serve che
partire da zero e scordarsi sempre qualcosa Di solito si trova in /boot/
o direttamente in /usr/src e avrà nome tipo "config-xyz" o qualcosa del
genere. La configurazione vecchia va messa dentro la directory
/usr/src/linux-x.y.z e va chiamata .config

---code:
# cp -v /boot/config-x.y.z /usr/src/linux/.config
-----
Iniziamo la configurazione
La prima cosa da fare è dare un "nome" particolare al nostro kernel, in
modo che non si confonda con quello che funziona. Infatti se ricompilate
la stessa versione che sta
girando, rischiate di compromettere il funzionamento/imbrogliarvi,
sopratutto per la gestione dei moduli

Aprite con il vostro editor di testi preferito il file
/usr/src/linux-x.y.z/Makefile e aggiungete un qualcosa alla voce
"Extraversion"

---code:
VERSION = 2
PATCHLEVEL = 4
SUBLEVEL = 24
EXTRAVERSION = -golem
----- 



Potete metterci quello che vi pare. Magari non esagerate/non scrivete
parolacce che poi questo nome appare un po' ovunque :P

Quindi, passiamo alla configurazione

---code:
# make config
# make menuconfig
# make xconfig
------


Ovviamente, ne dovete dare uno solo, il primo è testuale (altamente
Sconsigliato), il secondo sempre testuale ma con i menù (consigliato, in
caso vi dia problemi dovete installare se siete su mepis le ncurses con
il comando "apt-get install libncurses5-dev ") e il terzo usa i pulsanti
di x, ma richiede le librerie tk

Sulla configurazione scrivo qualcosa in seguito, cmq l'approcci sono
due: monolitico o modulare...
qui c'è l'eterna diatriba tra gli utenti... io preferisco i moduli
perchè si possono caricare quando servono, e quando non servono non
rompono , l'importante è che tutte le cose essenziali al boot come il
supporto per il disco fisso (scsi se necessario), per il filesystem
usato nella partizione / ecc ecc devono essere compilati staticamente,
NON come moduli... cose come scheda audio, scheda di rete, porta
parallela ecc ecc vanno benissimo come moduli... diciamo tutte le cose
che non si usano sempre.
Parlando rigorosamente, non sarebbe necessario includere il supporto
per  controllere EIDE/SCSI e FS di / nella bzImage: e` sempre possibile
usare initrd,  solo che uo non l'ho mai fatto
 e non ne sento il bisogno; avendo pero` velleita` di generalita` nella
trattazione, e` bene farne almeno menzione. Tale scelta e` peraltro
obbligata nel caso si usino driver closed-source.
La mia personale regola "nella bzImage ci sta` quanto necessario al
boot" deriva semplicemente da una questione di praticita`: che senso ha
mettere
come modulo una cosa che tanto e` _sempre_ utilizzata?

Allora, diamo una passata veloce alle impostazioni che potete mettere
---ATTENZIONE: NON E' TUTTO QUELLO CHE VI SERVE, NE MAGARI SONO GIUSTE,
DOVETE CONOSCERE VOI LA CONFIGURAZIONE DEL VOSTRO HARDWARE---

Sotto "Code Maturity Level Options" abilitate la voce "prompt for
development...", in quanto abilita un sacco di cose spesso necessarie

Sotto "Loadable Module Support"
[*] Enable loadable module support
[*] Set version information on all module symbols
[*] Kernel module loader

Queste voci mettetele se volete avere il kernel modulare (fortemente
consigliato)

Sotto "Processor type and features" abilitate il supporto per tanta
memoria (se ne avete più di 790mb mi pare... cmq con 512 non importa)
Vi consiglio di abilitare anche
[*] MTRR (Memory Type Range Register) support
 serve ovunque sia richiesta accelerazione grafica. 2D, 3D,
video(overlay). Non ricordo -ne` francamente ora come ora mi
interessano- i dettagli tecnici comunque reperibili sotto
/usr/src/linux/Documentation, ma usando il pc per workstation/desktop e`
bene abilitarlo sempre.
[ ] Symmetric multi-processing support
se non avete un dual e abilitate l'APIC (se la mobo lo supporta e in
quel caso dovreste anche controllare che sia abilitato da BIOS)
Settate anche il tipo di processore... ovviamente non sbagliate che
sennò non va..

Sotto "General setup" togliete il supporto pcmcia e pci hotplug a meno
che non vi serva, lasciate kernel core su ELF e settate il power
management (acpi/apm) come preferite...

La porta parallela suggerirei di configurarla come modulo, e di far
caricare tale all'avvio (qui dipende dalla distro)

Sotto "Plug&Play" abilitate il supporto se lo volete
Sotto "Block Device" abilitate il floppy come modulo la loopback device
support (come modulo o statico, come preferite) e il ram disk support
(STATICAMENTE se volete abilitare il initrd... alcune distro lo
vogliono, come mandrake).
Abilitate eventualmente il supporto al raid e all'lvm, ai protocolli di
rete

Sotto "ATA/IDE/MFM/RLL support " -->"IDE, ATA and ATAPI Block devices"
mettete il supporto all'IDe dei vostri dischi (staticamente se volete
fare il boot dall'ata), mettete quindi come moduli sia il supporto al
cdrom che l'emulazione scsi se volete usare il vostro masterizzatore
ide.

Sotto "scsi support" abilitate il supporto ai dischi scsi e allo scsi
generico (come moduli, a meno che non abbiate da farci il vboot): queste
voci vi servono anche per le penne usb, che vengono viste come scsi,
oltre a (se ne avete) aggiungere il supporto al controller.

Sotto "Network device support" abilitate anche come modulo il supporto
alla sk di rete, sotto "Input core support" il supporto al
mouse/tastiera

All'interno del menu "Character devices " siate certi di aver messo il
supporto ai terminali virtuali e ai PTY, abilitate il supporto I2C
(ATTENZIONE!!! CON IL VANILLA 2.4.20 È INUTILE SE NON LO PATCHATE
PRIMA), e abilitate anche il supporto all'agpgart

Sotto "File systems" abilitate il file system della partizione di root
(/) STATICAMENTE (pena un kernel panic ), gli altri anche tutti come
moduli, sotto consolle driver abilitate il supporto al framebuffer

Sotto Sound, se avete intenzione di usare alsa basta che mettiate solo
la prima voce COME MODULO (soundcore)
Bene, non vi resta che abilitare il supporto all'usb (anche all'usb
storage in caso vogliate usare penne usb et similia), poi salvate e
uscite

Una volta configurato tutto, con il comando

---code:
# make dep && make  clean bzImage modules modules_install
-----

inizia la compilazione

Una volta finita, troverete i moduli in /lib/modules/x.y.z-EXTRAVERS
, basta quindi copiare l'immagine (il kernel vero e proprio) nella
cartella /boot/ (ATTENZIONE A NON SOVRASCRIVERE IL VOSTRO KERNEL
ATTUALE, VI CONSIGLIO DI RINOMINARE IL FILE QUANDO LO SPOSTATE)

code:
# cp arch/i386/boot/bzImage /boot/bzImage-x.y.z-EXTRAVERS

, e aggiungere una voce (anche ugualissima a quella che usate) al
bootloader (lilo o grub) che indirizzi al nuovo kernel, qundi
aggiungendo una voce
Quando riavviate provate la nuova voce.. se non fa potete sempre fare il
boot con quella vecchia

 PICCOLA FAQ:
 Q:	kernel panic: no init found 
 A:    -> scordato supporto fs / o supporto disco di boot, oppure (piu`
raro) configurato male bootloader

 Q: non va X, o va male/lento 
 A:-> scordato supporto per Unix Domain Sockets, oppure non abilitato
DRM, MTRR o agp
 
  Q: "ma come si fa a selezionare una componente come modulo?"
  A: -> usa 'm' sulla voce del menu.
  


Fatemi sapere se c'è qualcosa che non vi ricordate/non capite/ecc

Giacomo




Maggiori informazioni sulla lista golem-hack