In un epoca in cui si usano calcolatori che compiono milioni di flop al secondo, è alquanto paradossale dover attendere una vita per il boot della propria macchina; questa problematica risulta irrilevante se si utilizza il calcolatore come server in quanto non si è costretti a continui avvii del computer, ma è sentita dagli utenti desktop e soprattutto dalle persone che utilizzano un notebook.
In questa guida cercherò, senza garanzie e senza pretese, di fornire qualche consiglio utile basato sulla mia esperienza su come ridurre I tempi di boot.
Prima di iniziare però gradirei fare due premesse: prima di tutto ci tengo a precisare che I seguenti consigli non sono esclusivamente farina del mio sacco, ma il 50% è preso in giro da internet; mi sarebbe piaciuto fornire I link dai quali mi sono documentato ma purtroppo preso dalla foga del momento ho dimenticato di salvarli. In secondo luogo vorrei aggiungere che ci sono altri metodi per accedere in modo più veloce del solito al proprio ambiente di lavoro (vedi la sospensione su disco) ma questa guida ha come scopo quello di ridurre I tempi di un “normale” boot di un computer “general purpose”.
L’autore non si ritiene responsabili per eventuali danni causati al sistema operativo o per eventuali perdite di dati.
Qualsiasi commento, nota o correzione è ben accetto.
Prima di tutto forniamo un pò di informazioni sulla macchina cavia, in modo da fornire un termine di paragone per I risoltati; la macchina in questione è un pò vecchiotta in quanto viene utilizzata essenzialmente per smanettarci:
Cache: 256 KB
RAM: 252 MB
SWAP: 512MB
Filesystem: ext3 sia per root direcory che per le home (dicono che reiserfs garantisca prestazioni migliori, ma con quello che è successo al suo creatore non credo che lo sviluppo continuerà)
Sitema Operativo: GNU/Linux Debian sid con Server Grafico attivato e LXDE come Desktop Environment.
Il sistema in questione è stato installato tramite net-install e selezionando I seguenti gruppi di pacchetti:
- Print server
- Standard system
Installare più o meno software rispetto a quello utilizzato in questa guida può naturalmente influire sui tempi di boot in quanto cambia il set di demoni avviati al primo boot della macchina
Procediamo fornendo una panoramica sulla modalità di boot del PC ed in particolare dei sistemi GNU/Linux.
Il primo elemento che entra in esecuzione è il BIOS (Basic Input/Output System) ovverro un programma che risiede in un chip della scheda madre che si occupa di riconoscere una parte dell’hardware (generalmente il processore, I lettori ottici e I dischi fissi). Una volta finita la ricognizione dell’hardware il BIOS legge l’MBR (Master Boot Record) del disco di avvio pemettendo così il caricamento del boot loader ovvero quel software che vi permette di scegliere il sistema operativo da avviare.
La maggior parte delle distribuzioni di Linux permette di scegliere tra LILO (LInux LOader) e GRUB
(GRand Unified Bootloader); Debian di default utilizza GRUB.
Il boot loader si occupa di caricare il kernel scelto nella memoria ram.
A questo punto il kernel Linux acquisisce il controllo e, in un sistema Debian, avvia init (pacchetto sysvinit). Init è semplicemente un sofwtare che seguendo un elenco più o meno ordinato avvia un insieme di demoni tra I quali (nel caso in cui si utilizzi un greeting grafico) GDM, KDM o altri.
Riassumendo, graficamente la procedura di boot può essere rappresentata dalla seguente linea temporale:

A tal proposito ho ritenuto utile suddividere la guida in 4 parti, ognuna delle quali è dedicata ad una specifica fase della procedura di boot.
Sebbene la maggior parte delle moderne schede madre sono equipaggiate da BIOS che permettono personalizzazioni davvero minime, è consigliabile effettuare tutto il possibile per fare in modo che il tempo che va tra l’accenzione del computer ed il caricamento del boot loader sia ridotto all’osso.
Sebbene sia consigliabile utilizzare la versione più recente per il proprio BIOS, questa è un’operazione ad alto rischio in quanto, come sicuramente saprete, può compromettere il funzionamento della scheda madre; mi sento quindi di consigliarla esclusimanete ad utenti di PC quali HP e TOSHIBA (ce ne saranno altri ma io conosco questi) che forniscono sul proprio sito un utility per flashare il BIOS all’ultima versione disponibile. Premetto che però tali utility vengono sviluppate per essere eseguite sotto Windows (presumo solo per scopi commerciali) quindi è un’operazione che vi consiglio di fare prima di installare Linux; nel caso in cui Linux già sia presente sul vostro PC, se disponete di un ampia partizione di swap, potreste provare ad installare temporaneamente Windows su tale partizione (che diventerebbe NTFS o FAT32), lasciando così illese sia la partizione di root che le home.
Installare Windows sulla partizione di swap comporta comunque la cancellazione di GRUB dal MBR e la perdita di un’eventuale sessione salvata tramite la sospensione su disco.
Per quanto riguarda I parametri se utilizzare un BIOS Award come quello della macchina in questione avete ampi margini di smanettamento (vi rimando a google per le guide a proposito) altrimenti una cosa che sicuramente potete fare è selezionare l’unità dove risiede GRUB come la prima da avviare; in caso contrario il BIOS controllerà prima la presenza di eventuali CD/DVD nel lettore ottico o se è possibile (nei modelli che lo prevedono) effettuare il boot da LAN.
Lo scopo di questa sezione è ridurre il tempo necessario a GRUB per avviare il caricamento del kernel. Purtroppo anche qui non abbiamo la possibilità di fare tanto se non tentare di diminuire al minimo l’interazione di GRUB con l’utente.
Se infatti avviamo la nostra macchina sempre e solo con lo stesso kernel e se non abbiamo altri sistemi operativi installati, possiamo dire a GRUB di non mostrare la schermata con la lista dei sistemi operativi disponibili e di diminuire a zero l’attesa che di solito viene impiegata per dare all’utente l’opportunità di scegliere cosa avviare.
A tal proposito bisogna procedere con la modifica del file /boot/grub/menu.lst settando a 0 (zero) la voce timeout e decommentando la linea.
Inutile dire che l’ideale sarebbe compilare il kernel a mano ed eliminare tutto quello che non ci occorre (compresa l’ Initial RamDisk Image), ma sono dell’opinione che è una cosa alquanto tediosa da fare esclusivamente per sistemi embendeed; resta comunque il fatto che almeno una volta nella vita è un’esperienza che un utente Linux DEVE fare perchè consente di conoscere infiniti concetti che altrimenti resterebbero ignoti.
Utilizzeremo quindi il parco kernel fornito da mamma Debian: quello che dobbiamo fare è scegliere il kernel specifico per la nostra architettura, nel mio caso essendo un Pentium III ho scelto il kernel ottimizzato per processori i686.
Per avere una lista dei kernel disponibili (naturalmente mi aspetto che I repository siano configurati) occorre digitare da terminale
per verificare il kernel utilizzato
La scelta del kernel dedicato alla nostra architettura è un’operazione che ci consentirà anche durante il nostro lavoro di ottenere prestazioni migliori in quanto il kernel dovrebbe utilizzare le istruzioni macchina specifiche per la nostra CPU.
Nel tempo che va tra il caricamento da parte di GRUB e l’avvio di init, il kernel compie delle azioni di default quali riconoscimento hardware ed altro. Configurando propriamente il boot loader facendo in modo che quest’ultimo passi degli utili parametri d’avvio al kernel, possiamo cercare di bypassare le azioni che risultano inutili per l’utilizzo che facciamo del nostro PC.
La lista dei parametri che è possibile passare al kernel linux è smisurata a tal proposito mi limito ad elencare e spiegare quelli che io ho ritenuto utili e vi rimando alla lettura di questa guida.
Torniamo ad editare il file /boot/grub/menu.lst e modifichiamo le seguenti righe SENZA ELIMINARE IL CANCELLETTO:
# kopt= root=/dev/hda2 rootfstype=ext3 mem=512m ro
# defoptions= quiet noresume vga=788
a questo punto:
Naturalmente questi sono I valori relativi alla macchina in questione quindi non vanno presi come paramentri generali.
- rootfstype=ext3: indica con quale filesystem è stata formattata la partizione di root; ho pensato che specificandolo apertamente il kernel avrebbe evitato di tentare di capirlo da solo.
- mem=512m: specifica la quantità di memoria disponibile; come sopra ho pensato che il kernel evitasse di calcolare la memoria RAM disponibile.
- ro: specifica di montare inizialmente la partizione di root in sola lettura, inutile per le prestazioni in fase di boot ma utile per eseguire il controllo del disco.
- quiet= specifica al kernel di non riportare a video l’output di tutte le sue operazioni in fase di boot ma di visualizzare semplicemente il messaggio “Loading kernel…”; ho pensato che, anche se in minima parte, potesse essere utile diminuire le operazioni per la stampa sullo standard output.
- noresume: se non si utilizza la sospensione su disco, tramite “noresume” evitiamo che il kernel analizzi la partizione di swap per ricercare eventuali sessioni ibernate.
- vga=788: imposta Il framebuffere della scheda video; inutile ai fini della riduzione del tempo di boot.
Prima di iniziare ad addentrarci in questa sezione, consiglierei di studiare a fondo il funzionamento di sysv-init al fine di comprendere le azioni che compieremo e la procedura di boot in generale.
Consiglio inoltre di installare bootchart, uno strumento che ci permetterà di avere informazioni più dettagliate e soprattutto di monitorare I miglioramenti di quest’ultima fase della procedura di boot.
Poi modificare il file /boot/grub/menu.lst ed aggiungere la seguente il seguente comando init=/sbin/bootchartd” ai parametri di boot del nostro kernel.
Bootchart verrà avviato come primo processo dal kernel e si occuperà poi di avviare init e di monitorare il suo comportamento.
A questo punto riavviare il sistema e poi digitare
Questo comando ci permetterà di ottendere un immagine png che conterra il grafico rappresentante la nostra procedura di boot:

La figura rappresenta I demoni avviati ed il tempo occorso per ciascun avvio; in alto possiamo leggere il tempo totale impiegato: 57secondi.
Installiamo il pacchetto sysv-rc-conf ed avviamo sysv-rc-conf come root; questa utility ci permette di gestire I demoni avviati da init durante la fase di boot del sistema. Ogni demone rappresenta un servizio che il nosto computer ci fornirà; analiziamo quelli del calcolatore in questione.

Eliminando le “X” possiamo disabilitare I servizi che non utiliziamo; personalmente io ho eliminato
- exim4: è un MTA, utilizzato anche in locale per inviare all’utente root eventi amministrativi, ma a me non serve
- lpd: dovrebbe essere un demone per la gestione della stampa ma penso che utilizzando cups se ne possa fare a meno
- nfs-common: non utilizzando alcun net-filesystem lo elimino
- policycoreutils: dovrebbe gestire le politiche di sicurezza selinux ma penso che per uso domestico se ne possa fare a meno, o per lo meno io l’ho disabilitato e non ho avuto problemi
- ssh: nel caso in cui sia attivo il demone ssh e non vi occurre rendere accessibile il pc da remoto disabilitatelo
Solitamente in un sistema GNU/Linux è possibile usufruire di più console accessibili tramite la combinazione di tasti CTRL + ALT + Fx.
Di base Debian ne attiva 6 testuali ed una dove eseguirà il server grafico ma difficilmente un utente desktop avrà bisogno di 6 console grafiche. A tal proposito può essere utile lasciare abilitate esclusivamente la console con il server grafico ed un unica console testuale utile per eventuali assistenze tecniche.
Editiamo il file /etc/inittab e commentiamo le seguenti righe:
1:2345:respawn:/sbin/getty 38400 tty1
#2:23:respawn:/sbin/getty 38400 tty2
#3:23:respawn:/sbin/getty 38400 tty3
#4:23:respawn:/sbin/getty 38400 tty4
#5:23:respawn:/sbin/getty 38400 tty5
#6:23:respawn:/sbin/getty 38400 tty6
Sysvinit avvia un demone solo quando quello precedente segnala che il suo startup è avvenuto con successo. Modificando opportunamente I file di configurazione possiamo istruire init affinche avvii I demoni direttamente senza aspettare risposta dal demone precedente.
Alcuni demoni durante la fase di avvio necessitano di essere eseguiti in una shell; di default la shell utilizzata sia per l’avvio che per gli utenti è BASH (Bourne Again SHell), la più diffusa e completa del mondo Linux. Utilizzare uno strumento tanto potente solo per fornire un ambiente di esecuzione ai demoni risulta però controproducente; può essere quindi più indicato installare e settare come shell di default DASH, uno strumento più modesto ma che fa comunque il suo lavoro.
$dpkg-reconfigure dash
A questo punto il link /bin/sh punterà a /bin/dash di conseguenza quest’ultima verrà usata in fase d’avvio. Questa operazione non dovrebbe comunque intaccare le potenzialità della shell usata dall’utente in quanto quest’ultima è indicata nel file /etc/passwd
[pagebreak]
All’avvio il sistema controlla il file /etc/network/interfaces per sapere come gestire le interfacce di rete, se non settato corretamente il sistema all’avvio potrebbe cercare di richiedere I parametri di rete per un’ipotetica interfaccia ethernet scollegata. A tal proposito il mio consiglio è quello di istruire il sistema affinche all’avvio configuri automaticamente solo l’interfaccia di loopback.
Editare il file /etc/network/interfaces nel seguente modo:
# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).
# The loopback network interface
auto lo
iface lo inet loopback
#Wired Interface
#
#DHCP(default)
iface eth0 inet dhcp
Analizzando gli script dei demoni presenti in /etc/init.d ci accorgiamo che sulla testa di ognuno di essi sono specificate, attraverso alcuni commenti, le dipendenze di ogni demone rispetto ad altri. Tali commenti non sono interpretati da init che avvia I demoni basandosi sui numeri interi specificati nel nome dello script (vd. /etc/rc2.d/).
Accade quindi che init avvia un demone che spreca cicli CPU attendendo l’avvio del demone dal quale dipende.
Esistono sistemi alternativi a sysv-init che si basano sulle dipendenze dei demoni (initNG) o sugli eventi da essi generati (Upstart di Ubuntu) ma il nostro intento è quello di configurare in modo ottimale sysv-init che è lo standard de facto.
Sarebbe quindi utile analizzare le dipendenze dei demoni e cambiare I numeri interi in modo da ordinare la fase di boot; fortunatamente l’utility InsServ lo fa al posto nostro:
$dpkg-reconfigure insserv
Eccoci alla fine.
Riavviamo il PC e rianalizziamo l’output di bootchart -f png
