Il processo di avviamento di un computer, qualunque sia il tipo di architettura adottato, prende il nome di processo di boot (cfr. Jargon file), durante questo processo viene caricato ed eseguito nella memoria del computer il Kernel del Sistema Operativo che consente di configurare e inizializzare i vari dispositivi hardware creando tutti processi di Sistema. Prima che il Sistema Operativo stesso venga avviato completamente, si devono anche verificare una serie di eventi molto importanti, tra questi possiamo senzadubbio citare il processo di mount dei file system ed il contestuale avviamento dei demoni o servizi di sistema. Tutti questi eventi vengono eseguiti da una serie di script che prendono il nome di script di init del Sistema Operativo e compongono il processo di init di Sistema. I sistemi UNIX® prevedono diversi sistemi di script di avvio
script di avvio in stile System V
il sistema di init di System V prevede ben sette livelli di esecuzione o run level, ogni run level rappresenta un particolare insieme di servizi
livello 0 è il sistema in shutdown
livello 1 è la modalità monoutente
i livelli dal 2 al 5 invece definiscono i diversi strati di multiutenza
livello 6 è il livello di riavvio (reboot) del sistema
il file /etc/inittab comunica al processo di init quale run level si debba inizializzare all'avviamento del Sistema Operativo, le copie originali degli script di init risiedono in una directory speciale chiamata init.d, questa directory è solitamente situata in /etc, ogni script è responsabile di un servizio specifico ed ogni script riconosce gli argomenti start e stop. Nel momento in cui init cerca di avviare un run level, inizia a ricercare gli script di avviamento nelle directory rc[0-6].d dove 0-6 è lo specifico livello run level. Le directory rc[0-6].d contengono dei link simbolici che puntano agli script di init veri e propri, il nome di questi link simbolici inizia sempre con le lettere S o K che sono sempre seguite da un numero o dal nome dello script che controlla il tipo di servizio.
script di init in stile BSD
FreeBSD come molti altri sistemi BSD, esegue un solo script all'avviamento del sistema, in particolare legge il file /etc/rc che a sua volta richiama altri tre scripts. Si tratta dei files /etc/defaults/rc.conf, /etc/rc.conf e /etc/rc.conf.local
/etc/defaults/rc.conf |
è il file che elenca tutti i parametri di configurazione di FreeBSD, notoriamente e per ragioni di sicurezza non avvia alcun servizio
/etc/rc.conf |
questo file sovrascrive i parametri di configurazione del file /etc/defaults/rc.conf, effettivamente è questo il file che definisce se avviare o meno i servizi di sistema
/etc/rc.conf.local |
questo file riguarda principalmente le configurazioni locali, anche questo script si occupa di sovrascrivere i parametri di configurazione del file /etc/defaults/rc.conf
Tutti i sistemi UNIX® prevedono almeno due tipi di avviamento
l'avviamento automatico (multiutenza)
che prevede l'avviamento ed il caricamento del Kernel di sistema, individua e configura l'hardware, crea i processi di sistema, esegue gli script di avviamento (init) e procede con l'avviamento in multiutenza
l'avviamento manuale (single user mode)
che prevede l'avviamento ed il caricamento del Kernel di sistema, individia e configura l'hardware, crea i processi di sistema e cede il controllo del Sistema all'utente
Nei sistemi UNIX® è quindi possibile avviare Squid automaticamente con la partenza del Sistema Operativo utilizzando uno script generico del tipo init.d. Il file che abbiamo inserito nello spazio contrib dovrebbe essere compatibile con la maggior parte dei sistemi UNIX® che utilizzano lo schema di avviamento init.d.
Molti sistemi UNIX® come Digital Unix, Solaris, IRIX, HP-UX ed alcune distribuzioni GNU Linux, prevedono la presenza del file /etc/inittab. Il file inittab descrive quali processi vengono avviati con l'avvio del sistema e durante le normali operazioni. Init distingue tra diversi runlevel, ognuno dei quali può avere il suo insieme di processi da avviare. I runlevel validi sono 0-6 e A, B e C per le voci ondemand. Una voce nel file inittab ha il seguente formato
id:runlevel:azione:processo |
In questo file possiamo quindi inserire alcune linee per consentire l'avvio automatico con di Squid con il Sistema Operativo
sq:2550:once:/usr/local/squid/sbin/squid -D |
in questo modo il processo di init avvia Squid una sola volta quando si entra nel runlevel specificato
sq:2550:respawn:/usr/local/squid/sbin/squid -D |
utilizzando l'opzione respawn il processo di init riavvia Squid se il processo dovesse terminare. Dopo aver editato il file di inittab rileggiamo la configurazione ed avviamo Squid
% init q |
questa soluzione è stata testata con Fedora Core 1
Uno degli schemi più semplici per avviare Squid è utilizzare lo script /etc/rc.local oppure lo script /etc/rc.d/rc.local (RedHat Linux, Fedora e Mandrake). Si tratta di un semplice script di shell che viene eseguito come root all'avvio del sistema
/usr/local/squid/sbin/squid -D |
il prefisso di installazione del file binario può essere differente e possiamo utilizzare diverse opzioni per avviare Squid ad esclusione di squid -N. Per verificare se Squid è in ascolto utilizziamo l'utility squidclient
% /usr/local/squid/bin/squidclient http://www.cisco.com/ > test |
successivamente verificheremo se il contenuto del file test è congruo
Lo schema init.d e rc.d ricorre ad uno script di shell che è in grado di avviare i diversi servizi. Questo script può trovarsi nelle seguenti directory: /sbin/init.d, /etc/init.d e /usr/local/etc/rc.d. Di seguito mostriamo uno script di startup realizzato per un sistema BSD
#!/bin/sh
# nome del file: squid.sh
echo -n ' Squid '
case "$1" in
start)
/usr/local/squid/bin/squid -D
;;
stop)
/usr/local/squid/bin/squid -k shutdown
;;
restart)
/usr/local/squid/bin/squid -k reconfigure
;;
*)
echo "Usage: `basename $0` {start|stop|restart}"
;;
esac
|
questo tipo di script ricorre agli argomenti start, stop e restart
% /usr/local/etc/rc.d/squid.sh start |
lo script è stato testato con FreeBSD 4.11-STABLE
Il sistema più veloce per arrestare Squid è quello di utilizzare il comando squid -k shutdown
% squid -k shutdown |
questo comando avvia un segnare TERM al processo Squid, verranno così chiusi tutti i socket di rete e nessuna nuova richiesta verrà accettata. Il tempo di chiusura di Squid è pari a circa 30 secondi ma può essere modificato utilizzando la direttiva shutdown_lifetime. Possiamo anche utilizzare il comando squid -k interrupt
% squid -k interrupt |
con questo comando Squid verrà chiuso immediatamente