Capitolo 4. I processi
4.2. Processo d'avvio, init e shutdown
4.2.1. Introduzione
Uno dei più potenti aspetti di Linux riguarda il suo metodo aperto di avviare e chiudere il sistema
operativo, dove carica specifici programmi utilizzando le loro particolari configurazioni, vi
permette di cambiare tali configurazioni per controllare il processo d'avvio e chiude in un modo
pulito ed organizzato.
Oltre alla questione del controllo del processo d'avvio o di chiusura, la natura aperta di Linux rende
più semplice determinare la fonte esatta di molti problemi associati agli stessi. Una infarinatura di
questi processi è abbastanza utile per chiunque utilizzi un sistema Linux.
Molte macchine Linux adoperano lilo, il LInux LOader, per avviare il sistema operativo. Noi
tratteremo comunque solo di GRUB che è più facile da usare e maggiormente flessibile. Se avete
bisogno di informazioni su lilo, potete riferirvi alle pagine man e agli HOWTO. Entrambi i sistemi
supportano installazioni in dual boot (faremo riferimento agli HOWTO su questo argomento per
esempi pratici e informazioni di fondo).
4.2.2. Il processo di avvio
Quando si avvia un computer x86, il processore ricerca il BIOS (Basic Input/Output System) alla
fine della memoria di sistema e lo esegue. Normalmente quest'ultimo controlla il lettore dei floppy
(o il CDROM in molti dei sistemi più recenti) alla ricerca di un supporto avviabile, se presente, e
successivamente cerca nel disco rigido. L'ordine delle periferiche usate per il cosiddetto boot di
solito è controllato da una specifica impostazione del BIOS di sistema. Una volta installato Linux
nel disco rigido di un computer, il BIOS cerca un Master Boot Record (MBR) posizionato nel
primo settore del primo disco fisso, carica il suo contenuto in memoria e poi gli passa il controllo.
Questo MBR contiene istruzioni su come caricare il bootloader GRUB (o LILO), che usa un
sistema operativo preselezionato. Quindi MBR carica il bootloader, il quale assume a sua volta il
controllo del processo (se, naturalmente, il bootloader è installato in MBR). Nella configurazione
base di Red Hat Linux GRUB usa le impostazioni contenute in MBR per mostrare in un menu le
opzioni di avvio. Una volta che GRUB ha ricevuto le corrette istruzioni per il sistema operativo da
far partire (sia dalla sua linea di comando che dal file di configurazione), esso trova il file di boot
necessario e lascia il controllo della macchina a quel sistema operativo.
4.2.3. Caratteristiche di GRUB
Questo metodo di avvio è detto caricamento diretto (direct loading) perché sono usate delle
istruzioni per avviare direttamente il sistema operativo, senza codice intermedio tra i bootloader e i
principali file del sistema operativo (come il kernel). Il processo di boot impiegato da altri sistemi
operativi può comunque differire leggermente da quello sopra descritto. Per esempio, i sistemi
operativi Microsoft DOS e Windows sovrascrivono qualsiasi cosa in MBR quando vengono
installati senza incorporare alcunché della precedente configurazione di MBR: ciò distrugge ogni
altra informazione scritta in MBR da altri sistemi operativi, come ad esempio Linux. I sistemi
operativi Microsoft, come anche vari altri sistemi operativi proprietari, vengono caricati con un
metodo di avvio a caricamento in catena (chain loading boot method). Con questo metodo MBR
punta al primo settore della partizione contenente il sistema operativo, dove trova i file speciali
necessari per avviare effettivamente tale sistema operativo.
GRUB supporta entrambi i metodi di boot, consentendovi di utilizzarlo con quasi tutti i sistemi
operativi, con molti file system e qualsiasi disco fisso riconosciuto dal vostro BIOS.
GRUB possiede numerose altre caratteristiche tra cui (le più importanti):
●GRUB fornisce un vero ambiente preSistema Operativo, basato su comandi, per
macchine x86 che consente la massima flessibilità nel caricare sistemi operativi con
certe opzioni o nel raccogliere informazioni sul sistema.
●GRUB supporta la modalità di indirizzamento logico dei blocchi (LBA o Logical
block Addressing), necessaria per accedere a molti dischi fissi IDE e a tutti quelli
SCSI. Prima di LBA i dischi fissi potevano andare incontro al limite del cilindro
1024 oltre al quale il BIOS poteva non trovare un file.
●Il file di configurazione di GRUB viene letto dal disco ogni volta che il sistema si
avvia, evitandovi di dover scrivere nel MBR tutte le volte che cambiate le opzioni di
boot.
Una descrizione completa di GRUB si può avere con il comando info grub oppure nel sito di
GRUB. Il Progetto di Documentazione Linux ha il Multiboot with GRUB MiniHOWTO.
4.2.4. Init
Il kernel, dopo essere stato caricato, trova init in sbin e lo esegue.
Quando parte init, esso diviene il genitore o il nonno di tutti i processi che si avviano
automaticamente nel vostro sistema Linux. La prima cosa che init fa è leggere il suo file di
inizializzazione, /etc/inittab. Quest'ultimo istruisce init a leggere uno script iniziale di
configurazione dell'ambiente che imposta il path, avvia lo swapping, controlla i file system, e così
via. Fondamentalmente questa fase si cura di tutte le cose di cui ha bisogno il vostro sistema al
momento della inizializzazione: impostare l'orologio, inizializzare le porte seriali, ecc.
Poi init continua la lettura del file /etc/inittab che descrive come il sistema dovrebbe essere
impostato in ciascun run level (livello di esecuzione o avvio) e seleziona quello di partenza. Un run
level è una configurazione di processi. Tutti i sistemi similUNIX possono essere avviati con
diverse configurazioni di processi, come la modalità utente singolo, che viene definita come run
level 1 o S (o s). In questa modalità solo l'amministratore di sistema può connettersi al sistema:
viene utilizzata per attività di manutenzione senza rischi di danni al sistema o ai dati degli utenti.
Naturalmente con questa configurazione non abbiamo bisogno di offrire servizi di utente, cosicché
essi saranno tutti disabilitati. Un altro run level è quello di reboot (o run level 6) che termina tutto i
servizi attivi seguendo le appropriate procedure e poi riavvia il sistema.
Usate who per controllare qual'è il vostro attuale livello d'esecuzione:
willy@ubuntu:~$ who -r run-level 2 2006-10-17 23:22 last=SDi più sui livelli di esecuzione [run level] nella prossima sezione (v. Sezione 4.2.5).
Dopo aver stabilito l'iniziale livello di esecuzione per il vostro sistema, init lancia tutti i processi di
background necessari per far girare il sistema cercando nella directory rc specifica di quel run
level. init avvia ogni script killer (i loro nomi di file iniziano con K) con un parametro di stop.
Dopo fa girare tutti gli script di partenza (i loro nomi di file iniziano con S, cioè Start) contenuti
nella directory del corrispondente livello di avvio in modo che tutti i servizi e le applicazioni
vengano lanciate correttamente. Di fatto, dopo che il sistema ha terminato l'avvio, potete eseguire
manualmente questi stessi script con un comando tipo /etc/init.d/httpd stop o service httpd
stop connessi come root (fermando in questo caso il web server).
Caso speciale
normalmente. In questo caso, nessun servizio viene fermato (almeno non
permanentemente). Ci sono solo servizi che vengono attivati.
Nessuno degli script che normalmente avviano e fermano i servizi sono collocati in
/etc/rc<x>.d. Piuttosto tutti i file in /etc/rc<x>.d sono collegamenti simbolici che
puntano agli script reali posizionati in /etc/init.d. Un collegamento simbolico non è altro se
non un file che punta ad un altro file ed in tal caso è utilizzato perché può essere creato ed eliminato
senza influire sugli script reali che uccidono o avviano i servizi. I collegamenti simbolici a vari
script sono numerati in un ordine particolare che determina la sequenza di avvio. Potete cambiare
l'ordine con cui si avviano e si uccidono i servizi modificando il nome del collegamento simbolico
che si riferisce allo script che realmente controlla lo script. Potete utilizzare lo stesso numero più
volte se volete che un particolare servizio sia fermato o avviato prima o dopo di un altro, come
nell'esempio seguente che elenca il contenuto di /etc/rc5.d, directory in cui crond e xfs sono
entrambi avviati da un nome di link che inizia per “S90”. In questo caso gli script vengono avviati
in ordine alfabetico.
[jean@blub /etc/rc5.d] ls
K15httpd@ K45named@ S08ipchains@ S25netfs@ S85gpm@ K16rarpd@ K46radvd@ S08iptables@ S26apmd@ S90crond@ K20nfs@ K61ldap@ S09isdn@ S28autofs@ S90xfs@ K20rstatd@ K65identd@ S10network@ S30nscd@ S95anacron@ K20rusersd@ K74ntpd@ S12syslog@ S55sshd@ S95atd@ K20rwalld@ K74ypserv@ S13portmap@ S56rawdevices@ S97rhnsd@ K20rwhod@ K74ypxfrd@ S14nfslock@ S56xinetd@ S99local@ K25squid@ K89bcm5820@ S17keytable@ S60lpd@
K34yppasswdd@ S05kudzu@ S20random@ S80sendmail@
Dopo che init è passato per i livelli di avvio fino a raggiungere quello predefinito, lo script
/etc/inittab biforca un processo getty per ciascuna console virtuale (richiesta di login in
modo testo). getty apre linee tty, imposta le loro modalità, presenta la richiesta di login, ottiene il
nome utente e poi dà inizio al processo di connessione di quell'utente, Tutto ciò consente agli utenti
di autenticarsi nel sistema e di usarlo. Per definizione, molti sistemi offrono sei console virtuali, ma,
come potete riscontrare nel file inittab, ciò è configurabile.
/etc/inittab può anche dire a init come gestire la pressione da parte dell'utente dei tasti
Ctrl+Alt+Del nella console. Siccome il sistema dovrebbe essere spento e riavviato con le dovute
maniere piuttosto che con l'immediato spegnimento dell'energia elettrica, a init viene detto di
eseguire il comando /sbin/shutdown -t3 -r now, per esempio, quando l'utente preme quei tasti.
In aggiunta, /etc/inittab stabilisce cosa init deve fare in caso di interruzione
dell'alimentazione se il vostro sistema è dotato di unità UPS.
In molti sistemi basati su RPM la videata grafica di login viene avviata nel run level 5, quando
/etc/inittab avvia lo script /etc/X11/prefdm. Tale script lancia il gestore dello schermo
(display manager) di X preferito, basato sui contenuti della directory
/etc/sysconfig/desktop. Normalmente si tratta di gdm se lanciate GNOME o di kdm se
invece avviate KDE, ma essi possono essere combinati e c'è pure xdm che fa parte dell'installazione
standard di X.
gestori di schermo e il contenuto di /etc/X11/default-display-manager viene usato per
stabilire quale di questi avviare. E' possibile leggere qualcosa di più sull'interfaccia grafica nella
Sezione 7.3. Per finire, la documentazione di sistema spiegherà dettagliatamente gli aspetti di più
alto livello di init.
Le directory /etc/default e/o /etc/sysconfig contengono dati su una serie di funzioni e
servizi che vengono letti al momento del boot. La posizione della directory contenente le
impostazioni di base potrebbe essere in qualche modo diversa a seconda della vostra distribuzione
Linux.
Oltre l'ambiente grafico dell'utente, anche una grande quantità di altri servizi può essere avviata. Se
tutto procede per il meglio, dovreste vedere una richiesta di autenticazione o una schermata di login
al termine del processo di boot.
Altre procedure
Abbiamo spiegato come init SysV opera nei computer basati su x86. Le procedure di
avvio possono variare a seconda delle architetture e delle distribuzioni. Altri sistemi
usano init stile BSD in cui i file di avvio non sono suddivisi in molteplici directory
/etc/rc<LIVELLO>. E' anche possibile che il vostro sistema usi
/etc/rc.d/init.d al posto di /etc/init.d.
4.2.5. I livelli di esecuzione di init
L'idea base dei differenti servizi operanti nei diversi livelli di esecuzione (o run level) è fondata sul
concetto che sistemi diversi possono essere utilizzati in modi diversi. Non si usano certi servizi fino
a che il sistema non si trovi in uno stato (o modo) particolare come, ad esempio, quando è
disponibile per più utenti o per il collegamento in rete.
Esistono occasioni in cui potreste voler usare il sistema in una modalità di livello più basso. Esempi
sono la sistemazione dei problemi di corruzione dei dischi a livello 1, in modo che nessun altro
utente si trovi nel sistema, oppure il lasciare un server nel livello di esecuzione 3 senza una sessione
di X in funzione. In questi casi non ha senso far girare servizi che dipendono da una modalità di
sistema più alta in quanto, comunque, non lavorerebbero correttamente. Avendo già assegnato a
ciascun servizio di avviarsi quando si è raggiunto il suo specifico livello di esecuzione, voi garantite
un ordinato processo di avvio e potete rapidamente cambiare la modalità della macchina senza
preoccuparvi di quale servizio avviare o terminare manualmente.
I livelli di esecuzione disponibili si trovano generalmente descritti in /etc/inittab, che vi
mostriamo parzialmente qui di seguito:
#
# inittab This file describes how the INIT process should set up # the system in a certain run-level.
# Default runlevel. The run levels are:
# 0 - halt (Do NOT set initdefault to this) # 1 - Single user mode
# (The same as 3, if you do not have networking) # 3 - Full multiuser mode
# 4 - unused # 5 - X11
# 6 - reboot (Do NOT set initdefault to this) # id:5:initdefault: <--cut-->