Nelle pagine precedenti abbiamo visto come sia gestito l'avvio del sistema, ma forse qualcuno si sarà già chiesto: e adesso come lo spengo? Con Windows si è abituati ad utilizzare il tasto "Avvio" anche per le operazioni di shutdown e reboot (anche se utilizzare un tasto che si chiama "Avvio" per spegnere fa quantomeno sorridere!!), mentre con Linux le cose si fanno diverse.
Tralasciamo le distribuzioni super-grafiche che, utilizzando solo ed esclusivamente l'ambiente grafico, permettono di avere dei pulsanti per lo spegnimento ed il reboot del sistema. Concentriamoci invece su come effettivamente si possa spegnere il sistema.
Non crederete che si possa fare in una maniera sola, no? :-)
Di norma, esistono i comandi halt e reboot che, rispettivamente, spengono il sistema e lo riavviano. Oltre a questi, comunque, esistono altre alternative. Ad esempio si può optare per il comando shutdown che, con le opzioni -r oppure -f esegue un reboot o uno shutdown.
E non è ancora finita! Se ricordate, parlando di init, abbiamo parlati dei runlevel: ricordate a cosa corrispondevano il runlevel 0 e 6? In effetti, lanciando
init 0
eseguiremo uno shutdown del sistema, mentre con
init 6
verrà avviato il reboot della macchina.
Un altro metodo consiste nel premere la combinazione di tasti Ctrl+Alt+Canc, sempre che il nostro sistema sia configurato per questa azione. Andate a leggere il file /etc/inittab: se trovate una riga del tipo:
ca:12345:ctrlaltdel:/sbin/shutdown -h now
con la combinazione sopra citata eseguiremo uno shutdown; se invece leggiamo:
ca:12345:ctrlaltdel:/sbin/shutdown -r now
tale combinazione di tasti eseguiremo un reboot!
Così come abbiamo esaminato cosa succede al boot, vediamo cosa invece accade durante lo shutdown.
Una volta invocato il comando che spegne o reboota la macchina, verrà prima di tutto inviato un messaggio a tutti gli utenti del tipo:
Broadcast message from root (tty3) Wed May 9 22:11:37 2001...
The system is going down for (reboot|shutdown) now
(dove trovano posto, ovviamente, solamente la voce reboot o shutdown!) A questo punto, il login viene disattivato e viene richiamato nuovamente init che porta il sistema a runlevel 0 (per lo shutdown) o 6 (per il reboot).
In seguito, init fermerà tutti i servizi attivi nella macchina andando ad eseguire, come abbiamo visto, gli script in /etc/rc0.d o /etc/rc6.d: per ogni servizio interrotto, il sistema ci avvertirà con una riga del tipo:
Stopping MySQL database server: mysql.
Una volta che tutti i servizi sono stati interrotti, init manda dei segnali ai processi eventualmente ancora attivi (pensate, ad esempio, se un utente stava utilizzando un browser): in prima battuta, viene inviato un SIGTERM, che si limita a terminare i processi attivi; se alcuni riescano a "resistere" a questo segnale, viene inviato un SIGKILL, che letteralmente "ammazza" ogni processo ancora in esecuzione.
Per terminare l'operazione di reboot/shutdown, init si dedica a quanto relativo alla rete: rilascia infatti gli eventuali filesystem di rete montati e deconfigura le interfacce di rete (ad esempio le schede Ethernet). Dopo di questo esegue le operazioni finali: disattiva la swap e smonta il filesystem principale.
A questo punto, il sistema viene riavviato oppure arrestato ed è possibile staccarlo fisicamente dalla rete elettrica senza che questo comporti la corruzione del filesystem.
Con questo breve capitolo abbiamo terminato la prima overview generale del sistema, e ci concentreremo (finalmente, diranno alcuni!) alla gestione del sistema.