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.

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_GENERIC
CONFIG_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 :)

1 comment

  1. by Chris Mon, 21 Sep 2009

    Complimenti, finalmente una guida chiara da cui partire! Ho provato a dare: # lsmod | grep ata (e nel dubbio anche) # lsmod | grep -i '*ata*' ma non ottengo niente! Come faccio a vedere quei moduli?


Please insert the result of the arithmetical operation from the following image:

Please insert the result of the arithmetical operation from this image. =