Capitolo 3. Compiti di base per l'amministrazione del sistema

 

"Quello che impariamo e conosciamo è, al massimo, molto poco se confrontato con quello che ignoriamo".

 
--Platone, 427-347 AC 

3.1. Avvio della macchina, runlevel e servizi di sistema

Il processo di avvio di una macchina inizia con il caricamento del codice del BIOS di sistema del computer (o PROM sulle architetture Unix) da un indirizzo in memoria conosciuto e fisso. Una volta fatto questo, il BIOS prova ad avviare un codice specificato dall'utente che solitamente è un "bootloader" (la cosa che permette di scegliere il sistema operativo che si desidera avviare).

Nella maggior parte degli scenari comuni, si ha Grub (Ground Unified Boot Loader) o LILO (Linux LOader) installato come bootloader. Entrambi, Grub e LILO accettano parametri dalla riga di comando, ma in Debian LILO è stato configurato (nella configurazione predefinita) per non mostrare il prompt di avvio di LILO. Per renderlo visibile, premere il tasto "Alt" al messaggio 'LILO' (durante l'avvio, subito prima che prosegua con il messaggio 'Loading linux ...') e si sarà in grado di passare parametri arbitrari al kernel. Per Grub, questo si realizza premendo "e" per modificare la voce, poi "e" per modificale la riga "kernel" e "b" per avviare.

Si può giocare e passare qualsiasi cosa al kernel tramite questa riga di comando; non provocherà danni a meno che succeda di scegliere un nome che qualche parte del sistema usa davvero, tipo acpi, mem, root, hda o panic. I propri valori risulteranno visibili nel file /proc/cmdline successivamente quando il sistema si avvia.

Dopo che il kernel è stato caricato, avvierà il programma init che è il primo processo avviato su quasi tutti i sistemi Unix (così esso ha un PID uguale a 1) ed è attivo per tutto il tempo in cui il sistema è acceso.

Nota

Appena il kernel inizializza il driver della tastiera, si sarà in grado di mettere in pausa l'output del terminale premendo Ctrl+s. Questo permetterà di arrestare lo scorrimento dei messaggi di avvio e di esaminare tranquillamente l'output sul video. Ctrl+q avrà l'effetto di "rilasciare" il terminale.

Si tenga a mente che si può sempre utilizzare questo trucco in un terminale (non è collegato alla fase di avvio) ed il tasto Bloc Scorr sulla propria tastiera ha lo stesso effetto di Ctrl+s o Ctrl+q (sequenzialmente N.d T.).

E allora, in relazione a init, arriviamo ai runlevel di sistema. I runlevel sono semplicemente stati predefiniti della macchina. Entrare in un runlevel significa avviare alcuni servizi (mentre altri vengono fermati) per essere sicuri che il sistema somigli a quanto è specificato dal corrispondente runlevel. init prima esegue i compiti definiti nella directory /etc/rcS.d/, il runlevel Single-user (utente singolo). Poi entra nel runlevel predefinito di Debian GNU, il 2, e conseguentemente, esegue i compiti definiti nella directory /etc/rc2.d/. (Si noti che altre distribuzioni Linux utilizzano per lo più il runlevel 3 come loro predefinito; il runlevel 2 è uguale al 3, ma non avvia nessuna cosa correlata con il sistema X Window.)

Debian GNU utilizza init System V come predefinito. Significa che i runlevel sono rappresentati come directory (/etc/rc?.d/) e le directory consistono in collegamenti simbolici a file nella directory "principale" /etc/init.d/: ecco un esempio:

$ ls -la /etc/rc2.d/ | cut -b 57-
...
S20net-acct -> ../init.d/net-acct
S20openldapd -> ../init.d/openldapd
S20postgresql -> ../init.d/postgresql
...

Il prefisso 'S' avvia un servizio, mentre 'K' lo arresta (per il dato runlevel). I numeri determinano l'ordine nel quale gli script vengono avviati (0 è il primo).

init esegue poi gli script locali da /etc/rc.boot/ e realizza i restanti compiti specificati in /etc/inittab (in vecchie versioni, veniva anche avviato /etc/bootmisc.sh). A questo punto il sistema è avviato, si vede il prompt Login: e la vita sembra più bella del solito.

Debian GNU fornisce uno strumento comodo per gestire i runlevel (per controllare quando i servizi sono avviati e fermati): esso è chiamato update-rc.d e ci sono due metodi comunemente utilizzati per invocarlo:

# update-rc.d -f cron remove
# update-rc.d cron defaults

La prima riga mostra come rimuovere il servizio cron dall'avvio; la seconda lo reimposta. Cron è molto interessante; è uno schedulatore che può avviare automaticamente i compiti in orari arbitrari (persino quando la macchina è completamente non presidiata, naturalmente). Merita certamente alcuni paragrafi in questa Guida e infatti, ci torneremo sopra più tardi.

Così tutti i file in /etc/init.d/ condividono una sintassi comune con cui sono invocati (che è definita dalla Politica Debian GNU) e possono, naturalmente, essere avviati manualmente, non si deve attendere init per richiamarli. Tutti i servizi di sistema hanno i propri script di init (che abitualmente hanno lo stesso nome dei servizi stessi) nella directory /etc/init.d/, i quali accettano argomenti generici. Vediamo un esempio:

# ls -al /etc/init.d/s* | cut -b 55- 
/etc/init.d/sendsigs
/etc/init.d/setserial
/etc/init.d/single
/etc/init.d/skeleton
/etc/init.d/sudo
/etc/init.d/sysklogd

# /etc/init.d/sysklogd stop
Stopping system log daemon: syslogd.

# /etc/init.d/sysklogd start
Starting system log daemon: syslogd.

# /etc/init.d/sysklogd invalid
Usage: /etc/init.d/sysklogd {start|stop|reload|restart|force-reload|reload-or-restart}

NotaNotare che:
 

  • Un generico modello di script init.d, /etc/init.d/skeleton, può essere usato come punto di partenza per i propri script. Per elementi che non richiedono uno script di avvio completo, si vedano i file /etc/init.d/bootmisc.sh e /etc/rc.local.

  • Come annotazione secondaria, Debian supporta un certo numero di meccanismi di init. Più in avanti si può dare un'occhiata a file-rc e a runit.

Ora che abbiamo coperto le basi del processo di avvio di un sistema, possiamo spostarci ad un argomento che semplicemente lo segue in modo logico.