%--------------------------------------------------------------------
\chapter{Avvii e shutdown}
\label{ch:boothalt}
%--------------------------------------------------------------------

        \begin{chapterquote}
Start me up \\
Ah\dots you've got to\dots you've got to \\
Never, never never stop \\
Start it up \\
Ah\dots start it up, never, never, never \\
\ You make a grown man cry, \\
\ \ you make a grown man cry \\
(Rolling Stones) \\
% \ \\
% These boots are made for walking, \\
% and that's what they're gonna do. \\
% One of these days, these boots \\
% are gonna walk all over you. \\
        \end{chapterquote}
\index{Windows 95|see{piangere}}
\index{piangere}

        \noindent
	Questa sezione spiega cosa succede quando viene avviato e spento un sistema Linux, e qual'è la maniera esatta di farlo. Se non si seguono le procedure esatte si possono corrompere o perdere dei file.

	
\section{Introduzione agli avvii e agli shutdown}

	L'atto di accendere un computer e caricare il suo sistema operativo\footnote{Sui primi computer non era sufficiente accendere, ma bisognava caricare a mano il sistema operativo. Questi attrezzi moderni fanno tutto da soli.} si chiama \defin{booting}, o \defin{avvio del computer}. Il nome proviene da un immagine del computer che si tira su dai nastri di partenza (bootstrap), ma l'atto in sé è leggermente più realistico. 
\index{booting}
\index{avvio del computer}
\index{accendere il computer}

	Durante il bootstrap, il computer per prima cosa carica una piccola parte di codice, il \defin{bootstrap loader}, che a sua volta carica ed avvia il sistema operativo. Il boostrap loader di solito viene immagazzinato in una posizione fissa sull'hard disk o su un floppy. La ragione per cui avviene questo processo a due fasi è che il sistema operativo è grosso e complicato, ma la prima parte di codice che viene caricata dal computer deve essere molto piccola (poche centinaia di byte) per evitare di includere grandi parti di codice fisso nell'hardware. 
\index{bootstrap loader}

	Computer diversi hanno processi di bootstrap diversi. Per i PC, il computer (il suo BIOS) legge il primo settore (il \defin{settore di boot}) del floppy o dell'hard disk, che contiene il bootstrap loader, e carica il sistema operativo da qualche altro punto del disco (o da qualche altra parte).
\index{settore di boot}

	Dopo l'avvio di Linux, inizializza l'hardware e i device driver, e poi avvia \cmd{init}. \cmd{init} inizializza altri processi per permettere agli utenti di collegarsi e fare altre cose. I dettagli di questa parte saranno discussi più avanti.

	Per spegnere un sistema Linux, per prima cosa viene detto a tutti i processi di terminarsi (li fa chiudere i file che avevano aperto, e fare altre cose per mantenere pulito il filesystem), poi viene fatto l'unmount dei filesystem e delle aree di swap, e infine viene stampato un messaggio sulla console che avvisa che si può togliere la corrente. Se non viene seguita la procedura, possono accadere cose terribili: la cosa più importante che può succedere è che la cache di buffer non venga svuotata, il che significa che tutti i dati in esso contenuti sono persi e che il filesystem sul disco è inconsistente, e quindi forse inutilizzabile.
\index{cache di buffer}
\index{perdita dei dati}

\section{Il processo di boot più da vicino}
\label{sec:boot-closeup}

	Si può avviare Linux sia da un floppy che dall'hard disk. La sezione sull'installazione nella guida Installation and Getting Started (\cite{getting-started}) vi spiega come installare Linux in modo da poterlo avviare nel modo che volete.

Al boot di un PC, il BIOS fa vari test per controllare che tutto sia a posto,\footnote{Questo processo si chiama \defin{power on self test}, o \defin{POST}, cioè ``auto-test di avvio''.} e poi inizia il vero boot: sceglie un disco (tipicamente il primo floppy, se ce n'è uno inserito, oppure il primo hard disk, se nel computer ce ne è installato uno, ma l'ordine può essere cambiato) e legge il suo primo settore, che si chiama \defin{master boot sector} (``settore principale di boot''); per un hard disk si chiama anche \defin{master boot record}, dato che un hard disk può contenere diverse partizioni, ciascuna con il proprio settore di boot.
\index{BIOS}
\index{master boot record}
\index{MBR}
\index{boot record della partizione}
\index{boot record!master|see{MBR}}
\index{boot record!partizione|see{boot record della partizione}}

	Il settore di boot contiene un piccolo programma (abbastanza piccolo da entrare in un singolo settore) la cui responsabilità è di leggere il vero sistema operativo dall'hard disk ed avviarlo. Quando si avvia Linux da un floppy disk, il settore di boot contiene del codice che legge semplicemente le prime centinaia di blocchi (a seconda della reale grandezza del kernel, naturalmente) in un punto predeterminato della memoria. Su un floppy di boot di Linux non c'è un filesystem, ma il kernel è semplicemente immagazzinato in settori consecutivi, dato che questo semplifica il processo di boot. \`E possibile, comunque, fare il boot da floppy con un filesystem, usando LILO, il LInux LOader.
\index{booting!da floppy}
\index{floppy!booting da|see{booting}}

	Quando si fa il boot dall'hard disk, il codice nel master boot record esamina la tabella delle partizioni (anch'essa nel master boot record), identifica la partizione attiva (la partizione che è contrassegnata come quella da cui si può fare il boot), legge il settore di boot di quella partizione e poi inizializza il codice che si trova lì. Il codice nel settore di boot di quella partizione fa la stessa cosa che il settore di boot di un dischetto: legge nel kernel della partizione e lo inizializza. I dettagli cambiano, comunque, dato che di solito non è utile avere una partizione separata solo per l'immagine del kernel, quindi il codice nel settore di boot della partizione non può semplicemente leggere il disco in maniera sequenziale, ma deve trovare i settori dove li ha messi il filesystem. Ci sono diversi modi per aggirare il problema, ma il più comune è usare LILO (i dettagli sul suo utilizzo sono irilevanti per questa discussione: vedere la documentazione di LILO per altre informazioni; è molto accurata).
\index{boot!dall'hard disk}
\index{hard disk!boot da|see{booting}}
\index{tabella delle partizioni}
\index{partizione attiva}
\index{LILO}

	Quando si fa il boot con LILO, normalmente il computer passa direttamente alla lettura e al caricamento del kernel di default. \`E anche possibile configurare LILO per poter scegliere il kernel da caricare tra un elenco, o anche per caricare sistemi diversi da Linux, ed \`e possibile scegliere quale kernel o sistema operativo avviare al momento del boot. LILO pu\`o essere configurato in modo che se si tiene premuto \key{alt}, \key{shift} o \key{ctrl} al momento del boot (quando si carica LILO), LILO chieda quale sistema avviare, con un tempo massimo configurabile dopo il quale avvia il kernel di default.

	Con LILO, \`e anche possibile dare un \defin{argomento da linea di comando per il kernel}, dopo il nome del kernel o del sistema operativo.
	
	\meta Esistono altri boot loader oltre a LILO. Nelle versioni future verranno aggiunte informazioni su questo argomento. loadlin.

	Sia il boot da floppy che quello da hard disk hanno i loro vantaggi, ma in genere fare il boot da hard disk \`e pi\`u comodo, dato che evita la noia di dover maneggiare i floppy. \`E anche pi\`u veloce; comunque, configurare il sistema in modo che faccia il boot da disco fisso pu\`o essere pi\`u problematico, quindi molti prima installano il sistema in modo che faccia il boot dal floppy, e poi, quando il sistema è installato e funzionante, installano LILO e cominciano a fare il boot dall'hard disk.

	Dopo che il kernel di Linux è stato caricato in memoria, in qualsiasi modo questo accada, ed è stato avviato, succede più o meno questo:

    \begin{itemize}

    \item

	Il kernel di Linux è installato compresso, quindi per prima cosa si decomprime. L'inizio dell'immagine del kernel contiene un programmino che fa proprio questo.
\index{compressione del kernel}

    \item

	Se avete una scheda super-VGA che viene riconosciuta da Linux e che ha delle modalità di testo speciali (ad esempio 100 colonne per 40 linee), Linux vi chiede quale modalità volete usare. In fase di compilazione del kernel è possibile preimpostare una modalità video, in modo che non vi venga posta questa domanda. La stessa cosa si può anche fare con LILO o \cmd{rdev}.
\index{scheda video}
\index{configurazione del kernel}
\index{modalità video}
\index{modalità testuale}

    \item

	Dopo ciò, il kernel controlla quale altro hardware è presente (hard disk, floppy, schede di rete\ldots) e configura alcuni dei dispositivi; mentre lo fa, manda in output dei messaggi su quello che trova. Ad esempio, all'avvio del mio computer vedo una cosa del genere:
\index{configurazione dell'hardware}
\index{configurazione dei device driver}
\index{messaggi di avvio}
\index{boot!messaggi}

	\begin{screen}\begin{verbatim}
LILO boot:
Loading linux.
Console: colour EGA+ 80x25, 8 virtual consoles
Serial driver version 3.94 with no serial options enabled
tty00 at 0x03f8 (irq = 4) is a 16450
tty01 at 0x02f8 (irq = 3) is a 16450
lp_init: lp1 exists (0), using polling driver
Memory: 7332k/8192k available (300k kernel code, 384k reserved, 176k data)
Floppy drive(s): fd0 is 1.44M, fd1 is 1.2M
Loopback device init
Warning WD8013 board not found at i/o = 280.
Math coprocessor using irq13 error reporting.
Partition check:
  hda: hda1 hda2 hda3
VFS: Mounted root (ext filesystem).
Linux version 0.99.pl9-1 (root@haven) 05/01/93 14:12:20
		\end{verbatim}\end{screen}
%%%%%%%%
	Il testo esatto è diverso su sistemi diversi, e cambia a seconda dell'hardware, della versione di Linux che si sta usando, e di come è configurata.

   \item

	A questo punto il kernel prova a montare il filesystem di root. Il punto in cui lo va a cercare è configurabile al momento del boot o in qualsiasi momento usando \cmd{rdev} o LILO. Il tipo di filesystem viene individuato automaticamente. Se per qualche motivo non si riesce a montare il filesystem di root, ad esempio perché non vi siete ricordati di inserire il driver corrispondente nel kernel, si ha un kernel panic e il sistema si blocca (non c'è molto che potrebbe fare, comunque).
\index{filesystem root}
\index{filesystem!root}
\index{montare!filesystem di root}
\index{LILO}
\index{kernel panic}
\index{panic}

	Il filesystem root di solito viene montato in modalità a sola lettura (si può configurare nello stesso modo che per la partizione da montare): ciò rende possibile controllare il filesystem mentre lo si monta; non è una buona idea controllare un filesystem montato in modalità lettura-scrittura.
\index{filesystem root a sola lettura}
\index{controllo di un filesystem}
\index{fsck}

    \item

	Dopo ciò, il kernel inizializza il programma \cmd{init} (che si trova in \fn{/sbin/init}) in background (diventerà sempre il processo numero 1). \cmd{init} ha vari compiti all'avvio: cosa fa di preciso dipende da come è configurato, vedere il capitolo~\ref{ch:init} per altre informazioni. Di sicuro inizializzerà alcuni demoni in background.
\index{demoni!inizializzazione}

    \item

	\cmd{init} poi passa in modalità multi-utente, ed inizializza una \cmd{getty} per le console virtuali e le linee seriali. \cmd{getty} è il programma che permette agli utenti di collegarsi attraverso le console virtuali ed i terminali seriali. \cmd{init} può anche inizializzare altri programmi, a seconda di come è stato configurato.
\index{console virtuale}
\index{console}
\index{terminale}
\index{terminali seriali}

    \item

	A questo punto, il boot è completo, ed il sistema sta funzionando normalmente. 

    \end{itemize}

\section{Ancora sullo shutdown}

	\`E importante seguire le procedure corrette quando si spenge un sistema Linux. Se non lo fate, il filesystem probabilmente si corromperà e i file diventeranno illeggibili. Questo perché Linux utilizza una cache su disco, che non scrive sul disco tutto insieme, ma solo ad intervalli; un comportamento del genere migliora moltissimo la performance, ma sta anche a significare che se spengete semplicemente il computer d'improvviso la cache può contenere molti dati, e quello che si trova sul disco può non essere un filesystem che funziona perfettamente (perché solo alcune cose sarebbero scritte sul disco).
\index{spegnere il computer}
\index{cache di buffer}
\index{cache}
\index{cache del disco}

Un'altra ragione per non spengere direttamente l'interruttore è che in un sistema multitasking ci possono essere molti processi attivi in background, e interrompere l'alimentazione può essere piuttosto disastroso. Usando la corretta sequenza di shutdown vi assicurate che tutti i processi in background possano salvare i propri dati.
\index{processi in background!e spegnimento del computer}

	Il comando per spengere correttamente un sistema Linux è \cmd{shutdown}. Normalmente può essere usato in due modi.
\index{shutdown!usando}

	Se vi trovate su un sistema dove siete l'unico utente, il modo normale di usare \cmd{shutdown} è uscire da tutti i programmi, scollegarsi da tutte le console virtuali, collegarsi come \texttt{root} su una di esse (o restare collegati come \texttt{root} se già lo siete, ma dovreste passare nella directory root, per evitare problemi nell'unmount dei filesystem) e dare il comando
	\texttt{shutdown~-h~now}\index{shutdown}
	(sostituite \texttt{now} con un segno + ed un numero di minuti se volete un ritardo, anche se di solito non è questo il caso in un sistema monoutente).

	In alternativa, se il vostro sistema ha molti utenti, usate il comando 
	\texttt{shutdown~-h~\textsl{+tempo messaggio}}, dove \textsl{tempo} 
	è il tempo in minuti prima  che il sistema venga fermato, e \textsl{message} è una breve spiegazione del perché il sistema viene spento.
		%
\begin{tscreen}
\# shutdown -h +10 'Installeremo un nuovo disco. Il sistema \\
> dovrebbe tornare in linea in tre ore.'\\
\#
\end{tscreen}
		%
	In questo modo tutti verranno avvertiti che il sistema si fermerà tra dieci minuti, e che è meglio che si scolleghino o perderanno dei dati. L'avviso viene visualizzato su tutti i terminali su cui c'è un utente collegato, inclusi tutti gli \cmd{xterm}:
		%
\begin{tscreen}
Broadcast message from root (ttyp0) Wed Aug  2 01:03:25 1995... \\
\ \\
Installeremo un nuovo disco. Il sistema \\
dovrebbe tornare in linea in tre ore.\\
The system is going DOWN for system halt in 10 minutes !!
\end{tscreen}
		%

	L'avviso viene ripetuto automaticamente alcune volte prima dello spegnimento, ad intervalli sempre più brevi.
\index{messaggio di shutdown}

	Quando comincia il vero shutdown dopo i vari ritardi, viene fatto l'unmount di tutti i filesystem (eccetto quello di root), i processi utente (se qualcuno è ancora collegato) vengono uccisi, i demoni vengono fermati, ed in generale tutto si mette a posto. 
	Fatto questo, \cmd{init} stampa un messaggio che indica che potete spengere la macchina. Allora, {\em e solo allora} le vostre dita si possono muovere nella direzione dell'interruttore.
\index{shutdown!azioni di}

	Talvolta, anche se raramente sui buoni sistemi, è impossibile fare lo shutdown in maniera corretta. Ad esempio, se si ha un kernel panic, e il kernel muore, o esplode, o in genere non si comporta come dovrebbe, può essere totalmente impossibile dare nuovi comandi, e quindi è possibile che sia difficile fare bene lo shutdown, e tutto quello che potete fare è sperare che non sia successo niente di grave e spengere il computer. Se i danni sono un po' meno pesanti (ad esempio, qualcuno ha preso ad accettate la vostra tastiera), ed il kernel e il programma \cmd{update} stanno ancora girando normalmente, probabilmente è una buona idea aspettare un paio di minuti e dare la possibilità ad \cmd{update} di svuotare la cache, e solo allora spengere il computer.
\index{crash}
\index{crash di sistema}
\index{shutdown!emergenza}
\index{shutdown improprio|see{shutdown, emergenza}}
\index{accetta}
\index{cache di buffer}

	Alcuni per fare lo shutdown usano il comando \cmd{sync}\footnote{\cmd{sync} svuota la cache di buffer.} tre volte, aspettare che l'I/O del disco sia finito, e spengere il computer. Se non ci sono programmi attivi, è praticamente la stessa cosa che usare \cmd{shutdown}, ma non fa l'unmount dei filesystem, e ciò può provocare dei problemi con il flag dell'ext2fs di ``filesystem pulito''. Il metodo del sync triplo \emph{non è raccomandato}.
\index{shutdown!triplo sync}

	(In caso ve lo stiate chiedendo, la ragione per \emph{tre} sync è che nei primi UNIX, quando i comandi venivano digitati singolarmente, tre sync dava di solito tempo sufficiente a finire qualsiasi I/O del disco.)

\section{Il reboot}

	Fare il reboot significa avviare di nuovo il sistema, e si può ottenere facendo shutdown, togliendo la corrente e poi rimettendola. Un metodo più semplice è chiedere a \cmd{shutdown} di fare così, invece di spengere soltanto. Lo si può fare usando l'opzione \texttt{-r} di shutdown, ad esempio dando il comando \texttt{shutdown -r now}.
\index{reboot}
	
	La maggior parte dei sistemi Linux fanno \texttt{shutdown -r now} quando si preme ctrl-alt-canc sulla tastiera, in modo da riavviare il sistema. L'azione di ctrl-alt-canc è però configurabile, e spesso è preferibile inserire un ritardo in sistemi multiutente. Per sistemi accessibili a chiunque si può configurare ctrl-alt-canc in modo che non abbia nessun uso.
\index{ctrl-alt-del}
\index{init!e ctrl-alt-del}

\section{Modalità utente singolo}

	Il comando \cmd{shutdown} può anche essere usato per passare il sistema in modalità utente singolo, in modo che nessuno possa collegarsi, tranne \texttt{root} che può usare la console. \`E utile per i compiti di amministrazione di sistema che non possono essere fatti mentre il sistema funziona normalmente. La modalità utente singolo è discussa più a fondo nel capitolo~\ref{chap:daemons} (non è stato ancora scritto).
\index{modalità utente singolo}
\index{init!modalità utente singolo}

\section{Emergency boot floppies}

	Non è sempre possibile fare il boot di un computer dall'hard disk. Ad esempio, se vi siete sbagliati nella configurazione di LILO, potete rendere inaccessibile il vostro sistema. Per situazioni come questa avete bisogno di un modo alternativo di fare il boot, che sia sempre possibile (almeno finché funziona l'hardware). Per i PC tipici si usa il boot dal dischetto.
\index{boot!dal floppy di emergenza}
\index{drive del floppy}

	La maggior parte delle distribuzioni di Linux permettono di creare un \defin{dischetto di emergenza} durante l'installazione. \'E una buona idea farlo, ma alcuni di questi dischetti contengono solo il kernel, ed assumono che usiate i programmi nei dischetti di installazione della distibuzione per risolvere qualsiasi problema abbiate. Talvolta questi programmi non sono sufficienti: ad esempio, potreste voler recuperare dei file da backup fatti con software non presente nei dischetti di installazione.
\index{backup}
\index{dischetti di installazione}
\index{floppy di emergenza!uso}

	\`E quindi possibile che sia necessario creare un dischetto di root personalizzato. Il \emph{Bootdisk HOWTO} di Graham Chapman (\cite{bootdisk-howto}) contiene le istruzioni per farlo. Dovete naturalmente ricordarvi di mantenere aggiornati i vostri dischetti di boot e di root di emergenza.
\index{floppy di emergenza!creazione}

	Non potete usare il drive dei floppy che usate per montare il floppy di root per altre cose. Può essere un inconveniente se avete un solo drive. Comunque, se avete memoria sufficiente, potete configurare il floppy di boot in modo che carichi il disco di root in un ramdisk (il kernel di boot del floppy deve essere configurato appositamente per questo).
	Una volta caricato in ramdisk il floppy di root, il drive dei floppy è libero e può essere usato per montare altri dischetti.
\index{ramdisk}
