Guida all’ottimizzazione del Kernel Linux
Questa breve guida intende istruire l’utente per la realizzazione di una configurazione personalizzata ad hoc per il proprio elaboratore, al fine di migliorarne le prestazioni in fase operativa e di avvio del sistema.
Consiglio di partire non dalla configurazione base della distro, che è sì completa, ma troppo pesante. Partite senza configurazione, e parte del lavoro sarà già fatto
MODULI
Occorre prima di tutto definire la differenza tra driver compilato come modulo [M], e driver compilato come statico [*].
La funzione del modulo è quella di essere caricato al momento del bisogno cioè quando una risorsa hardware ne necessita per il funzionamento.
Ad esempio quando viene collegata all’elaboratore una usb pen drive, un demone chiamato “udev” si occupa di caricare il modulo “usb_storage” dalla directory /lib/modules/nomekernel nella quale risiedono i moduli.
Il driver compilato come statico invece viene incluso all’interno dell’ immagine compressa del kernel, “vmlinuz”, che viene caricata durante il boot del sistema operativo.
È proprio qui che casca l’asino! O meglio, il pinguino!
Quando il sistema operativo parte, effettua il riconoscimento dell’ hardware e ricerca all’interno del kernel i driver di ciascuna periferica.
Se i driver delle periferiche richieste al momento del boot sono compilati come moduli, il sistema dovrà caricarli manualmente con rilevante perdita di tempo. Solitamente quindi tutti i driver delle risorse hardware interne all’
elaboratore, e quindi perennemente collegate, vanno compilati statici [*].
Attenzione però il discorso vale anche al contrario! Compilando statici idriver di periferiche non collegate o non necessarie all’avvio, farete aumentare la dimensione della vostra vmlinuz la quale richiederà più tempo per il caricamento e lo scompattamento.
In generale un driver va compilato come statico solo se strettamente legato all’elaboratore e se necessario all’avvio, un modulo va compilato come modulo se non riguarda la fase di boot e potrebbe rivelarsi utile in un momento successivo.
OTTIMIZZAZIONE
Definiamo ora quali sono le parti del kernel linux che incidono maggiormente sui tempi di avvio e sulle quali andremo ad agire.
- INITRD – L’initrd è una immagine del filesystem e del disco rigido generata tramite mkinit, che si occupa del caricamento dei moduli necessari per il riconoscimento del disco rigido e del filesystem, compilati appunto come moduli [M].
- Logger e strumenti di debug utili solo a sviluppatori
- Moduli superflui per il nostro elaboratore
1. Rimozione INITRD
Il primo passo importante è significativo è la rimozione dell’initrd. Il procedimento è semplice ma va fatto con attenzione per non cadere in errori di KERNEL PANIC.
1.1 Prima di tutto occorre disabilitare il supporto initrd che troverete sotto general setup.
CONFIG_BLK_DEV_INITRD=n
1.2 Settare come statico il modulo del filesystem della vostra partizione di /root. Lo trovate sotto la sezione filesystem (in esempio reiserfs).
CONFIG_REISERFS_FS=y
1.3 Ora viene la parte piu importante e delicata dell’intera guida, cioè settare staticamente i moduli del vostro disco rigido. Per scoprirli consiglio di avviare con kernel di default e poi dare un: lsmod | grep ata
I moduli che verranno fuori vanno compilati tutti come statici, li trovate nella sezione Devices Drivers -> Serial ATA (prod) –> ATA SFF support… I piu comuni per hardisk SATA e PATA sono i seguenti:
CONFIG_ATA_ACPI
CONFIG_SATA_PMP
CONFIG_SATA_AHCI
CONFIG_ATA_PIIX
CONFIG_ATA_GENERICCONFIG_PATA_AMD
CONFIG_PATA_SCH
Ovviamente non vanno scelti tutti quelli in elenco, ma solo quelli necessari.
1.4 Selezioniamo ora staticamente i moduli [*] per i dischi SCSI
CONFIG_SCSI=y
CONFIG_BLK_DEV_SD=y
CONFIG_CHR_DEV_SG=y
Ora consiglierei a tutti in ogni caso di compilare e avviare il kernel. Se vi ritrovate difronte a un KERNEL PANIC vuol dire che avete dimenticato sbagliato qualcosa. In questi casi c’è solo da provare e riprovare.
So che ricompilare ogni volta diventa snervante ma è il prezzo da pagare per delle prestazioni estreme.
2. Scegliere i moduli statici
Il secondo passo è la scelta dei moduli statici, ovvero quelli utili e indispensabili nel primo avvio che saranno inclusi nell’immagine vmlinuz.
Raccomando innanzitutto di scollegare stampanti, dischi esterni, penne e quantaltro lasciando collegato solo l’hardware interno al pc. Date il comando: lspci -n il quale creerà una lista degli id dei devices che dovrete dare in pasto a questo database: http://kmuto.jp/debian/hcl/ il quale vi fornirà la lista dei moduli di cui necessitate.
Ovviamente essendo uno strumento automatico non garantisce la massima affidabilità, ad esempio potreste trovare il nome di un modulo che non è più incluso all’interno del kernel o che si chiama diversamente. In quel caso dovete cercarlo voi con un pò di pazienza.
Bene dopo aver impostato tutti i moduli statici [*] ricompilate nuovamente.
Al successivo riavvio date un dmesg per controllare eventuali errori, che si correggeranno disabilitando una delle voci precedenti o abilitandone di nuove. Nel mio caso ad esempio il modulo ipw2200 per cause ancora sconosciute, non può essere compilato staticamente [*] ma solo [M].
Se tutto è ok procedete al passo successivo.
3. Pulizia
A questo punto il grosso è fatto, però per alleggerire ulteriormente il kernel occorre disabilitare parecchia roba statica che appensantisce la nostra vmlinuz inutilmente e di cui possiamo fare a meno, e perchè no
anche moduli di cui siamo SICURI non avremo mai bisogno.
Nelle sezioni in cui avete selezionato i driver statici, potete eliminare i restanti. Ad esempio nella sezione “Network device support” potete abilitare staticamente solo il driver per la vostra scheda di rete ed eliminare tutti gli altri. Alcune di queste sezioni e altre come l’hardware Macintosh possono essere anche interamente eliminate, ovviamente se non ne avete bisogno.
Altro consiglio è di eliminare quanti più possibili strumenti di debug, anche se possono risultare utili rallentano il sistema,dmesg per le nostre esigenze è più che sufficiente.
Oltre alle sezioni in cui avete scelto i moduli statici, di seguito, vi consiglio le sezioni a cui limitarvi inizialmente per la “pulizia”. Ovviamente stando sempre attenti a ciò che eliminate.
-> General setup
-> Processor type and features
-> Bus options (PCI etc.)
–> PCCard (PCMCIA/CardBus) support
–> Support for PCI Hotplug
-> Networking support
–> Bluetooth subsystem support
–> Wireless
-> Device Drivers
–> Multiple devices driver support (RAID and LVM)
–> Network device support
–> Multifunction device drivers
–> Multimedia devices
–> Sound card support
–> USB support
–> X86 Platform Specific Device Drivers
-> Kernel hacking
Questa fase è meramente soggettiva e a vostra discrezione. Se sarete larghi di manica potreste causare diversi errori o disabilitare moduli utili, quindi ripeterete questo procedimento decine se non centinaia di volte, a seconda del vostro grado di pazienza, finchè non avrete un kernel perfetto. Quando sarete esperti potrete mettere mano a qualsiasi
sezione del kernel senza temere malfunzionamenti.
Io dopo mesi e mesi di smanettamenti e smadonnamenti sono riuscito ad ottenere un kernel *quasi* perfetto con una immagine delle dimensioni di 1.4 MB.
Buona compilazione












21/04/2009 a 10:27
[...] Guida all’ottimizzazione del Kernel Linux [...]
21/04/2009 a 14:15
Grazie Adriano. La aspettavo sta guida e devo dire che è abbastanza chiara e semplice da seguire.
Continua così mi raccomando!
21/04/2009 a 20:57
Ciao Adriano ti volevo fare i miei complimenti per questa guida….molto bello ma soprattutto per il lavoro che stai portando avanti sul kernel linux!!!
Presto dopo qualche esame anche io penso di intraprendere questa entusiasmante esperienza (anzi spero anche nel tuo aiuto XD)
Spero che tu decida di ampliare questo materiale sul kernel
Ciao a presto!!
21/04/2009 a 21:59
grazie 1000 ragazzi
24/04/2009 a 15:54
ciao Adriano,
ottima guida, semplice e precisa.
però mi sfugge il metodo con cui arrivo a modificare i vari parametri del kernel…
mi puoi indicare qualche guida??
grazie
24/04/2009 a 18:11
http://guide.debianizzati.org/index.php/Categoria:Kernel
24/04/2009 a 21:20
ciao, ottima guida ma avrei una domanda:
ho impostato come statici tutti i moduli che vedo con lsmod | grep ata tranne “libata” che non trovo…
Potresti darmi una mano ?
25/04/2009 a 00:53
Cathan quel comando devi darlo dopo aver avviato il kernel arch
30/07/2009 a 14:20
ciao,
sapete se esiste un documento che elenchi tutte le possibili opzioni selezionabili del kernel ?
grazie
30/07/2009 a 15:21
se possibile utilizzate il blog nuovo
http://www.obliquo.net/?articles/2009/04/21/guida-allottimizzazione-del-kernel-linux.html
10/12/2009 a 00:54
Complimentissimiii!!! Grandissimo, ti ringrazio davvero tanto per questa piccola, ma esaustiva (almeno in base alle MIE conoscenze) guida alla compilazione del kernel; soprattutto ho finalmente trovato una persona che ti spiega in parole povere e con “praticità” perchè scegliere di usare -M- o -*- durante la configurazione!!!
Grazie 1000, sei stato immensamente utile, altre parole per esprimerti la mia gratitudine non trovo, perciò grazie ancora e mi raccomando continua così, nel senso di portare anche a noi comuni pinguini questa conoscenza fatta chiara e resa di facile compresione. Grazie, grazie, grazie! Ciao!