Approfondimento Unix shell Avvio della macchina, runlevel e servizi

Transcript

Approfondimento Unix shell Avvio della macchina, runlevel e servizi
Corso di Laboratorio di Sistemi Operativi Università degli Studi dell’Aquila a.a 2011-­‐2012 docente: Romina Eramo Approfondimento Unix shell (Nota: questi appunti fanno spesso riferimento a distribuzioni basate su Debian) 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 linux loader (o bootloader). Si tratta di un software che gestisce il caricamento del kernel e che permette di scegliere il sistema operativo che si desidera avviare -­‐ Grub (Ground Unified Boot Loader) o LILO (Linux LOader). Unix è basato su un nucleo (il kernel) che è strettamente legato all’hardware del computer e che gestisce la comunicazione di basso livello con la macchina, l’esecuzione dei programmi e l’uso e la condivisione o la protezione delle risorse del sistema. 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) che si occupa dello startup de processi ed è attivo per tutto il tempo in cui il sistema è acceso. Il file inittab (/etc/inittab) permette di configurare il comportamento del processo init. E’ proprietà dell’utente root. Permette di scegliere cosa far partire in base al runlevel in cui il sistema si è portato. (Nota che in Ubuntu a partire dalla versione 6.10 il file è sostituito con il demone Upstart). I runlevel sono semplicemente stati predefiniti della macchina, relativamente a programmi in esecuizone e servizi offerti. 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. Il contenuto delle directory /etc/rcX.d determina cosa accade nel runlevel X. init prima esegue i compiti definiti nella directory /etc/rcS.d/, il runlevel Single-­‐user (utente singolo). Poi entra nel runlevel predefinito (ad esempio, il 2 per Debian) e conseguentemente, esegue i compiti definiti nella directory /etc/rc2.d/ (riferendoci sempre ad una distribuzione basata su Debian). Ogni runlevel è identificato da un numero, tipicamente compreso tra 0 e 6. Non esiste uno standard ma alcuni sono riservati. Ad esempio, runlevel 0 runlevel 1 runlevel 2 runlevel 3 runlevel 4 runlevel 5 runlevel 6 HALT, serve ad arrestare il sistema, nessun programma è in esecuzione Single User Mode, solo l’amministratore ha accesso al sistema e nessun’altro utente può accedere. Ad esempio, utile per effettuare manutenzione e aggiornamenti nella certezza che nessun’altro utente avrà accesso. Multi User Mode Multi User Mode Multi User Mode Multi User Mode Reboot, runlevel di reboot I runlevel riservati e le configurazioni dipendono dalla distribuzione che stiamo usando, l’amministratore può personalizzare. E’ pratica comune avere un runlevel per la modalità grafica e uno per la modalità testuale. Un altro possibile utilizzo è avene uno in cui vengono lanciati i servizi di rete e un altro in cui questi non sono attivi. # runlevel : indica il runlevel corrente # init <runlevel> : permette di cambiare runlevel Debian 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/, directry che cotiene tutti gli script di init attuali. 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. Debian 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: è un servizio utilizzato per eseguire azioni pianificae. In pratica è uno schedulatore che può avviare automaticamente i compiti in orari arbitrari (persino quando la macchina è completamente non presidiata, naturalmente). Il demone cron viene eseguito all'avvio del sistema ( /etc/rc.d/init.d/cron ) e, ogni minuto, analizza il suo file di configurazione predefinito /etc/crontab per verificare se deve eseguire dei comandi. Su varie distribuzioni /etc/crontab prevede le seguenti voci: 01
02
22
42
*
4
4
4
*
*
*
1
*
*
*
*
*
*
0
*
root
root
root
root
run-parts
run-parts
run-parts
run-parts
/etc/cron.hourly
/etc/cron.daily
/etc/cron.weekly
/etc/cron.monthly Che in pratica fanno eseguire: -­‐ tutte le ore (al minuto 01) i comandi presenti nella directory /etc/cron.hourly, -­‐ tutti i giorni alle 4.02 i comandi in /etc/cron.daily, -­‐ tutte le settimane, alle 4.22 di domenica i comandi in /etc/cron.weekly, -­‐ tutti i mesi, alle 4.42 del primo del mese, tutti i comandi in /etc/cron.monthly Ogni riga di /etc/crontab prevede quindi sette campi. I primi 5 campi servono per definire quando eseguire il comando specificato nel settimo campo. Possono contenere valori separati da virgola o un asterisco che indica tutti i calori possibili: 1) Minuto in cui eseguire il comando. Valori da 00 a 59. 2) Ora in cui eseguire il comando. Valori da 0 a 23 (0 è mezzanotte, 12 mezzogiorno) 3) Giorno del mese in cui eseguire il comando. Valori da 1 a 31. 4) Mese dell'anno in cui eseguire il comando. Valori da 1 a 12. 5) Giorno della settimana in cui eseguire il comando. Valori da 0 a 6. (0 corrisponde alla Domenica, 1 al Lunedì.. ) 6) Utente con cui viene eseguito il comando. Crond viene eseguito come root e può impersonificare qualsiasi utente. Questo campo può anche essere omesso (root di default). 7) Riga di comando da eseguire (con eventuali opzioni, argomenti ecc.) Il comando run-­‐parts, nel caso di cui sopra, esegue tutti i comandi presenti nella directory indicata. Oltre a /etc/crontab, riservato al sistema, ogni utente può editare un proprio crontab file con la stessa struttura di /etc/crontab. Tutti i file in /etc/init.d/ condividono una sintassi comune con cui sono invocati 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-orrestart}
Notare 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.