• Non ci sono risultati.

Processo d'avvio, init e shutdown

Nel documento Introduzione a Linux (pagine 102-108)

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 CD­ROM 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 boot­loader GRUB (o LILO), che usa un 

sistema operativo preselezionato. Quindi MBR carica il boot­loader, il quale assume a sua volta il 

controllo del processo (se, naturalmente, il boot­loader è 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 boot­loader 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 pre­Sistema 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 Mini­HOWTO.

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  simil­UNIX  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=S

Di 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-->

Sentitevi liberi di configurare i run level inutilizzati (comunemente il 4) come meglio vi aggrada. 

Molti utenti configurano questi livelli di esecuzione in modo da ottimizzarli per sé al massimo, 

mentre lasciano  i  livelli di esecuzione 3 e 5 standard. Ciò consente loro di spostarsi rapidamente 

dentro e fuori dalla configurazione personale senza interferire con il normale insieme di funzioni 

dei livelli standard.

Se   il   vostro   computer   cade   in   uno   stato   in   cui   non   può   avviarsi   a   causa   di   un   errato 

/etc/inittab o non vi lascia autenticarvi a causa di un file /etc/passwd corrotto (o se avete 

semplicemente dimenticato la password), fatelo partire nella modalità “utente singolo” (run level 1).

Niente grafica?

Quando   lavorate   in   modalità   grafica   perché   non   avete   avuto   la   richiesta   di 

autenticazione grafica sulla console del vostro computer, di  solito potete passare alla 

console 7 (o maggiore) per ottenere  un login grafico. Se questo non è il vostro caso, 

verificate   il   livello   di   esecuzione   corrente   utilizzando   il   comando  who  -r.   Se   è 

impostato su qualcosa di diverso da quello standard originale da  /etc/inittab, è 

probabile   che   il   sistema   non   si   avvii   nella   normale   modalità   grafica:   in   tal   caso 

contattate l'amministratore di sistema o leggetevi man init. Osservate che il passaggio 

di livello avviene utilizzando preferibilmente il comando telinit: passare da una console 

testuale ad una grafica o viceversa non comporta un cambio di livello di esecuzione.

In questa guida   la trattazione dei  livelli di avvio, script e configurazioni cerca di essere il più 

generica possibile anche se esistono molte differenze. Per esempio, Gentoo Linux conserva gli 

script in /etc/run levels. Altri sistemi potrebbero partire attraverso uno o più livelli minori 

ed eseguire tutti i relativi script prima di arrivare al livello di esecuzione definitivo e di eseguire 

quegli  script. Fate riferimento alla vostra documentazione di sistema per maggiori informazioni. 

Potreste   pure   scorrervi   gli   script   richiamati   da  /etc/inittab  per   acquisire   una   migliore 

comprensione di cosa avviene nel vostro sistema

4.2.5.1. Strumenti

I programmi  di utilità  chkconfig  o  update­rc.d, se installati nel vostro sistema, forniscono un 

semplice   strumento   a   riga   di   comando   per   la   manutenzione   della   gerarchia   della   directory 

/etc/init.d: essi sollevano gli amministratori di sistema dal dover manipolare direttamente i 

numerosi collegamenti simbolici delle directory sotto /etc/rc[x].d.

Inoltre, alcuni  sistemi offrono  lo strumento  ntsysv, che fornisce  un'interfaccia testuale (potrete 

trovare questa più facile da usare dell'interfaccia a riga di comando di chkconfig). Con SuSE Linux, 

avrete gli strumenti yast e insserv. Per la configurazione semplificata di Mandrake, potreste vole 

provare DrakConf, che consente, fra le altre funzionalità, di passare dal livello di esecuzione 3 al 5. 

Con Mandriva questo diventa  il Mandriva Linux Control Center.

Molte distribuzioni offrono un'interfaccia utente grafica per configurare i processi: verificate nella 

vostra documentazione di sistema.

Tutte queste utility devono essere avviate come root. L'amministratore di sistema può anche creare 

manualmente gli appropriati collegamenti in ogni directory di run level per avviare o fermare un 

servizio di un certo livello di esecuzione.

4.2.6. Lo spegnimento

UNIX non è stato creato per essere spento, ma se proprio dovete, utilizzate il comando shutdown. 

Dopo il completamento della procedura di spegnimento, l'opzione -h fermerà il sistema, mentre -r

lo riavvierà.

I comandi  reboot e  halt ora sono capaci di invocare  shutdown se lanciati quando il sistema si 

trova nei livelli di esecuzione da 1 a 5 ­ e così si assicura un corretto spegnimento (shutdown) ­ ma 

si tratta di una pessima abitudine  da acquisire e non tutte le versioni UNIX/Linux hanno questa 

funzionalità.

Se il vostro computer non si spegne da solo, non dovreste farlo fino a che non vedete un messaggio 

che vi indica che il sistema è fermo o che la chiusura non è terminata, per dare tempo al sistema di 

smontare tutte le partizioni. Essere impazienti potrebbe causare una perdita di dati.

Nel documento Introduzione a Linux (pagine 102-108)