Product SiteDocumentation Site

Capitolo 9. Servizi Unix

9.1. Avvio del sistema
9.2. Accesso remoto
9.2.1. Accesso remoto: telnet
9.2.2. Accesso remoto sicuro: SSH
9.2.3. Utilizzo di desktop remoti grafici
9.3. Gestione dei permessi
9.4. Interfacce di amministrazione
9.4.1. Amministrare tramite un'interfaccia Web: webmin
9.4.2. Configurazione dei pacchetti: debconf
9.5. syslog, eventi di sistema
9.5.1. Principi e meccanismi
9.5.2. Il file di configurazione
9.6. Il super-server inetd
9.7. Pianificare attività con cron e atd
9.7.1. Formato del file crontab
9.7.2. Utilizzo del comando at
9.8. Pianificazione di attività asincrone: anacron
9.9. Quote
9.10. Backup
9.10.1. Backup con rsync
9.10.2. Ripristino di macchine senza backup
9.11. Collegamento a caldo: hotplug
9.11.1. Premessa
9.11.2. Il problema dei nomi
9.11.3. Come funziona udev
9.11.4. Un esempio concreto
9.12. Gestione dell'energia
9.12.1. Gestione avanzata dell'energia (APM)
9.12.2. Risparmio di energia moderno: Advanced Configuration and Power Interface (ACPI)
9.13. Schede di espansione per portatili: PCMCIA
Questo capitolo comprende una serie di servizi di base che sono comuni a molti sistemi Unix. Tutti gli amministratori dovrebbero esserne a conoscenza.

9.1. Avvio del sistema

Quando si avvia il computer, i molti messaggi che scorrono sulla console visualizzano molte inizializzazioni e configurazioni automatiche che vengono eseguite. A volte si potrebbe desiderare di modificare un po' come funziona questa fase, il che significa che è necessario conoscerla bene. Questo è lo scopo di questa sezione.
In primo luogo, il BIOS prende il controllo del computer, rileva i dischi, carica il Master Boot Record, ed esegue il bootloader. Il bootloader subentra, trova il kernel sul disco, lo carica e lo esegue. Il kernel è quindi inizializzato, e comincia a cercare e montare la partizione contenente il filesystem root, infine esegue il primo programma: init. Spesso, questa «partizione root» e questo init sono, di fatto, presenti in un filesystem virtuale che esiste solo nella RAM (da qui il suo nome, «initramfs», precedentemente chiamato «initrd» che sta per «disco RAM di inizializzazione»). Questo filesystem è caricato in memoria dal bootloader, spesso da un file su disco rigido o dalla rete. Contiene il minimo indispensabile richiesto dal kernel per caricare il «vero» filesystem root: possono essere moduli driver per l'hard disk, o altri dispositivi senza i quali il sistema non si avvia, o, più frequentemente, gli script di inizializzazione ed i moduli per il montaggio degli array RAID, l'apertura di partizioni cifrate, l'attivazione di volumi LVM, ecc. Una volta che la partizione di root è montata, initramfs passa il controllo all'init reale, e la macchina torna al processo di avvio standard.
Init esegue più processi, seguendo le istruzioni contenute nel file /etc/inittab. Il primo programma che viene eseguito (che corrisponde al passaggio sysinit) è /etc/init.d/rcS, uno script che esegue tutti i programmi nella directory /etc/rcS.d/.
Tra questi, si trovano successivamente i programmi incaricati di:
  • configurare la tastiera della console;
  • caricare i driver: la maggior parte dei moduli del kernel vengono caricati dal kernel stesso, al rilevamento dell'hardware, altri driver aggiuntivi vengono caricati in seguito automaticamente se i moduli corrispondenti sono elencati nel file /etc/modules;
  • verificare l'integrità dei filesystem;
  • montare partizioni locali;
  • configurare la rete;
  • montare filesystem di rete (NFS).
In seguito a questa fase, subentra init e avvia quei programmi attivati nel runlevel predefinito (che di solito è il runlevel 2). Viene eseguito /etc/init.d/rc 2, uno script che lancia tutti i servizi che sono elencati in /etc/rc2.d/ e il cui nome inizia con la lettera «S». Il numero a due cifre che segue era storicamente utilizzato per definire l'ordine in cui i servizi dovevano essere avviati. In Squeeze, il sistema di avvio predefinito utilizza insserv, che pianifica tutto automaticamente in base alle dipendenze degli script. Ogni script di avvio dichiara in tal modo le condizioni che devono essere soddisfatte per avviare o arrestare il servizio (per esempio, se si deve avviare prima o dopo un altro servizio); init poi li esegue nell'ordine che soddisfa queste condizioni. La numerazione statica degli script quindi non è più presa in considerazione (ma devono sempre avere un nome che inizia con una «S» seguita da due cifre ed il nome effettivo dello script usato per le dipendenze). In generale, i servizi di base (come la registrazione con rsyslog, o l'assegnazione di porte con portmap) vengono avviati per primi, seguiti dai servizi standard e dall'interfaccia grafica (gdm).
Questo sistema di avvio basato su dipendenze consente di automatizzare la rinumerazione, che potrebbe risultare piuttosto noiosa se dovesse essere effettuata manualmente, e limita i rischi di errore umano, poiché la pianificazione viene effettuata secondo i parametri indicati. Un altro vantaggio è che i servizi possono essere avviati in parallelo quando sono indipendenti l'uno dall'altro, e quindi è possibile accelerare il processo di avvio.
init distingue tra diversi runlevel, in modo da poter passare da uno all'altro con il comando telinit nuovo-livello. Immediatamente, init esegue ancora una volta /etc/init.d/rc con il nuovo runlevel. Questo script quindi avvia i servizi mancanti e ferma quelli che non sono più desiderati. Per fare ciò, fa riferimento al contenuto di /etc/rcX.d (dove X rappresenta il nuovo runlevel). Gli script che iniziano con «S» (come in «Start») sono i servizi da avviare, quelli che iniziano con «K» (come in «Kill») sono i servizi che devono essere arrestati. Lo script non avvia alcun servizio che era già attivo nel runlevel precedente.
Come impostazione predefinita, Debian utilizza quattro diversi runlevel:
  • Il livello 0 è utilizzato solo temporaneamente, mentre il computer si sta spegnendo. Come tale, esso contiene solo molti script «K».
  • Il livello 1, noto anche come modalità utente singolo, corrisponde al sistema in modalità degradata; include solo i servizi basilari, ed è destinato ad operazioni di manutenzione in cui le interazioni con gli utenti ordinari non sono desiderate.
  • Il livello 2 è il livello per il normale funzionamento, che include servizi di rete, un'interfaccia utente grafica, accesso utenti, ecc.
  • Il livello 6 è simile al livello 0, tranne che è utilizzato durante la fase di arresto che precede un riavvio.
Esistono altri livelli, in particolare da 3 a 5. In modo predefinito sono configurati per operare allo stesso modo del livello 2, ma l'amministratore può modificarli (aggiungendo o eliminando script nella corrispondente directory /etc/rcX.d) per adattarli a particolari esigenze.
Sequenza di avvio di un computer Linux

Figura 9.1. Sequenza di avvio di un computer Linux


Tutti gli script contenuti nelle varie directory /etc/rcX.d sono solo collegamenti simbolici, creati con l'installazione del pacchetto per il programma update-rc.d, che puntano agli script reali che vengono memorizzati in /etc/init.d/. L'amministratore può regolare i servizi disponibili in ogni runlevel attraverso il comando update-rc.d con i parametri corretti. La pagina di manuale di update-rc.d(1) descrive la sintassi in dettaglio. Notare che la rimozione di tutti i collegamenti simbolici (con il parametro remove) non è un buon metodo per disabilitare un servizio. Si dovrebbe invece semplicemente configurare quel servizio per non essere lanciato in quel particolare runlevel (pur conservando le chiamate corrispondenti a fermarlo nel caso in cui il servizio viene eseguito nel runlevel precedente). Dal momento che update-rc.d ha un'interfaccia un po' complicata, può essere preferibile usare rcconf (presente nel pacchetto rcconf) che fornisce un'interfaccia più intuitiva.
Infine, init avvia i programmi di controllo per le varie console virtuali (getty). Visualizza un prompt, in attesa di un nome utente, poi esegue login utente per iniziare una sessione.