Il 0% ha trovato utile questo documento (0 voti)
502 visualizzazioni

Corso Linux

Corso breve ma efficace sulle basi di Linux

Caricato da

therealbullet
Copyright
© © All Rights Reserved
Formati disponibili
Scarica in formato PDF, TXT o leggi online su Scribd
Il 0% ha trovato utile questo documento (0 voti)
502 visualizzazioni

Corso Linux

Corso breve ma efficace sulle basi di Linux

Caricato da

therealbullet
Copyright
© © All Rights Reserved
Formati disponibili
Scarica in formato PDF, TXT o leggi online su Scribd
Sei sulla pagina 1/ 545

Amministrare GNU/Linux

Simone Piccardi
[email protected]

3 maggio 2011

Truelite Srl

http://www.truelite.it

[email protected]

ii
c 2000-2011 Simone Piccardi Permission is granted to copy, distribute
Copyright
and/or modify this document under the terms of the GNU Free Documentation License, Version 1.1 or any later version published by the Free Software Foundation; with no Invariant Sections, with Front-Cover Texts: Truelite Srl http://www.truelite.it
[email protected], and with no Back-Cover Texts. A copy of the license is included in
the section entitled GNU Free Documentation License.

Questa documentazione libera `e stata sviluppata allinterno delle attivit`a formative


effettuate da Truelite S.r.l. Il materiale `e stato finanziato nel corso della realizzazione
dei corsi erogati dallazienda, e viene messo a disposizione di tutti sotto licenza GNU
FDL.
Questo testo, insieme al resto della documentazione libera realizzata da Truelite
S.r.l., viene distribuito su internet allindirizzo:
http://svn.truelite.it/truedoc
dove saranno pubblicate nuove versioni ed aggiornamenti.

Societ`a italiana specializzata nella fornitura di servizi, consulenza e formazione esclusivamente su GNU/Linux e software libero.
Per informazioni:
Truelite S.r.l
Via Monferrato 6,
50142 Firenze.
Tel: 055-7879597
Fax: 055-7333336
e-mail: [email protected]
web: http://www.truelite.it

Indice
1 Larchitettura di un sistema GNU/Linux
1.1 Larchitettura del sistema. . . . . . . . . . . . . . . . . . . . . . .
1.1.1 Larchitettura di base. . . . . . . . . . . . . . . . . . . . .
1.1.2 Il funzionamento del sistema . . . . . . . . . . . . . . . .
1.1.3 Alcune caratteristiche specifiche di Linux . . . . . . . . .
1.2 Larchitettura dei file . . . . . . . . . . . . . . . . . . . . . . . . .
1.2.1 Il Virtual File System e le caratteristiche dei file. . . . . .
1.2.2 Larchitettura di un filesystem e le propriet`a dei file . . .
1.2.3 Lorganizzazione delle directory ed il Filesystem Hierarchy
1.3 Larchitettura dei processi . . . . . . . . . . . . . . . . . . . . . .
1.3.1 Le caratteristiche dellarchitettura dei processi . . . . . .
1.3.2 Le propriet`
a dei processi . . . . . . . . . . . . . . . . . . .
1.3.3 I segnali . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1.3.4 La gestione delle priorit`a . . . . . . . . . . . . . . . . . .
1.4 Il controllo degli accessi . . . . . . . . . . . . . . . . . . . . . . .
1.4.1 Lidentificazione di utenti e gruppi . . . . . . . . . . . . .
1.4.2 I permessi dei file . . . . . . . . . . . . . . . . . . . . . . .
1.4.3 La gestione dei permessi dei file . . . . . . . . . . . . . . .
1.4.4 Altre operazioni privilegiate . . . . . . . . . . . . . . . . .

. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
Standard
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .

2 La shell e i comandi
2.1 Linterfaccia a linea di comando. . . . . . . . . . . . . . . . . . . . . . .
2.1.1 La filosofia progettuale . . . . . . . . . . . . . . . . . . . . . . . .
2.1.2 Sessioni di lavoro e job control . . . . . . . . . . . . . . . . . . .
2.1.3 Sintassi e funzionalit`a di base della riga di comando . . . . . . .
2.1.4 La redirezione dellI/O . . . . . . . . . . . . . . . . . . . . . . . .
2.1.5 Scripting elementare . . . . . . . . . . . . . . . . . . . . . . . . .
2.1.6 Le modalit`
a operative e la configurazione della shell . . . . . . .
2.2 I comandi dei file . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2.2.1 Caratteristiche comuni . . . . . . . . . . . . . . . . . . . . . . . .
2.2.2 I comandi per le ricerche dei file . . . . . . . . . . . . . . . . . .
2.2.3 I comandi per controllare il contenuto dei file . . . . . . . . . . .
2.2.4 I comandi di elaborazione dei contenuti dei file . . . . . . . . . .
2.2.5 Ricerche ed elaborazioni sui file attraverso le espressioni regolari
2.3 Gli editor di testo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2.3.1 Introduzione . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2.3.2 Un editor evoluto: emacs . . . . . . . . . . . . . . . . . . . . . .
2.3.3 Un editor di base, vi . . . . . . . . . . . . . . . . . . . . . . . . .
2.3.4 Gli altri editor . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2.4 Altri comandi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
iii

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

1
1
1
3
5
6
6
9
16
22
22
23
33
35
36
36
38
43
46

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

51
51
51
53
58
73
77
85
88
88
89
95
97
104
109
109
110
113
116
119

iv

INDICE
2.4.1
2.4.2
2.4.3
2.4.4
2.4.5

I
I
I
I
I

comandi
comandi
comandi
comandi
comandi

di ausilio per la redirezione . . . . . . . . .


per la documentazione . . . . . . . . . . . .
per la gestione dei tempi . . . . . . . . . . .
per le informazioni sugli utenti e il sistema
per le informazioni diagnostiche . . . . . . .

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

119
121
126
129
131

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

135
135
135
136
138
140
143
144
146
147
150
153
153
155
162
167
170
170
172
175
178

4 Amministrazione ordinaria del sistema


4.1 Archiviazione e backup . . . . . . . . . . . . . . . . . . . . . . . .
4.1.1 Criteri generali per il backup . . . . . . . . . . . . . . . .
4.1.2 I comandi tar e cpio . . . . . . . . . . . . . . . . . . . .
4.1.3 I comandi dump e restore . . . . . . . . . . . . . . . . . .
4.1.4 Altri comandi per il backup . . . . . . . . . . . . . . . . .
4.2 La gestione dei pacchetti software . . . . . . . . . . . . . . . . . .
4.2.1 Linstallazione diretta dai sorgenti . . . . . . . . . . . . .
4.2.2 La gestione dei pacchetti con rpm e yum . . . . . . . . . .
4.2.3 Il sistema di gestione dei pacchetti APT . . . . . . . . . .
4.3 La gestione di utenti e gruppi . . . . . . . . . . . . . . . . . . . .
4.3.1 Una visione generale . . . . . . . . . . . . . . . . . . . . .
4.3.2 Il database di utenti e gruppi . . . . . . . . . . . . . . . .
4.3.3 I comandi per la gestione di utenti e gruppi . . . . . . . .
4.3.4 Impersonare i ruoli di altri utenti e gruppi . . . . . . . . .
4.3.5 Le configurazioni della gestione degli utenti e degli accessi
4.3.6 Il Name Service Switch . . . . . . . . . . . . . . . . . . .
4.3.7 I Pluggable Authentication Modules . . . . . . . . . . . . .
4.4 Amministrazione sistemistica di una base di dati . . . . . . . . .
4.4.1 Alcuni concetti base dei database relazionali . . . . . . . .
4.4.2 Configurazione e gestione di base di PostgreSQL . . . . .
4.4.3 Configurazione e gestione di base di MySQL . . . . . . . .
4.4.4 Nozioni elementari di SQL . . . . . . . . . . . . . . . . . .

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

181
181
181
185
189
192
194
194
197
203
209
209
211
215
220
226
229
232
239
239
241
243
244

3 La configurazione dei servizi


3.1 I file di configurazione . . . . . . . . . . . . . . . . . .
3.1.1 Una panoramica generale . . . . . . . . . . . .
3.1.2 La gestione delle librerie condivise . . . . . . .
3.1.3 La gestione dei parametri del kernel con sysctl
3.1.4 Localizzazione e internazionalizzazione . . . . .
3.2 I servizi di base . . . . . . . . . . . . . . . . . . . . . .
3.2.1 Il servizio cron . . . . . . . . . . . . . . . . . .
3.2.2 Il servizio at . . . . . . . . . . . . . . . . . . .
3.2.3 Il servizio del syslog . . . . . . . . . . . . . . .
3.2.4 Il sistema di rotazione dei file di log . . . . . .
3.3 LX Window System . . . . . . . . . . . . . . . . . . .
3.3.1 Introduzione a X Window . . . . . . . . . . . .
3.3.2 La configurazione del server X . . . . . . . . .
3.3.3 Lavvio di una sessione di lavoro sotto X . . . .
3.3.4 Luso di X Window dal lato client . . . . . . .
3.4 Il sistema di stampa . . . . . . . . . . . . . . . . . . .
3.4.1 Introduzione generale . . . . . . . . . . . . . .
3.4.2 Il Common Unix Printing System . . . . . . .
3.4.3 I comandi di gestione per CUPS . . . . . . . .
3.4.4 Il sistema di stampa in stile BSD . . . . . . . .

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

INDICE

5 Amministrazione straordinaria del sistema


5.1 La gestione dei dischi e dei filesystem . . . . . . . . . . . . . .
5.1.1 Alcune nozioni generali . . . . . . . . . . . . . . . . .
5.1.2 Il partizionamento dei dischi . . . . . . . . . . . . . .
5.1.3 La gestione del contenuto dei dischi . . . . . . . . . .
5.1.4 La creazione di un filesystem . . . . . . . . . . . . . .
5.1.5 Controllo e riparazione di un filesystem . . . . . . . .
5.1.6 Il sistema dellautomounter . . . . . . . . . . . . . . .
5.1.7 La gestione della swap e dei CDROM . . . . . . . . .
5.2 La gestione di kernel e moduli . . . . . . . . . . . . . . . . . .
5.2.1 Le versioni del kernel . . . . . . . . . . . . . . . . . . .
5.2.2 Sorgenti e patch . . . . . . . . . . . . . . . . . . . . .
5.2.3 La ricompilazione del kernel . . . . . . . . . . . . . . .
5.2.4 Installazione manuale del kernel e del ramdisk iniziale
5.2.5 La gestione dei moduli . . . . . . . . . . . . . . . . . .
5.3 La gestione dellavvio del sistema . . . . . . . . . . . . . . . .
5.3.1 Lavvio del kernel . . . . . . . . . . . . . . . . . . . . .
5.3.2 Il bootloader SYSLINUX . . . . . . . . . . . . . . . . .
5.3.3 Il bootloader LILO . . . . . . . . . . . . . . . . . . . .
5.3.4 Il bootloader GRUB . . . . . . . . . . . . . . . . . . .
5.3.5 Il sistema di inizializzazione alla System V . . . . . .
5.3.6 Riavvio, spegnimento e cambiamento di runlevel . . .
5.4 La gestione di interfacce e periferiche . . . . . . . . . . . . . .
5.4.1 Gestione delle interfacce di espansione . . . . . . . . .
5.4.2 Gestione delle interfacce SCSI . . . . . . . . . . . . . .
5.4.3 Gestione delle interfacce seriali . . . . . . . . . . . . .
5.4.4 Gestione delle interfacce USB . . . . . . . . . . . . . .
5.4.5 La gestione dei dispositivi con udev e hotplug . . . . .

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

247
247
247
250
256
265
270
276
279
282
282
284
286
298
302
310
310
313
315
318
321
326
329
329
336
341
343
347

6 Amministrazione avanzata del sistema


6.1 Lutilizzo del RAID . . . . . . . . . . . . . . . . . . . .
6.1.1 Introduzione . . . . . . . . . . . . . . . . . . .
6.1.2 Il RAID su Linux . . . . . . . . . . . . . . . . .
6.1.3 La gestione del RAID software . . . . . . . . .
6.2 Il sistema del Logical Volume Manager . . . . . . . . .
6.2.1 Introduzione . . . . . . . . . . . . . . . . . . .
6.2.2 La gestione dei volumi fisici . . . . . . . . . . .
6.2.3 La gestione dei gruppi di volumi . . . . . . . .
6.2.4 La gestione dei volumi logici . . . . . . . . . .
6.3 Gestione avanzata di dischi e filesystem . . . . . . . .
6.3.1 La gestione dei parametri dei dischi . . . . . .
6.3.2 Il ridimensionamento di filesystem e partizioni
6.4 Le quote disco . . . . . . . . . . . . . . . . . . . . . .
6.4.1 Visione generale . . . . . . . . . . . . . . . . .
6.4.2 Configurazione del sistema delle quote . . . . .
6.4.3 Gestione delle quote di utenti e gruppi . . . . .

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

353
353
353
356
357
367
367
369
371
373
375
375
381
384
384
385
386

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

vi

INDICE

7 Lamministrazione di base delle reti


7.1 Unintroduzione ai concetti fondamentali delle reti. . . . . . . .
7.1.1 Lestensione . . . . . . . . . . . . . . . . . . . . . . . . .
7.1.2 La topologia . . . . . . . . . . . . . . . . . . . . . . . .
7.1.3 I protocolli . . . . . . . . . . . . . . . . . . . . . . . . .
7.2 Il TCP/IP. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
7.2.1 Introduzione. . . . . . . . . . . . . . . . . . . . . . . . .
7.2.2 Gli indirizzi IP . . . . . . . . . . . . . . . . . . . . . . .
7.2.3 Linstradamento o routing . . . . . . . . . . . . . . . . .
7.2.4 I servizi e le porte. . . . . . . . . . . . . . . . . . . . . .
7.3 La configurazione di base . . . . . . . . . . . . . . . . . . . . .
7.3.1 Lassegnazione degli indirizzi ed il comando ifconfig .
7.3.2 Limpostazione dellinstradamento ed il comando route
7.3.3 La configurazione della rete allavvio del sistema. . . . .
7.4 Il sistema della risoluzione dei nomi . . . . . . . . . . . . . . .
7.4.1 Introduzione al resolver . . . . . . . . . . . . . . . . . .
7.4.2 I file di configurazione del resolver . . . . . . . . . . . .
7.4.3 La gestione locale dei nomi . . . . . . . . . . . . . . . .
7.4.4 La gestione degli altri nomi di rete . . . . . . . . . . . .
7.5 Altre tipologie di connessioni di rete . . . . . . . . . . . . . . .
7.5.1 Cenni sul protocollo PPP . . . . . . . . . . . . . . . . .
7.5.2 Il demone pppd . . . . . . . . . . . . . . . . . . . . . . .
7.5.3 I meccanismi di autenticazione . . . . . . . . . . . . . .
7.5.4 La connettivit`
a Wi-Fi . . . . . . . . . . . . . . . . . . .
7.5.5 I wireless tool di Linux . . . . . . . . . . . . . . . . . . .
7.6 I comandi diagnostici . . . . . . . . . . . . . . . . . . . . . . . .
7.6.1 Il comando ping . . . . . . . . . . . . . . . . . . . . . .
7.6.2 I comandi traceroute, tracepath e mtr . . . . . . . .
7.6.3 Il comando netstat . . . . . . . . . . . . . . . . . . . .
7.6.4 Il protocollo ARP ed il comando arp . . . . . . . . . . .
7.6.5 I servizi RPC . . . . . . . . . . . . . . . . . . . . . . . .
7.7 I client dei servizi di base . . . . . . . . . . . . . . . . . . . . .
7.7.1 I comandi telnet e netcat . . . . . . . . . . . . . . . .
7.7.2 Il comando ftp . . . . . . . . . . . . . . . . . . . . . . .
7.7.3 I comandi finger e whois . . . . . . . . . . . . . . . . .
8 La gestione dei servizi di base
8.1 I programmi di ausilio alla gestione dei servizi
8.1.1 I servizi elementari e i super-demoni .
8.1.2 Il super-demone inetd . . . . . . . . .
8.1.3 Il super-demone xinetd . . . . . . . .
8.1.4 Il servizio NTP . . . . . . . . . . . . .
8.1.5 I TCP wrappers . . . . . . . . . . . .
8.2 Lassegnazione dinamica degli indirizzi IP . .
8.2.1 I protocolli RARP, BOOTP e DHCP .
8.2.2 Uso del servizio DHCP dal lato client
8.2.3 La configurazione di un server DHCP
8.3 Amministrazione remota con SSH . . . . . . .
8.3.1 La configurazione del server SSH . . .
8.3.2 Lutilizzo di SSH come client . . . . .
8.3.3 Autenticazione a chiavi . . . . . . . .

di base
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .

.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

391
391
391
392
393
397
397
400
403
404
406
406
409
414
419
419
420
422
424
426
426
426
429
431
432
434
434
435
438
440
442
444
444
446
447

.
.
.
.
.
.
.
.
.
.
.
.
.
.

451
451
451
452
454
458
460
463
463
465
468
470
471
473
478

INDICE

8.4

vii
8.3.4 Le funzionalit`
a di reinoltro del traffico
La condivisione dei file sulla rete . . . . . . .
8.4.1 Il protocollo ed il server NFS . . . . .
8.4.2 NFS sul lato client . . . . . . . . . . .
8.4.3 La configurazione di base di Samba . .

.
.
.
.
.

9 Il servizio DNS
9.1 Il funzionamento del servizio DNS . . . . . . .
9.1.1 Introduzione . . . . . . . . . . . . . . .
9.1.2 I Resorce Record e le zone di autorit`a .
9.1.3 I comandi host e dig . . . . . . . . . .
9.2 La gestione di un server DNS . . . . . . . . . .
9.2.1 Il server named . . . . . . . . . . . . . .
9.2.2 Il file named.conf . . . . . . . . . . . .
9.2.3 La configurazione base . . . . . . . . . .
9.2.4 La configurazione di un dominio locale.
9.3 Configurazioni avanzate . . . . . . . . . . . . .
9.3.1 La delegazione di una zona . . . . . . .
9.3.2 La gestione di un secondario . . . . . .
9.4 Le estensioni DNSSEC . . . . . . . . . . . . . .
9.4.1 Introduzione al DNSSEC . . . . . . . .
9.4.2 La gestione delle chiavi . . . . . . . . .
A Sinossi dei comandi principali
A.1 Comandi per la gestione dei file . . . . . .
A.2 Comandi per la gestione dei processi . . .
A.3 I permessi dei file . . . . . . . . . . . . . .
A.4 Comandi per la localizzazione dei file . . .
A.5 Comandi per la documentazione . . . . .
A.6 Comandi per la gestione dei tempi . . . .
A.7 Comandi di archiviazione e compressione .
A.8 Gestione dei pacchetti . . . . . . . . . . .
A.9 I comandi diagnostici . . . . . . . . . . . .
A.10 I client dei servizi base . . . . . . . . . . .
B Indice degli argomenti per LPI
B.1 Argomenti Esame LPI 101 . . .
B.2 Argomenti Esame LPI 102 . . .
B.3 Argomenti Esame LPI 201 . . .
B.4 Argomenti Esame LPI 202 . . .

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.

480
482
482
484
486

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

493
493
493
495
496
499
499
500
501
503
508
508
509
509
510
510

.
.
.
.
.
.
.
.
.
.

511
511
512
512
512
513
513
513
514
514
514

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

515
515
516
516
517

C Percorsi di studio per gli esami LPI


C.1 Percorso di studio LPI 101 . . . . . .
C.2 Percorso di studio LPI 102 . . . . . .
C.3 Percorso di studio LPI 201 . . . . . .
C.4 Percorso di studio LPI 202 . . . . . .

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

519
519
519
520
520

D Ringraziamenti

.
.
.
.

.
.
.
.

521

viii
E GNU Free Documentation License
E.1 Applicability and Definitions . . . . .
E.2 Verbatim Copying . . . . . . . . . . .
E.3 Copying in Quantity . . . . . . . . . .
E.4 Modifications . . . . . . . . . . . . . .
E.5 Combining Documents . . . . . . . . .
E.6 Collections of Documents . . . . . . .
E.7 Aggregation With Independent Works
E.8 Translation . . . . . . . . . . . . . . .
E.9 Termination . . . . . . . . . . . . . . .
E.10 Future Revisions of This License . . .

INDICE

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

523
523
524
524
525
526
527
527
527
527
527

Capitolo 1

Larchitettura di un sistema
GNU/Linux
1.1

Larchitettura del sistema.

Prima di addentrarci nei dettagli dellamministrazione di un sistema GNU/Linux, conviene


fornire un quadro generale per introdurre i vari concetti su cui si fonda larchitettura di questo
sistema, che nasce da quella, consolidatasi in 30 anni di impiego, dei sistemi di tipo Unix.
Il fatto che questa architettura abbia una certa et`a fa s` che spesso i detrattori di GNU/Linux
ne denuncino la presunta mancanza di innovativit`a, ma anche le case hanno da secoli le stesse
basi architetturali (porte, muri e tetti), ma non per questo non esiste innovazione. Il vantaggio
dellarchitettura di Unix infatti `e quello di aver fornito una solida base per la costruzione di
sistemi affidabili ed efficienti, consolidata e corretta in decenni di utilizzo, tanto che, per citare
Henry Spencer: those who dont understand UNIX are doomed to reinvent it, poorly.

1.1.1

Larchitettura di base.

Contrariamente ad altri sistemi operativi, GNU/Linux nasce, come tutti gli Unix, come sistema
multitasking e multiutente. Questo significa che GNU/Linux ha unarchitettura di sistema che
`e stata pensata fin dallinizio per luso contemporaneo da parte di pi`
u utenti. Questo comporta
conseguenze non del tutto intuitive nel caso in cui, come oggi accade sempre pi`
u spesso, esso
venga usato come stazione di lavoro da un utente singolo.
Il concetto base dellarchitettura di ogni sistema Unix come GNU/Linux `e quello di una
rigida separazione fra il kernel (il nucleo del sistema), cui si demanda la gestione delle risorse
hardware (come la CPU, la memoria, le periferiche) ed i processi, (le unit`a di esecuzione dei
programmi), che nel caso vanno dai comandi base di sistema, agli applicativi, alle interfacce per
linterazione con gli utenti.
Lo scopo del kernel infatti `e solo quello di essere in grado di eseguire contemporaneamente
molti processi in maniera efficiente, garantendo una corretta distribuzione fra gli stessi della
memoria e del tempo di CPU, e quello di fornire le adeguate interfacce software per laccesso
alle periferiche della macchina e le infrastrutture di base necessarie per costruire i servizi. Tutto
il resto, dallautenticazione allinterfaccia utente, viene realizzato usando processi che eseguono
gli opportuni programmi.
Questo si traduce in una delle caratteristiche essenziali su cui si basa larchitettura dei sistemi
Unix: la distinzione fra il cosiddetto user space, che `e lambiente a disposizione degli utenti, in
cui vengono eseguiti i processi, e il kernel space, che `e lambiente in cui viene eseguito il kernel.
I due ambienti comunicano attraverso un insieme di interfacce ben definite e standardizzate;
secondo una struttura come quella mostrata in fig. 1.1.
1

CAPITOLO 1. LARCHITETTURA DI UN SISTEMA GNU/LINUX

Figura 1.1: Schema della struttura del sistema operativo GNU/Linux.

Questa architettura comporta che solo il kernel viene eseguito in modalit`a privilegiata, ed
`e lunico a poter accedere direttamente alle risorse dellhardware. I normali programmi invece
vengono eseguiti in modalit`
a protetta, in un ambiente virtuale, luser space, in cui essi vedono
se stessi come se avessero piena disponibilit`a della CPU e della memoria, ma in cui possono
accedere alle periferiche e alle altre funzionalit`a messe a disposizione del kernel solo attraverso
una serie di funzioni di sistema standardizzate,1 dette system call.
Le system call e tutta una serie di ulteriori funzioni di base sono tradizionalmente raccolte in
ununica libreria,2 che pertanto diventa essenziale per il funzionamento di qualunque programma.
Nel caso di Linux questa libreria, illustrata nello schema in fig. 1.1, `e la GNU C library (chiamata
in breve glibc), che costituisce una delle parti fondamentali del sistema.
In sostanza quello che succede `e che da un certo punto di vista lunico vero programma che
viene eseguito `e il kernel, che si incarica di costruire questo ambiente virtuale in cui far girare
gli altri programmi. Una parte del kernel, quella indicata in fig. 1.1 come scheduler, `e deputata
della gestione del tempo di processore, e provveder`a a decidere volta per volta qual`e il processo
che deve essere eseguito in un determinato momento (realizzando cos` il multitasking).
Una seconda parte, quella indicata in fig. 1.1 come VM, (sigla che sta per Virtual Memory)
si occupa invece di gestire luso della memoria disponibile. La memoria virtuale `e uno dei
sottosistemi pi`
u importanti del kernel3 perche `e quella che fa in modo che ogni processo veda uno
spazio di indirizzi proprio che poi viene rimappato4 nella memoria fisica effettivamente presente,
cos` che sia impossibile che un processo possa accedere alla memoria di un altro processo. La
memoria virtuale si incarica anche di gestire, in caso di esaurimento della RAM, leventuale
1

lo standard in questo caso si chiama POSIX.1; ma oltre a quelle dello standard Linux supporta ulteriori system
call, relative a sue estensioni specifiche.
2
torneremo sul concetto di librerie, e su come queste vengono gestite nel sistema, in sez. 3.1.2.)
3
e oggetto di continui rifacimenti, in quanto critico per tutte le prestazioni del sistema.
4
questo viene in genere realizzato con lausilio delle MMU (Memory Management Unit) dei microprocessori;
una descrizione pi`
u dettagliata del funzionamento della memoria virtuale pu`
o essere trovata nella sezione 2.2
di [GaPiL].

1.1. LARCHITETTURA DEL SISTEMA.

spostamento delle pagine di memoria meno usate su uno opportuno spazio disco (lo swap, che
tratteremo in sez. 5.1.7) evitando di fermare lesecuzione di un processo per una temporanea
mancanza di memoria. Torneremo brevemente sullargomento in sez. 1.3.2.
Infine c`e unultima parte del kernel, indicata in fig. 1.1 con lindicazione generica driver,5 che
si incaricher`
a di accedere alle periferiche per conto dei programmi. Questa, come vedremo meglio
in sez. 1.2, permette di definire una interfaccia di accesso generica per qualunque dispositivo,
cui spesso si fa riferimento dicendo che in un sistema unix-like tutto `e un file.
La conseguenza pi`
u importante di questa separazione fra user space e kernel space `e che in
questo modo non `e possibile che un singolo programma possa disturbare lazione di un altro
programma o del kernel stesso, e questo `e il principale motivo della stabilit`a di un sistema Unix
nei confronti di altri sistemi in cui i processi non hanno di questi limiti, o vengono, per vari
motivi, eseguiti allinterno del kernel.

1.1.2

Il funzionamento del sistema

Per illustrare meglio la distinzione fra kernel space e user space prendiamo brevemente in esame
la procedura di avvio del sistema, su cui torneremo in dettaglio in sez. 5.3. Allaccensione
del computer viene eseguito il programma del BIOS; questo dopo aver fatto i suoi controlli
interni esegue la procedura di avvio del sistema. Nei PC tutto ci`o viene effettuato caricando dal
dispositivo indicato nelle impostazioni del BIOS un apposito programma, il bootloader,6 che a
sua volta recupera (in genere dal disco) una immagine del kernel che viene caricata in memoria
ed eseguita.
Una volta che il controllo `e passato al kernel questo, terminata la fase di inizializzazione in
cui ad esempio si esegue una scansione delle periferiche disponibili, e si leggono le tabelle delle
partizioni dei vari dischi (vedi sez. 5.1.2) si incaricher`a di montare (vedi sez. 1.2.2) il filesystem su
cui `e situata la directory radice (vedi sez. 1.2.3), e far`a partire il primo processo. Per convenzione
questo processo si chiama init, ed `e il programma di inizializzazione che a sua volta si cura di
far partire tutti gli altri processi che permettono di usare il sistema.
Fra questi processi ci saranno ad esempio quelli che forniscono i vari servizi di rete, quelli che
eseguono vari compiti di amministrazione, cos` come quelli che si occupano di chiedere nome e
password dellutente che si vuole collegare,7 e che una volta completato il collegamento (procedura che viene chiamata login) lanciano altri programmi per mettere a disposizione dellutente
linterfaccia da cui inviare i comandi, che potrebbe essere sia una shell a riga di comando (argomento che tratteremo in dettaglio in cap. 2) che una delle tante interfacce grafiche disponibili
(argomento che riprenderemo in sez. 3.3).
` da rimarcare poi come anche tutti i programmi che un utente di un sistema GNU/Linux
E
pu`o utilizzare una volta che si `e collegato non hanno niente di diverso da quelli appena citati.
Tutti i programmi funzionano allo stesso modo: vengono eseguiti dal kernel come processi ed
eseguono le loro operazioni attraverso le opportune system call che esso mette a disposizione.
Da questo punto di vista eseguire sulla shell un programma per vedere la lista dei file non ha
niente di diverso dalleseguire in ambiente grafico un programma di scrittura o un programma
di foto-ritocco, o dal lanciare un server web che viene eseguito anche quando nessuno `e collegato
al sistema.
5

questa in realt`
a non `e un unico sottosistema come le precedenti, ma un insieme di varie parti diverse, specifiche
per il tipo di periferica in questione.
6
questo `e un programma speciale, il cui solo compito `e quello di far partire un sistema operativo, in genere
ogni sistema ha il suo, nel caso di Linux per larchitettura PC i due principali sono LILO e GRUB, che vedremo
in sez. 5.3.3 e 5.3.4.
7
in realt`
a se la cosa `e fatta da console i programmi sono due, il primo chiede lutente e poi chiama il secondo
che chiede la password, torneremo su questo in sez. 4.3.5 e sez. 5.3.5.

CAPITOLO 1. LARCHITETTURA DI UN SISTEMA GNU/LINUX

Questo significa ad esempio che il kernel di per se non dispone di primitive per tutta una
serie di operazioni, come la copia di un file,8 che altri sistemi operativi (come Windows) hanno
al loro interno: tutte le operazioni di normale amministrazione di un sistema GNU/Linux sono
sempre realizzate tramite degli opportuni programmi.
Tutto ci`o ci dice anche che benche esso costituisca il cuore del sistema, il kernel da solo
sarebbe assolutamente inutile, cos` come sarebbe inutile da solo il motore di una automobile,
senza avere le ruote, lo sterzo, la carrozzeria, e tutto il resto. Per avere un sistema funzionante dal
punto di vista di un utente normale infatti occorre avere, oltre al kernel, anche tutti i programmi
che gli permettano di eseguire le varie operazioni con i dischi, i file, le periferiche.
Per questo al kernel vengono sempre uniti degli opportuni programmi di gestione per il
sistema e tutta una serie di programmi applicativi, ed `e linsieme di questi e del kernel che
costituisce un sistema funzionante. Di solito i rivenditori, o anche gruppi di volontari, come nel
caso di Debian, si preoccupano di raccogliere in forma coerente i programmi necessari, per andare
a costruire quella che viene chiamata una distribuzione. Sono in genere queste distribuzioni
(come Debian, Mandriva, RedHat, Slackware, Ubuntu9 ), quelle che si trovano sui CD con i quali
si installa quello che, con una semplificazione molto brutale, viene chiamato solo Linux.
Il gruppo principale di questi programmi, e le librerie di base che essi e tutti gli altri programmi usano, derivano dal progetto GNU della Free Software Foundation: `e su di essi che ogni
altro programma `e basato, ed `e per questo che `e pi`
u corretto riferirsi allintero sistema come
a GNU/Linux, dato che Linux indica solo una parte, il kernel, che benche fondamentale non
costituisce da sola un sistema operativo.
Si tenga presente infine che anche se il kernel tratta tutti i programmi allo stesso modo, non
tutti hanno la stessa importanza. Nella precedente descrizione dellavvio del sistema abbiamo
accennato ad un programma particolare, init, che ha un ruolo privilegiato in quanto `e quello
che si occupa dellinizializzazione del sistema quando questo viene fatto partire. Ma anche init
alla fine non `e che un programma che usa le system call e viene eseguito dal kernel, come un
qualunque altro programma; la sua unica peculiarit`a infatti `e quella di essere lanciato per primo
direttamente dal kernel.
Questo ci porta ad unaltra caratteristica fondamentale dellarchitettura dei sistemi unix-like
(ci torneremo in dettaglio in sez. 1.3) che `e quella per cui qualunque processo pu`o a sua volta
` questo che permette lavvio del sistema eseguendo un unico programma
lanciarne di nuovi.10 E
di inizializzazione come init, dato che questultimo potr`a poi lanciare altri programmi, che a
loro volta ne potranno lanciare degli altri ancora, fino a fornire tutte le funzionalit`a richieste per
il funzionamento del sistema.
Benche sia possibile per usi particolari (ad esempio in sistemi embedded 11 che devono svolgere
un solo compito) far partire un qualunque altro programma al posto di init,12 in pratica tutti i
sistemi Unix usano un programma con questo nome per gestire lavvio del sistema, ed `e a seconda
degli ulteriori programmi che init mette in esecuzione (tratteremo largomento in sez. 5.3.5)
che alla fine della procedura di avvio ci si trover`a davanti ad un terminale a caratteri o ad una
interfaccia grafica, e si avr`
a, a seconda di quanto deciso (ed installato) dallamministratore, un
server di posta, un server web, una workstation, ecc.

questa infatti viene eseguita usando semplicemente le funzioni che permettono di leggere e scrivere il contenuto
di un file, leggendo loriginale e scrivendo sulla copia.
9
in rigoroso ordine alfabetico!
10
nel qual caso si dice che il primo processo `e il padre degli altri, che a loro volta sono chiamati figli.
11
si chiamano cos` i sistemi destinati allesecuzione di compiti specifici, come quelli dei telefonini, dei
videoregistratori, ecc.
12
vedremo in sez. 5.3 come in casi di emergenza si pu`
o lanciare al suo posto una shell.

1.1. LARCHITETTURA DEL SISTEMA.

1.1.3

Alcune caratteristiche specifiche di Linux

Benche Linux stia diventando il pi`


u diffuso, esistono parecchi altri kernel unix-like, sia liberi
che proprietari, nati nella tumultuosa e complessa evoluzione che dallo Unix originario della
AT/T ha portato alla nascita di una miriade di sistemi derivati (BSD, Solaris, AIX, HP-UX,
Digital Unix, IRIX, solo per citare i pi`
u noti) che si innestano tutti in due rami principali, quelli
derivati dal sistema sviluppato dalla AT/T, detto SysV (da System V, lultima versione ufficiale)
e quelli derivati dal codice sviluppato alluniversit`a di Berkeley, detto BSD (da Berkeley Software
Distribution). La prima caratteristica distintiva di Linux `e che esso `e stato riscritto da zero, per
cui non `e classificabile in nessuno di questi due rami e prende invece, a seconda dei casi, quelle
che sono state ritenute le migliori caratteristiche di ciascuno di essi.
Unaltra delle caratteristiche peculiari di Linux rispetto agli altri kernel unix-like `e quella
di essere modulare; Linux cio`e pu`
o essere esteso (torneremo su questo in sez. 5.2.5) inserendo
a sistema attivo degli ulteriori pezzi, i moduli, che permettono di ampliare le capacit`
a del
sistema (ad esempio fargli riconoscere una nuova periferica). Questi possono poi essere tolti dal
sistema quando non sono pi`
u necessari: un caso tipico pu`o essere quello del modulo che permette
di vedere il floppy, viene caricato solo quando c`e necessit`a di leggere un dischetto e pu`o essere
rimosso una volta che questo non sia pi`
u in uso.
In realt`
a `e sempre possibile costruire un kernel Linux comprensivo di tutti i moduli che
servono, ottenendo quello che viene chiamato un kernel monolitico (come sono i kernel degli
altri Unix); questo permette di evitare il ritardo nel caricamento dei moduli al momento della
richiesta, ma comporta un maggiore consumo di memoria (dovendo tenere dentro il kernel anche
codice non utilizzato), ed una flessibilit`a nettamente inferiore, in quanto si perde la capacit`
a di
poter specificare eventuali opzioni al momento del caricamento, costringendo al riavvio in caso
di necessit`
a di cambiamenti.
Per contro in certi casi luso dei moduli pu`o degradare leggermente le prestazioni (quasi
sempre in maniera non avvertibile) e pu`o dar luogo a conflitti inaspettati (che con un kernel
monolitico avrebbero bloccato il sistema allavvio), ma questi problemi oggi sono sempre pi`
u
rari. In ogni caso non `e possibile utilizzare i moduli nel caso in cui la funzionalit`a da essi fornite
siano necessarie ad avviare il sistema.
Una terza peculiarit`
a di Linux `e quella del Virtual File System (o VFS). Un concetto generale
presente in tutti i sistemi Unix (e non solo) `e che lo spazio su disco su cui vengono tenuti i file
di dati `e organizzato in quello che viene chiamato un filesystem (tratteremo lamministrazione
dei filesystem in sez. 5.1). Lo spazio disco grezzo `e normalmente13 suddiviso in settori contigui
di dimensione fissa, ma allinterno del sistema questo viene organizzato in maniera tale da
permettere il rapido reperimento delle informazioni memorizzate su questi settori, anche quando
queste sono sparse qua e l`
a sul disco; si ha cos` quello che lutente vede come un singolo file.
Quello che contraddistingue Linux `e che linterfaccia per la lettura del contenuto di un
filesystem `e stata completamente virtualizzata, per cui inserendo gli opportuni moduli nel sistema
diventa possibile accedere con la stessa interfaccia (e, salvo limitazioni della realizzazione, in
maniera completamente trasparente allutente) ai pi`
u svariati tipi di filesystem, a partire da
quelli usati da Windows e dal DOS, dal MacOS, e da tutte le altre versioni di Unix.
Dato che essa gioca un ruolo centrale nel sistema, torneremo in dettaglio sullinterfaccia dei
file (e di come possa essere usata anche per altro che i file di dati) in sez. 1.2; quello che `e
importante tenere presente da subito `e che la disponibilit`a di una astrazione delle operazioni sui
file rende Linux estremamente flessibile, dato che attraverso di essa `e stato in grado, fin dalle
prime versioni, di supportare con relativa facilit`a ed in maniera nativa una quantit`a di filesystem
superiore a quella di qualunque altro sistema operativo.
13

nel senso che le interfacce hardware per i dischi consentono laccesso diretto al contenuto di questi settori.

1.2

CAPITOLO 1. LARCHITETTURA DI UN SISTEMA GNU/LINUX

Larchitettura dei file

Un aspetto fondamentale dellarchitettura di GNU/Linux `e quello della gestione dei file. Esso
deriva direttamente da uno dei criteri base della progettazione di tutti i sistemi Unix, quello
espresso dalla frase everything is a file (cio`e tutto `e un file), per cui laccesso ai file e alle
periferiche `e gestito attraverso una interfaccia identica.
Inoltre, essendo in presenza di un sistema multiutente e multitasking, il kernel deve anche
essere in grado di gestire laccesso contemporaneo allo stesso file da parte di pi`
u processi, e
questo viene fatto usando un disegno specifico nella struttura delle interfacce di accesso, che `e
uno dei punti di maggior forza dellarchitettura di un sistema Unix.

1.2.1

Il Virtual File System e le caratteristiche dei file.

Come accennato in sez. 1.1.3 i file sono organizzati sui dischi allinterno di filesystem. Perche i
file diventino accessibili al sistema un filesystem deve essere montato in modo che essi siano resi
visibili allinterno di una certa directory. Questa `e una operazione privilegiata che normalmente
pu`o fare solo lamministratore (ne tratteremo i dettagli pi`
u avanti, in sez. 5.1.3), che provvede
a rendere disponibili le interfacce (in genere attraverso il caricamento di opportuni moduli del
kernel) che permettono laccesso ai file contenuti nel filesystem.
Come esempio consideriamo il caso in cui si voglia leggere il contenuto di un CD. Il kernel
dovr`a poter disporre sia delle interfacce per poter parlare al dispositivo fisico (ad esempio il
supporto SCSI, se il CDROM `e SCSI), che di quelle per la lettura dal dispositivo specifico (il
modulo che si interfaccia ai CDROM, che `e lo stesso che questi siano su SCSI, IDE o USB), sia
di quelle che permettono di interpretare il filesystem ISO9660 (che `e quello che di solito viene
usato per i dati registrati su un CDROM) per estrarne il contenuto dei file. Allo stesso modo se
si volessero leggere i dati su un dischetto occorrerebbe sia il supporto per laccesso al floppy, che
quello per poter leggere il filesystem che c`e sopra (ad esempio vfat per un dischetto Windows e
hfs per un dischetto MacOS).
Come accennato nellintroduzione a questa sezione, uno dei criteri fondamentali dellarchitettura di un sistema Unix `e quello per cui tutto `e un file e che altro non significa che si pu`o
accedere a tutte le periferiche14 con una interfaccia identica a quella con cui si accede al contenuto dei file. Questo comporta una serie di differenze nella gestione dei file rispetto ad altri
sistemi.
Anzitutto in un sistema Unix tutti i file di dati sono uguali (non esiste la differenza fra file di
testo o binari che c`e in Windows, ne fra file sequenziali e ad accesso diretto che cera nel VMS).
Inoltre le estensioni sono solo convenzioni, e non significano nulla per il kernel, che legge tutti i
file di dati alla stessa maniera, indipendentemente dal nome e dal contenuto.
In realt`a il sistema prevede tipi diversi di file, ma in un altro senso; ad esempio il sistema pu`o
accedere alle periferiche, attraverso dei file speciali detti device file o file di dispositivo. Cos` si
pu`o suonare una canzone scrivendo su /dev/dsp,15 leggere loutput di una seriale direttamente
da /dev/ttyS0, leggere direttamente dai settori fisici del disco rigido accedendo a /dev/hda,
o fare animazioni sullo schermo scrivendo su /dev/fb0 (questo `e molto pi`
u difficile da fare a
mano). Un elenco dei vari tipi oggetti visti come file dal kernel `e riportato in tab. 1.1; ognuno
di questi fornisce una funzionalit`
a specifica, sempre descritta nella medesima tabella.
Altri due tipi di file speciali riportati in tab. 1.1 sono le fifo ed i socket, che altro non sono
che dei canali di comunicazione messi a disposizione dal kernel ai processi, perche questi possano
14
con la sola eccezione delle interfacce ai dispositivi di rete, che non rientrano bene nellastrazione e sono gestite
in maniera diversa.
15
se usate il vecchio supporto audio con OSS; con ALSA (la nuova infrastruttura del kernel per i dispositivi
audio) i nomi dei dispositivi sono diversi.

1.2. LARCHITETTURA DEI FILE

Tipo di file
regular file
file regolare

directory

symbolic link
char device
block device
fifo o pipe
socket

cartella o direttorio
collegamento
simbolico
dispositivo a
caratteri
dispositivo a
blocchi
coda o tubo
presa

l
c
b
p
s

Descrizione
un file che contiene dei dati (ci`
o che si
intende normalmente per file).
un file che contiene una lista di nomi
associati a degli inode.
un file che contiene un riferimento ad un
altro file o directory.
un file che identifica una periferica ad
accesso a caratteri.
un file che identifica una periferica ad
accesso a blocchi.
un file speciale che identifica una linea di
comunicazione unidirezionale.
un file speciale che identifica una linea di
comunicazione bidirezionale.

Tabella 1.1: I vari tipi di file riconosciuti da Linux

parlarsi fra di loro. Dato che, come accennato in sez 1.1, i processi sono completamente separati,
pu`o essere soltanto il kernel a fornire le funzionalit`a che permettano la comunicazione.
Questi file speciali sono due modalit`a diverse per realizzare una comunicazione fra processi
diversi; aprendo una fifo un processo pu`o scrivervi sopra ed un altro processo che ha aperto
la fifo legger`
a dallaltro capo quanto il primo ha scritto,16 niente verr`a salvato su disco, ma
passer`a tutto attraverso il kernel che consente questa comunicazione come attraverso un tubo
(da questo deriva il nome pipe). I socket fanno la stessa cosa ma consentono una comunicazione
bidirezionale, in cui il secondo processo pu`o scrivere indietro, ed il primo leggere, quando invece
per le fifo il flusso dei dati `e unidirezionale.
La possibilit`
a di avere tutti questi tipi di file speciali `e dovuta al fatto che, come accennavamo
in sez. 1.1.3, in Linux laccesso ai file viene eseguito attraverso una interfaccia unificata, il Virtual
File System, che definisce una serie di operazioni generiche che sono le stesse per tutti gli oggetti
che essa gestisce; `e questo che implementa la filosofia progettuale del tutto `e un file.
Le principali operazioni sono riportate in tab. 1.2; ogni oggetto del sistema visto attraverso
il Virtual File System definisce la sua versione di queste operazioni. Come si pu`o notare sono
definite sia operazioni generiche come la lettura e la scrittura, che pi`
u specialistiche, come lo
17
spostamento allinterno di un file. Quando si utilizzano le system call per accedere ad un file
sar`a compito del kernel chiamare loperazione relativa ad esso associata (che sar`a ovviamente
diversa a seconda del tipo di file), o riportare un errore quando questultima non sia definita
(ad esempio sul file di dispositivo associato alla seriale non si potr`a mai utilizzare loperazione
di spostamento llseek ).
Funzione
open
read
write
llseek
ioctl
readdir

Operazione
apre il file.
legge dal file.
scrive sul file.
si sposta allinterno del file.
accede alle operazioni di controllo.
legge il contenuto di una directory.

Tabella 1.2: Principali operazioni sui file definite nel VFS.


16

luso delle fifo su disco `e in realt`


a abbastanza complesso e benche quasi sempre coinvolga due soli processi
(uno che scrive e uno che legge) si possono avere situazioni pi`
u complicate; la trattazione dellargomento va oltre
gli scopi di queste dispense, chi fosse interessato pu`
o trovare delle spiegazioni dettagliate sullargomento nella
sezione 12.1 di [GaPiL].
17
ce ne sono altre ancora pi`
u complesse, che non sono state riportate in tab. 1.2.

CAPITOLO 1. LARCHITETTURA DI UN SISTEMA GNU/LINUX

Il Virtual File System `e anche il meccanismo che permette al kernel di gestire tanti filesystem
diversi; quando uno di questi viene montato `e compito del kernel utilizzare per le varie system
call le opportune operazioni in grado di accedere al contenuto di quel particolare filesystem;
questa `e la ragione principale della grande flessibilit`a di Linux nel supportare i filesystem pi`
u
diversi, basta definire queste operazioni per un filesystem per poterne permettere laccesso da
parte delle varie system call secondo la stessa interfaccia.
Uno dei programmi fondamentali per la gestione dei file attraverso linterfaccia a riga di
comando `e ls,18 che mostra, se invocato senza nessun argomento, lelenco dei file nella directory
corrente. Usando lopzione -l `e invece possibile ottenere una lista estesa, in cui compaiono
varie propriet`a dei file. Ad esempio, avendo creato una directory con i vari tipi di file citati in
tab. 1.1,19 si potr`
a andare in detta directory ed ottenere:
piccardi@oppish:~/filetypes$ ls -l
total 1
brw-r--r-1 root
root
crw-r--r-1 root
root
drwxr-xr-x
2 piccardi piccardi
prw-r--r-1 piccardi piccardi
-rw-r--r-1 piccardi piccardi
lrwxrwxrwx
1 piccardi piccardi

1,
1,

2
2
48
0
0
4

Jul
Jul
Jul
Jul
Jul
Jul

8
8
8
8
8
8

14:48
14:48
14:24
14:24
14:24
14:25

block
char
dir
fifo
file
link -> file

e si noti come la prima lettera in ciascuna riga indichi il tipo di file, anche questo secondo la
notazione riportata nella terza colonna di tab. 1.1.
Il comando ls `e dotato di innumerevoli opzioni, che gli consentono di visualizzare le varie
caratteristiche dei file, delle quali il tipo `e solo una. Altre caratteristiche sono: i tempi di ultimo
accesso, modifica e cambiamento (su cui torneremo fra poco), le informazioni relative a permessi
di accesso e proprietari del file (che vedremo in dettaglio in sez. 1.4.2), la dimensione, il numero
di hard link (che vedremo in sez. 1.2.2).
Il comando prende come argomento una lista di file o directory; senza opzioni viene mostrato
solo il nome del file (se esiste) o il contenuto della directory specificata. Le opzioni sono moltissime, e le principali sono riportate in tab. 1.3; lelenco completo `e riportato nella pagina di
manuale accessibile con il comando man ls.
Opzione
-l
-a
-i
-R
-c
-u
-d

Significato
scrive la lista in formato esteso.
mostra i file invisibili.
scrive il numero di inode (vedi sez. 1.2.2).
esegue la lista ricorsivamente per tutte le sottodirectory.
usa il tempo di ultimo cambiamento del file.
usa il tempo di ultimo accesso al file.
mostra solo il nome e non il contenuto quando riferito ad
una directory, e non segue i link simbolici.
Tabella 1.3: Principali opzioni del comando ls.

Una convenzione vuole che i file il cui nome inizia con un punto (.) non vengano riportati
nelloutput di ls, a meno di non richiederlo esplicitamente con luso dellopzione -a; per questo
tali file sono detti invisibili. Si tenga presente comunque che questa non `e una propriet`a dei file
e non ha nulla a che fare con le modalit`
a con cui il kernel li tratta (che sono sempre le stesse),
ma solo una convenzione usata e rispettata dai vari programmi in user space.
Lopzione -l permette di mostrare una lista in formato esteso in cui vengono riportate molte
informazioni concernenti il file. Abbiamo visto in precedenza un esempio di questa lista, e come
18

il cui nome, non proprio intuitivo, deriva da LiSt file.


con leccezione dei socket, questi ultimi infatti non sono di norma utilizzati dai comandi di shell, ma vengono
creati direttamente dai programmi che li usano (il caso pi`
u comune `e X Window), non esiste pertanto un comando
di uso comune che permetta di crearne uno in maniera esplicita.
19

1.2. LARCHITETTURA DEI FILE

il primo carattere della prima colonna indichi tipo di file, mentre il resto della colonna indica i
permessi del file, secondo una notazione su cui torneremo in sez. 1.4.2. Il secondo campo indica
il numero di hard link al file (su questo torneremo in sez. 1.2.2), mentre il terzo ed il quarto
campo indicano rispettivamente utente e gruppo proprietari del file (anche questo sar`a trattato
in sez. 1.4.2). Il quinto campo indica la dimensione, usualmente riportata in byte. Il sesto campo
`e il tempo di ultima modifica del file e lultimo campo il nome del file.
In un sistema unix-like i tempi associati ai file (mantenuti automaticamente dal kernel quando
opera su di essi) sono tre ed hanno un significato diverso rispetto a quanto si trova in altri
sistemi operativi.20 Il tempo mostrato di default da ls `e il cosiddetto tempo di ultima modifica
(o modification time) che corrisponde allultima volta che `e stato modificato il contenuto di un
file. Si badi bene che questo tempo riguarda solo il contenuto del file, se invece si operano
delle modifiche sulle propriet`
a del file (ad esempio si cambiano i permessi) varia quello che
viene chiamato tempo di ultimo cambiamento (o change time) che viene visualizzato da ls con
lopzione -c. Infine tutte le volte che si accede al contenuto del file viene cambiato21 il tempo
di ultimo accesso (o access time) che pu`o essere visualizzato da ls con lopzione -u.
Si noti infine come fra i precedenti tempi non ci sia un tempo di creazione del file, che
in un sistema unix-like non esiste come informazione a parte. Quando un file viene creato
infatti vengono impostati i tre tempi precedenti al tempo corrente, ma questa informazione verr`
a
sovrascritta nelle operazioni successive; fintanto che non si modificano i contenuti comunque si
potr`a considerare il tempo di ultima modifica come coincidente con il tempo di creazione.
Per operare sui tempi associati ad un file esiste un apposito comando, touch. In genere
questo comando viene usato in quasi tutti gli esempi per creare un file vuoto, ma in realt`a il suo
scopo non `e questo (dato che lo stesso compito si potrebbe eseguire in molti altri modi) quanto
piuttosto, come dice il nome, quello di toccare un file.
Il comando prende come argomenti uno o pi`
u nomi di file. Se uno di questi non esistono il
risultato del comando `e quello di crearlo vuoto, ma se invece esiste leffetto del comando `e quello
di modificare al tempo corrente i tempi di ultimo accesso e ultima modifica.22 Il comando prende
varie opzioni e permette di modificare solo il tempo di ultimo accesso; se usato con lopzione -a
o solo quello di ultima modifica, se usato con lopzione -m, si pu`o specificare una data con -d
(per il formato si veda sez. 2.4.3) o prendere i valori da un altro file con lopzione -r. I dettagli e
lelenco completo delle opzioni sono al solito sulla pagina di manuale, accessibile con man touch.

1.2.2

Larchitettura di un filesystem e le propriet`


a dei file

Come gi`a accennato Linux (ed ogni sistema unix-like) organizza i dati che tiene su disco attraverso luso di un filesystem. Una delle caratteristiche di Linux rispetto agli altri Unix `e quella di
poter supportare, grazie al VFS, una enorme quantit`a di filesystem diversi, ognuno dei quali ha
una sua particolare struttura e funzionalit`a proprie.23 Per questo non entreremo nei dettagli di
un filesystem specifico, ma daremo una descrizione a grandi linee che si adatta alle caratteristiche
comuni di un filesystem generico usato su un sistema unix-like.
Se si va ad esaminare con maggiore dettaglio come `e strutturata linformazione allinterno di
un singolo filesystem, possiamo esemplificare la situazione con uno schema come quello esposto
in fig. 1.2, da cui si evidenziano alcune delle caratteristiche di base di un filesystem, sulle quali `e
bene porre attenzione visto che sono fondamentali per capire il funzionamento dei comandi che
manipolano i file e le directory.
20

per una trattazione dettagliata di questo argomento si pu`


o consultare il capitolo 5.2.4 di [GaPiL].
a meno che questa funzionalit`
a non sia stata disabilitata; vedremo come farlo per un filesystem in sez. 5.1.3
e per un singolo file in sez. 1.4.4.
22
il tempo di ultimo cambiamento viene modificato solo dal kernel, e non esiste una modalit`
a immediata (che
non sia quella di andare a sovrascrivere linformazione con un accesso diretto al disco) per cambiarlo manualmente.
23
riprenderemo largomento della gestione di dischi e filesystem in sez. 5.1.
21

10

CAPITOLO 1. LARCHITETTURA DI UN SISTEMA GNU/LINUX

Figura 1.2: Strutturazione dei dati allinterno di un filesystem.

La struttura che identifica univocamente un singolo file allinterno di un filesystem `e il cosiddetto inode: ciascun file `e associato ad un inode in cui sono mantenute tutte le informazioni che
lo riguardano, come il tipo (fra quelli di tab. 1.1), i permessi di accesso (vedi sez. 1.4.2), utente
e gruppo proprietario, le dimensioni, i tempi, ed anche tutti i riferimenti ai settori del disco
(i blocchi fisici) che contengono i dati; le informazioni che fornisce il comando ls provengono
dallinode.
Lunica informazione relativa al file non contenuta nellinode `e il suo nome; infatti il nome di
un file non `e una propriet`
a del file, ma semplicemente una etichetta associata ad un inode. Le
directory infatti non contengono i file, ma sono dei file speciali (di tipo directory, cos` che il kernel
pu`o trattarle in maniera diversa) il cui contenuto `e semplicemente una lista di nomi a ciascuno
dei quali viene associato un numero di inode che identifica il file cui il nome fa riferimento.
Come mostrato in fig. 1.2 si possono avere pi`
u voci in directory diverse che puntano allo
stesso inode. Questo introduce il concetto di hard link (detto anche collegamento diretto): due
file che puntano allo stesso inode sono fisicamente lo stesso file, nessuna propriet`a specifica, come
permessi, tempi di accesso o contenuto permette di distinguerli, in quanto laccesso avviene per
entrambi attraverso lo stesso inode.
Siccome uno stesso inode pu`
o essere referenziato in pi`
u directory, un file pu`o avere pi`
u
nomi, anche completamente scorrelati fra loro. Per questo ogni inode mantiene un contatore che
indica il numero di riferimenti (detto link count) che gli sono stati fatti; questo viene mostrato,
nellesempio del precedente risultato di ls -l, dal valore numerico riportato nel secondo campo,
e ci permette di dire se un file ha degli hard link (anche se non indica dove sono).
Il comando generico che permette di creare dei link `e ln che prende come argomenti il file
originale ed il nome del link. La differenza rispetto a Windows o MacOS `e che in un sistema

1.2. LARCHITETTURA DEI FILE

11

unix-like i link sono di due tipi, oltre agli hard link appena illustrati infatti esistono anche i
cosiddetti collegamenti simbolici, o symbolic link (quelli pi`
u simili ai collegamenti di Windows o
agli alias del MacOS), come il file link mostrato in precedenza.
Per creare un hard link basta usare direttamente il comando ln,24 che di default crea questo
tipo di collegamento. Cos` possiamo creare un nuovo file hardlink come hard link al file file
visto in precedenza usando il comando:
ln file hardlink
e se riesaminiamo la lista dei file otterremo che:
piccardi@oppish:~/filetypes$ ls -l
total 1
brw-r--r-1 root
root
crw-r--r-1 root
root
drwxr-xr-x
2 piccardi piccardi
prw-r--r-1 piccardi piccardi
-rw-r--r-2 piccardi piccardi
-rw-r--r-2 piccardi piccardi
lrwxrwxrwx
1 piccardi piccardi

1,
1,

2
2
48
0
0
0
4

Jul
Jul
Jul
Jul
Jul
Jul
Jul

8
8
8
8
8
8
8

14:48
14:48
14:24
14:24
14:24
14:24
14:25

block
char
dir
fifo
file
hardlink
link -> file

e si noti come adesso il secondo campo mostri sia per file che per hardlink un valore pari
a due, dato che entrambi fanno riferimento allo stesso inode (che adesso ha due collegamenti).
Usando lopzione -i di ls possiamo allora stampare per ciascun file il rispettivo numero di inode,
ottenendo:
piccardi@oppish:~/filetypes$ ls -li
total 1
2118 brw-r--r-1 root
root
2120 crw-r--r-1 root
root
15 drwxr-xr-x
2 piccardi piccardi
2115 prw-r--r-1 piccardi piccardi
2117 -rw-r--r-2 piccardi piccardi
2117 -rw-r--r-2 piccardi piccardi
2116 lrwxrwxrwx
1 piccardi piccardi

1,
1,

2
2
48
0
0
0
4

Jul
Jul
Jul
Jul
Jul
Jul
Jul

8
8
8
8
8
8
8

14:48
14:48
14:24
14:24
14:24
14:24
14:25

block
char
dir
fifo
file
hardlink
link -> file

e adesso si pu`
o verificare come effettivamente file e hardlink abbiano lo stesso numero di
inode, pari a 2117.
Un limite che si ha con gli hard link `e dovuto al fatto che le directory contengono semplicemente lassociazione fra un nome ed un numero di inode, il che comporta che si pu`
o fare
riferimento solo ad un inode presente nello stesso filesystem della directory. Questo avviene
perche ogni filesystem numera progressivamente i propri inode, da cui segue che su un altro
filesystem lo stesso numero di inode identificher`a un file diverso. Questo limita luso degli hard
link solo a file residenti sul filesystem corrente, ed infatti il comando ln dar`a un errore se si
cerca di creare un hard link ad un file posto in un altro filesystem.
Per superare questa limitazione sono stati introdotti i cosiddetti link simbolici, che vengono
creati usando lopzione -s del comando ln; ad esempio si `e creato il link simbolico link mostrato
nellesempio precedente con il comando:
ln -s file link
In questo caso viene creato un nuovo file, di tipo symbolic link, che avr`a un suo diverso
inode (come risulta nelloutput di ls -li appena mostrato) ed il cui contenuto `e il percorso
(torneremo sulla notazione che esprime i pathname dei file fra poco) da fare per arrivare al file
24

il nome del comando deriva da LiNk file.

12

CAPITOLO 1. LARCHITETTURA DI UN SISTEMA GNU/LINUX

` compito
a cui esso fa riferimento, che a questo punto pu`o essere in qualsiasi altro filesystem. E
del kernel far s` che quando si usa un link simbolico si vada poi ad operare sul file che questo ci
indica,25 ed `e questo il motivo per cui per i link simbolici esiste un apposito tipo di file, come
riportato in tab. 1.1.
Oltre a -s il comando ln prende una serie di altre opzioni, le principali delle quali sono
riportate in tab. 1.4. La lista completa `e riportata nella pagina di manuale, accessibile attraverso
il comando man ln.
Opzione
-s
-f
-i
-d
-b

Significato
crea un link simbolico.
forza la sovrascrittura del nuovo file se esso esiste gi`
a.
richiede conferma in caso di sovrascrittura.
crea un hard link ad una directory (in Linux questa non
`e usabile).
esegue un backup della destinazione se questa esiste gi`
a.
Tabella 1.4: Principali opzioni del comando ln.

Una seconda caratteristica dei link simbolici `e la possibilit`a di creare dei link anche per
delle directory. Questa capacit`
a infatti, sebbene teoricamente possibile anche per gli hard link,
in Linux non `e supportata per la sua pericolosit`a, `e possibile infatti creare dei link loop se si
commette lerrore di creare un collegamento alla directory che contiene il collegamento stesso; con
un link simbolico questo errore pu`
o essere corretto in quanto la cancellazione del link simbolico
rimuove questultimo, e non il file referenziato, ma con un hard link non `e pi`
u possibile fare
questa distinzione e la rimozione diventa impossibile.
La possibilit`
a di creare dei collegamenti alle directory tuttavia `e estremamente utile, infatti
qualora si voglia accedere ai file in una directory attraverso un percorso diverso, ad esempio a
causa di un programma che cerca dei file di configurazione in una locazione diversa da quella
usuale, piuttosto che dover spostare tutti i file baster`a creare un link simbolico e si sar`a risolto
il problema.
Oltre agli hard link la struttura di un filesystem unix-like ha ulteriori conseguenze non
immediate da capire per chi proviene da sistemi operativi diversi. La presenza degli hard link e
luso degli inode nelle directory infatti comporta anche una modalit`a diversa nella cancellazione
dei file e nello spostamento degli stessi.
Il comando per la cancellazione di un file `e rm,26 ma la funzione usata dal sistema per
effettuare questo compito si chiama in realt`a unlink ed essa, come ci dice il nome, non cancella
affatto i dati del file, ma si limita ad eliminare la relativa voce da una directory e decrementare
il numero di riferimenti presenti nellinode.
Solo quando il numero di riferimenti ad un inode si annulla, i dati del file vengono effettivamente rimossi dal disco dal kernel.27 In realt`a oltre ai riferimenti mostrati da ls il kernel
mantiene anche unaltra lista di riferimenti, per ciascun processo che sta accedendo al file, per
cui anche se si cancella un file da una directory e non restano altri hard link al relativo inode,
25

una trattazione dettagliata su come vengono gestite dal kernel le operazioni sui link simbolici si pu`
o trovare
in sez. 5.1.3 di [GaPiL].
26
il cui nome deriva da ReMove file.
27
anche questo `e vero solo parzialmente, i dati in realt`
a non vengono toccati, viene solo dichiarato come disponibile lo spazio da loro occupato, che cos` pu`
o essere riutilizzato; questo comporta che `e possibile, se nessuno ha
usato tale spazio, trovare ancora sul disco i suddetti dati (con degli appositi programmi di recupero); per questo
quando si vuole essere davvero sicuri che i dati siano cancellati si deve utilizzare al posto di rm un comando come
shred che provvede anche ad una opportuna sovrascrittura che renda sostanzialmente impossibile recuperare il
precedente contenuto del file (per i dettagli si consulti la pagina di manuale).

1.2. LARCHITETTURA DEI FILE

13

ma resta attivo un processo che lo utilizza, lo spazio disco non verr`a rilasciato, e fintanto che il
processo non avr`
a finito i dati resteranno, anche se solo per lui, disponibili.28
Il comando rm prende come argomenti una lista di file da cancellare; se si usa lopzione
-i il comando chiede di confermare la cancellazione, mentre con lopzione -f si annulla ogni
precedente -i ed inoltre non vengono stampati errori per file non esistenti. Infine lopzione -R (o
-r) permette la cancellazione ricorsiva di una directory e di tutto il suo contenuto, ed `e pertanto
da usare con estrema attenzione, specie se abbinata con -f.29 La lista completa delle opzioni `e
riportata nella pagina di manuale, accessibile con il comando man rm.
Come accennato la struttura di un filesystem unix-like comporta anche una diversa concezione delloperazione di spostamento dei file, che nel caso pi`
u semplice `e semplicemente equivalente
a quella di cambiare il nome del file. Il comando per compiere questa operazione infatti `e unico
e si chiama mv, il cui nome deriva da MoVe file.
Infatti fintanto che si sposta un file da una directory ad un altra senza cambiare filesystem,
non c`e nessuna necessit`
a di spostare il contenuto del file e basta semplicemente che sia creata
una nuova voce per linode in questione rimuovendo al contempo la vecchia: esattamente la
stessa cosa che avviene quando gli si cambia nome (nel qual caso loperazione viene effettuata
allinterno della stessa directory). Qualora invece si debba effettuare lo spostamento ad una
directory su un filesystem diverso diventa necessario prima copiare il contenuto e poi cancellare
loriginale.30
Il comando mv ha due forme, pu`
o prendere cio`e come argomenti o due nomi di file o una lista
di file seguita da una directory. Nel primo caso rinomina il primo file nel secondo, cancellando
questultimo qualora esista gi`
a; nel secondo caso sposta tutti i file della lista nella directory
passata come ultimo argomento, sempre cancellando eventuali file con lo stesso nome in essa
presenti. Dato che anche le directory sono file, il comando opera anche su queste, usando la
stessa sintassi.31 Le principali opzioni del comando sono riportate in tab. 1.5, lelenco completo
`e riportato nella pagina di manuale, accessibile con il comando man mv.
Opzione
-i
-f
-u
-b

Significato
richiede conferma in caso di sovrascrittura.
forza la sovrascrittura del nuovo file se esso esiste gi`
a.
esegue lo spostamento solo se la destinazione `e pi`
u vecchia
della sorgente (o non esiste).
esegue un backup della destinazione se questa esiste gi`
a.
Tabella 1.5: Principali opzioni del comando mv.

Dato che il comando si limita a cambiare una voce associata ad un numero di inode allinterno
di una directory, fintanto che lo spostamento avviene allinterno dello stesso filesystem, i tempi dei
file non vengono modificati dalluso di mv. Quando per`o lo spostamento avviene fra filesystem
diversi viene copiato il contenuto e cancellato il file originario, pertanto in teoria dovrebbero
risultare modificati anche i tempi di ultimo accesso e modifica. In realt`a il comando provvede a
ripristinare questi tempi (come le altre caratteristiche del file) al valore del file originario, ma non
28

per approfondire questo aspetto dellarchitettura dei file per un sistema operativo unix-like, si pu`
o consultare
il capitolo 6 di [GaPiL].
29
uno dei sistemi pi`
u efficaci per distruggere una installazione `e un rm -fR eseguito come amministratore nel
posto sbagliato, e anche se come utente non si pu`
o danneggiare il sistema, `e comunque molto semplice spazzare
via tutti i propri dati.
30
si ricordi infatti che in questo caso si avr`
a a che fare con un inode diverso, situato in un filesystem diverso.
31
con qualche piccola differenza, se ad esempio si cerca di rinominare una directory col nome di un file gi`
a
presente si avr`
a un errore, e se si cerca di rinominare una directory col nome di unaltra si otterr`
a invece uno
spostamento dentro questultima.

14

CAPITOLO 1. LARCHITETTURA DI UN SISTEMA GNU/LINUX

pu`o fare nulla per ripristinare il tempo di ultimo cambiamento.32 Pertanto in quel caso si potr`a
notare, usando ls -lc, che questo `e cambiato e corrisponde al momento dello spostamento.
Qualora invece si voglia duplicare un file il comando da usare `e cp.33 Come per mv il comando
pu`o prendere come argomenti o due nomi di file o una lista di file seguita da una directory; nel
primo caso effettua una copia del primo file sul secondo, nel secondo copia tutti file della lista
nella directory specificata.
Dato che il comando funziona copiando il contenuto di un file su un nuovo file creato per
loccasione, i tempi di ultima modifica, accesso e cambiamento di questultimo corrisponderanno
al momento in cui si `e eseguita loperazione. Inoltre il file sar`a creato con i permessi standard
dellutente che ha lanciato il comando, che risulter`a essere anche il suo proprietario. Se si
vogliono preservare invece le caratteristiche del file originale occorrer`a usare lopzione -p.34
Opzione
-f
-i
-p
-l
-s
-d
-r
-R
-a
-L
-b
-u

Significato
forza la sovrascrittura della destinazione se essa esiste
gi`
a.
richiede conferma in caso di sovrascrittura.
preserva tempi, permessi e proprietari del file.
crea degli hard link al posto delle copie.
crea dei link simbolici al posto delle copie.
copia il link simbolico invece del file da esso indicato.
copia ricorsivamente tutto il contenuto di una directory.
identico a -r.
combina le opzioni -dpR.
segue sempre i link simbolici.
esegue un backup della destinazione se questa esiste gi`
a.
esegue la copia solo se la destinazione `e pi`
u vecchia della
sorgente (o non esiste).
Tabella 1.6: Principali opzioni del comando cp.

Si tenga presente poi che nel caso di link simbolici il comando copia il file indicato tramite il
link,35 se invece si vuole copiare il link stesso occorrer`a usare lopzione -d. Il comando permette
inoltre di creare degli hard link invece che delle copie usando lopzione -l e dei link simbolici
usando lopzione -s. Una lista delle principali opzioni `e riportata in tab. 1.6, lelenco completo
`e riportato nella pagina di manuale, accessibile attraverso il comando man cp.
Fino ad ora nel descrivere gli argomenti da dare ai vari comandi che abbiamo trattato, si
`e parlato dei nomi dei file o delle directory senza entrare troppo nei dettagli su quale fosse il
formato in cui questi vengono espressi. Negli esempi infatti si sono specificati dei semplici nomi,
ma questo dava per scontati alcuni concetti che in realt`a non lo sono affatto.
La convenzione usata in tutti i sistemi unix-like `e che i nomi dei file sono indicati con un
pathname o percorso, che descrive il cammino che occorre fare nellalbero dei file per raggiungere
il file passando attraverso le varie directory; i nomi delle directory sono separati da delle barre
(il carattere /). Il percorso pu`
o essere indicato (vedi tab. 1.7) in maniera assoluta, partendo
36
dalla directory radice, ed indicando tutte le directory che si devono attraversare, o in maniera
32

il kernel fornisce delle system call che permettono di cambiare i tempi di ultimo accesso e modifica di un
file, che il comando mv pu`
o usare per ripristinare i tempi precedenti, ma non ne esistono per cambiare il tempo
di ultimo cambiamento, che corrisponder`
a pertanto al momento in cui il nuovo file `e stato creato; questa `e una
misura di sicurezza che permette sempre di verificare se un file `e stato modificato, anche se si cerca di nascondere
le modifiche.
33
il cui nome deriva da CoPy file.
34
per poterlo fare per`
o occorre eseguire il comando come amministratore.
35
questo comportamento non viene seguito in caso di copia ricorsiva, se lo si vuole abilitare occorre usare
lopzione -L.
36
torneremo sulla struttura dellalbero dei file e sul concetto di radice in sez. 1.2.3.

1.2. LARCHITETTURA DEI FILE

15

relativa, partendo dalla cosiddetta directory di lavoro corrente. Nel primo caso il pathname
inizier`a con /, mentre nel secondo no.
Esempio
/home/piccardi/GaPiL/GaPiL.tex
GaPiL/GaPiL.tex

Formato
assoluto
relativo

Tabella 1.7: Formato dei pathname assoluti e relativi.

Finora, specificando solo dei nomi semplici, abbiamo sempre fatto lassunto di operare appunto nella directory di lavoro corrente. Questa directory `e una propriet`a specifica di ogni processo,
che viene ereditata dal padre alla sua creazione (questo argomento `e trattato in sez. 1.3.2) ed
indica appunto la directory a partire dalla quale vengono risolti, per quel processo, i pathname
relativi. Questo vuol dire che si possono indicare i file presenti in quella directory direttamente,
senza doverne specificare il pathname completo a partire dalla radice.
Quando si entra nel sistema la directory di lavoro corrisponde alla home 37 dellutente; essa pu`o essere cambiata con il comando cd (da Change Directory) seguito dal pathname della
directory in cui ci si vuole spostare, mentre la si pu`o stampare a video con il comando pwd.38
Si tenga presente poi che ciascuna directory contiene sempre39 almeno due voci: la directory
. che fa riferimento a se stessa, e che usata allinizio di un pathname indica con la directory di
lavoro corrente, e la directory .., che fa riferimento alla directory in cui lattuale `e contenuta,
e che allinizio di un pathname indica la directory sovrastante quella corrente. In questo modo,
anche con dei pathname relativi, si possono fare riferimenti a directory poste in sezioni diverse
dellalbero dei file, risalendo lo stesso con luso della directory ... Si noti anche come entrambe
queste due voci (dato che iniziano per .) siano invisibili.
Inoltre, come vedremo meglio in sez. 2.1.3, la shell quando deve passare dei pathname ai
comandi che operano su file e directory (come cd, cp, ecc.) riconosce alcuni caratteri speciali, ad
esempio il carattere ~ viene usato per indicare la home dellutente corrente, mentre con ~username si indica la home dellutente username; cd riconosce inoltre come argomento il carattere
- che viene utilizzato per richiedere il ritorno alla precedente directory di lavoro.
Come accennato nella sezione precedente anche le directory sono dei file, anche se vengono
trattate dal kernel come file speciali il cui compito `e quello di contenere elenchi di nomi di
altri file. Per la creazione di una directory `e previsto un comando apposito, mkdir;40 questo
`e necessario perche alla creazione della directory devono essere create al suo interno anche le
directory . e .., che sono sempre presenti.
Il comando mkdir crea la o le directory passate come argomento; queste dovranno essere
specificate con quello che sar`
a il loro pathname, sia in forma assoluta o relativa. Perche il
comando abbia successo ovviamente la parte di percorso che deve contenere la directory che si
vuole creare deve esistere, se non `e cos` si pu`o forzare la creazione di tutte le directory indicate
nel percorso specificato con lopzione -p, se ne possono anche impostare i permessi iniziali
(torneremo su questo argomento in sez. 1.4.3) con lopzione -m.
Come per la creazione `e necessario un apposito comando, rmdir, anche per la rimozione di
una directory (rm, a meno di non usare lopzione -R che per`o cancella tutto anche il contenuto,
rimuove solo i file). Di nuovo il comando prende il nome di una o pi`
u directory vuote da
cancellare. Se le directory non sono vuote il comando fallisce (vuote significa che non ci deve
essere niente a parte le due directory . e ..). Anche in questo caso si pu`o usare lopzione
-p che cancella tutto un percorso di directory (che comunque devono essere tutte vuote).
37

ogni utente ha una sua directory personale nella quale pu`


o tenere i suoi file, che viene chiamata cos`, tratteremo
la questione pi`
u avanti in sez. 1.2.3.
38
il cui nome deriva da Print Work Directory.
39
`e compito del comando di creazione di una nuova directory far s` che esse siano sempre presenti.
40
il quale utilizza una system call apposita.

16

1.2.3

CAPITOLO 1. LARCHITETTURA DI UN SISTEMA GNU/LINUX

Lorganizzazione delle directory ed il Filesystem Hierarchy Standard

Una delle caratteristiche peculiari di un sistema unix-like `e che lalbero delle directory `e unico;
non esistono cio`e i vari dischi (o volumi) che si possono trovare in altri sistemi, come su Windows,
sul MacOS o sul VMS. Allavvio il kernel monta41 quella che si chiama la directory radice
(o root directory) dellalbero, che viene indicata con /, tutti i restanti dischi, il CDROM,
il floppy e qualunque altro dispositivo contenente file, verranno poi montati (vedi sez. 5.1.3)
successivamente in opportune sotto-directory della radice.
Come per il processo init, che non `e figlio di nessun altro processo e viene lanciato direttamente dal kernel, anche la directory radice non `e contenuta in nessuna altra directory42 e,
come accennato in sez. 1.1.1, viene montata direttamente dal kernel in fase di avvio. Per questo
motivo la directory radice viene ad assumere un ruolo particolare, ed il filesystem che la supporta
deve contenere tutti i programmi di sistema necessari allavvio (compreso init).
Un esempio di questa struttura ad albero, che al contempo ci mostra anche i contenuti delle
directory principali, pu`
o essere ottenuto con il comando tree. Se chiamato senza parametri
questo comando mostra lalbero completo a partire dalla directory corrente, scendendo in tutte
le directory sottostanti; usando lopzione -L si pu`o specificare il numero massimo di livelli a cui
scendere, per cui andando su / avremo qualcosa del tipo:
piccardi@oppish:~$ cd /
piccardi@oppish:/$ tree -L 2
.
|-- bin
|
|-- arch
...
|-- boot
|
|-- System.map-2.4.20
...
|-- cdrom
|-- dev
|
|-- MAKEDEV -> /sbin/MAKEDEV
...
|-- etc
|
|-- GNUstep
...
|-- floppy
|-- home
|
-- piccardi
|-- initrd
|-- lib
|
|-- cpp -> /usr/bin/cpp-2.95
...
|-- lost+found
|-- mnt
|
-- usb
|-- opt
|-- proc
|
|-- 1
...
|-- root
|-- sbin
|
|-- MAKEDEV
...
|-- tmp
41
loperazione di rendere visibili ai processi i file contenuti allinterno di un filesystem facendoli comparire
allinterno nellalbero dei file viene detta appunto montare il filesystem.
42
nel suo caso infatti la directory .. `e identica a . ed indica sempre la radice stessa, dato che al di sopra non
c`e niente.

1.2. LARCHITETTURA DEI FILE


|
|-|
|
|
|
|
|
|
|
|
|
|
|-|
|
|
|
|
|
|
|
|
|
|
--

17

-- ssh-XXBiWARl
usr
|-- X11R6
|-- bin
|-- doc
|-- games
|-- include
|-- info
|-- lib
|-- local
|-- sbin
|-- share
-- src
var
|-- backups
|-- cache
|-- lib
|-- local
|-- lock
|-- log
|-- mail
|-- opt
|-- run
|-- spool
-- tmp
vmlinuz -> boot/vmlinuz-2.2.20-idepci

e questo ci mostra il contenuto sommario primi due livelli dellalbero, con un esempio dei file e
delle sottodirectory presenti in una vecchia distribuzione Debian.
Lorganizzazione dellalbero delle directory `e standardizzata in maniera molto accurata da
un documento che si chiama Filesystem Hierarchy Standard (abbreviato in FHS), a cui tutte le
distribuzioni si stanno adeguando.43 Lo standard descrive in dettaglio la struttura dellalbero
delle directory e il relativo contenuto, prevedendo una divisione molto rigorosa che permette una
notevole uniformit`
a anche fra distribuzioni diverse; si organizzano cos` in maniera meticolosa ed
ordinata dati, programmi, file di configurazione, documentazione, file degli utenti, ecc.
Directory
/bin
/boot
/dev
/etc
/lib
/media
/mnt
/opt
/sbin
/srv
/tmp
/usr
/var

Contenuto
comandi essenziali.
file statici necessari al bootloader.
file di dispositivo.
file di configurazione della macchina.
librerie essenziali e moduli del kernel.
mount point per dispositivi rimovibili.
mount point montaggi temporanei.
pacchetti software addizionali.
comandi di sistema essenziali.
dati per i servizi forniti dal sistema.
file temporanei.
gerarchia secondaria.
dati variabili.

Tabella 1.8: Sottodirectory di / obbligatorie per qualunque sistema.

In particolare le directory vengono suddivise sulla base di alcuni criteri fondamentali; il primo
`e quello della possibilit`
a di contenere file il cui contenuto pu`o essere modificato (nel qual caso
il filesystem che le contiene deve essere montato in lettura/scrittura) o meno (nel qual caso il
filesystem pu`
o essere montato in sola lettura); il secondo `e quello della possibilit`a di contenere file
43

al momento dellultima revisione di questo testo (Novembre 2007) la versione corrente `e la 2.3, rilasciata nel
2004, e parte delle specifiche LSB (Linux Standard Base).

18

CAPITOLO 1. LARCHITETTURA DI UN SISTEMA GNU/LINUX

(come i programmi di sistema) che possono essere condivisi (ad esempio utilizzando un filesystem
di rete) fra pi`
u stazioni di lavoro o file che invece sono locali e specifici alla macchina in questione,
il terzo criterio `e quello di contenere o meno comandi o file (configurazioni e file di dispositivo)
che sono necessari allavvio del sistema, e che pertanto devono essere situati sul filesystem usato
per la directory radice, dato che essi non sarebbero disponibili se posti in filesystem diversi che
possono essere montati solo dopo che il sistema `e partito.
Lo standard prevede che debbano essere necessariamente presenti le sottodirectory di / specificate in tab. 1.8, mentre quelle di tab. 1.9 sono obbligatorie soltanto qualora si siano installati
i sottosistemi a cui essi fanno riferimento (utenti, /proc filesystem, diversi formati binari).44
Directory
/lib<qual>
/home
/root
/proc
/sys

Contenuto
librerie in formati alternativi.
home directory degli utenti.
home directory dellamministratore.
filesystem virtuale con informazioni su
processi e caratteristiche del sistema.
filesystem virtuale con informazioni su
driver e dispositivi (vedi sez. 5.4.5).

Tabella 1.9: Sottodirectory di / obbligatorie solo in presenza dei relativi sottosistemi.

Un elenco delle specifiche delle caratteristiche e del contenuto di ciascuna delle sottodirectory
di / `e riportato di seguito; per alcune di esse, come /usr e /var, sono previste delle ulteriori
sottogerarchie che definiscono ulteriori dettagli dellorganizzazione dei file.
/bin

Contiene i comandi essenziali del sistema (usati sia dallamministratore che dagli utenti, come ls), che devono essere disponibili anche quando non ci sono altri filesystem
montati oltre la radice, ad esempio allavvio o quando si `e in single user mode (vedi
sez. 5.3.5). Non deve avere sottodirectory e non pu`o stare su un filesystem diverso da
quello della radice.

/boot

Contiene tutti i file necessari al procedimento di boot (immagini del kernel, del bootloader, ramdisk, ecc.) eccetto i file di configurazione ed i programmi per limpostazione del
procedimento stesso (che vanno in /sbin). Pu`o stare su qualunque filesystem purche
visibile dal bootloader (vedi sez. 5.3.1).

/dev

Contiene i file di dispositivo, che permettono laccesso alle periferiche. Deve stare sullo
stesso filesystem della radice, a meno che non si sia installato nel kernel il supporto per
il devfs,45 che permette di trasferire il contenuto di questa directory su un apposito
filesystem virtuale, o si stia usando (come avviene in tutte le distribuzioni pi`
u recenti)
la creazione dinamica del contenuto della directory in fase di avvio tramite udev (vedi
sez. 5.4.5), nel qual caso essa viene in genere rimontata su un filesystem virtuale.46

/etc

Contiene i file di configurazione del sistema e gli script47 di avvio. Non deve contenere
programmi binari e non pu`
o stare su un filesystem diverso da quello della radice. I
file possono essere raggruppati a loro volta in directory; lo standard prevede solo che,

44

le eventuali /lib<qual> contengono le versioni delle librerie di sistema in formati binari diversi; le /lib
alternative sono state usate al tempo della transizione dei programmi dal formato a.out ad ELF, oggi sono usate
principalmente per quei sistemi (come gli AMD-64) che supportano diversi formati binari (32 o 64 bit).
45
ormai deprecato, assente nei kernel recenti, ed in via di sparizione.
46
deve comunque essere presente una versione statica minimale, usata per le fasi iniziali dellavvio del sistema,
che in genere viene rimontata alla partenza di udev sotto /dev/.static/dev.
47
gli script, su cui torneremo in sez. 2.1.5, sono un po gli equivalenti in ambito Unix (come potrebbe esserlo
una Ferrari in confronto ad una 500) dei file .bat del DOS, una lista di comandi messi in un file (in realt`
a si tratta
di un vero linguaggio di programmazione) e fatti eseguire automaticamente.

1.2. LARCHITETTURA DEI FILE

19

qualora siano installati, siano presenti le directory /etc/opt (per i pacchetti opzionali),
/etc/X11 (per la configurazione di X Window, vedi sez. 3.3) e /etc/sgml e /etc/xml
(per la configurazione di SGML e XML).
/home

Contiene le home directory degli utenti, la sola parte del filesystem (eccetto /tmp e
/var/tmp) su cui gli utenti hanno diritto di scrittura, che viene usata per mantenere i
loro file personali. Pu`
o essere montata su qualunque filesystem.

/lib

Contiene le librerie condivise essenziali, usate dai programmi di /bin e /sbin, e deve essere sullo stesso filesystem della radice. Qualora sia stato installato un kernel modulare
(vedi sez. 5.2.5) i moduli devono essere installati in /lib/modules.

/media Contiene i mount point (vedi sez. 5.1.3) per i dispositivi rimovibili, come CDROM,
floppy, chiavette USB, dischi USB o Firewire, ecc. Nelle distribuzioni meno recenti i
floppy ed i CDROM hanno delle directory dedicate, ma con lintroduzione di meccanismi
di rilevazione automatica dei dispositivi rimovibili (vedi sez/ 5.4.5) `e stata definita
questa directory allinterno della quale vengono create le opportune sotto-directory su
cui poi essi vengono montati un maniera automatica.
/mnt

Contiene i mount point (vedi sez. 5.1.3) per i montaggi temporanei ad uso dellamministratore di sistema; i filesystem di periferiche permanenti con supporti rimovibili come i
floppy o il CDROM che prima venivano tenuti sia in questa directory che direttamente
sotto / devono essere spostati sotto /media. Normalmente `e vuota e deve essere creata
direttamente sotto la radice.

/opt

Contiene eventuali pacchetti software aggiuntivi. Pu`o essere su qualunque filesystem.


Un pacchetto deve installarsi nella directory /opt/package dove package `e il nome del
pacchetto. Allamministratore `e riservato luso di alcune directory opzionali: /opt/bin,
/opt/doc, /opt/include, /opt/info, /opt/lib e /opt/man. File variabili attinenti
ai suddetti pacchetti devono essere installati in /var/opt ed i file di configurazione in
/etc/opt, nessun file attinente ai pacchetti deve essere installato al di fuori di queste
directory.

/proc

` il mount point standard del filesystem virtuale proc. Questo `e un filesystem speciale
E
che permette di accedere a tutta una serie di variabili interne al kernel (relative a
parametri e impostazioni di tutti tipi) con linterfaccia dei file. Cos` se si vogliono
informazioni sugli interrupt ed i canali di DMA (vedi sez. 5.4.1) utilizzati dal sistema si
potranno leggere i file /proc/interrupts e /proc/dma, mentre si potranno impostare
varie caratteristiche del sistema scrivendo nei file sotto /proc/sys (vedi sez. 3.1.3).

/root

` la home directory dellamministratore. Di norma la si mantiene nello stesso filesystem


E
della radice; il suo uso `e opzionale ma questa `e la collocazione consigliata.

/sbin

Contiene i programmi essenziali ad uso dellamministratore del sistema (come init o


fsck). Deve stare sullo stesso filesystem della radice. Vanno messi in questa directory
solo i programmi essenziali per lavvio del sistema, il recupero e la manutenzione dei
filesystem.

/srv

` stata introdotta per mantenervi i dati relativi ai vari servizi che possono essere stati
E
installati su una macchina (come ad esempio le pagine servite da un web server) che
in precedenza venivano installati direttamente sotto /var.48 Non ne `e definita una
ulteriore suddivisione, ma in genere si tende a creare una sottodirectory per ciascun
servizio (ad esempio www, svn, ecc.).

48

`e stata introdotta con la versione 2.3 del FHS, e non `e ancora molto diffusa.

20

CAPITOLO 1. LARCHITETTURA DI UN SISTEMA GNU/LINUX

/tmp

La directory viene usata per mantenere file temporanei. Viene cancellata ad ogni riavvio, ed i programmi non devono assumere che i file siano mantenuti fra due esecuzioni
successive.

/usr

` la directory principale che contiene tutti i programmi i file ed i dati non variabili,
E
che possono anche essere condivisi fra pi`
u stazioni di lavoro. Di solito viene montata
su un filesystem separato rispetto a / e pu`o essere montata in sola lettura. Prevede
una ulteriore gerarchia di directory in cui i vari file vengono organizzati; lo standard
richiede obbligatoriamente le seguenti:
bin

Contiene i programmi usati dallutente installati direttamente dal sistema (o


dalla distribuzione originale). Non pu`o essere ulteriormente suddivisa.

include Contiene tutti i file di dichiarazione delle funzioni di libreria usati dal compilatore e dai programmi C e C++.
lib

Contiene le librerie, file oggetto e binari relative ai programmi di bin e sbin.


Pu`
o contenere sottodirectory con tutti i file relativi a singoli programmi.

local

Contiene una replica della gerarchia di /usr dedicata ai file installati localmente dallamministratore. In genere qui vengono installati i programmi
compilati dai sorgenti e tutto quello che non fa parte della distribuzione
ufficiale.

sbin

Contiene i programmi per la gestione di sistema ad uso dellamministratore


non essenziali allavvio.

share

Contiene una gerarchia in cui sono organizzati tutti i file e i dati che non
dipendono dallarchitettura hardware: sono sempre obbligatori man per le
pagine di manuale, e misc; se installati vi possono trovare anche una serie
di altre directory come: dict per i dizionari, doc per la documentazione,
games per i dati statici dei giochi, info per i file del relativo sistema di help
(vedi sez. 2.4.2), terminfo per il database con le informazioni sui terminali,
zoneinfo per i dati relativi ai fusi orari (per lelenco completo si consulti
il sito citato). Deve essere posto dentro misc tutto quello che non viene
classificato nelle altre directory opzionali.

mentre sono obbligatorie solo se i relativi pacchetti sono installati, le seguenti directory:

/var

X11R6

Conteneva la gerarchia dei file relativi ad X Window (vedi sez. 3.3), con la
versione 7.0 di X.org `e per`o stata rimossa.

games

Contiene i binari dei giochi.

src

Contiene i sorgenti dei pacchetti, per riferimenti, ed `e opzionale.

Contiene i file variabili: le directory di spool, i file di log, i dati transienti e temporanei,
` preferibile montarla in un
in modo che /usr possa essere montata in sola lettura. E
filesystem separato; alcune directory non possono essere condivise. Anche in questo
caso i file sono organizzati in una ulteriore gerarchia standardizzata che prevede la
presenza delle seguenti sottodirectory:
cache

Dati di appoggio per le applicazioni.

lib

Informazioni variabili sullo stato del sistema.

local

Dati variabili relativi ai pacchetti di /usr/local.

lock

File di lock.

log

File di log (vedi 3.2.3).

1.2. LARCHITETTURA DEI FILE

21

opt

File variabili per i pacchetti di /opt.

run

Dati relativi ai processi in esecuzione.

spool

Directory per le code contenenti i dati di varie applicazioni (stampanti, posta


elettronica, news, ecc.).

tmp

File temporanei non cancellati al riavvio del sistema.

a queste si aggiungono tradizionalmente altre directory, come /var/backups, /var/cron,


ecc.
In fig. 1.3 `e riportata una rappresentazione grafica della struttura generale delle directory prevista dal FHS, (si `e mostrata solo una parte delle directory previste). I dettagli completi sulla struttura (cos` come le specifiche relative ad i contenuti delle varie directory, possono essere reperiti sul documento ufficiale di definizione del FHS, disponibile allindirizzo
http://www.pathname.com/fhs/.

Figura 1.3: Struttura tipica delle directory, secondo il Filesystem Hierarchy Standard.

Limportanza del Filesystem Hierarchy Standard diventa evidente quando si vanno ad esaminare le strategie di partizionamento dei dischi (torneremo sullargomento in sez. 5.1.2). In tal
caso infatti occorrer`
a stabilire quali directory dovranno andare sul filesystem usato come radice,
e quali altre directory porre su altre partizioni.
` evidente infatti che alcune directory (come /usr ed /opt) possono essere mantenute su
E
` pertanto utile separare queste
partizioni e filesystem diversi rispetto alla directory radice. E
due directory che, contenendo file comuni di norma identici per le diverse installazioni, possono
essere montate in sola lettura e non inserite nei backup (in quanto `e possibile sempre ripristinarle
dallinstallazione), o addirittura montate via rete e condivise fra pi`
u macchine.
La situazione `e invece del tutto diversa per directory come /home e /var. Anche in questo
caso `e opportuno separarle dalle altre directory, ma in questo caso `e necessario laccesso in
scrittura e le informazioni variabili non saranno necessariamente condivisibili (ad esempio non
lo sono /var/run e /var/lock che contengono informazioni sui processi locali). Inoltre essendo
qui contenuti la gran parte dei dati del sistema (le altre directory sono solo /root per i file
personali dellamministratore e /etc per le configurazioni) queste dovranno essere sottoposte a
regolare backup.
Si tenga inoltre presente che alcune di queste directory (ad esempio /proc) devono essere
lasciate vuote sul disco; esse infatti servono solo come riferimento per montare i relativi filesystem
virtuali. Non ha quindi alcun senso effettuare backup del contenuto di queste directory in quanto
esse presentano solo una interfaccia di accesso (che permette per`o luso dei normali comandi per
i file) a variabili interne del kernel create dinamicamente.

22

1.3

CAPITOLO 1. LARCHITETTURA DI UN SISTEMA GNU/LINUX

Larchitettura dei processi

In questa sezione prenderemo in esame larchitettura della gestione dei processi, che costituiscono
le entit`a fondamentali con cui il kernel permette lesecuzione dei vari programmi. Vedremo come
i processi sono organizzati in forma gerarchica, quali sono caratteristiche e propriet`a che ciascuno
di essi porta con se, e come vengono gestiti allinterno del sistema.

1.3.1

Le caratteristiche dellarchitettura dei processi

Come accennato in sez. 1.1.2 una delle caratteristiche principali dellarchitettura dei processi in
un sistema unix-like `e che qualunque processo pu`o creare nuovi processi; in questo contesto il
processo originale viene chiamato padre, mentre i processi da lui creati vengono detti figli. La
caratteristica distintiva `e che tutti i processi presenti nel sistema possono essere creati solo in
questo modo, e pertanto tutti i processi avranno un padre; lunica eccezione `e quella di init, il
processo iniziale che, venendo lanciato direttamente dal kernel allavvio, non `e figlio di nessun
altro processo.
Questa caratteristica permette di classificare i processi in una gerarchia ad albero basata sulla
relazione padre-figlio; in questa gerarchia init viene a ricoprire nel sistema un ruolo speciale,
come radice dellalbero. Questa classificazione pu`o essere stampata con il comando pstree
che evidenzia in maniera grafica lalbero genealogico dei processi presenti nel sistema, con un
risultato del tipo:
init-+-atd
|-bdflush
|-bonobo-moniker|-cron
|-evolution-address
|-evolution-alarm
|-evolution-calendar
|-evolution-execution
|-evolution-mail---evolution-mail---4*[evolution-mail]
|-gconfd-2
|-6*[getty]
|-inetd---famd
|-junkbuster
|-kalarmd
|-kapmd
|-kdeinit-+-artsd
|
|-evolution
|
|-gabber
|
|-kdeinit---xvncviewer
|
|-kdeinit
|
|-kdeinit---bash---bash
|
|-kdeinit---bash-+-emacs
|
|
-xpdf---xpdf.bin
|
|-kdeinit---bash---pstree
|
-kdeinit---bash---ssh
|-8*[kdeinit]
|-kdeinit---mozilla-bin---mozilla-bin---4*[mozilla-bin]
|-kdm-+-XFree86
|
-kdm---kde3-+-kwrapper
|
-ssh-agent
|-keventd
|-khubd
|-klogd
|-korgac
|-kreiserfsd
|-ksensors

1.3. LARCHITETTURA DEI PROCESSI

23

|-ksoftirqd_CPU0
|-kswapd
|-kupdated
|-lockd---rpciod
|-master-+-cleanup
|
|-pickup
|
|-proxymap
|
|-qmgr
|
|-smtp
|
|-smtpd
|
-trivial-rewrite
|-oafd
|-sshd
|-syslogd
|-wombat
|-wwwoffled
-xfs

dove si pu`
o notare che, come dicevamo allinizio, alla radice dellalbero c`e init.
Si tenga presenta che questa architettura, in cui qualunque processo pu`o creare degli altri
processi, `e molto diversa da quella di altri sistemi operativi in cui spesso loperazione di lanciare
un nuovo processo `e privilegiata e non pu`o essere eseguita da un programma qualsiasi.
Nella creazione di un processo figlio questo eredita dal padre tutta una serie di propriet`
a
49
(vedremo alcune di esse in sez. 1.3.2) e risorse, ed in particolare una delle caratteristiche che
contraddistingue larchitettura dei processi in un sistema unix-like `e che tutti i file aperti nel
processo padre resteranno tali ed immediatamente disponibili anche per il figlio;50 vedremo in
sez. 2.1.4 come questo sia fondamentale per una delle funzionalit`a pi`
u importanti dellinterfaccia
a riga di comando.
Una seconda differenza rispetto ad altri sistemi multiutente come il VMS o NT, `e che in
Linux la creazione di un processo e lesecuzione di un programma sono due operazioni separate,
gestite da due system call diverse,51 la prima delle quali crea un nuovo processo, identico al
padre, il quale normalmente va ad usare la seconda per eseguire un altro programma.52
Questa caratteristica permette anche, con una modalit`a di funzionamento comune per i server
di rete, di scrivere un programma unico che esegue pi`
u processi, con una struttura in cui il padre
esegue la parte che si occupa di ricevere le richieste, e per ciascuna di esse fa eseguire,53 ad un
figlio creato appositamente, le operazioni necessarie a fornire le relative risposte.

1.3.2

Le propriet`
a dei processi

Il comando che permette di ottenere la lista dei processi attivi nel sistema `e ps; questo `e uno dei
comandi fondamentali presenti fin dalle prime versioni di Unix; per questo si sono accavallate
anche diverse sintassi per le opzioni, derivate dalle varie versioni che del comando sono state
realizzate nel tempo. In Linux il comando supporta la maggior parte delle opzioni esistenti, in
genere indicate da lettere singole: quelle derivate da SysV devono essere precedute da un -,
49

la trattazione dettagliata del meccanismo e di quali propriet`


a e risorse vengono trasmesse da padre a figlio va
al di l`
a dello scopo di queste dispense, gli interessati possono consultare il capitolo 3 di [GaPiL].
50
di nuovo si sta facendo una descrizione estremamente vaga e semplificata, in realt`
a il meccanismo con cui un
processo figlio vede i file aperti dal padre `e piuttosto complesso, una trattazione dettagliata si pu`
o trovare in
sez. 6.3.1 di [GaPiL].
51
le due funzioni si chiamano rispettivamente fork ed exec, per i dettagli del meccanismo si pu`
o consultare la
sezione 3.2 di [GaPiL].
52
`e questa la modalit`
a con cui funziona linterfaccia a riga di comando in cui un programma, la shell, crea dei
processi figli per eseguire tramite essi gli altri programmi.
53
ovviamente usando una istruzione condizionale, essendovi la possibilit`
a di riconoscere se si sta eseguendo il
padre o il figlio.

24

CAPITOLO 1. LARCHITETTURA DI UN SISTEMA GNU/LINUX

quelle derivate da BSD non devono essere precedute da un -, mentre le estensioni GNU usano
un -- ed una forma estesa.
Si tenga presente che in molti casi viene usata la stessa lettera, con significati diversi, sia
nel formato BSD che in quello SysV, nel caso si vogliano combinare le due opzioni di questi
formati alternativi allora non vale la sintassi usuale (che tratteremo in dettaglio in sez. 2.1.3) di
specificare pi`
u opzioni con lettere consecutive dopo il -, e ciascuna andr`a ripetuta a parte.
Il comando non richiede nessun argomento, e se eseguito su un terminale senza specificare
nessuna opzione ps mostra lelenco dei processi appartenenti allutente che ha eseguito il comando
attivi su quel terminale; avremo cio`e qualcosa del tipo:
piccardi@hain:~/truedoc/corso$ ps
PID TTY
TIME CMD
31203 pts/0
00:00:00 bash
18957 pts/0
00:00:43 emacs
21348 pts/0
00:00:09 xpdf.bin
22913 pts/0
00:00:00 ps

che mostra, nellultima colonna marcata CMD, come sul terminale siano presenti la shell, il comando ps stesso, pi`
u leditor ed il visualizzatore di PDF utilizzati per la realizzazione di queste
dispense. Tralasciamo per ora il significato delle altre colonne, ci torneremo fra poco.
Specificando lopzione a verranno visualizzati anche i processi lanciati da altri utenti, purche
facenti riferimento ad un terminale,54 mentre con lopzione x si visualizzano tutti i processi
non associati ad un terminale; infine lopzione f permette di mostrare la gerarchia dei processi.
Cos` si pu`o ottenere un elenco completo dei processi con un comando del tipo:
[piccardi@hogen piccardi]$
PID TTY
STAT
TIME
6 ?
SW
0:00
5 ?
SW
0:00
4 ?
SW
0:00
3 ?
SWN
0:00
1 ?
S
0:03
2 ?
SW
0:00
7 ?
SW
0:00
76 ?
SW
0:00
168 ?
S
0:00
171 ?
S
0:00
332 ?
S
0:00
344 ?
S
0:00
435 ?
S
0:00
437 ?
S
0:00
438 ?
S
0:00
448 ?
S
0:00
908 ?
S
0:00
909 pts/0
S
0:00
919 pts/0
R
0:00
474 ?
S
0:00
477 ?
S
0:00
484 tty2
S
0:00
485 tty3
S
0:00
486 tty4
S
0:00
487 tty5
S
0:00
488 tty6
S
0:00
635 ?
SN
0:00
672 ?
SN
0:00
907 tty1
S
0:00
54

ps axf
COMMAND
[kupdated]
[bdflush]
[kswapd]
[ksoftirqd_CPU0]
init [2]
[keventd]
[kjournald]
[kjournald]
/sbin/syslogd
/sbin/klogd
/usr/sbin/inetd
lpd Waiting
/usr/lib/postfix/master
\_ pickup -l -t fifo -c
\_ qmgr -l -t fifo -u -c
/usr/sbin/sshd
\_ /usr/sbin/sshd
\_ -bash
\_ ps axf
/usr/sbin/atd
/usr/sbin/cron
/sbin/getty 38400 tty2
/sbin/getty 38400 tty3
/sbin/getty 38400 tty4
/sbin/getty 38400 tty5
/sbin/getty 38400 tty6
/usr/sbin/junkbuster /etc/junkbuster/config
/usr/sbin/wwwoffled -c /etc/wwwoffle/wwwoffle.conf
/sbin/getty 38400 tty1

prima dellintroduzione delle interfacce grafiche questa era la modalit`


a per vedere i processi interattivi lanciati
dagli utenti, in quanto questi potevano essere solo lanciati da un terminale.

1.3. LARCHITETTURA DEI PROCESSI

25

dato che la combinazione delle opzioni a e x, essendo queste complementari, seleziona tutti
i processi attivi nel sistema. Luso dellopzione r permette invece di restringere la selezione ai
soli processi in esecuzione effettiva (cio`e nello stato R, che spiegheremo fra poco).
Come gi`
a questi primi esempi ci mostrano, in realt`a lo scopo di ps non `e solo quello di fornire
la lista dei processi in esecuzione, quanto quello di mostrarne in generale caratteristiche e propriet`a; la descrizione del significato di questultime andr`a allora di pari passo con la spiegazione
delloutput del comando.
Per ogni processo attivo infatti il kernel mantiene tutta una serie di dati che vengono usati
per il controllo delle varie operazioni che esso pu`o compiere, insieme ad una serie di informazioni
relative alle risorse da esso utilizzate. Gi`a in questi due primi esempi il comando ci mostra alcune
informazioni di base sufficienti ad introdurre alcune delle propriet`a essenziali dei processi.
La prima colonna dei precedenti esempi, marcata PID, mostra il cosiddetto process ID del
processo. Questo `e il numero che il kernel utilizza per identificare univocamente ciascun processo;
questo numero viene assegnato alla creazione del processo, ed `e unico fintanto che il processo
` questo il numero che si deve usare tutte le volte che si vuole fare riferimento ad
resta attivo. E
uno specifico processo.
La seconda colonna, marcata TTY, mostra il nome del cosiddetto terminale di controllo del
processo. Il concetto di terminale di controllo `e alquanto complesso, e trattarne i dettagli va
al di l`a di quanto sia possibile affrontare qui,55 per quanto ci interessa `e sufficiente dire che un
processo interattivo `e sempre associato ad un terminale di controllo che corrisponde appunto
al terminale da cui il processo riceve i dati in ingresso (in genere dalla tastiera) e sul quale scrive
il suo output (in genere lo schermo). I processi non interattivi (i cosiddetti demoni) che vengono
usati per compiere una serie di compiti di servizio,56 dovendo essere attivi anche quando non c`e
nessun utente collegato, lavorano invece come suol dirsi in background per cui non esiste un
terminale di controllo e la colonna TTY riporta come valore ?.
In realt`
a questa caratterizzazione dellinterattivit`a viene a cadere qualora si utilizzi una
interfaccia grafica, dato che questa non necessita delluso di un terminale per operare in modo
interattivo, ma Unix `e nato molto prima dellintroduzione delle interfacce grafiche, ed un tempo
luso di un terminale costituiva lunica modalit`a di accesso al sistema. Per questo motivo il
kernel fornisce una serie di servizi collegati a questo speciale dispositivo, ed uno dei punti pi`
u
oscuri dellinterfaccia a linea di comando di un sistema unix-like `e proprio quello relativo alla
gestione delle sessioni di lavoro, su cui torneremo anche in sez. 2.1.2.
Si tenga presente che dal punto di vista del kernel non esiste nessuna differenza fra processi
interattivi e non,57 esso si limita a mettere a disposizione alcune risorse che possono essere
utilizzate per realizzare il controllo di sessione, con la presenza di alcuni identificatori aggiuntivi
come il session ID ed il process group ID, delle relative funzioni di gestione, e di alcuni segnali
associati alluso del terminale;58 il controllo di sessione viene poi realizzato completamente in
user space, usando queste risorse secondo le modalit`a classiche ereditate dai primi Unix. Anche
questi identificativi possono essere visualizzati tramite ps, usando lopzione -j, che ne stamper`
a
il relativo valore nelle colonne SID e PGID; vedremo un esempio di tutto questo in sez. 2.1.2
quando tratteremo con qualche dettaglio in pi`
u la gestione delle sessioni di lavoro.
In tutti i precedenti esempi compare, nella colonna marcata STAT, unaltra informazione
fondamentale: lo stato del processo. Il sistema infatti prevede cinque possibili stati diversi
per i processi, i cui valori sono riportati in tab. 1.10, torneremo su questo a breve, in quanto ci
permette di spiegare varie caratteristiche dellarchitettura dei processi. Seguono infine la colonna
55

gli interessati possono approfondire largomento nel cap. 10 di [GaPiL].


come spedire la posta, eseguire lavori periodici, servire pagine web, ecc.
57
o meglio fra processi con un terminale di controllo o meno.
58
di nuovo per i dettagli si consulti il cap. 10 di [GaPiL].
56

26

CAPITOLO 1. LARCHITETTURA DI UN SISTEMA GNU/LINUX

TIME che indica il tempo di CPU usato finora dal processo e la colonna COMMAND che riporta la
riga di comando usata per lanciare il programma.
Per capire il significato del campo STAT occorrono alcune spiegazioni generali sullarchitettura
della gestione dei processi. Come sistema multitasking Linux `e in grado di eseguire pi`
u processi
contemporaneamente, in genere per`
o un processo, pur essendo attivo, non `e assolutamente detto
che sia anche in esecuzione. Il caso pi`
u comune infatti `e quello in cui il programma `e in attesa
di ricevere dati da una periferica; in tal caso il kernel pone il programma in stato di sleep e lo
toglie dalla lista di quelli che hanno bisogno del processore (che sono identificati invece dallo
stato runnable).
Stato
runnable

STAT
R

sleep

uninterruptible
sleep
stopped
zombie

D
T
Z

Descrizione
il processo `e in esecuzione o `e pronto ad essere eseguito (cio`e `e in attesa
che gli venga assegnata la CPU).
il processo `e in attesa di una risposta dal sistema, ma pu`
o essere
interrotto da un segnale.
il processo `e in attesa di una risposta dal sistema (in genere per I/O),
e non pu`
o essere interrotto in nessuna circostanza.
il processo `e stato fermato con un SIGSTOP, o `e tracciato.59
il processo `e terminato ma il suo stato di terminazione non `e ancora
stato letto dal padre.

Tabella 1.10: Elenco dei possibili stati di un processo in Linux, nella colonna STAT si `e riportata la corrispondente
lettera usata dal comando ps nellomonimo campo.

Si noti allora come nellelenco precedente tutti i processi, eccetto lo stesso comando ps axf,
fossero in stato di sleep. In genere un processo entra in stato di sleep tutte le volte che si blocca
nellesecuzione di una system call che richiede una qualche forma di accesso non immediato a
dei dati: un caso classico `e la lettura dellinput da tastiera.
Come dettagliato in tab. 1.10 gli stati di sleep sono due, contraddistinti dalle lettere S e D.
Il pi`
u comune `e il primo; lesecuzione della maggior parte delle system call infatti pu`o essere
interrotta da un segnale (i segnali saranno trattati in sez. 1.3.3), per cui se un processo si blocca
nellesecuzione di una di queste esso pu`
o essere comunque terminato, in alcuni casi (in genere
questo avviene quando la system call sta gestendo la risposta ad un interrupt hardware) questo
non `e possibile ed allora si ha uno stato di uninterruptible sleep, in questo caso se il processo resta
bloccato60 nello stato D non pu`
o pi`
u essere terminato se non con il riavvio della macchina. Un
processo in stato D comunque non avr`
a nessun effetto ne sugli altri processi ne sul sistema, che
continuer`a a funzionare senza problemi, a parte quello di non poter liberare le risorse occupate
dal processo.
Lo stato di stopped `e relativo ai processi la cui esecuzione `e stata fermata per una richiesta
dellutente (per fare questo, come vedremo in sez. 1.3.3, si ha a disposizione un segnale apposito),
nel qual caso semplicemente il processo non viene eseguito (ma resta in memoria e pu`o riprendere
lesecuzione in qualunque momento) fintanto che non lo si fa ripartire (anche per questo `e previsto
un altro segnale).
Infine c`e lo stato di zombie, il cui significato pu`o essere compreso solo ritornando con maggiori
dettagli sulla relazione fra processo padre e gli eventuali figli. La relazione padre/figlio infatti
`e ben definita finche entrambi i processi sono attivi nel sistema, ma se uno dei due termina
cosa accade? Alla terminazione di un processo il kernel provvede ad una serie di compiti di
pulizia; tutti i file aperti dal processo vengono chiusi, la memoria utilizzata viene liberata e
59

si dice che un processo `e tracciato se su di esso si usa il comando strace, che consente di intercettare, e
stampare a video, tutte le system call chiamate dal processo; si ottengono cos` informazioni un po complicate da
interpretare, ma molto preziose per cercare di capire come si sta comportando un programma.
60
in genere questo avviene in maniera permanente solo per un qualche errore nella gestione della periferica nel
kernel, ad esempio se si monta un disco USB e poi si lo si estrae dal bus senza smontarlo e si ha la sventura di
farlo in un momento poco opportuno, o se ci sono problemi hardware.

1.3. LARCHITETTURA DEI PROCESSI

27

con essa tutte le risorse occupate dal processo. Resta il problema di come notificare lavvenuta
conclusione del processo, ad esempio se questa `e stata regolare o `e stata dovuta ad un qualche
errore, e il problema `e a chi fare questa notifica.
Dato che in un sistema Unix tutto viene fatto con i processi, la scelta `e stata quella di
assegnare al padre il compito di ricevere lo stato di uscita del figlio e controllare se tutto `e
andato bene o c`e stato qualche errore. Quando un processo termina al padre viene inviato uno
speciale segnale che lo avvisa del fatto, e lui deve invocare una apposita system call per ricevere
lo stato di uscita. Questo ad esempio `e il meccanismo con cui la shell riceve lo stato di uscita
dei comandi che si sono eseguiti.
Se questo non viene fatto il processo figlio si conclude comunque regolarmente e tutte le
risorse che occupava nel sistema vengono rilasciate, resta allocata soltanto una voce nella tabella
dei processi che contiene le informazioni per riportare lo stato di uscita. Questo `e quello che
in gergo viene chiamato uno zombie, cio`e un processo che non esiste pi`
u, perche `e terminato,
ma che mostra una voce con lo stato Z nella lista fornita da ps e che di nuovo non pu`o essere
` pertanto compito di chi scrive programmi che
terminato, per il semplice fatto che lo `e gi`a. E
creano processi figli curarsi della ricezione del loro stato di uscita, ed infatti i programmi ben
scritti non presentano mai questo problema.
Di per se la presenza di uno zombie non `e un grave problema, in quanto esso non occupa
(a differenza di un processo bloccato in stato D) nessuna risorsa nel sistema, tranne la voce
mantenuta nelloutput di ps. Per`
o la voce nella tabella dei processi resta occupata e pertanto
se il numero degli zombie dovesse crescere in maniera eccessiva si pu`o rischiare di saturare
questultima, rendendo di fatto inutilizzabile il sistema.61 Vedremo fra poco per`o che, a differenza
dei processi bloccati permanentemente in stato D, per gli zombie `e possibile risolvere il problema,
e far s` che essi siano terminati regolarmente, senza dover riavviare il sistema.
Per capire come comportarsi con gli zombie si deve considerare un altro caso della gestione
del funzionamento dei processi: quello in cui `e il padre a terminare prima del figlio. Se accade
questo chi `e che ricever`
a lo stato di terminazione dei suoi figli? Dato che i processi sono eseguiti
in maniera del tutto indipendente un caso come questo `e assolutamente naturale, e in tal caso
si dice che il figlio diventa orfano. Per questo il kernel controlla, durante le operazioni di
terminazione di un processo, se questo ha dei figli, e nel caso assegna a questi ultimi init come
nuovo padre.62 Si dice allora che init adotta i figli dei processi che terminano, e sar`a lui che
gestir`a, alla terminazione di questi ultimi, la ricezione del loro stato di uscita.
Perci`o, dato che init `e scritto bene e sa gestire la ricezione dello stato di uscita, tutto quello
che serve fare per eliminare gli zombie presenti nel sistema `e di renderli orfani, terminando
il processo che li ha generati.63 In questo modo essi saranno adottati da init che si curer`
a
immediatamente di riceverne lo stato di uscita liberando la voce che occupavano nella tabella
dei processi.
Si noti nella lista precedente la presenza di alcuni processi con una lettera aggiuntiva W
nella colonna STAT, con un nome del comando fra parentesi quadre e con un PID molto basso;
questi non sono processi in user space lanciati da init quanto dei processi interni al kernel da
esso utilizzati per la gestione di alcuni compiti, come lo scaricamento su disco dei buffer dei
file, la generazione di eventi dovuti allinserimento di periferiche (usato da USB e PCMCIA),
ecc. La lettera W sta ad indicare che questi processi non usano memoria in user space, il che
permette di identificarli. Le altre lettere associate al campo STAT sono <, N e L e indicano
rispettivamente una priorit`
a maggiore o minore di quella standard (torneremo sulla priorit`
a in
61

nel senso che non sar`


a pi`
u possibile creare nuovi processi.
si vedr`
a cio`e, ad una successiva esecuzione di ps con opzioni che permettano di visualizzare il PID del padre,
che questo `e diventato 1.
63
per poterlo fare per`
o occorre avere un processo in grado di eseguire il comando, cosa non facile da ottenere
se si `e gi`
a riempita la tabella dei processi.
62

28

CAPITOLO 1. LARCHITETTURA DI UN SISTEMA GNU/LINUX

sez. 1.3.4) e la presenza di pagine di memoria bloccate.64 Con le ultime versioni de kernel si
potranno avere anche ulteriori informazione (per il significato delle quali si rimanda alla pagina
di manuale di ps).
Le opzioni di visualizzazione di ps sono moltissime, e qui potremo prendere in esame solo
le principali. Restando nellambito della sintassi BSD una delle pi`
u usate `e u che stampa una
lista con le informazioni pi`
u rilevanti riguardo lutente che ha lanciato il programma. Altre
opzioni sono v che stampa informazioni relative alluso della memoria virtuale, e s che stampa
informazioni sui segnali. Infine lopzione o permette allutente di specificare un suo formato, con
luso di una serie di direttive %X, dove X indica quale propriet`a del processo si vuole far comparire
nella lista (secondo una tabella di valori riportata nella pagina di manuale).
Se invece si usa la sintassi SysV le opzioni pi`
u usate sono -e, che permette di selezionare
tutti i processi presenti, e -f che permette di avere una lista con pi`
u informazioni; in tal caso
infatti si avr`a come uscita del comando:
parker:/home/piccardi# ps -ef
UID
PID PPID C STIME
root
1
0 0 Aug12
root
2
1 0 Aug12
root
3
1 0 Aug12
root
4
1 0 Aug12
root
5
1 0 Aug12
root
6
1 0 Aug12
root
7
1 0 Aug12
root
43
1 0 Aug12
root
101
1 0 Aug12
daemon
106
1 0 Aug12
root
168
1 0 Aug12
root
171
1 0 Aug12
root
175
1 0 Aug12
root
179
1 0 Aug12
root
203
1 0 Aug12
daemon
214
1 0 Aug12
root
310
1 0 Aug12
postfix
314
310 0 Aug12
root
319
1 0 Aug12
root
322
1 0 Aug12
root
325
1 0 Aug12
root
326
1 0 Aug12
root
327
1 0 Aug12
root
328
1 0 Aug12
root
329
1 0 Aug12
root
330
1 0 Aug12
postfix
2046
310 0 11:13
root
2047
319 0 12:24
piccardi 2049 2047 0 12:24
piccardi 2050 2049 0 12:24
root
2054 2050 0 12:24
root
2087 2054 0 12:34

TTY
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
tty1
tty2
tty3
tty4
tty5
tty6
?
?
?
pts/0
pts/0
pts/0

TIME
00:00:03
00:00:00
00:00:00
00:00:00
00:00:00
00:00:00
00:00:01
00:00:00
00:00:00
00:00:00
00:00:00
00:00:00
00:00:00
00:00:00
00:00:00
00:00:00
00:00:00
00:00:40
00:00:00
00:00:00
00:00:00
00:00:00
00:00:00
00:00:00
00:00:00
00:00:00
00:00:00
00:00:00
00:00:00
00:00:00
00:00:00
00:00:00

CMD
init
[keventd]
[ksoftirqd_CPU0]
[kswapd]
[bdflush]
[kupdated]
[kjournald]
[kapmd]
[eth0]
/sbin/portmap
/sbin/syslogd
/sbin/klogd
/usr/sbin/named
/sbin/rpc.statd
/usr/sbin/inetd
lpd Waiting
/usr/lib/postfix/master
qmgr -l -t fifo -u -c
/usr/sbin/sshd
/usr/sbin/cron
/sbin/getty 38400 tty1
/sbin/getty 38400 tty2
/sbin/getty 38400 tty3
/sbin/getty 38400 tty4
/sbin/getty 38400 tty5
/sbin/getty 38400 tty6
pickup -l -t fifo -u -c
/usr/sbin/sshd
/usr/sbin/sshd
-bash
bash
ps -ef

Come si pu`o vedere questa versione riporta una serie di dati in pi`
u. Anzitutto notiamo che la
prima colonna, UID, riporta un nome utente. Ciascun processo infatti mantiene le informazioni
riguardanti lutente che ha lanciato il processo ed il gruppo cui questo appartiene, anche queste
sono mantenute nella forma dei relativi UID (user ID) e GID (group ID).65 Ogni processo in
64
questultima `e una caratteristica avanzata che va al di l`
a degli scopi di queste dispense, per una trattazione
si pu`
o fare riferimento alla sezione 2.2.7 di [GaPiL].
65
come vedremo in sez. 1.4.1 il kernel identifica ogni utente e gruppo presente nel sistema con dei numeri interi,
detti rispettivamente user ID e group ID.

1.3. LARCHITETTURA DEI PROCESSI

29

realt`a mantiene diverse versioni di questi identificatori,66 ma quelle che poi sono significative
sono leffective user ID e leffective group ID, utilizzati per il controllo di accesso (che vedremo
in sez. 1.4), che sono appunto quelli che corrispondono alla colonna UID (e ad una eventuale
colonna GID) ed il real user ID e il real group ID, che identificano lutente che ha lanciato il
processo,67 che invece vengono identificati da sigle come RUSER e RGROUP, se indicati con il nome
o con RUID e RGID se numerici.
La seconda colonna del nostro esempio riporta di nuovo il PID di ciascun processo, mentre la
terza colonna, PPID, indica il parent process ID, ogni processo infatti mantiene il PID del padre,
in modo da poter ricostruire agevolmente la genealogia dei processi. Questa ci permette anche,
in caso di zombie, di identificare il processo responsabile della produzione degli stessi.
La quarta colonna, C, indica il valore medio, espresso come intero, della percentuale di utilizzo
della CPU su tutta la vita del processo. La quinta colonna, STIME, indica invece il momento in cui
il comando `e stato lanciato. Le altre colonne sono analoghe a quelle gi`a viste in precedenza per
la sintassi BSD. Un elenco delle principali informazioni relative ai processi che vengono riportate
da ps sono elencate in tab. 1.11, indicate sempre in base al nome usato come intestazione della
colonna che ne visualizza il valore. Per lelenco completo delle opzioni, informazioni e dati
visualizzabili con ps si pu`
o fare riferimento alla pagina di manuale del comando, accessibile con
man ps.
Propriet`
a
PID
PPID
UID
GID
CMD
STAT
NI
TTY
SID
PGID
%CPU
%MEM
C
START
TIME
USER
RUSER
GROUP
RGROUP
COMMAND

Descrizione
PID, process ID del processo.
PPID, process ID del padre del processo.
effective user ID del processo.
effective group ID del processo.
linea di comando con cui `e stato lanciato il processo.
stato del processo.
valore di nice (vedi sez. 1.3.4) del processo.
terminale di controllo del processo.
SID, session ID (vedi sez. 2.1.2) del processo.
PGID, process group ID (vedi sez. 2.1.2) del processo.
percentuale del tempo di CPU usato rispetto al tempo reale di
esecuzione.
percentuale della memoria fisica utilizzata dal processo.
ultima CPU utilizzata dal processo (ha senso solo in un sistema
multiprocessore).
orario dellavvio del processo.
tempo totale di CPU utilizzato dallavvio del processo.
effective user ID del processo.
real user ID del processo.
effective group ID del processo.
real group ID del processo.
riga di comando con la quale si `e avviato il processo.

Tabella 1.11: Le principali propriet`


a dei processi ed il nome della relativa colonna nella visualizzazione effettuata
da ps.

Infine ci sono alcune propriet`


a dei processi, non immediatamente visualizzabili con ps,68 che
comunque sono importanti e vanno menzionate. Come accennato in sez. 1.2.2, ogni processo
66

Linux usa ben quattro gruppi di identificatori diversi per gestire il controllo di accesso, secondo uno schema
che va al di l`
a di quanto `e possibile spiegare qui, gli interessati possono trovare una trattazione dellargomento
nella sezione 3.3 di [GaPiL].
67
di norma questi coincidono con gli identificatori del gruppo effective, ma vedremo in sez. 1.4.2 che esistono
casi in cui questo non avviene.
68
si possono comunque ricercare tutte le informazioni relative ai processi nel filesystem /proc, che `e nato proprio
per fornire una interfaccia con kernel da cui ottenerle (tanto che se non `e montato ps non funzioner`
a); in particolare
sotto /proc si trover`
a per ciascun processo una directory con nome uguale al rispettivo PID, il cui contenuto `e
costituito una serie di file e directory (virtuali) che permettono di accedere alle propriet`
a dello stesso.

30

CAPITOLO 1. LARCHITETTURA DI UN SISTEMA GNU/LINUX

ha una directory di lavoro rispetto alla quale risolve i pathname relativi; anche questa `e una
caratteristica del processo, che viene ereditata nella creazione di un processo figlio. Lo stesso
vale per la directory radice, infatti benche di norma questa coincida con la radice del sistema,
essa pu`o essere cambiata con una apposita system call. Per questo motivo ogni processo porta
con se, oltre alla directory di lavoro corrente, anche lindicazione della directory che considera
come radice, rispetto alla quale risolve i pathname assoluti.
Qualora si voglia eseguire un processo facendogli usare una radice diversa, in modo da restringerne laccesso ad una sezione dellalbero dei file (ad esempio se si `e montato su una directory
il disco di un altra installazione per lavorare allinterno dei file di questultima) si pu`o usare
il comando chroot. Il comando prende come argomenti la directory da usare come radice, ed
opzionalmente il programma da eseguire. Se non si specifica nessun programma verr`a eseguita di
default una shell, che ovviamente si trover`
a ad operare allinterno del tratto di albero specificato.
Come si pu`
o notare ps si limita a stampare la lista dei processi attivi al momento della sua
esecuzione. Se si vuole tenere sotto controllo lattivit`a del sistema non `e pratico ripetere in
continuazione lesecuzione di ps. Per questo ci viene in aiuto il comando top, che stampa una
lista di processi, aggiornandola automaticamente in maniera periodica.
Il comando opera normalmente in maniera interattiva, a meno di non averlo lanciato con
lopzione -b, che lo esegue in modalit`
a batch, consentendo la redirezione delloutput; in tal caso di
solito si usa anche lopzione -n per specificare il numero di iterazioni volute. Il comando ristampa
la lista ogni secondo, a meno di non aver impostato un intervallo diverso con lopzione -d, che
richiede un parametro nella forma ss.dd dove ss sono i secondi e dd i decimi di secondo. Infine
lopzione -p permette di osservare una lista di processi scelta dallutente, che deve specificarli
tramite una lista di PID. Per la lista completa delle opzioni si faccia riferimento al solito alla
pagina di manuale, accessibile con man top.
Quando opera in modalit`
a interattiva il comando permette di inviare dei comandi da tastiera.
I pi`
u rilevanti sono h e ? che mostrano un help in linea dei comandi disponibili, e q che termina
il programma. Un esempio di output del comando `e il seguente:
top - 13:06:35 up 6:04, 6 users, load average: 0.04, 0.98, 1.00
Tasks: 82 total,
1 running, 81 sleeping,
0 stopped,
0 zombie
Cpu(s):
1.3% user,
1.3% system,
0.0% nice, 97.4% idle
Mem:
256180k total,
252828k used,
3352k free,
8288k buffers
Swap:
524280k total,
85472k used,
438808k free,
110844k cached
PID
3605
3729
1
2
3
4
5
6
83
186
190
289
295
320
324
330

USER
piccardi
piccardi
root
root
root
root
root
root
root
root
daemon
root
root
root
root
root

PR
17
16
8
8
19
9
9
9
9
9
9
9
9
9
9
9

NI VIRT RES SHR S %CPU %MEM


0 10052 9.8m 4512 S 1.6 3.9
0 1124 1124 896 R 1.3 0.4
0
548 516 516 S 0.0 0.2
0
0
0
0 S 0.0 0.0
19
0
0
0 S 0.0 0.0
0
0
0
0 S 0.0 0.0
0
0
0
0 S 0.0 0.0
0
0
0
0 S 0.0 0.0
0
0
0
0 S 0.0 0.0
0
968 932 836 S 0.0 0.4
0
500 452 436 S 0.0 0.2
0
912 852 836 S 0.0 0.3
0 1196 528 504 S 0.0 0.2
0
824 768 740 S 0.0 0.3
0
864 784 756 S 0.0 0.3
0
724 684 636 S 0.0 0.3

TIME+
1:03.01
0:01.00
0:02.73
0:00.57
0:00.01
0:00.66
0:00.00
0:00.06
0:00.01
0:00.00
0:00.04
0:00.63
0:00.14
0:00.02
0:00.00
0:49.00

COMMAND
emacs
top
init
keventd
ksoftirqd_CPU0
kswapd
bdflush
kupdated
khubd
dhclient
portmap
syslogd
klogd
inetd
lpd
pbbuttonsd

In testa vengono sempre stampate cinque righe di informazioni riassuntive sul sistema: nella
prima riga viene riportato lorario, uptime,69 il numero di utenti ed il carico medio della macchina;
69

cio`e il tempo trascorso da quando il sistema `e stato avviato.

1.3. LARCHITETTURA DEI PROCESSI

31

nella seconda riga le statistiche sul totale dei processi; nella terza le statistiche di utilizzo della
CPU, nelle ultime due le statistiche di uso della memoria fisica e della swap.
A queste informazioni generiche seguono, dopo una riga lasciata vuota che serve per gestire
linput in interattivo, le informazioni sui processi, ordinati per uso decrescente della CPU (vengono cio`e mostrati i pi`
u attivi), evidenziando (con la stampa in grassetto) quelli trovati in stato
runnable. Le informazioni riportate di default sono il PID del processo (colonna omonima),
lutente cui esso appartiene (colonna USER); la priorit`a ed il valore di nice (torneremo su questi
in sez. 1.3.4) rispettivamente nelle colonne PR e NI.
Seguono i dati delluso della memoria nelle colonne VIRT, RES e SHR; per capire queste quantit`a occorre dare qualche dettaglio in pi`
u sul sistema della memoria virtuale cui abbiamo gi`
a
accennato in sez. 1.1.1; in quella occasione abbiamo detto come sia compito del kernel mappare
lo spazio (virtuale) degli indirizzi di memoria di un processo nella memoria fisica effettivamente
disponibile. La memoria usata da un processo `e sostanzialmente suddivisa in due parti,70 il
codice del programma e i dati usati dallo stesso.
Il programma per essere eseguito dovr`a avere il codice ed i relativi dati nella memoria fisica,
e la quantit`
a di memoria attualmente usata a questo scopo `e quella che `e indicata dalla colonna
RES e viene detta residente, che sar`a la somma della parte usata per i dati (indicata da DATA)
e della parte usata per il codice (indicata da CODE). Una parte di questultima (ad esempio il
codice delle librerie) sar`
a condivisa con altri processi, e questa viene indicata dalla colonna SHR.
Ci sar`
a per`
o anche una parte di memoria che al momento non `e in uso, e che, per liberare della
memoria fisica a favore di altri programmi che devono essere eseguiti, `e stata temporaneamente
parcheggiata su una area di disco a questo dedicata (detta swap, vedi sez. 5.1.7) da cui pu`
o
essere ripresa in caso di necessit`
a. Allora il totale della memoria vista dal programma, che a
questo punto `e virtuale, in quanto non corrisponde a della RAM direttamente accessibile, `e
quello espresso dalla colonna VIRT, che sar`a la somma sia della parte residente (quella di RES)
che di quella che `e stata parcheggiata nellarea di swap.
Come altre informazioni presenti nella stampa di default il comando riporta lo stato del
processo (colonna S), le percentuali di utilizzo di CPU e memoria (colonne %CPU e %MEM), il
tempo di CPU utilizzato dallavvio del programma (colonna TIME+) ed il comando usato per
lanciarlo (colonna COMMAND), il cui significato `e analogo a quello gi`a visto per ps.
Propriet`
a
SHR
SWAP
CODE
DATA
RES
VIRT

S
TIME+

Descrizione
ammontare della memoria condivisa, rappresenta la memoria
potenzialmente condivisibile con altri processi.
ammontare della memoria virtuale di un processo presente nella swap.
ammontare della memoria fisica utilizzata dal processo per il suo codice
eseguibile.
ammontare della memoria fisica utilizzata dal processo per i suoi dati.
ammontare della memoria fisica usata dal processo (uguale a CODE +
DATA).
ammontare totale della memoria virtuale usata dal processo include
tutto il codice, i dati e le librerie condivise pi`
u le pagine che sono state
messe su swap (uguale a SWAP + RES).
stato del processo (analogo allo STAT di ps).
tempo di CPU utilizzato dallavvio (analogo al TIME di ps, ma con
granularit`
a fino al centesimo di secondo).

Tabella 1.12: Propriet`


a dei processi e nome della relativa colonna nella visualizzazione effettuata da top.

In generale le informazioni riportate nelle colonne stampate da top sono simili a quelle di
ps, anche se in alcuni casi esse vengono indicate diversamente. Le principali propriet`a mostrate
70

si sta usando una descrizione brutalmente semplificata, per una trattazione dettagliata dellargomento si pu`
o
fare riferimento alla sezione 2.2 di [GaPiL].

32

CAPITOLO 1. LARCHITETTURA DI UN SISTEMA GNU/LINUX

da top sono riportate in tab. 1.12, per quelle comuni non presenti in detta tabella si faccia
riferimento alle omonime di ps riportate in tab. 1.11.
Una delle caratteristiche di top `e che se viene usato in modalit`a interattiva diventa possibile
dare una serie di comandi da tastiera, ad esempio con k si pu`o inviare un segnale (di default
`e SIGTERM, vedi sez. 1.3.3) mentre con r si pu`o cambiare la priorit`a (vedi sez. 1.3.4) di un
processo. Con il comando u si possono selezionare i processi di un utente, con c, si pu`o
alternare fra la stampa del nome comando e della riga completa, con d cambiare il periodo di
aggiornamento dei risultati. Lelenco completo, oltre che nella pagina di manuale, pu`o essere
stampato a video con h.
Si noti che nelle righe iniziali mostrate in precedenza top riporta anche delle statistiche complessive sulluso della memoria, queste possono essere ottenute separatamente tramite il comando
free, che mostra un riassunto generale dellimpiego della memoria allinterno del sistema, con
un qualcosa del tipo:
piccardi@hain:~/truedoc/corso$ free
total
used
free
Mem:
775444
759364
16080
-/+ buffers/cache:
229180
546264
Swap:
498004
34708
463296

shared
0

buffers
213276

cached
316908

La prima riga riporta luso della memoria fisica, mentre lultimo quello della swap (se questa
`e attiva, torneremo sullargomento in sez. 5.1.7); la riga centrale ci dice quanto della memoria
`e occupata o libera dal punto di vista delle applicazioni.71 Si noti che in genere la RAM libera
`e sempre molto poca; questo `e corretto, in quanto non ha senso lasciare inutilizzata la RAM,
ed allora viene impiegata dai buffer del kernel (per gestire pi`
u efficacemente il trasferimento dei
dati verso i dispositivi) e per mantenere dati temporanei, come riportato nelle colonne buffer
e cache.72
Il comando free non ha argomenti e prende come opzioni -b, -k e -m per stampare i dati
di utilizzo rispettivamente in byte, kilobyte (il default) e megabyte. Inoltre lo si pu`o mantenere
attivo in modo da osservare continuamente lo stato della memoria usando lopzione -s, seguita
dal numero di secondi che passano fra un controllo e laltro. Lelenco completo delle opzioni ed
i relativi dettagli sono al solito riportati nella pagina di manuale, accessibile con man free.
Infine qualora si voglia ricercare il valore del PID di un certo programma, invece di andare a
cercare nelloutput di ps si pu`
o utilizzare pidof. Il comando prende come argomento una lista
di nomi dei programmi di cui si vuole conoscere il PID ed esegue automaticamente una ricerca
nella tabella dei processi, stampando la lista dei PID di tutti i processi che corrispondono. Il
comando prende lopzione -s, che richiede, in caso di pi`
u processi che corrispondono allo stesso
programma, di stampare un solo PID, mentre gli si pu`o dire di omettere un PID passandolo
come parametro per lopzione -o. Per i dettagli del funzionamento e lelenco completo delle
opzioni si pu`o consultare la pagina di manuale accessibile con man pidof.
Il comando viene usato in genere negli script di shell (vedi sez. 2.1.5) per controllare se un
certo programma `e in esecuzione; infatti se nella ricerca non viene trovato nessun processo il
comando non stampa niente ma ritorna uno stato di uscita indicante un errore, che pu`o essere
usato per prendere delle decisioni. Si tenga presente che la ricerca viene eseguita sul nome del
programma, se esistono diversi programmi con lo stesso nome per avere la certezza di scegliere
quello voluto `e necessario indicare un pathname assoluto.
71
riporta cio`e come memoria libera la somma delle colonne buffer e cached della riga precedente, che indicano
i dati temporanei che possono essere scartati qualora sia necessaria altra memoria per le applicazioni.
72
la colonna shared veniva usata per indicare la memoria condivisa fra pi`
u processi, adesso `e obsoleta e deve
essere ignorata.

1.3. LARCHITETTURA DEI PROCESSI

1.3.3

33

I segnali

Benche i processi siano di norma entit`a separate e completamente indipendenti fra di loro, esistono molti casi in cui `e necessaria una qualche forma di comunicazione. La forma pi`
u elementare di
comunicazione fra processi `e costituita dai segnali, che sono usati anche direttamente dal kernel
per comunicare ai processi una serie di eventi o errori (come luso inappropriato della memoria
o una eccezione aritmetica).
Come dice la parola un segnale `e una specie di avviso che viene inviato ad un processo; e non
contiene nessuna informazione oltre al fatto di essere stato inviato. In genere i segnali vengono
utilizzati per notificare ai processi una serie di eventi (abbiamo accennato in sez. 1.3.2 che uno di
essi viene utilizzato per notificare la terminazione di un processo figlio), e possono essere anche
inviati a mano attraverso luso del comando kill.73 Ciascun segnale `e identificato da un numero
e da un nome simbolico; la lista dei segnali disponibili pu`o essere ottenuta semplicemente con:
piccardi@oppish:~$ kill -l
1) SIGHUP
2) SIGINT
5) SIGTRAP
6) SIGABRT
9) SIGKILL
10) SIGUSR1
13) SIGPIPE
14) SIGALRM
18) SIGCONT
19) SIGSTOP
22) SIGTTOU
23) SIGURG
26) SIGVTALRM
27) SIGPROF
30) SIGPWR
31) SIGSYS
34) SIGRTMIN+2 35) SIGRTMIN+3
38) SIGRTMIN+6 39) SIGRTMIN+7
42) SIGRTMIN+10 43) SIGRTMIN+11
46) SIGRTMIN+14 47) SIGRTMIN+15
50) SIGRTMAX-13 51) SIGRTMAX-12
54) SIGRTMAX-9 55) SIGRTMAX-8
58) SIGRTMAX-5 59) SIGRTMAX-4
62) SIGRTMAX-1 63) SIGRTMAX

3)
7)
11)
15)
20)
24)
28)
32)
36)
40)
44)
48)
52)
56)
60)

SIGQUIT
SIGBUS
SIGSEGV
SIGTERM
SIGTSTP
SIGXCPU
SIGWINCH
SIGRTMIN
SIGRTMIN+4
SIGRTMIN+8
SIGRTMIN+12
SIGRTMAX-15
SIGRTMAX-11
SIGRTMAX-7
SIGRTMAX-3

4)
8)
12)
17)
21)
25)
29)
33)
37)
41)
45)
49)
53)
57)
61)

SIGILL
SIGFPE
SIGUSR2
SIGCHLD
SIGTTIN
SIGXFSZ
SIGIO
SIGRTMIN+1
SIGRTMIN+5
SIGRTMIN+9
SIGRTMIN+13
SIGRTMAX-14
SIGRTMAX-10
SIGRTMAX-6
SIGRTMAX-2

I segnali effettivamente usati dal sistema sono i primi 31, gli altri sono chiamati real time
signal ed hanno un uso specialistico che va al di l`a di quello che possiamo affrontare qui.74 In
generale ciascuno di essi ha un compito o un significato specifico, alcuni di essi vengono generati
automaticamente in caso di errori del programma; ad esempio il segnale SIGSEGV viene inviato
dal kernel per segnalare ad un processo una Segment Violation, cio`e un accesso illegale alla
memoria;75 altri vengono inviati direttamente dallutente, come SIGKILL che causa limmediata
terminazione di un processo.
Gran parte dei segnali (tutti eccetto SIGKILL e SIGSTOP, che hanno un comportamento
speciale) possono essere intercettati dal processo, che pu`o eseguire una opportuna funzione al loro
arrivo. Ad esempio il segnale SIGTERM (che `e quello che il comando kill invia di default) serve
per richiedere la terminazione immediata di un processo, ma il segnale pu`o essere intercettato
per eseguire delle operazioni di pulizia, come cancellare dei file temporanei prima delluscita.
Se un segnale non viene intercettato viene eseguita unazione di default che `e specifica di
ciascuno di essi. Nella maggior parte dei casi lazione consiste nella terminazione immediata del
processo; questa pu`
o per`
o avvenire in due modi, o con una semplice uscita o con luscita eseguita
insieme alla creazione, nella directory di lavoro del processo, di un file core che contiene una
copia del suo spazio di memoria (viene per questo detto un core dump) che pu`o essere usato
73

con la bash il comando `e disponibile anche come comando interno della shell, nel qual caso pu`
o avere un
comportamento leggermente diverso per alcune delle opzioni rispetto a quanto riportato qui.
74
per una spiegazione pi`
u dettagliata al riguardo si pu`
o fare riferimento alla sezione 9.4.6 di [GaPiL].
75
questo `e un altro dei vantaggi della memoria virtuale, se per un errore di programmazione un processo cerca
di scrivere su una parte dello spazio degli indirizzi che non corrisponde a nessuna locazione di memoria associata
al processo stesso, il sistema se ne accorge ed invia questo segnale che ne causa la terminazione; si impedisce cos`
che un accesso sbagliato possa andare a sovrascrivere la memoria di altri processi.

34

CAPITOLO 1. LARCHITETTURA DI UN SISTEMA GNU/LINUX

con un programma di debug per vedere in che punto c`e stata linterruzione. Infine alcuni
segnali (come SIGCHLD, che `e quello che viene usato per notificare al padre la terminazione di
un figlio) di default vengono ignorati,76 il programma cio`e continua ad essere eseguito senza
nessuna conseguenza.
Tipici segnali che causano una semplice uscita sono SIGTERM, il default del comando kill,
e SIGINT che `e associato al carattere di interruzione dato dalla tastiera (vedi sez. 2.1.2), un
segnale che invece produce un core dump `e SIGQUIT, cos` come tutti i segnali relativi ad errori
di programmazione come SIGSEGV, SIGFPE, ecc. Segnali come SIGSTOP e SIGTSTP invece hanno
come effetto quello di fermare lesecuzione di un programma, mandandolo in stato T. Un elenco
dettagliato dei segnali, del loro significato e delle azioni di default si pu`o trovare nella sezione
9.2 di [GaPiL].
In generale il comando kill permette di inviare un segnale ad un processo qualunque, specificando come parametro il PID di questultimo. Come accennato il segnale inviato di default
`e SIGTERM, ma si pu`
o inviare qualunque altro segnale specificandone numero o nome preceduto
da un - come opzione; ad esempio:
kill
kill
kill
kill

-9 1029
-SIGKILL 1029
-KILL 1029
-s SIGKILL 1029

sono modalit`a equivalenti di inviare il segnale SIGKILL al processo con PID 1029. Oltre a -s
e -l il comando kill accetta le opzioni -L (sinonimo di -l) e -V che ne stampa la versione.
Per una descrizione accurata delle opzioni si faccia al solito riferimento alla pagina di manuale
accessibile con man kill.
Nel caso specifico, dato che SIGKILL non `e intercettabile e la sua azione di default `e la terminazione del processo, leffetto di questo comando `e di terminare senza possibilit`a di scampo
il processo in questione. Se infatti SIGTERM viene intercettato pu`o risultare inefficace qualora il
processo venga bloccato anche nellesecuzione della funzione di gestione; dato che non `e possibile intercettare SIGKILL si ha a disposizione un mezzo infallibile77 per terminare un processo
impazzito, e questo senza alcuna conseguenza per gli altri processi o per il sistema.
Infine invece che ad un singolo processo si pu`o inviare un segnale ad un intero process group
(sui process group torneremo pi`
u avanti in sez. 2.1.2) usando come argomento il negativo del
relativo process group ID; il valore -1 inoltre ha il significato speciale di indicare tutti i processi
correnti eccetto init ed il processo che esegue il comando.
Un comando alternativo a kill, e pi`
u facile da usare, `e killall che invece di richiedere un
numero di PID funziona indicando il nome del programma, ed invia il segnale (specificato con la
stessa sintassi di kill) a tutti i processi attivi con quel nome. Le opzioni principali disponibili
sono riportate in tab. 1.13. Al solito la documentazione completa `e nella pagina di manuale,
accessibile con man killall.
I segnali sono un meccanismo di comunicazione elementare fra processi, `e cio`e possibile
utilizzarli per dare delle istruzioni (molto semplici, come quella di terminare lesecuzione) ad un
processo. Uno dei segnali pi`
u usati come argomento del comando kill `e ad esempio SIGHUP,
che viene utilizzato per dire ai demoni 78 di sistema di rileggere il proprio file di configurazione.
76
nel caso di SIGCHLD non `e proprio il caso di farlo, altrimenti, come spiegato in sez. 1.3.2, ci si ritrover`
a con
degli zombie.
77
in realt`
a quasi infallibile, infatti come accennato in sez. 1.3.2, inviare segnali ad un processo in stato D non
ha effetto, perche non pu`
o riceverli fintanto che resta in quello stato, ed `e inutile inviarli ad un processo in stato
Z perche in realt`
a esso non esiste pi`
u.
78
sono chiamati cos` i programmi che girano in background senza essere associati ad un terminale, che servono
a fornire vari servizi, come ad esempio i server di rete, il sistema per il log e le esecuzioni periodiche dei comandi,
e molti altri che vedremo pi`
u avanti.

1.3. LARCHITETTURA DEI PROCESSI


Opzione
-g
-e
-i
-l
-w

35

Significato
invia il segnale al process group del processo.
richiede una corrispondenza esatta anche per nomi molto
lunghi (il comando controlla solo i primi 15 caratteri).
chiede una conferma interattiva prima di inviare il
segnale.
stampa la lista dei nomi dei segnali.
attende la terminazione di tutti i processi cui ha inviato
il segnale.

Tabella 1.13: Principali opzioni del comando killall.

Infine alcuni segnali (come SIGTSTP, SIGINT e lo stesso SIGHUP) sono associati al controllo
del terminale e vengono inviati attraverso opportune combinazioni di tasti o in occasione di
eventi particolari; torneremo su questo in sez. 2.1.2 quando affronteremo le questioni relative al
controllo di sessione.

1.3.4

La gestione delle priorit`


a

Abbiamo visto in sez. 1.3.2 che una delle propriet`a dei processi che si pu`o modificare con top `e
la priorit`
a. In realt`
a, come accennato in tale occasione, quello che di norma si pu`o modificare
non `e tanto la priorit`
a di un processo, quanto il suo valore di nice.
La gestione delle priorit`
a in un sistema unix-like infatti `e abbastanza complessa dato che esistono due tipi di priorit`
a: statiche e dinamiche. Di norma le priorit`a statiche vengono utilizzate
solo per i cosiddetti processi real-time,79 i processi ordinari (tutti, luso di processi real-time `e
riservato a pochi usi specialistici) hanno priorit`a statica nulla e il loro ordine di esecuzione viene
stabilito solo in base a delle priorit`
a dinamiche.
Una priorit`
a statica pi`
u alta comporta che un processo verr`a sempre eseguito prima di ogni
altro processo a priorit`
a pi`
u bassa. Il che vuol dire che se si lancia un processo a priorit`
a
statica alta che non fa I/O non si potr`a fare pi`
u nulla nel sistema fintanto che questo non si
sar`a concluso (e se c`e un errore e il programma si blocca in un ciclo si dovr`a necessariamente
riavviare la macchina, non avendo modo di eseguire nientaltro). La cosa non vale quando il
processo deve fare I/O perche in tal caso anche il processo real-time viene messo in stato di
sleep, ed in quel momento altri processi possono essere eseguiti, lasciando cos` la possibilit`
a di
interromperlo. Se pi`
u processi hanno la stessa priorit`a statica lordine di esecuzione dipende
dalla politica di scheduling scelta, che pu`o essere di tipo Round Robin, in cui i processi girano
a turno per un tempo fisso, e First In First Out, in cui vengono eseguiti nella sequenza in cui
sono stati lanciati.
Nelluso normale comunque non si ha bisogno di usare le priorit`a statiche (che come accennato sono anche molto rischiose in caso di errori di programmazione), e ci si affida al normale
procedimento di scheduling, basato su un sistema di priorit`a dinamiche che permette di ottenere
quella che usualmente viene chiamata la fairness nella distribuzione del tempo di CPU. Tralasciando i dettagli80 possiamo dire che le priorit`a dinamiche sono caratterizzate da un valore
iniziale, che `e quello che poi si chiama nice, che di default `e nullo; pi`
u un processo viene eseguito,
pi`
u il valore di priorit`
a dinamica aumenta, e lo scheduler 81 mette sempre in esecuzione, fra tutti
quelli in stato runnable, il processo che ha una priorit`a dinamica pi`
u bassa.
79

questo nome `e in realt`


a fuorviante, Linux, almeno nella sua versione standard, non `e un sistema operativo
real-time. Se si ha necessit`
a di usare un sistema effettivamente real-time occorre usare una versione del kernel
opportunamente modificata come RTAI o RT-Linux.
80
una trattazione pi`
u dettagliata si pu`
o trovare in sez. 3.4 di [GaPiL].
81
si ricordi (vedi sez. 1.1.1) che lo scheduler `e la parte di kernel che decide quale processo deve essere posto in
esecuzione.

36

CAPITOLO 1. LARCHITETTURA DI UN SISTEMA GNU/LINUX

Questo fa s` che anche i processi che partono da un valore di nice pi`


u alto (che viene chiamato
cos` appunto perche i processi che lo usano sono pi`
u gentili nei confronti degli altri) ottengano
alla fine una possibilit`
a di essere eseguiti, secondo quello che appunto `e il meccanismo chiamato
fairness.
Il comando che permette di modificare il valore di nice di un processo `e appunto nice, che
deve essere usato per lanciare un altro comando, con una sintassi in cui si fa seguire a nice la
linea di comando di cui si vuole cambiare la priorit`a di esecuzione. Lopzione principale `e -n
(da specificare prima della riga di comando che si vuole eseguire) che permette di specificare un
valore di nice da applicare al programma. Se non si specifica nulla viene applicato un valore di
default pari a 10. Si ricordi che valori positivi corrispondono ad una diminuzione della priorit`a.
Solo lamministratore pu`
o anche usare valori negativi, aumentando cos` la priorit`a di un processo.
I valori possibili sono comunque limitati allintervallo fra fra 19 e -20.
Il comando nice pu`
o essere usato solo quando si avvia un programma, se si vuole cambiare
la priorit`a di un programma gi`
a in esecuzione si pu`o usare il comando renice. In questo caso
la priorit`a (o meglio il valore di nice) deve essere indicato con il suo valore numerico (preceduto
da un eventuale segno) come primo argomento; si possono specificare il processo (o i processi) a
cui applicare il cambiamento con gli argomenti successivi.
Il comando renice interpreta tutti gli argomenti successivi al primo come indicazione dei
processi di cui si vuole cambiare la priorit`a. Il default `e considerare gli argomenti come valori
del PID di un processo, cosa che pu`
o essere indicata esplicitamente usando lopzione -p; con
lopzione -u si possono selezionare tutti i processi di un singolo utente, specificato per nome o
tramite il suo identificativo; infine con -g si possono indicare tutti i processi di uno stesso gruppo
(che in genere, come vedremo in sez. 2.1.2, corrispondono ai comandi eseguiti su una stessa riga
di shell) specificandone il numero di process group.
Al solito si applica la restrizione che solo lamministratore pu`o applicare valori negativi, ed
aumentare cos` la priorit`
a di un processo. Si tenga conto inoltre che, a differenza di nice, i
valori di renice sono relativi al valore di nice attuale. Pertanto una volta che si `e diminuita
la priorit`a di un processo aumentandone il valore di nice un utente normale non potr`a tornare
indietro.82

1.4

Il controllo degli accessi

Come gi`a detto e ripetuto pi`


u volte, Linux `e nato come sistema multiutente e nella sua architettura `e nativa la possibilit`
a di avere utenti diversi che lavorano sulla stessa macchina. Questo
ovviamente comporta la necessit`
a di un meccanismo di controllo degli accessi, che permetta di
restringere le capacit`
a dei singoli utenti in maniera che questi non possano recare danni (volontariamente o involontariamente che sia) agli altri o al sistema. Tratteremo qui le basi dei
meccanismi di controllo degli accessi, mentre la gestione degli utenti sar`a affrontata pi`
u avanti,
in sez. 4.3.

1.4.1

Lidentificazione di utenti e gruppi

Essendo nato come sistema multiutente, ogni kernel di tipo unix-like come Linux deve fornire
dei meccanismi di identificazione dei vari utenti, sulla base dei quali poi possa venire imposto
un adeguato controllo degli accessi e delle operazioni che questi possono eseguire allinterno del
sistema.
82
questo `e vero fino alla versione 2.2.4 delle glibc, quando `e stata modificata la funzione nice delle librerie, che
non chiama pi`
u la corrispondente system call del kernel, ma viene reimplementata con altre funzioni, queste
prendono un valore assoluto, che viene usato anche dal comando renice che cos` diventa capace anche di diminuire
un valore di nice precedentemente aumentato.

1.4. IL CONTROLLO DEGLI ACCESSI

37

La struttura di sicurezza tradizionale di un sistema unix-like `e estremamente semplice, tanto


da essere in certi casi considerata troppo primitiva83 e prevede una distinzione fondamentale
fra lamministratore del sistema, tradizionalmente identificato dallusername root,84 per il quale
non esiste nessuna restrizione, e tutti gli altri utenti, per i quali invece vengono effettuati vari
controlli, a seconda delle operazioni che vengono richieste.
Come gi`
a accennato in sez. 1.3.2 allinterno del sistema il kernel identifica ogni utente con un
numero identificativo, chiamato user ID o UID. Questo `e nullo per lamministratore e diverso
da zero per tutti gli altri utenti. I controlli vengono effettuati dal kernel sulla base di questo
numero, e se `e diverso da zero viene verificato se corrisponde a quello per cui la richiesta `e
consentita, e nel caso si nega o concede laccesso. Si noti il se, qualora luser ID sia nullo85
il controllo non viene neanche effettuato: `e per questo che root `e sempre in grado di compiere
qualunque operazione.86
Tutti i sistemi unix-like prevedono una procedura di autenticazione che permette di riconoscere lutente che si collega al sistema. Questa nella sua forma pi`
u elementare, per laccesso da
87
una console testuale, viene effettuata dal programma login, che in base al nome che identifica
un utente di fronte al sistema (il cosiddetto username, o nome di login) richiede limmissione di
una password ad esso associata, che permette di verificarne lidentit`a.
Come vedremo con maggiori dettagli in sez. 4.3, dove tratteremo la configurazione della
procedura di login e le modalit`
a per gestire utenti e gruppi, ciascun username `e abbinato in
maniera univoca ad un certo user-ID 88 che sar`a quello che verr`a utilizzato dal kernel per tutti
i programmi che lutente lancer`
a una volta entrato nel sistema. I comandi invece, per una
maggiore leggibilit`
a, riportano lidentit`a dellutente utilizzando il suo username.89
Gli utenti poi possono venire raggruppati in gruppi, come per gli utenti ogni gruppo ha un
nome (detto groupname) ed un corrispondente identificatore numerico, il group-ID o GID. Inoltre
ad ogni utente `e sempre associato almeno un gruppo, detto gruppo di default o gruppo principale.
Di norma si fa si che questo gruppo contenga come membro solo lutente in questione e abbia
nome uguale allusername. In generale un utente pu`o appartenere ad un numero qualunque di
gruppi, diventa cos` possibile permettere laccesso a delle risorse comuni a tutti gli utenti che
fanno parte dello stesso gruppo.
Ogni processo, quando viene lanciato, eredita dal padre linformazione relativa allutente
per conto del quale viene eseguito e di tutti i gruppi a cui questo appartiene. In questo modo
una volta entrati nel sistema tutti i programmi verranno eseguiti per conto dellutente che ha
effettuato la procedura di login. Il sistema pu`o cos` provvedere al controllo degli accessi, e
porre una serie di limitazioni a quello che lutente pu`o fare, impedendo lesecuzione di tutte
le operazioni non consentite. Si evita cos` che utenti diversi possano danneggiarsi fra loro o
danneggiare il sistema.
83

sono previste estensioni specifiche, come quelle di SELinux (incorporate nel kernel a partire dalle versioni di
sviluppo 2.5.x), che implementano il Mandatory Access Control e la capacit`
a di definire in maniera molto pi`
u
dettagliata i privilegi di accesso, sottoponendo anche lamministratore ad ulteriori restrizioni; questo necessita
ovviamente di un bel po di lavoro amministrativo in pi`
u per cui non sono utilizzate molto spesso.
84
tanto che il nome root spesso viene usato come sinonimo dellamministratore.
85
si tenga presente che quello che conta `e comunque luser ID, non il nome utente, questo infatti `e solo
unetichetta (torneremo sullargomento in sez. 4.3) che potrebbe essere qualunque.
86
ed `e per questo che occorre evitare assolutamente luso di root per qualunque compito che non sia strettamente
connesso allamministrazione del sistema: un comando sbagliato che sarebbe innocuo se dato da un utente normale
potrebbe distruggere completamente il sistema se dato da root.
87
un tempo si indicava con questo nome il terminale privilegiato da cui si potevano eseguire i compiti amministrativi, in genere collegato direttamente al computer stesso; oggi in pratica i compiti amministrativi si possono
effettuare da qualunque terminale, per cui console `e diventato sostanzialmente un sinonimo di terminale.
88
questa funzionalit`
a viene fornita direttamente dalle librerie fondamentali del sistema (le glibc) tramite il
cosiddetto Name Service Switch (vedi sez. 4.3.6).
89
molti di essi comunque (come ls) supportano luso di opportune opzioni (nel caso -n) per stampare il valore
delluser-ID al posto dellusername.

38

CAPITOLO 1. LARCHITETTURA DI UN SISTEMA GNU/LINUX

In realt`a, come gi`


a accennato in sez. 1.3.2, il kernel mantiene diverse versioni di questi
identificatori; la trattazione esatta di tutti i particolari va al di l`a dello scopo di questo testo,90
per quanto ci interessa qui basta citare le due versioni principali, quella degli indicatori cosiddetti
effettivi (cio`e leffective user ID e leffective group ID) che vengono usati per le verifiche sul
controllo daccesso e quelli cosiddetti reali (cio`e il real user ID ed il real group ID) che identificano
chi ha lanciato il processo. In generale questi due gruppi di identificatori sono sempre identici
fra loro, a meno che non si sia usato un programma con i permessi speciali set user ID o set
group ID come vedremo di seguito in sez. 1.4.2.

1.4.2

I permessi dei file

La gestione dei permessi dei file in un sistema unix-like `e tutto sommato abbastanza elementare;
esistono estensioni91 che permettono di renderla pi`
u sottile e flessibile, ma nella maggior parte
dei casi il controllo di accesso standard `e pi`
u che sufficiente. In sostanza per il sistema esistono
tre livelli di privilegi:
i privilegi dellutente, indicati con la lettera u, (dallinglese user ).
i privilegi del gruppo, indicati con la lettera g, (dallinglese group).
i privilegi di tutti gli altri, indicati con la lettera o, (dallinglese other ).
e tre permessi base:
permesso di lettura, indicato con la lettera r, (dallinglese read ).
permesso di scrittura, indicato con la lettera w, (dallinglese write).
permesso di esecuzione, indicato con la lettera x, (dallinglese execute).
il cui significato `e abbastanza ovvio.92
Ogni file `e associato ad un utente, che `e detto proprietario del file e ad un gruppo (detto
a sua volta gruppo proprietario), per ciascuno dei tre livelli di privilegio (utente, gruppo e
altri) `e possibile specificare uno dei tre permessi (lettura, scrittura, esecuzione). Questi vengono
riportati nella versione estesa delloutput del comando ls:
[piccardi@gont GaPiL]$ ls -l sources/
drwxr-sr-x
2 piccardi piccardi
128
-rw-r--r-1 piccardi piccardi
9534
-rw-r--r-1 piccardi piccardi
4103
-rw-r--r-1 piccardi piccardi
1052
-rw-r--r-1 piccardi piccardi
3013
-rw-r--r-1 piccardi piccardi
3904
-rw-r--r-1 piccardi piccardi
4409
-rw-r--r-1 piccardi piccardi
1748
-rw-r--r-1 piccardi piccardi
1678
-rw-r--r-1 piccardi piccardi
2821
-rwxr-xr-x
1 piccardi piccardi
28944
-rw-r--r-1 piccardi piccardi
4416
-rw-r--r-1 piccardi piccardi
3018
-rw-r--r-1 piccardi piccardi
7404

Jan
Oct
Oct
Jan
Jan
Sep
Sep
Sep
Sep
Jan
Jan
Jan
Jan
Jun

4
14
26
1
4
10
10
10
10
4
1
4
4
10

00:46
17:05
23:40
12:53
00:44
00:45
00:45
00:45
00:45
00:44
13:11
00:44
00:44
2001

CVS
ErrCode.c
ForkTest.c
Makefile
ProcInfo.c
SimpleEchoTCPClient.c
SimpleEchoTCPServer.c
SockRead.c
SockWrite.c
TestRen.c
getparam
getparam.c
test_fopen.c
wrappers.h

che ci mostra nella prima colonna i permessi secondo lo schema riportato in fig. 1.4. La lettura
delloutput di questo comando ci permette di vedere che i sorgenti dei programmi contenuti
nella directory in oggetto hanno quelli che sono in genere i permessi di default per i file di
dati, si ha cio`e il permesso di scrittura solo per il proprietario, quello di lettura per tutti quanti
(proprietario, gruppo e altri) e lassenza completa del permesso di esecuzione.
90

come gi`
a detto gli interessati possono trovare una trattazione dellargomento nella sezione 3.3 di [GaPiL].
come le ACL (Access Control List), introdotte ufficialmente a partire dai kernel 2.6, o altri meccanismi
specialistici ancora pi`
u sofisticati (come SELinux, cui abbiamo gi`
a accennato).
92
almeno fintanto che si fa riferimento ad un file normale, vedremo a breve che le cose cambiano quando si
tratta di directory, link simbolici o dispositivi.
91

1.4. IL CONTROLLO DEGLI ACCESSI

39

Figura 1.4: Legenda dei permessi delloutput di ls.

Nel caso di un programma invece (come il getparam nellesempio) i permessi di default sono
diversi, ed oltre a quelli presenti per i normali file di dati si ha anche il permesso di esecuzione,
che `e abilitato per il proprietario, per il gruppo e per tutti gli altri.
In generale un utente potr`
a effettuare solo le azioni per le quali ha i permessi, nel caso dei
permessi appena illustrati questo comporta che un utente pu`o leggere i file di un altro ma non pu`
o
modificarli o cancellarli. In realt`
a il meccanismo del controllo `e abbastanza peculiare, e questo,
se non capito fino in fondo, pu`
o dar luogo a qualche confusione.93 La verifica dei permessi di
accesso ad un file prevede infatti i seguenti passi, eseguiti esattamente in questa sequenza:
1. se il processo viene eseguito dallamministratore laccesso viene sempre garantito, senza
che sia eseguito nessun controllo
2. se il processo viene eseguito dal proprietario del file allora:
vengono controllati i permessi corrispondenti allutente (quelli indicati da u), e se
questi sono assegnati per loperazione richiesta, laccesso `e consentito
altrimenti laccesso `e negato
3. se il processo viene eseguito da un utente che appartiene al gruppo proprietario del file
allora:
vengono controllati i permessi corrispondenti al gruppo (quelli indicati da g), e se
questi sono assegnati per loperazione richiesta, laccesso `e consentito
altrimenti laccesso `e negato
4. se il processo viene eseguito da un qualunque altro utente allora:
vengono controllati i permessi corrispondenti a tutti gli altri (quelli indicati da o),
e se questi sono assegnati per loperazione richiesta, laccesso `e consentito
altrimenti laccesso `e negato
Si noti bene come in questa sequenza di controlli, una volta che la decisione riguardo laccesso
`e presa, i passi successivi non vengono pi`
u eseguiti. Tutto ci`o significa ad esempio che se un
utente non ha il permesso di scrittura per un proprio file, questi non potr`a scriverci, anche
qualora il permesso di scrittura per il gruppo o per tutti gli altri fossero garantiti. Questo
avviene perche il permesso relativo allutente proprietario viene controllato per primo, laccesso
viene negato, ed i permessi successivi non vengono controllati. Questo spiega anche perche il
permesso indicato con o si chiama per tutti gli altri, e non semplicemente per tutti: esso infatti
verr`a applicato soltanto per gli utenti che non sono il proprietario o non appartengono al gruppo
proprietario.
Vale la pena anche sottolineare di nuovo come i controlli siano eseguiti per tutti gli utenti
eccetto lamministratore, che non `e soggetto a nessun tipo di restrizione e pu`o quindi eseguire
qualunque operazione. In genere ogni distribuzione fa s` che tutti i file di configurazione ed i
93

per una trattazione dettagliata si consultino sez. 3.3 e 5.3 di [GaPiL].

40

CAPITOLO 1. LARCHITETTURA DI UN SISTEMA GNU/LINUX

programmi installati nel sistema appartengano a root, cosicche diventa impossibile per un utente
normale poter danneggiare (accidentalmente o meno) gli stessi.94
Fin qui si `e dato abbastanza per scontato il significato dei tre permessi di lettura, scrittura
ed esecuzione, fra laltro facendo riferimento solo a file normali,95 in realt`a anche in questo caso
il funzionamento del sistema ha alcune sottigliezze che occorre approfondire. Anzitutto bisogna
chiarire che i suddetti permessi si applicano al contenuto del file; il permesso di lettura significa
che se ne pu`o leggere il contenuto, quello di scrittura che se ne pu`o modificare il contenuto, e
quello di esecuzione che se ne pu`
o eseguire il contenuto (il che si traduce nel poter lanciare il
programma).
Il fatto che i permessi facciano riferimento al contenuto di un file ha delle precise conseguenze, ad esempio avere il permesso di scrittura su un file non significa che se ne possano cambiare
i permessi, perche questi, come accennato in sez. 1.2.2, sono mantenuti nellinode e non hanno
perci`o nulla a che fare con il suo contenuto. Il sistema infatti prevede infatti che solo il proprietario di un file possa modificarne i permessi (con il comando chmod, che vedremo in sez. 1.4.3)
e la cosa `e del tutto indipendente dai permessi che detto file pu`o avere.96
I permessi inoltre hanno un significato leggermente diverso quando si applicano agli altri tipi
di file illustrati in tab. 1.1. Nel caso di file di dispositivo, fifo e socket ad esempio il permesso
di esecuzione `e ignorato, mentre per i link simbolici tutti i permessi sono totalmente ignorati
(`e questo il motivo per cui un link simbolico li presenta come tutti attivi) e si applicano invece
quelli del file a cui il link punta.
Le differenze maggiori per`
o si ritrovano per le directory. Alcune di queste differenze in realt`a
sono minori di quel che possono sembrare ed il significato dei permessi si pu`o capire subito se si
tiene presente che, come illustrato in sez. 1.2.2, le directory non sono altro che dei file di tipo
speciale il cui contenuto `e semplicemente una lista di nomi associati ad un riferimento ai rispettivi
inode. Questo ci dice che il permesso di lettura per una directory si traduce semplicemente nella
possibilit`a di leggere, e quindi visualizzare, la lista dei file in essa contenuti.
Un po meno intuitivo, se non altro nei suoi effetti, `e il permesso di scrittura per una directory.
Di nuovo questo significa semplicemente che si pu`o scrivere nel suo contenuto, il che si traduce nel
`
fatto che si pu`o aggiungere una voce alla lista, per creare un file, o toglierla, per cancellarlo.97 E
in particolare questa seconda possibilit`
a che normalmente lascia perplesso chi si accosta le prime
volte a Linux perche, a differenza di altri sistemi operativi, non esiste un permesso specifico per
cancellare un file. Per tale operazione infatti `e sufficiente avere il permesso di scrittura sulla
directory che lo contiene, infatti `e questa che viene modificata, e si noti come loperazione sia
del tutto indipendente da quelli che possono essere i permessi del file, che nel caso non contano
niente.
Il pi`
u complesso da capire resta comunque il permesso di esecuzione che normalmente, come
per la directory CVS dellesempio precedente, `e sempre presente. Le directory non sono programmi ed ovviamente eseguire una lista di file non ha nessun significato. Il kernel perci`o usa questo
permesso dandogli un significato particolare, che `e quello di poter attraversare la directory nella risoluzione del nome di un file. Se cio`e manca il permesso di esecuzione, indipendentemente
da quali possano essere i permessi impostati sui file e le directory in essa contenuti, questi non
saranno pi`
u accessibili, dato che non sar`
a possibile attraversarla per raggiungerli.98 Si tenga
94

questa `e una delle ragioni per cui i virus sono molto pi`
u difficili da fare con Linux: non essendo possibile ad
un utente normale modificare i file di sistema, un virus potr`
a al pi`
u infettare i file di quellutente, cosa che rende
molto pi`
u difficile la sua diffusione.
95
cio`e ai regular file di tab. 1.1.
96
il che consente al proprietario, anche qualora non avesse un certo permesso su un file (come nellesempio
precedente per la scrittura) di riassegnarselo.
97
si ricordi infatti che, come illustrato in sez. 1.2.2, la cancellazione di un file consiste semplicemente nella
rimozione del riferimento al relativo inode presente nella directory.
98
il che significa che eliminando il permesso di esecuzione su una directory si preclude laccesso allintero ramo
dellalbero dei file posto al di sotto di essa.

1.4. IL CONTROLLO DEGLI ACCESSI

41

presente che tutto ci`


o resta valido anche in presenza del permesso di lettura sulla directory, che
significa solo che `e possibile elencarne il contenuto.
Ci si pu`
o chiedere a cosa serva questa separazione fra il permesso di vedere il contenuto
di una directory ed il permesso di poterla attraversare; esistono per`o casi in cui si pu`o voler
consentire a degli utenti (in genere appartenenti ad un certo gruppo) di accedere a dei file (di
cui conoscono il nome) allinterno di una directory condivisa, ma non si vuole che questi possano
vedere se ci sono anche file di altri. Un esempio di tutto ci`o `e la directory /etc/ssl/private, i
cui permessi sono:
piccardi@anarres:~$ ls -ld /etc/ssl/private/
drwx--x--- 2 root ssl-cert 1024 2007-10-18 12:54 /etc/ssl/private

che permette agli utenti del gruppo ssl-cert di accedere ai file creati sotto tale directory ma
non di vederne il contenuto. La directory `e creata dal pacchetto openssl per contenere le chiavi
dei certificati digitali,99 e viene impostata con questi permessi per far s` che un utente possa
accedere alle proprie chiavi, ma non possa sapere se ve ne sono anche di altri utenti.
Fino ad adesso si sono trattati soltanto i permessi ordinari, a questi per`o in tutti i sistemi
unix-like sono stati aggiunti tre permessi speciali che permettono di rendere pi`
u flessibile una
infrastruttura che, se fosse stata limitata soltanto a quegli ordinari, sarebbe stata troppo limitata.
Dal punto di vista del kernel ciascun permesso corrisponde ad un bit in una apposita variabile
mantenuta nellinode (vedi sez. 1.2.2) del file. I bit usati per i permessi sono in tutto 12; i primi
nove sono quelli gi`
a illustrati in fig. 1.4, gli altri tre vengono chiamati col nome assegnato al
rispettivo bit, e cio`e: suid bit, sgid bit e sticky bit.
Questi tre permessi aggiuntivi nascono per modificare il comportamento del sistema nellesecuzione dei programmi. Per questo normalmente sono sempre abbinati al permesso di esecuzione,100 ed hanno effetto solo se vengono applicati a dei binari eseguibili.101 I pi`
u importanti
sono i primi due che servono per consentire ad un programma di eseguire delle operazioni che
nel caso generico sarebbero riservate al solo amministratore.
Il sistema infatti quando esegue un programma lo fa sempre con i permessi dellutente che
lo ha lanciato, il che significa, per riprendere quanto illustrato in sez. 1.4.1, che gli identificativi
real ed effective di utente e gruppo del nuovo processo coincidono con quelli del processo che lo
ha creato. Per consentire ad un processo lanciato da un utente normale di eseguire degli accessi
che i permessi normalmente gli impedirebbero, `e possibile, impostando rispettivamente il suid
bit o lo sgid bit su un programma, far s` che questultimo venga eseguito rispettivamente con i
privilegi dellutente e del gruppo a cui appartiene.102
Tutto questo viene realizzato dal kernel che quando trova questi permessi attivi per un
programma lo pone in esecuzione impostando per il corrispondente processo leffective user-ID
(se suid ) o leffective group-ID (se sgid ) rispettivamente a quello corrispondente allutente o al
gruppo proprietario del file. Dato che gli identificativi del gruppo effective sono quelli usati nel
controllo degli accessi, tutto ci`
o fa s` che il programma risulti avere i privilegi di tale utente
o gruppo. Gli identificativi del gruppo real per`o resteranno gli stessi, e cio`e quelli dellutente
che ha eseguito il programma che sar`a cos` in grado di accorgersi di essere stato lanciato da un
utente normale.
99

i dettagli di SSL vanno al di l`


a di quanto sia possibile affrontare qui, per una trattazione dellargomento si
veda il cap. 2 di [SGL].
100
con leccezione del cosiddetto mandatory locking, una estensione ripresa da SysV su cui potete trovare maggiori
dettagli in sez. 11.4.5 di [GaPiL], che viene attivato impostando lo sgid bit su un file non eseguibile.
101
nel caso si cerchi di attivarli per uno script (vedi sez. 2.1.5) essi vengono comunque, come misura di sicurezza,
ignorati.
102
il che `e ovviamente pericoloso, dato che questi possono essere maggiori di quelli di un utente normale, `e
pertanto assolutamente inopportuno impostare questi permessi su un programma senza sapere esattamente cosa
si sta facendo.

42

CAPITOLO 1. LARCHITETTURA DI UN SISTEMA GNU/LINUX

Con luso di questi permessi si pu`


o far eseguire anche ad un utente normale delle operazioni
che nel caso generico sarebbero riservate al solo amministratore. Questo ad esempio `e il modo in
cui funziona il comando passwd, che ha il bit suid bit impostato ed appartiene allamministratore.
Se usato direttamente da questi il programma (che verifica quale sia lutente che lha posto in
esecuzione controllando il real user-ID) non pone restrizioni e permette di cambiare la password
a qualunque utente. Se invece viene usato da un utente normale il programma consente ancora di
modificare la password, ma solo la propria e fornendo prima quella corrente. Per poter eseguire
la modifica della password passwd necessita dellaccesso in scrittura al file dove questa viene
memorizzata (che, vedi sez. 4.3.2, `e di propriet`a dellamministratore) e questo viene garantito
appunto grazie alluso del suid bit.
Per i file lo sticky bit al giorno doggi `e sostanzialmente inutilizzato e su Linux viene ignorato.
Veniva usato nelle prime versioni di Unix, quando memoria e disco erano risorse molto scarse e gli
algoritmi per la memoria virtuale poco raffinati, per dare ad programma un accesso privilegiato
alluso della swap.103 Per i programmi con questo permesso attivo (era usato per quelli di uso
pi`
u frequente) il codice veniva mantenuto in permanenza nella swap,104 per diminuire il tempo
di caricamento. Oggi tutto ci`
o non `e pi`
u necessario, per cui detto permesso non ha pi`
u alcun
uso; ha assunto per`
o, come vedremo a breve, un significato speciale per le directory.
Al contrario di quanto avviene con i permessi normali, i permessi speciali non hanno a
disposizione una propria posizione nelloutput di ls, ma quando attivati cambiano il valore della
lettera associata al permesso di esecuzione. In particolare se il suid bit o lo sgid bit sono attivi
verr`a rispettivamente mostrata una s105 nella posizione del permesso di esecuzione per utente
e gruppo. Lo sticky bit invece modifica la lettera che indica il permesso di esecuzione per tutti
in una t.106 Nel caso di passwd avremo allora:
piccardi@anarres:~$ ls -l /usr/bin/passwd
-rwsr-xr-x 1 root root 29036 2007-10-30 19:32 /usr/bin/passwd

Abbiamo visto come i permessi speciali consentano di modificare il comportamento del kernel
nellesecuzione dei programmi, essi per`
o non hanno nessun effetto su file di dispositivo, fifo o
socket, per i quali vengono ignorati. Per le directory invece il discorso `e diverso, il suid bit viene
sempre ignorato, ma lo sgid bit e lo sticky bit vengono utilizzati, ed assumono un significato
particolare.
Lo sgid bit viene utilizzato per modificare il comportamento ordinario del kernel nella creazione di nuovi file. Il sistema infatti prevede che quando un processo crea un nuovo file107 a
questo vengano assegnati come proprietario e gruppo proprietario rispettivamente user ID ed
group ID del processo stesso. Se per`
o si `e attivato lo sgid bit nella directory in cui si va a creare
il file a questi sar`
a assegnato come gruppo proprietario quello della directory stessa e non quello
del processo. In questo modo si pu`
o far s` che il gruppo proprietario di una directory si propaghi
automaticamente a tutti i file che vengono creati al suo interno.
Anche lo sticky bit assume un significato particolare per le directory: se esso `e presente allora
un file potr`a essere cancellato solo dallutente a cui appartiene o dal proprietario della directory
stessa, anche quando si abbia su di essa il permesso di scrittura. Questa ad esempio `e la modalit`a
in cui viene protetta la directory /tmp, i cui permessi sono i seguenti:
piccardi@anarres:~$ ls -ld /tmp
drwxrwxrwt 18 root root 155648 2008-01-08 18:38 /tmp

si noti come questi permessi consentono a chiunque scrivere sulla directory /tmp per crearvi i
propri file, come `e dovuto, essendo questa la directory messa a disposizione degli utenti per la
103

per la trattazione di questo argomento si veda sez. 5.1.7.


da questo deriva il nome sticky.
105
o una S qualora il corrispondente permesso di esecuzione non sia attivo.
106
che come per i precedenti diventa una T qualora il corrispondente permesso di esecuzione non sia attivo.
107
o directory, file di dispositivo, ecc.
104

1.4. IL CONTROLLO DEGLI ACCESSI

43

creazione di file temporanei (vedi sez. 1.2.3). Il permesso di scrittura consentirebbe anche la
cancellazione arbitraria degli stessi file, ma la presenza contemporanea dello sticky bit fa s` che
un utente sia in grado di cancellare solo i file che ha creato lui senza poter interferire con quelli
creati dagli altri utenti.108

1.4.3

La gestione dei permessi dei file

Come accennato in precedenza ciascun permesso corrisponde ad uno specifico bit di una variabile
che viene mantenuta nellinode del file insieme a tutte le altre propriet`a dello stesso. Assegnare un
permesso significa attivare il bit ad esso associato in questa variabile. La disposizione completa
dei bit dei permessi, compresi quelli relativi ai permessi speciali, `e riportata in fig. 1.5.

Figura 1.5: Schema dei bit dei permessi mantenuti nellinode.

Sfruttando questa disposizione `e possibile utilizzare una notazione compatta che esprima lo
stato dei permessi usando il valore di questa variabile. Dato che i permessi sono raggruppati a
blocchi di tre bit, risulta naturale esprimere questo valore in notazione ottale,109 in modo che
ciascuna cifra corrisponda ad un gruppo di permessi. Se si fa riferimento allo schema di fig. 1.5,
in questo modo si avr`
a che, partendo dalla meno significativa, la prima cifra esprime il valore dei
permessi per gli altri, la seconda quello dei permessi per il gruppo, e la terza quello dei permessi
per il proprietario. Con questa notazione allora i permessi presenti nel caso illustrato in fig. 1.5
si possono indicare con la cifra 750.
Qualora serva specificare anche uno dei permessi speciali, occorrer`a usare anche la quarta
cifra, se di nuovo si fa riferimento allo specchietto di fig. 1.5, e lo si confronta con i permessi
del comando passwd che si sono visti in precedenza, considerato che questo ha attivo il bit suid,
si otterr`a che questi si possono esprimere con il valore 4755. Per la sua compattezza questa
notazione, nonostante costringa lutente a fare un po di conti in binario ed ottale, `e molto
utilizzata, ed una volta che ci si `e abituati, finisce in genere anche col risultare pi`
u immediata di
quella ordinaria, che vedremo pi`
u avanti, basata sulluso delle lettere che indicano livello e tipo
riportate allinizio di sez. 1.4.2.
Prima di illustrare il funzionamento dei comandi che consentono la manipolazione dei permessi dei file conviene esaminare meglio le modalit`a con cui questi vengono assegnati ai nuovi
file e directory che vengono creati. Abbiamo visto in sez. 1.4.2 come vengono assegnati di default
lutente ed il gruppo proprietario, ci resta da vedere come vengono assegnati i permessi. Questi
dipendono in maniera diretta dalle modalit`a con cui i programmi creano i file, e da quali funzioni
di sistema essi utilizzano.110
108

questa `e una misura necessaria, perche si deve sempre ricordare che, a parte questa eccezione, qualunque siano
i permessi dati ad un file sar`
a sempre possibile cancellarlo se si ha il permesso di scrittura sulla directory che lo
contiene.
109
vale a dire con numeri in base 8, con le cifre che vanno da 0 a 7.
110
per i dettagli si pu`
o consultare sez. 5.3.3 di [GaPiL].

44

CAPITOLO 1. LARCHITETTURA DI UN SISTEMA GNU/LINUX

Il kernel prevede comunque una modalit`a per controllare i permessi assegnati di default. Il
sistema prevede che si parta da uno stato in cui alla creazione di un nuovo file i permessi di
lettura e scrittura sono attivati per tutti (dove con tutti qui si vuole intendere sia il proprietario,
che il gruppo, che tutti gli altri); si parte cio`e da dei permessi espressi in forma numerica dal
valore ottale di 666. Per la creazione di una nuova directory invece lo stato di partenza prevede
anche lassegnazione del permesso di esecuzione, con un valore corrispondente a 777.
Ovviamente lasciare aperti a chiunque i permessi di scrittura non `e cosa molto saggia dal
punto di vista della sicurezza. Per questo motivo il kernel mantiene per ogni processo una
propriet`a, chiamata umask, che viene ereditata nella creazione di un processo figlio. La umask
specifica una maschera di bit che serve ad indicare quali permessi devono essere rimossi alla
creazione di un nuovo file o directory. Il formato in cui si specifica la maschera `e lo stesso
utilizzato per i bit dei permessi ed illustrato in fig. 1.5, solo che in questo caso il valore indicher`a
quali sono i bit da togliere.
In genere la umask viene impostata negli script eseguiti al login grazie al comando umask.
Dato che il valore viene ereditato nella creazione dei processi figli `e sufficiente farlo allavvio
perche quanto scelto sia mantenuto anche in seguito. Un utente pu`o comunque modificare
il valore di questo parametro invocando direttamente il comando umask111 per impostare un
nuovo valore, da passare come argomento.
Il valore dellargomento di umask pu`
o essere specificato sia in forma numerica (con un valore
ottale) che in forma simbolica,112 in questo secondo caso per`o si dovranno indicare quali sono i
permessi da conservare.113 Se invocato senza argomenti il comando permette di visualizzare il
valore corrente della umask, e con lopzione -S ne stampa il valore in forma simbolica anziche
numerica. Di norma un utente personalizza questo valore negli script di avvio della shell (vedi
sez. 2.1.5).
Il valore di default per la umask usato dalla gran parte delle distribuzioni `e di 022; questo significa che i permessi di scrittura relativi al gruppo e a tutti gli altri sono cancellati alla creazione
di un nuovo file o directory: i nuovi file saranno creati cio`e con permessi 644 (lettura e scrittura
per il proprietario e sola lettura per il gruppo e gli altri), mentre le nuove directory saranno
create con permessi 755 (tutti i permessi per il proprietario ma solo lettura e attraversamento
per il gruppo e gli altri). Se ad esempio si fossero voluti cancellare completamente i permessi
per tutti gli altri, si sarebbe dovuta usare una umask di 027.
Il comando che permette di modificare direttamente i permessi di file e directory `e chmod.
Nella sua forma pi`
u elementare esso prende come argomenti il valore numerico dei permessi
(espresso in forma ottale) seguito dal nome o dalla lista dei nomi di file e directory cui applicarli.
Come accennato per`
o le operazioni di modifica dei permessi possono essere espresse anche in
forma simbolica, utilizzando un formato comune che viene usato da tutti i comandi che operano
sui permessi. Questo formato prevede che una operazione (o un valore di un permesso) possano
essere specificati tramite una opportuna stringa di caratteri divisa in tre parti, nella forma:
[set][operation][permission]
La prima parte della stringa, set, specifica a quale gruppo di permessi si fa riferimento. Si pu`o
usare il carattere u (user ) per indicare quelli relativi al proprietario, il carattere g (group) per
indicare quelli relativi al gruppo ed il carattere o (others) per indicare tutti gli altri. Inoltre
con il carattere a (all ) si possono indicare in un colpo solo proprietario, gruppo e tutti gli altri,
111

si tenga presente che questo `e un comando interno della shell (vedremo il significato di ci`
o in sez. 2.1.3), dato
che linvocazione di un altro programma non servirebbe a nulla, in quanto la system call che esegue loperazione
opera solo sul processo corrente.
112
la notazione simbolica `e identica a quella di chmod, che tratteremo a breve.
113
se si usa un valore numerico questo viene impostato direttamente come umask del processo, per cui vi si
indicano i permessi da togliere, il valore simbolico invece viene usato per indicare quali permessi devono restare.

1.4. IL CONTROLLO DEGLI ACCESSI

45

si ha comunque lo stesso effetto non indicando nulla in questa parte.114 La notazione prevede
anche che si possano usare pi`
u caratteri per specificare pi`
u insiemi a cui assegnare gli stessi
permessi: ad esempio con ug si indicher`a di operare sui permessi del proprietario e del gruppo
proprietario.
La seconda parte della stringa, operator, indica il tipo di modifica che si vuole effettuare,
questa prevede luso di un singolo carattere che serve appunto da operatore. I caratteri consentiti
in questa parte sono tre: con +, si richiede laggiunta di un permesso a quelli gi`a presenti,
con -, si richiede la rimozione di un permesso da quelli presenti, mentre con = si indicano
esattamente quali sono i permessi da assegnare.115
Lultima parte, permission, serve ad indicare quali permessi devono essere applicati (aggiunti,
rimossi o impostati). Per i permessi ordinari si possono usare i caratteri w per il permesso
di scrittura, r per il permesso di lettura e x per il permesso di esecuzione. Quando si
opera sugli insiemi di proprietario e gruppo proprietario il carattere s permette di impostare
i corrispondenti bit suid e sgid, infine con il carattere t si pu`o impostare lo sticky bit.
Cos` ad esempio a+x aggiunge il permesso di esecuzione per tutti, o-r toglie il permesso di
lettura per gli altri, g+w aggiunge il permesso di scrittura al gruppo proprietario, u=rw imposta i
permessi di lettura e scrittura per il proprietario (eliminando un eventuale permesso di esecuzione) e u+s attiva il suid bit. Infine si tenga presente che si possono anche combinare insieme pi`
u
espressioni come le precedenti, scrivendole in una sequenza separata da virgole: cos` ad esempio
con g+w,o-r si abilita la scrittura per il gruppo proprietario e si disabilita la lettura per tutti
gli altri.
Si ricordi che un utente pu`
o cambiare i permessi solo dei file che gli appartengono e che il
permesso di scrittura in questo caso non significa nulla in quanto si applica solo al contenuto
del file e non alle sue propriet`
a. Inoltre se si usa chmod su un link simbolico loperazione verr`
a
116
117
eseguita sul file referenziato dal link,
e valgono quindi le credenziali di questultimo.
Il
comando supporta luso dellopzione -R che, quando lo si applica ad una directory, esegue la
modifica dei permessi ricorsivamente per tutto il tratto di albero contenuto nella stessa.118 La
versione GNU/Linux del comando supporta anche lopzione --reference=FILE che permette di
fare riferimento ai permessi di un altro file. Per la descrizione completa del comando e di tutte
le opzioni al solito si faccia riferimento alla pagina di manuale, accessibile con man chmod.
Oltre ai permessi pu`
o essere necessario anche cambiare proprietario e gruppo di un file (o di
una directory). Per il cambiamento del proprietario il comando da utilizzare `e chown; il comando
prende come primo argomento il nome utente (o il valore numerico delluser ID) a cui assegnare
la propriet`
a del file e come argomenti successivi la lista dei file su cui operare. Il comando `e
comunque in grado di cambiare in contemporanea anche il gruppo proprietario specificando il
primo argomento nella forma utente:gruppo.119
Se invece si vuole cambiare solo il gruppo proprietario il comando da usare `e chgrp, che
prende di nuovo come primo argomento il nome del gruppo (o il valore numerico del group ID)
seguito dalla lista dei file a cui applicare il cambiamento. I comandi chown e chgrp sono simili
e prevedono opzioni analoghe: in particolare con -R si eseguono i cambiamenti ricorsivamente
su tutto il contenuto di una directory e con --reference si pu`o fare riferimento alle credenziale
prese da un altro file. Inoltre entrambi i programmi, quando usati su un link simbolico, operano
114

nel qual caso per`


o i permessi non consentiti dalla umask non verranno impostati.
vale a dire che saranno assegnati esattamente quelli indicati, mentre quelli non indicati saranno rimossi.
116
si ricordi infatti che i permessi di un link simbolico non hanno alcun significato e pertanto non avrebbe senso
cambiarli.
117
questo significa che anche se il link vi appartiene non potete cambiare i permessi del file a cui esso fa riferimento
fintanto che anche questo non vi appartiene.
118
in questo caso per`
o se nella sezione di albero ci sono link simbolici, questi vengono ignorati ed i file a cui fanno
riferimento restano immutati.
119
viene supportata per compatibilit`
a anche la forma obsoleta utente.gruppo.
115

46

CAPITOLO 1. LARCHITETTURA DI UN SISTEMA GNU/LINUX

sul file a cui questo fa riferimento, a meno che non si usi lopzione -h, nel qual caso si operer`a
direttamente sul link.120
Infine si tenga conto che modificare il proprietario di file `e una operazione privilegiata, che
su Linux pu`o essere eseguita solo dallamministratore,121 un utente normale infatti non pu`o
assegnare ad un altro utente i suoi file, e pu`o soltanto cambiare il gruppo proprietario dei
file che gli appartengono, ed assegnare questi ultimi soltanto ad altri gruppi a cui egli stesso
appartiene. Solo lamministratore ha la capacit`a piena di cambiare proprietario e gruppo di un
file qualunque.

1.4.4

Altre operazioni privilegiate

Oltre al rispetto delle restrizioni imposte dai permessi dei file, il sistema sottopone gli utenti a
controllo di accesso per una lunga serie di altre operazioni. Alcune le abbiamo gi`a incontrate,
come il cambiamento di proprietario o gruppo proprietario, secondo quanto appena visto in
sez. 1.4.3, o la possibilit`
a di inviare segnali ad un processo, che come accennato in sez. 1.3.3 per un
utente normale `e ristretta ai soli processi lanciati da lui, o la possibilit`a di aumentare la priorit`a
di esecuzione di un processo che come visto in sez. 1.3.4 `e possibile solo allamministratore.
Oltre a queste ci sono una lunga serie di altre operazioni privilegiate che riguardano la rete
(che vedremo meglio a partire da cap. 7), per cui solo lamministratore pu`o attivare e disattivare
interfacce, modificare la tabella di instradamento dei pacchetti, applicare o rimuovere regole al
sistema di firewall. Allamministratore inoltre `e riservata lallocazione delle prime 1024 porte
usate dai protocolli UDP e TCP, per cui di norma soltanto lui `e in grado di lanciare demoni che
usano una di queste porte (dette per questo riservate) come un server web, di posta o un DNS.
Una serie di altre operazioni riservate allamministratore sono: la possibilit`a di modificare
il tempo sullorologio di sistema (vedi sez. 2.4.3), la possibilit`a di usare il comando chroot per
eseguire processi con una radice diversa (vedi sez. 1.3.2), la possibilit`a di riavviare o fermare il
sistema (vedi sez. 5.3.5), la possibilit`
a di caricare moduli del kernel (vedi sez. 5.2.5) e la possibilit`a
di montare i filesystem; questultima operazione, anche se in parte pu`o essere delegata agli utenti
(come illustrato in sez. 5.1.3) resta comunque privilegiata in quanto lesecuzione generica del
comando mount con parametri qualunque pu`o essere effettuata soltanto dallamministratore.
Infine soltanto lamministratore `e in grado di creare i file speciali relativi ai dispositivi, cio`e
solo lui pu`o usare il comando mknod per creare un file di dispositivo. Questo comando prende
come argomenti il nome del file da creare seguito da una lettera, che indica il tipo di file speciale;
questa pu`o essere p per indicare una fifo, b per indicare un dispositivo a blocchi e c per
indicare un dispositivo a caratteri. Qualora si crei un file di dispositivo (che sia a blocchi o a
caratteri `e lo stesso) devono poi essere specificati di seguito come ulteriori argomenti il major
number ed il minor number 122 che lo identificano univocamente.123
Si noti che creare un file di dispositivo `e una azione diversa dallaccedere al dispositivo
sottostante, cosa che invece `e regolata dai permessi di questultimo come file. Pertanto se si `e
stati poco accorti e si `e permesso agli utenti laccesso in scrittura a /dev/hda, anche se questi
non possono creare un file di dispositivo, potranno comunque scrivere nel suddetto disco e ad
esempio saranno tranquillamente in grado di ripartizionarlo.
120

questa operazione in realt`


a assume un significato soltanto se il link `e una directory con lo sticky bit attivo,
dove cambiare proprietario del link simbolico significa modificare lidentit`
a dellutente che pu`
o cancellarlo.
121
questa `e una caratteristica di sicurezza mutuata da BSD che consente di evitare aggiramenti delle quote disco
(vedi sez. 6.4); non `e detto che sia presente su altri sistemi unix-like.
122
questi due numeri sono il meccanismo con cui storicamente vengono identificati i dispositivi allinterno del
kernel (cos` come gli inode identificano un file); il nome sotto /dev `e solo una etichetta, potrebbe essere qualunque
(anche se poi molti script non funzionerebbero), quello che indica al kernel quale dispositivo usare quando si
accede a quel file sono questi due numeri.
123
per una lista completa delle corrispondenze di questi numeri con i vari dispositivi si pu`
o fare riferimento al
file devices.txt distribuito con i sorgenti del kernel nella directory Documentation.

1.4. IL CONTROLLO DEGLI ACCESSI

47

Si tenga presente per`


o che per un utente `e sempre possibile creare una fifo usando il comando
dedicato mkfifo; questo prende come argomento il nome della fifo e crea la relativa voce nel
filesystem. Il comando supporta anche lopzione -m che permette di specificare la maschera dei
permessi (con la stessa sintassi di chmod) da applicare alla stessa. Non esiste invece un comando
specifico per creare un socket, i programmi che li usano li creano chiamando direttamente le
system call necessarie.
Infine alcuni filesystem supportano delle ulteriori operazioni speciali sui file, la cui gestione
non rientra nella normale politica dei controlli di accesso di sez. 1.4.2, ma viene effettuata attraverso quelli che vengono chiamati gli attributi speciali. Queste operazioni attengono ad una
serie di capacit`
a aggiuntive, fornite dai filesystem che le supportano, che possono essere attivate
o meno per ciascun file.124 Alcuni di questi attributi (in particolare quelli che permettono di imporre delle speciali restrizioni allaccesso) possono essere impostati soltanto dallamministratore,
questo `e il motivo per cui si `e scelto di trattare questo argomento in questa sezione.
Facendo riferimento a delle estensioni che non `e detto siano presenti su un qualunque tipo
di filesystem125 gli attributi speciali dei file non possono essere visualizzati con il comando ls;
per visualizzarli `e stato creato un apposito comando, lsattr.
Il comando `e analogo a ls sia per luso degli argomenti, che per luso delle opzioni -R, -a e
-d che hanno lo stesso significato visto in tab. 1.3. Il comando stampa a video lelenco dei file,
preceduto dal relativo valore degli attributi speciali, pertanto se lo eseguiamo sui file di queste
dispense otterremo qualcosa del tipo:
[piccardi@gont corso]$ lsattr *.tex
----------------- advadmin.tex
----------------- appendici.tex
----------------- config.tex
----------------- corsoFSE.tex
----------------- corso.tex
----------------- netadmin.tex
----------------- netbase.tex
----------------- netdns.tex
----------------- netinter.tex
----------------- netlpi.tex
----------------- ordadmin.tex
----------------- ringraziamenti.tex
----------------- shell.tex
----------------- stradmin.tex
----------------- struttura.tex

che ci mostra come nessun attributo speciale sia stato impostato.126 Quando uno di essi `e attivo
questo viene indicato nellelenco dalla presenza della lettera che lo identifica (vedi tab. 1.14) al
posto del carattere -.
Il comando che permette di impostare gli attributi speciali `e chattr, questo prende come primo argomento una stringa che identifica quali attributi attivare o disattivare, e come argomenti
successivi una lista di file. Il comando supporta anche lopzione -R per eseguire ricorsivamente le
operazioni quando nella lista dei file si `e inclusa una directory, mentre se invocato con lopzione
-V diventa prolisso e descrive le operazioni effettuate.
La stringa che permette di specificare quali attributi attivare o disattivare `e analoga a quella
usata con chmod per i permessi, ciascun attributo `e identificato da una lettera, riportata in
124

come per tutte le altre propriet`


a di un file, anche la lista degli attributi speciali attivi viene mantenuta
allinterno dellinode.
125
queste estensioni sono state introdotte con ext2, ma sono supportate anche dagli altri filesystem pi`
u comuni
usati con Linux, come ext3 e reiserfs.
126
questo `e il caso normale, gli attributi speciali infatti vanno impostati esplicitamente, i file vengono sempre
creati senza che nessuno di essi sia presente.

48

CAPITOLO 1. LARCHITETTURA DI UN SISTEMA GNU/LINUX

tab. 1.14;127 per attivare un attributo occorrer`a farla precedere dal carattere +, mentre se si
vuole cancellare un attributo gi`
a impostato si dovr`a usare il carattere -; come per chmod si
possono specificare insieme anche pi`
u attributi, ed usare il carattere = per impostare la lista
esatta di quelli che si vogliono impostare.
Come accennato alcuni attributi, che solo lamministratore pu`o impostare, permettono di
utilizzare delle speciali restrizioni di accesso, ad esempio con a si attiva lappend flag che
consente soltanto di aggiungere dati ad un file mentre il contenuto corrente non pu`o essere
modificato; questo pu`
o essere utilizzato per salvaguardare i file di log (vedi sez. 3.2.3) da eventuali
modifiche, accidentali o meno.128
Attributo
A
a

c
D
d
E
I

S
u
X
Z

Significato
blocca laggiornamento del tempo di ultimo accesso.
attiva il cosiddetto append flag,129 che consente la scrittura solo in
coda al file; il contenuto corrente non pu`
o essere modificato e solo
lamministratore pu`
o attivare o disattivare questo attributo.
attiva la compressione trasparente del contenuto del file.
richiede che il contenuto della directory sia salvato su disco in maniera
sincrona.
esclude il file dalla registrazione dei dati necessari ad eseguire il backup
con dump (vedi sez. 4.1.3).
segnala un errore nella compressione quando questa `e stata attivata;
lattributo pu`
o solo essere letto da lsattr.
segnala che una directory viene indicizzata con gli hash tree (una funzionalit`
a avanzata trattata in sez. 5.1.4); lattributo pu`
o solo essere letto
da lsattr.
attiva il cosiddetto immutable flag, il file non pu`
o essere cancellato o
rinominato, non si possono creare hard link, ne modificarne il contenuto;
solo lamministratore pu`
o attivare o disattivare questo attributo.130
richiede che tutti i contenuti del file siano prima scritti sul giornale (tratteremo il journalling dei filesystem in sez. 5.1.4); solo lamministratore
pu`
o attivare o disattivare questo attributo.
richiede che quando un file viene cancellato tutti i blocchi che
contenevano i suoi dati siano riscritti su disco azzerandone il
contenuto.131
richiede che il contenuto del file sia salvato su disco in maniera sincrona.
richiede che alla cancellazione il contenuto del file sia salvato in modo
da poterne consentire il recupero.
permette di accedere direttamente al contenuto di un file compresso
disabilitando la decompressione trasparente.
indica che un file compresso `e in uno stato inconsistente (dirty);
lattributo pu`
o solo essere letto da lsattr.
Tabella 1.14: Gli attributi speciali dei file.

127
non si sono menzionati nella tabella alcuni attributi sperimentali, per i quali si rimanda alla lettura della
pagina di manuale di chattr.
128
in genere i file di log sono la prima cosa che un intruso cerca di modificare, con la presenza di questo attributo
questo gli viene impedito fintanto che lattributo non viene rimosso; benche nelle operazioni ordinarie questo sia
sempre possibile se si hanno i privilegi di amministratore, esistono delle modalit`
a operative (dette capabilities)
in cui `e possibile cedere definitivamente questa capacit`
a e rendere pertanto impossibile una successiva rimozione
dellattributo.
129
`e cio`e possibile aprire un file in scrittura soltanto se lo si fa nel cosiddetto append mode; per una trattazione
di questo argomento si pu`
o consultare il cap. 6 di [GaPiL].
130
in sostanza, oltre ad impedirne la rimozione dalla directory in cui si trova `e impossibile modificare sia il
contenuto del file che dellinode, pertanto anche tutte le altre caratteristiche del file (permessi, proprietario, ecc.)
non possono essere modificate.
131
di default infatti il kernel si limita a marcare i blocchi come liberi, ma non cancella il precedente contenuto,
che potrebbe pertanto essere riletto, luso di questo attributo `e una forma meno sicura, ma automatica, del tipo
di cancellazione effettuato con shred (per i dettagli si veda la pagina di manuale di shred).

1.4. IL CONTROLLO DEGLI ACCESSI

49

Un altro attributo che permette di attivare una protezione speciale `e iche abilita limmutable
flag, che finche attivo impedisce qualunque tipo di modifica al file. Si noti sia questo che lappend
flag impongono le loro restrizioni anche alle operazioni richieste dallamministratore stesso: questo significa ad esempio che un file immutabile potr`a essere cancellato o modificato (anche dallamministratore) soltanto se prima questi ne ha rimosso il relativo attributo. Di nuovo questa
funzionalit`
a permette di proteggere file essenziali in modo da impedirne ogni forma di modifica.
Potremo allora attivare alcuni di questi attributi (ad esempio lappend flag per un file di log,
o limmutable flag per /etc/fstab), in questo caso baster`a eseguire i comandi:
chattr +a /var/log/auth.log
chattr +i /etc/fstab
e potremo controllare lo stato degli attributi ottenendo che:
[root@gont corso]# lsattr /var/log/auth.log /etc/fstab
-----a----------- /var/log/auth.log
----i------------ /etc/fstab

a questo punto si potr`


a anche verificare che non `e pi`
u possibile modificare /etc/fstab:
[root@gont corso]# touch /etc/fstab
touch: cannot touch /etc/fstab: Permission denied

nonostante il comando sia stato eseguito con privilegi di amministratore.

50

CAPITOLO 1. LARCHITETTURA DI UN SISTEMA GNU/LINUX

Capitolo 2

La shell e i comandi
2.1

Linterfaccia a linea di comando.

I sistemi Unix nascono negli anni 70, ben prima della nascita delle interfacce grafiche, quando
lunico modo di interagire con il computer era attraverso dei terminali, se non addirittura delle
semplici telescriventi. Per cui, anche se oggi sono disponibili delle interfacce grafiche del tutto
analoghe a quelle presenti in altri sistemi operativi nati in tempi pi`
u recenti, linterfaccia a riga di
comando resta di fondamentale importanza, dato che 30 anni di storia e migliaia di persone che
ci hanno lavorato sopra per migliorarla, la hanno resa linterfaccia utente pi`
u potente e flessibile
che ci sia.

2.1.1

La filosofia progettuale

Come per il sistema, anche le caratteristiche dellinterfaccia a riga di comando derivano da


alcune scelte progettuali precise. Arnold Robbins spiega molto chiaramente questa filosofia in
un articolo riportato anche nella pagina info (vedi sez. 2.4.2) del pacchetto dei coreutils GNU.
In sostanza la filosofia progettuale della shell e dei comandi a riga di comando si pu`o capire
facendo ricorso ad una analogia, che riprenderemo da quellarticolo.
Molte persone utilizzano un coltellino svizzero, dato che questo permette di avere in solo
oggetto un discreto insieme di attrezzi diversi: coltello, forbici, cacciavite, seghetto, cavatappi.
Per`o `e molto difficile vedere un professionista usare il coltellino svizzero per fare il suo lavoro.
Un professionista ha bisogno di attrezzi professionali, e un carpentiere non costruisce una casa
con un coltellino svizzero, ma con tanti attrezzi, ciascuno dei quali `e specializzato nello svolgere
un compito specifico.
Le persone che hanno progettato linterfaccia a riga di comando erano appunto dei professionisti, che sapevano bene che anche se fare un programma unico per tutti i compiti poteva
essere attraente per lutente finale, che deve conoscere solo quello, in pratica questo sarebbe stato
difficile da scrivere, mantenere e soprattutto estendere. Per cui da professionisti pensarono ai
programmi come a degli attrezzi, e piuttosto che il coltellino svizzero realizzarono lequivalente
della cassetta degli attrezzi (quella che in gergo viene chiamata Unix toolbox ), con in testa un
criterio fondamentale: che ciascun programma facesse una sola cosa, nel miglior modo possibile.
Questa `e la caratteristica fondamentale dei programmi base di un sistema unix-like come
GNU/Linux. Ogni comando1 `e progettato per eseguire un compito preciso: ls mostra la lista
dei file, ps la lista dei processi, cp copia un file, chmod cambia i permessi, man mostra le pagine di
manuale, ecc. I comandi hanno uno scopo preciso e precise funzionalit`a; le opzioni sono limitate
1

ne abbiamo incontrati gi`


a diversi nel corso della trattazione delle caratteristiche del sistema in cap. 1, ne
faremo una trattazione sistematica fra breve.

51

52

CAPITOLO 2. LA SHELL E I COMANDI

e comunque specifiche allo scopo del comando, e sono descritte dettagliatamente nella relativa
pagina di manuale.
Il passo successivo fu quello di costruire anche un meccanismo che permettesse di combinare
insieme i vari programmi, cosicche divenisse possibile eseguire, con una opportuna combinazione,
anche dei compiti che nessuno di essi era in grado di fare da solo. Questo aveva il grande
vantaggio, rispetto allapproccio del programma universale, di non dover attendere che lautore
dello stesso si decidesse a programmare la funzione in pi`
u che serviva e che non era stata prevista
allinizio.
Questo `e il ruolo della shell, cio`e del programma che implementa linterfaccia a riga di
comando; `e attraverso di essa che, concatenando vari comandi, si pu`o costruire lequivalente di
una catena di montaggio, in cui il risultato di un comando viene inviato al successivo, riuscendo
cos` a realizzare compiti complessi con grande velocit`a e flessibilit`a, e spesso a fare anche cose
che gli autori dei singoli programmi non si sarebbero neanche immaginati.
La modalit`a tradizionale con cui si utilizza linterfaccia a riga di comando `e attraverso una
sessione di lavoro interattiva eseguita su un terminale. Un tempo questo accesso avveniva con
la classica procedura di collegamento al sistema sulla console (torneremo su questo in sez. 4.3.5)
dove un apposito programma, login, una volta autenticato lutente, mette in esecuzione la shell.
Oggi, con la presenza sempre pi`
u diffusa delle interfacce grafiche e la diffusione delle reti, si
hanno molte altre modalit`
a di accesso ad un terminale. Ad esempio si pu`o avere un opportuno
programma2 che opera allinterno dellinterfaccia grafica creando un terminale virtuale a cui
si accede allinterno di una finestra, oppure si pu`o accedere via rete attraverso un programma
di collegamento remoto.3 In tutti questi casi comunque, una volta predisposta lopportuna
interfaccia di accesso, viene sempre lanciata una shell.
Si ricordi comunque che per il kernel, secondo la filosofia fondamentale di Unix illustrata in
sez. 1.1.1, la shell resta un programma come tutti gli altri; essa ha per`o un compito fondamentale,
che `e quello di fornire linterfaccia che permette di lanciare altri programmi. Inoltre `e sempre la
shell che permette di usufruire di tutta una serie di ulteriori funzionalit`a messe a disposizione
dal kernel, come il controllo di sessione trattato in sez. 2.1.2.
Dato che la shell `e un programma come gli altri, essa pu`o essere realizzata in diversi modi,
ed in effetti nel tempo sono state realizzate diverse shell. Anche in questo caso ci sono stati due
filoni di sviluppo, il primo deriva dalla prima shell mai realizzata, la Bourne shell, chiamata cos`
dal nome del suo creatore. La Bourne shell `e la shell pi`
u antica e le sue funzionalit`a sono anche
state standardizzate nello standard POSIX.2. Il secondo filone nasce da unaltra shell, che usa
una sintassi leggermente diversa, con delle analogie con quella del linguaggio C, e che per questo
venne chiamata C shell.
Ciascuno di questi due filoni ha dato vita a successive versioni di shell con funzionalit`a pi`
uo
meno avanzate; un breve elenco di quelle pi`
u significative disponibili su GNU/Linux `e il seguente:
Bourne shell e derivate.
La Bourne shell. La prima shell di Unix, in genere utilizzata semplicemente con il
comando sh. Non viene praticamente pi`
u usata. In GNU/Linux `e sostituita da bash4
o da ash. Sugli altri sistemi che rispettano lo standard POSIX, `e di norma sostituita
da ksh.
La Bourne-Again SHell. La bash `e la shell di riferimento del progetto GNU. Il
suo nome `e un gioco di parole sul nome della Bourne shell, in sostanza una shell
2

quello che si chiama un emulatore di terminale, ne esistono molti, realizzati per i vari ambienti grafici
disponibili.
3
anche in questo caso esistono diversi programmi e diversi protocolli di collegamento, vedremo il principale in
sez. 8.3.
4
che quando viene invocata come sh fornisce esclusivamente le funzionalit`
a previste dallo standard POSIX.2,
disabilitando le varie estensioni di cui `e dotata.

2.1. LINTERFACCIA A LINEA DI COMANDO.

53

rinata. Viene utilizzata con il comando bash. Incorpora molte funzionalit`a avanzate, come la storia dei comandi (detta history), lauto-completamento dellinput sulla
linea di comando (per comandi, nomi di file e qualunque altra cosa, date le opportune estensioni), editing di linea, costrutti di programmazione complessi e molto altro
(praticamente di tutto, si vocifera sia anche in grado di fare il caff`e).
La Korn Shell La Korn shell (dal nome dellautore) `e stata la prima ad introdurre
la history (laccesso ai comandi precedenti) e lediting della linea di comando. Ha
il grosso difetto che gran parte delle funzionalit`a avanzate non vengono attivate di
default, per cui occorre un ulteriore lavoro di configurazione per utilizzarla al meglio.
Viene utilizzata con il comando ksh. Non viene usata su GNU/Linux dato che bash
ne ha tutte le caratteristiche; `e per`o utile conoscerne lesistenza dato che `e facile
trovarla su altri Unix.
La ash. Una shell minimale, realizzata in poche decine di kilobyte di codice sorgente.
Viene utilizzata con il comando ash. Ha molti comandi integrati, occupa poca RAM
e poco spazio disco, ed ha poche funzioni (ma `e conforme allo standard POSIX.2).
Viene usata spesso nei dischetti di installazione o recupero e nei sistemi embedded,
pu`
o essere utile per sistemi dove si fa un grosso uso di script semplici perche `e pi`
u
veloce di bash.
La Z shell. Unaltra shell avanzata. Viene utilizzata con il comando zsh. Offre
praticamente le stesse funzioni della Korn shell, ed altre funzionalit`a avanzate, come
il completamento di comandi, file e argomenti, che per`o trovate anche nella bash.
C shell e derivate.
La C shell. Utilizza una sintassi con analogie a quella del linguaggio C. Viene
utilizzata con il comando csh. In GNU/Linux non `e disponibile essendo sostituita da
tcsh.
` una evoluzione della C shell, alla quale aggiunge history e editing di linea
La tcsh. E
e varie funzionalit`
a avanzate. Viene utilizzata con il comando tcsh. Si trova su vari
Unix proprietari, ma `e poco diffusa su GNU/Linux, pur essendo disponibile.
Dato che `e il principale strumento di lavoro di un amministratore professionista, la scelta
della shell `e spesso una questione strettamente personale. Qui parleremo per`o solo di bash,
che `e la shell utilizzata in praticamente tutte le distribuzioni di GNU/Linux, e probabilmente `e
anche la pi`
u potente e flessibile fra quelle disponibili. Lunico motivo per volerne usare unaltra
infatti `e solo perche siete maggiormente pratici con quella, nel qual caso probabilmente non
avete bisogno di leggere questo capitolo.
Il riferimento pi`
u immediato per il funzionamento della bash `e la sua pagina di manuale,
accessibile al solito con man bash. Probabilmente questa `e una delle pi`
u lunghe fra tutte le
5
pagine di manuale. Per questo in seguito faremo riferimento, quando necessario, alle varie
sezioni in cui essa `e divisa. Per le funzionalit`a pi`
u avanzate esiste anche un ottimo manuale
libero [AdvBash], tradotto pure in italiano.

2.1.2

Sessioni di lavoro e job control

Come accennato in sez. 2.1.1, luso dellinterfaccia a riga di comando `e strettamente legato alluso
di un terminale sul quale opera una shell, il terminale di controllo, allinterno di quella che viene
solitamente chiamata una sessione di lavoro. Questo ci aveva gi`a portato in sez. 1.3.2 a tracciare
una distinzione fra i processi che avevamo classificato come interattivi (perche associati ad un
5

sul mio sistema conta la bellezza di 5266 righe, ed in effetti pi`


u che una pagina `e un manuale!

54

CAPITOLO 2. LA SHELL E I COMANDI

terminale di controllo, visibile nelloutput di ps alla colonna TTY), e quelli non interattivi (o
meglio quelli che non lo sono tramite linterfaccia a riga di comando) che non hanno nessun
terminale di controllo.
Ai tempi in cui si aveva a disposizione un solo terminale,6 se questo fosse stato utilizzabile
da un solo processo alla volta, non si sarebbero potute sfruttare le capacit`a di multitasking del
sistema. Per questo vennero introdotte delle funzionalit`a che permettessero di lanciare ed usare
contemporaneamente pi`
u programmi attraverso un solo terminale, cosa che viene realizzata
appunto attraverso il sistema del cosiddetto controllo di sessione. Oggi, con la possibilit`a di
avere pi`
u console virtuali, e con linterfaccia grafica che non fa riferimento ad un terminale,
questo problema non c`e pi`
u, ma linterfaccia `e rimasta e mantiene comunque una sua utilit`a,
ad esempio in presenza di una connessione diretta via modem in cui si ha a disposizione un solo
terminale, e si devono eseguire compiti diversi.
Per spiegare le modalit`
a in cui viene realizzata linterazione tramite il terminale, occorre
anticipare una caratteristica fondamentale dellinterfaccia a riga di comando. Tutte le volte che
si lancia un programma che deve interagire con la riga di comando, questo si aspetta di avere a
disposizione e gi`
a aperti tre file,7 che convenzionalmente sono chiamati standard input, standard
output e standard error. Dato che questi sono i primi tre file aperti e lo sono in questa sequenza,
ad essi vengono sempre assegnati rispettivamente i file descriptor 0, 1 e 2.8
Convenzionalmente9 un programma legge i suoi dati in ingresso dal primo file descriptor,
scrive i dati in uscita sul secondo, e gli eventuali errori sul terzo. Quando un processo `e interattivo
nel senso appena visto, tutti e tre questi file corrispondono al terminale di controllo, e linterfaccia
dei terminali (cio`e quella dei dispositivi di questo tipo) fa s` che in lettura il kernel faccia arrivare
sullo standard input quanto scritto sulla tastiera e che quanto scritto sullo standard output venga
stampato sullo schermo.10 Dato che, come accennato in sez. 1.3.1, i file aperti vengono ereditati
dai processi figli e mantenuti nellesecuzione di un nuovo programma,11 basta che questi file
siano aperti allinizio,12 e lo resteranno per tutti i processi lanciati in seguito.
Per capire meglio questa infrastruttura vediamo un esempio della sua applicazione. Come
accennato una delle modalit`
a per utilizzare linterfaccia a riga di comando `e quella di collegarsi
ad una console con la tradizionale procedura di login su terminale; nei risultati del comando ps
mostrati a pag. 25 si pu`
o notare come sia presente il processo getty associato ad alcuni terminali
virtuali (da tty1 a tty6).13 Questo `e il programma che normalmente cura la procedura di login
su una console, dando lavvio alla conseguente sessione di lavoro.
In questo caso `e getty che si cura dellapertura iniziale dei tre file di standard input, standard
output e standard error facendo riferimento al terminale che gli `e stato indicato,14 che diventer`a
il terminale di controllo di tutta la seguente sessione di lavoro. Poi il programma stampa un
6

si ricordi che Unix `e nato quando ancora i terminali erano delle telescriventi, ed anche in seguito venivano
utilizzati terminali seriali come i VT100.
7
torneremo su questo, e su come utilizzare queste funzionalit`
a, in sez. 2.1.4.
8
come accennato in sez. 1.2.2 il sistema mantiene anche una lista dei file aperti dai vari processi, ciascun
processo a sua volta ha una lista dei file che ha aperto, il cui indice `e appunto un numero chiamato file descriptor,
per maggiori dettagli riguardo a questa problematica si pu`
o consultare la sezione 6.1 di [GaPiL].
9
si tenga presente che `e solo una convenzione, anche se seguita in maniera universale; si pu`
o tranquillamente
scrivere un programma che si comporta in modo diverso, scrivendo e leggendo da un file descriptor qualunque,
ma ovviamente si avranno problemi di interazione con gli altri programmi.
10
o sulla finestra dentro linterfaccia grafica, qualora si usi un emulatore di terminale, o trasmesso via rete, se
si una un terminale associato ad una connessione remota.
11
largomento `e in realt`
a molto complesso e qui stiamo semplificando brutalmente, per una trattazione
dettagliata si consultino il cap. 3 ed il cap. 6 di [GaPiL].
12
vedremo subito con un esempio, cosa intendiamo per inizio.
13
quasi tutte le distribuzioni attivano nella procedura di avvio (tratteremo largomento in sez. 5.3.5) sei console
virtuali a cui si accede con la combinazione di tasti Alt-FN, dove N `e il numero della rispettiva console; questo
consente di avere diverse sessioni di lavoro usando un solo monitor ed una sola tastiera.
14
nel caso una delle console virtuali, corrispondenti ai terminali da /dev/tty1 a /dev/tty6.

2.1. LINTERFACCIA A LINEA DI COMANDO.

55

messaggio di benvenuto e la linea login: e si pone in attesa che un utente scriva sul terminale
il suo username.15 Una volta che questo sia stato scritto, getty esegue direttamente16 il
programma login che si cura di chiedere la password ed effettuare lautenticazione. Se questa
ha successo `e login che si incarica di impostare il valore del session ID per il processo in corso,
cambiare il proprietario dello stesso allutente che si `e collegato,17 ed infine lanciare una shell
di login.18 In tutta questa procedura i tre file di standard input, standard output e standard
error resteranno aperti ed associati al terminale di controllo da cui si `e partiti, che `e quello su
cui verr`a utilizzata la shell.
Una volta completata la procedura di collegamento avremo a disposizione una shell con un
certo valore del session ID, e dato che anche questa `e una propriet`a che viene conservata quando
si creano processi figli e si lanciano altri comandi, si avr`a come conseguenza che anche tutti i
processi lanciati da detta shell saranno identificati dallo stesso session ID. Tutto ci`o vale anche
per tutte le altre modalit`
a con cui si pu`o iniziare una sessione di lavoro su un terminale, che sia
attraverso un emulatore ad interfaccia grafica o un programma di connessione remota.
Come accennato in sez. 1.3.2 le informazioni relative alla sessione possono essere visualizzate
con lopzione -j di ps, ad esempio lanciando il comando dal terminale in cui si stavano scrivendo
queste dispense abbiamo ottenuto il seguente risultato:
piccardi@anarres:~$ ps -je
PID PGID
SID TTY
1
0
0 ?
...
4857 4527 4527 ?
4858 4527 4527 ?
4859 4859 4859 pts/1
...
5936 5936 5936 ?
8005 8005 8005 ?
8007 8005 8005 ?
8009 8009 8009 pts/2
8013 8013 8009 pts/2
8014 8013 8009 pts/2
8015 8013 8009 pts/2
8016 8013 8009 pts/2
8504 8013 8009 pts/2
8505 8013 8009 pts/2
8037 8037 8009 pts/2
8039 8037 8009 pts/2
8040 8037 8009 pts/2
8382 8382 8009 pts/2
8506 8506 8009 pts/2
...

f
STAT
S

TIME COMMAND
0:02 init [2]

S
S
S

0:00 gnome-terminal
0:00 \_ gnome-pty-helper
0:00 \_ bash

S
S
S
S
S
S
S
S
S
S
S
S
S
S
R

0:00 /usr/sbin/sshd
0:00 \_ sshd: piccardi [priv]
0:35
\_ sshd: piccardi@pts/2
0:00
\_ -bash
0:01
\_ xmms
0:00
|
\_ xmms
0:00
|
\_ xmms
0:00
|
\_ xmms
0:00
|
\_ xmms
0:00
|
\_ xmms
0:00
\_ /usr/bin/perl -w /usr/bin
0:03
|
\_ xdvi.bin -name xdvi s
0:02
|
\_ gs -sDEVICE=x11 1:07
\_ emacs struttura.tex
0:00
\_ ps -je f

In questo caso la shell non `e stata lanciata sulla console da getty ma allinterno una sessione
remota da sshd19 ed utilizza il terminale virtuale pts/2. Si noti inoltre come sia presente
unaltra sessione associata al terminale virtuale pts/1, creata da gnome-terminal che invece
lavora allinterno dellinterfaccia grafica. Tutti i programmi che si sono lanciati dalla nostra shell
15

lusername, detto anche nome utente o nome di login, `e il nome con cui un utente si identifica presso il sistema,
torneremo sullargomento in sez. 4.3.1.
16
in questo caso si tratta proprio dellinvocazione diretta del comando senza passare attraverso un nuovo
processo, questo significa che il PID del processo rester`
a lo stesso.
17
cio`e impostare i vari user ID e group ID visti in sez. 1.4.1 a quelli dellutente collegato.
18
il programma invocato `e sempre lo stesso, ma dato che una shell pu`
o essere utilizzata con modalit`
a diverse
(allinterno di uno script non interattivo, o come sub-shell allinterno di una sessione) esistono delle opportune
opzioni che consentono di indicare la modalit`
a di utilizzo: quella che indica una shell di login `e una di queste,
torneremo sullargomento in sez. 2.1.6).
19
tratteremo questo programma in sez 8.3.

56

CAPITOLO 2. LA SHELL E I COMANDI

(xmms, xdvi, emacs e lo stesso ps) hanno lo stesso valore nella colonna SID dato che appartengono
alla stessa sessione di lavoro. Il risultato di ps mostra anche una seconda caratteristica delle
sessioni di lavoro, associata a quello che viene chiamato job control, che `e che quando si lancia
una linea di comando tutti i processi avviati allinterno della stessa riga (nel caso le varie istanze
di xmms, o i vari programmi avviati nellesecuzione di xdvi) vengono assegnati allo stesso process
group, e pertanto hanno lo stesso valore del relativo identificativo nella colonna PGID.
La modalit`a pi`
u comune di uso della shell `e quella in cui si lancia un comando, si aspetta
che questo completi le operazioni, e poi se ne lancia un altro, e cos` via. Quello che succede
in questo caso `e che per ogni comando la shell crea un nuovo processo e si ferma in attesa che
questo completi le sue operazioni; alla conclusione del programma la shell20 riprende il possesso
del terminale e consente di lanciare un altro comando. In genere si lavora in questo modo perche
tutte le volte che si esegue in programma interattivo questo deve avere a disposizione il terminale
di controllo per ricevere i dati in ingresso ed inviare i dati in uscita.
Ovviamente se fosse possibile lavorare solo in questo modo si perderebbe la possibilit`a di
eseguire contemporaneamente pi`
u comandi e di sfruttare le capacit`a multitasking del sistema.
Se per`o si osserva il precedente risultato di ps si potr`a notare come tutti i comandi citati
(xmms, xdvi, emacs), pur facendo riferimento allo stesso terminale, vengono eseguiti insieme:
essi infatti sono stati lanciati come suol dirsi in background, in una modalit`a cio`e in cui essi non
sono agganciati al terminale.
Questa `e unaltra funzionalit`
a della shell che consente, quando si termina una linea di comando con il carattere &, di mandare in esecuzione i processi sganciati dal terminale, cos` che
questo resti a disposizione della shell stessa per eseguire altri comandi. Se, come accade per i citati xmms, xdvi e emacs,21 il programma non ha bisogno di accedere al terminale per funzionare,
esso potr`a continuare ad eseguire le sue operazioni restando appunto sullo sfondo; altrimenti
al primo tentativo di accesso il programma22 ricever`a dal kernel un opportuno segnale23 in modo
da bloccarne lesecuzione.24
Vediamo allora un esempio di questo comportamento, se si lancia in background un editor
testuale come jed, otterremo che lesecuzione del comando viene immediatamente fermata, dato
che ovviamente un editor necessita di interagire con il terminale per poter essere utilizzato.
Alla successiva operazione la shell25 stamper`a un avviso per avvisarci dellavvenuto blocco del
programma; avremo cio`e qualcosa del tipo:
piccardi@anarres:~/GaPiL$ jed prova &
[3] 8657
piccardi@anarres:~/GaPiL$
[3]+

Stopped

jed prova

Tutte le volte che, come nellesempio, si manda un processo in background, la shell stampa
sul terminale un valore numerico fra parentesi quadre, detto job ID,26 seguito dal PID dello
stesso. La shell infatti identifica i processi attivi allinterno di una stessa sessione di lavoro
assegnando loro un numero progressivo, il job ID, che poi pu`o essere utilizzato come riferimento
nei vari comandi di gestione del job control. Lesempio ci mostra anche come la shell provveda
20

si ricordi quanto visto in sez. 1.3.2 riguardo alla gestione della conclusione dei processi figli, essendo la shell il
processo padre dei comandi che si mettono in esecuzione, essa viene sempre notificata anche della loro conclusione.
21
questo perche in questo caso linterazione avviene attraverso linterfaccia grafica dato che sshd esegue il
reinoltro della sessione X (vedi sez. 8.3.4).
22
in realt`
a il segnale viene mandato a tutti i processi che fanno parte dello stesso process group, perche, come
illustrato nei risultati di ps e come vedremo meglio anche in sez. 2.1.4, si possono eseguire pi`
u processi su una
singola riga di comando e dovranno essere fermati tutti quanti.
23
rispettivamente SIGTTIN se laccesso `e in lettura e SIGTTOU se laccesso in scrittura.
24
lazione di default di SIGTTIN e SIGTTOU infatti `e quella di fermare lesecuzione del processo.
25
il sistema prevede anche che un processo padre possa essere notificato se uno dei suoi figli viene fermato.
26
in gergo infatti si suole chiamare job un processo che lavora in background.

2.1. LINTERFACCIA A LINEA DI COMANDO.

57

a stampare una notifica sul terminale tutte le volte che un processo viene bloccato, utilizzando
di nuovo il job ID.
Oltre a lanciare un processo in background ci sono casi in cui pu`o esser necessario fermare
temporaneamente un comando in esecuzione, per eseguire un controllo o un qualche altro compito pi`
u urgente. Abbiamo visto in sez. 1.3.3 che `e possibile fermare lesecuzione di un processo
con linvio dei segnali SIGSTOP o SIGTSTP, il sistema del controllo di sessione semplifica questa
operazione permettendo di inviare SIGTSTP ai processi che sono attivi su un terminale, tramite la
combinazione di tasti C-z.27 Di nuovo la shell si accorger`a che il processo `e stato fermato stampando, come nellesempio precedente, un messaggio di notifica prima di rimetterci a disposizione
il terminale. Oltre a SIGTSTP quando un processo `e associato ad un terminale di controllo gli si
possono mandare altri segnali con delle opportune combinazioni di tasti: C-c invia un SIGINT e
C-\ invia un SIGQUIT. Un elenco delle principali combinazioni di tasti supportate dallinterfaccia
dei terminali `e riportata in tab. 2.1.
Combinazione
C-z
C-c
C-\
C-d
C-s
C-q

Significato
sospende lesecuzione del comando corrente.
interrompe lesecuzione del comando corrente con SIGINT.
interrompe lesecuzione del comando corrente con SIGQUIT.
invia il carattere di end-of-file, che chiude lo standard input.
blocca le operazioni di I/O sul terminale.28
riabilita le operazioni di I/O sul terminale.

Tabella 2.1: Le scorciatoie da tastiera dellinterfaccia dei terminali.

Lelenco dei processi in background o bloccati sul terminale pu`o essere stampato con il comando jobs,29 che mostra la lista e lo stato di ciascuno di essi. Di default il comando stampa
lelenco ordinandolo per job ID, ma gli si possono fare stampare anche i PID con lopzione -l.
Lelenco riporta il job ID in prima colonna, seguito dallo stato e dal comando eseguito, nella
forma:
piccardi@hain:~/truedoc/corso$ jobs
[1]- Running
emacs struttura.tex &
[2]+ Stopped
man bash

dove il carattere + indica il cosiddetto job corrente, cio`e il processo su cui si `e operato per
ultimo, mentre il carattere - indica il job precedente.30
Quando un programma `e stato fermato con C-z la shell ci consente di farlo ripartire in
background con il comando bg.31 Un processo pu`o essere riassociato al terminale, cio`e, come
suol dirsi, messo in foreground, con il comando fg; se il processo era stato fermato questo viene
anche fatto ripartire.
Se non si specifica nulla sia bg che fg che tutti gli altri comandi del controllo di sessione
agiscono sul job corrente. Qualora si voglia invece agire su uno specifico job si pu`o specificare
come parametro sia il testo della riga di comando, che il numero di job ID stampato da jobs
e questo pu`
o essere indicato sia direttamente che preceduto da un carattere %; questultima
sintassi pu`
o essere usata anche con il comando kill (se questo `e realizzato come comando interno
27

cio`e luso del tasto control insieme alla lettera z, la notazione `e formalizzata in sez. 2.3.2.
vengono cio`e bloccate le operazioni di lettura e scrittura sul terminale, con la conseguenza di bloccare anche
laccesso alla riga di comando da parte della shell, la cui esecuzione si ferma in attesa che questo venga riabilitato;
quanto si scrive sul terminale viene comunque ricevuto e memorizzato ma non ha nessun effetto, la shell infatti
non lo ricever`
a fintanto che non si riabilitano le operazioni di I/O.
29
attenzione, questo, come i seguenti bg, fg e wait, `e un comando interno della shell, e non corrisponde a nessun
eseguibile su disco, vedremo la differenza in sez. 2.1.3.
30
per maggiori dettagli consultare il manuale della bash alla sezione JOB CONTROL.
31
ovviamente se questo dovesse cercare di eseguire un accesso a terminale si bloccherebbe immediatamente; per
questo `e inutile usare bg su un comando che si `e fermato per questo motivo: si fermer`
a di nuovo.
28

58

CAPITOLO 2. LA SHELL E I COMANDI

della shell, come avviene nel caso di bash) per mandare i segnali ad un processo identificato per
job ID piuttosto che per PID.
Se si vuole aspettare la fine di uno specifico comando che si `e mandato in background si
pu`o usare il comando wait, passandogli di nuovo il job ID come argomento. Se non si specifica
nulla il comando aspetta la fine di tutti i processi in background. Questo comando pu`o essere
utile negli script di shell (vedi sez. 2.1.5) quando si `e lanciato un comando in background per
poter eseguire nel frattempo altre operazioni, compiute le quali si vuole aspettare che il comando
iniziale finisca.
Una volta che si voglia terminare una sessione ed uscire dalla shell si pu`o usare il comando
exit o la combinazione di tasti C-d.32 Se si cerca di uscire dalla shell e chiudere la sessione ma
ci sono job in background o bloccati, la shell stamper`a un avviso, senza uscire, cos` da poter
provvedere a risolvere la situazione, se per`o si ripete immediatamente la richiesta di chiusura,
questa verr`a onorata e la shell verr`
a terminata insieme ai processi pendenti. Il comando prende
un argomento opzionale che costituisce lo stato di uscita (torneremo su questo in sez. 2.1.5).
Infine ci si pu`
o chiedere cosa succede se si interrompe la connessione ad un terminale, ad
esempio se si interrompe una connessione remota, su cui sono in esecuzione dei programmi (in
background o meno). In tal caso il kernel provvede ad inviare il segnale SIGHUP33 a tutti i processi
che hanno quello come terminale di controllo il cui effetto di default `e la terminazione degli
` per
stessi,34 onde evitare continuino ad essere eseguiti senza poter riportare nessun risultato. E
questo motivo che se si esegue un programma da un emulatore di terminale sullinterfaccia grafica
(ad esempio si lancia un editor) e poi si chiude il terminale, viene chiuso anche il programma
che si `e lanciato.
Esistono comunque alcune situazioni, come quella appena accennata, in cui questo comportamento non `e desiderato, ad esempio se si vuole lanciare su una macchina remota un programma
che non necessita di utilizzare il terminale, come un programma di elaborazione dati. Per evitare
la terminazione in caso di disconnessione o di uscita dalla shell si pu`o anteporre nohup alla riga
di comando che si vuole eseguire, che a questo punto verr`a eseguita senza terminale di controllo e
non terminer`a una volta che ci si scolleghi da esso. In questo caso, dato che non si vuole neanche
che il programma si fermi in caso di accesso al terminale, qualora esso generi delloutput questo
verr`a scritto in coda al file nohup.out nella directory in cui si `e lanciato il programma.35
La bash consente anche, qualora si sia gi`a lanciato un programma, di utilizzare il comando
disown che permette di disassociare un processo in background dalla tabella dei job, ed evitare
cos` che gli venga inviato il segnale di SIGHUP alluscita della shell, si pu`o comunque mantenere
il programma nella lista dei job e disabilitare solo linvio di SIGHUP usando lopzione -h. Se non
si specifica nulla il comando si applica al job corrente, altrimenti pu`o specificare uno o pi`
u job
ID, lopzione -r per indicare i programmi attualmente in esecuzione o lopzione -a per indicare
tutti i programmi della sessione di lavoro.

2.1.3

Sintassi e funzionalit`
a di base della riga di comando

Finora si `e parlato di riga di comando e del fatto che la shell consente allutente di lanciare i vari
programmi che vuole utilizzare, sorvolando per`o sui dettagli delle modalit`a in cui questo viene
32

come riportato in tab. 2.1 questo corrisponde ad inviare un end-of-file sul terminale, che segnala alla shell che
lo si vuole chiudere e con questo terminare la sessione di lavoro.
33
il nome del segnale deriva da hungup (impiccato) in quanto in casi come questo un processo resta appeso a
girare senza poter avere pi`
u nessuna interazione col terminale di controllo.
34
abbiamo accennato in sez. 1.3.3 come questo segnale venga utilizzato per dire ai demoni di sistema di rileggere
i propri file di configurazione; questo non `e in contrasto con quanto appena detto, in quanto detti programmi
sono proprio caratterizzati dal non avere un terminale di controllo, per cui SIGHUP pu`
o essere riutilizzato con un
significato diverso.
35
se questo file non fosse accessibile, verrebbe usato al suo posto un file nohup.out nella home dellutente, ed
in caso di inaccessibilit`
a anche di questultimo, si avrebbe un errore.

2.1. LINTERFACCIA A LINEA DI COMANDO.

59

fatto. In realt`
a la shell `e un programma molto complesso, ed quello di interprete della riga di
comando `e soltanto uno dei modi in cui pu`o essere usata (torneremo su questo in sez. 2.1.5),
inoltre anche in questo caso (quando cio`e si ha a che fare quella che si suole chiamare una shell
interattiva) ci si `e limitati a mostrare esempi elementari.
Per comprendere le reali capacit`a della shell e trattare la sintassi della riga di comando
occorre prima approfondire le modalit`a con cui la shell legge un riga dalla tastiera, riconosce
qual `e il programma che volete mettere in esecuzione, ricostruisce i vari argomenti da passare
al programma stesso, e poi lo esegue. Linvocazione generica di un qualunque comando `e nella
forma:36
comando -o -v valore --altra-opzione argomento1 --riopzione=valore argomento2
da scrivere sulla stessa riga e terminare con la pressione del tasto di invio.37
La sintassi elementare della shell prevede che si scriva allinizio della riga (eventuali spazi
antistanti verranno comunque ignorati) il nome del comando da eseguire, seguito da eventuali
opzioni ed argomenti. Si tenga presente che la shell, per identificare il comando e separarlo da
opzioni e argomenti, e separare questi ultimi fra di loro, usa caratteri vuoti come lo spazio o il
tabulatore. La presenza cio`e di uno o pi`
u spazi o tabulatori38 dice che si sta passando dal nome
del comando ad un argomento o opzione, o da un argomento/opzione al successivo.
Per questo motivo il nome di un comando non contiene spazi, inoltre la stragrande maggioranza dei comandi usa nomi scritti esclusivamente in lettere minuscole (si ricordi che un sistema
unix-like `e case-sensitive). I soli caratteri non alfabetici utilizzati, molto poco, sono il - e il
_ ed eventualmente i numeri; gran parte degli altri infatti, come vedremo fra breve, vengono
interpretati dalla shell assumendo significati speciali, e pertanto di nuovo non possono essere
inseriti nel nome del comando.39
La differenza fra opzioni e argomenti `e che le prime attivano funzionalit`a o modalit`
a di
operazione specifiche del comando, mentre i secondi indicano gli oggetti, solitamente dei file,
su cui questo opera. In realt`
a il meccanismo `e un po pi`
u complesso, e pu`o essere compreso
nei dettagli solo con un po di nozioni di programmazione.40 Quello che in effetti fa la shell `e
identificare il programma da usare sulla base del nome del comando,41 per poi spezzare lintera
riga in una lista di stringhe che verranno passate al suddetto programma come argomenti iniziali.
Questa scansione viene eseguita su tutta la riga, utilizzando gli spazi vuoti come separatori e
senza distinguere fra nome del comando, opzioni e argomenti; tutto il contenuto sar`a suddiviso in
una lista di stringhe, che poi il programma dovr`a utilizzare al suo interno. Si tenga presente che
opzioni ed argomenti possono essere separati da un numero arbitrario di caratteri di spaziatura,
che saranno scartati; come vedremo questo finisce con lavere diverse conseguenze non del tutto
intuitive.
Per gestire gli argomenti e le opzioni passate dalla linea di comando la gran parte dei programmi utilizzano una serie di funzioni fornite dalla libreria fondamentale del sistema, la GNU
36

in realt`
a anche in questo caso ci stiamo limitando ad una invocazione elementare, vedremo in seguito come
luso di una serie di caratteri di controllo consente di modificare il comportamento della shell.
37
la pressione del tasto di invio su un terminale infatti serve a scaricare la linea in modo che questa possa
essere letta in ingresso dal programma che usa il terminale (nel nostro caso la shell); se si vuole scrivere un
comando su pi`
u righe andando a capo occorre proteggere la pressione del tasto di invio; questo si fa utilizzando il
carattere \ come ultimo carattere della riga (vedremo pi`
u avanti che \ pu`
o essere usato nello stesso modo con
altri caratteri).
38
qualora si vada a capo su una nuova riga con luso del \ illustrato nella nota precedente, anche il carattere
di a capo viene considerato come uno spazio vuoto.
39
perlomeno non senza prendere delle precauzioni, analoghe a quelle che vedremo pi`
u avanti per gli argomenti
del comandi, il che fa s` poi che si finisca per usare nomi con semplici caratteri alfanumerici.
40
per i curiosi questo argomento `e trattato in dettaglio nella sezione 2.3 di [GaPiL].
41
vedremo pi`
u avanti i dettagli di come avviene questa identificazione.

60

CAPITOLO 2. LA SHELL E I COMANDI

C library che abbiamo gi`


a incontrato in fig. 1.1.42 Per i programmi che usano queste funzionalit`a
questo comporta la presenza di un formato della riga di comando abbastanza uniforme, mostrato
appunto nellesempio precedente, con la possibilit`a di distinguere fra opzioni e argomenti, e di
specificare questi in un ordine qualunque. Si tenga presente che questo non `e sempre vero, dato
che non tutti i programmi fanno ricorso a queste funzionalit`a; per questo motivo troveremo in
seguito diverse eccezioni, ad esempio in cui lordine conta, o in cui le opzioni vanno specificate
prima degli argomenti.
Nel comportamento comune le opzioni sono sempre costituite da un carattere - seguito
da una lettera (in rari casi anche numeri o caratteri non alfabetici), cui pu`o seguire (separato o
meno da uno spazio) un eventuale valore passato come parametro (non tutte le opzioni prevedono
parametri, per alcune va specificata solo la lettera dellopzione). Se si specificano pi`
u opzioni `e
normalmente supportata anche la possibilit`a di indicarle con pi`
u lettere dopo un - iniziale.
Una forma alternativa per le opzioni, in uso principalmente con i programmi del progetto
GNU che utilizzano le funzionalit`
a citate della GNU C library, e anchessa mostrata nellesempio
precedente, `e quella in cui lopzione `e scritta in forma estesa, e allora viene introdotta da un
--; in questo caso, qualora essa necessiti di un parametro, il relativo valore deve43 essere
assegnato con luso di un =. Torneremo su questo, e su alcuni aspetti che riguardano gli effetti
non immediatamente evidenti delluso del carattere - nella sintassi della riga di comando, in
sez. 2.2.1.
Per capire meglio questo comportamento facciamo un esempio; si consideri di aver scritto su
un terminale una riga di comando contenente qualcosa del tipo:
rm -f pippo pluto paperino
la shell capir`a che si intende invocare il comando rm e, individuato su disco il file che contiene il
relativo programma, lo lancer`
a passandogli come argomenti le cinque stringhe presenti nella riga
precedente. La prima stringa, rm, contiene il nome del programma e di norma viene ignorata,44
le restanti invece verranno analizzate dal programma; cos` -f verr`a identificata come opzione mentre, non necessitando questa di nessun parametro, pippo, pluto e paperino verranno
considerati come argomenti, che nel caso indicano i file da cancellare.
Si tenga conto poi che benche la filosofia di Unix sia quella di utilizzare un apposito comando
per effettuare ciascun compito specifico, e che il caso pi`
u comune sia quello appena illustrato (in
cui la shell interpreta la riga di comando per lanciare il programma che le avete chiesto) esistono
alcune funzionalit`
a che essa vi fornisce direttamente tramite quelli che vengono detti comandi
interni (o built-in). Se questo `e il caso la shell si accorger`a che non `e necessario eseguire nessun
programma, ed operer`
a direttamente sulla base di quanto dite sulla linea di comando. Di norma
i comandi interni sono quelli che servono a eseguire impostazioni relative al funzionamento stesso
della shell, o a impostare propriet`
a generali che essa deve trasmettere ai programmi che lancia.
Un esempio classico di comando interno `e cd che viene usato per modificare la directory di
lavoro corrente della shell. Un tale comando non pu`o essere eseguito con un programma esterno,
dato che nella sua esecuzione come processo separato questultimo potrebbe solo cambiare la
42

la funzionalit`
a si chiama getopt, e permette luso di una sintassi standard per le opzioni, la scansione automatica
delle stesse indipendentemente dallordine in cui le si specificano, la possibilit`
a di identificare opzioni con parametri
o senza, la capacit`
a di passare al programma, una volta terminata la scansione della lista di stringhe ottenuta
dalla shell, solo quelle contenenti gli argomenti restanti; per una trattazione pi`
u dettagliata si pu`
o fare riferimento
alla sez. 2.3.2 di [GaPiL].
43
anche questa `e una convenzione, non `e detto sia sempre supportata, in alcuni casi si pu`
o scrivere direttamente
il parametro senza =.
44
alcuni programmi invece usano questa stringa per modificare il loro comportamento, ad esempio gzip, un
compressore di file, pu`
o essere invocato anche come gunzip (in genere entrambi i comandi sono presenti come
hard link allo stesso file eseguibile) nel qual caso decomprimer`
a invece di comprimere.

2.1. LINTERFACCIA A LINEA DI COMANDO.

61

sua directory di lavoro, ma non quella della shell che lo ha lanciato.45 Altri esempi sono umask
(vedi sez. 1.4.3), ed i comandi del controllo di sessione di sez. 2.1.2; ne incontreremo degli altri
pi`
u avanti.
Si ricordi infine che quanto detto attiene alluso pi`
u elementare della sintassi usata dalla
shell, quello in cui si esegue un comando scrivendone per esteso il nome con le relative opzioni
ed argomenti. Vedremo pi`
u avanti come sulla linea di comando si possano effettuare operazioni
pi`
u complesse, attraverso luso di opportuni caratteri di controllo.
Lesempio precedente con rm ci mostra come la shell, oltre a quello generico di lanciare
programmi, gi`
a esegua di per se anche molti altri compiti. Il primo che prenderemo in esame
`e quello della visualizzazione del prompt, cio`e di quella scritta che compare sulla sinistra della
linea di comando, a fianco della quale, se non si `e scritto nulla, lampeggia il cursore, e che serve
ad avvisarvi che la shell `e in attesa di ricevere dei comandi da eseguire.
Nel caso della bash il prompt `e completamente personalizzabile, e pu`o contenere diverse
informazioni. Quello che viene stampato come prompt `e stabilito dalla variabile di shell PS1,46
(tratteremo delle variabili di shell a breve) nel cui contenuto, oltre ai normali caratteri, che
saranno stampati inalterati, si possono inserire una serie di caratteri di controllo (i principali dei
quali sono riportati in tab. 2.2) che verranno automaticamente espansi in un determinato valore
(come data, utente, stazione, ecc.). Lelenco completo `e disponibile nella pagina di manuale, alla
sezione PROMPTING.
Opzione
\d
\h
\u
\w
\W
\$
\!
\t
\T

Significato
la data in formato tipo: Tue May 26.
il nome della stazione.
lo username dellutente.
il percorso completo della directory di lavoro.
il nome della directory di lavoro.
un # per lamministratore, un $ per gli altri.
la posizione nella history del comando.
il tempo corrente in formato HH:MM:SS (24h).
il tempo corrente in formato HH:MM:SS (12h).

Tabella 2.2: Principali caratteri di controllo usati nella visualizzazione del prompt della shell.

Due esempi possibili per il prompt sono quello usato da Debian, che prevede per PS1 un
valore pari a \u@\h:\w\$, e che produce un prompt del tipo:
piccardi@anarres:~/truedoc/corso$
o quello di RedHat, che usa un valore di [\u@\h \W]\$, e produce un prompt del tipo:
[root@gont piccardi]#
La scelta del prompt dipende dai gusti e dalluso: se ci si trova a lavorare contemporaneamente con diversi utenti, su computer diversi, allora sar`a utile sapere con quale utente e su quale
macchina si sta operando in un certo terminale; altrimenti si pu`o farne a meno e risparmiare
spazio sulla linea di comando con un valore di PS1 come \$.
Al di l`
a dellestetica del prompt il compito principale della shell `e quello di mettere a disposizione dellutente uninterfaccia che gli consenta di utilizzare al meglio il sistema; per questo
45

come accennato in sez. 1.2.2 la directory di lavoro `e una delle caratteristiche che ciascun processo si porta
dietro e quella iniziale `e ereditata dal processo padre; per questo se la si cambia nella shell tutti i comandi successivi
vedranno la nuova directory di lavoro.
46
in realt`
a in tutto le variabili che controllano laspetto del prompt sono 4, ed oltre PS1 ci sono anche PS2, PS3
e PS4 che vengono utilizzate in altri casi (ad esempio PS2 viene usata come segno di continuazione di un comando
quando si va a capo con luso di \ a fine riga); la descrizione dettagliata del loro impiego si trova nella pagina
di manuale, nella sezione Shell Variables.

62

CAPITOLO 2. LA SHELL E I COMANDI

essa fornisce una serie di funzionalit`


a che permettono di rendere pi`
u efficace luso dei comandi.
Una delle funzionalit`
a fondamentali `e quella delle variabili di shell; la shell permette cio`e di
definire e modificare delle variabili a cui si pu`o fare riferimento in un secondo tempo. Per farlo
la sintassi elementare della riga di comando vista in precedenza cambia e si deve utilizzare una
riga contenente unassegnazione nella forma:
VARIABILE=valore
Se la variabile non esiste viene creata e assegnata, altrimenti viene reimpostata al valore
specificato. Si noti che non ci sono spazi a separare il nome della variabile, loperatore = ed il
valore, in presenza di spazi infatti la shell interpreterebbe il tutto come il nome di un comando,
e probabilmente riporterebbe un errore non trovando un programma corrispondente.47
Per convenzione le variabili di shell hanno nomi scritti con lettere maiuscole, ma questa `e
appunto solo una convenzione, dovuta al fatto che cos` `e pi`
u difficile confonderle con i comandi;
in realt`a `e possibile usare qualunque tipo di lettera e, eccezion fatta per il primo carattere, anche
qualunque numero e ed il carattere di sottolineatura _.
Una volta definita una variabile di shell `e possibile richiamarne il valore sulla riga di comando
anteponendo al nome della variabile il carattere $; cos` se ad esempio si `e inserito nella variabile
MAIL il nome del file in cui si trova la propria posta elettronica, si potr`a verificarne dimensioni
e permessi con un comando del tipo:
[piccardi@gont piccardi]$ ls -l $MAIL
-rw-rw---1 piccardi mail
4136 Aug 25 17:30 /var/mail/piccardi

Questo perche la shell, quando incontra il carattere $ seguito dal nome di una variabile,
esegue quella che viene chiamata variable expansion,48 sostituisce cio`e il riferimento alla variabile (nel caso $MAIL) con il valore della stessa (nel caso /var/mail/piccardi), passando il
risultato come argomento (o come opzione, a seconda di dove lo si `e scritto) al comando che
viene eseguito.
In realt`a la variable expansion `e un procedimento molto pi`
u complesso rispetto alla descrizione grossolanamente semplificata che si `e appena fatta, e senza comprenderne i dettagli si rischia
di trovarsi di fronte a dei risultati inaspettati. Tutte le volte che nella scansione delle riga di
comando la shell incontra il carattere $ seguito da una lettera, interpreta il tutto come linizio
del riferimento ad una variabile, ed esegue la sostituzione con il relativo valore.
Tutto questo pu`
o avere alcuni effetti non del tutto intuitivi: il primo `e che la sostituzione
avviene comunque,49 indipendentemente dal fatto che sia stata definita o meno una variabile
che corrisponde a quel nome; se la variabile non esiste la variable expansion avviene lo stesso,
solo che non essendoci un valore al posto del riferimento non viene messo nulla. Il che significa
anche che se si sbaglia a scrivere il nome di una variabile non si avr`a nessun errore specifico, se
non quelli dovuti al fatto che sulla riga di comando non compare pi`
u un eventuale parametro o
argomento che si era espresso tramite di essa.50
Un secondo problema della variable expansion `e che se `e semplice determinare linizio del
nome di una variabile, che corrisponde al carattere che segue il $, non `e altrettanto immediato
identificarne la fine, che `e invece `e determinata dal primo carattere non valido per il nome di una
variabile; per cui se ad esempio si definisce la variabile BASE=prova, il riferimento a $BASE_01
non dar`a come risultato, come qualcuno avrebbe potuto aspettarsi, il valore prova_01, ma un
valore nullo, perche la variabile BASE_01 non esiste.
47

la shell supporta anche la possibilit`


a di eseguire un comando una volta effettuata lassegnazione di una
variabile, in tal caso questo deve essere specificato, separato da uno spazio, nel seguito della riga di comando.
48
in realt`
a il manuale della bash fa riferimento a questa funzionalit`
a come Parameter Expansion.
49
in realt`
a si pu`
o richiedere la stampa di un errore modificando con set -u il comportamento di default della
shell (vedi tab. 2.3).
50
si ricordi infatti che prima la shell effettua la variable expansion e poi analizza la linea di comando che ne
deriva per creare la lista di argomenti ed opzioni da passare al programma.

2.1. LINTERFACCIA A LINEA DI COMANDO.

63

Per risolvere questo tipo di problemi la shell supporta una diversa modalit`a di eseguire
la variable expansion, che prevede lindicazione esplicita del nome della variabile fra parentesi
graffe, cio`e, per riprendere lesempio precedente, con qualcosa del tipo:
[piccardi@gont piccardi]$ ls -l ${MAIL}
-rw-rw---1 piccardi mail
4136 Aug 25 17:30 /var/mail/piccardi

Questa sintassi, oltre a definire in maniera chiara i caratteri che fanno parte del nome della
variabile,51 consente anche di far eseguire alla shell una serie di operazioni avanzate, come usare
un riferimento indiretto (cio`e usare una variabile per contenere il nome di quella da referenziare)
impostare un valore di default, eseguire espansioni condizionali, ed altre per la cui descrizione
dettagliata di rimanda alla sezione Parameter Expansion della pagina di manuale.
Per poter vedere lelenco delle variabili di shell che sono state definite (vedremo in sez. 2.1.5
come effettuarne limpostazione al login o quando si esegue la shell su un terminale) si pu`o usare
il comando set, che ne stampa a video la lista ed i relativi valori nello stesso formato in cui si
eseguono le assegnazioni.52
Si tenga presente che set effettua la stampa delle variabili di shell soltanto se invocato senza
argomenti,53 in generale il comando viene invocato con le opportune opzioni per impostare alcuni
comportamenti di default della shell; le principali opzioni sono riportate in tab. 2.3, per lelenco
completo e la descrizione dettagliata del significato di ciascuna di esse si pu`o fare riferimento
alla descrizione nella sezione SHELL BUILTIN COMMANDS della pagina di manuale.
Opzione
-e
-o opt

-u
-C

Significato
se attivata fa s` che la shell esca immediatamente in caso di errore
nellesecuzione di un comando.54
imposta lopzione di funzionamento della shell passata come parametro;
i valori utilizzabili e la descrizione del relativo significato si trovano nella
descrizione del comando set nella sezione SHELL BUILTIN COMMANDS
della pagina di manuale.
se attivata fa s` che la shell stampi un errore in caso di riferimento ad
una variabile non definita.
se attivata fa s` che la shell non sovrascriva un file esistente in caso di
redirezione (vedi sez. 2.1.4) segnalando un errore.
Tabella 2.3: Principali opzioni del comando interno set.

Qualora si voglia cancellare una variabile definita in precedenza si pu`o usare invece il comando55 unset, seguito dal nome della variabile.56 La modifica di una variabile di shell si
effettua semplicemente assegnando alla variabile un nuovo valore. Si tenga presente che benche
sia possibile cancellare il contenuto di una variabile assegnandole una stringa vuota, questo non
`e equivalente a cancellarla con unset, dato che in questo caso essa continuer`a ad apparire nella
lista delle variabili definite, anche se con valore nullo.
Si noti che mentre la shell fornisce la sintassi e gli opportuni comandi interni per assegnare e
cancellare la singola variabile, altrettanto non accade per la visualizzazione del contenuto. Ci`
o
avviene perche questo pu`
o essere fatto attraverso luso di uno dei comandi specialistici della
Unix toolbox. In particolare il comando da usare `e echo,57 il cui solo compito `e stampare in
51

riprendendo lesempio ${BASE}_01 `e ben definito, e da come risultato prova_01.


in realt`
a di default, oltre alle variabili, set stampa anche tutte le funzioni (vedi sez. 2.1.5) definite nella shell:
la lista ottenuta pu`
o essere anche molto lunga e le variabili, che sono allinizio, si possono perdere di vista.
53
il comando dedicato alla gestione delle variabili in realt`
a `e declare, che tratteremo a breve.
54
si usa questa modalit`
a principalmente negli script (vedi sez. 2.1.5) per interromperne automaticamente
lesecuzione in caso di errore.
55
anche questo, come il precedente `e un comando interno alla shell.
56
il comando `e anche in grado, quando usato con lopzione -f, di cancellare una funzione di shell.
57
si tenga presente che nel caso di bash il comando `e disponibile anche come comando interno.
52

64

CAPITOLO 2. LA SHELL E I COMANDI

uscita la stringa (o le stringhe) che gli vengono passate come argomento: siccome la shell esegue
automaticamente lespansione delle variabili prima di passare gli argomenti ad un comando, si
potr`a usare echo per leggere il contenuto di una variabile con una riga del tipo:
piccardi@anarres:~/truedoc/corso$ echo $USER
piccardi

dove la variabile USER viene prima espansa dalla shell nella stringa piccardi, dopo di che
questultima viene passata come argomento ad echo, che, come avrebbe fatto per una qualunque
altra stringa che potreste aver scritto direttamente sulla linea di comando, la stamper`a a video.
Il comando echo `e uno dei pi`
u elementari e prende due sole opzioni. La prima `e -n, che evita
la stampa del carattere di a capo alla fine della stringa passata come argomento. Questa opzione
`e utile quando si vuole costruire una riga di testo con pi`
u invocazioni del comando, e la si usa
in genere allinterno di uno script (tratteremo gli script in sez. 2.1.5), dato che sul terminale si
avrebbe linterferenza da parte del prompt.
La seconda opzione `e -e che attiva linterpretazione di espressioni speciali, introdotte dal
carattere \ (come \n), che consentono di ottenere la stampa una serie di caratteri di controllo
(nel caso un ritorno a capo). Lelenco completo di queste espressioni, insieme a tutti gli altri
dettagli relativi al comando, si trova nella relativa pagina di manuale, accessibile con man echo.
La bash definisce automaticamente alcune variabili e ne utilizza delle altre qualora siano
definite.58 In questo modo da una parte diventa possibile accedere ad una serie di informazioni
che possono essere riutilizzate sulla riga di comando, dallaltra si pu`o modificare il comportamento della shell scrivendo degli opportuni valori nelle opportune variabili.59 Un elenco delle
principali variabili predefinite riconosciute dalla shell `e riportato in tab. 2.4, lelenco completo
e la descrizione di tutti i loro effetti `e disponibile nella sezione Shell Variables della pagina
di manuale.
Variabile
HOSTNAME
OSTYPE
PWD
GLOBIGNORE
HISTFILE
HISTFILESIZE
HISTSIZE
HOME
IFS
LANG
PATH
PS1
BASH_ENV

Significato
il nome della macchina.
la descrizione del sistema operativo corrente.
la directory di lavoro corrente.
una lista, separata da :, di nomi di file da ignorare nel
filename globbing.
il file in cui viene memorizzata la storia dei comandi.
il massimo numero di linee da mantenere nel file della
storia dei comandi.
il numero di comandi da mantenere nella storia dei
comandi.
la home directory dellutente, viene usata dal comando
interno cd.
elenco dei caratteri che separano in campi diversi il
risultato di una espansione di shell.
la localizzazione utilizzata dai programmi.
la lista delle directory in cui si trovano i comandi.
la stringa che indica il formato del prompt.
se impostata viene usata nellesecuzione degli script (vedi sez. 2.1.5) come lindicazione del file da cui leggere
eventuali impostazioni di inizializzazione.
Tabella 2.4: Le principali variabili di shell.

Una delle altre funzionalit`


a che la shell fornisce con luso delle variabili `e quella dellambiente
(in inglese environment). Esso `e una funzionalit`a messa a disposizione dal sistema che viene
58

ed in alcuni casi, se queste non sono state definite, le utilizza impostandole automaticamente ad un valore di
default.
59
ad esempio come si pu`
o fare con IFS nella interpretazione della riga di comando.

2.1. LINTERFACCIA A LINEA DI COMANDO.

65

usata per poter utilizzare il valore di alcune variabili di shell anche allinterno dei programmi
che questa mette in esecuzione.60 Non tutte le variabili definite nella shell sono per`o inserite
nellambiente in quanto molte di esse (come ad esempio PS1) sono di interesse esclusivo della
shell. Se si vuole inserire una variabile nellambiente, ottenendo quella che si suole chiamare una
variabile di ambiente, lo si deve fare esplicitamente usando il comando interno export seguito
dal nome della variabile, che deve essere gi`a definita.61
Lo stesso risultato si pu`
o ottenere con luso del comando interno declare,62 che serve in
generale ad assegnare variabili e funzioni (tratteremo queste ultime in sez. 2.1.5) o impostarne
gli attributi; se usato senza opzioni o argomenti declare mostra la lista delle variabili e funzioni
di shell definite, esattamente come set, in generale per`o viene usato passando il nome di una
variabile come argomento per impostarne le caratteristiche tramite una delle opzioni riportate
in tab. 2.5.
Ad esempio si pu`
o marcare una variabile come accessibile in sola lettura con lopzione -r, o
metterla nellambiente con lopzione -x, nel qual caso il risultato `e del tutto equivalente alluso
di export. In tab. 2.5 si sono riportate solo le opzioni relative alle propriet`a delle variabili,
il comando opera anche sulle funzioni di shell (trattate in sez. 2.1.5) e per la documentazione
completa si pu`
o fare riferimento alla descrizione nella sezione SHELL BUILTIN COMMANDS della
pagina di manuale. Per la rimozione di una variabile dallambiente, senza perderne il valore, si
pu`o usare invece la sintassi declare +x. Si tenga presente infine che se si cancella una variabile
con unset questa viene automaticamente rimossa anche dallambiente.
Opzione
-a
-i
-r
-x
-p

Significato
dichiara una variabile vettoriale.
dichiara una variabile intera.
rende la variabile accessibile in sola lettura (e ne impedisce la
cancellazione con unset).
inserisce la variabile nellambiente.
stampa tutti gli attributi associati ad una variabile o una funzione.
Tabella 2.5: Principali opzioni del comando interno declare.

Per visualizzare le variabili di shell presenti nellambiente si pu`o usare lo stesso export
senza specificare nulla, e si otterr`
a la lista delle variabili presenti nellambiente, precedute dalla
dichiarazione declare -x; la lista infatti viene stampata in un formato pronto per essere
salvato su un file ed usato come script (tratteremo gli script in sez. 2.1.5) per ricreare lambiente.
Se si vuole solo una semplice lista di nomi con relativo valore si pu`o usare il comando env.
Questo comando in generale permette di eseguire un altro comando, da passare come argomento, fornendogli un ambiente modificato rispetto a quello corrente della shell; con lopzione -i
infatti lambiente viene completamente svuotato,63 mentre con una serie di opzioni -u si possono
cancellare altrettante variabili di ambiente (da specificare come parametro per lopzione). Se si
invoca env senza argomenti il comando si limita a stampare la lista delle variabili di ambiente,
nella classica forma VARIABILE=valore.
60

in sostanza quando un programma viene lanciato con la opportuna chiamata al sistema (largomento `e trattato
nel capitolo due di [GaPiL]), deve ricevere una serie di informazioni da chi lo lancia; una parte di queste informazioni sono gli argomenti, che vengono presi direttamente da quanto scritto nella riga di comando con il meccanismo
illustrato in precedenza, laltra parte sono appunto le variabili di ambiente, che fanno parte dellenvironment.
61
la bash supporta anche la definizione della variabile nella stessa linea in cui viene esportata nellambiente,
con una sintassi del tipo export VAR=val; questa per`
o `e una estensione che non `e supportata da altre shell per
cui quando si scrivono script `e il caso di evitare questa sintassi per mantenere la compatibilit`
a.
62
il comando pu`
o anche essere invocato, con la stessa identica sintassi, come typeset.
63
dato che molti comandi rispondono ai valori delle variabili di ambiente, `e in genere una misura di sicurezza
fornire un ambiente noto e ben definito cancellando preventivamente quanto gi`
a presente, onde evitare di ottenere
risposte non previste quando si esegue il comando in un ambiente che pu`
o essere stato manomesso.

66

CAPITOLO 2. LA SHELL E I COMANDI

Le variabili di ambiente sono di grande importanza perche sono usate in moltissimi casi per
controllare alcuni comportamenti predefiniti dei programmi. Alcune impostazioni e valori di uso
generale vengono allora memorizzati in una serie di variabili che di norma ogni shell deve definire,
come USER, che indica il nome dellutente corrente, HOME che ne indica la home directory, TERM
che specifica il tipo di terminale su cui si sta operando, LANG che indica la localizzazione (vedi
sez. 3.1.4) in uso, PATH che specifica la lista delle directory dove cercare i comandi; altre variabili
sono invece opzionali, ma sono riconosciute dalla gran parte dei programmi, come EDITOR che
indica quale programma usare come editor predefinito o BROWSER che indica quale navigatore
per il web utilizzare.
Una variabile molto importante ma poco nota, ed il cui significato spesso viene frainteso, `e
IFS, il cui nome sta per Internal Field Separator. Questa variabile viene utilizzata per indicare la
lista di caratteri che devono essere considerati come separatori nei risultati di una espansione di
shell ed il suo valore di default `e impostato alla sequenza spazio, tabulatore, ritorno a capo. La
variabile `e importante perche ha un effetto diretto, la cui comprensione non `e proprio immediata,
sul risultato dellinterpretazione della riga di comando.
Come abbiamo visto con la variable expansion, la shell consente di sostituire automaticamente
sulla riga di comando alcune espressioni con il risultato della relativa espansione, nel caso citato
una variabile con il suo contenuto. Esistono anche, e le tratteremo a breve, altre espansioni,
come una lista di file ottenuta con luso dei caratteri jolly del filename globbing, o il risultato
di un calcolo dato da una arithmetic expansion o loutput di un altro comando fornito da una
command expansion.
In tutti questi casi il risultato della espansione deve essere di nuovo sottoposto ad una
scansione per suddividerlo in una lista di campi che verranno interpretati come argomenti o
opzioni; questo viene fatto usando come separatori i caratteri che sono elencati in IFS, in questo
modo se si ha un comando che genera delle liste usando un carattere di separazione che non
rientra nei classici caratteri di spaziatura, si pu`o aggiungerlo a IFS per usarlo come separatore.64
Unaltra variabile di particolare rilevanza `e LANG; su Linux infatti `e presente il supporto,
attraverso luso di una infrastruttura generica che fa parte delle librerie di sistema, per la localizzazione dei programmi sia in termini di lingua e set di caratteri utilizzati nella comunicazione
con gli utenti, che per altri aspetti che riguardano convenzioni nazionali, come il formato dellora, della valuta, ecc. Come spiegato in maggior dettaglio in sez. 3.1.4, questi possono essere
scelte in maniera generale sulla base del valore di questa variabile, o per i singoli aspetti secondo
i valori delle singole variabili a questo deputate.65
Al di l`a della stampa dei vari messaggi in italiano (o in ogni eventuale altra lingua selezionata)
anziche in inglese, uno degli aspetti pi`
u significativi delluso di LANG, ed il motivo per cui ne
accenniamo anche in questa sede, `e che questa nelle versioni pi`
u recenti dei programmi influenza
anche le modalit`
a con cui essi eseguono lordinamento alfabetico. Infatti nella localizzazione di
default (quella per cui LANG=C) lordine delle lettere prevede prima tutte le maiuscole e poi tutte le
minuscole, cio`e qualcosa del tipo ABC...Zabc...z, mentre ad esempio in italiano lordinamento
`e completamente diverso e prevede la minuscola seguita della corrispondente maiuscola, cio`e
qualcosa del tipo aAbBcC...zZ.
Questo significa che a seconda del supporto o meno per questa funzionalit`a e del valore di
LANG si possono ottenere risultati completamente diversi quando i programmi o la shell stessa
hanno a che fare con ordinamenti alfabetici. Pertanto pu`o risultare opportuno, quando si vuole
essere sicuri di avere un comportamento uniforme, impostare forzatamente il valore di questa
variabile al valore C (torneremo sul significato dei valori possibili in sez. 3.1.4) di modo che
64
si tenga ben presente per`
o che IFS non ha nessuno effetto sulla scansione di una linea di comando ordinaria
che non contiene espansioni, che viene sempre effettuata usando come separatori solo i caratteri di spaziatura,
questo perche una espansione viene sempre fatta dopo che la prima scansione iniziale `e stata eseguita.
65
che, come vedremo in sez. 3.1.4, sono tutte nella forma LC_*.

2.1. LINTERFACCIA A LINEA DI COMANDO.

67

venga usato sempre il comportamento di default previsto anche dallo standard POSIX, che `e
quello che in seguito considereremo come default.
Di altrettanta se non maggiore rilevanza `e la variabile PATH che `e direttamente connessa ad
una delle funzionalit`
a della shell su cui finora abbiamo sorvolato, dandola per scontata: quella
del cosiddetto path search, cio`e del fatto che la shell permette di associare automaticamente un
nome, scritto sulla linea di comando, ad un programma da lanciare. In genere questo nome
deve corrispondere al nome del file che contiene il programma che la shell deve eseguire.66 In
sostanza, come visto nellesempio iniziale di sez. 2.1.3, su pu`o sempre scrivere solo il nome del
file al posto del pathname completo: se cio`e si vuole leggere una pagina di manuale, baster`
a
scrivere man e non sar`
a necessario specificare /usr/bin/man.
Si pu`o fare cos` perche la shell esegue automaticamente una ricerca nel cosiddetto PATH dei
comandi; cio`e dato un nome sulla linea di comando la shell cerca un file da eseguire con quel
nome nella lista di directory contenute nella variabile dambiente PATH. Se si vuole evitare questo
comportamento, ad esempio perche il programma che si vuole lanciare non `e in una di quelle
directory e non sarebbe trovato, `e necessario specificare, sia in forma assoluta che relativa, il
pathname per accedere al comando.67 Ad esempio per lanciare un comando (o uno script) nella
directory corrente si usa la sintassi:
./comando
La variabile PATH ha la forma di una lista di pathname di directory, separati fra loro da un
carattere di due punti.68 Un esempio del valore di questa variabile potrebbe essere il seguente:
/usr/local/bin:/usr/bin:/bin:/usr/bin/X11:/usr/games
come `e presa dalla definizione standard per un utente comune su Debian. Si noti come in
questo caso siano indicate solo le directory che, nella standardizzazione del filesystem illustrata in sez. 1.2.3, contengono i programmi di uso per lutente; sono pertanto assenti69 directory come /sbin, /usr/sbin, ecc. che usualmente vengono inserite dentro PATH soltanto per
lamministratore.
Si tenga conto che PATH `e comunque modificabile dallutente, che pu`o personalizzarla a
piacere, ed aggiungere unaltra directory, come ad esempio la directory corrente, che di norma
non vi `e mai inclusa.70 Il dubbio casomai pu`o essere sul come farlo senza doversi riscrivere tutto
da capo il contenuto precedente; per questo ci viene di nuovo in aiuto la sintassi della riga di
comando, per cui `e possibile ridefinire una qualunque variabile con una espressione del tipo:
PATH=$PATH:./
66
vedremo a breve come si possono creare dei comandi personalizzati attraverso luso degli alias, nel qual caso
il nome pu`
o essere del tutto arbitrario.
67
la shell riconosce questo quando nel nome del comando compare il carattere /, che indica una directory.
68
`e un formato comune usato nelle variabili di ambiente tutte le volte che si deve specificare una lista di directory
in cui effettuare ricerche, lo reincontreremo spesso, ad esempio in sez. 3.1.2 per le directory dove sono mantenute
le librerie di sistema.
69
questo `e il motivo per cui alcuni comandi non funzionano quando chiamati da utente normale, in realt`
a
non `e che non funzionano, solo non vengono trovati i relativi programmi, che potrebbero tuttavia essere eseguiti
ugualmente (con privilegi ridotti ovviamente) usando un pathname assoluto o inserendo le directory in cui si
trovano allinterno di PATH.
70
questa scelta ha una ragione precisa: se tenete dentro PATH la directory corrente un altro utente potrebbe
mettere nelle directory cui ha accesso una versione opportunamente modificata di un comando di sistema, che
verrebbe eseguita al posto delloriginale, col rischio di guai seri qualora ci`
o avvenisse per lamministratore; `e vero
che se si inserisce la directory corrente in coda a PATH i comandi standard hanno la precedenza, ma qualcuno
potrebbe sempre creare un programma la e aspettarvi al varco per un comune errore di battitura di ls ...

68

CAPITOLO 2. LA SHELL E I COMANDI

dove di nuovo si `e usato la capacit`


a della shell di espandere il valore delle variabili, che funziona
anche allinterno della sintassi usata per assegnare le stesse. Si noti come una riga del genere
non esegua nessun programma, limitandosi ad utilizzare esclusivamente le funzionalit`a interne
della shell. Una delle caratteristiche peculiari di bash `e quella di essere in grado di vedere
immediatamente i nuovi programmi non appena si ridefinisce il valore di PATH, mentre con altre
shell (ad esempio la csh) pu`
o essere necessario utilizzare un apposito comando interno (nel caso
rehash).
Come complemento alla gestione del path search la shell fornisce il comando interno which
che, dato il nome di un programma presente nel path search, ne stampa a video il pathname
assoluto, ad esempio potremo ottenere il pathname del comando ls con:
piccardi@hain:~/Truelite$ which ls
/bin/ls

in questo modo `e possibile anche capire quale sia effettivamente il programma che viene usato
qualora ne esistano pi`
u versioni in alcune delle directory contenute allinterno di PATH.71 Se non
viene trovato nessun programma corrispondente, non sar`a stampato nulla.
Si tenga presente per`
o che which funziona controllando se il nome passato come argomento
compare nella lista dei programmi contenuti nelle directory elencate in PATH, se si indica il nome
di un comando interno della shell questo non viene considerato. Per questo, se si vuole capire se
si sta usando un comando interno o un programma,72 si deve usare un altro comando interno,
type, nel qual caso otterremo qualcosa del tipo:
piccardi@hain:~/Truelite$ type export
export is a shell builtin

Unulteriore funzionalit`
a che la shell mette a disposizione `e quella degli alias: prima ancora
di cercare se il nome di un comando corrisponde ad un programma presente in una delle directory
indicate in PATH, la shell controlla se esso corrisponde ad un alias; ci permette cos` di ideare nuovi
comandi, definire abbreviazioni per quelli pi`
u usati, o ridefinire lo stesso nome di un comando per
farlo comportare in maniera diversa. Un alias si crea con il comando interno alias associando
un nome ad un altro comando (che pu`
o a sua volta essere stato definito in un altro alias) con
una sintassi del tipo:
alias ll=ls --color=auto

-l

ma si pu`o anche definire una abbreviazione con:


alias l=ls -l
o ridefinire un comando esistente con:
alias rm=rm -i
In questo modo nel primo caso si definisce una versione colorata e prolissa di ls, nel secondo una abbreviazione per luso di ls -l e nel terzo si ridefinisce rm in modo che di default
sia richiesta conferma nella cancellazione dei file. Per cancellare un alias si pu`o usare il comando unalias seguito dal nome dello stesso. Qualora invece si esegua il comando alias senza
specificare nulla questo mostrer`
a la lista degli alias gi`a definiti.
Unaltra funzionalit`
a di grande utilit`
a fornita della shell `e il cosiddetto filename globbing. Si
pu`o cio`e operare su insiemi di file con nomi simili passando ai comandi che dovranno operare su
71

la regola `e che viene usato sempre il primo programma che viene trovato nella scansione delle directory del
path search; questa avviene da sinistra a destra nellordine in cui le directory sono elencate allinterno di PATH.
72
o un alias, che tratteremo a breve.

2.1. LINTERFACCIA A LINEA DI COMANDO.

69

di essi degli argomenti che li indicano in gruppo, tramite i cosiddetti caratteri jolly (in inglese
wildcard ). Se cio`e allinterno di una riga di comando si usa come argomento un nome che contiene
uno di questi caratteri jolly, la shell nelleseguirne la scansione verificher`a quali file ci sono nella
directory corrente,73 e se ne trover`
a di corrispondenti espander`a il nome contenente il carattere
74
jolly nella lista dei file.
Come nel caso del DOS o del VMS, il carattere * indica un numero arbitrario di caratteri
qualsiasi mentre il carattere ? indica un solo carattere qualunque. Ma oltre a queste due
wildcard elementari la shell ne supporta di pi`
u sofisticate; ad esempio si possono indicare elenchi
di possibili alternative per un singolo carattere, ponendole fra due parentesi quadre. Le alternative possono essere espresse con una lista dei caratteri voluti messi uno di seguito allaltro,
mentre si possono specificare degli intervalli (corrispondenti a tutti i caratteri compresi fra i
due estremi) usando due caratteri separati da un -.75 Si pu`o inoltre invertire la selezione dei
caratteri specificati fra parentesi quadre precedendo la lista o lintervallo con un carattere di ^.
Infine come ultima modalit`
a di espansione si pu`o utilizzare il carattere ~ per indicare la home
directory dellutente corrente, mentre si pu`o usare la notazione ~username per indicare la home
directory di un altro utente.
Per capire meglio facciamo alcuni esempi di filename globbing: supposto che per essi venga usata la solita estensione .pdf, si potranno vedere tutti i documenti PDF presenti in una
directory con una riga di comando come:
piccardi@anarres:~/truedoc/corso$ ls *.pdf
Struttura.pdf baseadm.pdf corso.pdf netadmin.pdf

mentre si potranno selezionare tutti i file il cui nome `e lungo esattamente sette caratteri con una
riga di comando del tipo:
piccardi@anarres:~/truedoc/corso$ ls ???????
fdl.aux fdl.tex

se invece vogliamo vedere i file i cui nomi finiscono in c o in g potremo usare:


piccardi@anarres:~/truedoc/corso$ ls *[cg]
Struttura.log baseadm.log corso.log netadmin.log
Struttura.toc baseadm.toc corso.toc netadmin.toc

ringraziamenti.log
texput.log

mentre per selezionare i file PDF il cui nome inizia con una lettera maiuscola potremo usare:
piccardi@anarres:~/truedoc/corso$ ls [A-Z]*.pdf
Struttura.pdf

infine se ci interessano i file LaTeX il cui nome non inizia per lettera maiuscola potremo usare:
piccardi@anarres:~/truedoc/corso$ ls [^A-Z]*.tex
baseadm.tex corso.tex netadmin.tex
shell.tex
config.tex
fdl.tex
ringraziamenti.tex struttura.tex

Si tenga presente che il meccanismo del filename globbing opera nella modalit`a descritta,
sostituendo allespressione sulla riga di comando il suo risultato, per cui al comando verranno
passati come argomenti i nomi dei file che vi corrispondono (o il nome, se `e uno solo, e niente se
non ci sono risultati). Per cui se ad esempio si fosse usata la seguente riga di comando:
73

e se il nome `e in forma di pathname, cio`e contiene dei caratteri /, lespansione viene fatta sulle directory
corrispondenti.
74
questo significa che al programma sar`
a passato, invece di un singolo argomento, la lista dei nomi dei file
corrispondenti allespansione dei caratteri jolly.
75
attenzione per`
o al fatto che questo `e dei casi in cui la presenza di una localizzazione comportante un diverso
ordinamento alfabetico, come avviene per litaliano, pu`
o dar luogo a risultati diversi, nel seguito si far`
a riferimento
al comportamento di default, relativo al caso in cui LANG=C.

70

CAPITOLO 2. LA SHELL E I COMANDI


piccardi@anarres:~/truedoc/corso$ ls ???
Entries Repository Root

si sarebbe ottenuto un risultato forse inaspettato, dato che non riporta file di tre lettere. Il
risultato `e questo perche lunico nome di file di tre lettere presente nel caso dellesempio `e quello
della directory CVS, per cui dallespansione del filename globbing otteniamo una riga di comando
equivalente a ls CVS; quindi ci verr`
a stampato, secondo la sintassi di ls, il contenuto di tale
directory.
Il filename globbing e luso delle variabili di ambiente sono funzionalit`a molto utili, per`o
talvolta presentano degli inconvenienti; ad esempio se si volesse passare ad un comando come
argomento un file il cui nome contiene uno dei caratteri jolly, o il carattere $ usato per referenziare le variabili, si avrebbe il problema che la shell cercherebbe di espandere la relativa
espressione. Un inconveniente analogo ci sarebbe per i nomi dei file che contengono degli spazi:
dato che lo spazio viene usato per separare fra di loro gli argomenti, un tale nome verrebbe
spezzato in due con il risultato di passare al comando due argomenti invece di uno.
Per risolvere questi problemi esistono dei caratteri che permettono di disabilitare del tutto o
in parte le capacit`
a della shell di interpretare in maniera speciale altri caratteri. Uno di questi `e
la barra trasversa \ che anteposta ad un carattere qualsiasi ne disabilita linterpretazione, cos`
si pu`o usare un asterisco in un argomento indicandolo con \* o si pu`o utilizzare uno spazio
proteggendolo con \ o specificare la stessa barra trasversa con \\.76
Una modalit`
a alternativa `e quella che permette di specificare degli argomenti che vanno
considerati come una stringa letterale (risolvendo anche cos` il problema degli spazi) e per i quali
non si vuole che la shell effettui delle espansioni. Questo pu`o essere fatto in due modi, il primo,
che disabilita il filename globbing e linterpretazione degli spazi, `e quello di definire la stringa
racchiudendola fra virgolette (usando cio`e il carattere "), cos` che al suo interno si possano
usare spazi, asterischi e punti interrogativi. In questo modo per`o resta attiva lespansione di
eventuali variabili di shell tramite il carattere $; si pu`o eliminare anche questa se al posto delle
virgolette si usano gli apici singoli (cio`e il carattere ); in tal caso la stringa sar`a interpretata
in maniera assolutamente letterale.
Unaltra funzionalit`
a molto utile della shell `e quella che viene chiamata command expansion;
si pu`o cio`e usare come argomento sulla riga di comando il risultato ottenuto con unaltra riga
di comando. Per fare questo si hanno a disposizione due sintassi equivalenti; la prima prevede
che si racchiuda il comando da eseguire fra due apici inversi (usando cio`e il carattere ), la
seconda che si usi il costrutto $(comando); ad esempio se nel file elenco si `e scritto una lista di
file si potr`a effettuarne la cancellazione con una linea di comando come:
piccardi@anarres:~/truedoc/corso$ rm cat elenco
rm: cannot lstat pippo.tex: No such file or directory
rm: cannot lstat vecchio.tex: No such file or directory

che nel caso fallisce perche i file elencati non esistono. In questo caso quello che succede `e che la
shell esegue il comando racchiuso fra apici inversi, e mette il suo output sulla riga di comando,
come se lo si fosse scritto manualmente. Questo ci mette a disposizione un mezzo estremamente
potente per collegare fra loro i comandi: possiamo usare il risultato di uno di essi per generare
gli argomenti di un altro.
Simile alla command expansion `e la cosiddetta arithmetic expansion che permette di effettuare dei semplici calcoli numerici. Per farlo si usa una sintassi del tipo di $((espressione)),
dove con espressione si indica una espressione aritmetica da calcolare;77 il risultato del calcolo
sar`a riportato direttamente come argomento, e potremo avere un qualcosa del tipo:
76

ed anche, come accennato in precedenza, proteggere il carattere di ritorno a capo, che di norma viene usato
come terminazione della riga di comando.
77
lespressione usa numeri interi e gli stessi operatori aritmetici usati dal linguaggio C (come +, -, * e /), la
descrizione completa di tutti gli operatori e della sintassi delle espressioni aritmetiche `e disponibile nella pagina
di manuale, alla sezione ARITHMETIC EVALUATION.

2.1. LINTERFACCIA A LINEA DI COMANDO.

71

piccardi@hain:~/truedoc/corso$ echo $((5+7))


12

e considerato che allinterno dellespressione si pu`o usare sia la variable expansion che la command expansion, si capisce anche come anche da questa espansione si possano trarre ulteriori
potenzialit`
a di utilizzo.
Lultima funzionalit`
a della shell che prenderemo in esame `e quella della storia dei comandi, la
cosiddetta history, che permette di accedere, usando i tasti di freccia in alto e in basso, alle linee
di comando eseguite in precedenza. La bash infatti mantiene in memoria le linee di comando che
ha eseguito e poi quando esce salva lelenco in un apposito file.78 La shell di default mantiene in
memoria un massimo di 500 comandi, ma questo valore pu`o essere modificato specificando un
nuovo default nella variabile HISTSIZE.79
Diventa cos` possibile non solo rieseguire i comandi precedenti, navigando avanti ed indietro
lungo la storia con i tasti di freccia in alto e in basso, ma `e anche possibile sia effettuare un
ricerca incrementale nella history utilizzando la combinazione C-r seguita dal testo della ricerca
(che comparir`
a allinterno di un apposito prompt). Inoltre con luso del carattere ! diventa
possibile richiamare una specifica voce sulla riga di comando stessa, indicandola sia per numero
che tramite le prime lettere, secondo le modalit`a illustrate in tab. 2.6,80 utilizzando quella che
viene chiamata history expansion.
Sintassi
!!
!n
!-n
!string
!?string
^string^subst

Significato
richiama il comando pi`
u recente.
richiama il comando numerato n nella history.
richiama il comando precedente di n posizioni nella history.
richiama lultimo comando eseguito che inizia per string.
richiama lultimo comando eseguito che contiene la stringa string.
richiama il comando precedente sostituendo string con subst.

Tabella 2.6: Le modalit`


a di utilizzo della history expansion.

Con il comando history inoltre si pu`o visualizzare lintero contenuto della history, in cui
ogni riga `e numerata progressivamente, con il valore che si pu`o usare con ! per richiamarla.
Cos` ad esempio per richiamare righe di comando precedenti si potr`a fare qualcosa come:
piccardi@anarres:~/truedoc/corso$ which chown
/bin/chown
piccardi@anarres:~/truedoc/corso$ ls -l $(!wh)
ls -l $(which chown)
-rwxr-xr-x
1 root
root
19948 Aug 19 03:44 /bin/chown

mentre se si vuole usare direttamente il numero, si potr`a verificarlo con:


piccardi@anarres:~/truedoc/corso$ history
...
523 ls [^A-Z]*.tex
524 which chown
525 ls -l $(which chown)
526 history

e richiamare un comando con:


piccardi@anarres:~/truedoc/corso$ !526
...
78
di default si tratta del file .bash_history nella home dellutente, ma questo pu`
o essere cambiato in qualunque
altro file specificato dalla variabile HISTFILE.
79
si pu`
o anche indicare una dimensione massima in righe del file .bash_history con la variabile HISTFILESIZE.
80
che, come si pu`
o vedere, prevede anche delle operazioni piuttosto sofisticate.

72

CAPITOLO 2. LA SHELL E I COMANDI


523
524
525
526
527

ls [^A-Z]*.tex
which chown
ls -l $(which chown)
history
history

Si tenga infine conto che il carattere !, come mostrato nel primo esempio, viene espanso
quando usato nella linea di comando, e per usarlo in maniera letterale occorre o proteggerlo con
la barra rovesciata, o metterlo in una stringa delimitata da apici singoli. Per maggiori dettagli
riguardo tutto largomento si pu`
o fare riferimento alla sezione HISTORY EXPANSION del manuale
della shell.
Concludiamo questa sezione relativa alla funzionalit`a di base della shell con una panoramica
pi`
u estesa sulluso interattivo della riga di comando, ed in particolare sulle cosiddette scorciatoie
da tastiera disponibili. Dato che la gran parte di queste attengono proprio alluso della history
ci `e parso opportuno trattarle dettagliatamente a questo punto.
Combinazione
C-r
C-a
C-e
C-u
C-k
C-y
M-b
M-f
C-l
Tab

Significato
ricerca incrementale nella history.
spostamento a inizio riga.
spostamento a fine riga.
cancellazione da posizione corrente a inizio riga.
cancellazione da posizione corrente a fine riga.
inserisce lultimo testo cancellato.
spostamento indietro di una parola.
spostamento avanti di una parola.
ripulitura e posizionamento in testa allo schermo.
esegue lautocompletamento del testo corrente.

Tabella 2.7: Le scorciatoie da tastiera per lediting di linea.

Abbiamo visto in sez. 2.1.2 come alcune combinazioni di tasti (vedi tab. 2.1) siano collegate,
grazie allinterfaccia dei terminali, allemissione di segnali o altre funzionalit`a che consentono di
controllare il comportamento dellinterfaccia a riga di comando. La shell stessa poi supporta,
come per il C-r di cui abbiamo appena parlato, luso di altre combinazioni di tasti che consentono
di effettuare modifiche sulla riga di comando che si sta scrivendo; ad esempio con C-a si pu`o
andare a inizio riga e con C-e a fine riga. Si sono riportate le principali combinazioni in tab. 2.7,81
per lelenco completo si pu`
o consultare la sezione Readline Command Names82 della pagina di
manuale della shell.
Una di queste funzionalit`
a per`
o, quella dellautocompletamento con luso del tasto di tabulazione, merita di essere illustrata a parte, in quanto costituisce una delle caratteristiche pi`
u
avanzate della bash. La shell infatti supporta nativamente il completamento dei comandi e
dei nomi dei file che si scrivono sulla riga di comando. Basta cio`e inserire le prime lettere di
un comando e premere il tabulatore per avere il completamento del nome del comando, o, se
c`e ambiguit`a con pi`
u completamenti possibili, il completamento della parte non ambigua; in
questultimo caso inoltre, premendo il tabulatore due volte di fila, si potr`a avere la lista dei
completamenti possibili.
Questo meccanismo funziona di default con i programmi per la prima parola scritta sulla
riga di comando, e con i nomi dei file per le parole successive, ma la vera potenza della shell `e
che lautocompletamento `e completamente programmabile (si consulti la sezione Programmable
Completion della pagina di manuale) e pu`o essere esteso nelle modalit`a pi`
u varie. La gran parte
81

in questo caso con M si intende il tasto alt, la notazione verr`


a trattata pi`
u dettagliatamente in sez. 2.3.2.
queste funzionalit`
a derivano in realt`
a da una libreria di gestione chiamata appunto readline che consente di
operare in maniera generica su una riga di terminale, spostandosi modificando e cancellando parti utilizzando una
serie di combinazioni di tasti che possono essere configurate nei dettagli (torneremo su questo in sez. 2.1.6) ma
che di default usano le stesse convenzioni delleditor emacs che illustreremo brevemente in sez. 2.3.2.
82

2.1. LINTERFACCIA A LINEA DI COMANDO.

73

delle distribuzioni definisce una serie di queste estensioni nel file /etc/bash_completion, usando
il quale diventa possibile ottenere completamenti, anche molto complessi, sui possibili argomenti
e opzioni di vari comandi.

2.1.4

La redirezione dellI/O

Si `e dedicata una sezione separata a questa funzionalit`a della shell per la sua particolare rilevanza,
dato che `e proprio la redirezione delle operazioni di I/O che ci permette di costruire quella catena
di montaggio di cui abbiamo parlato in sez. 2.1.1, che consente di combinare le capacit`a dei vari
comandi ed ottenere leffettiva potenza della riga di comando.
Come accennato in sez. 2.1.2 in un sistema unix-like i programmi si aspettano di avere disponibili e gi`
a aperti tre file: standard input, lo standard output e lo standard error. Seguendo
una convenzione comune, i comandi si aspettano di ricevere i loro dati in ingresso sullo standard
input (e non da uno specifico file o dispositivo, a meno che questo non sia previsto come argomento), mentre scrivono i loro dati in uscita sullo standard output. Lo standard error in caso di
operazioni regolari non viene mai usato; su di esso vengono scritti solo gli eventuali messaggi di
errore.
Quando si usa linterfaccia a riga di comando standard input, standard output e standard
error vengono aperti nella procedura di accesso al sistema e sono tutti associati al terminale
su cui viene eseguita la shell. Dato che, come accennato in sez. 1.3.1, i file aperti vengono
ereditati dai processi figli, normalmente quando la shell lancia un comando questi file restano
gli stessi anche per lui, che pertanto potr`a ricevere i dati in ingresso dalla tastiera e scrivere i
suoi risultati sullo schermo. Gli eventuali errori vanno anchessi sul terminale e compaiono sullo
schermo insieme ai dati in uscita, ma questo avviene solo perche si `e usato lo stesso file dello
standard output, in generale, ad esempio quando si redirige lo standard output come vedremo fra
poco, non `e cos`, essendo i due file distinti.
La redirezione dellI/O `e la capacit`a della shell di modificare i file a cui fanno riferimento
lo standard input, lo standard output e lo standard error nel processo figlio con cui esegue il
comando prima di lanciarlo, cos` che esso possa ricevere dati in ingresso o scrivere dati in uscita
ed errori su degli altri file e non sul terminale.
Per capire meglio il significato della redirezione prendiamo come esempio il comando cat;
questo `e un comando elementare che serve a leggere uno o pi`
u file in ingresso, passati come
argomenti, e a scriverne il contenuto sullo standard output. Se non si specifica nessun file come
argomento il comando legge di default dallo standard input, per cui se eseguiamo:
piccardi@anarres:~$ cat

ci troveremo in una situazione in cui il comando si blocca in attesa che scriviamo qualcosa sul
terminale. Se lo facciamo scrivendo prova seguito da invio otterremo qualcosa del tipo:
piccardi@anarres:~$ cat
prova
prova

dove il comando reagisce allinvio ristampando sul terminale quanto appena scritto e attendendo
nuovi dati in ingresso.83
Usato cos` il comando non `e di grande utilit`a, dato che in genere non serve a molto scrivere
qualcosa sulla tastiera per vederselo ristampare sul terminale ad ogni riga; per`o se vogliamo
vedere il contenuto di un file il modo pi`
u immediato per farlo `e con un comando del tipo:
83
questo avviene in quanto sul terminale si ha quello che si chiama I/O bufferizzato ed i dati in ingresso vengono
letti e scritti una riga alla volta, per cui alla pressione dellinvio verr`
a letto quanto appena scritto, ed il comando
lo riscriver`
a sullo standard output; per uscire dal comando occorre nel caso indicare che la lettura `e conclusa, ad
esempio inviando un end-of-file sullinput con C-d, o interrompere il programma con un segnale.

74

CAPITOLO 2. LA SHELL E I COMANDI


piccardi@anarres:~$ cat /etc/profile
# /etc/profile: system-wide .profile file for the Bourne shell (sh(1))
# and Bourne compatible shells (bash(1), ksh(1), ash(1), ...).
PATH="/usr/local/bin:/usr/bin:/bin:/usr/bin/X11:/usr/games"
...

dato che il comando legger`


a il contenuto del file e lo riverser`a sullo standard output, ed essendo
questultimo collegato al terminale, lo si vedr`a sullo schermo.
Fin qui lutilit`
a del comando `e relativa, dato che programmi per visualizzare il contenuto del
file ce ne sono altri, magari pi`
u sofisticati come more e less, che permettono anche di vedere il
file un pezzo alla volta, e andare avanti e indietro, senza scrivere tutto il file in un colpo solo sul
terminale, con linizio che poi va perso nello scorrimento delle scritte sullo schermo. Il comando
comunque prende alcune opzioni per facilitare la visualizzazione, come -n che stampa un numero
progressivo per ogni riga, -t che stampa i tabulatori come ^I, -v che visualizza i caratteri non
stampabili, e -E che scrive un $ alla fine di ogni riga. La descrizione completa si trova al solito
nella pagina di manuale, accessibile con man cat.
La vera utilit`
a di cat, il cui scopo in realt`a non `e quello di mostrare il contenuto di un
file, emerge solo quando esso viene unito alla capacit`a della shell di modificare i file associati a
standard input, standard output e standard error, cio`e con la redirezione dellI/O. Per fare questo
la shell riconosce sulla riga di comando alcuni caratteri che svolgono la funzione di operatori, detti
appunto operatori di redirezione. I due operatori pi`
u elementari sono < e > che permettono
rispettivamente di redirigere lo standard input e lo standard output sul file specificato dallutente
dopo loperatore.84
Cominciamo allora a vedere come si usano di questi due operatori. Una modalit`a alternativa
di stampare il contenuto di un file con cat `e utilizzare un comando del tipo:
piccardi@anarres:~$ cat < /etc/profile
# /etc/profile: system-wide .profile file for the Bourne shell (sh(1))
# and Bourne compatible shells (bash(1), ksh(1), ash(1), ...).
...

in cui, invece di leggere un file specificato come argomento sulla riga di comando, si legge dallo
standard input 85 che per`
o in questo caso, invece di essere associato al terminale, `e stato rediretto
dalloperatore < sul file /etc/profile.
La redirezione delloutput avviene in maniera identica associando con > lo standard output
ad un file. Ad esempio si potr`
a copiare il contenuto del file pippo sul file pippo2 utilizzando un
comando del tipo:
cat pippo > pippo2
dato che con questa redirezione invece che sul terminale il contenuto di pippo sar`a scritto su
pippo2.
Fin qui niente di particolarmente utile, dato che nel primo caso si sarebbe potuto stampare
direttamente il file, mentre nel secondo si sarebbe potuto usare direttamente cp. Per`o, e qui
emerge anche la vera utilit`
a del comando cat, con cp si pu`o solo copiare il contenuto di un file
84

in realt`
a si pu`
o effettuare la redirezione di un qualunque file descriptor usato da un programma, specificando il
suo valore prima delloperatore, questo comporta a esempio che per redirigere lo standard error si usa loperatore
2> dato che esso `e associato al file descriptor 2, ma si potrebbe utilizzare allo stesso modo 3> per redirigere
il file descriptor 3; i dettagli sulle varie forme di redirezione possono trovare nella pagina di manuale alla sezione
REDIRECTION.
85
il comando cat infatti non ha argomenti.

2.1. LINTERFACCIA A LINEA DI COMANDO.

75

su un altro, ma cosa succede invece se con cat specifichiamo come argomenti una serie di file da
leggere e poi redirigiamo luscita su di un altro file?
Per quanto abbiamo detto in questo caso cat legger`a il contenuto di ciascuno dei file passati
come argomenti, riscrivendo il tutto sullo standard output. Avendo rediretto lo standard output
su un altro file il risultato sar`
a che questultimo avr`a come contenuto la concatenazione del
contenuto di tutti i file passati come argomenti a cat.86
Cos` se si `e spezzato un file di grosse dimensioni in una serie di file pi`
u piccoli (ad esempio
per scriverlo su una serie di floppy) si potr`a ricostruirlo con un semplice comando del tipo:
cat pezzo1 pezzo2 pezzo3 ... > filecompleto
La redirezione dello standard input `e invece molto utile con i programmi che richiedono
limmissione dei dati da tastiera, specie quando questi vengono eseguiti in uno script. Una
volta definiti quali dati sono necessari infatti li si potranno scrivere in un file, e farli leggere al
programma semplicemente con la redirezione dello standard input.
Si tenga conto che quando si effettua la redirezione dello standard output se il file su cui la si
esegue non esiste esso viene creato, mentre se esiste il suo contenuto viene sovrascritto;87 occorre
pertanto stare molto attenti a non cancellare dei dati. Per questo `e bene essere consapevoli della
modalit`a con cui il meccanismo funziona, se infatti si pensasse di aggiungere dei dati in fondo
ad un file con un comando del tipo di:
cat file addendum > file
si potrebbe andrebbe incontro ad una sgradita sorpresa.
Quello che avviene con la redirezione infatti `e che se un file esiste questo prima viene troncato,88 e poi ci viene scritto sopra. Il che comporta che nellesempio in questione cat, alla
lettura di file, lo troverebbe vuoto. Nellesempio citato cat `e in grado di rilevare la situazione
anomala e stampare un errore, ma non `e detto che altri programmi (o altre versioni di cat) siano
in grado di farlo; se ad esempio si fosse usato less (che usato con la redirezione si comporta
esattamente come cat) si sarebbe perso il contenuto originale di file.
Per ovviare a questo problema `e disponibile un altro operatore di redirezione, >>, che
redirige lo standard output su di un file eseguendo per`o la scrittura in append , una modalit`
a
di scrittura speciale in cui i dati vengono aggiunti in coda a quelli gi`a presenti. In questo modo
si pu`o realizzare laggiunta di informazioni alla fine del file file con il comando:
cat addendum >> file
Si tenga presente avere eseguito la redirezione dello standard output non comporta il fatto
che un programma a questo punto non scriva pi`
u nulla sul terminale, si ricordi infatti che gli
errori vengono scritti sullo standard error, che essendo un file diverso non verr`a rediretto; se
pertanto si verificano errori nella esecuzione di un comando i relativi messaggi continueranno ad
essere stampati sul terminale. Dato che anche i messaggi di errore possono essere interessanti,
si potr`a effettuare la redirezione anche per lo standard error utilizzando loperatore 2>,89 cos`
per salvare gli errori di un comando si dovr`a usare qualcosa del tipo:
86

e infatti il nome del comando, non proprio intuitivo, sta per conCATenate file.
ricordiamo che si pu`
o bloccare questo comportamento indicando alla shell di segnalare un errore con set -C.
88
esiste una apposita funzione di sistema (per i dettagli si pu`
o consultare sez. 5.2.3 di [GaPiL]) che consente di
accorciare a piacere la dimensione di un file; per evitare sovrascritture parziali di contenuti gi`
a esistenti effettuando
una redirezione il file di destinazione viene preventivamente troncato a lunghezza nulla.
89
la sintassi delluso del numero di file descriptor prima delloperatore funziona anche per gli altri operatori di
redirezione, questo ad esempio significa che si potr`
a anche effettuare la redirezione in append dello standard error
utilizzando come operatore 2>>.
87

76

CAPITOLO 2. LA SHELL E I COMANDI

comando 2> errori.txt


Se poi si vuole eseguire la redirezione sia dello standard output che standard error baster`a
redirigerli entrambi. Fintanto che si utilizzano due file diversi baster`a semplicemente utilizzare
gli operatori visti finora specificati in un ordine qualsiasi, si presenta per`o un problema qualora
si volesse effettuare la redirezione di entrambi sullo stesso file, perche usando due redirezioni
distinte questo verrebbe scritto attraverso due file descriptor indipendenti.90 Per questo motivo
viene fornito un operatore diverso, &>,91 che permette di effettuare questa operazione, cos` se
si vogliono scrivere sia i risultati che gli errori di un comando sullo stesso file si potr`a usare
qualcosa del tipo:
comando &> output.txt
La redirezione di ingresso ed uscita, per quanto utile, `e per`o di gran lunga meno significativa
rispetto ad una terza forma di redirezione, detta pipelining, che viene realizzata tramite lopera` questa funzionalit`
tore |. E
a infatti quella che permette di eseguire quella concatenazione dei
comandi a cui abbiamo accennato in sez. 2.1.1.
Loperatore | consente di collegare lo standard output del comando che lo precede con lo
standard input del comando che lo segue. Questo viene fatto utilizzando una pipe, un servizio
di comunicazione fra processi fornito dal kernel che, come indica il nome stesso, costituisce una
sorta di conduttura di collegamento fra i due comandi.92 In questo modo diventa possibile
fornire come dati in ingresso ad un comando quelli prodotti in uscita da un altro. Si possono
cos` lanciare in sequenza una serie di comandi in cui ciascuno elabora i risultati del precedente,
effettuando combinazioni ed elaborazioni anche molto complesse.
Come esempio proviamo a contare in quanti file di testo `e suddiviso il contenuto di queste
dispense, se ricordiamo che lopzione -n del comando cat consente di numerare le righe di un
file, potremo ottenere una lista numerata con:
piccardi@ellington:~/truedoc/corso$ ls *.tex | cat -n
1
advadmin.tex
2
appendici.tex
3
config.tex
4
corsoFSE.tex
5
corso.tex
6
netadmin.tex
7
netbase.tex
8
netdns.tex
9
netinter.tex
10
netlpi.tex
11
ordadmin.tex
12
ringraziamenti.tex
13
shell.tex
14
stradmin.tex
15
struttura.tex

mandando la lista dei file generata da ls in ingresso a cat.


90
il risultato porterebbe a delle sovrascritture, la problematica `e piuttosto sottile e se ne possono afferrare tutte
le conseguenze solo con una conoscenza dettagliata delle modalit`
a con cui vengono gestiti file e file descriptor in
un sistema unix-like, largomento va al di l`
a di quanto sia possibile affrontare in questo testo, chi fosse interessato
pu`
o consultare il capitolo 6 di [GaPiL].
91
esistono diverse sintassi equivalenti per effettuare la stessa operazione, riportate in tab. 2.8
92
una pipe `e del tutto analoga alle fifo incontrate in sez. 1.2.1, quello che un processo scrive su un capo, viene
letto da un altro processo sullaltro capo; solo che una pipe non `e associata ad un oggetto sul filesystem, ma esiste
solo come file descriptor accessibile dallinterno dei processi interessati.

2.1. LINTERFACCIA A LINEA DI COMANDO.

77

La disponibilit`
a questa funzionalit`a comincia a farci intuire quali possono essere le capacit`
a
intrinseche della riga di comando; ad esempio non `e pi`
u necessario dover inserire in tutti i
comandi una opzione per ordinare in una qualche maniera i risultati prodotti in uscita, basta
inviare questi ultimi con una pipe al programma sort, il cui solo scopo `e quello di effettuare
riordinamenti nelle modalit`
a pi`
u varie.
Comando
cmd < file
cmd > file
cmd >> file
cmd 2> file
cmd1 | cmd2
cmd > file 2>&1
cmd >& file
cmd &> file
cmd1 2>&1 | cmd2
cmd <> file

Significato
redirige lo standard input: legge linput del comando cmd
dal file file.
redirige lo standard output: scrive il risultato del
comando cmd sul file file.
redirige lo standard output: scrive il risultato del
comando cmd accodandolo al contenuto del file file.
redirige lo standard error : scrive gli errori del comando
cmd sul file file.
pipelining: redirige lo standard output del comando cmd1
sullo standard input del comando cmd2.
redirige lo standard output e lo standard error : scrive
errori e risultati del comando cmd sul file file.
stesso effetto del precedente.
stesso effetto del precedente.
redirige lo standard output e lo standard error del
comando cmd1 sullo standard input del comando cmd2.
redirige standard input e standard output sul file file.

Tabella 2.8: Principali modalit`


a di redirezione.

Vedremo in sez. 2.2 molti altri esempi di come il pipelining pu`o essere sfruttato per costruire
delle vere e proprie catene di montaggio in cui si ottiene un risultato finale attraverso la concatenazione di molti comandi, concludiamo questa sezione riportando in tab. 2.8 un riassunto delle
principali modalit`
a di redirezione utilizzate nella shell, comprese alcune delle pi`
u esoteriche che
permettono di redirigere pi`
u file; per una trattazione completa si consulti la pagina di manuale,
alla sezione REDIRECTION.

2.1.5

Scripting elementare

Una delle capacit`


a fondamentali della shell `e che si possono inserire, come avveniva per i file
.bat del DOS, delle sequenze di comandi in un file per farli eseguire direttamente senza doverli
riscrivere tutte le volte. Ma se questo `e pi`
u o meno tutto quello che si pu`o fare con il DOS,
il grande vantaggio di una shell unix che `e si ha a disposizione un vero e proprio linguaggio di
programmazione con tanto di variabili e direttive di iterazione, condizionali, ecc. che permette
di effettuare anche compiti di notevole complessit`a. E nonostante che come linguaggio di programmazione sia poco elegante e piuttosto limitato, lo shell scripting viene comunque utilizzato
ampiamente, data la sua immediatezza, per automatizzare una gran quantit`a di operazioni per
le quali non vale la pena ricorrere ad un linguaggio di pi`
u alto livello.
` per questo motivo che la shell, anche se finora ne abbiamo parlato solo come del programma
E
che implementa linterfaccia a riga di comando, `e in realt`a uno dei componenti essenziali per far
funzionare il sistema,93 e non solo dal punto di vista dellinterfaccia utente: tutti i meccanismi
di avvio del sistema infatti, come vedremo in sez. 5.3.5, usano proprio degli script di shell per
eseguire le loro operazioni.
La descrizione dettagliata della shell come linguaggio di programmazione va al di l`a dello
scopo di questo testo, le sue caratteristiche principali si trovano comunque nella sezione SHELL
93

si noti infatti che, come richiesto dal FHS trattato in sez. 1.2.3, essa deve trovarsi sotto /bin, dato che `e
essenziale per lavvio del sistema.

78

CAPITOLO 2. LA SHELL E I COMANDI

GRAMMAR della pagina di manuale, ed un ottima risorsa per quanti vogliano approfondirlo `e
[AdvBash]. Quello che `e importante sottolineare qui `e che la shell non solo pu`o essere invocata
in maniera interattiva, quando `e associata ad un terminale ed utilizzata dagli utenti per dare
comandi, ma pu`
o anche essere lanciata non interattivamente facendole eseguire direttamente
quello che appunto si chiama uno script. In questo caso la si invoca come un qualunque altro
comando, e prende come argomento il file dello script da eseguire, con una sintassi del tipo bash
script.
In realt`a gli script possono sfruttare una funzionalit`a peculiare del cosiddetto link-loader 94
di Linux (che si trova comunque in tutti i sistemi unix-like), che oltre ad eseguire i programmi
nel formato binario standard95 `e in grado di eseguire anche gli script, che vengono trattati
esattamente allo stesso modo. Questi sono identificati dal link-loader come file di testo dotati
di permesso di esecuzione la cui prima riga `e nella forma:
#!/bin/bash
in cui cio`e si trovano i caratteri #! seguiti dal pathname di un programma che faccia da
interprete. In tal caso il link-loader lancer`a automaticamente il programma interprete (con le
opzioni che si possono specificare sempre sulla prima riga del file) dandogli come argomento il
nome file stesso, cos` che questo esegua le istruzioni in esso contenute.
Dato che per la shell e per tutti i linguaggi di scripting che usano questa funzionalit`a (come il
Python o il Perl) il carattere # indica linizio di una riga di commento, quando si vuole creare uno
script baster`a scrivere un file di testo contenente tutte le istruzioni necessarie che inizi con questa
riga (che verr`a ignorata nellinterpretazione dei comandi), e poi renderlo eseguibile.96 In questa
maniera uno script sar`
a del tutto equivalente ad un comando binario, ed oltre ad eseguirlo come
tale la shell provveder`
a anche a passargli gli argomenti scritti sulla riga di comando, esattamente
come avrebbe fatto se si fosse trattato di un eseguibile compilato.
Oltre alla sintassi di base illustrata in sez. 2.1.3, che resta sempre disponibile, quando si
scrivono degli script di shell si fa spesso ricorso a istruzioni e costrutti sintattici il cui uso `e
poco comune sulla riga di comando, sia perche essi sono attinenti a funzionalit`a pi`
u complesse
che sono poco indicate per un uso interattivo, o perche dipendono da funzionalit`a direttamente
legate alluso allinterno degli script.
Una sintassi poco utilizzata nelluso interattivo `e quella che permette di eseguire pi`
u comandi
sulla stessa linea; cosa che pu`
o essere fatta in tre modalit`a diverse. La prima modalit`a prevede
che i singoli comandi siano separati fra di loro tramite il carattere ;. In tal caso si tratta
semplicemente di scrivere su una riga unica quello che altrimenti si scriverebbe su linee diverse,
usando il ; per separare la fine di un comando dellinizio del successivo. In questo caso i
vari comandi saranno eseguiti in sequenza da sinistra a destra come se al posto del ; si fosse
premuto invio.
Questa sintassi `e di scarsa utilit`
a sulla linea di comando, se non per eseguire pi`
u comandi
in sequenza, senza dover stare ad attendere che ciascuno di essi finisca per poter scrivere il
successivo. Ha per`
o una sua utilit`
a specifica negli script dove alcune direttive di programmazione
(come i condizionali che vedremo a breve) usano come parametro una linea di comando, la cui
terminazione pu`
o essere resa esplicita con questo metodo.97
94

il link-loader `e un programma speciale, che non `e eseguibile in quanto tale (ed infatti si trova sotto /lib), ma
che viene utilizzato dalla chiamata al sistema che manda un esecuzione un nuovo programma nel momento in cui
questo viene caricato in memoria; `e compito del link-loader eseguire una serie di operazioni, come il collegamento
alle librerie condivise (torneremo su questo in sez. 3.1.2), e appunto la gestione degli script.
95
in Linux esistono sostanzialmente due formati binari, quello chiamato a.out, usato nei kernel delle serie fino
alla 1.2 ed attualmente deprecato (e totalmente inutilizzato da anni), e il formato ELF, usato nelle serie successive.
96
renderlo eseguibile in questo caso significa attivarne il permesso di esecuzione con chmod +x, dal punto di
vista del contenuto del file non cambia assolutamente nulla, questo resta un normale file di testo.
97
questo `e ad esempio il costrutto usato nel condizionale presente nellesempio di /etc/profile illustrato pi`
u
avanti.

2.1. LINTERFACCIA A LINEA DI COMANDO.

79

Una seconda modalit`


a di esecuzione multipla `e quella in cui i comandi che si vogliono eseguire
vengono separati dalloperatore &&, che assume il significato di AND logico. In questo caso il
comando successivo alloperatore verr`a eseguito soltanto se il precedente non ha avuto errori.
In caso di errori la catena viene immediatamente interrotta. Questo consente allora di eseguire
un secondo comando solo se il primo ha avuto successo; luso di questa sintassi `e comune negli
script per verificare se un certo file esiste e in caso affermativo eseguire un comando.
Una terza modalit`
a di esecuzione multipla prevede che i diversi comandi sulla stessa linea
vengano separati dalloperatore ||, che assume il significato di OR logico. In questo caso si avr`
a
che il comando successivo alloperatore verr`a eseguito soltanto se il precedente ha fallito. Questo
consente di eseguire in alternativa due comandi; in genere lo si usa per eseguire le operazioni da
effettuare solo in caso di errori.
Queste due ultime modalit`
a fanno riferimento, per stabilire se un comando ha avuto o meno
successo, ad una caratteristica comune di tutti i programmi che una volta eseguiti riportano
(nel caso specifico alla shell che li ha lanciati) uno stato di uscita che serve ad indicare se le
operazioni sono state concluse correttamente.98 La convenzione `e che un valore nullo (cio`e 0)
significa il successo delle operazioni, mentre un valore non nullo (in genere 1) indica che c`e stato
un errore. Inoltre se il programma non si `e concluso spontaneamente ma `e stato interrotto da
un segnale la shell assegna al codice di uscita il valore di 128 + n, dove n `e il numero del segnale
(ed ovviamente il comando viene considerato fallito).
Tutte le volte che un programma viene eseguito la shell riceve questa informazione, ed `e con
un controllo automatico su questi valori che, nelluso dei operatori && e ||, vengono prese le
decisioni sullesecuzione o meno dei vari comandi che la shell concatena tramite essi.
La presenza di un codice di uscita `e molto importante, specie per gli script, che possono
usare questa informazione per capire se ci sono stati problemi nellesecuzione di un comando.
Per questo la shell, nel ricevere lo stato di uscita di un comando, lo memorizza nella variabile
speciale ?. In questo modo nella riga di comando successiva o in uno script diventa possibile
controllare lo stato di uscita dellultimo comando eseguito facendo riferimento ad essa con $?.
Si deve inoltre precisare che tutte le volte che si concatenano pi`
u comandi, sia con gli operatori condizionali appena visti, che con una pipe, che con luso del ;, alla fine dellesecuzione
della intera riga di comando nella variabile ? verr`a riportato il codice di uscita dellultimo
programma eseguito.
Vediamo allora un esempio di come utilizzare questa funzionalit`a, potremo verificare che:
piccardi@anarres:~/truedoc$ ls
CVS README corso internet-server lucidi
piccardi@anarres:~/truedoc$ echo $?
0
piccardi@anarres:~/truedoc$ ls licidi
ls: licidi: No such file or directory
piccardi@anarres:~/truedoc$ echo $?
1

samba

e nel primo caso, in cui il comando `e stato eseguito correttamente, il valore della variabile ? `e
0, mentre nel secondo, non esistendo il file licidi, si ha un errore ed il valore `e 1.
La variabile ? `e una delle variabili speciali della shell (descritte nella sezione Special
Parameters della pagina di manuale), queste variabili vengono mantenute direttamente dalla
shell stessa (non ha cio`e senso assegnarle direttamente come visto in sez. 2.1.3) che vi memorizza
il valore di alcuni parametri interni. Lelenco delle principali variabili speciali `e riportato in
tab. 2.9.
Alcune di queste variabili speciali sono ad uso specifico degli script; ad esempio quando si
lancia uno script con degli argomenti con $# si ottiene il numero degli stessi, con $1 il primo
98

abbiamo gi`
a incontrato questa problematica in sez. 1.3.2, quando abbiamo trattato degli zombie.

80

CAPITOLO 2. LA SHELL E I COMANDI


Variabile
#
*

@
?
$
!
0
-

Contenuto
il numero degli argomenti passati ad uno script.
la lista degli argomenti. Se espansa fra virgolette come "$*" `e equivalente ad una unica stringa formata dal
contenuto dei singoli argomenti separato da spazi (o dal
carattere di separazione specificato in IFS).
la lista degli argomenti. Se espansa fra virgolette come
"$@" `e equivalente alla lista dei singoli argomenti.
il codice di uscita dellultimo comando eseguito.
il PID della shell.
il PID del programma in background che `e stato eseguito
per ultimo.
il nome della shell o dello script.
la lista delle opzioni con cui `e stata invocata o che sono
attive per la shell corrente.

Tabella 2.9: Le principali variabili speciali della shell.

` inoltre possibile ottenere una stringa contenente tutti gli


argomento, con $2 il secondo, ecc. E
argomenti con $*, mentre con $@ si ottiene una lista.99 Per capire meglio come si usano facciamo
un esempio, consideriamo allora il seguente script:
#! /bin/sh
echo "Questo script ha $# argomenti"
echo "Argomento n.1 $1, n.2 $2, ecc."
echo "linsieme degli argomenti: $@"

in cui si utilizzano le variabili speciali relative al numero di argomenti, al primo ed al secondo


argomento ed alla lista completa; se lo si esegue passandogli tre argomenti si otterr`a come
risultato:
piccardi@ellington:~$ ./prova.sh arg1 arg2 arg3
Questo script ha 3 argomenti
Argomento n.1 arg1, n.2 arg2, ecc.
linsieme degli argomenti: arg1 arg2 arg3

Uno script di shell `e per`


o qualcosa di pi`
u della semplice scrittura su un file di una sequenza
di righe di comando; la shell supporta infatti anche una serie di istruzioni che consentono di
creare costrutti sintattici complessi, propri di un vero linguaggio di programmazione. Di questi
illustreremo solo i pi`
u significativi, come accennato lelenco completo `e nella sezione SHELL
GRAMMAR della pagina di manuale.
Abbiamo visto come i due operatori && e || consentano di effettuare una esecuzione
condizionata di un comando a seconda dello stato di uscita del precedente. La shell consente
per`o anche una costruzione pi`
u esplicita e completa delle esecuzioni condizionali, basandosi
sulluso dellistruzione if; la sua forma generica `e:
if condition_cmd;
command
...
else
command
...
fi
99

then

la differenza fra $* e $@ pu`


o sembrare non significativa, e se si stampano le due variabili con echo non se
ne vedr`
a nessuna; in realt`
a questa `e fondamentale negli script, infatti $* nelle istruzioni usate negli script viene
considerata come ununica stringa, mentre $@ viene espansa in una lista, costituita da tanti elementi quanti sono
gli argomenti passati allo stesso; questo comporta ad esempio che nel caso si usi la prima in una istruzione for si
avr`
a un solo ciclo, mentre con la seconda si avranno tanti cicli quanti sono gli argomenti.

2.1. LINTERFACCIA A LINEA DI COMANDO.

81

In questo caso in genere non si usa una singola riga di comando in quanto la sintassi richiesta
prevede luso di pi`
u istruzioni, combinate opportunamente. In particolare lesempio precedente
ci mostra come dopo lif iniziale si debba scrivere il comando il cui stato di uscita viene a
costituire la condizione da controllare,100 seguito dallistruzione then. Detto comando viene
sempre eseguito ed a seconda del suo risultato verranno eseguiti la lista di comandi inseriti dopo
listruzione then se questo ha successo (cio`e riporta un valore di uscita nullo) o quelli scritti
dopo listruzione else se questo fallisce (cio`e riporta un valore di uscita non nullo).101 Il blocco
condizionale deve sempre essere terminato esplicitamente con listruzione fi. Luso di else
`e opzionale, se non ci sono alternative si possono specificare solo i comandi da eseguire se il
comando ha successo fra then e fi.
La precedente sintassi pu`
o essere resa ancora pi`
u complessa in quanto `e possibile realizzare
blocchi condizionali annidati sostituendo listruzione else con listruzione elif. Listruzione `e
sostanzialmente identica ad if, e consente di eseguire come alternativa, al posto dei comandi
posti dopo listruzione else, un ulteriore blocco condizionale, con la stessa sintassi appena
illustrata, introdotto dallelif invece che da un if.
Oltre allesecuzione condizionata di blocchi di istruzioni, la shell permette di eseguire cicli
condizionali tramite delluso delle due istruzioni while e until. Entrambe le istruzioni permettono la ripetizione di un insieme di comandi sulla base del risultato di un altro comando
(specificato come argomento) che serve ad esprimere la condizione. La lista dei comandi da
eseguire nel ciclo deve essere delimitata dalle istruzioni do e done.
Il comando che esprime la condizione viene sempre valutato allinizio del ciclo; le successive
istruzioni vengono eseguite se ha successo nel caso di while o se fallisce nel caso di until.
Se il ciclo condizionale viene eseguito, alla sua conclusione la condizione viene rivalutata con la
riesecuzione del comando iniziale, ed il ciclo eventualmente ripetuto a seconda del nuovo risultato
ottenuto. Un esempio della sintassi per while `e il seguente:
while condition_cmd; do
command
...
done
e la sintassi `e identica nel caso si usi until.
Se si devono operare scelte diverse sulla base del valore di una variabile si pu`o usare listruzione case. In generale case prende come argomento una espressione che possa assumere valori
diversi; il caso pi`
u comune `e quello di una variabile da referenziare con la variable expansion, ma
si pu`o utilizzare anche il risultato di una command expansion. Listruzione permette di eseguire
comandi diversi a seconda dei valori che lespressione di controllo pu`o assumere, con una sintassi
generica del tipo di:
case expression in
value1)
command
...
;;
value2)
command
...
;;
*)
100
101

si noti come nellesempio si sia indicata esplicitamente la fine del comando con il carattere ;.
questultima `e ovviamente opzionale se non c;`e niente da fare in caso di fallimento.

82

CAPITOLO 2. LA SHELL E I COMANDI


command
...
;;
esac

in cui ogni caso viene terminato da un doppio ;; ed i singoli valori con cui viene confrontata
lespressione sono terminati da una parentesi chiusa. Si pu`o esprimere il valore generico con un
*. La lista dei casi deve sempre essere terminata con listruzione esac.
Lutilit`a di case rispetto alluso di una serie concatenata di if ed elif, oltre alla leggibilit`a,
`e che i valori con cui effettuare il controllo supportano i caratteri jolly con lo stesso significato
che questi assumono nel filename globbing visto in sez. 2.1.3,102 anche se in questo caso vengono
applicati alla lista dei valori forniti dallespressione piuttosto che ai nomi dei file. Questo consente
di raggruppare in maniera flessibile valori simili e trattarli con una unica serie di istruzioni.
Infine listruzione for permette di compiere dei cicli su un numero stabilito di alternative,
definendo al contempo una variabile che pu`o essere utilizzata allinterno del ciclo, con una sintassi
del tipo:
for var in list ; do
command
...
done
dove di nuovo le istruzioni do e done delimitano le istruzioni compiute allinterno del ciclo mentre
var `e la variabile che assume, per ciascuna ripetizione del ciclo, i vari possibili valori risultanti
dallespansione dellespressione list.
Il comando interpreta semplicemente il valore di list come una lista costituita di valori
singoli separati da spazi, assegnando in sequenza i singoli valori a var per ciascuna ripetizione
del ciclo. La potenza del comando risiede nel fatto che per esprimere list, oltre ad una eventuale elencazione esplicita dei valori, si pu`o utilizzare sia la variable expansion, che la command
expansion che il filename globbing.
Come complemento alla possibilit`
a di eseguire ciclicamente un gruppo di comandi con istruzioni come for, while ed until, sono state previste due istruzioni che permettono di controllare
il flusso di esecuzione allinterno di un ciclo. La prima istruzione `e continue, che conclude
immediatamente il ciclo corrente per passare immediatamente al successivo, saltando tutte le
istruzioni restanti. La seconda `e break, che termina immediatamente la ripetizione del ciclo e
passa alla prima istruzione ad esso seguente. Siccome `e possibile annidare pi`
u cicli uno dentro
laltro, entrambe le istruzioni supportano un argomento numerico che indica di quanti livelli
tornare indietro.103
Una delle caratteristiche comuni a tutti i linguaggi di programmazione, e la shell non fa
eccezione, `e quella della possibilit`
a di definire delle funzioni da richiamare per eseguire direttamente in diverse occasioni la stessa serie di istruzioni. Questa capacit`a ha una conseguenza
sulla sintassi della shell, perche quando si scrive un comando questo pu`o fare riferimento, oltre
ad eventuali programmi o script o ad un alias per un altro comando, ad una funzione, che viene
appunto eseguita scrivendone il nome.
Benche sia possibile farlo anche sulla riga di comando, in generale una funzione `e definita
allinterno di uno script, e viene introdotta dalla parola chiave function,104 cui segue il nome
102

`e per questo che si pu`


o usare * per indicare il valore generico.
il valore deve essere un intero maggiore di uno, e se si specifica un livello superiore al numero di andamenti
si torner`
a semplicemente al pi`
u esterno dei cicli presenti.
104
in realt`
a listruzione function `e opzionale e pu`
o essere omessa, perche per la definizione di una funzione `e
sufficiente la presenza di un nome seguito dal costrutto (), questultimo a sua volta pu`
o essere omesso se si usa
listruzione function.
103

2.1. LINTERFACCIA A LINEA DI COMANDO.

83

della funzione e il costrutto (). Dopo di che il corpo della funzione, che contiene tutte le
istruzioni da essa eseguita, deve essere scritto di seguito delimitato fra parentesi graffe. In
sostanza la forma di una funzione di shell `e sempre qualcosa del tipo:
function name () {
command
...
}
dove ciascuna linea conterr`
a un comando o altre istruzioni, esattamente come si potrebbero
mettere in uno script; a differenza di uno script per`o queste verranno eseguite nella shell corrente
e non in un processo a parte.
Luso degli script ci pone di fronte anche ad alcune sottigliezze del funzionamento della shell.
Come accennato se si lancia uno script esso viene eseguito come tutti gli altri comandi: la shell
cio`e crea un nuovo processo figlio in cui esegue quella che si chiama una subshell 105 a cui fa
eseguire lo script.106 Questo vuol dire ad esempio che se nello script si effettuano operazioni che
modificano le propriet`
a della shell (come modifiche alle variabili di ambiente o agli alias) queste
modifiche saranno effettive solo per la subshell,107 e non per la shell originaria da cui esso `e stato
lanciato.108
Per cui, se si vogliono automatizzare una serie di impostazioni per la shell corrente (ad esempio limpostazione di alcune variabili di ambiente), non si pu`o pensare di far questo lanciando
` per`o possibile dire alla shell di eseguire i comandi
uno script che contiene i relativi comandi. E
di uno script direttamente al suo interno, senza usare una subshell, usando il comando source,109 cui dare come argomento il nome dello file da cui leggerli; in questo caso non `e neanche
necessario che il file sia eseguibile e presenti la sintassi di uno script con il #! iniziale, esso
viene semplicemente letto ed i comandi al suo interno eseguiti.
Un comando complementare a source `e exec,110 che consente di eseguire un altro programma
(anche uno script) al posto della shell corrente. In questo caso quello che succede `e che il processo
resta lo stesso,111 ma viene messo in esecuzione il codice del programma passato come argomento
ad exec. Quindi se si lancia uno script con exec questo viene eseguito al posto della shell
corrente, ma pur restando il processo lo stesso, il programma cambia comunque112 e a differenza
di quanto avverrebbe con luso di source, alla sua terminazione si avr`a anche la terminazione
del processo. Infatti con exec la conclusione del programma che si `e fatto eseguire fa terminare
anche il processo da cui si `e partiti, e se questo era dalla shell con cui ci si `e collegati al sistema, si
ottiene anche la conclusione della sessione di lavoro. In genere questa istruzione viene utilizzata
dagli script quando devono porre in esecuzione al loro posto altri programmi.
Oltre alle istruzioni interne della shell esistono anche una serie di comandi di utilit`a che sono
stati creati proprio per facilitare la scrittura di script. Il primo di questi `e seq, che permette
di stampare sullo standard output una sequenza di numeri. Il comando pu`o essere invocato
con un numero di argomenti variabile da uno a tre numeri interi: un solo argomento indica il
numero finale a cui fermare la sequenza, partendo da 1 ed incrementando di uno, specificando
due argomenti si indicano il valore iniziale ed il valore finale, che viene raggiunto sempre a passi
105

cio`e unaltra istanza della shell, che viene eseguita dentro un altro processo.
questo vale in realt`
a, come spiegato in precedenza, per qualunque interprete si usi per eseguire lo script, che
verr`
a lanciato in un processo distinto.
107
vedremo in sez. 2.1.6 come eseguire impostazioni che restino valide per tutte le sessioni di lavoro.
108
essendo la subshell un processo diverso infatti non c`e modo che essa possa modificare le propriet`
a di un
altro processo.
109
questa `e la sintassi di bash, una sintassi alternativa prevista dallo standard POSIX, che `e pi`
u sintetica ma
anche pi`
u criptica, prevede luso di . al posto di source.
110
si tenga presente che entrambi sono comandi interni della shell.
111
il nuovo programma avr`
a cio`e lo stesso PID della shell che lo ha lanciato.
112
in questo caso infatti `e la subshell dello script che viene eseguita al posto della shell corrente.
106

84

CAPITOLO 2. LA SHELL E I COMANDI

di uno. Infine se si forniscono tre argomenti il secondo argomento viene usato come valore di
incremento nellintervallo che inizia con il primo e finisce col terzo. Questo comando `e molto
utile quando si vogliono fare dei cicli, lo si pu`o infatti usare per generare una lista di numeri da
utilizzare con listruzione for, i cui valori possono poi essere utilizzati allinterno del ciclo; ad
esempio per eseguire dieci volte la stessa serie di comandi si potr`a usare qualcosa del tipo:
for i in seq 1 10; do
command
...
done
Altri due comandi speciali sono true e false, che non fanno assolutamente nulla se non
fornire alla shell un valore di ritorno. Nel caso di true si avr`a un valore nullo, che nelle condizioni
implica vero, e viene utilizzato per indicare che un comando ha avuto successo. Se invece si usa
false questo restituisce un valore non nullo, equivalente alla condizione falsa e al fallimento del
comando. Questi due programmi vengono usati spesso come shell di default (vedi sez. 4.3.2) per
gli account degli utenti di sistema che non devono avere una shell effettiva.
Un altro comando utilizzato negli script principalmente per controllare il suo codice di uscita
`e test che `e uno dei comandi pi`
u comuni utilizzato in combinazione con le istruzioni condizionali
illustrate in precedenza.113 Per questo motivo una modalit`a alternativa per invocare il comando
`e con il nome [ (si pu`
o infatti osservare lesistenza del file /usr/bin/[) nel qual caso la linea
` questo il motivo per cui le
di comando dovr`
a essere terminata con una corrispondente ]. E
condizioni che si trovano spesso negli script di shell richiedono che dopo la parentesi quadra sia
sempre presente uno spazio, non si tratta infatti di una sintassi interna della shell ma di un
comando esterno, che come tale deve essere riconosciuto.
Il comando pu`
o eseguire controlli su un gran numero di condizioni diverse, specificate attraverso una opportuna espressione, ritornando un valore nullo se la condizione `e verificata, e non
nullo altrimenti. Il comando inoltre supporta luso di alcuni operatori, come !, che anteposto
ad una espressione ne nega il risultato, e la combinazione logica di due espressioni con luso delle
opzioni -a e -o, che indicano rispettivamente lAND e lOR; in questo modo si possono costruire
delle condizioni molto complesse.
Buona parte delle condizioni verificate da test fanno riferimento alle propriet`a dei file, in
questo caso la condizione viene espressa con una opzione seguita dal nome del file cui la si vuole
applicare; le principali opzioni utilizzate, ed il relativo significato, sono riportati in tab. 2.10.
Opzione
-b
-c
-d
-e
-f
-h
-O
-G
-r
-s
-w
-x

Significato
il file esiste ed
il file esiste ed
il file esiste ed
il file esiste.
il file esiste ed
il file esiste ed
il file esiste ed
il file esiste ed
il file esiste ed
il file esiste ed
il file esiste ed
il file esiste ed

`e un dispositivo a blocchi.
`e un dispositivo a caratteri.
`e una directory.
`e un file normale.
`e un link simbolico.
`e di propriet`
a delleffective user ID del processo.
`e propriet`
a delleffective group ID del processo.
`e leggibile.
ha dimensione maggiore di zero.
`e scrivibile.
`e eseguibile.

Tabella 2.10: Opzioni per le condizioni sui file del comando test.

Oltre alle condizioni sui singoli file il comando pu`o essere usato per esprimere condizioni
relative a due file, in tal caso queste vengono espresse scrivendo questi ultimi come argomenti
113

nel caso di bash esso `e presente anche come comando interno.

2.1. LINTERFACCIA A LINEA DI COMANDO.

85

separati dalla relativa opzione; con -ef si richiede che essi abbiano lo stesso inode, con -nt si
richiede che il primo sia pi`
u recente (in termini di tempo di ultima modifica, vedi sez. 1.2.1)
mentre con -ot che sia pi`
u vecchio (negli stessi termini).
Una ultima serie di condizioni riguarda luso di stringhe e numeri; per questi ultimi valgono
gli operatori di confronto dei valori come -eq, -ge, -gt, -le, -lt e -ne, il cui significato `e banale
(uguale, maggiore uguale, maggiore, minore uguale, minore, e diverso). Per le stringhe invece si
possono usare gli operatori = e != per indicare rispettivamente uguaglianza e disuguaglianza,
mentre lopzione -z serve a verificare se la stringa `e vuota e lopzione -n se non lo `e.

2.1.6

Le modalit`
a operative e la configurazione della shell

Lesempio degli script rende evidente come, benche il programma sia lo stesso, la shell possa
essere utilizzata in modi diversi. In generale una shell usata per eseguire uno script necessiter`
a di
impostazioni diverse rispetto ad una shell usata per gestire la riga di comando (ad esempio non
serve il prompt). Per poter effettuare delle impostazioni diverse a seconda del tipo di utilizzo la
bash supporta modalit`
a di funzionamento che vengono abilitate a seconda di come essa viene
114
lanciata.
In particolare quando ci si collega ad una macchina attraverso la shell (che sia su una console
o tramite una connessione via rete le cose non cambiano) devono essere eseguite una serie di
inizializzazioni, come la definizione del prompt e della variabile PATH che normalmente non
servono nel caso di uno script (che eredita le impostazioni dalla shell corrente. Per questo esiste
una apposita modalit`
a di invocazione che consente di ottenere quella che viene chiamata una
shell di login, che pu`
o essere attivata esplicitamente dalluso dellopzione -l.115
Quello che contraddistingue una shell di login `e che al suo avvio vengono sempre eseguite
una serie di procedure di inizializzazione. La prima di queste `e lesecuzione allinterno della
shell stessa116 di tutte le istruzioni contenute nel file /etc/profile,117 in cui lamministratore
di sistema pu`
o inserire una serie di impostazioni comuni per tutti gli utenti.
Un esempio di questo file, che pu`o essere considerato una sorta di file di configurazione della
shell, `e riportato di seguito. Lesempio `e preso dalla versione installata di default su una Debian
Sarge, e la sua lettura pu`
o essere considerata anche un buon esercizio per prendere familiarit`
a
con alcune delle istruzioni che abbiamo illustrato in sez. 2.1.5:
# /etc/profile: system-wide .profile file for the Bourne shell (sh(1))
# and Bourne compatible shells (bash(1), ksh(1), ash(1), ...).
PATH="/usr/local/bin:/usr/bin:/bin:/usr/bin/X11:/usr/games"
if [ "$BASH" ]; then
PS1=\u@\h:\w\$
else
if [ "id -u" -eq 0 ]; then
PS1=#
else
PS1=$
fi
fi
114

si ricordi che la shell `e un programma come gli altri e la si pu`


o eseguire direttamente sulla riga di comando
esattamente come gli altri (ottenendo appunto una subshell ).
115
in realt`
a i vari programmi che lanciano una shell di login (come login per laccesso da console) lo fanno
ponendo un - come primo carattere dellargomento zero (quello che indica il nome del programma) fra quelli
passati alla shell posta in esecuzione, il che poi ci permette di identificare le shell di login nelloutput di ps, come
si pu`
o vedere anche nellesempio di pag. 25.
116
come se si fosse usato il comando source.
117
questo vale in generale per tutte le shell derivate dalla Bourne shell, e non solo per bash, quelle derivate dalla
C shell usano invece /etc/csh.login.

86

CAPITOLO 2. LA SHELL E I COMANDI

export PATH PS1


umask 022

Nellesempio citato si pu`


o notare come prima venga impostata la variabile PATH, poi, se
la shell usata `e la bash,118 viene impostato il prompt usando un valore di PS1 che sfrutti le
funzionalit`a illustrate in tab. 2.2; altrimenti (supponendo una shell generica) vengono usati
direttamente i caratteri # e $ a seconda che lutente sia o meno lamministratore. Infine
viene impostato il valore della umask (vedi sez. 1.4.3) per la sessione.
Per permettere agli utenti di aggiungere le loro personalizzazioni alla shell di login, dopo
aver letto /etc/profile per eseguire le impostazioni comuni a tutto il sistema, la bash cerca
nella home dellutente, ed in questordine, i file .bash_profile, .bash_login e .profile, ed
esegue i comandi del primo che trova, senza guardare gli altri. Si noti come nessuno di questi
file sia eseguibile, dato che non viene eseguito come script, per cui `e sufficiente il permesso di
lettura. Un esempio di .bash_profile (sempre ripreso da una Debian Sarge) `e il seguente:
# ~/.bash_profile: executed by bash(1) for login shells.
# see /usr/share/doc/bash/examples/startup-files for examples.
# the files are located in the bash-doc package.
umask 027
# include .bashrc if it exists
if [ -f ~/.bashrc ]; then
source ~/.bashrc
fi

dove sostanzialmente si modifica la umask (vedi sez. 1.4.3) rispetto al valore impostato per il
sistema e si utilizzano eventuali impostazioni personali poste in un altro file, .bashrc.
Infine alluscita di una shell di login `e prevista lesecuzione, se questo esiste, delle istruzioni
contenute nel file .bash_logout, che pu`
o essere utilizzato da un utente per effettuare eventuali
operazioni di ripulitura alla conclusione di una sessione di lavoro.
Luso del file .bashrc visto nellesempio precedente ci porta ad unaltra delle modalit`a di
utilizzo della shell, quella in cui essa opera su linea di comando associata ad un terminale, ma
senza essere una shell di login.119 In questo caso si ha quella che si chiama shell interattiva; la
shell viene eseguita in modalit`
a interattiva se invocata senza argomenti e con standard output
e standard input associati ad un terminale, o se lanciata esplicitamente come tale con lopzione
-i. In tal caso viene automaticamente definita la variabile PS1 e nella variabile speciale $- (vedi
tab. 2.9) comparir`
a la lettera i.
Luso di .bashrc allinterno di .bash_profile `e dovuto al fatto che se la shell `e interattiva
ma non `e di login, al posto dei tre file .bash_profile, .bash_login e .profile viene usato
` per questo che conviene inserirvi le proprie personalizzazioni, ed eseguire un
questultimo. E
source di questo file allinterno di .bash_profile, in modo da averle disponibile in tutti i casi.
Un esempio di .bashrc `e il seguente:
# ~/.bashrc: executed by bash(1) for non-login shells.
# see /usr/share/doc/bash/examples/startup-files (in the package bash-doc)
# for examples
# If running interactively, then:
if [ "$PS1" ]; then
118

in tal caso sarebbe definita la variabile BASH con il pathname delleseguibile della shell.
come avviene ad esempio per le shell lanciate dagli emulatori di terminale messi in esecuzione allinterno
dellinterfaccia grafica.
119

2.1. LINTERFACCIA A LINEA DI COMANDO.

87

# dont put duplicate lines in the history. See bash(1) for more options
# export HISTCONTROL=ignoredups
# enable color support of ls and also add handy aliases
if [ "$TERM" != "dumb" ]; then
eval dircolors -b
alias ls=ls --color=auto
#alias dir=ls --color=auto --format=vertical
#alias vdir=ls --color=auto --format=long
fi
# some
#alias
#alias
#alias

more ls aliases
ll=ls -l
la=ls -A
l=ls -CF

# set a fancy prompt


PS1=\u@\h:\w\$
# If this is an xterm set the title to user@host:dir
#case $TERM in
#xterm*)
#
PROMPT_COMMAND=echo -ne "\033]0;${USER}@${HOSTNAME}: ${PWD}\007"
#
;;
#*)
#
;;
#esac
# enable programmable completion features (you dont need to enable
# this, if its already enabled in /etc/bash.bashrc).
#if [ -f /etc/bash_completion ]; then
# . /etc/bash_completion
#fi
fi

in cui tutto quello che si fa `e definire una serie di alias ed impostare un prompt con alcune
informazioni utili.
Oltre al file .bashrc presente nella home dei singoli utenti, in cui essi possono inserire le loro
personalizzazioni, esiste un equivalente di /etc/profile che contiene le impostazioni generali a
livello di sistema da applicare a tutte le shell interattive. Il file in questione `e /etc/bash.bashrc
e di nuovo sar`
a cura dellamministratore inserire al suo interno le configurazioni che si vuole siano
applicate a tutti gli utenti.
Come si pu`
o notare le differenze fra queste diverse modalit`a di invocazione sono minime, e
attinenti per lo pi`
u a come viene eseguita la procedura di inizializzazione di ambiente e variabili
di shell. Tale procedura non `e pi`
u necessaria (e pertanto non viene eseguita) tutte le volte che
si riesegue la shell come subshell per lanciare uno script allinterno di una shell interattiva o di
login.
Una terza modalit`
a di funzionamento della bash si attiva quando questa viene invocata con il
nome di sh, in tal caso infatti essa cercher`a di simulare la caratteristiche di funzionamento di una
shell POSIX elementare, per mantenere al massimo la compatibilit`a, e molte delle funzionalit`
a
avanzate non saranno disponibili. In questo caso ad esempio se la shell viene eseguita come shell
di login, per le impostazioni saranno presi in considerazione solo /etc/profile e .profile.
Infine oltre alle modalit`
a appena illustrate, bash supporta unultima modalit`a speciale, che si
attiva invocandola lopzione -r o chiamandola direttamente come rbash; quella della cosiddetta
restricted shell. Invocando la shell in questa maniera `e possibile creare un ambiente ristretto
in cui essa `e soggetta ad una serie di limitazioni che consentono di circoscrivere e controllare il

88

CAPITOLO 2. LA SHELL E I COMANDI

suo funzionamento, un elenco delle limitazioni pi`


u importanti attive con la restricted shell `e il
seguente:

non sar`a possibile cambiare directory con il comando cd.


non si potranno modificare o cancellare le variabili di shell SHELL, PATH, ENV, o BASH_ENV.
non si potranno specificare nomi di comandi contenenti il carattere /.
saranno bloccate le redirezioni delloutput.
non si potr`
a usare il comando interno exec per eseguire un altro comando programma al
posto della shell.

lelenco completo, insieme ad una descrizione dettagliata di questa modalit`a di funzionamento


(che pu`o essere utile per la limitazione di eventuali account remoti) si pu`o trovare nella sezione
RESTRICTED SHELL della pagina di manuale.

2.2

I comandi dei file

Dato che in un sistema unix-like tutto `e un file, `e naturale che la maggior parte dei comandi abbia
a che fare con le operazioni di manipolazione dei file. Abbiamo gi`a visto in sez. 1.2 i comandi
elementari che ci permettono la gestione dei file sul filesystem cp, mv, mkdir, ln, rm, ecc. e quelli
che consentono di operare sui metadati, come chown, chmod, ecc. In questa sezione affronteremo
gli altri comandi che permettono di operare sul contenuto dei file ed eseguire su di essi operazioni
pi`
u complesse; dato che buona parte di queste vengono effettuate con la redirezione, vedremo
anche delle applicazioni di questultima.

2.2.1

Caratteristiche comuni

Benche, come anticipato in sez. 2.1, ogni comando sia specializzato per fare un compito specifico,
esistono comunque una serie di caratteristiche comuni a tutti loro. Dato che i comandi relativi
ai file sono la maggioranza, le tratteremo qui, anche se si applicano in generale a qualunque tipo
di comando, e non solo a quelli che riguardano i file.
La principale caratteristica comune a quasi tutti i comandi `e la modalit`a di gestione delle
opzioni. Abbiamo illustrato nei dettagli in sez. 2.1.3 come queste vengono ed elaborate dalla
shell e passate come argomenti al comando,120 quello che c`e da aggiungere qui `e che alcune di
esse, le pi`
u comuni, tendono ad essere le stesse e ad avere lo stesso significato per tutti i comandi.
Ad esempio per la gran parte dei comandi lopzione -h pu`o essere utilizzata per stampare a video
una schermata di aiuto che riassume la sintassi di uso del comando.
Ricordiamo comunque che quella di identificare come opzioni gli argomenti che iniziano con il
carattere - `e solo una convenzione, e non `e seguita da tutti i comandi, alcuni infatti usano delle
sintassi diverse per eredit`
a storiche, come abbiamo visto in sez. 1.3.2 con ps. La convenzione
per`o viene usata estensivamente da tutti i comandi di base realizzati allinterno del progetto
GNU,121 e da quelli che usano le funzionalit`a di gestione fornite delle librerie dl sistema (le GNU
C library); per questo `e molto diffusa.
Come accennato in sez. 2.1.3 le opzioni sono di due tipi: con o senza parametri. Quando
sono senza parametri esse si comportano come degli interruttori che attivano o disattivano una
certa modalit`a di funzionamento; ad esempio lopzione -v (che sta per verbose) viene usata da
molti comandi per aumentare la prolissit`a dei propri messaggi. Le opzioni che prevedono dei
parametri sono pi`
u complesse e agiscono in maniera analoga ad un cursore o una manopola;
permettono cio`e di passare dei valori di controllo per una certa funzionalit`a del comando; in
120

e come la gran parte dei comandi le elabori attraverso una apposita libreria che ne assicura una sostanziale
uniformit`
a.
121
quelli del pacchetto coreutils, che hanno una certa uniformit`
a anche nei nomi delle opzioni.

2.2. I COMANDI DEI FILE

89

tal caso questo, con un formato del parametro che varier`a da caso a caso, il valore dovr`a essere
specificato di seguito allopzione, normalmente separato da uno spazio.
Inoltre, come accennato in sez. 2.1.3, i comandi del progetto GNU supportano anche una
versione estesa delle opzioni, in cui queste si possono specificare con parole intere invece che con
singole lettere; in questo caso esse iniziano con un --. Tutti i comandi di base del progetto
GNU ad esempio supportano le due opzioni --help, che stampa una schermata riassuntiva della
sintassi (equivalente a -h), e --version, che stampa il numero di versione. Se lopzione estesa
deve indicare un valore questo viene normalmente specificato in forma di assegnazione con un
=, ad esempio con qualcosa del tipo --tabsize=80.
Si ricordi che linterpretazione delle opzioni `e un compito strettamente attinente al singolo
programma; per la shell unopzione `e un argomento come un altro che viene passato al comando
che viene eseguito. Nasce allora il problema di quando il valore di un certo argomento (ad
esempio il nome di un file) inizia con il carattere -, e non si ha modo di distinguerlo da una
opzione. Dato che sulla linea di comando si possono passare come argomenti anche i risultati
delle varie espansioni (di comandi, variabili o nomi di file), talvolta questo tipo di inconvenienti
pu`o verificarsi in maniera inaspettata.
Per questo motivo la combinazione -- usata da sola viene utilizzata dalle librerie di gestione
delle opzioni per forzare la conclusione della scansione delle opzioni nella riga di comando,122 in
modo che tutti gli argomenti che seguono ad essa vengano usati dal programma letteralmente,
senza considerarli possibili opzioni, anche se cominciano per un -.
Come esempio duso di questa funzionalit`a si consideri di dover cancellare con rm un file il
cui nome inizia per - (ad esempio -lista). Dato che il - con cui inizia il nome normalmente
viene interpretato come linizio di una opzione, luso di rm -lista produce un errore essendo
lopzione -l inesistente.123 Tutti i programmi infatti prima esaminano le opzioni, segnalando
errori se ne trovano di inesistenti, e poi trattano gli argomenti. Invece scrivendo il comando
come rm -- -lista, linterpretazione delle opzioni viene bloccata e -lista (anche se inizia per
-) viene preso come argomento, e cancellato.
Unultima convenzione, seguita anchessa da molti programmi, riguarda luso del singolo
carattere - come argomento. La convezione viene utilizzata dai comandi che prendono come
argomento un nome di file da cui leggere o su cui scrivere dati. Se al posto del nome di un file
si usa questo carattere il comando far`a riferimento rispettivamente allo standard input per la
lettura o allo standard output per la scrittura.

2.2.2

I comandi per le ricerche dei file

La ricerca di uno specifico file allinterno del filesystem, o dei file con una certa serie di caratteristiche, `e una operazione molto comune, e per questo sono stati sviluppati alcuni comandi molto
flessibili, che permettono di effettuare le pi`
u complesse tipologie di ricerca.
Il primo fra i comandi usati per cercare i file labbiamo gi`a incontrato in sez. 2.1.3, ed `e
which, che ci indica a quale file eseguibile corrisponde un certo comando, facendo una ricerca
nelle directory indicate nel PATH. Una estensione di which `e il comando whereis che consente
di estendere la ricerca anche a file generici e ricercare oltre ai comandi le pagine di manuale ed
eventuali sorgenti.
Il comando prende come argomento il nome del file o comando da cercare, e stampa i risultati
sullo standard output. Si possono restringere le ricerche soltanto a binari, pagine di manuale o
sorgenti utilizzando rispettivamente le opzioni -b, -m e -s. Il comando prende il nome passato
come argomento, elimina eventuali estensioni (ad esempio se si cerca un sorgente elimina il .c)
122
`e unaltra delle funzionalit`
a introdotte dalla funzione getopt delle GNU libc, usata dalla gran parte dei
programmi per gestire le opzioni a riga di comando.
123
proteggere il - con la barra, o usare le virgolette per il nome non serve a nulla, la shell interpreter`
a
correttamente quanto indicato, passando comunque il valore -lista come argomento.

90

CAPITOLO 2. LA SHELL E I COMANDI

ed esegue la ricerca in una serie di directory standard (elencate nella pagina di manuale). Si
possono restringere le ricerche a delle directory specifiche per binari, pagine di manuale e sorgenti
usando rispettivamente le opzioni -B, -M e -S seguite dalle directory a cui restringere la ricerca.
Per tutti i dettagli e lelenco completo delle opzioni si consulti al solito la pagina di manuale.
Il comando pi`
u veloce per cercare un file in maniera generica sul filesystem `e locate, che,
come suggerisce il nome, serve a localizzare sul filesystem tutti i file che contengono nel loro
pathname la stringa passata come argomento. Il vantaggio di questo programma `e la sua velocit`a,
esso infatti non effettua la ricerca con una scansione del contenuto del disco, ma su un piccolo
database interno che contiene lelenco di tutti i file presenti nel sistema.
Il comando riconosce lopzione -i, che richiede che venga effettuata una ricerca case insensitive, e -e che richiede che sia verificata leffettiva esistenza del file. Il comando inoltre consente
luso come argomento di espressioni analoghe a quelle usate dalla shell per il filename globbing
viste in sez. 2.1.3. Le altre opzioni e la descrizione completa del comando `e al solito disponibile
nella relativa pagina di manuale, accessibile con man locate.
Il fatto che locate si affidi ad un database ci fa capire immediatamente anche i suoi limiti:
anzitutto la ricerca pu`
o essere effettuata solo per nome, ed inoltre il comando sar`a in grado
di effettuare la ricerca solo sui file gi`
a inseriti nel database. Questo viene creato ed aggiornato
tramite il comando updatedb che in genere viene eseguito una volta al giorno (fra i lavori periodici
di cron che vedremo in sez. 3.2.1), per cui se un file `e stato creato dopo lultimo aggiornamento
non si potr`a vederlo.
Il comando updatedb prende una serie di opzioni in forma estesa, le principali delle quali
sono illustrate in tab. 2.11, che gli permettono di definire quale file usare per il database,124
quali directory (ad esempio non ha molto senso indicizzare /tmp) e quali filesystem (non ha
senso indicizzare un CDROM) inserire nel database dei file e quali no.
Opzione
--output
--prunefs

--prunepaths

--localuser

Significato
indica il file su cui viene salvato il database.
indica lelenco dei tipi di filesystem da non indicizzare
(il parametro deve essere passato come lista separata da
spazi dei rispettivi nomi, come riportati in tab. 5.2).
indica la lista delle directory da non indicizzare (il parametro deve essere passato come lista separata da spazi
dei rispettivi pathname assoluti).
indica lutente locale per conto del quale eseguire la
ricerca sul filesystem nella creazione del database.

Tabella 2.11: Principali opzioni di updatedb.

La caratteristica di updatedb `e che i valori di alcune opzioni (quelle riportate nella seconda
parte di tab. 2.11) possono essere impostati tramite delle omonime variabili di ambiente.125 Dato
che normalmente il comando viene lanciato da uno degli script periodici eseguiti da cron (vedi
sez. 3.2.1), quello che viene fatto `e di definire queste variabili di ambiente allinterno di un file,
/etc/updatedb.conf, che in questo modo fa le veci di file di configurazione del comando. Il
contenuto tipico di questo file (cos` come ottenuto dalla versione installata su una Debian Sid)
`e il seguente:
# This file sets environment variables which are used by updatedb
# filesystems which are pruned from updatedb database
PRUNEFS="NFS nfs afs proc smbfs autofs iso9660 ncpfs coda devpts ftpfs devfs mfs sysfs"
export PRUNEFS
# paths which are pruned from updatedb database
124
125

su Debian il default `e usare /var/cache/locate/locatedb.


rispetto al nome delle opzioni le variabili sono scritte in maiuscolo anziche minuscolo, e senza il -- iniziale.

2.2. I COMANDI DEI FILE

91

PRUNEPATHS="/tmp /usr/tmp /var/tmp /afs /amd /alex /var/spool /sfs"


export PRUNEPATHS
# netpaths which are added
NETPATHS=""
export NETPATHS
# run find as this user
LOCALUSER="nobody"
export LOCALUSER
# cron.daily/find: run at this priority -- higher number means lower priority
# (this is relative to the default which cron sets, which is usually +5)
NICE=10
export NICE

Trattandosi di una sezione di uno script (che sar`a utilizzato con un source dallo script
che esegue la ricostruzione del database) la forma `e quella dellassegnazione delle variabili di
ambiente che poi saranno usate da updatedb. Allora, in corrispondenza con le omonime opzioni
di tab. 2.11, con PRUNEFS si indicano i filesystem da non indicizzare, come quelli di rete, i
filesystem virtuali come /proc o quelli di dispositivi estraibili; con PRUNEPATHS si indicano
le directory da non indicizzare (quelle dei file temporanei, gli spool delle code di stampa e
della posta, ecc.) e con LOCALUSER si indica lutente con i permessi del quale sar`a effettuata
lindicizzazione; nel caso si `e usato nobody,126 in modo da evitare che siano indicizzati i file che
gli utenti hanno protetto da lettura.
Un altro problema che si pone con locate `e che il comando restituisce tutte le voci che sono
state indicizzate, indipendentemente dai permessi che queste possono avere, permettendo cos`
ad un utente normale di verificare la presenza di file per i quali non avrebbe accesso. In generale
questo viene risolto a livello di indicizzazione eseguendo questultima, come abbiamo appena
visto, per conto di un utente senza privilegi sul filesystem. In questo modo nel database saranno
presenti solo i file visibili pubblicamente, ma ci`o comporta anche che un utente non trover`
a mai
indicizzati i propri file privati.
Per risolvere questo problema `e stata creata una versione alternativa del comando, slocate
(nome che sta per Secure Locate), che prima di mostrare i risultati verifica se i permessi dellutente consentono laccesso al file. Luso del comando `e analogo a locate e supporta le opzioni
citate in precedenza con lo stesso significato. Il comando per`o utilizza un database con tutti
i file, eseguendo la verifica dei permessi prima di mostrare i risultati. Per i dettagli sul suo
funzionamento si pu`
o al solito consultare la pagina di manuale.127
Dato che anche slocate necessita delluso di un database, insieme al programma viene
fornito anche il relativo comando di indicizzazione updatedb. Il programma `e un omonimo
del precedente relativo a locate,128 ed in realt`a non `e altro che un link allo stesso slocate,
che quando viene invocato come updatedb abilita automaticamente lopzione -u che forza la
ricostruzione del database.129
A differenza della versione associata a locate, lupdatedb di slocate esegue automaticamente una scansione di /etc/updatedb.conf (che costituisce quindi un vero file di configurazione
per il comando), anche se riconosce solo un sottoinsieme delle variabili illustrate in precedenza,
ed in particolare soltanto PRUNEFS e PRUNEPATHS, che assumono comunque lo stesso significato.
126

questo `e un utente di servizio che non ha nessun privilegio nel filesystem, utilizzato come titolare dei programmi
che devono avere accesso solo alle informazioni pubbliche.
127
si tenga presente che alcune distribuzioni, come Debian, installano direttamente slocate come sostituto di
locate, in tal caso si potr`
a accedere al comando ed alla relativa documentazione continuando ad usare il nome
locate.
128
su Debian quanto si installa slocate i comandi locate e updatedb ordinari (e le relative pagine di manuale)
vengono rinominati in locate.notslocate e updatedb.notslocate.
129
in questo caso il file usato di default `e /var/lib/slocate/slocate.db, ma pu`
o essere modificato con lopzione
-U.

92

CAPITOLO 2. LA SHELL E I COMANDI

Infine nelle distribuzioni pi`


u recenti il programma effettivamente utilizzato `e mlocate, la cui
sintassi e modalit`
a di funzionamento `e identica a quella di slocate (e prevede comunque con
i comandi locate e updatedb) ma deve il suo nome ad una maggiore efficenza di ricostruzione
del database,130 dovuto al fatto che non sta a ricrearlo da zero tutte le volte ma effetta un
operazione di aggiunta (la m sta per merging) dei nuovi file).
Per superare i limiti di locate e affini, si pu`o usare il comando find, che non utilizza un
database, ma esegue la ricerca direttamente nel filesystem, al costo di una notevole attivit`a su
disco, e di tempi di esecuzione decisamente pi`
u lunghi. Si pu`o comunque ridurre il carico facendo
effettuare la ricerca su sezioni ridotte dellalbero dei file; il comando infatti prende come primo
argomento la directory da cui iniziare la ricerca, che verr`a eseguita ricorsivamente in tutte le
directory sottostanti; se non si specifica nulla la ricerca partir`a dalla directory corrente.
Il comando supporta quattro categorie principali di opzioni, descritte da altrettante sezioni
della pagina di manuale (accessibile al solito con man find). La prima categoria (descritta
nella sezione OPTIONS) contiene le opzioni vere e proprie, che controllano il comportamento di
find, la seconda, (descritta nella sezione TESTS) contiene le opzioni di ricerca che permettono di
selezionare i file in base ad una loro qualunque propriet`a (nome, tipo, proprietario, i vari tempi,
permessi, ecc.), la terza (descritta nella sezione ACTIONS) contiene le opzioni che permettono
di specificare una azione da eseguire per ciascun file che corrisponde alla ricerca, la quarta
(descritta nella sezione OPERATORS) contiene le opzioni che permettono di combinare fra loro
diverse selezioni.
Opzione
-L
-mount
-maxdepth n
-mindepth n

Significato
dereferenzia i link simbolici, sostituisce la precedente follow, deprecata.
resta nel filesystem corrente e non analizza sottodirectory
in altri filesystem.
limita la profondit`
a della ricerca ad n directory sotto
quella di partenza.
imposta la profondit`
a iniziale della ricerca a n directory
sotto quella di partenza.

Tabella 2.12: Principali opzioni generiche di find.

Le opzioni generiche, le principali delle quali sono riportate in tab. 2.12, permettono di
modificare il comportamento del comando, ad esempio con -maxdepth si pu`o limitare la ricerca ai
primi livelli di sottodirectory, mentre con -mindepth la si pu`o far partire da un certo sottolivello.
Inoltre con -L si pu`
o richiedere che il comando risolva eventuali link simbolici, facendo riferimento
ai file cui essi puntano anziche al link stesso, come avviene di default.
Le maggiori potenzialit`
a di find derivano dalla sua capacit`a di effettuare ricerche con i criteri
pi`
u svariati, da quelli sul nome del file in varie forme (con -name, -regex, -path), a quelli per
gruppo e utente (con -group e -user), secondo i permessi (con -perm), secondo i vari tempi
(-atime, -ctime, -mtime) per tipo di file, di filesystem su cui `e il file, ecc. Un elenco delle
principali opzioni di ricerca, con il relativo significato, `e riportato in tab. 2.13.
Alcune di queste opzioni necessitano di alcuni chiarimenti, ad esempio con lopzione -name
si pu`o effettuare la classica ricerca sul nome del file, con tanto di supporto per le wildcard
(che per`o vanno adeguatamente protette, scrivendole fra virgolette, per evitarne lespansione da
parte della shell). La ricerca `e effettuata esattamente sul nome del file, cos` come `e scritto nella
directory che lo contiene, e non sul suo pathname, se si vuole eseguire la ricerca su questultimo
occorre usare -path.
Per tutte le opzioni che prendono un valore numerico (quelle sui tempi, gli identificatori, il
numero di link), indicato in tab. 2.13 con n, il comando permette una sintassi molto potente:
130

che nel caso `e mantenuto in /var/lib/mlocate/mlocate.db.

2.2. I COMANDI DEI FILE


Opzione
-amin n

-atime n

-anewer file

-gid n
-group group
-links n
-name pattern
-path pattern

-perm mode
-size n
-type c
-uid n
-user user

93
Significato
un file acceduto n minuti fa, le opzioni -cmin e -mmin
eseguono lo stesso controllo rispettivamente coni tempi
di ultimo cambiamento e ultima modifica.
un file acceduto n giorni fa, le opzioni -ctime e mtimeeseguono lo stesso controllo rispettivamente con i
tempi di ultimo cambiamento e ultima modifica.
un file acceduto pi`
u recentemente di file , le opzioni
-cnewer e -mnewer eseguono lo stesso controllo rispettivamente con i tempi di ultimo cambiamento e ultima
modifica.
il group ID del gruppo proprietario `e n .
il gruppo proprietario `e group .
il file ha n hard link.
il nome del file corrisponde al pattern pattern . Prevede
anche -iname per una ricerca case insensitive.
il pathname del file (comprese quindi le directory a partire dalla radice) corrisponde al pattern pattern . Prevede
anche -ipath per una ricerca case insensitive.
i permessi corrispondono a mode .
la dimensione del file `e n .
seleziona sul tipo di file, il valore di c corrisponde alla
lettera usata da ls e riportata in tab. 1.1.
luser ID del proprietario `e n .
il proprietario `e user .

Tabella 2.13: Principali opzioni di find per la ricerca.

specificando solo il numero si richiede una corrispondenza esatta, precedendolo con il segno -
si richiede invece che il valore sia inferiore, mentre precedendolo con un + si richiede che sia
superiore; `e cos` allora che per esempio, nel caso dei tempi, si pu`o richiedere che un file sia pi`
u
vecchio o pi`
u giovane di un dato tempo. Ad esempio se si vogliono cercare i file modificati negli
ultimi 5 minuti si dovr`
a dare il comando:
piccardi@anarres:~/truedoc/corso$ find . -mmin -5
.
./shell.tex

mentre se si vuol cercare quelli non acceduti da pi`


u di quindici giorni si far`a:
piccardi@anarres:~/truedoc/corso$ find . -atime +15
./ringraziamenti.tex

Lopzione di ricerca sui permessi -perm merita una trattazione a parte, il parametro mode
passato allopzione supporta infatti a sua volta una sintassi abbastanza complessa. Anzitutto
un permesso pu`
o essere espresso sia in forma simbolica131 che numerica; specificando un valore
find cercher`
a un file che abbia esattamente quel valore per i permessi, ad esempio se si specifica
g=w corrisponderanno soltanto i file con un permesso numerico esattamente uguale a 020.
Dato che in genere non si `e interessati alla ricerca di un valore specifico di permessi, quanto
alla presenza di una certa serie di permessi (indipendentemente da quali possono essere gli altri)
il valore pu`
o essere specificato apponendovi, in maniera simile a quanto si fa con i valori numerici,
i due segni - e +; in realt`
a questultimo `e ormai deprecato, ed al suo posto occorre usare /.
Trattandosi nel caso dei permessi di una maschera di bit, il significato non pu`o per`o essere come
prima relativo ad un valore numerico maggiore o minore, ed inoltre la notazione `e valida anche
per la notazione simbolica.
Dato che un valore senza segno richiede la corrispondenza esatta, si usano queste combinazioni per selezionare per la presenza di uno o pi`
u bit senza curarsi dello stato degli altri (che `e in
131

con lo stesso formato visto in sez. 1.4.3, ma usando solo = come operatore.

94

CAPITOLO 2. LA SHELL E I COMANDI

genere il tipo di ricerca pi`


u utile). Se si usa il segno - allora mode dovr`a specificare quali sono
i permessi che devono essere presenti sul file se si usa la forma simbolica, oppure la maschera
dei bit che (secondo lo schema di fig. 1.5) si vuole siano presenti, i bit nulli verranno ignorati.
Se invece si usa / la richiesta `e ancora pi`
u debole ed il file corrisponde purche almeno uno dei
permessi specificati con il valore di mode sia attivo. In questo modo con -mode si pu`o richiedere
una condizione in cui siano attivi un bit e un altro, mentre con /mode una in cui siano attivi
un bit o un altro.
Come accennato una seconda importante categoria di opzioni `e quella relativa alle azioni; `e
possibile infatti, per ogni file che corrisponde al criterio di ricerca specificato, far eseguire una
certa azione. Se non si specifica nulla lazione di default `e quella di stampare il nome del file,
equivalente alla opzione -print; ma si possono anche scrivere i nomi su un file qualunque usando
lopzione -fprint file, o usare vari formati.
Opzione
-exec
-print
-print0
-fprint file
-ok

Significato
esegue un comando usando come argomento il nome del
file.
stampa il nome del file terminato con un a capo.
stampa il nome del file terminato con un carattere NUL
(il valore 0).
scrive il nome del file sul file file .
come -exec ma chiede conferma del comando.

Tabella 2.14: Principali opzioni di find per specificare azioni.

Lelenco delle principali opzioni per le azioni `e riportato in tab. 2.14. Quella di gran lunga
pi`
u importante `e -exec che permette di eseguire, per ogni file corrispondente alla selezione, un
comando. La sintassi dellopzione `e complessa in quanto si deve inserire una riga di comando
allinterno di unaltra, e ci sono delle convenzioni usate dal comando per passare i valori. Quando
si usa -exec tutto quello che segue viene interpretato come una riga di comando fino a che non
si incontra un carattere ;, in detta riga si pu`o fare riferimento al file che corrisponde con la
stringa {}. Il problema `e che tutti questi caratteri vengono interpretati dalla shell, e devono
quindi essere adeguatamente protetti; allora se ad esempio si vogliono spostare tutti i file non
acceduti da pi`
u di 15 giorni in una directory old, si potr`a usare un comando del tipo:
find . -atime +15 -exec mv \{\} old \;
La potenza del comando find `e poi ulteriormente aumentata dal fatto che le varie opzioni
precedenti possono essere combinate fra di loro con degli operatori logici. Ma se il significato di
-and o -or pu`o sembrare immediato nel caso di criteri di ricerca, diventa meno chiaro quando
si ha a che fare con delle azioni. In realt`a infatti il comando associa un valore logico ad ogni
opzione, e quando si esegue una selezione il valore `e automaticamente vero, lo stesso vale per
tutte le azioni, tranne -exec (e derivate come -ok) in cui il valore `e vero se il comando ha uno
stato di uscita nullo, e falso altrimenti.
Il funzionamento di un operatore come -and (che `e sottinteso se si specificano pi`
u opzioni)
`e che la seconda opzione (sia questa di ricerca, che una azione) viene eseguita solo se la prima `e
vera. Viceversa con -or la seconda opzione viene eseguita solo se la prima `e falsa. Infine -not
nega il risultato di una opzione.
Nel caso si combinino opzioni di ricerca tutto questo `e del tutto ininfluente riguardo il
risultato del comando, che `e quello che ci si aspetta intuitivamente: entrambe le condizioni di
ricerca devono essere soddisfatte per -and o solo una per -or, o si inverte la selezione con -not.
Le cose cambiano profondamente quando ci sono di mezzo delle azioni come -exec, perche in tal
caso lesecuzione della seconda opzione dipende dal risultato della prima: se si chiede di eseguire
due comandi ad esempio le cose dipendono dal risultato di quello che si esegue per primo.

2.2. I COMANDI DEI FILE

95

Per questo ad esempio specificare con -and pi`


u comandi (o semplicemente scriverne pi`
u di
uno, dato che in tal caso il -and `e sottinteso) non significa affatto che essi saranno eseguiti tutti:
lo saranno solo se tutti hanno successo, se uno non ha successo i successivi non saranno eseguiti.
Qualora si voglia essere sicuri di eseguire tutti i comandi in una lista si pu`o usare loperatore
, nel qual caso saranno eseguiti comunque tutti, ma si avr`a un valore finale corrispondente
allultimo della lista.

2.2.3

I comandi per controllare il contenuto dei file

Si sono raccolti in questa sezione tutti i comandi che permettono di visualizzare o controllare
il contenuto di un file. Il primo comando di questo tipo `e cat, che abbiamo gi`a incontrato in
sez. 2.1.4. In tale occasione abbiamo anche accennato come in realt`a luso principale di questo
comando (a parte il caso di file molto corti) sia quello di permettere la concatenazione del
contenuto di pi`
u file, e che se lo scopo `e solo quello della visualizzazione del contenuto di un file
esistono alternative migliori; adesso tratteremo proprio queste.
Il problema maggiore delluso di cat come visualizzatore `e che questo scrive tutto sul terminale, senza possibilit`
a di mostrare il contenuto del file un po alla volta. Per questo sono
stati allora creati tutta una serie di programmi studiati per mostrare il contenuto dei file una
pagina alla volta (dove per pagina si intende la schermata del terminale), che per questo sono
detti pager. Ad essi `e dedicata anche una variabile di ambiente, PAGER, usata dai programmi
che necessitano di visualizzare il contenuto di un file, per scegliere quale fra i vari comandi di
visualizzazione deve essere utilizzato.
Il primo programma realizzato per la visualizzazione di interi file `e more, il quale prende
come argomento una lista di file da leggere di cui stampa il contenuto sul terminale una pagina
alla volta, attendendo che lutente invii dei comandi da tastiera. Al solito la pagina di manuale
riporta lelenco completo delle opzioni usate per controllare il comportamento del programma;
ad esempio con -num si pu`
o specificare un parametro che indica il numero di linee che devono
essere stampate sullo schermo (utile solo quando il comando non riesce a determinarlo da solo)
ed i vari comandi. Rimandiamo ad essa per le informazioni complete, qui faremo solo una breve
panoramica sui principali comandi che si possono dare durante la visualizzazione, il cui elenco
comunque pu`
o essere ottenuto direttamente durante luso del programma premendo i tasti ?
o h.
Una volta stampata una pagina more consente di passare a quella successiva con la pressione
dello spazio, mentre luso del ritorno a capo permette di avanzare lo scorrimento di una riga alla
volta. Si pu`
o interrompere la visualizzazione con q, mentre con b si pu`o tornare una pagina
indietro. Se si sono indicati pi`
u file con :n si pu`o passare alla visualizzazione del successivo
mentre con :p tornare al precedente. Con il tasto / si fa apparire un prompt dove inserire una
stringa da ricercare allinterno del file.132 Infine con v si pu`o lanciare leditor impostato con
la variabile di ambiente EDITOR (gli editor sono trattati in sez. 2.3, quello usato di default `e vi)
per modificare il contenuto del file.
Il comando more `e stato creato fin dagli albori di Unix, e la sua sintassi risente anche del
fatto che i primi terminali erano delle telescriventi, su cui il testo veniva stampato, per cui non
supporta ad esempio luso dei tasti di freccia avanti e indietro ed i vari tasti di spostamento
presenti nelle tastiere moderne. Dato che ben presto tutti i terminali iniziarono a supportare
la riscrittura dello schermo, e tutte le tastiere iniziarono ad avere i tasti di spostamento, venne
creato less come evoluzione 133 di more.
Le funzionalit`
a di less sono sostanzialmente identiche a quelle di more, e supporta anche
tutti i comandi da tastiera illustrati in precedenza, ma il programma consente degli spostamenti
132

in realt`
a la stringa viene interpretata come una espressione regolare (vedi sez. 2.2.5), quindi si possono
effettuare anche ricerche molto complesse.
133
si, volevano davvero fare gli spiritosi!

96

CAPITOLO 2. LA SHELL E I COMANDI

pi`
u comodi, potendo navigare il contenuto del file avanti ed indietro con i tasti di freccia, pagina
su e gi`
u, ecc. Il comando poi supporta funzionalit`a avanzate come la possibilit`a di ridefinire dei
keybinding, di lanciare dei programmi per pre-processare dei dati (ad esempio decomprimere al
volo dei file compressi), ecc. Per i dettagli si faccia al solito riferimento alla pagina di manuale.
Un altro programma di visualizzazione, pi`
u utile in caso di file binari, `e od, (da Octal Dump)
che permette di stampare il contenuto di un file in forma numerica, usando vari formati: decimale,
ottale (il default), esadecimale e pure direttamente in semplice ASCII. La modalit`a in cui viene
stampato il contenuto `e controllata dallopzione -t, che prende come parametro una stringa
indicante il formato, il cui primo carattere indica il tipo di rappresentazione scelta, secondo
quanto riportato in tab. 2.15. Nel caso si sia usata una forma numerica, si pu`o utilizzare un
secondo carattere per indicare la dimensione in byte del numero in questione.
Carattere
a
c
d
f
o
u
x

Formato
caratteri ASCII, coi caratteri non stampabili riportati
tramite un nome simbolico.
carattere ASCII, coi caratteri non stampabili riportati in
forma numerica preceduta dalla barra rovescia.
decimale.
virgola mobile.
ottale.
decimale senza segno.
esadecimale.

Tabella 2.15: I caratteri indicanti il formato per la stampa delloutput del comando od.

Una seconda opzione che permette di modificare il formato di stampa di od `e -A, che stabilisce
come deve essere stampato il numero progressivo che indica la posizione nel file; lopzione prende
come parametro uno dei caratteri d, o, x, o n dove i primi tre hanno lo stesso significato riportato
in tab. 2.15 mentre n indica che non deve essere stampato nulla.
Altre due opzioni utili sono -j che permette di iniziare la stampa a partire da una certa
posizione allinterno del file e prende come parametro il numero di byte da saltare, e -N che
permette di specificare (passandolo come parametro) il numero di byte da stampare (altrimenti
il comando stampa tutto il contenuto del file). Per le altre opzioni ed i dettagli di funzionamento
del comando si faccia al solito riferimento alla pagina di manuale.
Del tutto analogo ad od per funzionalit`a e utilizzo `e il comando hexdump che esegue le stesse
operazioni ma che, nascendo come Hexadecimal Dump, di default stampa il risultato in formato
esadecimale anziche ottale. Come il precedente il comando (che pu`o essere invocato anche come
hd) prende una serie di opzioni che consentono di controllare la visualizzazione, riportate nella
seconda parte di tab. 2.16.
Oltre a quelle di visualizzazione altre opzioni significative sono -s e -n che consentono di
indicare rispettivamente posizione di partenza e numero di byte da stampare. Inoltre rispetto
ad od il comando consente di controllare il formato di stampa in maniera molto dettagliata,
in particolare lopzione -e che consente di indicare una stringa di formattazione. Per lelenco
completo delle opzioni ed i dettagli di funzionamento, ed in particolare per il formato delle
stringhe di formattazione, si faccia riferimento alla pagina di manuale.
Unaltra particolare forma di visualizzazione del contenuto di un file viene eseguita dal comando tac, che serve a stampare il contenuto di un file alla rovescia, cio`e a partire dallultima
riga verso la prima.134 Il comando in realt`a divide un file in campi separati da un carattere, che
di default `e il ritorno a capo per cui i campi vengono a coincidere con le righe; con lopzione
-s per`o si pu`o passare come parametro un diverso separatore, mentre con -r si pu`o usare come
separatore una espressione regolare (vedi sez. 2.2.5). Per i dettagli conviene consultare la pagina
info con info tac dato che la pagina di manuale `e molto sintetica.
134

si, lidea era proprio quella di fare cat al contrario...

2.2. I COMANDI DEI FILE


Opzione
-n N
-s N
-e str
-v

-c

-d
-b

-x
-C

97

Significato
stampa solo il numero di caratteri indicato come
parametro (il default `e stampare fino alla fine del file).
inizia a stampare dal numero di caratteri indicato come
parametro rispetto allinizio del file.
indica una stringa di formattazione per luscita del
comando (per il formato si consulti la pagina di manuale).
stampa il contenuto completo (in caso di righe consecutive identiche di default queste vengono sostituite con una
riga di asterischi).
stampa il contenuto in caratteri ASCII, coi caratteri
non stampabili riportati in forma numerica (o simbolica)
preceduti dalla barra rovescia.
stampa il contenuto in forma decimale intera (usando due
byte alla volta) con 8 valori per riga.
stampa il contenuto in forma ottale (con ciascun byte
indicato da tre cifre separate da spazi) con 16 valori per
riga.
stampa il contenuto in forma esadecimale (usando due
byte alla volta) con 8 valori per riga.
stampa il contenuto con una combinazione di esadecimale
e ASCII.
Tabella 2.16: Le principali opzioni di hexdump.

Una ulteriore serie di comandi che si sono riuniti in questa sezione sono quelli che possono
essere usati per fare dei sommari sul contenuto di un file. Il pi`
u semplice di questi `e wc, (da
Word Count) che viene usato per contare le parole contenute in un file. Il comando prende
come argomento una lista di file (se non se ne specificano al solito viene usato lo standard input)
per ciascuno dei quali stampa il numero totale di linee, di parole e byte. In genere il comando
stampa tutte queste informazioni insieme al nome del file, se ne sono specificati pi`
u di uno. Si
pu`o far stampare solo il numero di linee, di parole o di byte rispettivamente con le opzioni -l, -w
e -c; lopzione -L invece stampa la lunghezza della linea pi`
u lunga. Al solito per tutti i dettagli
sul comando si consulti la pagina di manuale.
Altri comandi di questa categoria sono cksum e md5sum che stampano delle opportune checksum, cio`e delle somme di controllo,135 o hash che confrontate permettono di verificare lintegrit`
a
di un file (per una trattazione dellargomento si veda [SGL]). Entrambi prendono come argomenti una lista di file, per ciascuno dei quali sar`a stampato a video il risultato del calcolo, per
cksum dalla lunghezza e dal nome, per md5sum solo dal nome.
Al solito se non si specifica nulla i comandi leggono dallo standard input. Inoltre md5sum
supporta unopzione -c, che permette di specificare un solo parametro, che in questo caso sar`
a
un file che contiene una lista di risultati di precedenti invocazioni del programma. Il comando
verr`a applicato a ciascuno dei file elencati, segnalando eventuali differenze. Diventa cos` possibile
effettuare direttamente un controllo di integrit`a.

2.2.4

I comandi di elaborazione dei contenuti dei file

In questa sezione prenderemo in esame una serie di comandi che permettono di filtrare e manipolare in maniera automatica il contenuto dei file. Questi programmi costituiscono uno strumento
estremamente potente e sono il cuore della cosiddetta Unix toolbox, in quanto il loro inserimento
allinterno di una concatenazione di comandi permette di eseguire delle operazioni di elabora135
si chiamano cos` delle opportune funzioni matematiche che hanno la caratteristica di dare risultati molto
diversi anche per piccole differenze nellinput. In particolare cksum usa un algoritmo chiamato CRC, che `e
piuttosto debole, cio`e `e pi`
u facile avere lo stesso risultato per due input diversi (le cosiddette collisioni), md5sum
usa un altro algoritmo, detto MD5, pi`
u recente, che `e meno soggetto a collisioni, ma comporta pi`
u calcoli.

98

CAPITOLO 2. LA SHELL E I COMANDI

zione dei contenuti di un flusso di dati in maniera rapida ed efficiente, costruendo, grazie alle
funzionalit`a del pipelining della shell, quella catena di montaggio di cui parlavamo in sez. 2.1.1.
Una prima serie di possibili comandi di elaborazione sono quelli che riguardano la suddivisione, in varie modalit`
a, dei contenuti di un file. I primi due comandi che prenderemo in esame
sono head e tail, che ci permettono di selezionare,136 rispettivamente linizio e la fine di un file
(o di una lista di file). Entrambi i programmi usano lopzione -n per indicare il numero di linee
totali da selezionare (il default `e 10), e lopzione -c per effettuare la selezione in byte invece che
in linee. Entrambi i comandi, quando non si specifica nessun argomento, operano sullo standard
input. Al solito si faccia riferimento alla pagina di manuale per lelenco completo delle opzioni
e la descrizione dettagliata dei comandi.
Abbiamo visto come ottenere linizio e la fine di un file, ma la nostra cassetta degli attrezzi
sembrerebbe mancare di un comando che ci permetta di selezionare una sezione qualunque del
file a partire da una certa riga N per finire con unaltra M. In realt`a questo ancora una volta `e
facilmente ottenibile concatenando i due comandi precedenti; baster`a tagliare prima la testa del
file con head e poi la coda con tail, costruendo una linea di comando del tipo:137
head -n M file | tail -n $((M-N))
Vale la pena poi menzionare esplicitamente lopzione -f di tail, che quando usata fa s` che
il comando non esca e continui a stampare ogni eventuale altro dato aggiunto in coda al file,
permettendo cos` di seguire la crescita di questultimo. Questa `e una opzione molto utile per
tenere sotto controllo i file di log (vedi sez. 3.2.3), ed in generale tutti i file in cui altri programmi
scrivono in coda i loro dati.
In sez. 2.1.4 abbiamo visto come usare cat per concatenare il contenuto di pi`
u file, per
eseguire loperazione inversa si pu`
o usare split, che viene usato per tagliare a fette un file. Il
comando prende come argomento il file da affettare, e lo suddivide in tanti file di dimensione
uguale che chiama progressivamente xaa, xab, xac, ecc. Se non si specifica un argomento al
solito split legge dallo standard input, consentendo cos` ad esempio di creare un file con un
comando e suddividerlo al volo con una pipe. Dato che il comando crea le sue fette in ordine
alfabetico, per ricomporre il file originario baster`a usare un comando del tipo cat x* > file.
Aggiungendo un secondo argomento dopo il nome del file da suddividere si pu`o specificare
un prefisso diverso da x come intestazione dei nuovi file creati dal comando. La dimensione dei
file viene specificata con lopzione -l se la si vuole in numero di linee o con -b se la si vuole
in numero di byte; questultima opzione supporta anche un valore del parametro con i suffissi
m e k per indicare rispettivamente megabyte e kilobyte. Infine se due lettere non bastano per
indicizzare i file che si generano si pu`
o usare lopzione -a per specificarne un numero diverso.
Un elenco delle principali opzioni `e riassunto in tab. 2.17, per tutti i dettagli si faccia al solito
riferimento alla pagina di manuale.
Opzione
-b N
-a N
-d
-l N

Significato
specifica la dimensione delle fette in byte.
specifica la lunghezza del suffisso.
usa un suffisso numerico anziche alfabetico.
specifica la dimensione delle fette in linee.

Tabella 2.17: Le principali opzioni del comando split.

Se si vuole affettare un file per colonne (cio`e in verticale) invece che per righe (in orizzontale)
si pu`o usare il comando cut. Il comando opera sul file passato come argomento, o sullo standard
input, rendendo di nuovo possibile operazioni complesse e filtri ricorsivi; le colonne selezionate
136
137

vale a dire scrivere sullo standard output.


dove si `e usata la arithmetic expansion brevemente descritta in sez. 2.1.3.

2.2. I COMANDI DEI FILE

99

verranno stampate sullo standard output. Con lopzione -c si pu`o creare la selezione scegliendo quali caratteri inserire nel risultato in base alla loro posizione rispetto allinizio della riga.
Lopzione prende una lista di posizioni numeriche separata da virgole, e supporta la presenza di
intervalli,138 indicati con due numeri separati da un -; inoltre se si specifica un valore preceduto da - si selezioner`
a tutta la riga dallinizio a quella posizione, e viceversa un valore seguito
da - selezioner`
a tutto da quella posizione a fine riga. Cos` se ad esempio si vuole ottenere la
stringa dei permessi che sta allinizio dalloutput di ls -l baster`a eseguire:
piccardi@anarres:~/truedoc/corso$ ls -l *.tex | cut -c 1-10
-rw-r--r--rw-r--r--rw-r--r--rw-r--r--rw-r--r--rw-r--r--rw-r--r--rw-r--r--rw-r--r--

Lutilit`
a del comando `e che oltre ad una selezione basata su posizioni assolute allinterno
della riga, esso permette di effettuare la selezione anche in termini di campi delimitati da un
carattere qualunque che pu`
o essere specificato con lopzione -d.139 In tal caso si effettuer`
a la
selezione di quali campi stampare con lopzione -f, indicando i numeri dei campi scelti con la
stessa sintassi usata per -c.140 Cos` si potr`a ad esempio stampare il proprio user ID con:141
piccardi@anarres:~/Truelite$ cat /etc/passwd | grep piccardi | cut -d: -f 3
1000

Si tenga presente che le selezioni per campi o caratteri sono alternative fra loro. Le opzioni
principali del comando sono riportate in tab. 2.18, al solito per i dettagli di funzionamento e
lelenco completo si consulti la pagina di manuale.
Opzione
-c N
-d c
-f N
-b N

Significato
specifica un intervallo di caratteri.
specifica il carattere delimitatore dei campi.
specifica un intervallo di campi.
specifica un intervallo di byte.142

Tabella 2.18: Le principali opzioni del comando cut.

Oltre a suddividere o selezionare parte del contenuto di un file, esistono molte situazioni in
cui occorre eseguire manipolazioni di altra natura, ed un secondo insieme di comandi `e stato
fornito a questo scopo. Come contraltare a cut, il comando paste permette di concatenare file
diversi in colonna. Il comando prende come argomenti i nomi di una serie di file, e produce in
uscita un file le cui righe sono lunione delle righe dei file in ingresso, separate da dei caratteri di
tabulazione. Se non si specifica nessun file il comando legge dallo standard input, che pu`o essere
usato anche allinterno di una sequenza di file indicandolo con -.
Quando i file hanno dimensioni diverse il file prodotto sar`a esteso alla lunghezza (in righe)
del pi`
u lungo dei file in ingresso, in cui le righe finali avranno dei campi vuoti in corrispondenza
alle righe mancanti nei file pi`
u corti.
138

il comando conta da 1 per il carattere ad inizio riga.


di default il comando usa come separatore il carattere di tabulazione.
140
cio`e con liste separate da virgole ed intervalli.
141
il formato del file /etc/passwd `e trattato in sez. 4.3.2, e vedremo grep, che consente di effettuare la ricerca
di una stringa in un file, in sez. 2.2.5.
142
si pu`
o cio`e specificare un intervallo di byte sullintero file.
139

100

CAPITOLO 2. LA SHELL E I COMANDI

Con lopzione -s invece paste pu`


o effettuare una trasposizione dei file, in cui il contenuto
(in righe) di ciascuno di essi viene messo in colonna su di ununica riga. Se si usano pi`
u file in
ingresso saranno generate tante righe quanti sono i file. Con lopzione -d si possono modificare
i caratteri usati per la separazione delle colonne, lopzione prende come parametro una stringa
i cui caratteri saranno usati in sequenza come separatori fra le varie righe, nellordine in cui li
si sono indicati. Al solito i dettagli si trovano nella pagina di manuale, ma in questo caso sono
pi`
u esaurienti le informazioni sui comandi generici di unix disponibili nel sistema degli info files,
accessibili con info coreutils (vedi sez. 2.4.2).
Un altro comando che permette di eseguire una unione per righe `e join, che per`o opera solo
su due file, che devono essere passati come argomenti, ed esegue lunione sulla base della presenza
di un campo comune, che viene ripetuto una sola volta nelloutput finale. In questo caso si pu`o
specificare luso dello standard input indicandolo con - negli argomenti, ma ovviamente solo
per uno dei due file di ingresso.
Il comando opera di default usando come separatori gli spazi,143 utilizzando la prima colonna
come campo comune. Questultimo pu`
o essere cambiato per entrambi i file con lopzione -j,
seguita dal numero della posizione; se il campo comune avesse posizione diversa nei due file
si pu`o impostare questultima in maniera separata per ciascuno di essi rispettivamente con le
opzioni -1 e -2 (sempre seguite dal numero della posizione).
Il comando verifica se in entrambi i file `e presente il campo comune e in tal caso scrive in uscita
una riga corrispondente, si tenga presente che il campo deve corrispondere esattamente (ma si
pu`o usare lopzione -i per richiedere una corrispondenza case-insensitive) e che la scansione
`e eseguita a partire dal primo file una riga alla volta cercando un campo corrispondente nel
secondo, e che una volta trovata la corrispondenza la ricerca prosegue, in entrambi i file, dalla
riga seguente.144
Opzione
-1 N
-2 N
-j N
-i
-e tag
-t c

Significato
specifica qual`e il campo comune nel primo file.
specifica qual`e il campo comune nel secondo file.
specifica qual`e il campo comune.
la corrispondenza del campo comune `e verificata in
modalit`
a case insensitive.
specifica un valore da mettere al posto dei campi assenti.
specifica un carattere da usare come separatore.

Tabella 2.19: Le principali opzioni del comando join.

Se ci sono campi vuoti in corrispondenza di un valore questi possono essere riempiti con una
stringa fissa indicata come parametro per lopzione -e, e si pu`o cambiare il carattere usato come
separatore dei campi usando lopzione -t; lelenco delle opzioni principali `e riportato in tab. 2.19.
Al solito si pu`o fare riferimento alla pagina di manuale, ma anche questo caso le informazioni
pi`
u dettagliate sono disponibili nel sistema degli info files, accessibili con info coreutils.
Un altro programma molto utile `e sort, che permette di ordinare il contenuto di un file.
Il comando prende come argomento un file e ne stampa il contenuto con le righe in ordine
alfabetico. Dato che se non si specifica nessun file il comando opera sullo standard input, pu`o
essere usato di nuovo in una catena di comandi per riordinare luscita di un altro comando. Cos`
se si vuole riordinare un elenco baster`
a darlo in pasto a sort.
Le opzioni di sort permettono di controllare le modalit`a di ordinamento, ad esempio con -b
si pu`o dire al comando di ignorare gli spazi allinizio delle righe, con -r di invertire lordinamento,
con -n di ordinare le stringhe che contengono numeri sulla base del valore di questi e non di
143

sia per la suddivisione in colonne dei file in ingresso che per la scrittura dei risultati in uscita.
questo significa ad esempio che se il campo della prima riga del primo file corrisponde al campo della quarta
riga del secondo file, la ricerca di corrispondenza del campo della seconda riga del primo file inizier`
a a partire
dalla quinta riga del secondo, e leventuale presenza di una corrispondenza nelle righe precedenti sar`
a ignorata.
144

2.2. I COMANDI DEI FILE

101

quello alfabetico (per avere 2 prima di 10), con -f di non differenziare fra maiuscole e minuscole.
Le principali opzioni di sort sono riportate in tab. 2.20, per lelenco completo si faccia al solito
riferimento alla pagina di manuale e alla pagina info files, accessibile con info coreutils.
Opzione
-b
-f
-n
-r
-k N,M
-t c
-u

Significato
ignora gli spazio ad inizio riga.
esegui un ordinamento case insensitive.
esegue un ordinamento numerico.
esegue lordinamento in ordine inverso.
specifica quale colonna usare come chiave.
imposta un separatore di campi.
elimina le righe duplicate.
Tabella 2.20: Le principali opzioni di sort.

In generale sort esegue lordinamento a partire dallinizio di ciascuna riga, ma con lopzione
-k `e possibile selezionare quale sezione della riga usare per lordinamento. In questo caso si
sottintende che il file sia suddiviso in campi;145 lopzione prevede che si indichino (per valore
numerico progressivo) il campo iniziale e quello finale separati da una virgola.146 Se ad esempio
si ha in nominativi.txt un elenco contenente i riferimenti di un gruppo di persone, con nome,
cognome e numero di telefono, si potr`a ottenerne una versione ordinata per cognome con il
comando:
sort -k 2,2 nominativi.txt
Un altro comando che permette di operare sul contenuto di un file `e uniq, che elimina linee
adiacenti uguali. Il comando prende come argomento un nome di file, ma se non viene specificato
niente legge lo standard input, e stampa il risultato, senza linee duplicate, sullo standard output;
usando due argomenti il secondo viene usato come file di destinazione al posto dello standard
output. Al solito varie opzioni permettono di controllare le modalit`a di funzionamento del
comando: con -i si pu`
o ignorare la differenza fra maiuscole e minuscole, con -s si pu`o specificare
il numero di caratteri ad inizio riga da non inserire nel confronto, ed infine con -d si pu`o chiedere
ad uniq di stampare soltanto le linee duplicate. Altre opzioni, al solito dettagliate nella pagina
di manuale, permettono anche selezioni pi`
u complesse.
Di nuovo considerata a se stante, lutilit`a di un comando come questo pu`o apparire limitata,
ma basta pensare alle combinazioni con altri comandi per apprezzarne la funzionalit`a. Si consideri ad esempio la necessit`
a di riunire elenchi di parole contenuti in pi`
u file (supponiamo siano
elenco1.txt, elenco2.txt, ecc.). Lo scopo `e quello di avere un file con lelenco completo in
cui tutte le parole compaiono una volta sola; questo pu`o essere ottenuto in un batter docchio
con un comando come:147
cat elenco*.txt | sort | uniq > elencofinale
Un altro comando che si usa per manipolare il contenuto di un file `e tr, il cui nome sta per
TRanslate. Lo scopo del comando `e quello di effettuare delle sostituzioni dei caratteri. Come
tutti i comandi opera esso opera direttamente su un file qualora questo sia specificato a riga di
comando altrimenti utilizza lo standard input, scrivendo il risultato sullo standard output; in tal
modo lo si pu`
o utilizzare come un filtro di conversione.
145

di default il comando considera i campi separati da un numero arbitrario di caratteri vuoti, come spazi e
tabulatori, ma si pu`
o specificare un carattere di separazione con -t.
146
il campo finale (e la virgola di separazione) pu`
o essere omesso nel qual caso sort user`
a tutto il resto della
riga.
147
in realt`
a sort consente anche di rimuovere le righe duplicate con lopzione -u e luso finale di uniq in questo
caso non servirebbe.

102

CAPITOLO 2. LA SHELL E I COMANDI

Il comando pu`
o prendere uno o due argomenti. Il primo indica un insieme di caratteri di
cui eseguire la ricerca nel file, il secondo, quando presente, indica la lista dei caratteri con cui il
corrispondente carattere del primo insieme deve essere sostituito. In genere quando si specificano
due argomenti questi devono specificare due insiemi almeno della stessa dimensione. Qualora
questo non avvenga il secondo insieme viene esteso ripetendone lultimo carattere, a meno di
non usare lopzione -t che tronca invece il primo insieme alle dimensioni del secondo. Se invece
il secondo insieme `e pi`
u lungo vengono utilizzati solo i caratteri iniziali.
Qualora si specifichi lopzione -d il secondo insieme viene ignorato, e tutti i caratteri del
primo insieme vengono cancellati. Se invece si specifica lopzione -c il primo insieme viene
considerato come quello dei caratteri che non devono corrispondere. Infine usando lopzione -s
si possono strizzare preventivamente le ripetizioni di un qualunque carattere del primo insieme
trasformandole in un carattere singolo (che poi potr`a essere sostituito). Lelenco delle opzioni
principali `e riportato in tab. 2.21.
Opzione
-c
-d
-s
-t

Significato
seleziona i caratteri che non sono indicati nel primo insieme.
cancella i caratteri indicati nel primo insieme.
rimpiazza le occorrenze ripetute dei caratteri del primo insieme.
tronca il primo insieme alla lunghezza del secondo.
Tabella 2.21: Le principali opzioni di tr.

Le liste dei caratteri in genere si possono esprimere direttamente con delle stringhe, il comando per`o supporta anche le classi di caratteri definite in tab. 2.25, e si possono usare gli
identificatori ivi riportati. Inoltre lutilizzo del carattere di escape \ permette non solo di proteggere i caratteri speciali, ma di inserire negli insiemi caratteri non stampabili secondo quanto
riportato in tab. 2.22. Per la sintassi completa del comando ed i dettagli riguardo le varie forme
che si possono utilizzare per specificare gli insiemi dei caratteri si faccia comunque riferimento
alla pagina di manuale, al solito accessibile con man tr.
Espressione
\NNN
\\
\a
\b
\f
\n
\r
\t
\v

Significato
carattere specificato col suo valore numerico ottale.
barra trasversa.
bell (suona sul terminale).
cancella indietro (backspace).
pagina nuova (form feed ).
a capo (new line).
ritorno carrello (return).
tabulazione orizzontale.
tabulazione verticale.

Tabella 2.22: Caratteri speciali ad uso del comando tr.

Analoghi a tr, ma con uno scopo molto pi`


u limitato, sono i due programmi expand e unexpand che servono rispettivamente a convertire tabulazioni in spazi e viceversa. Entrambi prendono lopzione -t. Questa, se seguita da un numero singolo, permette di specificare le dimensioni
del tabulatore, mentre si possono impostare le diverse posizioni delle tabulazioni se il parametro
viene specificato come lista di numeri separata da virgole. Per i dettagli di nuovo si pu`o fare
riferimento alle rispettive pagine di manuale.
Unaltra serie di programmi attinenti lelaborazione del contenuto dei file sono quelli relativi
a compressione e decompressione degli stessi. Nei primi sistemi Unix veniva usato a questo scopo
il comando compress, una alternativa, nata sotto DOS, `e invece zip. Entrambi i programmi
sono stati portati su Linux, anche se con alcune limitazioni dovute alla presenza di brevetti

2.2. I COMANDI DEI FILE

103

software. Per questo motivo il comando di compressione pi`


u usato `e gzip, creato dal progetto
GNU per sostituire i due precedenti.148
Se utilizzato senza opzioni il comando richiede come argomenti la lista dei file da comprimere,
una volta completata la compressione ciascun file verr`a sostituito dalla versione compressa,
riconoscibile per il suffisso .gz, mantenendo tutte le altre propriet`a del file originale (tempi,
permessi e proprietario).149 La decompressione di un file pu`o essere effettuata invocando il
comando con lopzione -d, ma `e molto pi`
u comune eseguirla invocando il comando stesso come
150
gunzip.
In questo caso il file .gz verr`a decompresso, ed una volta riottenuto il file originale,
cancellato.
Una ulteriore modalit`
a con cui si pu`o invocare il comando `e come zcat, che consente di
decomprimere un file inviando il risultato sullo standard output, cos` da poterne utilizzare i
contenuti con una pipeline. In questo caso il comando `e identico allinvocazione di gzip -d c,151 dove lopzione -c serve a richiede di inviare il risultato del comando sullo standard output.
Le principali opzioni del comando sono riportate in tab. 2.23, per tutti i dettagli si consulti al
solito la pagina di manuale.
Opzione
-c
-d
-l
-t

Significato
invia i risultati sullo standard output.
decomprime anziche comprimere.
stampa le caratteristiche dei file compressi.
controlla lintegrit`
a dei file compressi.

Tabella 2.23: Le principali opzioni di gzip.

Benche gzip sia un programma di compressione abbastanza efficiente e veloce, lalgoritmo


utilizzato non `e uno dei pi`
u potenti, per questo motivo, se si vogliono ottenere delle compressioni maggiori, `e disponibile un altro programma, bzip2, che utilizza un diverso algoritmo di
compressione pi`
u efficiente ma anche molto pi`
u lento. In questo modo `e possibile ottenere una
compressione maggiore a scapito di un tempo di processo dei file pi`
u lungo.
A parte lalgoritmo di compressione, e luso del suffisso .bz2 per i file compressi, le differenze
con gzip sono minime: le opzioni -c, -d e -t sono identiche, e sono disponibili come alternative
a zcat e gunzip gli equivalenti bzcat e bunzip2. Anche in questo caso per i dettagli si pu`
o fare
riferimento alla pagina di manuale.
Trattiamo infine un terzo insieme di programmi che operano su file di testo principalmente a
scopo di riformattarne adeguatamente il contenuto. Il primo di questi `e pr che serve a suddividere
il testo in pagine, numerate progressivamente dal programma stesso, in un formato adatto alla
stampa (da cui deriva il nome); il programma supporta numerose opzioni volte a configurare in
maniera diversa le modalit`
a con cui viene effettuata la suddivisione in pagine ed impostare le
informazioni mostrate in testa e coda delle stesse.
Il secondo programma `e fmt che riformatta il file in uscita paragrafo per paragrafo, permettendo di impostare caratteristiche come indentazioni della prima riga e numero di spazi e
mantenere una lunghezza costante della riga. Di nuovo le varie modalit`a con cui si pu`o compiere
la formattazione sono controllate dalle opzioni, per le quali si rimanda alla pagina di manuale.
Il terzo programma `e fold che si limita invece a spezzare le righe troppo lunghe, inserendo
degli a capo, rispetto ad una dimensione fissa da assegnare alle stesse, specificabile con lopzione
148
cosa che `e possibile al 100% soltanto per compress che infatti viene normalmente sostituito con gzip, il
problema con zip si presenta in caso di archivi di file, perche gzip `e in grado di operare soltanto su file singoli;
per gli archivi infatti si usano altri programmi (vedi sez. 4.1.2), per cui in caso di archivio creato con zip si dovr`
a
utilizzare il comando unzip.
149
qualora il nuovo file gi`
a esistesse il programma si blocca chiedendo se deve sovrascriverlo.
150
`e comune infatti avere gunzip come hard link a gzip, anche se alcune distribuzioni preferiscono usare uno
script di shell per lanciare gzip -d.
151
vale anche in questo caso quanto detto per gunzip, anche zcat pu`
o essere installato come hard link a gzip.

104

CAPITOLO 2. LA SHELL E I COMANDI

-w. Questo `e il pi`


u semplice dei comandi di formattazione, con forse leccezione di nl, che, come
indica il nome, serve a numerare le linee di ciascun file. Di nuovo si pu`o fare riferimento alle
rispettive pagine di manuale per le singole opzioni.

2.2.5

Ricerche ed elaborazioni sui file attraverso le espressioni regolari

Abbiamo visto in sez. 2.2.2 come find ci permetta di trovare un file in base al nome e alle sue
propriet`a generali,152 non abbiamo parlato per`o di come effettuare ricerche allinterno dei file
stessi in base al loro contenuto. Il comando che implementa questa funzionalit`a `e grep, che
usato in forma elementare serve a cercare una stringa di caratteri allinterno di uno o pi`
u file;
la potenza di questo comando (e delle varie versioni evolute, come egrep) `e dovuta al fatto che
consente di effettuare ricerche estremamente evolute attraverso luso delle cosiddette espressioni
regolari.153
Luso elementare di grep `e banale, il comando prende come primo argomento la stringa da
cercare seguita dal nome del file o dei file (se se ne indica pi`
u di uno) in cui effettuare la ricerca.
Il comando stampa in uscita ogni riga del file nella quale ha rilevato una corrispondenza, e se
si sono indicati pi`
u file precede la riga con il nome del file. Ad esempio se si cerca la stringa
Dispense nei file di questa guida si otterr`a:
piccardi@anarres:~/truedoc/corso$ grep Dispense *.tex
Struttura.tex:%% Dispense amministrazione base
baseadm.tex:%% Dispense editor e amministrazione di base
corso.tex:%% Corso Linux : Dispense dei corsi GNU/Linux di Truelite
netadmin.tex:%% Dispense Amministrazione di rete
shell.tex:%% Dispense amministrazione base
struttura.tex:%% Dispense amministrazione base

Altre opzioni del comando sono -i che permette di effettuare ricerche case insensitive, -r
che effettua la ricerca ricorsivamente qualora nellelenco dei file si sia indicata una directory, e
-v che inverte il risultato della ricerca (cio`e stampa le righe che non corrispondono alla stringa
utilizzata). Le opzioni del comando sono moltissime ma si sono riportate le pi`
u importanti in
tab. 2.24; al solito si rimanda alla pagina di manuale per una descrizione pi`
u completa.
Come molti altri comandi anche grep legge, qualora non gli si sia passato nessun file come
argomento, dallo standard input, i risultati al solito vengono scritti sullo standard output. Diventa
allora evidente la sua utilit`
a come filtro per selezionare a piacere, sulla base delle opportune
corrispondenze, le righe di un file. Si noti come facendo cos` si possano effettuare ricerche
sempre pi`
u mirate semplicemente concatenando in successione diverse chiamate al comando.
Come accennato la vera potenza di grep sta nel fatto che la ricerca non viene semplicemente
eseguita sulla corrispondenza ai caratteri contenuti nella stringa passata come argomento, ma
nel fatto che questultima viene interpretata, attraverso luso di alcuni caratteri riservati, come
un pattern allinterno del file, indicato con una speciale sintassi che `e quella delle espressioni
regolari.
La trattazione dettagliata delle espressioni regolari va ben al di l`a delle possibilit`a di questo
testo,154 qui ci limiteremo a fornire la descrizione delle funzionalit`a pi`
u elementari. Una espressione regolare `e in sostanza una stringa di caratteri che identifica un pattern, cio`e una struttura
ordinata di caratteri e stringhe, di cui cercare loccorrenza in un file eseguendo loperazione che
viene usualmente chiamata pattern matching.
152

in sostanza ci si `e limitati al nome e alle altre caratteristiche mantenute nellinode.


le espressioni regolari, o regex, dallinglese regular expression, sono una specie di estensione del sistema del
filename globbing (che abbiamo illustrato in sez. 2.1.3) in cui, attraverso una serie di operatori, si possono effettuare
corrispondenze fra stringhe con un grado di complessit`
a incredibilmente elevato; questo le rende allo stesso tempo
uno degli strumenti pi`
u potenti ed uno degli argomenti pi`
u ostici del mondo Unix.
154
un buon testo sullargomento `e [RegExp].
153

2.2. I COMANDI DEI FILE


Opzione
-b
-c
-E
-e
-G
-H
-h
-i
-m N
-n
-P
-r

-s
-v
--color

105

Significato
stampa la posizione nel file (in byte) in testa a ciascuna riga in output.
non stampa le righe con le corrispondenze, ma solo il numero totale
delle stesse.
interpreta la stringa di ricerca come una espressione regolare estesa.
indica esplicitamente la stringa di ricerca (serve a proteggere stringhe
di ricerca che iniziano con -).
interpreta la stringa di ricerca come espressione regolare normale (il
default).
stampa il nome del file in testa a ciascuna riga di output (anche se si
ricerca su un solo file).
sopprime la stampa del nome del file in testa a ciascuna riga di output
(quando sono pi`
u di uno).
non distingue fra maiuscole e minuscole.
sospende la stampa in uscita dopo N corrispondenze.
stampa il numero di riga del file in testa a ciascuna linea in uscita.
interpreta la stringa di ricerca come espressione regolare in stile Perl.
esegue la ricerca in forma ricorsiva, ripetendola anche per tutti i file
contenuti nelle sottodirectory di quelle passate in ingresso (pu`
o essere
specificata anche come -R).
sopprime la stampa degli errori al riguardo di file non leggibili o non
esistenti.
inverte la selezione, stampa le linee non corrispondenti.
colora diversamente il testo corrispondente (disponibile solo nelle
versioni pi`
u recenti di GNU grep).
Tabella 2.24: Principali opzioni del comando grep.

In maniera analoga ad una espressione matematica una espressione regolare viene costruita
combinando delle espressioni elementari attraverso gli opportuni operatori. Gran parte dei
caratteri (tutte le lettere, maiuscole o minuscole, e i numeri) di una espressione regolare non viene
interpretata, e la loro presenza richiede semplicemente la presenza di un corrispondente carattere
nel contenuto su cui si effettua la ricerca, alcuni caratteri sono invece riservati per svolgere il ruolo
di operatori; uno di questi `e la barra rovescia \ con la quale si pu`o richiedere linterpretazione
letterale del carattere successivo (bloccandone linterpretazione come operatore).
Il carattere ^ viene utilizzato per identificare linizio di una riga, mentre il carattere $
serve ad identificarne la fine; pertanto si potranno identificare i commenti in uno script di shell
con lespressione regolare ^# mentre con lespressione ^$ si identificheranno le righe vuote. Il
carattere . viene invece utilizzato nelle espressioni regolari per indicare un carattere qualunque.
Classe
[:alnum:]
[:alpha:]
[:cntrl:]
[:digit:]
[:graph:]
[:lower:]
[:print:]
[:punct:]
[:space:]
[:upper:]
[:xdigit:]

Significato
lettere (maiuscole e minuscole, indipendenti dalla localizzazione) e
numeri.
lettere (maiuscole e minuscole, indipendenti dalla localizzazione).
caratteri di controllo.
caratteri numerici.
caratteri stampabili (esclusi gli spazi).
lettere minuscole.
caratteri stampabili (caratteri vuoti compresi).
caratteri di punteggiatura.
caratteri vuoti verticali ed orizzontali (spazi, tabulatori, ritorni a capo).
lettere maiuscole.
cifre esadecimali.

Tabella 2.25: Le classi di caratteri utilizzabili nelle espressioni regolari.

Alcune delle espressioni usate nel filename globbing di sez. 2.1.3 si ritrovano anche nelle

106

CAPITOLO 2. LA SHELL E I COMANDI

espressioni regolari, anche se in questo caso assumono un significato leggermente diverso.155 In


particolare le parentesi quadre vengono utilizzate come nel filename globbing per indicare una
lista o un intervallo di caratteri (ad esempio [aeiou] indica le vocali e [a-z] le minuscole),
la differenza col filename globbing `e che in questo caso il carattere ^ messo allinizio viene
interpretato come inversione della lista seguente (ad esempio con [^A-Z] si indicano tutti i
caratteri che non siano una lettera maiuscola). Oltre a liste e intervalli specificati direttamente si
possono indicare fra parentesi quadre una serie di classi predefinite di caratteri con le espressioni
riportate in tab. 2.25.
Anche i caratteri * e ? assumono un significato simile a quello del filename globbing,
ma nel caso delle espressioni regolari questo accade perche essi vanno a far parte di un gruppo
particolare di operatori che sono chiamati operatori di ripetizione, riportati in tab. 2.26. Gli
operatori di ripetizione si applicano alloggetto che li precede (che sia un carattere singolo o una
espressione complessa) e richiedono che loccorrenza dello stesso avvenga un certo numero di
volte, nel caso di * questo pu`
o essere un numero qualunque (compreso nessuna) mentre con
? si richiede che sia al pi`
u una volta (di nuovo lo zero `e compreso). Spesso risulta utile luso
delloperatore + che richiede la presenza di almeno una volta.
Operatore
?
*
+
{n}
{n,}
{n,m}

Significato
lespressione precedente pu`
o corrispondere zero o una volta.
lespressione precedente pu`
o corrispondere da zero ad un
qualsiasi numero di volte.
lespressione precedente pu`
o corrispondere da uno ad un
qualsiasi numero di volte.
lespressione precedente deve corrispondere esattamente n volte.
lespressione precedente deve corrispondere n o pi`
u volte.
lespressione precedente deve corrispondere fra n e m volte.

Tabella 2.26: Gli operatori di ripetizione nelle espressioni regolari.

Questo significato `e di nuovo leggermente diverso da quello presente nel filename globbing,
in particolare una espressione come ab* nel primo caso seleziona tutti i file il cui nome inizia
per ab seguito da un numero qualunque di altri caratteri qualsiasi, mentre nel secondo caso
corrisponde ad una linea che contenga una a seguita da un numero qualunque (compreso zero)
di b, per cui anche una stringa come ac corrisponderebbe. Per riottenere lo stesso significato
precedente con una espressione regolare occorrerebbe usare la stringa ab.*, in questo modo
si richiede la presenza iniziale di entrambe le lettere a e b seguite da un qualunque numero
(indicato da *) di qualunque altro carattere (indicato da .).
Negli esempi appena mostrati gli operatori di ripetizione sono applicati solo al carattere che
li precede, `e possibile per`
o applicarli ad una intera espressione regolare mettendola fra parentesi
tonde, usando quello che viene chiamato un raggruppamento. Ad esempio per trovare in questo
testo gli errori di battitura in cui si era scritto due volte la parola una si `e usato il comando:
piccardi@hain:~/truedoc/corso$ grep -E (una ){2,} *.tex
shell.tex:mentre nel secondo caso corrisponde ad una una linea che contenga una

dove appunto si `e richiesto che loccorrenza della stringa una avvenisse almeno due volte di
fila.
Un raggruppamento viene a costituire quello che viene chiamato un subpattern; e non solo si
pu`o richiedere, con luso degli operatori di ripetizione la presenza multipla di uno stesso pattern,
ma si pu`o anche usare loperatore | posto fra due raggruppamenti per richiedere la presenza
alternativa di uno di essi. Cos` si pu`
o richiedere la presenza della parola pluto o della parola
pippo nella stessa riga con:
155

queste differenza sono spesso causa di confusione ed errori.

2.2. I COMANDI DEI FILE

107

piccardi@hain:~/truedoc/corso$ grep \(pluto\)\|\(pippo\) shell.tex


opzione mentre, non necessitando questa di nessun parametro, \texttt{pippo},
\texttt{pluto} e \texttt{paperino} verranno considerati come argomenti che nel
...

In questo caso la sintassi varia a seconda che si usi la sintassi delle espressioni regolari semplici
(quelle di default) nelle quali le parentesi tonde e la | devono essere protetti156 con la barra
trasversa \ o quella delle espressioni regolari estese (quelle attivate con lopzione -E) dove la
protezione non `e necessaria.
Luso dei subpattern ha poi unulteriore vantaggio, e cio`e che tutte le volte che uno di questi
viene trovato, il suo valore viene memorizzato in un elenco progressivo (secondo la sua posizione
nellespressione regolare) e detto valore pu`o essere referenziato (e riutilizzato allinterno della
stessa espressione) con luso delle sequenze speciali \1, \2, ecc. Cos` se ad esempio si vogliono trovare tutte le righe in cui compare due volte, in posizione qualsiasi, una stessa identica
combinazione di almeno 10 caratteri si potr`a utilizzare lespressione:
piccardi@hain:/usr/share/common-licenses$ grep -E (.{10,}).*\1 GPL
patent must be licensed for everyones free use or not licensed at all.
running the Program is not restricted, and the output from the Program
conspicuously and appropriately publish on each copy an appropriate
with the Program (or with a work based on the Program) on a volume of
Software Foundation, write to the Free Software Foundation; we sometimes

dove fra parentesi si `e richiesta la selezione di 10 caratteri consecutivi qualunque e poi si `e


richiesto che la stessa selezione di caratteri comparisse di seguito sulla stessa linea (con interposti
un numero qualunque di altri caratteri).157
Se grep utilizza le espressioni regolari per eseguire delle ricerche sui contenuti di un file,
consentendo selezioni molto complesse, un altro comando, sed, il cui nome sta per Stream
EDitor le usa per effettuare manipolazioni del contenuto. Il programma serve per eseguire una
serie di trasformazioni su un flusso di dati, analoghe a quelle che potrebbero essere fatte usando
un normale editor su un file. Questo consente di poter utilizzare il comando in una catena di
pipeline che mettano in grado di effettuare modifiche anche molto complesse nel passaggio dei
dati dallo standard input allo standard output.
Il comando prende come primo argomento una espressione di editing che indica le operazioni
da eseguire, a meno che non la si sia specificata nel contenuto del file indicato con lopzione -f o
come parametro per lopzione -e. I restanti argomenti, se presenti, indicano i file su cui applicare
la suddetta espressione; se non `e presente nessun altro argomento lo script viene applicato sullo
standard input. Le principali opzioni sono riportate in tab. 2.27.
Opzione
-e expr
-f file
-n
-r

Significato
indica esplicitamente che largomento seguente `e lespressione contenente i comandi di editing da applicare.
indica un file contenente lespressione dei comandi di
editing.
sopprime la stampa del pattern space che avviene alla fine
del processo di ogni riga.
usa le espressioni regolari estese.

Tabella 2.27: Principali opzioni del comando sed.

A meno di non utilizzare lopzione -n il comando stampa tutto quanto `e stato letto in
` cos` possibile salvare il
ingresso (con le eventuali modifiche apportate) sullo standard output. E
156
allinterno dellespressione regolare stessa, si noti infatti come si sia espressa questultima fra degli apici singoli
per bloccare linterpretazione degli stessi caratteri da parte della shell.
157
cosa che pu`
o essere resa pi`
u evidente, usando le ultime versioni di grep, usando lopzione --color, che pu`
o
risultare di grande aiuto quando si eseguono selezioni complesse e ci si trova a che fare con risultati inaspettati.

108

CAPITOLO 2. LA SHELL E I COMANDI

risultato del filtraggio redirigendo loutput del comando. Lopzione -n `e fornita per permettere
(allinterno dei vari comandi) di eseguire una stampa in uscita solo quando lo si ritiene opportuno
(ed ottenere pertanto un risultato diverso).
La potenza di sed sta nella grande flessibilit`a dei comandi che possono essere dati tramite
lespressione di editing, alcuni di questi infatti utilizzano le espressioni regolari per individuare
dei pattern nel file, ed operare su di essi compiendo sostituzioni, cancellazioni, ecc.
Le espressioni di editing sono normalmente divise in indirizzi e comandi. Un indirizzo esprime
linsieme delle righe del file originario a cui si applica il successivo comando. Un singolo indirizzo
indica la riga cui si applica il comando, con due indirizzi separati da una virgola si indica un
intervallo di righe, mentre quando, come nella maggior parte dei casi, non si specifica nessun
indirizzo, il comando si applica a tutte le righe del file. Infine se ad un indirizzo si fa seguire
(prima del comando) il carattere ! la selezione delle righe viene invertita.
In genere un indirizzo viene specificato tramite il numero della relativa riga (ad esempio
10 indica la riga 10, 5,15 indica le righe dalla quinta alla quindicesima e 3,7! tutte le
righe escluse quelle nellintervallo fra la terza e la settima. Sono per`o possibili delle selezioni
pi`
u complesse, come $ che indica lultima riga del file, o /regexp/ che seleziona le righe
corrispondenti ad una espressione regolare messa fra le due barre;158 un elenco delle principali
forme con cui si pu`
o specificare un indirizzo `e riportato in tab. 2.28.
Espressione
N
N,M
N~M
/regexp/
$
N,+M

Significato
selezione la N-sima riga.
seleziona le righe dalla N alla M.
selezione le righe a partire dalla N-sima a passi di M.
seleziona le righe che corrispondono allespressione
regolare /regexp/.
seleziona lultima riga del file.
seleziona M righe a partire dalla N-sima.

Tabella 2.28: Espressioni per specificare un indirizzo al comando sed.

Una volta specificato lindirizzo la seconda parte di una espressione di editing `e composta
da un comando. Un comando viene sempre introdotto da un carattere di controllo, seguito da
eventuali parametri. I comandi possono essere ripetuti e raggruppati con luso delle parentesi
graffe, ed in genere vengono scritti uno per riga e possono essere letti da un file con lopzione -f.
Per capire lazione dei vari comandi occorre capire come sed effettua la manipolazione dei
dati e dove questi sono mantenuti. Quando una riga viene letta da un file essa viene posta
nel cosiddetto pattern space dove vengono effettuate tutte le operazioni e la manipolazione del
contenuto: `e cio`e nel pattern space che si troveranno le modifiche eseguite al contenuto originale
dalle operazioni di sed. Il comando prevede inoltre anche la presenza di un altro spazio, chiamato
hold space, che inizialmente `e vuoto e dove `e possibile inviare dati a partire dal pattern space
per poterli riprendere successivamente; questo permette operazioni complesse in cui i dati sono
opportunamente spostati e ricombinati allinterno di detti spazi.
Lelenco dei comandi pi`
u comuni `e riportato in tab. 2.29; ma sed ne supporta molti altri.
Un elenco completo con una descrizione sommaria si pu`o trovare nella pagina di manuale, ma la
documentazione completa, fornita anche di parecchi esempi, `e disponibile solo nelle pagine info,
accessibili con info sed.
Il pi`
u importante ed utilizzato, e lunico che tratteremo esplicitamente, dei comandi di sed `e
s che permette di sostituire una sezione di testo nel pattern space con unaltra. La sintassi del
comando `e nella forma s/ricerca/sostituzione/159 ed in questa forma rimpiazza (allinterno
del pattern space) la prima occorrenza della stringa ricerca con la stringa sostituzione.
158

usato in questo modo, senza dare nessun comando, sed agisce in maniera sostanzialmente identica a grep.
in realt`
a al posto del carattere / si pu`
o usare un carattere qualsiasi, che viene ad assumere il ruolo di
delimitatore; questo `e utile quando nella stringa di ricerca o di sostituzione appare tale carattere.
159

2.3. GLI EDITOR DI TESTO


Espressione
q N
p
d
s

109

Significato
esce con codice di uscita pari a N.
stampa il pattern space.
cancella il pattern space e passa al ciclo seguente.
sostituisce il testo corrispondente ad una espressione
regolare con un altro testo.

Tabella 2.29: Principali espressioni di comando per sed.

La potenza del comando sta nel fatto che la stringa di ricerca viene specificata come espressione regolare, pertanto diventa possibile fare selezioni estremamente complesse; inoltre si possono
utilizzare i subpattern per selezionare pezzi di testo che possono essere riutilizzati nella stringa di sostituzione con le usuali espressioni \1, \2, ecc. consentendo cos` manipolazioni molto
sofisticate.
Dopo la / finale si possono specificare degli ulteriori sottocomandi, ad esempio usando g
si indica al comando di sostituire tutte le occorrenze della stringa di ricerca, e non solo la prima,
con p si richiede la stampa del pattern space (si usa in genere in combinazione con lopzione
-n per far stampare solo le righe modificate) mentre specificando un numero N si esegue la
sostituzione solo per la N-sima corrispondenza trovata.

2.3

Gli editor di testo

Si `e preferito mantenere in una sezione separata la trattazione di una classe di programmi,


quella degli editor di testo, che vengono a costituire uno dei principali strumenti usati da tutti
gli amministratori di sistema. Lo scopo di questa sezione `e quello di mettere il lettore in grado di
cavarsela con i principali editor disponibili in tutte le distribuzioni, poi con il tempo e lesperienza
ognuno finir`
a con ladottarne uno come preferito.

2.3.1

Introduzione

Una delle caratteristiche fondamentali di un sistema unix-like `e, per le ragioni che tratteremo in
dettaglio in sez. 3.1.1, quella di mantenere le configurazioni dei programmi allinterno di semplici
file di testo. Per questo motivo probabilmente il programma pi`
u utilizzato dai professionisti
nellamministrazione di sistema `e leditor di testi.
Infatti anche se la disponibilit`
a di strumenti che permettono le pi`
u comuni operazioni di
amministrazione tramite una interfaccia grafica sta crescendo, questi in genere mettono a disposizione solo un limitato numero di opzioni, e non danno mai il completo controllo sul comportamento di un programma, che si pu`o ottenere soltanto operando direttamente sui file di
configurazione. Per questo motivo leditor, cio`e un programma che permetta di leggere file di
testo e modificarne il contenuto, diventa il principale strumento dellamministrazione di sistema.
Inoltre quando un qualche problema sul disco, o il classico rm -fR dato da root un po
troppo allegramente, avr`
a danneggiato qualche file essenziale o bloccato il sistema allavvio, sar`
a
160
sempre possibile usare una distribuzione su dischetto per rimettere le cose a posto,
ma l` gli
strumenti grafici non saranno disponibili. E quandanche si usasse una delle tante distribuzioni
su CD che sono in grado di fornire un desktop completo, le configurazioni sul sistema danneggiato
andrebbero comunque effettuate a mano.161
160
oggi questo `e sempre meno comune, dato che oramai i floppy disk sono totalmente obsoleti, molto pi`
u comune
per`
o `e ritrovarsi con un sistema bloccato in cui linterfaccia grafica non parte.
161
ovviamente, anche se il sistema su CD fosse dotato degli strumenti grafici di amministrazione necessari, questi
opererebbero sul sistema corrente, non su quello danneggiato.

110

CAPITOLO 2. LA SHELL E I COMANDI

Infine, anche se la diffusione della banda larga riduce il problema, usare una interfaccia grafica
da remoto resta sempre, considerazioni di sicurezza a parte, estremamente lento (e sostanzialmente impossibile senza una buona ADSL), mentre con la riga di comando si pu`o usare un
terminale remoto e fare tutto quello che si vuole anche con la banda fornita da un semplicissimo
modem analogico.
Dato che leditor di testi ha sempre avuto questo ruolo fondamentale, `e stato uno dei principali programmi applicativi, sviluppato fin dagli esordi di Unix. Per questo, come per molte
altre applicazioni di uso generale, ne esistono molte versioni, con i nomi pi`
u pittoreschi, che pur
svolgendo lo stesso compito di base (la modifica dei file di testo) vanno da quelli dotati solo delle
funzionalit`a pi`
u elementari, come ed, che permette di operare solo su una linea alla volta,162
ai pi`
u complessi e sofisticati, come emacs che ha una quantit`a infinita di funzionalit`a diverse e
viene paragonato da alcuni esagerati ad un secondo sistema operativo.
Nel prosieguo di questa sezione daremo una breve panoramica sulluso dei pi`
u comuni editor
di testo, ma restando nellottica dellamministrazione di sistema tratteremo esclusivamente di
editor accessibili da console, e quindi utilizzabili anche attraverso connessioni remote con dei
semplici modem. Non entreremo nei dettagli delluso dei singoli editor, ci limiteremo a esporre
quali sono i comandi base per leggere, modificare e scrivere su un file di testo.
La scelta delleditor resta comunque una scelta personale, che genera spesso clamorose guerre
di religione fra le fazioni dei sostenitori dei diversi editor; particolarmente virulente sono quelle
fra i sostenitori di emacs e vi, i pi`
u blasonati (per numero di utenti e tradizione di utilizzo) fra
gli editor di testi.

2.3.2

Un editor evoluto: emacs

Per molti emacs163 `e leditor. Sicuramente `e il pi`


u potente; dentro emacs si pu`o davvero fare di
tutto: navigare fra i file e in Internet, leggere la posta e le news di Usenet, programmare (con
evidenziazione della sintassi e scorciatoie ai costrutti principali di qualunque linguaggio), fare
debug, scrivere dispense come queste, giocare (a tetrix o a qualche avventura testuale), ed anche
farsi psicanalizzare dal doctor .164
Qualunque cosa sia possibile fare con del testo, con emacs si fa, infatti leditor `e programmabile,165 e per un qualunque compito specifico sono state create le estensioni pi`
u varie in grado
di eseguire operazioni complesse, gestire automatismi, abbellire la visualizzazione, ecc.
Tutto questo ha ovviamente un costo, ed infatti i detrattori di emacs ne lamentano la pesantezza (di certo non lo troverete sulle distribuzioni su dischetto), ma data la diffusione e la
potenza dello strumento, e la mia preferenza personale nei suoi confronti, ne parleremo, considerato poi che molti altri editor ne hanno copiato la sintassi e le modalit`a duso, o forniscono
modalit`a di comando compatibili.166
Inoltre sia emacs, che il cugino xemacs, che nacque proprio per questo, sono editor usabili
direttamente anche dallinterfaccia grafica, nel qual caso verranno forniti allutente gli usuali
menu a tendina in cima alla finestra, attraverso i quali si potranno trovare buona parte delle
funzionalit`a di cui essi dispongono.
Come per tutti gli editor una sessione di emacs inizia invocando il comando seguito dal nome
del file da modificare; in tal caso si otterr`a una finestra come quella mostrata in fig. 2.1. Nella
162

`e probabilmente il primo editor sviluppato in ambiente Unix; per questa caratteristica viene chiamato editor
di linea, ed ha origine ai tempi in cui i terminali erano delle telescriventi; benche oggi nessuno sia cos` masochista
da usarlo direttamente, i suoi comandi si ritrovano in altri editor e pure in programmi come sed.
163
nome che in teoria vorrebbe dire Extensible MACro System, ma `e stato ribattezzato in Eight Megs And
Constantly Swapping, oppure Escape Meta Alt Control Shift.
164
si provi ad eseguire M-x doctor...
165
in un dialetto specifico del Lisp, un linguaggio funzionale estremamente potente che consente una enorme
espandibilit`
a del programma.
166
come la shell, che usa le stesse combinazioni di tasti per lediting della riga di comando.

2.3. GLI EDITOR DI TESTO

111

Figura 2.1: Schermata di avvio delleditor emacs.

prima riga si trova il menu dei comandi, ad esso segue la sezione principale, dove compare il
testo del file ed in cui ci si muove con le frecce, terminato da una barra di stato in cui compaiono
varie informazioni (il nome del file, se sono state fatte modifiche, ecc.). Nella la riga finale viene
tenuto il cosiddetto minibuffer, in cui compaiono brevi messaggi (come nellesempio, che riporta
la scritta (Updating...done)) ed in cui si scrivono gli argomenti dei comandi pi`
u complessi.
Uno dei concetti fondamentali di emacs `e quello di buffer, qualunque porzione di testo venga
utilizzata da emacs, con leccezione del menu e della barra di stato `e mantenuta in un buffer,
sia che si tratti di un file che si `e aperto per lavorarci sopra, che del testo generato automaticamente nelle operazioni delleditor (come le liste dei file da scegliere che compaiono quando si usa
lautocompletamento). Anche il minibuffer `e un buffer, con la peculiarit`a di essere posizionato
sullultima riga ed essere utilizzato per linterazione con i comandi.
In genere un buffer viene visto su una finestra che ne mostra il contenuto ed `e terminata da
una barra di stato (nellesempio ce n`e solo una), ma allinterno di una stessa istanza delleditor
possono anche esserci pi`
u finestre che possono essere aperte sullo stesso buffer o su buffer diversi
(questo vuol dire che ad esempio la sezione centrale di fig. 2.1 pu`o venire divisa in due). Questo
permette, anche operando in console, di lavorare su due o pi`
u finestre, dato che ciascuna pu`
oa
sua volta essere suddivisa a piacere, con il solo problema che se se ne creano troppe non si vedr`
a
altro che barre di stato.
Allinterno di una finestra ci si pu`o spostare con le frecce e gli altri tasti di spostamento,167
e scrivere del testo, questo verr`
a sempre inserito nella posizione in cui si trova il cursore (nellesempio allinizio della prima riga in alto a sinistra). In genere il testo viene inserito spostando
quanto gi`
a presente nel file, a meno di non porsi nella modalit`a di sovrascrittura premendo il
tasto INS (verr`
a notificato nella barra di stato) da cui si esce ripremendo lo stesso tasto.
I comandi invece vengono dati con delle combinazioni che prevedono la pressione contemporanea di un tasto modificatore 168 e di una lettera. Molti comandi inoltre prevedono luso di
due combinazioni di tasti eseguite in successione. Data la complessit`a e la grande quantit`
a di
167

emacs prevede una grande quantit`


a di combinazioni di tasti per andare avanti ed indietro, spesso tuttaltro
che intuitive per chi proviene da altri sistemi, questo `e una conseguenza che il programma `e nato quando ancora
le tastiere non avevano ne frecce ne altri tasti di funzione.
168
si chiamano cos` i tasti che hanno un effetto solo quando sono premuti in contemporanea ad altri tasti, come
il tasto per la maiuscole, il control, ecc..

112

CAPITOLO 2. LA SHELL E I COMANDI

comandi esistono due modificatori per i comandi, il primo `e il classico control ed il secondo `e
alt il cui uso pu`
o essere simulato, per le tastiere che non ce lhanno, premendo prima il tasto di
escape (ESC), e poi la lettera relativa.
Come gi`a visto in sez. 2.1.2, dove la si `e usata senza formalizzarne la definizione, per indicare
la pressione contemporanea di un modificatore con un tasto qualunque x utilizzeremo una
notazione del tipo C-x per luso di control e M-x per luso di alt. Luso di M- deriva dal fatto
che il secondo tasto modificatore viene chiamato meta in tutta la documentazione di emacs,
perche questo era il nome che aveva quando il programma `e stato creato.
Operazione
aprire un file
salvare un file
salvare con nome
uscire
annullare
seleziona

taglia
incolla
cancella
ricerca

help
annulla

Combinazione di tasti
C-x C-f seguito dal nome del file nel minibuffer
(supporta il completamento automatico).
C-x C-s.
C-x C-w seguito dal nome del file nel minibuffer
(supporta il completamento automatico).
C-x C-c, se ci sono modifiche chiede se salvarle, scartarle
o cancellare loperazione.
C-_, C-/ o C-x u, ripetendo si torna ulteriormente
indietro nellannullamento.
C-spazio marca linizio di una regione e si porta in
modalit`
a selezione, poi basta posizionarsi nel punto
finale.
C-w una volta selezionata una regione.
C-y.
C-d in avanti e il tasto di backspace allindietro.
C-s seguito dal testo nel minibuffer esegue un ricerca incrementale sul testo specificato, C-s cerca il successivo,
C-r cerca il precedente.
C-h ? poi scegliere nella finestra quello che si vuole.
(un comando) C-g o tre volte ESC.

Tabella 2.30: I principali comandi di emacs.

In tab. 2.30 si `e riportata la lista delle principali operazioni e dei relativi comandi per eseguirle. I comandi elencati in tab. 2.30 sono attivi in qualunque modalit`a169 si usi emacs; il
programma ne mette per`
o a disposizione molti altri sia generici che specifici per il tipo di file
170
su cui si sta lavorando.
In generale poi la combinazione M-x consente di invocare qualunque
funzionalit`a chiamando per nome la relativa funzione che la realizza.171
Molti di questi comandi, ad esempio tutti quelli che richiedono limmissione di un nome di
file, usano il minibuffer per ricevere i relativi dati. Il minibuffer viene poi anche utilizzato per
stampare messaggi e avvertimenti. Inoltre in certi casi (come quello della specificazione di un
file) la selezione supporta il meccanismo dellautocompletamento (usando il tasto di tabulazione),
e la capacit`a, qualora i completamenti siano multipli, di creare automaticamente una lista di
selezione in una nuova finestra. In questo caso per spostarsi da una finestra allaltra occorrer`a
usare il comando C-x o (che ripetuto ritorna alla precedente), mentre per eliminare tutte le
finestre presenti tranne quella dove `e posizionato il cursore si potr`a usare il comando C-x 1.
169
essendo emacs un editor programmabile esso pu`
o essere usato in modalit`
a diverse a seconda del tipo di file
su cui si sta lavorando, prevedendo in ciascun caso diverse serie di combinazioni di tasti e diversi comandi di
manipolazione.
170
ad esempio scrivendo queste dispense con LaTeX si hanno tutta una serie di comandi per mettere le parole
negli indici, creare le intestazioni delle sezioni o delle tabelle, creare riferimenti a tabelle e figure presenti, ecc.
171
dato che leditor `e programmabile anche funzionalit`
a elementari sono realizzate tramite funzioni, ciascuna
delle quali ha un nome, per cui se si vuole eseguire una correzione ortografica del testo corrente si potr`
a ad
esempio invocare M-x ispell-buffer.

2.3. GLI EDITOR DI TESTO

2.3.3

113

Un editor di base, vi

Uno degli editor pi`


u popolari, presente fin dagli inizi in tutti i sistemi Unix, `e vi.172 Questo
editor deriva dagli editor di linea173 e ne eredita alcune caratteristiche; in particolare vi `e un
editor modale, in cui cio`e sia i comandi che leffetto di quanto si scrive dipendono dalla modalit`
a
di operazioni in cui il programma si trova al momento.
Questa caratteristica lo rende senzaltro assai poco intuitivo e abbastanza difficile da usare
per il novizio. Ma i fan(atici) tendono invece a considerarla una caratteristica utile in quanto
(secondo loro) con labitudine renderebbe pi`
u veloce le operazioni. Succede spesso per`o che al
primo impatto non si riesca neanche ad uscire dalleditor, specie se capita di avere a che fare
con una installazione che non ha attivato luso delle frecce.
Al contrario di emacs, di cui `e il principale concorrente, vi si usa soltanto per manipolare
file di testo, e non fornisce pertanto nessuna delle funzionalit`a pi`
u evolute di emacs (come
la possibilit`
a di fare debug dei programmi allinterno delleditor facendo riferimento diretto al
codice su cui si sta lavorando) ma resta comunque un editor molto potente.
Il principale vantaggio di vi `e che essendo molto leggero e diffuso fin dalle prime versioni
di Unix lo si trova installato praticamente su qualunque sistema e molto spesso `e anche leditor
di default. Inoltre anche se le funzionalit`a del programma originale sono veramente minime,
esistono alcune versioni pi`
u moderne, come vim, hanno introdotto una lunga serie di capacit`
a
avanzate, come levidenziazione della sintassi. Non `e detto per`o che questultimo sia sempre
disponibile al posto del vi di base e di certo non lo `e su una distribuzione di recupero, dato che
con le funzionalit`
a sono aumentate di pari passo anche le dimensioni.

Figura 2.2: Schermata di avvio delleditor vi.

Al solito vi si invoca passando come argomento il nome del file da modificare, il programma
apre il file in una finestra unica (mostrata in fig. 2.2), dove compare il testo ed in cui ci si
muove con le frecce,174 lasciando libera lultima linea, usata per specificare i parametri di alcuni
172

purtroppo i perche di questo nome si sono persi nei meandri del tempo, forse erano due lettere rimaste libere
scelte a caso ...
173
si chiamano cos` i primi editor, nati ai tempi delle telescriventi, in cui si poteva modificare solo una riga alla
volta.
174
le versioni installate in tutte le distribuzioni di Linux se non altro supportano nativamente luso delle frecce.

114

CAPITOLO 2. LA SHELL E I COMANDI

comandi o per ricevere le informazioni stampate dal programma (nel caso il nome del file, la sua
lunghezza in righe e caratteri e la posizione del cursore sulla prima colonna della prima riga).
Tutti le operazioni di vi sono eseguite con pressioni di singoli tasti, ma la possibilit`a di
dare dei comandi al programma dipende dalla modalit`a in cui ci si trova. Come accennato
infatti vi `e un editor modale e supporta due modalit`a principali: la modalit`a comando e la
modalit`a inserimento.175 In modalit`
a inserimento i tasti premuti vengono utilizzati per scrivere
il corrispondente carattere, in modalit`
a comando invece ciascun tasto viene interpretato ed
associato allesecuzione di una specifica operazione.
Quando si avvia il programma questo si pone sempre in modalit`a comando, e si potranno
eseguire le varie operazioni con la pressione del tasto corrispondente, in questo caso sullo schermo
non sar`a visualizzato nulla, se non leffetto del comando eseguito. Tutti i comandi pi`
u complessi,
ad esempio quelli che richiedono una scrittura di una espressione di ricerca o di un nome di file,
devono essere dati dalla riga di comando delleditor, che si attiva premendo :, in questo caso il
cursore si sposta dal testo e si pone sulla riga finale, dove si potr`a inserire il resto dellespressione.
Operazione
aprire un file
salvare un file
salvare con nome
uscire
annullare
seleziona
taglia
incolla
cancella
ricerca
annulla

Combinazione di tasti
:ex file
:w
:w nomefile
:q, ma se ci sono modifiche non esce; nel caso :wq le salva
mentre :q! le scarta
u solo sullultima modifica
v, e poi ci si sposta con i tasti di freccia, ma `e una
estensione esclusiva di vim
d, ma vale con questo significato solo con una selezione
fatta con vim
p inserisce lultimo oggetto cancellato.
d seguito da una altra lettera che specifica cosa cancellare;
x cancella un carattere
/ seguito da un testo o una espressione regolare
ESC annulla un comando

Tabella 2.31: Come svolgere le principali operazioni con vi.

In tab. 2.31 si `e riportata una lista delle principali operazioni relative ai compiti pi`
u comuni,
associate ai rispettivi comandi. Si tenga presente per`o che questi possono essere attivati solo
in modalit`a comando, se ci si `e posti in modalit`a inserimento (o sostituzione) prima bisogner`a
uscirne con ESC.
La pressione dei tasti corrispondenti ai relativi comandi consente di cambiare modalit`a; ad
esempio premendo i si passa in modalit`
a inserimento, e si pu`o iniziare a scrivere in corrispondenza del cursore. Ma ci sono altri comandi che permettono di entrare in modalit`a inserimento,
come a che vi entra ma portandosi al carattere seguente o A che invece va a fine riga ed anche
o che lo fa andando a capo creando una nuova riga.
` allora abbastanza frequente che un utente alle prime armi, una volta aperto un file con vi,
E
tenti di scriverci e non veda nulla finche, premuto uno di questi tasti, non si porta in modalit`a
inserimento. Il problema in genere `e che una volta entrati in modalit`a inserimento lunico modo
per uscirne `e quello di premere il tasto di escape (ESC); non sapendolo ci si trover`a bloccati ed
incapaci di uscire dal programma.176
175

ne esistono poi altre, come la modalit`


a sostituzione o la modalit`
a selezione di vim, ma non staremo ad entrare
nei dettagli.
176
in questo caso le versioni pi`
u recenti di vim sono pi`
u amichevoli, e reagiscono anche ad altre combinazioni di
tasti, come C-c, dando delle indicazioni, ma con le versioni pi`
u elementari di vi non si ha nessun avviso e si resta
completamente bloccati.

2.3. GLI EDITOR DI TESTO

Comando
h
i
j
k
w
b
0
$
i
a
A
I
o
O
r
R
x
X
s
S
dX
dd
D
cX
cc
C
yX
yy o Y
p
P
/regex
?regex
n
N
v
d
y
.
u
:h
:N
:q
:q! o ZQ
:x o ZZ
:e file
:r file
:w file
:! cmd
:s/ric /sub /

Significato
spostamento a sinistra di un carattere.
spostamento in basso di una riga.
spostamento in alto di una riga.
spostamento a destra di un carattere.
spostamento in avanti di una parola.
spostamento indietro di una parola.
spostamento ad inizio riga.
spostamento a fine riga.
vai in modalit`
a inserimento alla posizione corrente.
vai in modalit`
a inserimento al carattere seguente.
vai in modalit`
a inserimento a fine riga.
vai in modalit`
a inserimento a inizio riga.
inserisci una riga sotto quella corrente.
inserisci una riga sopra quella corrente.
rimpiazza il carattere alla posizione corrente.
sovrascrivi a partire dalla posizione corrente.
cancella il carattere alla posizione corrente.
cancella il carattere precedente la posizione corrente.
cancella il carattere corrente e vai in inserimento.
cancella la riga corrente e vai in inserimento.
seguito da un qualunque comando di spostamento X cancella dalla
posizione corrente a quella dello spostamento.
cancella la riga corrente.
cancella fino a fine riga.
come dX ma si pone in inserimento eseguita la cancellazione.
cancella la riga corrente e si pone in inserimento.
cancella fino a fine riga e si pone in inserimento.
seguito da un qualunque comando di spostamento X copia dalla
posizione corrente a quella dello spostamento.
copia lintera riga corrente.
incolla quanto cancellato dopo la posizione corrente.
incolla quanto cancellato prima della posizione corrente.
cerca lespressione regolare regex in avanti
cerca lespressione regolare regex indietro
cerca la corrispondenza successiva.
cerca la corrispondenza precedente.
entra in modalit`
a selezione (visual ) per effettuare una selezione di testo
(solo su vim).
se dato in modalit`
a selezione cancella quanto selezionato (solo su vim).
se dato in modalit`
a selezione copia quanto selezionato (solo su vim).
ripete lultimo comando.
annulla lultimo comando (con vim pu`
o essere ripetuto).
apre lhelp on line.
passa al file successivo.
esce (se non ci sono modifiche).
esce scartando le modifiche.
esce scrivendo le modifiche.
carica il file file .
include il file file alla posizione corrente.
scrive sul file file .
esegue il comando cmd .
esegue la sostituzione, con la stessa sintassi di sed (vedi sez. 2.2.5).
Tabella 2.32: I principali comandi di vi.

115

116

CAPITOLO 2. LA SHELL E I COMANDI

Una modalit`
a simile a quella di inserimento `e quella di sostituzione, in cui si entra premendo
R, in questo di nuovo tutti tasti assumeranno il loro valore letterale, ma quanto si scrive invece
di essere inserito in corrispondenza al cursore, spostando il testo gi`a presente, sovrascriver`a
questultimo. Anche da questa modalit`
a si pu`o uscire premendo il tasto di escape (ESC).
Come accennato vi supporta, essendo nato in un epoca in cui le tastiere non avevano i tasti
freccia, lo spostamento nel file con i tasti h, j, k e l che effettuano rispettivamente lo
spostamento a sinistra, basso, alto e destra. Unaltra caratteristica delleditor `e che qualunque
comando dato in modalit`
a comando pu`
o essere moltiplicato se lo si fa precedere da un numero,
per cui per abbassarsi di 10 righe si potr`
a scrivere qualcosa tipo 10j.
Si pu`o poi effettuare una ricerca sul testo con luso del tasto / (esattamente come per less
e more) per le ricerche in avanti e con ? per le ricerche indietro. Come per i due comandi citati
la ricerca viene eseguita considerando la stringa da cercare una espressione regolare, diventa cos`
possibile eseguire anche ricerche molto complesse.
Una delle caratteristiche che pu`
o lasciare pi`
u interdetti con vi `e che non esiste il classico
` possibile per`o cancellare
taglia e incolla in cui si seleziona una sezione qualunque del file,177 E
caratteri singoli (con x per quello corrente, con X il precedente), parole (con dw) e righe (con
dd), ed usare i moltiplicatori appena illustrati per cancellazioni multiple; si pu`o poi incollare
quanto appena cancellato (anche pi`
u volte se si usano i moltiplicatori) con p.
Lapertura di nuovi file deve essere fatta sulla riga di comando, e si esegue con :ex, altri
comandi che si possono utilizzare sono :w che salva il file e :x che salva ed esce, ed `e equivalente
al normale comando di uscita con salvataggio che `e :wq; luscita scartando le modifiche invece
si pu`o forzare con :q!, per questi due comandi esistono anche delle versioni da dare in modalit`a
normale e cio`e rispettivamente ZZ e ZQ.
Unaltra caratteristica interessante della linea di comando di vi `e che `e possibile dare dei
comandi di shell senza uscire dalleditor; una volta entrati sulla linea di comando del programma
infatti si pu`o usare il carattere ! come shell escape, si potr`a cio`e usare una sintassi del tipo
:!ls per ottenere la lista dei file su una schermata di servizio, da cui si potr`a uscire, tornando
alla modifica del file, premendo invio.
Unaltra funzionalit`
a presente sulla linea di comando di vi `e quella di sostituzione, attivabile
con :s; questa funzionalit`
a ha la stessa sintassi delle espressioni di sostituzione usate da sed,
potremo cio`e effettuare la sostituzione della stringa ric con la stringa sost utilizzando il
comando :s/ric/sost/g, ma come per le ricerche, potremo anche usare le espressioni regolari,
ottenendo tutte le funzionalit`
a che si sono descritte per sed in sez. 2.2.5.
Infine un elenco dei principali comandi pu`o essere ottenuto con la documentazione interna,
accessibile con :h, si `e riportato in tab. 2.32 un riassunto di quelli pi`
u importanti; la tabella `e
suddivisa in sezioni relative ai comandi per varie classi di operazioni.

2.3.4

Gli altri editor

Un altro editor leggero e potente `e joe, gli affezionati del DOS noteranno che usa la sintassi di
wordstar, un word processor testuale di quellepoca. Offre tutte le normali funzionalit`a di un
editor di testi e ha un help in linea per i vari comandi che si attiva con C-k h, che lo rende
piuttosto facile da usare. Inoltre il comando si pu`o usare in modalit`a di emulazione usando le
sintassi di altri editor; ad esempio invocandolo come jmacs user`a la sintassi di emacs.
Il comando prende al solito come argomento il nome del file che viene aperto e visualizzato
nella finestra principale, mostrata in fig. 2.3. La finestra presenta una riga di stato in testa
contenente i soliti dati (file, posizione, lunghezza ed il suggerimento per ottenere la schermata
di aiuto), seguita dalla sezione principale in cui compare il testo del file ed in cui ci si muove
177

a meno che non usiate vim, che implementa questa funzionalit`


a definendo una modalit`
a selezione (o visual )
in cui si entra con il comando v.

2.3. GLI EDITOR DI TESTO

117

Figura 2.3: Schermata di avvio delleditor joe.

con le frecce, lultima linea viene usata per mostrare i messaggi e per dare i comandi o ricevere
le informazioni, e scompare quando non `e necessaria.
In tab. 2.33 sono riportati i principali comandi per le funzionalit`a di base. Anche in questo
caso il comando non supporta il concetto classico del taglia e incolla, ma una volta selezionata
una sezione di testo consente solo o di spostarla o di copiarla.
Operazione
aprire un file
salvare un file
salvare con nome
uscire
annullare
seleziona
taglia
incolla
cancella
ricerca
annulla

Combinazione di tasti
C-k e seguito dal nome del file.
C-k x.
C-k d seguito dal nome del file.
C-k x esce e salva, C-c esce e se ci sono modifiche chiede
d eventualmente scarta.
C-_, mentre con C-^ si ripete lultima operazione.
C-k b allinizio e poi spostarsi con le frecce e dare C-k k
alla fine.
C-k m muove la regione selezionata sulla posizione
attuale.
C-k c copia la regione selezionata sulla posizione
corrente.
C-k y in avanti e backspace indietro.
C-k f seguito da un testo esegue la prima ricerca, C-L
cerca loccorrenza successiva.
(un comando) C-c.

Tabella 2.33: I principali comandi di joe.

Un altro editor per la console `e jed, scritto come reimplementazione di emacs in C, che `e
molto pi`
u leggero di questultimo (ma anche molto meno potente). Supporta anchesso per`
o un
linguaggio di programmazione interno, ed `e pertanto in grado di fornire parecchie funzionalit`
a
avanzate, e utilizzare diverse sintassi per i comandi a seconda del tipo di file. Fornisce anche
unampia capacit`
a di evidenziazione della sintassi in console che con emacs `e disponibile solo a
partire dalla versione 21.
Essendo jed in sostanza un clone di emacs non staremo a ripeterne i comandi principali, che
sono gli stessi di tab. 2.30, anche la composizione della finestra (una cui immagine `e mostrata in

118

CAPITOLO 2. LA SHELL E I COMANDI

Figura 2.4: Schermata di avvio delleditor jed.

fig. 2.4) `e analoga a quella di emacs per cui basta rifarsi quanto detto in precedenza; il vantaggio
di jed `e che lutilizzo del menu `e molto pi`
u intuitivo e avviene direttamente in modalit`a semigrafica anziche allinterno di finestre secondarie. Essendo un editor leggero ma molto potente,
si trova su varie distribuzioni su dischetto.
Un altro editor abbastanza diffuso `e pico; questo `e derivato da pine, un client per leggere
la posta elettronica in console, separando da esso leditor interno usato per scrivere le email.
Data la maggiore utilizzabilit`
a rispetto a vi esso si `e diffuso parecchio, il problema `e che siccome
pine non `e software libero, non lo `e neanche pico; per questo motivo `e stato realizzato un clone
completamente libero chiamato nano identico dal punto di vista dei comandi principali, ma pi`
u
leggero (tanto da essere usato nei dischi di avvio di Debian) e con qualche capacit`a in pi`
u.

Figura 2.5: Schermata di avvio delleditor nano.

2.4. ALTRI COMANDI

119

Il programma si invoca al solito passando come argomento il nome del file da modificare,
che viene aperto nella finestra mostrata in fig. 2.5, in cui si ha una riga di stato allinizio, e due
righe di aiuto in basso che riportano i comandi disponibili al momento, sulle quali vengono fatte
pure le eventuali richieste di immissione o richieste scelte sulle azioni da compiere.
Un altro editor molto usato `e mcedit; anche questo `e un sottoinsieme di un altro programma,
mc (nome che sta per Midnight Commander ), un file manager semigrafico utilizzabile in console
che nasce come clone del Norton Commander. Anche questo `e un editor che mantiene nella
prima riga un riassunto dei comandi principali, per cui non staremo a descriverne i dettagli.
Tutti gli editor citati sono in grado di funzionare in un terminale o dalla console, ma esistono
tutta una serie di editor grafici come quelli inseriti in Gnome (gedit) e KDE (kate) che non
sono spiegati qui in quanto linterfaccia grafica `e in grado di dare accesso alle funzionalit`a base
con i soliti menu.
Fra gli editor grafici vale la pena segnalare uno dei pi`
u evoluti: nedit che dispone di un
linguaggio di programmazione interna che ne permette una grande espandibilit`a ed `e dotato
di moltissime funzionalit`
a (forse il pi`
u vicino ad emacs); per questo `e uno degli editor pi`
u
potenti, pur restando anche facile da usare. Esistono infine anche versioni grafiche di alcuni
degli editor precedenti (come gvim per vi), mentre come gi`a accennato sia emacs che xemacs
usati dallinterfaccia grafica mettono a disposizione menu e utilizzo del mouse.

2.4

Altri comandi

Dopo aver trattato i comandi che operano sui file, in questa sezione faremo una panoramica sugli
altri principali comandi disponibili, attinenti funzionalit`a del sistema che finora non sono state
prese in considerazione, come i comandi per eseguire manipolazioni avanzate sulla redirezione,
quelli per la documentazione, quelli per gestire orologio e tempi di sistema, quelli per visualizzare
le informazioni relative agli utenti ed al sistema e quelli che consentono di ottenere una serie di
altre informazioni di vario tipo ad uso prevalentemente diagnostico.

2.4.1

I comandi di ausilio per la redirezione

Nonostante la grande flessibilit`


a degli operatori di redirezione della shell, esistono situazioni
in cui il loro uso non `e sufficiente a fornire le funzionalit`a necessarie, per questo esistono dei
comandi che permettono di estendere luso della redirezione.
Ad esempio uno dei fraintendimenti pi`
u comuni riguardo luso della concatenazione dei comandi `e quello in cui si pensa di usare la pipe per passare come argomenti ad un comando
successivo loutput di un comando precedente. Questo non `e ovviamente possibile perche luso
di una pipe consente solo di passare lo standard output di un comando sullo standard input del
successivo, e non ha nulla a che fare con gli argomenti di questultimo, che provengono dalla
linea di comando.
` per`
E
o possibile fornire questa funzionalit`a con luso del comando xargs, il cui compito `e
replicare il comportamento della shell, che legge la linea di comando e ne estrae gli argomenti. Il
comando cio`e effettua la lettura dello standard input e ne ricava una lista di argomenti da passare
ad un successivo comando, in questo modo diventa possibile ricevere gli argomenti dalloutput
di un comando precedente tramite una pipe.
Il comando xargs prende come primo argomento il nome del comando da eseguire e come
ulteriori argomenti le eventuali opzioni o argomenti iniziali da passare allo stesso. Il comando
viene poi eseguito passandogli una lista di ulteriori argomenti, ottenuta dalla scansione dello
` possibile proteggere la
standard input utilizzando gli spazi e gli a capo come separatori. E
presenza di spazi allinterno degli argomenti come si fa con la shell, usando le virgolette o la
barra trasversa. Se non si specifica nessun comando da eseguire, di default viene usato echo.

120

CAPITOLO 2. LA SHELL E I COMANDI

In questo modo se si ha una lista di file (o si `e in grado di generarla) diventa possibile


applicare a ciascun file della lista un comando qualunque usando semplicemente cat e xargs.
Se cio`e si vogliono cancellare tutti i file contenuti nel file lista, si potr`a usare un comando del
tipo:
cat lista | xargs rm -f
se invece li si vogliono copiare in una directory si potr`a usare:
cat lista | xargs cp -t dir
ovviamente nel far questo occorrer`
a stare molto attenti, `e sempre consigliabile infatti, quando
si usa xargs, lanciare il comando senza argomenti per verificare che non si stiano facendo degli
errori.
Il comando permette di impostare, con lopzione -E una stringa da usare come marcatore
per la fine del file, in modo da ignorare tutto quanto sar`a letto dopo; con lopzione -t permette
inoltre di stampare a video il comando che verr`a eseguito, e con -p di richiedere conferma
dellesecuzione sul terminale. Infine lopzione -0 richiede che le linee sullo standard input siano
terminate da zeri, e interpreta letteralmente i vari caratteri (in modo da non interpretare spazi,
virgolette, ecc.).178
I due esempi precedenti funzionano regolarmente perche i comandi utilizzati accettano come
argomenti una lista di file, quando per`
o si vogliono fare delle operazioni pi`
u complesse (ad
esempio rinominare dei file sulla base di una elaborazione del loro nome) ci si trova di fronte al
problema che programmi come mv si aspettano di avere due argomenti e non una lista.
In questo caso ci viene incontro una delle caratteristiche pi`
u interessanti di xargs, che `e
quella di poter eseguire invocazioni multiple dello stesso comando. Con lopzione -n infatti si
pu`o indicare il numero massimo di argomenti (sempre presi dalla lista ottenuta dalla scansione
dello standard input) da passare a ciascuna invocazione, se si ricevono pi`
u argomenti i successivi
saranno utilizzati per unaltra invocazione.
Se invece gli argomenti gi`
a sono suddivisi per linee, si pu`o usare lopzione -L che consente
di indicare quante linee dello standard input utilizzare per ciascuna invocazione del comando.
Cos` se volessimo rinominare tutti i file .tex di questo testo aggiungendo un _new al rispettivo
nome potremmo usare qualcosa del tipo:179
ls *.tex | sed -r -e s/(.*)(.tex)/\1\2 \1_new\2/g | xargs -L1 mv
Si sono riassunte le principali opzioni di xargs in tab. 2.34; lelenco completo delle opzioni ed
una descrizione dettagliata del comando si possono trovare come sempre consultando la pagina
di manuale, accessibile con man xargs.
Un secondo comando di ausilio per la redirezione `e tee. Il suo scopo principale `e quello di
permettere di salvare su un file un risultato intermedio allinterno di una catena di redirezioni.
In tal caso infatti luscita di un comando viene inviata sulla pipe e letta dal comando successivo,
perdendo cos` la possibilit`
a di esaminarla direttamente. Lidea che sta alla base di tee, indicata
dal suo stesso nome, `e quella di creare una sorta di percorso a T nel flusso di dati della catena
di redirezioni, in cui questi da una parte proseguono verso il comando successivo e dallaltra
vengono salvati su un file. Questo significa che la maniera pi`
u comune di utilizzare tee sar`a
qualcosa nella forma:
178
questo consente di risolvere i problemi che si hanno quando si deve operare con find su dei file che hanno degli
spazi o altri caratteri interpretati dalla shell nel nome; combinando lopzione -0 di xargs con lopzione -print0
di find si potranno trattare anche i nomi pi`
u complicati.
179
si lascia come esercizio linterpretazione dellespressione regolare usata per sed.

2.4. ALTRI COMANDI

121

Opzione
-a file
-E str

-n N
-L N
-p
-t
-r
-0

Significato
indica di leggere gli argomenti dal file file anziche dallo
standard output.
indica la stringa str da considerare come fine del file,
cos` da scartare tutto quello che segue, sostituisce nello
standard POSIX lopzione -e (tuttora presente) che ha
lo stesso effetto.
usa al massimo N argomenti per ciascuna invocazione del
comando.
usa un massimo di N linee come argomenti per ciascuna
invocazione del comando.
richiede conferma sul terminale prima di eseguire un
comando.
aumenta la prolissit`
a del comando.
non esegue nessun comando se non si ha niente in
ingresso.
richiede la terminazione dei singoli argomenti con un
carattere nullo al posto dei normali spazi e disabilita
linterpretazione dei caratteri speciali.

Tabella 2.34: Principali opzioni del comando xargs.

cmd1 | tee result | cmd2


che consente di scrivere il risultato di cmd1 sul file result ed al contempo inviarlo in pipe a cmd2
per una ulteriore elaborazione.
Alternativamente si pu`
o usare il comando in coda ad una catena di redirezioni per salvare
il risultato ed allo stesso tempo visualizzarlo sullo schermo. Luso di tee infatti permette di
effettuare una sorta di redirezione in background, in cui quello che il comando legge dallo standard
input viene scritto sia sul file passato come argomento che sullo standard output. Il comando,
come nella normale redirezione dello standard output, `e anche in grado di eseguire la scrittura
del file specificato in append, se invocato con lopzione -a. Al solito per tutti i dettagli di
funzionamento e lelenco completo delle opzioni si consulti la pagina di manuale.
Un ultimo comando usato come ausilio per la redirezione `e yes, che ha il semplice compito
(se invocato senza argomenti) di scrivere continuamente sullo standard input una serie di y.
Anche in questo caso lutilit`
a di fare un comando per un compito cos` specifico diventa evidente
solo considerando la capacit`
a della shell di concatenare i comandi, per cui si pu`o usare yes
per pilotare automaticamente lo standard input di un comando che richiede conferme (come
potrebbe essere rm -i). Il comando non ha nessuna opzione specifica e prende come argomento
opzionale una stringa, che se indicata viene scritta sullo standard input al posto di y.

2.4.2

I comandi per la documentazione

Benche talvolta possa risultare difficile trovare informazioni aggiornate sulle funzionalit`a pi`
u esoteriche, una delle caratteristiche di un sistema GNU/Linux `e quella di essere fornito di una quantit`a impressionante di documentazione, tanto che una delle risposte pi`
u frequenti alle domande
di chiarimento `e RTFM.180
Come accennato in sez. 2.2.1 ciascun comando di norma supporta da suo una opzione --help
(spesso abbreviata in -h) che permette di visualizzarne brevemente la sintassi. Dato che questa
informazione `e in genere solo uno stringato riassunto delle opzioni disponibili, la fonte primaria
delle informazioni relative ai comandi `e nelle pagine di manuale, fin qui abbondantemente citate,
che si accedono con il comando man.
180

sigla che sta, a seconda dellumore del momento, per Read The Fine Manual o Read The Fucking Manual.

122

CAPITOLO 2. LA SHELL E I COMANDI

Tutti i comandi prevedono una pagina di manuale che si accede semplicemente con la sintassi
man comando. In particolare poi gli sviluppatori di Debian hanno come impegno preciso quello di
fornire per ogni pacchetto la relativa documentazione. Ma le pagine di manuale non fanno riferimento solo ai comandi, il sistema infatti origina fin dai primi Unix e prevede la documentazione
di tutto il sistema.
Per questo le pagine di manuale sono divise in sezioni, il cui numero `e quello che compare fra
parentesi nella prima riga di ciascuna pagina dopo il nome del comando in maiuscolo. Ciascuna
sezione contiene la documentazione relativa ad un certo argomento, secondo la classificazione
riportata in tab. 2.35.181
Sezione
(1)
(2)
(3)
(4)
(5)
(6)
(7)
(8)

Significato
programmi eseguibili o comandi di shell.
system call (funzioni fornite dal kernel).
funzioni di libreria.
documentazione sui file di dispositivo.
formati dei file di configurazione.
giochi.
varie (convenzioni, informazioni generiche su argomenti).
comandi di amministrazione.
Tabella 2.35: Sezioni delle pagine di manuale.

Con il comando man si richiama la pagina di manuale, dove in genere si trova una documentazione esaustiva e dettagliata della sintassi e delle opzioni di un comando o del formato
e del significato delle direttive di un file di configurazione. Il comando supporta una serie di
opzioni che ne modificano il comportamento (riassunte in tab. 2.36) ed altre che consentono di
controllare la formattazione per inviare loutput su stampante, al solito tutti i dettagli si trovano
nella sua pagina di manuale, che, come per gli altri comandi, si accede con man man.
Opzione
-a
-k str
-f cmd
-w

Significato
mostra tutte le pagine di manuale che corrispondono.
cerca le pagine di manuale che hanno la stringa str nella
descrizione (equivalente ad apropos).
elenca le pagine corrispondenti a cmd (equivalente a
whatis).
mostra dove `e la pagina di manuale, non il suo contenuto.

Tabella 2.36: Principali opzioni del comando man.

Si tenga presente che il comando man richiama la pagina relativa al nome che si `e passato
come argomento, cercando in sequenza182 nelle varie sezioni e restituendo la prima che trova.
Per questo se esistono pi`
u versioni della stessa pagina in sezioni diverse (come ad esempio per il
comando passwd e per il file /etc/passwd) verr`a mostrata solo la prima,183 se si vuole accedere
alla seconda si dovr`
a richiamarla esplicitamente indicando la sezione come primo argomento,
con un qualcosa del tipo man 5 passwd.
Il sistema delle pagine di manuale permette comunque di verificare se esistono pi`
u pagine
associate ad uno stesso nome con il comando whatis, che stampa lelenco delle pagine ad esso
corrispondenti, cos` ad esempio avremo:
181

in realt`
a qui si sono messe solo le sezioni classiche, ci possono essere altre sezioni specifiche installate insieme
ad alcuni pacchetti come quelle della documentazione del Perl (un linguaggio di programmazione).
182
si tenga presente che la sequenza non `e detto sia quella di tab. 2.35, essa infatti si imposta nella configurazione
del sistema di gestione delle pagine di manuale, come vedremo a breve.
183
a meno di non aver specificato lopzione -a.

2.4. ALTRI COMANDI

123

piccardi@anarres:~/truedoc/corso$ whatis passwd


passwd (1)
- change user password
passwd (5)
- The password file

Unaltra funzionalit`
a utile del sistema delle pagine di manuale `e fornita dal comando apropos
che permette di effettuare la ricerca della parola passata come argomento fra le descrizioni brevi
dei comandi che compaiono nella intestazione delle pagine di manuale (quelle appena mostrate
anche nelloutput di whatis) per cui potremo eseguire la ricerca:
piccardi@anarres:~/truedoc/corso$ apropos "user password"
chage (1)
- change user password expiry information
passwd (1)
- change user password

e si noti come si siano usati i doppi apici per effettuare una ricerca su una stringa contenente
uno spazio, dato che altrimenti si sarebbero passate due stringhe al comando.
Come accennato il comando man supporta la possibilit`a di generare documentazione stampabile. Questo avviene perche in realt`a le pagine di manuale non sono scritte direttamente nel
formato in cui le vediamo su video, ma in uno speciale linguaggio di formattazione, chiamato
troff, che permette la creazione di sezioni, indici, ecc. Per questo il testo mostrato sul terminale,
`e solo uno fra i vari formati di uscita disponibili.
Tutte le volte che si richiama il comando man per visualizzare una nuova pagina di manuale
il comando dovr`
a recuperare uno di questi file generando un testo in formato opportuno per
la visualizzazione. Per evitare di ripetere il procedimento della generazione ad una successiva
invocazione tutti questi file vengono salvati, usualmente sotto /var/cache/man/, in una directory catN, dove N corrisponde alla sezione cui appartiene la pagina, cos` da poterli recuperare
velocemente.
Un secondo aspetto del sistema delle pagine di manuale `e quello dellindicizzazione dei contenuti usata dai comandi whatis e apropos; questa infatti non `e diretta (come si pu`o verificare
tutte le volte che si installa un nuovo pacchetto e non lo si trova nei risultati di detti comandi),
ma viene effettuata normalmente tramite il programma mandb, che costruisce gli opportuni file
con gli indici usati dai precedenti.
In genere il programma viene invocato periodicamente nelle operazioni giornaliere eseguite
da cron (vedi sez. 3.2.1), ma lo si pu`o anche invocare direttamente; le opzioni principali sono
-c che gli fa ricreare tutti gli indici da zero (il default `e aggiornare quelli esistenti) e -p che
non fa eseguire la ripulitura degli indici dei dati della pagine non pi`
u presenti; per la descrizione
completa delle altre opzioni ed i dettagli sul comando al solito si faccia riferimento alla sua
pagina di manuale.
Per stabilire in quale directory si trovano gli originali delle pagine, in che ordine cercarle,
dove devono essere memorizzate le pagine riformattate per la visualizzazione, dove mantenere
gli indici delle pagine presenti e delle parole su cui effettuare le ricerche, il sistema di gestione
delle man pages usa il file di configurazione /etc/manpath.config.
Il primo aspetto della configurazione `e quello della definizione delle directory in cui si trovano
le pagine di manuale; come per gli eseguibili infatti anchesse possono essere installate in diverse
sezioni dellalbero,184 una lista di tutte queste directory si pu`o stampare con il comando manpath,
ed in genere si otterr`
a qualcosa del tipo:
[piccardi@gont corso]$ manpath
/usr/local/man:/usr/share/man:/usr/X11R6/man

a meno di non aver definito in maniera diretta la variabile di ambiente MANPATH (nel qual caso
sar`a semplicemente stampato il suo valore) che permette di soprassedere il valore preimpostato
dal sistema.
184

si pensi al caso in cui si siano installate diverse versioni di uno stesso pacchetto, ad esempio una versione pi`
u
recente a mano sotto /usr/local, in tal caso le pagine di manuale saranno sotto /usr/local/man ed il sistema
deve essere in grado di vederle, ed in un certo ordine rispetto alle altre.

124

CAPITOLO 2. LA SHELL E I COMANDI

La configurazione delle directory in cui cercare le pagine di manuale `e una di quelle mantenute
in manpath.config. La direttiva MANDATORY_MANPATH serve per indicare tutte le directory che
si vuole siano sempre aggiunte (se esistono) alla lista di quelle in cui si cercano le pagine di
manuale; la direttiva prende come argomento il pathname alla directory contenente gli originali,
e deve essere ripetuta per tutte le directory che si vuole siano aggiunte alla lista.
La direttiva MANPATH_MAP indica invece la corrispondenza fra le directory dei comandi e
le relative pagine di manuale; serve per aggiornare dinamicamente la lista delle directory in
cui cercare le pagine di manuale sulla base delle directory presenti nel PATH (vedi sez. 2.1.3)
dellutente. La direttiva richiede due argomenti; il primo indica una directory contenente i
comandi, il secondo la directory delle corrispondenti pagine di manuale. Se la prima compare
nel PATH dellutente la seconda `e aggiunta al MANPATH in maniera implicita.
Infine la direttiva MANDB_MAP serve ad indicare a mandb dove devono essere messi i file degli
indici, e dove devono essere create le pagine temporanee. Un estratto del file manpath.config,
cos` come installato su una Debian Sid, `e il seguente:
MANDATORY_MANPATH
MANDATORY_MANPATH
MANDATORY_MANPATH
MANDATORY_MANPATH
...
MANPATH_MAP
/bin
MANPATH_MAP
/usr/bin
MANPATH_MAP
/sbin
MANPATH_MAP
/usr/sbin
MANPATH_MAP
/usr/local/bin
...
MANDB_MAP
/usr/man
MANDB_MAP
/usr/share/man
MANDB_MAP
/usr/local/man
MANDB_MAP
/usr/local/share/man
MANDB_MAP
/usr/X11R6/man
MANDB_MAP
/opt/man
...
SECTION
1 n l 8 3 2 3pm 3perl 5

/usr/man
/usr/share/man
/usr/X11R6/man
/usr/local/man
/usr/share/man
/usr/share/man
/usr/share/man
/usr/share/man
/usr/local/man
/var/cache/man/fsstnd
/var/cache/man
/var/cache/man/oldlocal
/var/cache/man/local
/var/cache/man/X11R6
/var/cache/man/opt
4 9 6 7

Lultima direttiva, SECTION, indica lordine di ricerca delle pagine di manuale nelle varie
sezioni, si noti come nellesempio appena citato ci siano altre sezioni oltre a quelle classiche
illustrate in tab. 2.35.
Oltre alla consultazione delle pagine di manuale, una seconda fonte di informazioni e documentazione `e costituita dal sistema di help on line fornito dal comando info e dalle cosiddette
info pages. In questo caso si tratta di una forma alternativa di strutturazione delle informazioni
che usa un formato diverso e che aggiunge, rispetto alle pagine di manuale, delle caratteristiche
pi`
u avanzate e molto comode come la possibilit`a di navigare usando link ad altre pagine, una
organizzazione gerarchica strutturata ad albero con nodi e sezioni, la possibilit`a di consultare indici, ecc.185 Grazie a questa struttura info permette anche di accedere a documenti pi`
u
complessi di una semplice pagina di manuale, e vi si trovano una grande quantit`a di manuali
di grandissima importanza, come documentazione sui sistemi di sviluppo, sui linguaggi, sulle
librerie, ecc.
Data le sue caratteristiche evolute info `e il formato raccomandato dal progetto GNU, che
lo considera alternativo rispetto alle pagine di manuale. Molti per`o continuano ad utilizzare
questultime per cui alla fine i due sistemi si trovano a convivere. In genere il contenuto delle pagine di manuale `e direttamente accessibile anche con il comando info comando, ma usualmente
`e disponibile anche informazione di livello pi`
u alto; ad esempio la documentazione dettagliata
185

tanto che queste informazioni vengono utilizzate anche dai altri programmi, come i vari sistemi di help on line
degli ambienti grafici.

2.4. ALTRI COMANDI

125

dei comandi pi`


u complessi della Unix toolbox, che comprende anche le spiegazioni generali sulla
architettura scelta, viene mantenuta nelle pagine info del relativo pacchetto, accessibili con info
coreutils.
Se ci si limita a richiamare il comando info ci verr`a mostrata la radice del sistema dove sono
elencati tutti i documenti installati, e sar`a possibile iniziare la navigazione spostandosi con le
frecce, seguire i link premendo invio, tornare al livello precedente premendo u, passare al nodo
successivo con n, tornare al nodo precedente con p, andare allindice con i, effettuare una
ricerca con /, ed infine visualizzare i vari comandi disponibili con ?. La potenza del sistema `e
che, come per le pagine di manuale, i testi vengono generalmente scritti in un apposito linguaggio
di formattazione, per cui la versione testuale `e solo una delle possibili forme di visualizzazione,
e la stessa documentazione pu`
o essere facilmente acceduta anche dallinterfaccia grafica con gli
opportuni programmi di consultazione.
Infine si tenga presente che spesso i pacchetti dei singoli programmi vengono distribuiti con la
documentazione prodotta direttamente dagli autori, che di norma, seguendo le indicazioni del Filesystem Hierarchy Standard, viene installata in una directory /usr/share/doc/nomeprogramma.
A questa documentazione specifica poi si aggiunge il grande patrimonio degli HOWTO, una serie
di documenti sul come fare a riguardo di un certo argomento, disponibili in diversi formati (dal
testo puro, allHTML, al PDF). Questo sono stati raccolti dal Linux Documentation Project, e
di norma vengono installati dalle varie distribuzioni nella directory /usr/share/doc/HOWTO/.
Infine quando non si riescono a trovare informazioni nel sistema si pu`o ricorrere direttamente
ad Internet. Una delle risorse pi`
u usate `e costituita appunto dal Linux Documentation Project,
sul cui sito, http://www.tldp.org si trovano le versioni aggiornate di tutti gli HOWTO. Qui
sono disponibili anche delle guide, veri e propri libri su vari argomenti come lamministrazione
di sistema, il kernel, ecc. La traduzione italiana di questi documenti si pu`o trovare sul sito
del PLUTO (gruppo storico di utenti Linux italiani) nella sezione dedicata allItalian Linux
Documentation Project, accessibile allindirizzo http://ildp.pluto.it/.
Una grande quantit`
a di informazioni, e laiuto di altri utenti, pu`o essere trovato sui gruppi di
discussione di usenet, una rete internazionale di distribuzione di notizie in cui chiunque (usando il
relativo client) pu`
o lasciare messaggi e ricevere risposte (la filosofia di funzionamento del sistema
`e ripresa da quella delle bacheche pubbliche delle universit`a).
In tal caso il proprio provider deve aver fornito un accesso ad un news server che riceve i gruppi dedicati alle discussioni su Linux, che nella gerarchia internazionale186 sono quelli che si trovano sotto comp.os.linux, mentre nella gerarchia italiana si trovano sotto it.comp.os.linux. In
tal caso `e comunque opportuno leggere in anticipo le FAQ (Frequently Asked Question) che raccolgono una serie di risposte alla domande pi`
u ricorrenti, onde evitare di ripetere domande banali
a cui `e stato dato risposta innumerevoli volte, che non sarebbero accolte molto amichevolmente.
Infine lutilizzo dei motori di ricerca `e un ottimo sistema per recuperare le informazioni
pubblicate su Internet, ed alcuni di essi forniscono anche un accesso specifico per ricerche su
questo argomento.187 Fra queste troverete le versioni pubblicate degli HOWTO e delle FAQ
(anche se queste vengono spesso distribuite come documentazione nel sistema, non `e detto che
siano complete o aggiornate) ma anche altre risorse come le annotazioni ed i log lasciati in
innumerevoli pagine web e gli archivi delle liste di discussione dei vari progetti in cui qualcuno
pu`o aver gi`
a avuto il vostro problema e trovato una risposta.

186
tanto per cambiare, dato che anche questo servizio `e nato su Unix, i gruppi di discussioni sono organizzati
per temi, e strutturati ad albero in una gerarchia per cui si va da un tema pi`
u generale (comp per i computer) a
temi sempre pi`
u specifici (comp.os per i sistemi operativi, comp.lang per i linguaggi di programmazione, ecc.).
187
come ad esempio http://www.google.com/linux.

126

2.4.3

CAPITOLO 2. LA SHELL E I COMANDI

I comandi per la gestione dei tempi

Prima di accennare ai principali comandi per la gestione di tempo e date in GNU/Linux occorre una breve introduzione sulla gestione del tempo nei sistemi Unix. Storicamente i sistemi
unix-like hanno sempre mantenuto due distinti tipi di tempo allinterno del sistema: essi sono
rispettivamente chiamati calendar time e process time, secondo le definizioni:
` il numero di secondi dalla mezzanotte del
calendar time detto anche tempo di calendario. E
primo gennaio 1970, in tempo universale coordinato (o UTC), data che viene usualmente
indicata con 00:00:00 Jan, 1 1970 (UTC) e chiamata the Epoch. Questo tempo viene
anche spesso chiamato anche GMT (Greenwich Mean Time) dato che lUTC corrisponde
` il tempo su cui viene mantenuto lorologio del kernel,
allora locale di Greenwich.188 . E
e viene usato ad esempio per indicare le date di modifica dei file o quelle di avvio dei
processi.
` il tempo usato internamente dal kernel
process time detto talvolta tempo di processore. E
per le sue temporizzazioni. In genere `e legato alle interruzioni del timer, e viene impiegato
per tutti i calcoli dello scheduler, `e pertanto il tempo in cui viene misurato il tempo di
esecuzione dei processi.
In genere il tempo a cui si fa riferimento `e sempre il calendar time, il process time viene usato
soltanto dai comandi che riportano le propriet`a specifiche dei processi (come ps o top) relative
ai tempi di esecuzione degli stessi. Oltre a questi due, gi`a trattati in sez. 1.3.2, lunico altro
comando che usa il process time `e time, che prende come argomento una riga di comando da
eseguire, e stampa a video, alla terminazione dellesecuzione di questultima, tre valori di tempo
espressi in process time, che sono il tempo totale impiegato per lesecuzione del programma (con
la sigla real), il tempo passato nellesecuzione di codice in user space (con la sigla user), ed il
tempo passato nellesecuzione di codice dentro il kernel, cio`e allinterno delle system call invocate
dal processo (con la sigla sys), ad esempio:
piccardi@hain:~/truedoc$ time ls
CVS README corso internet-server
real
user
sys

ldap

lucidi

samba

0m0.030s
0m0.000s
0m0.010s

e si noti come il tempo reale `e sempre maggiore degli altri due in quanto tiene conto anche del
tempo in cui il processo `e stato in stato di sleep in attesa di I/O.
Il comando prende varie opzioni, le principali delle quali sono -o che permette di specificare
un file su cui scrivere i risultati al posto dello standard output, e -f che permette di specificare
un formato per i tempi. La descrizione completa del comando (comprese le stringhe usate per
lopzione -f) si trova al solito nella pagina di manuale.
Tutti gli altri comandi relativi ai tempi hanno a che fare con la gestione del calendar time.
Qui si aggiungono ulteriori complicazioni; la prima `e che esistono due orologi, quello di sistema,
usato dal kernel per tutte le sue operazioni, ed aggiornato via software dal kernel stesso, e
lorologio hardware che funziona in maniera del tutto indipendente e che rimane in funzione
anche quando la macchina `e spenta.189 Di solito il kernel legge lorologio hardware allavvio, per
impostare il valore iniziale dellorologio di sistema, e poi non lo considera pi`
u.
La seconda complicazione `e che il kernel non conosce assolutamente i fusi orari; per lui il
tempo `e assoluto, e fa sempre riferimento al tempo standard universale (lUTC appunto). Tutta
188

in realt`
a con GMT si fa alle volte riferimento al tempo solare misurato dallosservatorio di Greenwich, che `e
leggermente diverso, per i dettagli si consulti http://en.wikipedia.org/wiki/UTC
189
`e lorologio che si trova sulla scheda madre, ed `e alimentato della batteria che si trova su di essa.

2.4. ALTRI COMANDI

127

la gestione dei fusi orari `e demandata alle applicazioni in user space che, tutte le volte che leggono
un tempo, devono essere in grado di convertirlo nellora locale,190 torneremo sullargomento con
maggiori dettagli in sez. 3.1.4.
Se ci si pensa questa `e la scelta pi`
u logica: non solo si evita di inserire una serie di informazioni
complesse allinterno del kernel, ma facendo cos` i tempi di sistema sono sempre coerenti, e non
dipendono dal fuso orario in cui ci si trova (nel senso che i file modificati unora fa risulteranno
sempre con lora giusta qualunque cambiamento sia stato fatto nel fuso orario). Purtroppo
altri sistemi operativi usano lora locale per lorologio di sistema che coincide con lorologio
hardware, con tutti i problemi che questo comporta quando si deve cambiare fuso orario (con
file che possono anche risultare essere stati creati nel futuro), e soprattutto di incompatibilit`
a
dei tempi in caso di dual boot.
Il principale comando che permette di leggere ed impostare lorologio di sistema `e date. Se
usato senza argomenti questo si limita a stampare data ed ora corrente nel formato standard:
piccardi@hain:~/truedoc/corso$ date
Fri Sep 19 12:45:42 CEST 2003

il comando prende come argomento o il tempo da impostare (operazione privilegiata che pu`
o
eseguire solo lamministratore) o un formato di stampa per il tempo che modifica loutput del
comando facendogli stampare solo le parti di data volute.
Se si vuole impostare la data questa deve essere specificata con una stringa nella forma
MMDDhhmm[[CC]YY][.ss], dove i termini fra parentesi quadra sono opzionali. Con MM si indica
il mese (in numero), con DD il giorno, con hh lora, con mm il minuto, mentre lanno si indica o
con le cifre finali YY o per intero con tanto di secoli come CCYY, infine i secondi ss devono essere
preceduti da un punto; ad esempio si pu`o provare ad impostare lorologio con:
piccardi@hain:~/truedoc/corso$ date 09191854
date: cannot set date: Operation not permitted
Fri Sep 19 18:54:00 CEST 2003

e loperazione fallisce, dato che non si `e lamministratore, ma il tempo che si voleva impostare
viene comunque stampato a video.
Se invece largomento che si passa inizia con un + esso viene interpretato come una stringa
di formattazione per il risultato del comando. La stringa usa il carattere % per indicare una
direttiva di formattazione che verr`a sostituita dallopportuno valore, tutti gli altri caratteri
resteranno immutati. Le principali direttive sono riportate in tab. 2.37, lelenco completo `e
nella pagina di manuale.
Il comando prende inoltre varie opzioni, le principali delle quali sono -d che permette di
specificare una data da stampare al posto del tempo corrente, e -s che permette, con lo stesso
formato, di specificare limpostazione dellorologio di sistema. Lutilit`a di queste due opzioni `e
che la stringa che prendono come parametro pu`o essere nelle forma pi`
u varie, e non solo riconosce
tutti i formati standard che si ottengono con le direttive di tab. 2.37, ma anche descrizioni verbali
(solo in inglese, per`
o) come 8 day ago, o 1 month. La descrizione di queste stringhe pu`o essere
trovata solo nelle pagine info del comando, accessibili con info date, dove si trova anche la
trattazione completa di tutte le funzionalit`a.
Il secondo comando che riguarda la gestione del tempo `e hwclock, che permette di impostare
lorologio hardware. Il comando non prende argomenti, e lo si utilizza attraverso le opzioni. Se
non si specifica nessuna opzione il comando si limita leggere il valore dellorologio hardware e a
stamparlo sullo standard output, con un risultato del tipo:
hain:/home/piccardi/truedoc/corso# hwclock
Tue Sep 23 15:36:58 2003 -0.763201 seconds
190

il tutto `e fatto attraverso delle opportune funzioni di libreria, che permettono di eseguire il compito in maniera
trasparente.

128

CAPITOLO 2. LA SHELL E I COMANDI


Direttiva
%%
%a
%A
%b
%B
%c
%d
%D
%H
%I
%m
%M
%r
%T
%S
%w
%x
%y
%Y
%Z

Significato
il carattere %.
il nome del giorno della settimana abbreviato, secondo la localizzazione.
il nome del giorno della settimana completo, secondo la localizzazione.
il nome del mese abbreviato, secondo la localizzazione.
il nome del mese completo, secondo la localizzazione.
data e orario, secondo la localizzazione.
giorno del mese, nella forma (01..31).
data, nella forma (mm/dd/yy).
ora del giorno, nella forma ( 0..23).
ora del giorno, nella forma ( 1..12).
mese, nella forma (01..12).
minuto, nella forma (00..59).
orario nella forma (hh:mm:ss [AP]M) su 12 ore.
orario nella forma (hh:mm:ss) su 24 ore.
numero di secondi.
giorno della settimana, nella forma (0..6) a partire dalla domenica.
data nella rappresentazione secondo la localizzazione.
anno abbreviato alle ultime due cifre.
anno completo.
nome convenzionale del fuso orario.

Tabella 2.37: Direttive di formattazione per il comando date.

(risultato che si ottiene anche con lopzione -r o --show).


Il comando poi permette di impostare lorologio hardware con lopzione --set, cui deve
seguire un --date che specifichi la data da usare nel formato con cui la si specifica anche per
date. Si pu`o per`
o usare lopzione -w (o --systohc) per impostare lora direttamente al tempo
segnato dallorologio di sistema. Viceversa lopzione -s (o --hctosys) imposta lorologio di
sistema al tempo di quello hardware.
Infine un altro comando molto utilizzato nella gestione dellorologio di sistema `e ntpdate che
consente di sincronizzare lora con un server NTP (Network Time Protocol ) esterno. In genere
infatti lorologio di sistema di una macchina non `e molto preciso, e tende andare avanti o restare
indietro a seconda delle condizioni di carico; anche lorologio hardware, pur essendo fornito da
un quarzo interno, risente delle variazioni di temperatura e di tensione sulla piastra madre. Per
questo motivo si possono avere delle derive significative nei tempi.
Il servizio NTP `e un servizio di rete (che tratteremo in sez. 8.1.4) a cui ci si pu`o rivolgere
per poter rimettere lorologio di una macchina, il comando ntpdate effettua una richiesta ad un
server NTP, il cui indirizzo viene passato come argomento,191 e sincronizza lorologio di sistema
con lorario fornito dal server. Il modo pi`
u comune per invocare il programma `e:
hain:~# ntpdate tempo.ien.it
28 Dec 18:51:58 ntpdate[32199]: adjust time server 193.204.114.105 offset -0.003095 sec

Si pu`o invocare il comando con lopzione -q per fargli semplicemente eseguire una richiesta
senza aggiornare lora, e lopzione -v per fargli stampare pi`
u informazioni, le restanti opzioni,
ed i dettagli relativi al funzionamento del programma, sono al solito riportati nella pagina di
manuale.
Si tenga presente che se il programma rivela una differenza di tempo maggiore 0.5 secondi
effettua una sincronizzazione immediata (e si avr`a pertanto uno scalino nella scala dei tempi)
191

diamo per scontata la conoscenza del significato di indirizzo, largomento viene affrontato nei dettagli in
sez. 7.2.1 e sez. 7.4; il comando accetta sia indirizzi IP in forma numerica, che nomi a dominio in forma simbolica,
come quello dellesempio.

2.4. ALTRI COMANDI

129

mentre se la differenza `e inferiore provvede ad accelerare (o decelerare) lorologio di sistema


finche la differenza non sia stata compensata.192

2.4.4

I comandi per le informazioni sugli utenti e il sistema

In sez. 1.4.1 abbiamo visto come ad ogni utente e gruppo nel sistema sia associato un nome
utente abbinato ad un identificativo numerico e come, una volta completato il login, questi
identificatori vengano usati per il controllo di accesso.
Il comando che permette di verificare con quale utente ci si `e collegati al sistema,193 identificando cos` le proprie credenziali, `e whoami che stampa il valore del proprio username, con
qualcosa del tipo:
piccardi@hain:~/truedoc/corso$ whoami
piccardi

Per verificare di quali gruppi fa parte un utente pu`o usare invece il comando groups. Questo,
se invocato senza nessun argomento, stampa lelenco dei nomi dei gruppi a cui si appartiene, ad
esempio:
piccardi@anarres:~/GaPiL$ groups
piccardi voice cdrom audio video plugdev lpadmin fuse scanner saned vboxusers

se invece si specifica come argomento un nome utente, il comando stampa la lista di gruppi cui
appartiene lutente indicato. Sia groups che whoami non hanno opzioni se non quelle standard
GNU viste in sez. 2.2.1.
Con il comando id si possono invece stampare tutti i vari identificatori associati ad un
processo, sia dei gruppi che dellutente, sia reali che effettivi e sia in forma letterale che numerica;
lesempio pi`
u immediato del suo utilizzo `e il seguente:
piccardi@anarres:~$ id
uid=1002(piccardi) gid=1002(piccardi) groups=22(voice),24(cdrom),29(audio),44(vi
deo),46(plugdev),117(lpadmin),119(fuse),120(scanner),122(saned),124(vboxusers),1
002(piccardi)

in cui, invocato senza argomenti, stampa tutti gli identificativi associati allutente corrente.
Oltre alla possibilit`
a di passare un argomento che specifica lutente di cui si vogliono ottenere
gli identificativi, il comando prende molte opzioni che permettono di indicare nei dettagli quali
informazioni si vogliono stampare ed in che formato; con -u si pu`o chiedere di mostrare solo
luser-ID, con -g il group-ID, `e inoltre possibile chiedere la visualizzazione dei identificativi del
gruppo real invece degli effective (quelli mostrati di default) con lopzione -r. Al solito si pu`
o
fare riferimento alla pagina di manuale, accessibile con man id, per la documentazione completa.
Oltre ai dati relativi agli identificativi associati ai singoli utenti, sulla cui gestione amministrativa torneremo in sez. 4.3, il sistema mantiene anche una serie di informazioni sulle loro
attivit`a, che possono essere richieste con altrettanti comandi. In particolare tutte le volte che
un utente si collega al sistema e avvia un terminale levento viene registrato in uno specifico
formato194 nei file /var/log/wtmp e /var/run/utmp195 insieme ad altre informazioni relative
sia ad altri eventi di sistema196 che alla modalit`a in cui avviene laccesso.
I dati vengono registrati in questi file in forma binaria, ma possono essere consultati con
lausilio di alcuni comandi dedicati, che consentono di ottenere informazioni sugli accessi degli
192

i dettagli sulle funzioni con cui viene effettuato laggiornamento vanno al di l`


a degli scopi di queste dispense,
si pu`
o trovare una trattazione dellargomento in sez. 8.4.3 di [GaPiL].
193
pu`
o essere utile in caso di script di shell per eseguire compiti in base allutente che esegue lo script.
194
per i dettagli si pu`
o consultare sez. 8.4.2 di [GaPiL].
195
il primo contiene le informazioni storiche, il secondo quelle correnti.
196
in particolare vengono registrati tutti i riavvii ed in generale tutti i cambiamenti di runlevel (vedi sez. 5.3.6).

130

CAPITOLO 2. LA SHELL E I COMANDI

utenti ed anche sulle attivit`


a svolte nel sistema. Ad esempio lelenco degli utenti attualmente
collegati si pu`o ottenere con luso del comando users che stampa a video una semplice lista
degli stessi,197 con qualcosa del tipo:
piccardi@anarres:~$ users
root piccardi

Una lista pi`


u dettagliata pu`
o essere ottenuta con il comando who, che stampa lelenco in forma
di tabella, riportando per ciascun utente collegato al sistema il relativo username seguito dal
terminale su cui questo `e attivo, dallora in cui `e avvenuto laccesso e dalleventuale macchina
remota o dal display dellinterfaccia grafica (vedi sez. 3.3.4) da cui questo `e avvenuto, cio`e
qualcosa del tipo:
piccardi@anarres:~$ who
piccardi tty1
2008-03-26 00:02
piccardi pts/0
2008-03-27 12:45 (192.168.0.3)
piccardi pts/1
2008-03-23 12:07 (:0.0)

che mostra tre sessioni dello stesso utente, una effettuata da una console locale, una da una
macchina remota ed una dallinterfaccia grafica.
Il comando supporta molte opzioni (al solito per i dettagli si consulti la pagina di manuale),
volte a stampare le varie informazioni disponibili, ma in generale lo si usa senza argomenti per
avere la lista degli utenti come illustrato. Se gli si passa un argomento questo verr`a considerato
il nome del file da cui leggere le informazioni,198 mentre con due argomenti stampa soltanto la
voce relativa allutente che lo ha lanciato.
In questultimo caso si tende ad usarlo nella forma discorsiva who am i, che ricorda il precedente whoami, ma oltre al risultato, che presenta il nome dellutente insieme al terminale e
alle altre informazioni mostrate nel precedente esempio,199 `e diverso anche il significato, whoami
infatti riporta in nome dellutente associato alluser ID del processo corrente e d`a sempre un
risultato, mentre who am i fa riferimento allutente effettivamente collegato, per cui se usato
allinterno di uno script eseguito in modalit`a non interattiva200 non dar`a nessun risultato.
Come alternativa a who esiste anche il comando w, che esegue lo stesso compito ma stampa
delle informazioni pi`
u dettagliate. In particolare il comando stampa sempre una riga introduttiva, analoga a quella mostrata anche da top, che riporta ora, tempo trascorso dallultimo riavvio
(luptime), numero di utenti connessi ed carico medio della macchina cui segue la lista degli
utenti in cui, oltre alle informazioni gi`
a riportate da who ci sono pure i dati relativi al tempo di
CPU usato dallutente e al comando corrente, si avr`a cio`e:
piccardi@anarres:~$ w
14:49:36 up 4 days, 2:45, 3 users, load average: 0.00, 0.01, 0.00
USER
TTY
FROM
LOGIN@
IDLE
JCPU
PCPU WHAT
piccardi tty1
Wed03
35:38
0.76s 0.73s -bash
piccardi pts/0
192.168.0.3
12:45
0.00s 0.49s 0.01s w
piccardi pts/1
:0.0
Sun12
3days 1:00
1:00 top

Infine oltre alle informazioni riguardo gli utenti e le attivit`a di sistema correnti, si possono
consultare quelle archiviate riguardo gli accessi passati con il comando last. Il comando stampa
una lista degli ultimi accessi avvenuti,201 in forma analoga a who, ma riporta oltre alla data
197

lo si potr`
a cos` usare in uno script che debba inviare avvisi.
il comando usa /var/run/utmp che contiene le informazioni correnti, ma gli si pu`
o passare come argomento
/var/log/wtmp per fargli leggere quelle archiviate.
199
qualora si voglia stampare il nome utente `e possibile usare il comando logname, ma anche questo fa riferimento
allutente collegato.
200
ad esempio se lo si usa da uno script lanciato con cron (vedi sez. 3.2.1).
201
in genere il periodo coperto `e quello dellultimo mese, in quanto, come vedremo in sez. 3.2.4, il file
/var/log/wtmp da cui vengono ricavate le informazioni viene ruotato mensilmente.
198

2.4. ALTRI COMANDI

131

di ingresso anche quella di uscita e la durata di ciascuna sessione, vengono stampate inoltre
informazioni generali, come le date dei riavvio del sistema; si avr`a cio`e qualcosa del tipo:
piccardi@anarres:~$ last
piccardi pts/0
192.168.0.3
piccardi pts/0
192.168.0.3
piccardi pts/0
192.168.0.3
piccardi tty1
...
reboot
system boot 2.6.17-12-powerp
...
wtmp begins Fri Mar 2 17:17:47 2007

Thu
Wed
Wed
Wed

Mar
Mar
Mar
Mar

27
26
26
26

12:45
still logged in
22:22 - 01:29 (03:07)
12:11 - 16:20 (04:09)
00:02
still logged in

Sun Mar 23 12:05 - 15:03 (4+02:57)

Il comando prevede varie opzioni, come -n seguita da un numero, che consente di indicare
quante stampare o -t seguita da una data, che stampa lo stato a quella data (si pu`o cos`
vedere chi era collegato osservando le righe con still logged in. Al solito per una descrizione
completa si faccia riferimento alla pagina di manuale.
Infine oltre last altri comandi che vengono in genere utilizzati per ottenere informazioni
sugli accessi sono lastb, che stampa lelenco dei tentativi falliti, e uptime, che `e quello che
produce la riga iniziale con i dati relativi a utenti collegati e tempo dallultimo avvio che viene
usata come prima riga da top e w. Per tutti i dettagli come sempre si consultino le pagine di
manuale.
Un ultimo comando che permette di ottenere informazioni sul sistema `e uname, che stampa
una serie di informazioni generiche. Se invocato senza argomenti il comando si limita a stampare
il nome del proprio kernel (vale a dire Linux), che non `e una informazione particolarmente
significativa. Pi`
u interessanti sono le informazioni relative allarchitettura hardware o al tipo di
processore stampabili rispettivamente con le opzioni -m e -p, mentre con -n si pu`o stampare
il nome assegnato alla macchina stessa (vedi anche sez. 7.4.3) e con -a tutte le informazioni
disponibili, ottenendo qualcosa del tipo:
piccardi@anarres:~$ uname -a
Linux ellington 2.6.25-2-686 #1 SMP Fri Jul 18 17:46:56 UTC 2008 i686 GNU/Linux

Luso pi`
u frequente del comando per`o `e quello in cui esso viene invocato con lopzione r per ottenere soltanto la versione del kernel corrente (nel caso 2.6.25-2-686), informazione
che viene usata spesso nella gestione dei moduli dello stesso (torneremo su questo argomento
in sez. 5.2). Al solito lelenco completo delle opzioni e tutti i dettagli del comando si possono
ottenere consultando la relativa pagina di manuale.

2.4.5

I comandi per le informazioni diagnostiche

Tratteremo in questultima sezione una serie di comandi che consentono di ottenere informazioni
dettagliate di varia natura relativamente ai processi e alle caratteristiche del sistema, riuniti per
la loro caratteristica comune di essere utilizzati principalmente a scopi diagnostici. Luso di
questi comandi `e in genere molto specialistico e la loro comprensione completa richiede una
conoscenza approfondita del sistema.202 Per questo ne daremo solo una descrizione superficiale,
da tenere come riferimento per una lettura pi`
u approfondita delle rispettive pagine di manuale,
che possa per`
o risultare utile per fornire una panoramica su come utilizzarli per effettuare la
diagnosi di problemi e malfunzionamenti del sistema.
Il primo comando che prendiamo in considerazione `e dmesg, che invocato semplicemente
consente di stampare a video il contenuto del buffer circolare 203 dei messaggi di notifica del
202

in particolare i concetti relativi alle reti fanno riferimento ad argomenti che saranno trattati solo a partire dal
cap. 7.
203
si chiama buffer circolare una zona di memoria di lunghezza fissa in cui salvare un ammontare limitato dei
dati, una volta esaurito il buffer i nuovi dati vengono riscritti a partire dalla cima del buffer sovrascrivendo quelli
precedenti, da cui deriva appunto il nome di circolare.

132

CAPITOLO 2. LA SHELL E I COMANDI

kernel. Luso del comando consente di visualizzare il contenuto del buffer, che riporta tutto
quanto viene scritto dal kernel, e pu`
o essere molto utile per diagnosticare le cause di alcuni
problemi (ad esempio il kernel riporta qui tutta una serie di errori dovuti a problemi hardware).
In generale queste stesse informazioni vengono inviate al sistema del syslog (sulla facility
kern, vedi sez. 3.2.3) per una registrazione permanente,204 ma dmesg consente una visualizzazione immediata del buffer dei messaggi anche allutente ordinario, anche se copre soltanto un
periodo limitato, avendo il buffer circolare una dimensione prefissata di 16k. Inoltre il comando
consente di ottenere le informazioni anche quando il sistema del syslog non `e attivo, come pu`o
accadere se il sistema ha problemi in fase di avvio e non lancia il relativo servizio.
Il comando prevede tre opzioni, utilizzabili solo dallamministratore; con -c si cancella il
contenuto del buffer, con -s seguito da un valore numerico se ne reimposta la dimensione ed
infine con -n si specifica le priorit`
a a partire dalla quale vengono mostrati i messaggi. Per
ulteriori dettagli si consulti al solito la pagina di manuale.
Un altro comando molto utile `e lsof, che permette di ottenere la lista di tutti file descriptor
aperti allinterno di tutti i processi attivi nel sistema. Si tenga presente che trattandosi della
lista dei file descriptor, saranno stampati non soltanto quelli associati a degli ordinari file di dati,
ma anche quelli relativi agli altri tipi di file (quelli di tab. 1.1) come fifo, socket (compresi quelli
associati alla connessioni di rete) ed anche alle directory, compresi quelli associati alla directory
radice ed alla directory di lavoro di ciascun processo.
Valore
COMMAND
PID
USER
FD

TYPE

DEVICE
SIZE
NODE
NAME

Significato
Il nome del comando (i primi 9 caratteri) associato al processo.
Il PID del processo.
Il nome dellutente (o il suo user ID) a cui appartiene il processo.
per i file aperti direttamente allinterno del processo il numero associato
al file descriptor seguito da una delle lettere r (lettura), w (scrittura) e
u (lettura/scrittura) per indicare la modalit`
a in cui `e aperto; qualora
si faccia riferimento ad un file descriptor non aperto esplicitamente dal
processo uno dei valori di tab. 2.39.
il tipo di file (quello di tab. 1.1) identificato con le sigle REG per i
file regolari, DIR per le directory, LINK per i link simbolici, CHR per i
dispositivi a caratteri, BLK per i dispositivi a blocchi, FIFO per le fifo e
le pipe; i socket sono invece riportati per tipo (unix per quelli locali,
IPv4 per quelli di rete); esistono poi valori speciali come DEL per un file
che `e stato cancellato o NOFD per un file che non si `e potuto aprire.
identificativo del dispositivo su cui si trova il file, con i valori di major
number e minor number.
dimensione del file, se esistente, altrimenti vuoto.
numero di inode per i file e gli altri oggetti del filesystem, nome del
protocollo per i socket di rete.
nome del file, se questo `e presente sul filesystem, le parole chiave pipe
e socket per indicare file descriptor associati a pipe o socket anonimi,
e gli estremi della connessione per i socket di rete.

Tabella 2.38: Informazioni di default riportate dalloutput di lsof.

Il comando pu`
o essere usato anche da un utente normale, ma per poter avere tutte le informazioni occorre utilizzarlo con privilegi amministrativi. Se invocato senza nessuna opzione o
argomento il comando stampa la lista di tutti i file descriptor aperti, riportando in colonna per
ciascuno di essi una serie di informazioni, illustrate nellelenco di tab. 2.38.
Il comando supporta una enorme quantit`a di opzioni che consentono di controllare e selezionare in maniera dettagliata sia le informazioni da stampare che quali file descriptor analizzare,
per le quali si rimanda alla lettura della voluminosa pagina di manuale. Vale comunque la pena
citare -u che consente effettuare una selezione per utente, da specificare come parametro del204

il compito viene eseguito da un apposito processo interno al kernel denominato klog.

2.4. ALTRI COMANDI

133

lopzione, e -p che consente una selezione per PID, di nuovo da specificare come parametro; la
selezione poi pu`
o, in entrambi i casi, essere invertita apponendo un carattere ^ al parametro.
Valore
cwd
rtd
txt
mem

Significato
directory di lavoro del processo.
directory radice del processo.
segmento di testo (codice o libreria) del processo.
file mappato in memoria.

Tabella 2.39: Principali valori del campo FD delloutput di lsof.

Infine se si passano uno o pi`


u argomenti al comando questi vengono normalmente interpretati
come pathname di file, e verranno riportati solo i risultati dei file descriptor ad essi corrispondenti. Fa eccezione a questa regola il caso in cui il pathname specifica il mount point di un
filesystem nel qual caso verranno mostrati tutti i file descriptor relativi a tale filesystem.
Uno degli usi pi`
u comuni di lsof in ambito diagnostico `e quello che consente di determinare
quale processo stia mantenendo occupato un filesystem che si deve smontare (vedi sez. 5.1.3),
sia perche c`e un file aperto su di esso, sia perche un processo ha la directory di lavoro corrente
allinterno dello stesso. In generale lo si pu`o usare anche per identificare quali processi stanno
utilizzando un certo file.
Un altro comando diagnostico estremamente potente `e strace, che stampa sullo standard
error tutte le system call eseguite da un programma durante la sua esecuzione, consentendo
cos`, come suggerisce il nome, di tracciare le operazioni effettuate dal programma. Ad esempio
se usiamo strace con il comando cat, si avr`a qualcosa del tipo:205
piccardi@ellington:~/truedoc/corso$ strace cat corso.tex > /dev/null
execve("/bin/cat", ["cat", "corso.tex"], [/* 33 vars */]) = 0
...
open("corso.tex", O_RDONLY|O_LARGEFILE) = 3
fstat64(3, {st_mode=S_IFREG|0644, st_size=2315, ...}) = 0
read(3, "%% corso.tex\n%%\n%% Copyright (C) "..., 4096) = 2315
write(1, "%% corso.tex\n%%\n%% Copyright (C) "..., 2315) = 2315
read(3, ""..., 4096)
= 0
close(3)
= 0
close(1)
= 0
close(2)
= 0
exit_group(0)
= ?

Una spiegazione completa di questo estratto206 eccede ovviamente quanto sia possibile affrontare in questa sede, dato che necessiterebbe di una spiegazione dettagliata del significato
delle varie system call, argomento che attiene alla programmazione, e non alla amministrazione
` comunque possibile fare una lettura superficiale che ci mostra come prima
di sistema.207 E
venga aperto il file corso.tex sul file descriptor 3 (il risultato della open), e poi venga letto da
questo il contenuto (con la read), che viene immediatamente dopo scritto (con la write) sul file
descriptor 1, che abbiamo gi`
a detto essere appunto quello associato con lo standard output.
Anche solo questo esempio ci consente di vedere come strace consenta di analizzare le
richieste fatte da un programma, ed in particolare `e molto utile vedere quali file il programma
cerca di aprire (con la funzione open); in questo modo diventa possibile capire eventuali cause
di malfunzionamenti dovuti alla ricerca di file assenti o diversi da quelli che si supponevano
205

si noti la redirezione dello standard output, che `e stata eseguita per evitare di mescolare il risultato del comando
con quello di strace.
206
per semplificare la lettura si sono eliminate tutte le operazioni di inizializzazione successive la chiamata iniziale
a execve che `e quella che mette in esecuzione cat.
207
gli interessati a questo argomento possono al solito fare riferimento a [GaPiL], il cui scopo `e proprio quello di
documentare adeguatamente le interfacce di sistema di Linux.

134

CAPITOLO 2. LA SHELL E I COMANDI

essere quelli effettivamente utilizzati, o vedere in quale operazione pu`o risultare bloccato un
certo programma.
In genere, come nellesempio precedente, si usa strace passandogli come argomento il comando che si vuole analizzare (e le eventuali opzioni ed argomenti dello stesso), ma `e possibile
anche tracciare un programma gi`
a in esecuzione usando lopzione -p, che prende come parametro il PID del processo che si vuole analizzare. Inoltre con -o si pu`o far scrivere i risultati su
un file qualunque (passato come parametro) invece che sullo standard error. Come lsof anche
strace fornisce numerose opzioni che permettono di controllare e selezionare le informazioni da
stampare, per le quali si rimanda alla lettura della pagina di manuale.
Un altro comando utile a scopi diagnostici `e strings che consente di effettuare una ricerca
sulle stringhe di testo presenti allinterno di un file binario e stamparle sullo standard output. Il
comando `e particolarmente utile quando si vogliono cercare le stringhe presenti allinterno dei comandi ed in particolare pu`
o aiutare ad identificare, dai relativi pathname, i file di configurazione
che questo usa di default, con qualcosa del tipo:
strings /usr/bin/crontab | grep /etc
Il comando al solito prende varie opzioni che consentono di controllarne il comportamento,
come -e che consente di specificare una codifica, o -n che consente di indicare la dimensione
minima della stringa identificata da una sequenza di caratteri stampabili di dimensione superiore
al valore specificato da tale opzione (il default `e 4). Al solito per i dettagli si faccia riferimento
alla pagina di manuale.

Capitolo 3

La configurazione dei servizi


3.1

I file di configurazione

In questa sezione tratteremo la gestione generica dei file di configurazione allinterno di un


sistema GNU/Linux, introducendo alcuni concetti validi in generale per qualunque file di configurazione. Descriveremo poi direttamente i file di configurazione di alcuni servizi di base, come
quelli che controllano il comportamento delle librerie dinamiche o della risoluzione dei nomi
allinterno del sistema.

3.1.1

Una panoramica generale

A differenza di Windows che tiene tutte le configurazioni in un unico file binario, il registro,
le sole due caratteristiche comuni che potete trovare nei file di configurazione su un sistema
GNU/Linux sono che essi sono mantenuti, come illustrato in sez. 1.2.3, nella directory /etc/ e
che sono file di testo. Questo vale in generale per tutti i file di configurazione, e non `e limitato
a quelli che tratteremo nel prosieguo di questa sezione.
La ragione di questa frammentazione dei file di configurazione deriva dellarchitettura del
sistema (illustrata in sez. 1.1), per cui tutti i servizi sono forniti da opportuni programmi, che
non `e affatto detto siano sempre gli stessi anche per uno stesso servizio.1 Ci`o comporta che
i formati dei file di configurazione possano essere anche i pi`
u vari, dipendendo ciascuno dalla
sintassi adottata dal relativo programma; per cui, anche se esistono delle convenzioni generali
come ignorare le righe vuote o considerare il carattere # linizio di un commento, non `e detto
che esse vengano sempre rispettate.
Se da una parte tutta questa complessit`a pu`o spaventare, vista la lunghezza dellelenco che
si produce un comando come:
[root@roke /etc]# ls -l
total 1584
drwxr-xr-x
3 root
drwxr-xr-x
3 root
-rw-r--r-1 root
drwxr-xr-x
2 root
drwxr-xr-x
16 root
-rw-r--r-1 root
-rw-r--r-1 root
...

root
root
root
root
root
root
root

4096
4096
4172
4096
4096
1660
44

Aug
Aug
Feb
Feb
Feb
Feb
Mar

21
21
15
26
28
26
10

2000
2000
01:27
21:21
23:47
21:21
02:33

CORBA
GNUstep
Muttrc
Net
X11
adduser.conf
adjtime

dallaltra ha invece il grande vantaggio che le modifiche ad un singolo file di configurazione


non hanno alcun modo di influenzare quelli di altri programmi. Il secondo enorme vantaggio `e
1

ad esempio esistono diversi programmi che gestiscono linvio e la ricezione della posta elettronica, ma
chiaramente se ne installer`
a uno solo, e si user`
a il file di configurazione di questo.

135

136

CAPITOLO 3. LA CONFIGURAZIONE DEI SERVIZI

che essendo i file di configurazione dei file di testo `e possibile effettuare ricerche ed operazioni
complesse con i soliti comandi di shell abbondantemente trattati in sez. 2.2, ed eseguire le
operazioni di configurazione con un editor qualunque.
Una seconda cosa di cui bisogna tenere conto `e che Linux `e multiutente, per cui `e molto
spesso possibile per ciascun utente scegliere le impostazioni che si ritengono pi`
u appropriate per
un programma di uso generale mettendo un ulteriore file di configurazione nella propria home
directory. In genere questi file sono invisibili (iniziano cio`e con un .) ed hanno lo stesso nome
del loro analogo di /etc/ valido per tutto il sistema. Questa `e una forma molto potente e pulita
di consentire a ciascun utente di personalizzare le sue scelte senza dover andare a scomodare le
impostazioni generali di tutto il sistema.
` da tenere presente infine che per molti file di configurazione viene installata anche una
E
pagina di manuale che ne spiega il formato, accessibile usualmente con man nomefile, o nel caso
di omonimia con un comando o una funzione di sistema, con man 5 nomefile.2 In seguito, per
quelli che prenderemo in esame, faremo una descrizione generale, trattando solo le caratteristiche
principali; per questo varr`
a sempre la pena controllare la documentazione, che contiene tutti i
dettagli.

3.1.2

La gestione delle librerie condivise

Una delle funzionalit`


a pi`
u importanti per lesecuzione dei programmi in un qualunque sistema `e
quello della gestione delle librerie condivise, quelle che in Windows vengono chiamate DLL (da
Dinamically Linked Library) e che nei sistemi unix-like sono chiamate shared object. Questo `e
il meccanismo che permette di inserire tutto il codice comune usato dai programmi allinterno
di opportune librerie,3 in modo che non sia necessario averne una copia allinterno di ciascun
programma.
Per far s` che detto codice possa essere utilizzato dai singoli programmi occorre per`o una
apposita infrastruttura. Come brevemente accennato in sez. 2.1.5 uno dei compiti fondamentali
del sistema, quello di mettere in esecuzione i programmi, viene realizzato attraverso il linkloader. Questo non `e un programma a se stante, quanto una sezione di codice che viene eseguita
preventivamente tutte le volte che si deve lanciare un nuovo programma,4 il cui compito `e
identificare le librerie condivise che contengono le funzioni utilizzate e caricarle automaticamente
in memoria, in maniera trasparente allutente.
Per verificare quali librerie dinamiche sono necessarie per lesecuzione di un programma si
pu`o usare il comando ldd, che stampa sullo standard output i nomi delle librerie condivise di
cui esso ha bisogno. Il comando prende come argomento il pathname assoluto del programma
da analizzare e stampa a video il risultato, ad esempio:
piccardi@hain:~/truedoc/corso$ ldd /bin/ls
librt.so.1 => /lib/librt.so.1 (0x40023000)
libacl.so.1 => /lib/libacl.so.1 (0x40035000)
libc.so.6 => /lib/libc.so.6 (0x4003c000)
libpthread.so.0 => /lib/libpthread.so.0 (0x4016a000)
/lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)
libattr.so.1 => /lib/libattr.so.1 (0x401ba000)

ci fa vedere le librerie necessarie alluso di ls.5 Lopzione pi`


u usata di ldd `e -v che permette di
avere una descrizione pi`
u dettagliata delle librerie, con le informazioni relative alle versioni, le
altre opzioni sono al solito descritte nella pagina di manuale del comando.
2

si ricordi quanto detto in sez. 2.4.2.


e abbiamo visto in sez. 1.2.3 come ci siano delle directory specifiche, previste dal Filesystem Hierarchy
Standard, che devono contenere i relativi file.
4
a meno che questo non sia stato compilato staticamente, cio`e in maniera da includere al suo interno anche
tutto il codice che altrimenti sarebbe stato disponibile attraverso delle librerie condivise.
5
il risultato `e relativo alla versione di ls installata su una Debian Sarge.
3

3.1. I FILE DI CONFIGURAZIONE

137

Si noti come le librerie siano file il cui nome inizia per lib e termina con lestensione .so
(che sta appunto per shared object) seguita da un numero che `e detto major version. Questa `e
una delle caratteristiche pi`
u utili in un sistema unix-like; le librerie cio`e sono organizzate sempre
con due numeri di versione, major e minor, ed una convenzione vuole che le interfacce pubbliche
delle librerie non debbano mai cambiare fintanto che non cambia la major version.6 Con questo
si ottengono due risultati di grande rilevanza, il primo `e che si pu`o cambiare tranquillamente
la minor version di una libreria senza che i programmi che la usano ne abbiano a risentire,7 il
secondo `e che se si ha bisogno di una versione vecchia delle librerie non c`e nessun problema,
basta installare anche quella, e sar`
a tranquillamente usabile, attraverso la diversa major version,
8
senza nessun conflitto.
Dato che il link-loader deve essere in grado di determinare quali sono le librerie che contengono le funzioni richieste da un programma tutte le volte che questo viene eseguito, per
effettuare la ricerca in maniera efficiente viene utilizzato un apposito file di cache, in cui sono
state indicizzate tutte le informazioni relative alle funzioni presenti ed alle librerie in cui esse
sono contenute. Questo file si chiama /etc/ld.so.cache, e viene generato (di norma tutte le
volte che si installa una nuova libreria) con il comando ldconfig.
Il comando ldconfig permette sia di ricostruire la cache che di ricreare i link allultima
versione dei file delle librerie; infatti queste vengono sempre cercate per numero di major version,
ma la libreria installata sar`
a contenuta in un file con una sua specifica minor version.9 Perci`
o
quello che si fa `e creare un link simbolico dalla versione cercata alla versione effettiva, e ad
esempio avremo che:
piccardi@hain:/lib$ ls -l librt*
-rw-r--r-- 1 root root 26884 Oct 13 21:40 librt-2.3.2.so
lrwxrwxrwx 1 root root
14 Oct 15 17:49 librt.so.1 -> librt-2.3.2.so

in cui si pu`
o notare come una certa versione specifica di una libreria (la 2.3.2) venga rimappata
come prima major version.
Unaltra delle funzionalit`
a avanzata di ldconfig `e che `e in grado di gestire in un unico file
di cache, per le architetture che le supportano, anche diversi formati dei binari e delle relative
librerie (come avviene per gli eseguibili a 32 bit sulle macchine a 64 bit). Se invocato con
lopzione -v il comando stampa lelenco di tutte le directory esaminate e delle librerie usate
nella ricostruzione, mentre con -N e -X si pu`o bloccare rispettivamente la ricostruzione della
cache e quella dei link.
In sez. 1.2.1 abbiamo visto come secondo il Filesystem Hierarchy Standard le librerie possono essere mantenute in diverse directory; di default il comando ldconfig esamina soltanto le
directory /lib e /usr/lib. Se ci sono altre librerie condivise poste in directory diverse, queste
possono essere specificate tramite un opportuno file di configurazione, /etc/ld.so.conf. Il file
contiene una lista10 di tutte le directory che contengono librerie condivise da far gestire a ldconfig, e supporta anche (nelle versioni pi`
u recenti del comando) luso della direttiva include,
per caricare configurazioni analoghe da altri file; ad esempio la versione installata su una Debian
Etch `e la seguente:
/usr/X11R6/lib
include /etc/ld.so.conf.d/*.conf
6

al solito `e una convenzione, anche se quasi universalmente rispettata; ogni tanto qualche programmatore anche
non pi`
u alle prime armi la viola, con il risultato che programmi che fino ad allora funzionavano perfettamente si
trovano a riportare errori o a terminare improvvisamente.
7
a meno che al solito un programmatore non troppo furbo non abbia usato una qualche funzione interna che
non fa parte della interfaccia pubblica, nel qual caso pu`
o di nuovo succedere di tutto.
8
questo `e il motivo per cui il problema dei conflitti di versione delle librerie, tristemente noto su Windows,
dove questa distinzione non esiste, come DLL hell, `e sostanzialmente assente su GNU/Linux.
9
o in generale, come nellesempio, con un suo specifico numero di versione.
10
in genere una per riga, ma la lista pu`
o essere separata da spazi o da : come per LD_LIBRARY_PATH.

138

CAPITOLO 3. LA CONFIGURAZIONE DEI SERVIZI

Se allora si installa una nuova libreria dai sorgenti, questa di norma (vedi sez. 4.2.1) andr`a in
/usr/local/lib, che non compare in /etc/ld.so.conf; sar`a necessario aggiungerla in questo
file e poi eseguire ldconfig per aggiornare i link alle librerie condivise disponibili e ricreare la
cache, in modo che il linker dinamico possa utilizzarla.
Il default di ldconfig prevede luso di /etc/ld.so.conf, ma usando lopzione -f si pu`o
specificare un qualunque altro file al suo posto, mentre con -n si pu`o passare direttamente
sulla linea di comando una lista di directory su cui effettuare la ricerca. Per le altre opzioni
e la documentazione completa si consulti al solito la pagina di manuale, disponibile con man
ldconfig.
Infine, nei casi in cui si vogliano utilizzare solo in forma temporanea delle librerie condivise, si pu`o ricorrere alla variabile di ambiente LD_LIBRARY_PATH, in cui passare una lista11 di
ulteriori directory in cui verr`
a effettuata la ricerca di altre librerie (questa volta senza usare
lindicizzazione, per cui il sistema sar`
a pi`
u lento).
In genere si usa questa variabile quando si sviluppano delle librerie o se si vuole usare qualche
pacchetto sperimentale oppure delle versioni alternative delle librerie di sistema. Infatti le librerie
contenute nelle directory specificate tramite LD_LIBRARY_PATH hanno la precedenza e vengono
utilizzate per prime; in questo modo si pu`o fare uso di librerie sperimentali senza conseguenze
per gli altri programmi12 del sistema che continueranno ad usare la versione abituale.
Un controllo ancora pi`
u dettagliato si pu`o avere usando la variabile LD_PRELOAD, che prende
una lista di file (separati da spazi) di singole librerie che verranno caricate prima di tutte le
altre. In questo modo diventa possibile sovrapporsi alle funzioni di una libreria qualunque. Per
motivi di sicurezza13 quando si usa questa variabile con programmi suid o sgid (vedi sez. 1.4.2)
essa verr`a presa in considerazione solo specificando librerie a loro volta suid o sgid presenti
nelle directory standard /lib e /usr/lib. Altre variabili di ambiente che controllano luso delle
librerie dinamiche, sono descritte nella pagina di manuale del link-loader, accessibile con man
ld.so.

3.1.3

La gestione dei parametri del kernel con sysctl

Una delle funzionalit`


a presenti in tutti i kernel unix-like `e la possibilit`a di modificare alcuni
parametri di comportamento del sistema anche una volta che questo sia stato avviato. Tradizionalmente questo veniva effettuato attraverso una opportuna interfaccia a quello che si suole
chiamare il sistema del sysctl.14
Linterfaccia prevede che le chiavi che identificano i vari parametri del kernel che possono
essere modificati siano organizzate con una suddivisione allinterno di una gerarchia di nomi, cos`
da poterle dividere in categorie e sotto-categorie. Una chiave viene pertanto identificata dalla
sua posizione nella gerarchia, ed espressa con una sorta di pathname, con i nomi del percorso
che si deve fare a partire dalle categorie iniziali.
Tradizionalmente una chiave viene espressa separando i nomi del percorso di categorie di cui
fa parte con il carattere . anche se, per la evidente analogia con un pathname, i comandi
usati con Linux prendono come separatore anche il carattere /. Per limpostazione di un
valore su pu`o usare il comando sysctl, che prende come argomento o il nome di una chiave, nel
qual caso ne stamper`
a il valore, o una assegnazione nel qual caso assegner`a il valore indicato al
corrispondente parametro del kernel; ad esempio si potr`a leggere un valore con:
11

nella stessa forma usata dalla variabile PATH della shell (vedi sez. 2.1.3), cio`e con le directory separate da :.
o per lintero sistema, dato che se si usasse una versione non funzionante di una libreria fondamentale come
la glibc, smetterebbero di funzionare praticamente tutti i programmi.
13
altrimenti un attaccante potrebbero utilizzare le proprie funzioni (magari non troppo benevole) al posto di
quelle di sistema.
14
largomento `e trattato in dettaglio nella sez. 8.2.1 di [GaPiL].
12

3.1. I FILE DI CONFIGURAZIONE

139

anarres:~# sysctl kernel.hostname


kernel.hostname = anarres

mentre si potr`
a assegnarne uno con:
anarres:~# sysctl net.ipv4.icmp_echo_ignore_broadcasts=1
net.ipv4.icmp_echo_ignore_broadcasts = 1

Il comando accetta anche pi`


u argomenti, nel qual caso considerer`a gli stessi come un elenco.15
Il valore da assegnare ad una chiave dipende dal tipo di parametro che si imposta attraverso di
essa, ma i pi`
u comuni sono dei numeri interi o delle stringhe. Qualora si debba effettuare una
assegnazione con un valore che contiene dei caratteri interpretabili dalla shell questo pu`o essere
indicato fra virgolette, ma in tal caso occorre specificare lopzione -w.
Categoria
debug
dev
fs
kernel
net
vm

Significato
parametri per il debug.
parametri dei dispositivi.
parametri dei filesystem.
parametri generici del kernel.
parametri della rete.
parametri della memoria virtuale.

Tabella 3.1: Le categorie principali dei parametri del kernel.

In tab. 3.1 si sono riportate le categorie principali dei parametri del kernel, che stanno
alla radice della gerarchia delle chiavi. Un elenco completo di tutte le chiavi disponibili pu`
o
essere ottenuto invocando sysctl con lopzione -a, mentre con lopzione -e si dice al comando
di ignorare errori dovuti a chiavi non esistenti, si pu`o poi usare lopzione -p per far eseguire
limpostazione di una serie di valori leggendo una lista di assegnazioni dal file passato come
parametro per lopzione stessa.16 Al solito per i dettagli e lelenco completo delle opzioni si
consulti la pagina di manuale del comando.
In realt`
a, come accennato in sez. 1.2.3, in tutte le versioni pi`
u recenti di Linux luso di un
comando dedicato come sysctl non `e pi`
u necessario perche tutta la gerarchia delle chiavi di
configurazione viene riproposta direttamente allinterno del filesystem /proc, come altrettanti
veri e propri pathname a partire da /proc/sys.17 Pertanto si pu`o effettuare una assegnazione
come la precedente semplicemente con:
echo 1 >

/proc/sys/net/ipv4/icmp_echo_ignore_broadcasts

Il vantaggio di poter effettuare le impostazioni operando direttamente sul filesystem /proc


`e che su di esso si possono utilizzare tutti i comandi per la gestione dei file visti in sez. 2.2; per
questo motivo il comando sysctl non viene oramai quasi pi`
u usato direttamente per effettuare
una impostazione, con una eccezione, la configurazione delle eventuali personalizzazioni dei
parametri del kernel da effettuarsi allavvio del sistema.
A tale scopo infatti viene ancora usato sysctl, che viene invocato allinterno della procedura
di avvio per eseguire le impostazioni previste dallamministratore. Queste sono normalmente
mantenute nel file /etc/sysctl.conf; il formato del file prevede la presenza di una assegnazione
per riga, nella stessa forma in cui la scrive sulla riga di comando, con la possibilit`a di inserire
commenti precedendoli con #.
15

questo comporta che lassegnazione deve essere eseguita senza spazi fra il nome della chiave, il carattere =
ed il valore.
16
se come parametro di -p non si specifica nulla viene usato /etc/sysctl.conf.
17
anzi su Linux linterfaccia tradizionale, che prevede una apposita system call, `e ormai deprecata e sar`
a
eliminata; gi`
a adesso per poter utilizzare il comando sysctl `e necessario disporre del filesystem /proc.

140

CAPITOLO 3. LA CONFIGURAZIONE DEI SERVIZI

Nel caso di Debian negli script di avvio18 `e stato anche previsto luso di una directory
/etc/sysctl.d allinterno della quale inserire file con impostazioni specifiche in modo da consentire una gestione pi`
u flessibile di eventuali personalizzazioni dei parametri del kernel da parte
di singoli pacchetti.

3.1.4

Localizzazione e internazionalizzazione

Come accennato in sez. 2.1.3 su un sistema GNU/Linux `e presente, a partire dalle librerie fondamentali del sistema (le glibc), un sistema di supporto per la localizzazione e la internazionalizzazione19 che consente di poter personalizzare in maniera del tutto generica il funzionamento dei
programmi rispetto alla propria lingua e alle convenzioni riguardo formato di date, ora, valute,
ecc. utilizzate nel proprio paese.
Il supporto per la localizzazione prevede ad esempio che si possano marcare opportunamente
allinterno di un programma tutti i messaggi e le stringhe che vengono stampate, cos` che queste possano essere tradotte e stampante automaticamente nella lingua giusta. Oltre a questo
vengono fornite opportune funzioni di interfaccia per personalizzare lordinamento alfabetico, la
stampa di alcuni dati, come appunto orari, date e valute, in modo che i programmi si comportino
seguendo le convenzioni in uso nel proprio paese.
Questo significa, come gi`
a illustrato in sez. 2.1.3, che luso della localizzazione non ha impatto
soltanto sulla visualizzazione dei messaggi dei comandi o sulle voci dei men`
u, o sulla lingua in
cui vengono mostrate le pagine di manuale, ma anche su aspetti pi`
u sottili, come lordinamento
alfabetico o il significato degli intervalli di caratteri utilizzati per le espressioni regolari ed il
filename globbing.
Tutte queste funzionalit`
a relative alla localizzazione vengono controllate attraverso luso di
una serie di variabili di ambiente, che si sono riportate, insieme al loro significato, in tab. 3.2.20
Abbiamo gi`a incontrato in sez. 2.1.3 una di queste, LANG, che `e quella usata pi`
u comunemente
in quanto consente di impostare una localizzazione di default valida in generale, senza dover
impostare i singoli aspetti della localizzazione impostando le singole variabili LC_* una per una.
La variabile LANG e le varie LC_* vengono normalmente inizializzate a seconda della lingua
in cui si `e installato il sistema,21 ma si pu`o verificarne il valore con il comando locale che ne
stampa a video limpostazione corrente. La localizzazione di default presente nel codice delle glibc
(sostanzialmente linglese) usa il valore riservato C, alternativamente, per indicare esplicitamente
laderenza allo standard, si pu`
o utilizzare valore POSIX.
`
E possibile comunque installare anche delle localizzazioni ulteriori, e passare dalluna allaltra, anche per un singolo aspetto, semplicemente ridefinendo i valori delle variabili di tab. 3.2;
ad esempio si pu`
o usare la localizzazione italiana con il valore it_IT.UTF-8. Questo gi`a ci mostra il formato generico dei valori utilizzabili per queste variabili, che riportano in minuscolo il
valore principale della lingua (nel caso it) seguito da un carattere di sottolineatura e dal valore
secondario in maiuscolo (nel caso dellItalia `e di nuovo IT, ma per la Svizzera italiana sarebbe
stato CH), cui segue, separato da un punto, il nome della codifica dei caratteri (che nellesempio
`e UTF-8, ma sarebbe potuto essere anche qualcosa come ISO-8859-1).
La lista di questi valori viene in genere mantenuta nel file /etc/locale.alias, che serve ad
avere anche una corrispondenza con dei nomi pi`
u comprensibili per lutente, il file ha il semplice
formato di un nome per esteso (ad esempio Italiano) seguito dal valore di localizzazione corri18

nel caso trattasi di /etc/init.d/procps, gli script di avvio sono trattati in dettagli in sez 5.3.5.
a cui spesso si trova riferimento con le sigle l10n e i12n come abbreviazione delle parole inglesi localization
e internationalization (dove i numeri vanno ad indicare il numero di lettere intercorrenti).
20
maggiori dettagli si possono trovare nella pagina di manuale dedicata allargomento, accessibile con man 7
locale.
21
le modalit`
a con cui questo viene realizzato variano da distribuzione a distribuzione, Debian ad esempio usa il
valore contenuto nel file /etc/default/locale negli script di avvio.
19

3.1. I FILE DI CONFIGURAZIONE


Variabile
LANG

LC_COLLATE

LC_CTYPE
LC_MONETARY

LC_MESSAGES
LC_NUMERIC
LC_TIME
LC_ALL

141

Significato
imposta il valore generale della localizzazione, che rimane valido per
tutti gli aspetti a meno che questi non vengano diversamente specificati
tramite una delle variabili LC_*.
modifica il comportamento delle funzioni di confronto fra stringhe, modificando pertanto lordinamento alfabetico e la definizione degli intervalli o le corrispondenze nelle espressioni regolari e nel filename
globbing.
modifica lidentificazione dei caratteri come maiuscoli e minuscoli e
linterpretazione dei caratteri a byte multipli.
modifica le modalit`
a con cui vengono stampati i valori numerici che
esprimono valori monetari, in particolare luso della virgola o del punto
per la definizione dei decimali e la stampa del tipo di valuta.
modifica la lingua in cui vengono mostrati i messaggi dei programmi,
ed anche la forma delle risposte positive e negative.
modifica le modalit`
a con cui vengono letti e stampati i numeri, in
particolare per luso del punto o della virgola per i decimali.
modifica la modalit`
a con cui vengono stampati data ed ora.
imposta il valore per tutte le variabili precedenti, sostituendo eventuali
impostazioni eseguite tramite esse.

Tabella 3.2: Le variabili di ambiente che controllano il comportamento della localizzazione.

spondente, separato da spazi. Vari servizi, in particolare quelli che danno accesso allinterfaccia
grafica, fanno riferimento a questo file (o a opportune copie dello stesso), per presentare men`
u
di scelta della lingua.
Ovviamente perche sia possibile utilizzare una diversa localizzazione occorre che i relativi
dati siano installati. Questo a seconda della distribuzione pu`o comportare linstallazione di
pacchetti aggiuntivi; inoltre dato che in genere non serve disporre di tutte le localizzazioni
possibili,22 normalmente solo un sottoinsieme fra quelle esistenti (visualizzabile con lopzione
-a di locale) viene reso disponibile e pu`o essere utilizzato. In tal caso esistono in genere gli
opportuni strumenti per aggiungere o rimuovere le singole localizzazione dallelenco di quelle
utilizzabili.23
Si tenga presente inoltre che oltre a lingua e paese a cui fa riferimento ciascuna localizzazione `e legata anche alla codifica di carattere utilizzata, in generale infatti, dovendosi poter
esprimere le stringhe in tutte le possibili lingue esistenti, luso degli ordinari caratteri ASCII, che
originariamente utilizzavano soltanto 7 bit, non `e sufficiente in quanto questi possono esprimere
un insieme molto limitato di lettere e numeri, in sostanza quelli in uso nei paesi anglosassoni.
Gi`a per poter utilizzare i caratteri in uso nelle principali lingue europee infatti sono necessarie
delle estensioni rispetto allASCII standard, che aggiungano caratteri ulteriori come le vocali
accentate, il che comporta luso di una serie di codifiche pi`
u specifiche come appunto la citata
ISO-8859-1, definite sulla base di una opportuna standardizzazione.24
Ma anche cos`, mantenendo la convenzione per cui ciascun carattere viene rappresentato da
un numero ad 8 bit, si riescono a coprire sostanzialmente soltanto i caratteri in uso nelle lingue
occidentali, tanto che la codifica ISO-8859-1 viene appunto chiamata Western European).25 Per
22

in genere oltre alla installazione dei pacchetti con i dati, occorre anche generare, in particolar modo per
luso delle traduzioni, i file con gli indici che rendono possibile un uso veloce dei messaggi tradotti, tutto questo
comporta ovviamente luso di spazio disco ulteriore, che pu`
o essere risparmiato quando non necessario.
23
il comando per effettuare questa operazione `e localegen, ma le distribuzioni utilizzano in genere programmi
di pi`
u alto livello, quando addirittura non rendono utilizzabili di default tutte le localizzazioni disponibili.
24
nel caso si fa riferimento appunto allo standard ISO/IEC 8859, ma non tutti hanno aderito da subito allo stesso,
e ad esempio un noto produttore di sistemi operativi abitualmente refrattario alluso degli standard ha sviluppato
anche codifiche alternative come quella denominata Windows-1252, che hanno avuto una certa diffusione.
25
o anche latin-1, dato per le lingue latine dellEuropa centro-orientale viene usata la codifica ISO-8859-2,
detta anche latin-2 o Central European.

142

CAPITOLO 3. LA CONFIGURAZIONE DEI SERVIZI

questo gi`a lo standard ISO 8859 prevede numerose codifiche diverse, usate oltre che per le varie
varianti dei caratteri latini, per consentire luso di caratteri cirillici o greci, e per laggiornamento
delle codifiche con il simbolo delleuro, non ancora presente allepoca della definizione dellISO8859-1 e affini. In genere tutte queste codifiche vengono indicate con il nome ISO-8859-N, dove
N `e un numero che identifica la singola versione.
Ovviamente questa proliferazione di codifiche diverse comporta una notevole complessit`a
dovendo ad esempio fornire traduzioni con codifiche dei caratteri sempre diverse e limpossibilit`a
di rappresentare stringhe in cui siano presenti caratteri di lingue diverse. Per questo motivo a
partire dal 1991 `e stato sviluppato un ulteriore standard, denominato Unicode,26 che consentisse
di rappresentare in una unica codifica qualunque tipo di caratteri, rinunciando per`o alla pretesa
di utilizzare un solo byte per carattere. Per far questo vengono utilizzate opportune sequenze
di valori numerici, la forma pi`
u utilizzata `e quella del citato UTF-8, che prevede codici composti
da uno a quattro byte per singolo carattere,27 mantenendo una compatibilit`a, per i caratteri
corrispondenti, con il vecchio ASCII. Ad oggi, vista la minore complessit`a di gestione, la gran
parte delle distribuzioni tende comunque ad allinearsi alluso esclusivo di UTF-8.
Se dal punto di vista del funzionamento dei programmi luso della localizzazione nelle diverse
codifiche di caratteri non comporta, una volta installato il relativo supporto, nessun problema,
con i dati, ed in particolare con i file di testo, i problemi invece sussistono. Questi infatti possono
essere creati su un sistema che usa una certa codifica, e riletti su uno che ne usa unaltra, con
risultati in genere spiacevoli dato che si troveranno quelli che prima erano normali caratteri
trasformati in simboli strani o in sequenze numeriche di scarso significato.
Per questo motivo `e disponibile un apposito programma, iconv, che consente di effettuare
conversioni di un file di testo da una codifica di caratteri ad unaltra. Il comando richiede che
si specifichi come parametro per lopzione -f la codifica del file da convertire, che deve essere
passato come argomento, la conversione verr`a scritta sullo standard output, o sul file indicato
con lopzione -o. Se non si specifica, con lopzione -t, una codifica di destinazione, verr`a usata
quella corrispondente alla localizzazione in uso.
Per indicare una codifica si deve utilizzare il relativo nome, che `e lo stesso che poi si usa per
le variabili di tab. 3.2, ma dato il comando supporta le conversioni da e verso ad una grande
quantit`a di codifiche diverse, si pu`
o la lista completa di tutti i relativi identificativi con lopzione
-l; al solito per i dettagli sul funzionamento si consulti la pagina di manuale.
Un ultimo aspetto delle problematiche di localizzazione ed internazionalizzazione `e quello
delluso dellora locale. Benche affine alle altre problematiche appena trattate, la gestione di
questo aspetto `e completamente separata, dato che si pu`o essere allestero, ed usare un fuso
orario diverso da quello del proprio paese dorigine, senza per`o voler usare la lingua del posto
dove ci si trova.28
Come illustrato in sez. 2.4.3 il kernel opera facendo riferimento al tempo universale;29 per
poter tener conto del proprio fuso orario, ed anche della eventuale presenza dellora locale,
esiste un apposito supporto, anche questo integrato nelle librerie fondamentali di sistema, che
consente di effettuare la conversione dal tempo universale allora locale in maniera trasparente
per lutente. Questo consente di far s` che per il kernel il tempo sia sempre crescente in maniera
costante, come `e nella realt`
a, e di evitare salti o buchi nellorologio; cos` se si `e salvato un file
da tre ore questo avr`
a sempre come data di ultima modifica tre ore fa, anche se nel frattempo
ci si `e spostati in un paese diverso, si `e cambiato fuso, o `e scattata lora legale.
26

per i fan delle numerazioni lo standard `e classificato ufficialmente come ISO/IEC 10646.
esistono, ma sono poco usate, codifiche alternative come UTF-16 che usa codici composti da uno a due parole
a 16 bit, o UTF-32 che usa direttamente parole a 32 bit.
28
o anche solo cambiato fuso, se si vive in un paese abbastanza grande da averne pi`
u di uno.
29
a meno di non aver richiesto in fase di installazione luso dellora locale, per compatibilit`
a con sistemi operativi
mal progettati che han fatto questa scelta; questo `e comunque da evitare per un uso corretto del sistema e pertanto
ignoreremo totalmente questa possibilit`
a.
27

3.2. I SERVIZI DI BASE

143

Il meccanismo si basa sul concetto di timezone, una sorta di estensione del concetto di
fuso orario, che consente di incorporare anche le eventuali variazioni dovute alle presenze di
regolamentazioni locali (come lora legale) che possono variare da paese a paese, e di anno in
anno. Il database viene mantenuto a livello globale tendendo conto delle varie regolamentazioni
in vigore nei vari paesi, e dato che ci sono variazioni amministrative allinterno dei singoli paesi,
le timezone sono in genere indicate con una coppia di nomi del tipo Area/Locazione, dove
con per larea si fa riferimento ad un continente o ad un oceano (con valori come Europe,
Asia, Pacific, ecc.), mentre la locazione fa riferimento o a una citt`a o a una isola, (con valori
come Rome, New_York, Samoa, ecc.) considerata come il riferimento per quella zona;30 nel caso
dellItalia ad esempio si usa Europe/Rome.
Ciascuna timezone `e descritta da un apposito file (in gergo uno zonefile) che contiene
tutte le informazioni ad essa relative che consentono di effettuare la conversione dal tempo
universale.31 Il Filesystem Hierarchy Standard prevede che questi file vengano installati in
/usr/share/zoneinfo, in altrettanti file e directory corrispondenti al nome della timezone stessa.32 La timezone in uso viene invece impostata tramite il file /etc/localtime, che altro non `e
che la copia del file della zona scelta preso da /usr/share/zoneinfo.33
Uno dei problemi che si riscontrano nella gestione dei fusi orari `e che ciascuna distribuzione
usa un suo metodo per impostare la zona di default in /etc/localtime,34 in modo da essere in
grado di gestirne laggiornamento quando viene installata in /usr/share/zoneinfo una nuova
versione della relativa timezone. Purtroppo questo non `e stato standardizzato e modificare a
mano questo file pu`
o dar luogo ad inconvenienti.
Qualora si voglia usare una zona diversa si dovr`a anzitutto determinare lidentificativo ad
essa associato, per semplificare loperazione si pu`o usare il comando tzselect che con una serie
di domande richiede prima il continente e poi il proprio paese, ed infine stampa il valore dellora
locale nella zona risultante dalle proprie scelte. Una volta che si sia confermata la correttezza
dellora ottenuta il comando stampa il nome della relativa zona ed alcune istruzioni. In generale
se si vuole effettuare un cambiamento permanente a livello di sistema `e opportuno usare il
meccanismo che ciascuna distribuzione mette a disposizione,35 questo ovviamente richiede i
privilegi di amministratore, ma il singolo utente pu`o effettuare un cambiamento locale, che
coinvolga solo lui, tramite la variabile di ambiente TZ, assegnando ad essa il nome della timezone
che vuole utilizzare.

3.2

I servizi di base

In questa sezione prenderemo in esame la configurazione di alcuni servizi di base, presenti fin
dalle origini in tutti i sistemi unix-like, come quelli per lesecuzione periodica o differita dei
comandi, e quelli per la gestione della registrazione dei messaggi di servizio. Seguendo la filosofia
30
la scelta di evitare luso del nome delle nazioni `e voluta, sia perche ci sono nazioni con pi`
u di un fuso orario,
come gli Stati Uniti o la Russia, sia perche comunque luso dei nomi delle citt`
a principali si `e rivelato pi`
u stabile
rispetto ai cambiamenti geopolitici.
31
si tratta di uno specifico database (con un formato proprio, per approfondimenti si consulti http://en.
wikipedia.org/wiki/Zoneinfo) che contiene anche uno storico dei dati per permettere di effettuare la conversione
non solo per il tempo corrente, ma anche per tutti i tempi passati.
32
che pu`
o essere considerato come un pathname relativo rispetto a /usr/share/zoneinfo.
33
questo, nonostante contravvenga la regola di non usare file binari allinterno di /etc, `e dovuto al fatto che la
relativa informazione deve essere disponibile allavvio, quando non `e detto che /usr sia stata montata, ed `e per
questo che anche luso di un link simbolico non `e una soluzione adeguata.
34
su Debian `e ancora presente il vecchio comando tzconfig, ma questo `e deprecato in favore della riconfigurazione del pacchetto dei dati delle timezone con (vedi sez. 4.2.3) con dpkg-reconfigure tzdata, su RedHat occorre
invece usare il comando dedicato system-config-date.
35
si pu`
o sempre copiare a mano il file da /usr/share/zoneinfo, ma questo potrebbe venire sovrascritto da un
aggiornamento o anche da un riavvio.

144

CAPITOLO 3. LA CONFIGURAZIONE DEI SERVIZI

fondamentale di Unix tutti questi servizi sono realizzati tramite degli appositi programmi, detti
demoni (si ricordi quanto detto in sez. 2.1.2), che lavorano in background anche quando nessuno
`e collegato al sistema ed il cui comportamento viene controllato attraverso i rispettivi file di
configurazione.

3.2.1

Il servizio cron

Una funzionalit`
a importante presente in qualunque sistema operativo `e quella dellesecuzione di
programmi su base periodica, essenziale per compiere tutte quelle operazioni che devono essere
eseguite ad un tempo fissato. Abbiamo gi`a incontrato due operazioni che vengono gestite in
questo modo, come la creazione del database dei file di locate e lindicizzazione delle pagine di
manuale, trattate rispettivamente in sez. 2.2.2 e 2.4.2.
La gestione dellesecuzione periodica di programmi per compiere operazioni nel sistema viene
realizzata dal servizio chiamato cron, che `e stato implementato attraverso luso dellomonimo
demone cron. Il demone ha il compito di svegliarsi ogni minuto ed eseguire ogni programma
che `e stato programmato per quel momento.
Il file di configurazione principale di cron `e /etc/crontab che contiene lelenco delle operazioni periodiche generali da eseguire nel sistema. Il primo file controllato da cron per decidere se
c`e da eseguire una operazione `e questo. In genere si deve intervenire su questo file solo quando
si vuole cambiare uno degli orari a cui le operazioni prestabilite vengono eseguite o per inserire
una nuova operazione periodica.
Il formato del file segue la solita regola di ignorare righe vuote ed inizianti per #. Ogni riga
deve contenere o una assegnazione di una variabile di ambiente o la specificazione di una azione
periodica. Lazione viene specificata da una serie di campi separati da spazi o tabulatori, i primi
cinque indicano la periodicit`
a con cui il comando indicato nellultimo campo viene eseguito, il
sesto campo indica lutente per conto del quale eseguire il comando scritto nel seguito della riga.
I cinque campi della periodicit`
a indicano rispettivamente: minuto (da 0 a 59), ora (da 0 a
23), giorno del mese (da 1 a 31), mese dellanno (da 1 a 12) e giorno della settimana (da 0 a
7, dove sia 0 che 7 indicano la domenica); per questultimo campo sono accettati anche valori
tipo Mon, Thu, etc. Lutilizzo del carattere * vale da jolly e lo si usa per indicare un valore
qualsiasi. Se il tempo corrente corrisponde a tutti i valori specificati nei cinque campi il comando
viene eseguito.
Il demone cron di GNU/Linux36 supporta poi alcune estensioni non presenti in altri sistemi
unix-like: si pu`
o usare una lista (separata da virgole) per indicare pi`
u valori, un intervallo,
specificando gli estremi separati con un -. Infine il programma supporta la possibilit`a di
specificare periodi personalizzati attraverso luso del carattere jolly abbinato con il carattere /
seguito dal divisore da applicare al valore generico del campo; cos` ad esempio usando */2 nel
primo campo si intender`
a chiedere la ripetizione del lavoro ogni due minuti. Per la descrizione
del formato del file completa di tutti i dettagli, si faccia riferimento alla pagina di manuale del
file, accessibile con man 5 crontab.
Si tenga presente che siccome il programma specificato nella parte conclusiva della linea viene
eseguito direttamente dal demone cron, non saranno necessariamente definite le usuali variabili
di ambiente presenti normalmente quando si esegue una shell. In particolare `e da tenere presente
che il demone si limita a definire solo alcune di esse ed in particolare per quanto riguarda PATH
questa comprender`
a soltanto le directory /usr/bin e /bin. Altre variabili definite da cron sono
LOGNAME e HOME, che corrisponderanno al nome utente e alla directory personale dellutente per
conto del quale viene eseguito il programma.
Per questo motivo se un programma necessita della presenza di valori diversi da quelli di
default o di altre variabili, occorrer`
a inserire in testa al file le relative definizioni. Queste de36

si tratta del programma vixie-cron, creato da Paul Vixie, noto anche per essere lautore di bind, il server DNS
(vedi sez. 9) pi`
u usato nel mondo.

3.2. I SERVIZI DI BASE

145

finizioni seguono la stessa sintassi che si usa nella shell, con la differenza che cron non esegue
la variable expansion, per cui non si potr`a fare riferimento ad altre variabili allinterno di una
definizione.
Infine un ruolo particolare viene giocato dalla variabile MAILTO, che indica lutente a cui
inviare per posta elettronica37 leventuale output del programma posto in esecuzione. Infatti
quando cron esegue il comando questo non `e collegato a nessun terminale, e si pone pertanto il
problema di come gestire gli eventuali dati in uscita. La soluzione scelta `e stata appunto quella
di inviarli per posta elettronica allutente per conto del quale `e stato eseguito il comando,38
questo a meno che non si sia definita la variabile MAILTO per indicare un altro destinatario.39
Un esempio del contenuto del file /etc/crontab, preso dalla versione installata di default su
una Debian Sarge, `e il seguente:
#
#
#
#

/etc/crontab: system-wide crontab


Unlike any other crontab you dont have to run the crontab
command to install the new version when you edit this file.
This file also has a username field, that none of the other crontabs do.

SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
# m h
25 6
47 6
52 6

dom
* *
* *
1 *

mon dow user


command
* root test -e /usr/sbin/anacron || run-parts --report /etc/cron.daily
7 root test -e /usr/sbin/anacron || run-parts --report /etc/cron.weekly
* root test -e /usr/sbin/anacron || run-parts --report /etc/cron.monthly

in cui sono riportate le azioni standard che vengono eseguite tutti i giorni alle ore 6:25,40 tutte
le domeniche alle 6:47 e tutti i primi giorni del mese alle 6:52.
Il contenuto standard di questo file gi`a prevede una serie di azioni giornaliere, settimanali e
mensili che vengono eseguite in maniera automatica. Queste azioni sono eseguite attraverso il
comando run-parts41 il cui scopo `e effettuare lesecuzione, in ordine alfabetico, dagli script presenti nella directory passata come argomento. Nel caso gli script sono quelli delle directory elencate nellesempio, per cui se non si hanno esigenze particolari non `e il caso di intervenire su questo
file ma di aggiungere il proprio script direttamente in /etc/cron.daily/, /etc/cron.weekly/,
/etc/cron.monthly/. Occorre comunque fare attenzione, perche run-parts non esegue gli
script il cui nome contiene caratteri diversi da lettere maiuscole e minuscole, numeri, il carattere
di sottolineatura ed il - (per i dettagli sul funzionamento del comando si consulti la relativa
pagina di manuale).
Oltre ai compiti relativi alla gestione del sistema, e programmati pertanto dallamministratore che `e lunico che ha i privilegi per modificare /etc/crontab, il servizio cron `e in grado di
eseguire anche operazioni richieste da un singolo utente. In questo caso lutente dovr`a creare un
suo crontab personale tramite il comando crontab.42 Se lo si chiama con lopzione -e questo
37

tratteremo largomento nella seconda parte delle dispense.


questo `e il motivo per cui spesso nei comandi lanciati tramite cron viene eseguita una redirezione dello
standard output su /dev/null in modo da scartare eventuali dati in uscita.
39
se la variabile `e definita, ma vuota, linvio verr`
a disabilitato.
40
la prima riga si legge appunto come minuto 25, ore 6, essendo le altre indicazioni tutti * si intende che giorno,
mese e giorno della settimana sono qualsiasi, allo stesso modo si interpretano le altre due righe.
41
nel file di crontab mostrato nellesempio viene fatto un controllo preventivo della presenza del comando
anacron (installabile dal pacchetto omonimo), questo `e un sostituto di cron per le macchine che non `e previsto
siano sempre accese, il quale si incarica anche di eseguire le operazioni che non sono state effettuate perche la
macchina era spenta, se `e installato le operazioni periodiche vengono eseguite da lui e non `e necessario lintervento
di cron; linstallazione di default presuppone che la macchina non ne abbia bisogno, per cui il comando non sar`
a
presente e verr`
a eseguito invece run-parts.
42
in questo caso i file vengono mantenuti in /var/spool/cron/crontabs, e non sono accessibili direttamente ai
singoli utenti se non appunto attraverso il comando crontab.
38

146

CAPITOLO 3. LA CONFIGURAZIONE DEI SERVIZI

invocher`a leditor predefinito43 con cui scriverne il contenuto. Il formato delle tabelle cron personali `e identico a quello di /etc/crontab, con leccezione dellassenza del sesto campo, che nel
caso non `e necessario dato che lutente `e gi`a ben definito.
Se lanciato senza opzioni il crontab prende come argomento il file da usare come tabella, di
cui legge il contenuto, che deve essere nella forma in cui lo si scriverebbe con leditor; usando
- come nome del file i dati verranno presi dallo standard input. Si pu`o poi vedere la lista
delle operazioni programmate usando lopzione -l, che scrive sullo standard output il contenuto
corrente della tabella cron dellutente.44 Con -r invece si esegue la rimozione completa della
tabella corrente.45 Infine con -u si potr`
a modificare (solo da parte dellamministratore) la tabella
dellutente specificato come parametro.
Si tenga presente che lamministratore pu`o riservare luso del servizio cron solo ad alcuni
utenti, creando il file /etc/cron.allow, nel quale si devono elencare gli username degli utenti
che lo possono usare. Se il file non esiste `e possibile vietare luso del servizio solo ad alcuni utenti
con la creazione del file /etc/cron.deny che di nuovo dovr`a contenere la lista degli username
di coloro che non possono usarlo. In assenza di detti file chiunque pu`o usare il servizio.

3.2.2

Il servizio at

Abbiamo visto nella sezione precedente come si pu`o programmare lesecuzione periodica di comandi con crontab, esistono per`
o anche necessit`a di avere una esecuzione semplicemente differita, senza che questa debba essere periodica. Per provvedere a questo compito esiste un altro
servizio, chiamato at per il nome dal comando che permette di richiedere lesecuzione di un
programma ad un tempo successivo. Il servizio comporta diverse modalit`a di gestione della
esecuzione differita, e vari programmi per la gestione della stessa.
Il servizio `e realizzato dal demone atd, che come cron viene normalmente lanciato dagli script
di avvio. Il demone controlla la presenza nelle code di programmi in attesa di essere eseguiti, e
li manda in esecuzione al tempo stabilito. Il demone pu`o essere anche lanciato manualmente, e
prevede come opzioni -l che permette di impostare manualmente un limite massimo per il carico
della macchina, oltre il quale non saranno eseguiti programmi,46 -b che permette di impostare
un intervallo di tempo minimo47 fra la messa in esecuzione di due successivi programmi. Al
solito per lelenco completo si pu`
o fare riferimento alla pagina di manuale.
Il comando di base, che permette di programmare lesecuzione di un programma ad un dato
momento, `e at. Il comando vuole come argomento data ed ora in cui il programma specificato
deve essere messo in esecuzione; il nome di questultimo viene letto dallo standard input ma pu`o
essere specificato tramite un file qualunque, passato come parametro per lopzione -f. Le altre
principali opzioni sono riportate in tab. 3.3, per lelenco completo si pu`o al solito consultare la
pagina di manuale.
Il comando supporta una grande variet`a di formati per le modalit`a in cui si indica la data,
fra cui tutti quelli del comando date (vedi sez. 2.4.3), pi`
u altre estensioni che permettono
di usare anche specificazioni in forma pi`
u discorsiva come at 1pm tomorrow. Una descrizione
completa delle convenzioni utilizzabili si trova nel file /usr/share/doc/at/timespec. Una volta
43

di norma `e vi, a meno di non aver impostato diversamente la variabile di ambiente EDITOR.
la versione usata da Debian in realt`
a non stampa le righe di commento iniziale che avvisano di non modificare
direttamente il contenuto del crontab, in modo da poter riutilizzare loutput del comando direttamente come input
per un successivo crontab -.
45
si faccia attenzione che il comando non chiede conferma.
46
di default vale il valore preimpostato di 1.5, ha senso cambiarlo solo in caso di macchine multiprocessore.
47
il default `e 60 secondi.
48
il servizio at prevede lesistenza di diverse code con diverse priorit`
a, queste sono identificate dalle lettere
dellalfabeto dalla alla z; il default prevede che il comando at usi la coda a ed il comando batch la coda b,
le altre code devono essere indicate esplicitamente ed i comandi posti in esse verranno eseguiti con un pi`
u alto
valore di nice (cio`e con priorit`
a inferiore).
44

3.2. I SERVIZI DI BASE


Opzione
-f
-l
-d job
-q queue
-m

147

Significato
indica il file da cui leggere il comando da eseguire.
stampa la lista dei lavori programmati (equivalente a atq).
rimuove il lavoro con job id job (equivalente a atrm job).
invia il comando sulla coda queue.48
invia un messaggio al completamento del lavoro programmato anche
nel caso non ci siano dati in uscita.
Tabella 3.3: Principali opzioni del comando at.

completata la programmazione il programma stampa sul terminale un valore numerico (detto


job id ) che identifica il lavoro differito programmato dallutente. Un esempio delluso di at `e il
seguente:
piccardi@anarres:~$ at 18:00
warning: commands will be executed using /bin/sh
at> ps aux > ~/listaprocessi.txt
at> <EOT>
job 1 at Wed Mar 19 18:00:00 2008

Si tenga presente che la directory di lavoro, la maschera dei permessi e lambiente del comando
che verr`a lanciato sono quelli presenti al momento in cui si invoca at; inoltre il comando sar`
a
eseguito usando /bin/sh come shell. Come per cron in caso di presenza di dati in uscita (sia sullo
standard output che sullo standard error) questi verranno inviati allutente che ha programmato
lesecuzione con un messaggio di posta elettronica.
Una alternativa ad at per lesecuzione differita `e luso del comando49 batch che permette di
programmare lesecuzione di un programma non ad un orario predefinito, ma in base al carico
della macchina. Il comando cio`e verr`a posto in esecuzione soltanto quando il carico medio della
macchina scende al di sotto di un certo valore.
Una volta programmata lesecuzione di un programma (sia con at che con batch) questo
viene messo, per ciascun utente, in una opportuna coda. Gli utenti possono vedere la lista dei
propri programmi in attesa di esecuzione con il comando atq, mentre lamministratore pu`o usare
lo stesso comando per vedere la lista di tutti quanti. Per ciascun programma atq stampa il valore
del job id ad esso associato e lorario per cui `e stata programmata lesecuzione; ad esempio:
piccardi@ellington:~$ atq
1
Wed Mar 19 18:00:00 2008 a piccardi

Un programma pu`
o essere rimosso dalla coda con il comando atrm, che prende come argomento il valore del job id ad esso associato. Di nuovo un utente normale pu`o operare solo
sui propri programmi, mentre lamministratore pu`o operare su tutti quanti. Infine, come per
luso del servizio cron, `e previsto un controllo degli accessi al servizio at attraverso i due file
/etc/at.allow e /etc/at.deny, il cui formato e significato sono identici a quello degli analoghi
cron.allow e cron.deny.

3.2.3

Il servizio del syslog

Il syslog `e il servizio usato dai demoni che girano in background e dal kernel stesso quando
devono registrare dei messaggi.50 Come gi`a illustrato in sez. 1.3.2 i demoni devono essere attivi
anche quando nessuno `e collegato al sistema, e per questo non sono associati ad un terminale;
non `e quindi loro possibile scrivere dei messaggi di avviso o di errore sullo standard output o lo
49

in realt`
a si tratta dello stesso programma, chiamato in modo diverso.
in inglese si parla di log quando si fa riferimento alla registrazione degli eventi, come per il giornale di bordo
di una nave, o il libro su cui si annotano le attivit`
a giornaliere; il syslog serve appunto a tenere il giornale di
quanto avviene nel vostro sistema.
50

148

CAPITOLO 3. LA CONFIGURAZIONE DEI SERVIZI

standard error, dato che nessuno li leggerebbe. Per questo motivo esiste un apposito programma,
syslogd, che si occupa di fornire un servizio di registrazione a cui i vari programmi che hanno
qualcosa da riportare possono lasciare i loro messaggi.
Dato che le sue funzionalit`
a sono utilizzate dalla gran parte degli altri programmi di servizio,
in genere il syslog `e attivato automaticamente nelle prime fasi della procedura di avvio del
sistema (tratteremo largomento in sez. 5.3.5). In caso di necessit`a si pu`o comunque lanciare
direttamente syslogd, ad esempio se per un qualche motivo il servizio non parte e si vuole capire
cosa succede utilizzando lopzione -d che lo avvia in modalit`a di debug, in cui resta agganciato
al terminale e stampa una serie di informazioni relative al suo funzionamento.
Nella configurazione ordinaria syslogd riceve soltanto i messaggi inviati localmente dagli altri
programmi,51 ma `e possibile abilitare la ricezione di messaggi anche via rete da altre macchine,
utilizzando lopzione -r.52 La descrizione completa del comando e di tutte le opzioni `e disponibile
nella pagina di manuale, al solito accessibile con man syslogd.
Servizio
auth
authpriv
cron
daemon
ftp
kern
lpr
mail
mark
news
security
syslog
user
uucp

Significato
servizio identico a authpriv, deprecato.
messaggi relativi ad autenticazione e sicurezza.
messaggi dei demoni per lesecuzione differita (atd e
cron).
demoni di sistema che non hanno una categoria di servizio
a se stante.
servizio FTP (File Transfer Protocol, vedi sez. 7.7.2).
messaggi del kernel.
messaggi dei servizi di stampa.
messaggi dei demoni di gestione della posta elettronica.
messaggio di marcatura a uso interno.
messaggi del servizio di gestione di USENET (la rete dei
gruppi di discussione).
sinonimo di auth.
messaggi interni generati da syslogd.
messaggi generici a livello utente.
messaggi del sistema UUCP (Unix to Unix CoPy, un
meccanismo di comunicazione precedente Internet).

Tabella 3.4: I servizi standard in cui sono classificati i messaggi del syslog.

Il file di configurazione per il demone syslogd `e /etc/syslog.conf. Il formato del file


segue le convenzioni comuni; ogni linea definisce una regola di registrazione, le linee vuote o che
iniziano per # vengono ignorate. Ogni regola `e costituita da due campi separati da spazi o
tabulatori; il primo campo `e detto selettore, il secondo azione. Il campo selettore `e costituito
da due parti, il servizio e la priorit`
a, separate da un punto.
Il servizio identifica una categoria di servizi di sistema per conto dei quali si vuole registrare
il messaggio, e viene specificato tramite una delle parole chiave riportate in tab. 3.4, dove sono
elencati i servizi standard predefiniti. Oltre a quelli di tab. 3.4 ci sono una serie di servizi
ausiliari, identificati dalle parole chiave da local0 a local7, che sono lasciati a disposizione
dellutente per un uso non specifico.
I valori possibili per le priorit`
a sono indicati in tab. 3.5 in ordine crescente dalla pi`
u bassa
alla pi`
u alta. Questi valori identificano limportanza del messaggio; tutti i messaggi di priorit`a
superiore od uguale a quella indicata nella regola di selezione verranno registrati.
Oltre a queste parole chiave che identificano servizi e priorit`a syslogd riconosce alcune
estensioni; un asterisco * seleziona o tutti i servizi o tutte le priorit`a, mentre la parola chiave
none li esclude tutti. Inoltre usando come separatore il carattere , si pu`o elencare una lista di
51

allo scopo viene usato un apposito socket, /dev/log.


nel caso di Debian se si vuole abilitare allavvio lascolto dei messaggi sulla rete, si deve impostare nel file
/etc/default/syslogd la variabile SYSLOG a -r.
52

3.2. I SERVIZI DI BASE

149
Priorit`
a
debug
info
notice
warning
warn
err
error
crit
alert
emerg
panic

Significato
messaggio di debug.
messaggio informativo.
situazione normale, ma significativa.
avvertimento.
sinonimo di warning, deprecato.
condizione di errore.
sinonimo di err, deprecato.
condizione critica.
si deve intervenire immediatamente.
il sistema `e inusabile.
sinonimo di emerg, deprecato.

Tabella 3.5: Le varie priorit`


a dei messaggi del servizio di syslog.

servizi per la stessa priorit`


a o una lista di priorit`a per un certo servizio. Si possono poi associare
pi`
u selettori ad una stessa azione separandoli con il carattere ;. Due ulteriori estensioni di
questa sintassi sono date dal carattere =, che permette di registrare solo i messaggi aventi
esattamente quella specifica priorit`
a, e dal carattere !, che permette di escludere i messaggi di
una specifica priorit`
a o servizio.
Lazione specificata come secondo campo serve ad indicare come si vuole che siano registrati
i messaggi. Il caso pi`
u comune `e quello in cui essi devono essere scritti su un file (quello che si
chiama un file di log), che dovr`
a essere specificato tramite un pathname assoluto; al nome si pu`
o
premettere in maniera opzionale un carattere - per impedire che il contenuto del file venga
sincronizzato allarrivo di ogni messaggio, lasciando spazio per la bufferizzazione degli stessi.53
Si tenga presente che syslogd scrive sempre i messaggi che riceve in coda al contenuto corrente,
cos` da non sovrascrivere messaggi precedenti.
Oltre alla scrittura su file syslogd permette di effettuare le registrazioni in diverse altre
modalit`a. Se si premette un carattere | al nome di un file si indica che si sta facendo riferimento
ad una fifo (vedi sez. 1.2.1) da cui un altro programma potr`a rileggere i dati. Si pu`o inoltre
mandare loutput su una console specificando come file quello di un dispositivo a terminale (ad
esempio /dev/tty10). Si possono anche mandare i messaggi a liste di utenti, identificati per
username separati da virgole, e questi li riceveranno sui terminali su cui sono collegati. Infine il
carattere * fa s` che i messaggi siano inviati a chiunque sia collegato sul sistema.
Una delle caratteristiche pi`
u interessanti del syslog `e che si possono mandare tutti i messaggi
ad una macchina remota. Questo si fa usando il carattere @ seguito dal nome della macchina
di destinazione.54 Se su quella macchina `e stato predisposto un syslogd abilitato allascolto via
rete questo ricever`
a tutti i messaggi. Si pu`o realizzare cos` un macchina dedicata solo a questo
servizio, in modo da proteggere i file di log, che spesso possono contenere informazioni preziose
utili in caso di intrusione (ovviamente detta macchina deve essere ben protetta).
Un esempio per il file /etc/syslog.conf `e il seguente, che si `e estratto dal file di riferimento
che viene installato di default su una Debian Sid:
auth,authpriv.*
*.*;auth,authpriv.none
#cron.*
daemon.*
kern.*
lpr.*
mail.*
user.*

/var/log/auth.log
-/var/log/syslog
/var/log/cron.log
-/var/log/daemon.log
-/var/log/kern.log
-/var/log/lpr.log
-/var/log/mail.log
-/var/log/user.log

53
in tal caso il demone `e in grado di accorgersi di eventuali ripetizioni di un messaggio precedente e segnalare
queste ultime invece di ripetere tante volte lo stesso messaggio.
54
si dovr`
a specificare cio`e lhostname della destinazione o il suo indirizzo di rete; qui si da per scontata la
conoscenza di questi concetti, che tratteremo in dettaglio solo al cap. 7.

150

CAPITOLO 3. LA CONFIGURAZIONE DEI SERVIZI


uucp.*
/var/log/uucp.log
#
# Logging for the mail system. Split it up so that
# it is easy to write scripts to parse these files.
#
mail.info
-/var/log/mail.info
mail.warn
-/var/log/mail.warn
mail.err
/var/log/mail.err
#
# Some catch-all logfiles.
#
*.=debug;\
auth,authpriv.none;\
news.none;mail.none
-/var/log/debug
*.=info;*.=notice;*.=warn;\
auth,authpriv.none;\
cron,daemon.none;\
mail,news.none
-/var/log/messages
#
# Emergencies are sent to everybody logged in.
#
*.emerg
*

In questo caso si noti come tutti i messaggi relativi ai servizi auth e authpriv, daemon, kern,
lpr, mail, user e uucp vengano salvati su singoli file, mentre sul file syslog vengono mandati
tutti i messaggi eccettuati quelli relativi ad auth e autpriv. Inoltre sono trattati a parte i
messaggi relativi al sistema di posta, dove per ciascuna priorit`a viene usato un file diverso.
Vengono poi definiti alcuni file di log per i messaggi generici, come messages in cui si richiede
linvio dei messaggi solo delle priorit`
a info, notice e warn escludendo una serie di servizi i cui
messaggi sono archiviati altrove. Infine si noti come le emergenze (fra queste ci sono ad esempio
i messaggi di avviso dello spegnimento del sistema) vengano stampati su tutti i terminali attivi.
Infine qualora si voglia poter utilizzare il sistema di syslog dalla shell (ad esempio allinterno
di uno script) si pu`
o utilizzare il comando logger, che consente di registrare un messaggio. Il
comando prende come argomento il testo del messaggio, e di default questo verr`a registrato
sulla facility user con priorit`
a notice, si pu`o per`o usare lopzione -p per impostare una diversa
priorit`a (o facility) che prende un parametro nella forma facility.priority. Per tutti i dettagli
sul comando e le altre opzioni si consulti al solito la pagina di manuale.

3.2.4

Il sistema di rotazione dei file di log

I file di log sono una risorsa di grande valore in quanto i messaggi provenienti dai vari servizi che
vi sono registrati possono essere di importanza fondamentale per capire le ragioni di eventuali
malfunzionamenti. Il problema `e che syslogd,55 come abbiamo appena detto, scrive sempre in
modalit`a append, aggiungendo i nuovi messaggi in coda ai file; questo significa che la dimensione
di questi ultimi tende a crescere indefinitamente e si rischia cos` che la partizione su cui risiede
la directory /var/log si riempia.
Per risolvere questo problema, e semplificare la gestione dei file di log, `e stato creato un
apposito programma, logrotate, che lanciato su base periodica gestisce la rotazione dei file di
log effettuando operazioni come la loro compressione, la rimozione delle versioni troppo vecchie,
e linvio di messaggi di avviso allamministratore per posta elettronica.
Il comando deve essere lanciato specificando come argomento un file di configurazione che
specifica le modalit`
a di rotazione. Se si usa lopzione -v il comando stamper`a una serie di
messaggi durante le operazioni di rotazione. Lopzione -d permette di eseguire il comando in
55

il problema si pone anche in quei casi, come avviene per i demoni di rete pi`
u complessi, in cui i file di log
vengono scritti direttamente dal singolo programma senza utilizzare syslogd.

3.2. I SERVIZI DI BASE

151

modalit`a di debug (ed implica -v), mentre lopzione -f forza il comando ad eseguire una rotazione
anche quando questa non `e in programma. Al solito per lelenco completo delle opzioni si pu`
o
fare riferimento alla pagina di manuale.
Il formato del file di configurazione prevede la presenza di una direttiva per riga. Queste
possono essere specificate direttamente nel file e vengono prese come impostazioni globali da
` poi possibile indicare delle opzioni specifiche per
applicare in maniera generica a tutti i file. E
un singolo file scrivendo al posto di una direttiva il pathname assoluto di questultimo, seguito
da un blocco delimitato da parentesi graffe contenente le direttive da applicargli, specificate
sempre una per riga. Infine, come per gli altri file di configurazione, le linee vuote o che iniziano
per # vengono ignorate.
Direttiva
daily
weekly
monthly
size

rotate
include

create

tabooext

compress
missingok
prerotate

postrotate

endscript

Significato
effettua una rotazione giornaliera.
effettua una rotazione settimanale, un file viene ruotato se `e passata
pi`
u di una settimana dallultima rotazione.
effettua una rotazione mensile, i file vengono ruotati la prima volta che
il comando viene eseguito in un certo mese.
effettua la rotazione al superamento di una certa dimensione da parte
del file di log (invece che su un periodo temporale); richiede che si
specifichi la dimensione come argomento (supporta i suffissi k, M e G).
specifica il numero di copie (da passare come argomento) dei file di log
che devono essere mantenute in una successione di rotazioni.
legge i file passati come parametri, o se trattasi di directory, tutti i
file presenti allinterno di questa che non abbiano nel nome una delle
estensioni vietate (indicate tramite la direttiva tabooext).
crea un nuovo file di log vuoto immediatamente dopo aver eseguito
la rotazione del precedente assegnandogli un insieme di permessi, un
proprietario ed un gruppo proprietario, che devono essere specificati
come argomenti.
permette di definire una lista di estensioni e caratteri vietati nei nomi
dei file da includere con la direttiva include; questi devono essere passati come lista separata da virgole. Un carattere + indica di aggiungere
la lista ai caratteri gi`
a esclusi, di default questi sono .rpmorig, .rpmsave, .dpkg-dist, .dpkg-old, .dpkg-new, .disabled, ,v, .swp, .rpmnew,
e ~.
comprime le vecchie versioni dei file di log usando gzip.
se il file di log `e assente non d`
a errori.
prima di effettuare la rotazione esegue tutti i comandi inseriti nelle
linee seguenti la direttiva fino a quando non incontra una direttiva
endscript.
dopo aver effettuato la rotazione esegue tutti i comandi inseriti nelle
linee seguenti la direttiva fino a quando non incontra una direttiva
endscript.
termina una direttiva postrotate o prerotate.

Tabella 3.6: Le principali direttive usate nel file di configurazione di logrotate.

Una direttiva particolare `e include che permette di includere altri file allinterno della configurazione. Il suo uso pi`
u interessante `e per`o quello in cui viene usata per includere una directory;
in tal caso infatti vengono inclusi tutti i file in essa contenuti.56 Questo consente ad ogni servizio
che gestisce autonomamente i suoi file di log di usare un suo file di configurazione per logrotate
con delle impostazioni personalizzate, semplicemente scrivendolo in una directory comune.
Altre due direttive particolari sono prerotate e postrotate, che consentono di eseguire una
serie di comandi prima e dopo la rotazione. In genere le si usano per fermare prima e far ripartire
56

a parte quelli con alcuni caratteri o con certe estensioni che li identificano come copie, definibili con la direttiva
tabooext (vedi tab. 3.6).

152

CAPITOLO 3. LA CONFIGURAZIONE DEI SERVIZI

poi i servizi di cui si vuole ruotare i file di log;57 verranno eseguiti tutti i comandi inseriti nelle
righe successive la direttiva fino a quando non si incontra la direttiva endscript.
La rotazione di un file pu`
o essere specificata sia per intervalli temporali (con le direttive
daily, weekly e monthly) che sulla base del superamento di una certa dimensione (con la
direttiva size); quando il comando viene invocato viene controllato se la condizione `e soddisfatta
e solo in questo caso (a meno di non aver specificato lopzione -f) la rotazione viene eseguita. Le
altre principali direttive sono riportate in tab. 3.6, la descrizione completa di tutte le direttive e
del loro significato si trova nella pagina di manuale del comando, accessibile con man logrotate.
Benche sia possibile lanciare il comando a mano, gran parte delle distribuzioni invocano
logrotate fra le operazioni giornaliere eseguite da cron. In quasi tutti i casi negli script viene usato come standard il file di configurazione /etc/logrotate.conf mentre ulteriori file di
configurazione di singoli servizi sono mantenuti nella directory /etc/logrotate.d/.
In genere si mettono in logrotate.conf solo alcune opzioni generali, le opzioni specifiche
per ciascun servizio vengono messe nella directory /etc/logrotate.d/. In questo modo si fa
si che un pacchetto di installazione di un qualunque programma che ha bisogno di produrre dei
log e ruotarli possa inserire in questa directory un opportuno file di configurazione. Il contenuto
della directory viene poi incluso tramite una direttiva include presente in logrotate.conf cos`
che non ci sia necessit`
a di modificare questultimo ogni volta che si installa o disinstalla un
pacchetto software.
Un esempio del contenuto di /etc/logrotate.conf, tratto dalla versione installata su una
Debian Etch, `e il seguente, i commenti spiegano in maniera molto chiara il significato delle varie
opzioni:
# see "man logrotate" for details
# rotate log files weekly
weekly
# keep 4 weeks worth of backlogs
rotate 4
# create new (empty) log files after rotating old ones
create
# uncomment this if you want your log files compressed
#compress
# RPM packages drop log rotation information into this directory
include /etc/logrotate.d
# no packages own wtmp or btmp -- well rotate them here
/var/log/wtmp {
monthly
create 0664 root utmp
}
/var/log/btmp {
missingok
monthly
create 0664 root utmp
rotate 1
}
57

si ricordi quanto detto in sez. 1.2.2 riguardo la cancellazione dei file: un programma attivo fa riferimento in
maniera diretta ai file che ha aperto, fra cui ci saranno anche i file di log; per cui anche se si ruota uno di questi un
programma, avendo un riferimento allinode, continuer`
a a scrivere sul file originale; per questo motivo in genere `e
necessario prima fermare il programma e poi farlo ripartire, cos` che al riavvio vada a scrivere sulla nuova copia
del file di log.

3.3. LX WINDOW SYSTEM

153

# system-specific logs may be configured here

In questo esempio si richiede di ruotare i file settimanalmente e di mantenere quattro copie


degli stessi; gli eventuali errori verranno notificati via e-mail allamministratore. Poi si dice di
leggere tutto il contenuto della directory /etc/logrotate.d per ulteriori configurazioni, infine
si cambiano le impostazioni di default per i due file /var/log/wtmp e /var/log/btmp che non
fanno riferimento a nessun pacchetto (contengono i dati delle sessioni degli utenti) per i quali si
richiede una rotazione mensile invece che settimanale.

3.3

LX Window System

In questa sezione tratteremo le problematiche principali relative alluso e alla gestione dellinterfaccia grafica nei sistemi Unix. In particolare approfondiremo le caratteristiche principali
dellX Window System, linfrastruttura che fornisce linterfaccia grafica, di come gestirlo e come
configurarlo.

3.3.1

Introduzione a X Window

Benche in realt`
a esistano diverse alternative per la realizzazione di applicazioni in ambiente
grafico, sia attraverso luso diretto del framebuffer o dellhardware video, sia attraverso opportuni
toolkit grafici, sia attraverso sistemi a finestre completi come Fresco (http://www.fresco.org/),
a tuttoggi le interfacce grafiche normalmente utilizzate in un sistema GNU/Linux (ed in generale
in un qualunque sistema Unix) si basano tutte sullX Window System, nome spesso abbreviato
in X11, dalla versione finale del protocollo.
Il fatto che esistano delle alternative complete per luso dellinterfaccia grafica ci mette immediatamente di fronte ad una delle principali differenze che c`e fra un sistema unix-like come
GNU/Linux ed altri sistemi operativi: al contrario di altri sistemi come Windows o MacOS58 in
un sistema GNU/Linux linterfaccia grafica non fa parte del kernel, e non ha nessuna caratteristica privilegiata, ma viene eseguita in user space come un qualunque altro programma.59 Tutto
il sistema grafico in sostanza non `e che un altro strato che viene posto sopra il kernel, che pu`
o
essere tranquillamente sostituito da uno strato diverso, e che pu`o anche essere eliminato tutte
le volte che non serve (ad esempio sui server).
Linterfaccia grafica X Window System nasce a met`a degli anni 80 con il progetto Athena
allMIT. Lintento era di fornire un ambiente grafico per i sistemi UNIX, e costituisce la prima
interfaccia grafica realizzata su un sistema operativo. La caratteristica principale del sistema,
che a tuttoggi lo distingue dalle interfacce grafiche presenti in altri sistemi operativi, `e che oltre
a fornire alle usuali funzionalit`
a che permettono di disegnare finestre ed altri elementi grafici
su uno schermo, il sistema `e completamente trasparente rispetto alla rete. Questo significa che
X Window `e in grado di operare allo stesso modo sia in locale, interfacciandosi direttamente
allhardware grafico della macchina su cui si sta operando, sia in rete, inviando attraverso di
essa le informazioni per disegnare la grafica di una applicazione su una macchina remota.
Larchitettura di X Window infatti definisce una relazione client-server, illustrata in fig. 3.1
fra una applicazione ed il suo display, fornendo una serie di funzioni di libreria (tramite le Xlib)
che separano completamente lapplicazione (detta per questo X-client) dal programma che si
58

si parla del MacOS tradizionale, MacOS X `e uno unix (Darwin deriva da BSD), e come tale `e disponibile una
versione di X11 anche per lui.
59
in realt`
a il server deve avere accesso allhardware della scheda grafica e questo viene fatto attraverso degli
appositi agganci nel kernel forniti dai driver delle schede grafiche; ed `e questo il motivo per cui a volte con luso di
schede per le quali i driver di supporto sono sperimentali (o proprietari) si pu`
o causare anche il blocco completo
del sistema; in questo caso si tratta comunque di un problema del driver, non del programma grafico che pu`
o aver
causato il blocco.

154

CAPITOLO 3. LA CONFIGURAZIONE DEI SERVIZI

Figura 3.1: Schema di funzionamento del protocollo X11

` questa separazione che consente di definire


incaricher`a di disegnarne le finestre (lX-server ). E
un protocollo di comunicazione (lX protocol ), fra client e server, che rende lintera interfaccia
trasparente rispetto alla rete.
Si tenga presente per`
o che in questa architettura client e server hanno posizione invertita
rispetto al solito. Infatti di solito `e il client che viene eseguito localmente per interrogare un
server remoto, che fornisce delle risposte. In questo caso sono dei client remoti (le applicazioni)
che inviano le informazioni al server locale (lX-server ) perche questo ne disegni le finestre sulla
propria macchina.
Fino a qualche anno fa la versione dellX Window System pi`
u utilizzata su GNU/Linux era
XFree86. In realt`
a essendo un protocollo standardizzato, il cui codice di riferimento `e sempre
stato rilasciato con licenza libera,60 ne esistono anche altre realizzazioni.61 Dallinizio del 2004,
a causa di un cambiamento di licenza che lo rende incompatibile con la GPL, la diffusione di
XFree86 si sta riducendo sempre di pi`
u. Gi`a prima di allora cerano state parecchie critiche alla
gestione del progetto, ed in particolare alla scarsa apertura nellaccettare contributi esterni, e nel
restare legati ad una costruzione monolitica dellinsieme del server e delle librerie, che rendeva
poco flessibile lo sviluppo.
Il cambiamento di licenza `e stata loccasione che ha fatto s` che questo malcontento desse
luogo allavvio di un progetto di sviluppo alternativo. Negli anni precedenti infatti si era avuta
una significativa conversione dellX-Consortium,62 da consorzio di industrie a fondazione aperta
anche alla partecipazione diretta di singole persone. Ne sono cos` entrati a far parte i principali
sviluppatori che non erano daccordo con il cambio di licenza e la gestione del progetto XFree86,
e si `e ripartiti dallultima versione di questultimo rilasciata con la licenza originale, per la
creazione delle nuove versioni del server X dellX-Consortium, quello che oggi va sotto il nome
di X.org (si veda http://www.x.org/).
Il cambio di gestione del progetto ha avuto un notevole effetto di rilancio dello sviluppo di
X Window ; in particolare nel Dicembre 2005 `e stata creata, dopo pi`
u dieci anni, una nuova
60

la cosiddetta licenza X11, che venne creata per questo progetto e poi utilizzata in seguito anche per molti
altri; non essendo una licenza copyleft essa consentiva ai vari distributori di realizzare delle versioni proprietarie.
61
un progetto interessante ad esempio `e TinyX, una versione ottimizzata per il minor consumo possibile di
risorse, da utilizzare nei sistemi embedded.
62
il titolare dei diritti dellimplementazione originale di X Window.

3.3. LX WINDOW SYSTEM

155

major release del protocollo, la X11R7, che oltre ad introdurre una serie di estensioni, `e la prima
che vede finalmente una separazione delle varie componenti (server, librerie, driver delle schede
grafiche) che consentir`
a anche in futuro di avere uno sviluppo molto pi`
u rapido e flessibile. Ad
oggi sono gi`
a state rilasciate varie versioni del server X.org, che `e stato adottato in tutte le nuove
versioni delle principali distribuzioni GNU/Linux.

3.3.2

La configurazione del server X

Il primo passo per utilizzare linterfaccia grafica su GNU/Linux `e configurare il server X sulla
propria macchina, perche questo possa disegnare le finestre e ricevere i dati da tastiera e mouse
(oltre che dai client). Fino alla versione 3 di XFree86 il primo passo era quello di identificare
la propria scheda grafica e installare il pacchetto con il relativo server X in grado di parlare
con essa. A partire dalla versione 4 il supporto delle varie schede `e stato modularizzato, ed il
pacchetto che contiene il server `e uno solo. Con X.org il supporto `e sempre modulare; perci`
o
faremo sempre riferimento alla configurazione secondo questa modalit`a.
Tutte le distribuzioni mantengono i vari file di configurazione dellX Window System in una
directory ad essi dedicata, sotto /etc/X11. La configurazione del server in XFree86 `e governata
dal file XF86Config, il formato di questo file `e stato modificato a partire dalla versione 4, per
cui nelle distribuzioni si pu`
o trovare al suo posto il file XF86Config-4. Usando XFree86 con
versioni successive alla 3 il server X in genere cerca prima questultimo e se non lo trova ricorre
al precedente. Se invece si usa X.org il file di configurazione `e sempre xorg.conf, che usa la
stessa sintassi del precedente. Dato che questultimo `e ormai diventato il pi`
u diffuso, nel seguito
faremo principalmente riferimento ad esso.
Configurare il server X significa fornirgli un file di configurazione adeguato, che lo metta in
grado di utilizzare lhardware necessario. Sempre pi`
u spesso questo viene fatto automaticamente
allinterno della procedura di installazione del sistema, in genere attraverso un opportuno programma in grado di determinare automaticamente i parametri necessari e generare il file.63 Oltre
a quelle relative allhardware la configurazione necessita anche di altri parametri, come le informazioni relative ai font per il disegno dei caratteri o ai nomi dei colori, che per`o in genere sono
predeterminate dallinstallazione dei relativi pacchetti e vengono impostate automaticamente.
Le informazioni necessarie alla configurazione del server X sono quelle che riguardano le
varie componenti utilizzate dallo stesso, e cio`e mouse, tastiera, scheda video e monitor. Si tenga
presente che fin dalla sua nascita X11 ha sempre supportato la presenza di schermi multipli, e che
nelle versioni pi`
u recenti sono state inserite pure delle estensioni che permettono di spalmare
un desktop su pi`
u schermi.
Per la creazione della configurazione praticamente ogni distribuzione ha creato un suo programma dedicato;64 con il pacchetto XFree86 comunque vengono anche forniti direttamente due
programmi di configurazione, xf86cfg che opera ad interfaccia grafica e xf86config che opera
a linea di comando;65 nel caso si usi X.org esistono gli equivalenti xorgcfg e xorgconfig. Questi programmi, una volta inseriti i dati dellhardware, permettono di generare automaticamente
il file di configurazione. Essi vengono utilizzati sempre meno dato che le capacit`a di autoconfigurazione del server migliorano continuamente, e gi`a adesso si pu`o generare uno scheletro
del file di configurazione lanciando il server con X -configure.
63

in un prossimo futuro tutto ci`


o non sar`
a neanche pi`
u necessario, infatti le versioni di X.org a partire dalla 7.2
sono in grado di auto-configurarsi completamente e funzionare nella gran parte dei casi anche senza avere un file
di configurazione.
64
su Debian basta usare dpkg-reconfigure (vedi sez. 4.2.3) sul pacchetto del server X, xserver-xfree86 o
xserver-xorg a seconda di quale versione `e in uso.
65
nella versione 3.0 di Xfree86 cera pure il comando XF86Setup, che forniva una interfaccia testuale semigrafica,
oggi questo programma non viene pi`
u utilizzato.

156

CAPITOLO 3. LA CONFIGURAZIONE DEI SERVIZI

Il file di configurazione del server X `e diviso in varie sezioni; ciascuna sezione inizia con
la parola chiave Section seguita dal nome che la identifica, ed `e conclusa dalla parola chiave
EndSection. Allinterno di queste sezioni dovranno poi essere specificate le opzioni ed i valori
delle configurazioni (dipendenti dal tipo di sezione); la sintassi generica di una sezione sar`a
pertanto analoga a qualcosa come:
Section "SectionName"
SectionEntry
...
EndSection
I nomi delle principali sezioni sono riportati in tab. 3.7, lelenco completo pu`o essere trovato
nella rispettiva pagina di manuale (la sintassi del file di configurazione `e identica per XFree86 e
X.org). Le sezioni hanno poi una loro gerarchia; alcune di esse devono essere necessariamente
specificate, e quelle di livello pi`
u alto possono usare valori definiti in quelle di livello pi`
u basso.
Nome
Files
ServerFlags

Module

InputDevice

Device
Monitor
Modes
Screen
ServerLayout
DRI

Contenuto
indica i pathname di file o directory contenenti informazioni usate dal
server come le directory dei font o i file con le descrizioni dei colori.
indica le opzioni generali che controllano globalmente il comportamento
del server, di norma non viene utilizzato e valgono i valori di default
delle stesse.
indica i moduli aggiuntivi che devono essere caricati dinamicamente (e
che forniscono estensioni come le accelerazioni 3D e il rendering dei font
truetype).
contiene la descrizione di un dispositivo di input (mouse, tastiera,
tavoletta grafica, ecc.); ne deve essere specificata una per singolo
dispositivo.
contiene le informazioni di configurazione di una scheda grafica, ne deve
essere specificata una per ogni scheda disponibile.
contiene le informazioni di descrizione di un monitor, ne deve essere
specificata una per ogni monitor disponibile.
contiene la descrizione di una modalit`
a video (corrisponde a specificare
risoluzione, frequenza di refresh e profondit`
a di colore).
contiene la definizione di uno schermo, combinando una scheda video
ed un monitor.
contiene la configurazione generale del server.
contiene le specifiche per il Direct Rendering Interface uninterfaccia
diretta alle accelerazioni hardware delle schede grafiche.

Tabella 3.7: I nomi delle varie sezioni del file di configurazione del server X.

Al livello pi`
u alto c`e la sezione ServerLayout, che serve a collegare insieme i dispositivi di
ingresso e di uscita che vengono usati dal server in una sessione X11. Un singolo dispositivo di
ingresso deve essere descritto in una sezione InputDevice, mentre i dispositivi di uscita devono
essere collegati in una sezione Screen, che comprende una sezione Device che descrive una
scheda video ed una sezione Monitor che descrive il monitor ad essa collegato.66 Le altre sezioni
sono invece indipendenti, e non dipendono dalle altre.
Ciascuna sezione comprende una serie di direttive, proprie della sezione, che vanno espresse
su una singola riga. Queste sono introdotte da una parola chiave seguita da uno o pi`
u valori, che
hanno un formato comune per tutte le sezioni e possono essere di tre tipi diversi: numeri interi,
numeri reali e stringhe. Gli interi si possono esprimere sia in forma decimale che esadecimale
(apponendo il suffisso 0x), le stringhe devono sempre essere comprese fra virgolette.
Inoltre per tutte le sezioni esiste la direttiva generica Options che specifica il valore di una
opzione; questa richiede sempre due argomenti di tipo stringa, il primo dei quali specifica il nome
66

queste possono essere anche pi`


u di una se ci sono pi`
u monitor collegati alla stessa scheda.

3.3. LX WINDOW SYSTEM

157

dellopzione ed il secondo il valore. La stringa che specifica questultimo viene poi interpretata
ed il suo contenuto viene classificato in altrettanti tipi di valore, i numeri (reali o interi, secondo
il formato visto per gli argomenti generici) verranno interpretati come tali, le parole chiave
yes/no, on/off, true/false esprimeranno invece dei valori logici, mentre aggiungendo ad un
numero uno dei suffissi Hz, kHz, MHz, ecc. si potranno specificare delle frequenze; il resto verr`
a
interpretato come stringa (lelenco completo dei tipi di valori `e comunque riportato nella pagina
di manuale). Inoltre usando il prefisso No nello scrivere il nome di una opzione si specificher`
a
per essa direttamente un valore logico pari a No, off o false.
Tratteremo qui solo le principali sezioni, indicando le principali direttive previste per ciascuna
di esse; al solito per lelenco completo si pu`o fare riferimento alla pagina di manuale. La prima
che prendiamo in esame `e la sezione Files, che contiene la definizione di una serie di pathname
` in questa sezione che si indicano dove
che riguardano i file e le directory utilizzate dal server. E
si trovano le risorse (ad esempio i font) necessari per il funzionamento del server. Le direttive
possibili sono le seguenti:
FontPath

specifica una lista di directory, separate da virgole, in cui si trovano i font usati
dal server. Si pu`
o usare la direttiva pi`
u volte, e le relative directory verranno
unite insieme. La direttiva richiede o un pathname assoluto ad una directory, o
lidentificatore di un font server,67 nella forma:
<trans>/<hostname>:<port-number>
dove trans indica la modalit`a di connessione (e vale unix per i socket locali e
tcp per un collegamento remoto), hostname indica il nome della macchina cui si
collega e port la porta. Un esempio tipico `e:
FontPath

"unix/:7100"

che indica il fontserver sulla macchina locale.


RgbPath

indica il pathname del file contenente il database dei colori RGB, qualora non
specificato viene utilizzato il valore di default che `e /usr/lib/X11/rgb.68

ModulePath indica il pathname delle directory in cui verranno cercati i moduli binari che forniscono le estensioni del server, come per la direttiva FontPath si possono specificare
pi`
u directory usando pi`
u istanze della direttiva. Qualora non sia specificato nulla
viene usata di default la directory /usr/X11R6/lib/modules/.69
La gestione dei font allinterno di X window merita qualche dettaglio in pi`
u, luso della
direttiva FontPath da sola infatti non `e sufficiente, essa infatti serve ad indicare al server dove si
sono installati font, ma questa installazione deve essere stata effettuata in maniera adeguata. In
generale il tipo di font utilizzabile dipende dalla versione di server utilizzata ma tutte le versioni
di X.org supportano luso generico di font sia Type 1 che TrueType. Il server per`o oltre ai file
che contengono i caratteri dei font ha necessit`a di conoscere anche le informazioni relative al
67

il font server `e un servizio fornito dal programma xfs che permette di mantenere i font su una singola
macchina, e distribuirli via rete ad altre, in modo da diminuire lo spazio disco necessario allinstallazione del
server o consentire lutilizzo di font ai cosiddetti dumb terminal non dotati di disco; veniva utilizzato, prima
del supporto diretto del rendering dei font TrueType, per generare automaticamente da questi ultimi dei font
compatibili con il server X allora in uso.
68
a partire dalla versione 7.0 non viene pi`
u utilizzata la gerarchia separata X11R6, le versioni pi`
u recenti di X.org
inoltre installano il file in /usr/share/X11/; in precedenza il file era sotto /usr/X11R6/lib/X11/rgb (il nome del
file `e comunque rgb.txt, con il .txt che viene sottinteso).
69
anche in questo caso il valore `e cambiato con le nuove versioni del server, con X.org ad esempio `e
/usr/lib/xorg/modules/.

158

CAPITOLO 3. LA CONFIGURAZIONE DEI SERVIZI

nome dei font stessi, alle loro dimensioni, al tipo (normale, grassetto, corsivo, ecc.), cos` che
questi possano poi essere utilizzati e referenziati al suo interno.
Per questo una volta installati i file dei font devono essere costruite anche tutte le informazioni
necessarie al server. Un tempo questo doveva essere fatto attraverso degli opportuni programmi
di utilit`a, una volta installati i file dei font in una directory, occorreva creare le informazioni di
gestione con programmi come mkfontdir o ttmkfontdir.
Con X.org tutto questo non `e pi`
u necessario e le informazioni relative ai font vengono gestite
automaticamente tramite la libreria fontconfig. Questa viene controllata da una serie di file in
/etc/fonts; la configurazione generale viene mantenuta nel file /etc/fonts/fonts.conf, ma
eventuali personalizzazioni devono essere inserite in /etc/fonts/local.conf che viene mantenuto in caso di aggiornamento, i singoli utenti possono inserire le proprie in .fonts.conf. Tutti
questi file sono in formato XML,70 e se ne pu`o trovare una descrizione dettagliata nella pagina
di manuale, accessibile con man fonts.conf.
La sezione ServerFlags permette di impostare alcune opzioni generali relative al server, essa
contiene solo direttive di tipo Options e normalmente `e vuota. La sezione Module `e usata per
specificare quali moduli di estensione del server devono essere caricati. In genere prevede solo
la direttiva Load seguita dal nome del modulo; questo `e lo stesso del file corrispondente che si
deve trovare allinterno del path indicato ModulePath, tolto il lib iniziale e lestensione. Lunica
formulazione alternativa `e usare una sintassi del tipo:
SubSection "extmod"
Option "omit XFree86-DGA"
EndSubSection
dove il nome del modulo `e lo stesso e la direttiva Option viene utilizzata per passare dei parametri
al modulo.
La sezione InputDevice serve a specificare le caratteristiche di un singolo dispositivo di
input, e normalmente se ne hanno almeno due, una per la tastiera e laltra per il mouse, ma se
ne possono specificare anche di pi`
u, in caso di presenza di pi`
u tastiere (caso non molto comune) o
di pi`
u mouse (caso comune invece con i portatili, cui in genere si usa un mouse USB da affiancare
al touchpad, o con luso di tavolette grafiche). Ogni sezione viene specificata nel formato:
Section "InputDevice"
Identifier "nome"
Driver
"dispositivo"
Option
"..."
...
EndSection
dove devono sempre essere specificate sia la direttiva Identifier, che indica un nome cui fare
riferimento al dispositivo nelle altre sezioni, che la direttiva Driver, che ne specifica il tipo.
In particolare Driver permette di indicare se il dispositivo in questione viene usato per il
puntamento (con il valore mouse) o per limmissione di dati (con il valore keyboard) facendo
riferimento al caso pi`
u comune di entrambe le tipologie. Le restanti direttive sono tutte da
specificare nella forma di opzioni, le principali delle quali sono:
CorePointer

di valore booleano; se viene impostata indica che il relativo dispositivo viene


considerato come il mouse principale.

CoreKeyboard

di valore booleano; se viene impostata indica che il relativo dispositivo viene


considerato come la tastiera principale.

70

eXtendible Markup Language, un linguaggio formale basato su marcatori.

3.3. LX WINDOW SYSTEM


Device

159

indica il file di dispositivo da utilizzare per accedere al relativo dispositivo.

SendCoreEvents invia gli eventi relativi ad un altro dispositivo come se fossero generati dal
dispositivo principale (lo si usa sui portatili per abbinare gli eventi di un
eventuale mouse USB a quelli della touchpad).
XkbModel

indica, nel caso di una tastiera, il modello (ad esempio pc105 per una tastiera
da PC a 105 tasti).

XkbLayout

indica, nel caso di una tastiera, la disposizione dei tasti, e corrisponde in


genere al nome della relativa localizzazione (con valori come us, it, fr, de,
ecc.)

Protocol

indica nel caso di un mouse, il protocollo utilizzato (i pi`


u comuni sono PS/2
per i mouse ordinari e ImPS/2 per quelli dotati di rotellina).

La sezione Device serve a specificare le caratteristiche di una scheda grafica, e ne deve esistere
almeno una (ma se ne possono avere diverse in caso di presenza di pi`
u schede grafiche). Il suo
formato `e identico a quello visto in precedenza per InputDevice, e prevede le due direttive
obbligatorie Identifier e Driver, dove questultima indica il nome del modulo associato al
driver che gestisce la relativa scheda grafica.
Il resto della sezione prevede come nel caso precedente solo delle direttive Option, buona
parte delle quali sono specifiche del driver della scheda grafica utilizzato e sono descritte nella
relativa pagina di manuale, che si accede nella sezione 4 usando il nome del driver stesso.71
Alcune opzioni generiche, valide per tutti i driver, sono tuttavia specificate direttamente nella
pagina di manuale del file di configurazione.
La sezione Monitor serve ad indicare le caratteristiche di un monitor, e ne deve essere presente
almeno una. Il formato generale della sezione `e del tipo:
Section "Monitor"
Identifier "nome monitor"
direttiva valore
...
EndSection
dove come nei casi precedenti Identifier specifica una stringa identificativa del monitor (che
pu`o essere qualunque) ed `e obbligatoria; le restanti direttive servono a specificare le caratteristiche del monitor, le principali sono:
VendorName

stringa che identifica la marca del monitor.

ModelName

stringa che identifica il modello del monitor.

HorizSync

indica la frequenza (o lintervallo di frequenze) di sincronia orizzontale72 supportato dal monitor. Pu`o essere indicato come singola lista di valori separati
da virgole come intervallo separato da un meno, e se non specificata con uno
degli indicatori illustrati in precedenza `e supposto essere espressa in kHz.

VertRefresh

indica la frequenza (o lintervallo di frequenze) di aggiornamento verticale73


supportato dal monitor. Come per HorizSync pu`o essere indicato sia come

71

ad esempio per una scheda Matrox che si utilizza con il driver mga si potranno ottenere le informazioni con
man mga o man 4 mga.
72
la frequenza di sincronia orizzontale `e la frequenza a cui il monitor pu`
o spostare il fascio che disegna una riga
orizzontale.
73
`e la frequenza con cui pu`
o essere ridisegnato lintero schermo.

160

CAPITOLO 3. LA CONFIGURAZIONE DEI SERVIZI


singola lista di valori che come intervallo, espresso di default in Hz. Questo valore viene usato dal server X per determinare se una modalit`a video `e
compatibile con il monitor.

Mode

`e una direttiva speciale da scriversi su pi`


u linee (chiuse da una direttiva EndMode) che permette di specificare una modalit`a video (in sostanza linsieme dei
parametri che imposta la risoluzione dello schermo e la frequenza di aggiornamento dello stesso) cui viene dato il nome passato come argomento, mentre
i valori da usare in termini di risoluzione e frequenze di aggiornamento vengono specificati nelle righe successive (per la sintassi si consulti la pagina di
manuale).

Modeline

`e una forma alternativa della direttiva Mode che permette di scrivere gli stessi
dati che definiscono una modalit`a video su di ununica riga.74 Come per la
precedente Mode non viene usata se non quando si voglia definire una modalit`
a personalizzata o quando, cosa che accade sempre meno di frequente,75 il
riconoscimento automatico non ha successo.

I valori per HorizSync e VertRefresh sono critici per luso del monitor, in quanto sbagliandoli `e possibile mandare fuori sincronia lo stesso con il risultato di non vedere pi`
u nulla. I
monitor recenti supportano comunque un meccanismo di notifica alle applicazione di questi ed
altri dati. Nelle versioni pi`
u recenti dei monitor viene implementato un meccanismo di notifica
delle risoluzioni supportate chiamato DDC (Display Data Channel ) il cui uso `e supportato di
default da Xorg a partire dalla versione 6.8, esiste altres` un meccanismo di notifica detto EDID
che consente di richiedere le informazioni direttamente al monitor.
Grazie a questi meccanismi ormai non `e pi`
u necessario dover cercare i valori di HorizSync
e VertRefresh su una qualche oscura pagina del manuale del monitor (sempre che si siano
scomodati a scriverceli) e impostare una modalit`a video manualmente, ma limpostazione `e del
tutto automatica. Inoltre i dati di EDID possono essere letti tramite il programma get-edid
il cui output pu`
o essere trasformato direttamente nella corretta sezione Monitor pronta per
linclusione nel file di configurazione, mandandolo in pipe al comando parse-edid.76
Gli altri parametri critici sono i valori delle modalit`a video espressi con Mode o Modeline,
che se sbagliati di nuovo possono mandare il monitor fuori sincronia. Come accennato per`o
queste direttive non sono pi`
u utilizzate, in quanto dalla versione 4 di XFree86 (e per X.org) i
valori corretti delle modalit`
a video vengono ricavati automaticamente dalla scheda grafica che
gi`a dispone di tutti i modi standard VESA, che vengono utilizzati sulle base alle informazioni
ottenute dal monitor o dalla risoluzione impostata dalla direttiva Modes nella sezione Screen.
Se per`o si dovesse effettuare una configurazione manuale pu`o essere di aiuto il programma
xvidtune. Questo `e un programma ad interfaccia grafica che deve essere lanciato a server X
avviato che rileva la modalit`
a video in uso e ne mostra i parametri su una finestra, consentendo
di modificarli. Una delle funzionalit`
a del programma `e proprio quella che consente, una volta
effettuate le modifiche ed aver verificato che funzionano,77 di stampare a video la riga da inserire
come parametro della direttiva Modeline.
74

una buona guida con tutti i dettagli di funzionamento ed il significato delle Modelines `e nel XFree86 Video
Timings HOWTO.
75
ormai capita raramente, ma se avete monitor particolari che non vengono riconosciuti automaticamente,
come un Apple Cinema Display, questa direttiva diventa fondamentale.
76
nel caso di Debian per poter utilizzare questi comandi occorrer`
a installare il pacchetto read-edid.
77
luso di valori sbagliati per una modalit`
a video pu`
o mandare fuori sincronia il monitor, con la spiacevole
conseguenza di non vedere pi`
u nulla, xvidtune comunque consente di provare le nuove impostazioni e riporta
automaticamente il server alla configurazione di partenza dopo pochi secondi, consentendo un recupero anche in
caso di errore.

3.3. LX WINDOW SYSTEM

161

Una volta definite le schede video ed i monitor presenti, questi vanno collegati fra loro oltre
che con il cavo tramite una apposita sezione Screen che identifica linsieme dei due, e definisce
le caratteristiche dello schermo che verr`a utilizzato dal server X. Il formato generale di questa
sezione `e il seguente:
Section "Screen"
Identifier "name"
Device
"device id"
Monitor
"monitor id"
direttive
...
SubSection "Display"
voci
...
EndSubSection
...
EndSection
di nuovo la direttiva Identifier serve a fornire una stringa che identifica lo schermo in questione,
ed `e obbligatoria come le due Device e Monitor che servono a specificare la scheda video ed il
monitor collegati allo schermo, che prendono come argomento lidentificatore utilizzato in una
delle sezioni omonime. Viene spesso utilizzata anche la direttiva DefaultDepth che indica la
profondit`
a di colore (in numero di bit) da utilizzare di default per lo schermo quando si hanno
pi`
u sottosezioni di tipo Display.
` inoltre obbligatoria la presenza di almeno una sottosezione Display che specifichi la proE
fondit`a di colore (tramite la direttiva Depth, obbligatoriamente presente) e lindicazione di una
(o pi`
u) modalit`
a video con la direttiva Modes, che prende un elenco di nomi (separati da spazi)
fra quelli predefiniti nello standard VESA o indicati da una precedente direttiva Mode o Modeline presente nella corrispondente sezione Monitor. Uno schermo infatti pu`o essere utilizzato a
diverse profondit`
a di colore, diverse risoluzioni e diverse frequenze di aggiornamento a seconda
delle caratteristiche della scheda video e del monitor, ed qualora si specifichino pi`
u modi, `e pure
possibile passare al volo dalluno allaltro una volta avviato il server con la combinazione di tasti
C-M-+ e C-M--.
Infine la sezione ServerLayout serve ad ottenere una configurazione completa collegando uno
o pi`
u schermi (definiti in altrettante sezioni Screen) con uno o pi`
u dispositivi di input (definiti
in altrettante sezioni InputDevice). Di nuovo ne deve essere presente almeno una, nella forma
generica:
Section "ServerLayout"
Identifier
"nome"
Screen
"screen id"
...
InputDevice "input device id"
...
opzioni
...
EndSection
di nuovo Identifier indica una stringa di identificazione, mentre Screen e InputDevice servono
a referenziare quali schermi e dispositivi di input inserire nel layout, usando lidentificatore
specificato nelle omonime sezioni.

162

3.3.3

CAPITOLO 3. LA CONFIGURAZIONE DEI SERVIZI

Lavvio di una sessione di lavoro sotto X

Le modalit`a per attivare una sessione di lavoro usando linterfaccia grafica fornite da X Window
sono sostanzialmente due, quella che prevede lavvio del server X e di tutto lambiente grafico
da console, e quella che prevede il login direttamente dallambiente grafico, che in questo caso
viene attivato direttamente nella procedura di avvio (tramite gli opportuni script) insieme al
programma di gestione del login.
Il programma per avviare una sessione grafica a partire dalla console `e xinit, che si usa
soltanto quando non si pu`
o o non si vuole lanciare il server X nella fase di avvio del sistema, o
in ambienti in cui abbia la necessit`
a di utilizzare diverse versioni del server X.78 Dato che, come
illustrato in sez. 3.3.1, per luso dellinterfaccia grafica occorre disporre sia del server X che degli
opportuni programmi client che la realizzano, xinit ha la particolare caratteristica di suddivide
gli argomenti che gli vengono passati in due sezioni, separate dalla sequenza --.
La prima sezione `e quella che indica il programma da eseguire come client del server X ed i
rispettivi argomenti; essa deve iniziare con il nome del programma, che deve essere specificato con
un pathname esplicito in forma assoluta o relativa, deve cio`e essere nella forma /path/to/prog
o ./prog, altrimenti lintera sezione sar`
a considerata come costituita soltanto dagli argomenti
da passare al programma usato di default. In genere si usa come programma un opportuno
script di avvio sezione che lancia tutti i programmi necessari a realizzare la stessa.
La seconda sezione indica invece quale deve essere il programma da usare come server X, e
deve essere specificata in maniera analoga alla prima.79 In genere non la si usa quasi mai (per
cui la sequenza -- viene omessa e si passa ad init solo la prima sezione) se non per specificare
qualche argomento alternativo al server X.80
Una volta invocato xinit prima mette in esecuzione il server X, e poi esegue il programma
client specificato nella prima sezione, che a questo punto potr`a lanciare la sessione grafica.
Quando detto programma termina xinit si incarica di chiudere la sessione grafica terminando
anche il server X. Si tenga presente che questo avviene anche se nel frattempo ci sono altri
programmi che usano X che sono ancora attivi, lanciati per esempio dal client specificato nella
prima sezione.
Se non si specifica nulla sulla riga di comando allavvio della sessione xinit cercher`a nella
home dellutente il file .xinitrc e lo eseguir`a come se fosse uno script di shell,81 terminando la
sessione (e fermando il server X) solo alla conclusione dellesecuzione del contenuto di .xinitrc.
Questo consente di utilizzare .xinitrc per inizializzare il proprio ambiente grafico, chiamando
al suo interno tutti i programmi che si intendono lanciare. In assenza di uno .xinitrc creato
dellutente, xinit eseguir`
a il programma xterm.82
Se si utilizza questa funzionalit`
a occorre per`o considerare che i programmi eseguiti tramite
.xinitrc vengono avviati in sequenza: se si vuole che vengano eseguiti in maniera concorrente
occorrer`a lanciarli tutti in background83 eccetto lultimo.84 Per questo motivo in genere si lancia
sempre per ultimo un window manager o un session manager (vedi sez. 3.3.4).
78

ad esempio se, avendo pi`


u schede e pi`
u monitor, si volesse usare XFree86 per una scheda e X.org per laltra.
vale a dire che se non si usa al suo inizio un pathname esplicito la sezione viene considerata come costituita
esclusivamente dagli argomenti da passare al server.
80
in generale infatti non ci sono motivi per cambiare il default usato da xinit che `e lesecuzione del server X
con il comando X :0, dove :0 indica luso del primo display disponibile (torneremo sul concetto di display in
sez. 3.3.4).
81
non `e necessario che il file sia eseguibile, ne che inizi con #!/bin/sh, se esiste viene lanciato come programma
client nella forma sh ~/.xinitrc.
82
il programma xterm `e probabilmente il pi`
u semplice dei programmi ad interfaccia grafica, e si limita
semplicemente a riprodurre dentro una finestra un terminale del tutto analogo a quello che si trova sulla console.
83
altrimenti fino alla terminazione di uno di essi non partir`
a il successivo.
84
altrimenti lesecuzione di .xinitrc proseguirebbe, con la conclusione dello script, e la conseguente
terminazione della sessione.
79

3.3. LX WINDOW SYSTEM

163

Normalmente xinit non viene mai eseguito direttamente, e per avviare una sessione grafica
da console si usa invece startx. Questultimo non `e altro che uno script di shell che esegue
xinit fornendogli dei default opportuni, integrandosi con le impostazioni scelte dalla propria
distribuzione in modo da utilizzare gli eventuali window manager o session manager che sono
stati predisposti come default.
Il comando si esegue in genere senza argomenti; se presente utilizza anchesso il file .xinitrc,
ma se questo `e assente viene eseguita una inizializzazione di default, identica per tutto il sistema,
sulla base del contenuto del file /etc/X11/xinit/xinitrc.85 Oltre al comportamento standard
si possono passare degli argomenti sulla riga di comando anche a startx, con lo stesso formato
illustrato in precedenza per xinit, nel qual caso si avr`a anche lo stesso comportamento di
questultimo; ad esempio per lanciare dalla console una sessione in cui si usi soltanto un terminale
si potr`a usare:
startx /usr/bin/xterm -title "Terminale di prova" -geometry 80x25
Infine, essendo il server X un programma come gli altri, si tenga presente che se ne possono
sempre lanciare pi`
u istanze. In tal caso `e possibile distinguere a quale istanza fare riferimento
in base al cosiddetto numero di display (tratteremo i dettagli di questa caratteristica allinizio
di sez. 3.3.4). Allavvio del server di norma viene sempre utilizzato il primo numero di display
disponibile, cio`e zero. Sia xinit che startx consentono di lanciare ulteriori istanze del server
X, ma in tal caso occorre specificare un numero di display diverso, che andr`a passato come
argomento aggiuntivo. In tal caso si tratta di specificare solo questo come argomento aggiuntivo
dopo la sequenza --, ed il valore di display indicato andr`a a soprassedere quello di default.
Cos` se si vuole lanciare una seconda istanza del server X che utilizzi il display 1 si dovr`a eseguire
il comando:
startx -- :1
La seconda modalit`
a di avvio del server X `e quella eseguita tramite un login manager grafico.86 Questultimo `e semplicemente un programma che lancia il server e poi si incarica di
mostrare allutente una finestra di login (grafica) su cui questo pu`o autenticarsi per entrare nel
sistema ed eseguire una sessione. Un vero login manager deve per`o essere in grado di fare anche
qualcosa di pi`
u, e gestire cio`e la stessa procedura di autenticazione e di avvio di una sessione
pure da remoto, sfruttando la trasparenza sulla rete del protocollo X11, attraverso il supporto
di un apposito protocollo, lXDMCP (X Display Manager Control Protocol ).
Questa funzionalit`
a consente di presentare anche su macchine remote, che a questo punto
assumeranno il compito di fare da semplici terminali per la sessione, la stessa finestra di login.
In questo modo `e possibile centralizzare le applicazioni grafiche su un unico server su cui esse
saranno eseguite, ed riutilizzare macchine dotate anche di scarse risorse hardware, che non
sarebbero in grado di sopportare il carico di tutta linterfaccia grafica, solo per il disegno delle
finestre attraverso linstallazione del solo X server.
Nella distribuzione classica di X Window, quella distribuita con limplementazione di riferimento dellX-server, il programma che implementa il login manager `e xdm. Il programma ha
una interfaccia molto spartana, ma `e ampiamente configurabile in quanto il suo comportamento
viene governato da una serie di script di shell e dallimpostazione delle opportune risorse (le
risorse di X Window sono trattate in sez. 3.3.4); questo ne complica la configurazione in quanto
i vari aspetti del suo funzionamento sono controllati tramite molteplici file.
85
il risultato dipende da quello che `e stato impostato dalla vostra distribuzione come sessione grafica di default;
nel caso di Debian detto file fa a sua volta riferimento a quanto indicato in /etc/X11/Xsession.
86
perche questo avvenga ovviamente dovr`
a essere opportunamente configurata la procedura di avvio (vedi
sez. 5.3.5) per avviare automaticamente detto programma.

164

CAPITOLO 3. LA CONFIGURAZIONE DEI SERVIZI

Il file di configurazione principale di xdm `e /etc/X11/xdm/xdm-config,87 dove vengono indicati i vari script e gli ulteriori file che servono a controllare il programma. Il file usa il formato
delle risorse di X Window (che tratteremo in sez. 3.3.4), un estratto del suo contenuto, tratto
dalla versione installata su una Debian Etch, `e il seguente:
DisplayManager.errorLogFile:
/var/log/xdm.log
DisplayManager.pidFile:
/var/run/xdm.pid
DisplayManager.keyFile:
/etc/X11/xdm/xdm-keys
DisplayManager.servers:
/etc/X11/xdm/Xservers
DisplayManager.accessFile:
/etc/X11/xdm/Xaccess
DisplayManager.authDir: /var/lib/xdm
DisplayManager*resources:
/etc/X11/xdm/Xresources
DisplayManager.willing:
su nobody -c /etc/X11/xdm/Xwilling
...

Le versioni di xdm usate su Linux onorano inoltre anche una serie di opzioni che consentono di
controllare alcune caratteristiche dellavvio e della terminazione del servizio, da indicare tramite
lulteriore file /etc/X11/xdm/xdm.options.88 Questo file ha un formato molto semplice, in cui
viene specificata una opzione per riga (al solito le righe vuote e quelle che iniziano per #
vengono ignorate); i valori possibili sono riportati nella pagina di manuale (accessibile con man
xdm.options), e possono essere specificati o direttamente, se si vuole abilitare lopzione, o con
il prefisso no- se la si vuole disabilitare, un esempio del contenuto di questo file (ripreso da
una Debian Etch) `e il seguente:
no-ignore-nologin
no-restart-on-upgrade
no-start-on-install
use-sessreg

Come tutti i Display Manager xdm prevede le modalit`a di funzionamento locale e remoto.
Nel primo caso vengono utilizzate le istanze del server X specificate nel file Xservers,89 dove una
per riga vengono indicate le istanze da far partire e le relative opzioni; un esempio del contenuto
di questo file (al solito preso da una Debian Etch) `e il seguente:
:0 local /usr/bin/X :0 vt7 -dpi 100 -nolisten tcp

in questo caso si `e richiesto ad xdm di lanciare una istanza locale del server X (referenziato
dal relativo pathname) sul display 0, da associare alla settima console virtuale,90 utilizzando le
opzioni specificate di seguito.
La modalit`
a di funzionamento remoto viene invece controllata dal file Xaccess, dove si
possono specificare sia lelenco dei server per i quali fornire una sessione remota, sia le modalit`a
in cui lo stesso xdm si pone in ascolto per consentire ad altri una sessione remota usando il server
locale. Il formato del file `e descritto in dettaglio nella sezione XDMCP ACCESS CONTROL
della pagina di manuale di xdm.
Le risorse che controllano le varie componenti di xdm sono invece impostate dal contenuto del
file Xresources; `e qui che si possono impostare le propriet`a della finestra di login (associate alla
87

si pu`
o comunque usare un file di configurazione alternativo con lopzione -config.
tecnicamente questo file, pi`
u che dal programma xdm in quanto tale, viene utilizzato dai vari script ad esso
associati nella pacchettizzazione, con cui se ne controllano avvio e terminazione.
89
qui e nel prosieguo facciamo riferimento ai file cos` come specificati nellesempio di xdm-config riportato in
precedenza, questi sono i file standard, posti tutti sotto /etc/X11/xdm/, che possono ovviamente essere modificati
intervenendo su xdm-config o utilizzando le relative opzioni in fase di invocazione di xdm (per i dettagli si consulti
la pagina di manuale con man xdm).
90
da una sessione grafica sotto X ci si pu`
o portare su una console testuale con la combinazione di tasti C-M-Fn
(con n corrispondente alla relativa console), con lindicazione vt7 si indica di associare alla settima console
virtuale il passaggio alla sessione grafica stessa, qualora si creino pi`
u istanze di X si potranno associare ad altre
console virtuali, cos` da passare dalluna allaltra con analoghe combinazioni di tasti.
88

3.3. LX WINDOW SYSTEM

165

risorsa xlogin), quelle del programma di selezione delle sessioni remote (associate alla risorsa
Chooser) e delle altre componenti che eventualmente si sono eseguite (come la console di X,
il cursore, ecc.). Per una descrizione dettagliata si faccia riferimento al solito alla pagina di
manuale.
Inoltre `e possibile utilizzare lo script Xsetup (le versioni meno recenti usavano Xsetup_0) per
eseguire operazioni di impostazione preliminare prima che venga mostrata la finestra di login; in
questo modo si pu`
o ad esempio modificare lapparenza dello schermo, impostare colori o lanciare
altri programmi da far comparire insieme alla finestra di login, come un orologio o il programma
per visualizzare i messaggi della console.
Una volta terminata con successo la procedura di autenticazione di un utente,91 xdm esegue
lo script Xstartup per inizializzare la sessione, e se questo ha successo il successivo Xsession,
che tipicamente usa il file .xsession nella home directory dellutente come analogo di .xinit
per lanciare la sessione grafica dellutente; se questo non esiste viene lanciata una sessione di
default utilizzando /etc/X11/Xsession.
I file .xinit e .xsession hanno lo stesso scopo e significato, tanto che in Debian la configurazione di default fa s` che sia usato questultimo anche quando si lancia lambiente grafico da
console con startx; entrambi contengono cio`e i programmi da lanciare per gestire la sessione
grafica. Come nel caso di startx quando il programma che gestisce la sessione termina, xdm
esegue un reset dellX-server con lo script Xreset e ripresenta la schermata di login iniziale.
Benche si sia trattato pi`
u in dettaglio xdm, dato il suo legame diretto con il sistema di
X Window, nelle distribuzioni GNU/Linux recenti i login manager pi`
u utilizzati sono altri, e
principalmente GDM (lo Gnome Display Manager ) che fa parte del desktop Gnome e KDM (il
KDE Display Manager ) che fa parte del desktop KDE. Entrambi offrono una grafica molto pi`
u
accattivante di xdm ed un sistema di configurazione molto pi`
u avanzato (e semplice da usare).
Infatti benche entrambi non necessitino della presenza dei rispettivi ambienti desktop e possano essere usati indipendentemente, vengono solitamente installati in corrispondenza a questi.
Il grande vantaggio di entrambi `e che, pur essendo controllati da un file di configurazione testuale, `e possibile controllarli e modificarne alcune impostazioni con un apposito programma
ad interfaccia grafica, che permette di attivare e controllare le loro funzionalit`a senza dover
modificare a mano i file di configurazione.
Nel caso di GDM a partire dalla versione 2.22 il programma `e stato riscritto e suddiviso in
due parti, il demone gdm vero e proprio che lancia il server X ed esegue le operazioni di accesso
e di creazione della sessione di lavoro ed il greeter, che `e lapplicazione grafica che visualizza la
finestra di accesso (ed i relativi accessori) ed il cui compito `e sostanzialmente quello di autenticare
lutente prima dellaccesso e che viene configurata a parte con il sistema di gconf di Gnome.92
Il file di configurazione principale di GDM `e /etc/gdm/gdm.conf; il file ha il formato dei file
.ini di Windows, con la possibilit`
a di avere diverse sezioni introdotte ed identificate da un nome
racchiuso fra parentesi quadre e direttive di configurazione espresse in forma di assegnazione di
un valore al nome della stessa. A differenza dei file .ini di Windows, seguendo la tradizione
Unix, `e consentito anche luso del carattere # oltre al ; come introduzione ad una riga di
commento. Il file prevede una serie di sezioni, le principali delle quali sono elencate in tab. 3.8.
91

in tutte le distribuzioni moderne xdm supporta pienamente PAM (vedi sez. 4.3.7), e non sono previste
particolari configurazioni da eseguire al riguardo.
92
vale a dire con una specie di riedizione del registro di Windows, che per quanto sia stata realizzata in maniera
pi`
u sana, facendo ricorso a file di testo in XML, rende comunque quasi obbligatorio il ricorso ad un apposito
programma (ad esempio gconf-editor) per modificare le chiavi di configurazione onde evitare di perdersi in una
marea di tag.
93
scelta da evitare nella maniera pi`
u assoluta, visto che sono in genere disponibili numerose alternative per
lanciare programmi ad interfaccia grafica con privilegi di amministratore senza dover far girare un intero ambiente
desktop, non pensato a questo scopo, per conto dello stesso.

166

CAPITOLO 3. LA CONFIGURAZIONE DEI SERVIZI


Nome
[daemon]

[security]

[xdmcp]

Significato
contiene le direttive di controllo generali del demone gdm, come i nomi
di file directory e comandi utilizzati, utente e gruppo per conto del quale
eseguire i programmi come il greeter, ecc. In genere `e vuota mantenendo
tutti i valori ai rispettivi default.
contiene le opzioni per la gestione della sicurezza, in genere si imposta
AllowRoot=true per consentire allamministratore di eseguire il login
grafico.93
contiene la direttive per gestire il login grafico da remoto con il protocollo XDMCP, se lo si vuole abilitare occorre impostare la direttiva
enable=true, le altre direttive non vengono in genere usate essendo
ragionevoli i valori di default.
Tabella 3.8: Nomi delle principali sezioni di gdm.conf.

Insieme a gdm.conf il programma utilizza anche una serie di altri file e directory (riportati in
tab. 3.9) posti sempre in /etc/gdm,94 che consentono una personalizzazione molto dettagliata di
tutta la procedura di accesso. In particolare le directory della prima parte di tab. 3.9 consentono
di far eseguire a gdm uno specifico script per ciascuna delle varie fasi di gestione della sessione,
secondo quanto illustrato nella tabella stessa.95
Tutti gli script presenti in queste directory seguono uno stesso schema di nomi, che consente
di eseguire script diversi a seconda del display su cui `e stato lanciato il server X. Infatti se gdm
trova uno script corrispondente al numero di display questo verr`a eseguito nel relativo punto
della sequenza, altrimenti verr`
a eseguito, se presente, lo script Default.96
Nome
Init/

PostLogin/

PreSession/
PostSession/
modules/
locale.alias
Xsession
XKeepsCrashing

Significato
contiene gli script da eseguire immediatamente dopo lavvio del server
X, e prima del lancio del greeter, in genere vengono usati per lanciare
programmi che si vogliono eseguire durante la schermata di accesso o
per effettuare eventuali inizializzazioni prima della stessa.
contiene gli script da eseguire immediatamente dopo lautenticazione
dellutente, prima che venga eseguita qualunque operazione di inizializzazione della sessione, usati ad esempio per impostare propriet`
a della
stessa, come la home dellutente.
contiene gli script da eseguire immediatamente prima dellavvio della
sessione finale, in genere per mantenere informazioni di contabilit`
a.
contiene gli script da eseguire alla chiusura di una sessione di lavoro.
contiene le configurazioni usate dai moduli che forniscono il supporto
per le funzionalit`
a di accessibilit`
a (vedi sez. ??).
file contenente la lista delle localizzazioni disponibili (vedi sez. 3.1.4).
`e lo script utilizzato per avviare la sessione, e viene eseguito dopo gli
script della directory PreSession/ per conto dellutente.
script eseguito quando lavvio del server X fallisce, in genere usato per
invocare il programma di configurazione del server X.
Tabella 3.9: I file in /etc/gdm che controllano gdm.

Come avvenuto per Gnome anche lambiente grafico KDE ha sviluppato un suo Display
Manager, kdm, che fornisce funzionalit`
a simili. In questo caso la configurazione viene mantenuta
nella sottodirectory kdm delle configurazioni di KDE,97 ed il file di configurazione principale `e
94

`e comunque possibile avviare il demone con opportune opzioni a riga di comando richiedendo luso un altro
file di configurazione o di una directory diversa da /etc/gdm.
95
si tenga presente gli script in questione, anche quelli relativi alla sessione, vengono eseguiti con privilegi
amministrativi e non per conto dellutente, il cui nome viene passato nella variabile di ambiente USER.
96
un caso particolare resta il contenuto della directory Init, che viene utilizzato anche per effettuare login
remoti con XDMCP, attivati dalla presenza dello script Init/XDMCP.
97
vale a dire, a seconda della versione di KDE usata, /etc/kde3/kdm o /etc/kde4/kdm.

3.3. LX WINDOW SYSTEM

167

kdmrc, che di nuovo usa il formato dei file .ini di Windows con le stesse estensioni riguardo
alluso dei commenti usate anche da GDM.
Oltre alle direttive delle tre sezioni generali, riportate in tab. 3.10, kdmrc pu`o contenere configurazioni specifiche da eseguire per ciascuna istanza del server X che viene lanciata
(associate al relativo display) da mettere in altrettante sezioni dedicate nella forma [X-*Core] e [X-*-Greeter], dove al posto dellasterisco deve essere indicato il nome del display
(come indicato in sez. 3.3.4) ed della classe di risorse da configurare; per una trattazione
completa della sintassi si rimanda alla lettura della documentazione ufficiale consultabile su
http://docs.kde.org/stable/en/kdebase-workspace/kdm/index.html.
Nome
[General]
[Xdmcp]
[Shutdown]

Significato
contiene le direttive di controllo generali del demone kdm.
contiene le direttive di controllo per fornire il login grafico da remoto
con il protocollo XDMCP.
contiene le direttive relative ai programmi da usare per gestire il riavvio
ed il fermo macchina da kdm.
Tabella 3.10: Nomi delle principali sezioni di kdmrc.

Oltre al file kdmrc nella directory di configurazione vengono mantenuti una serie di altro
file; ad esempio per lanciare il demone viene usato dallo script di avvio il file kdm.option,
con lo stesso significato e formato dellanalogo di XDM. Inoltre nella stessa directory vengono
mantenuti gli script Xsetup, Xstartup, Xsession, ecc. anchessi con lo stesso significato degli
analoghi di XDM.98

3.3.4

Luso di X Window dal lato client

Come accennato in sez. 3.3.1 qualunque programma che usi linterfaccia grafica tramite le Xlib
lo fa agendo come client per un server X che poi si incaricher`a di disegnare sullo schermo da lui
gestito gli elementi grafici indicati dallapplicazione. Per il client si pone allora il problema di
come sapere a quale istanza di server X deve fare riferimento.
Per risolvere questo problema ogni server X `e identificato tramite quello che viene chiamato
il suo display name. Considerando che il protocollo X11 `e nato per essere usato anche via
rete, il server X a cui il client deve rivolgersi potrebbe anche essere remoto; per questo motivo
il display name viene espresso nella sua forma pi`
u generica con un identificativo del tipo:
nomehost:Nd.Ns
dove nomehost `e il nome della eventuale macchina remota, che pu`o essere espresso sia con
un indirizzo IP che con un nome a dominio,99 mentre Nd `e un numero intero, detto display
number, che corrisponde allistanza del server lanciata.100 Dato che il server X supporta anche
la possibilit`
a di utilizzare in contemporanea pi`
u schermi (facendo riferimento alla stessa tastiera
e allo stesso mouse), si pu`
o anche scegliere uno schermo specifico con il numero Ns, detto screen
number.
Sia Nd che Ns sono numeri che, salvo indicazioni contrarie, vengono allocati dinamicamente
per grandezza crescente a partire da zero. Se non si specifica il numero di schermo si suppone
che ce ne sia uno solo. Se invece non si specifica il nome della macchina si intende dire che il
server X `e attivo in locale, e verr`
a utilizzata la modalit`a pi`
u efficiente per comunicare con lui.101
98

in particolare Xsetup viene lanciato dopo lavvio del server X prima di far partire il greeter per operare sulla
finestra di accesso, Xstartup quando lutente si `e autenticato prima lanciare la sessione per predisporre la sessione,
mentre Xsession viene usato per avviare la sessione.
99
tratteremo in dettaglio questi argomenti, qui dati per scontati, in sez. 7.
100
quello da passare nellesempio di avvio del server X, che abbiamo illustrato in sez. 3.3.3.
101
in genere si tratta di utilizzare un opportuno socket locale, senza usare la rete.

168

CAPITOLO 3. LA CONFIGURAZIONE DEI SERVIZI

Il valore del display name viene mantenuto nella forma appena illustrata (senza lindicazione
dellhostname, se si lavora in locale) in una apposita variabile di ambiente, DISPLAY, che `e quella
che viene usata dalle Xlib per identificare il server X con cui lapplicazione deve parlare. Molte
applicazioni accettano una opzione -display sulla riga di comando con cui si pu`o specificare un
display name alternativo, altrimenti viene usato il valore della variabile di ambiente DISPLAY.
Quando si avvia una sessione grafica locale `e cura della procedura di inizializzazione della sessione
definire in maniera automatica questa variabile, in modo da renderla disponibile per tutti i
programmi che si utilizzeranno al suo interno.102
Finora abbiamo parlato della capacit`
a del protocollo di poter essere utilizzato via rete, ma
nella configurazione di default di un server X questa capacit`a viene usualmente disabilitata.
Il protocollo X11 infatti di base supporta un meccanismo di sicurezza molto debole,103 con
una autenticazione del client basata sulluso di un cookie di sessione,104 ed una volta ottenuto
laccesso al server non esistono meccanismi di limitazione o controllo, e si pu`o compiere su di
esso qualunque operazione.105
Dato che il cookie di sessione pu`
o essere facilmente intercettato sulla rete e riutilizzato da
terzi per garantirsi un accesso completo al server X, `e buona norma di sicurezza utilizzare il
server soltanto in locale, a meno di non operare su reti chiuse e molto controllate (ad esempio
quelle di un aula). Questo significa ad esempio che su molte distribuzioni il server X viene
sempre lanciato con lopzione -nolisten tcp,106 opzione che deve essere rimossa se si vuole
poter utilizzare il server via rete. Una volta messo in esecuzione il server in ascolto sulla rete,107
occorre poi consentire laccesso al server X da parte dei client. Un client infatti per poter parlare
con il server deve presentargli il cookie di sessione, ma questo `e presente solo sul server; `e pertanto
necessario fornire questa informazione ai client sulla macchina remota.108
Per fare questo esiste un apposito programma, xauth, che permette di estrarre il cookie
della sessione locale (eseguendolo sul server) e reimportarlo in quella remota (eseguendolo sul
client).109 Dato che il procedimento richiede comunque il trasferimento dei dati via rete, e non
garantisce un livello di sicurezza significativo, in genere si preferisce utilizzare un meccanismo di
accesso ancora pi`
u elementare (e meno sicuro), che si basa solo sulla provenienza delle connessioni
al server da una determinata macchina. Anche in questo caso laccesso deve essere abilitato in
maniera esplicita; per questo viene utilizzato lapposito comando xhost, che indica al server X
quali sono le macchine da cui accettare connessioni via rete senza richiedere nessun cookie di
sessione.
Il comando prende come argomento il nome (o lindirizzo di rete) della macchina a cui si
vuole consentire laccesso, preceduto opzionalmente dal carattere + per indicare che esso sar`a
aggiunto alla lista delle macchine consentite, mentre se vi si appone il carattere - il nome
verr`a tolto dalla lista. Si pu`
o consentire laccesso o rimuoverlo in maniera generica utilizzando
102

qualora essa non sia impostata qualunque client fallir`


a con errore del tipo: Cant open display.
c`e la possibilit`
a di utilizzare meccanismi pi`
u complessi, come cookie cifrati con chiavi DES condivise o
appoggiarsi a Kerberos (per i dettagli si consulti la pagina di manuale accessibile con man Xsecurity), ma questo
complica notevolmente la configurazione e perci`
o normalmente non viene usato.
104
questultimo viene mantenuto nel file .Xauthority nella home dellutente, o nel file indicato dalla variabile
di ambiente XAUTHORITY, il cookie, ed il contenuto del relativo file e della variabile di ambiente, vengono creati
allavvio della sessione grafica.
105
questo significa ad esempio che si pu`
o creare una finestra trasparente che copre tutto lo schermo e farle
intercettare tutti i dati in ingresso (comprese eventuali password immesse su una emulazione di terminale).
106
lo si pu`
o verificare nel file /etc/X11/xinit/xinitrc, che controlla lavvio del server da console.
107
il protocollo X11 utilizza per la comunicazione via rete le porte TCP (porte e protocolli di rete sono trattati in
sez. 7.2) a partire dalla 6000, ne viene utilizzata una per ciascun display attivo, il cui valore si ottiene sommando
a 6000 il numero di display.
108
i client usano di default il file .Xauthority, che essendo in questo caso nella macchina remota non conterr`
a
un cookie di sessione valido.
109
per i dettagli sul comando ed un esempio di come usarlo si consulti la rispettiva pagina di manuale.
103

3.3. LX WINDOW SYSTEM

169

i suddetti caratteri senza farli seguire da nessun nome. Se infine si esegue il comando senza
specificare nulla verr`
a stampata la lista delle macchine autorizzate.
Pertanto la modalit`
a con cui si pu`o utilizzare la trasparenza sulla rete del protocollo X11 per
ottenere linvio delle finestre da una macchina remota alla propria `e quella in cui si definisce sulla
macchina remota su cui gira il client un opportuno valore per la variabile DISPLAY che indichi la
propria macchina come destinazione (ad esempio con qualcosa del tipo DISPLAY=serverhost:0)
mentre su questultima si dovr`
a consentire laccesso da parte dei client sulla macchina remota,
eseguendo un comando del tipo xhost +clienthost.
Unaltra funzionalit`
a di X Window `e quella di fornire un meccanismo generico per impostare
le preferenze relative allambiente grafico di ciascuna applicazione, tramite quelle che vengono
chiamate risorse. Il vantaggio di questa funzionalit`a sta nel fatto i valori di queste risorse vengono
mantenuti sul server, in un database interno, evitando cos` di doverle specificare separatamente
` possibile inoltre, quando si vogliono
per ciascun client a seconda di quale server ci si rivolge. E
personalizzare le preferenze relative alle singole applicazioni grafiche, caricare direttamente sul
server valori diversi, senza dover con questo andare a modificare le impostazioni sui client.
Il valore di una risorsa `e sempre specificato tramite una stringa; le risorse poi possono a loro
volta contenere altre risorse, il che comporta una organizzazione strutturata su una gerarchia ad
albero110 in cui ogni nodo `e identificato dal nome della risorsa, i singoli nodi sono separati dal
carattere . e che ha come radice il nome del programma a cui la risorsa fa riferimento spesso
scritto con la prima lettera maiuscola. Esistono inoltre tutta una serie di risorse generiche, come
quelle relative ai colori di sfondo, i caratteri, ecc. che possono venire applicate ai singoli elementi
grafici di un programma, consentendo cos` una configurabilit`a estremamente dettagliata.
In genere per le risorse di ciascuna applicazione vengono mantenute delle impostazioni generali in un file a questo dedicato, che in fase di installazione viene posto in una directory comune111
con il nome stesso della risorsa; i singoli utenti per`o possono cambiare a piacere questi valori
tramite luso del file .Xresources nella propria home directory, nel quale specificare i valori che
allavvio del server andranno a soprassedere quelli di default. Se poi si vogliono cambiare gli
stessi valori una volta avviato il server si pu`o usare il comando xrdb che prende come argomento
il file in cui sono stati scritti i nuovi valori che saranno caricati immediatamente. Un esempio di
un file di configurazione delle risorse pu`o essere il seguente:
...
emacs*Background: DarkSlateGray
emacs*Foreground: Wheat
emacs*pointerColor: LightSteelBlue
emacs*cursorColor: LightSteelBlue
emacs*bitmapIcon: on
!emacs*font: fixed
emacs*font: -misc-fixed-*-*-*-*-15-*-75-75-*-*-iso8859-*
emacs.geometry: 80x28
emacs*BorderColor: DarkSlateGray
emacs*fringe.Background: DarkSlateGray
...

in cui si modificano le impostazioni delleditor emacs relative ai colori di sfondo e primo piano,
si specifica la geometria iniziale ecc. Si noti come la sintassi preveda una riga in cui si specifica
il nome della risorsa terminato da :, cui segue la stringa che assegna il valore. Si noti anche
110
le risorse si chiamano cos` in quanto corrispondono effettivamente a delle strutture dati che a loro volta
possono contenere altre strutture dati, i campi di una di queste strutture identificano cio`e un possibile valore o
una ulteriore risorsa; ciascuna programma definisce quali strutture vuole utilizzare per il controllo del suo aspetto
grafico (il colore delle finestre, dello sfondo, il titolo della finestra, ecc.); il valore viene associato ad un campo
della risorsa stessa con un certo nome, per cui viene naturale accedere allinsieme di strutture e sottostrutture
attraverso una gerarchia ad albero.
111
di default veniva usata la directory /usr/X11R6/lib/X11/app-defaults/, ma con X.org 7.0 la gerarchia
separata per i file di X `e stata rimossa e la suddetta directory `e divenuta /usr/lib/X11/app-defaults/.

170

CAPITOLO 3. LA CONFIGURAZIONE DEI SERVIZI

come il nome della risorsa possa contenere il carattere jolly * che assume lo stesso significato
che avrebbe se si specificasse un pathname.112 Infine si tenga presente che il carattere ! serve
ad introdurre una riga di commento.
Se le risorse permettono di controllare i vari parametri interni relativi allaspetto grafico
delle singole applicazioni, quello che contraddistingue linterfaccia grafica `e la capacit`a di poter
eseguire vari programmi in contemporanea, ciascuno nella sua finestra. Come per`o ci si potr`a
rendere conto lanciando una sessione X con un singolo programma (come nellesempio di startx
visto in sez. 3.3.3), gli X-client si limitano solo a disegnare il contenuto interno alle rispettive
finestre. Il posizionamento delle stesse, il loro spostamento, il passaggio dalluna allaltra, ecc.
devono essere invece gestiti a parte e farlo non `e compito dei singoli programmi. Per questo per
poter usare davvero uninterfaccia grafica `e necessario avere almeno un altro programma che
esegua questi compiti specifici: quello che viene chiamato un window manager, e che assume
un po quello che `e il ruolo della shell nella riga di comando (lanciare altri comandi e passare
dalluno allaltro).
Senza un window manager infatti si avrebbe la grafica ma non la possibilit`a di spostare,
` il window manager che
nascondere, ridimensionare le finestre, o di passare dalluna allaltra. E
si cura di tutti questi compiti: del disegno degli elementi grafici di contorno, della gestione dello
spostamento attraverso luso del mouse, del ridimensionamento e della selezione delle finestre.
Un compito fondamentale infatti, quando si hanno pi`
u finestre da gestire, `e appunto quello della
selezione di quella che viene messa a fuoco, quella cio`e cui verranno inviati tutti gli eventi in
ingresso (ad esempio quello che si scrive sulla tastiera), che `e un po lequivalente del processo
in foreground visto in sez. 2.1.2.
Per usare con profitto una sessione grafica tutto quello che serve `e un window manager,
molti di questi infatti gestiscono anche la presenza di un menu o di una barra direttamente
sullo schermo (o eventuali altri elementi di contorno), usando i quali `e possibile lanciare altre
applicazioni o avere informazioni sul sistema. I pi`
u comuni, tuttora in ampio uso da parte di
coloro che sono abituati alla loro interfaccia e non necessitano di funzionalit`a pi`
u avanzate, sono
Window Maker, ICEwm, fvwm, blackbox, ecc.
Le interfacce grafiche moderne vanno per`o al di l`a della semplice gestione delle finestre; per
definire una infrastruttura che consenta operazioni come il cosiddetto drag and drop, in cui si
possono passare elementi o dati da una finestra ad un altra (e cio`e da una applicazione ad un
altra). Per fare questo un window manager non basta, il passo successivo `e allora quello delluso
di un desktop environment, cio`e di una infrastruttura (completa di meccanismi di intercomunicazione) che definisca non solo la gestione delle finestre, ma tutto un insieme di elementi (come
oggetti grafici comuni e meccanismi di intercomunicazione) che porta appunto ad un ambiente
grafico integrato, analogo a quello che si trova su altri sistemi operativi come MacOS o Windows.

3.4

Il sistema di stampa

Tratteremo in questa sezione la configurazione delle stampanti sotto GNU/Linux; dopo una introduzione generale sulla gestione generica della stampa vedremo in particolare la configurazione
secondo il sistema tradizionale del Line Printing Daemon di BSD e la nuova architettura del
Common Unix Printing System.

3.4.1

Introduzione generale

Mantenendo la filosofia progettuale di Unix per cui tutto `e un file, `e facile immaginarsi che la
prima e pi`
u immediata modalit`
a di stampa sia quella di inviare il file da stampare direttamente
112

cio`e applica il valore a tutte le risorse che corrispondono alla stringa in cui nella gerarchia lasterisco `e sostituito
da un nome qualunque.

3.4. IL SISTEMA DI STAMPA

171

al dispositivo associato alla stampante. Questo `e senzaltro possibile, ma si scontra con una
serie di problemi che lo rendono altamente sconsigliabile; il primo `e che non esiste un dispositivo
univoco che identifichi una stampante, questa pu`o essere infatti agganciata ai dispositivi pi`
u vari
(e molte stampanti ne supportano pi`
u di uno), come la parallela, la seriale, una porta USB, ecc.
In ciascuno di questi casi il file andrebbe inviato sul relativo dispositivo (ad esempio nel caso di
stampante su porta parallela, a /dev/lp0).
Tutto questo non costituirebbe di per se un grosso problema, basterebbe identificare il dispositivo specifico ma indicarlo usando ad un link simbolico con un nome generico che vi faccia
riferimento. Il problema pi`
u importante `e invece quello relativo al contenuto del file da stampare; un tempo quando si stampavano solo file di testo senza formattazioni il problema non cera,
oggi per`o si stampano file con contenuti grafici e con formattazioni complesse e font diversi.
Per questo in genere le stampanti moderne prevedono un loro linguaggio di stampa come il
PostScript (alcune ne supportano anche pi`
u di uno), che permette di ottenere i risultati voluti.
Questo significa che anche un semplice file di testo debba essere opportunamente trattato prima
di essere inviato alla stampante. Inoltre se, come accade spesso, i programmi generano le stampe
in un formato (principalmente il PostScript) e la stampante non lo capisce, questo dovr`a essere
opportunamente tradotto.
Il terzo problema `e quello di essere in presenza di un sistema operativo multiutente e multitasking; il che comporta che con laccesso diretto si possono avere pi`
u processi che scrivono
in contemporanea sul dispositivo della stampante, coi relativi dati che si mescolano fra di loro
dando luogo risultati tuttaltro che piacevoli nella stampa finale.
Per questa serie di motivi in genere il dispositivo della stampante non `e mai accessibile
direttamente ai singoli utenti, ma viene gestito attraverso un opportuno sistema di stampa
che si incarica di risolvere questi problemi. In generale quello che succede `e che laccesso alla
stampante `e regolato attraverso un opportuno demone, che `e lunico che ci scrive, le stampe
vengono richieste inviando i file da stampare al suddetto demone, che si incarica di eseguire
tutte le operazioni necessarie (comprese le eventuali conversioni di formato) e di garantire un
accesso corretto senza sovrapposizioni.
Una delle caratteristiche fondamentali dei sistemi di stampa in ambiente unix-like `e quella
delle code, le stampe cio`e non vengono mai eseguite direttamente, ma immesse, tramite un
opportuno comando, su una coda di stampa dalla quale poi verranno prelevate (in genere dal
demone di cui sopra) ed opportunamente inviate sulla stampante secondo lo schema illustrato
in fig. 3.2.

Figura 3.2: Schema generico del funzionamento del sistema di stampa.

Il vantaggio di questo sistema `e che la gestione della coda pu`o essere eseguita indipendentemente dalla gestione della stampante, ad esempio diventa possibile inviare la stampa su una

172

CAPITOLO 3. LA CONFIGURAZIONE DEI SERVIZI

coda remota se `e previsto un opportuno meccanismo di comunicazione. Lo stesso concetto di


stampa remota pu`
o essere realizzato in maniera alternativa usando una coda locale ed usando
direttamente il demone di stampa per inviare i file ad un altro demone remoto.
Inoltre con lo schema di fig. 3.2 nelleseguire linvio dei file dalla coda di stampa alla stampante il demone di stampa pu`
o eseguire tutte le operazioni necessarie (realizzate in genere attraverso
quelli che si chiamano filtri di stampa) per convertire il contenuto del file da stampare in uno
formato che la stampante `e in grado di comprendere.
Infine luso di questa architettura permette anche di utilizzare pi`
u code di stampa per la
stessa stampante; questo consente ad esempio di utilizzare code diverse (con filtri diversi) a
seconda del tipo di file che si vuole stampare, o con diversi privilegi o priorit`a.

3.4.2

Il Common Unix Printing System

Benche continuino ad esistere altri programmi per la gestione del sistema di stampa (torneremo
sulla compatibilit`
a con il vecchio sistema di BSD in sez. 3.4.4) oggi questa viene effettuata quasi
esclusivamente tramite CUPS (acronimo di Common Unix Printing System).
A differenza dei programmi usati nelle prime versioni di Unix, nati in un periodo in cui
le stampanti erano sempre collegate fisicamente alle singole macchine e venivano utilizzate per
lo pi`
u solo localmente, CUPS `e stato creato nellera di Internet, con stampanti che possono
operare direttamente sulla rete, e per questo fornisce anche tutta linterfaccia di gestione via
rete, tramite apposito servizio con cui si comunica usando una variante protocollo HTTP su una
porta dedicata (il default `e la 631).113 Rispetto al protocollo HTTP ordinario un server CUPS
prevede per`o una comunicazione con caratteristiche specifiche, che sono state standardizzate
nellRFC 3239 in cui `e definito il protocollo IPP (acronimo di Internet Printing Protocol ).
Luso di un protocollo di rete che `e basato su HTTP ha il grande vantaggio che con CUPS
buona parte dellamministrazione del sistema di stampa, come la creazione il controllo e la
rimozione di stampe e code di stampa o la configurazione delle stampanti, pu`o essere eseguita
direttamente tramite un browser qualunque, che baster`a puntare sulla porta 631 della macchina
da amministrare. Questa resta la modalit`
a principale di utilizzo del sistema, anche se `e possibile
usare degli opportuni comandi di shell per eseguire gli stessi compiti.
Il servizio `e fornito da un demone, cupsd, controllato da un file di configurazione, cupsd.conf, che di norma viene installato in /etc/cups.114 Questo file configura il servizio nel suo
insieme, dato che come accennato la gestione di stampanti, code e stampe avviene attraverso
linterfaccia che il servizio stesso mette a disposizione. Il formato del file `e simile a quello del
file di configurazione di Apache;115 la maggior parte sono una serie di direttive elementari nella
forma:
NomeDirettiva valore
dove il nome della direttiva `e composto da normali caratteri, e il valore viene specificato di
seguito separato da uno spazio; al solito righe vuote o inizianti per un # vengono ignorate.
Con la direttiva Port si pu`
o specificare la porta116 su cui il servizio si pone in ascolto (il
default `e la 631), mentre con Listen si pu`o indicare esplicitamene un indirizzo IP117 o anche un
socket locale. Inoltre una delle caratteristiche pi`
u interessanti di CUPS per`o `e la sua capacit`a
di riconoscere automaticamente le stampanti presenti su una rete, con il cosiddetto browsing.
113

per i concetti relativi a porte, reti e protocolli, qui dati per scontati, si rimanda alla trattazione del capitolo

7.
114

nel caso di Debian inoltre viene utilizzata anche la directory /etc/cups/cups.d/, dove vengono inserite, in
singoli file separati, alcune configurazioni specifiche rilette poi dal file principale tramite la direttiva Include.
115
il server web pi`
u diffuso, trattato nella seconda parte delle dispense.
116
torneremo su questo ed altri concetti relativi alla reti in sez. 7.2.4.
117
vedi di nuovo 7.2.2.

3.4. IL SISTEMA DI STAMPA

173

Questa funzionalit`
a `e attivata di default (ma pu`o essere disattivata impostando ad off la
direttiva Browsing) e pu`
o essere controllata con la direttiva BrowseAddress per indicare lin118
dirizzo di broadcast
cui inviare le richieste di riconoscimento. Normalmente tutte le richieste
vengono accettate, ma con le direttive BrowseAllow e BrowseDeny si possono indicare quali sono
le macchine (o le reti) le cui richieste vengono accettate o rifiutate.
Direttiva
AccessLog
BrowseAddress
BrowseAllow
BrowseDeny
Browsing
DataDir
DefaultCharset
DocumentRoot
ErrorLog
Group
Include
Listen
LogLevel
PageLog
Port
Printcap

ServerRoot
SystemGroup
TempDir
User
MaxCopies
MaxJobs
MaxJobsPerUser

Significato
il file su cui vengono registrati gli accessi; richiede come valore il nome del file o la
parola chiave syslog che invia le informazioni allomonimo servizio.
indirizzo di broadcast cui inviare le richieste di riconoscimento.
indirizzo o rete da cui accettare le richieste di riconoscimento.
indirizzo o rete da cui non accettare le richieste di riconoscimento.
abilita o disabilita il riconoscimento automatico delle stampanti presenti (prende i
valori on o off).
la directory dove sono mantenuti i dati di CUPS.
il set di caratteri di default.
la directory radice per i documenti HTTP (come la documentazione) che vengono
messi a disposizione attraverso linterfaccia.
il file su cui vengono registrati gli errori; richiede come valore il nome del file o la
parola chiave syslog che invia le informazioni allomonimo servizio.
gruppo per conto del quale viene eseguito cupsd (di default lpadmin).
permette di includere un altro file nella configurazione.
consente di specificare completamente lindirizzo IP su cui il server si pone in ascolto
nella forma address:port (o /path/name in caso di socket locale).
livello dei messaggi da parte del demone.
il file su cui vengono registrati i dati sulle pagine stampate; richiede come valore il
nome del file o la parola chiave syslog che invia le informazioni allomonimo servizio.
specifica la porta su cui si pone in ascolto il demone cupsd (il default `e 631).
specifica su quale file riprodurre un file printcap che faccia da sostituto per
/etc/printcap per i programmi che necessitano di questultimo per riconoscere le
code di stampa.
specifica la directory radice per il demone cupsd, di default `e /etc/cups.
specifica il gruppo (o i gruppi, se si indica un elenco separato da spazi) i cui utenti
avranno i privilegi amministrativi sul sistema (su Debian viene usato lpadmin).
la directory in cui inserire i file temporanei, in sostanza lo spool di stampa (di default
`e /var/spool/cups/tmp).
utente per conto del quale viene eseguito cupsd (di default lp).
numero massimo di copie che un utente pu`
o richiedere, il valore 0 significa nessun
limite, il default `e 100.
numero massimo di stampe in coda, il valore 0 significa nessun limite, il default `e 500.
numero massimo di stampe per utente, il default `e 0 e significa nessun limite.
Tabella 3.11: Principali direttive per il file /etc/cups/cupsd.conf.

In tab. 3.11 sono riportate le direttive di base pi`


u importanti di /etc/cups/cupsd.conf, per
lelenco completo con una descrizione sommaria si pu`o fare riferimento alla pagina di manuale;
inoltre in genere le distribuzioni installano una versione predefinita di questo file in cui tutte
le opzioni (anche quelle non attivate esplicitamente) sono abbondantemente commentate. Per
una documentazione completa invece si pu`o fare riferimento ai manuali on-line direttamente
accessibili attraverso linterfaccia del sistema (un altro dei vantaggi di avere un protocollo basato
su HTTP) o reperibili su http://www.cups.org/.
Oltre alle direttive appena illustrate, che usano la sintassi elementare in cui si esprime la
corrispondenza di un valore ad una parola chiave, il formato di cupsd.conf prevede la presenza
di direttive con una sintassi pi`
u complessa, che vengono chiamate contenitori (o container );
in particolare queste sono quelle usate per effettuare il controllo degli accessi allinterfaccia di
rete fornita da cupsd, con cui `e possibile gestire il controllo del sistema di stampa attraverso il
118

per il significato di broadcast vedi sez. 7.2.2.

174

CAPITOLO 3. LA CONFIGURAZIONE DEI SERVIZI

protocollo IPP. Queste direttive, che in genere vengono raggruppate in coda al file (ma possono
essere inserite in qualunque posizione), hanno una forma diversa, del tipo:
<Location /percorso>
DirettivaAccesso1 valore1
DirettivaAccesso2 valore2
...
</Location>
Una direttiva Location viene utilizzata per identificare quella che si chiama una collocazione;
laccesso alle varie funzionalit`
a del sistema di stampa via IPP viene infatti gerarchizzato in una
struttura ad albero analoga a quella dei file, ed espressa appunto con dei percorsi a partire da
una radice / avendo accesso alla quale si diventa in grado di compiere qualunque operazione.
Percorso
/
/admin
/classes
/classes/name
/jobs
/printers
/printers/name

Descrizione
accesso a tutte le operazioni.
accesso operazioni amministrative (creazione, cancellazione, impostazione e avvio delle stampanti e delle code).
accesso alle operazioni sulle classi.
accesso alle operazioni sulla classe name.
accesso alle operazioni sulle stampe.
accesso alle operazioni sulle stampanti.
accesso alle operazioni sulla stampante name.

Tabella 3.12: I percorsi per laccesso alla gestione delle operazioni definibili allinterno di una collocazione.

Specificando un percorso a partire da detta radice si possono definire le propriet`a di accesso


per insiemi sempre pi`
u ristretti di operazioni. I principali percorsi utilizzabili in una collocazione
sono illustrati in tab. 3.12; per lelenco completo si pu`o fare riferimento alla documentazione in
linea di CUPS.
Una volta che con la scelta di un percorso nella direttiva Location si `e definito a quale
classe di operazioni si vuole che siano applicate le regole di accesso, queste ultime devono essere specificate allinterno della collocazione stessa; questo viene fatto attraverso una serie di
ulteriori direttive, specifiche per lindicazione di regole di accesso, che hanno una sintassi identica alle direttive elementari viste in precedenza, ma che sono utilizzabili solo allinterno di una
collocazione.
Una collocazione prevede sempre la presenza di una direttiva Order (posta per chiarezza
come prima direttiva al suo interno), che definisce la politica di accesso: se laccesso `e consentito
per default si utilizza il valore Allow,Deny, mentre se `e vietato si utilizza il valore Deny,Allow.
Alla direttiva Order devono poi seguire successive direttive Allow o Deny per indicare le macchine
da cui vietare o consentire gli accessi, e direttive come AuthType e AuthClass per indicare le
eventuali modalit`
a di autenticazione. I valori utilizzabili per queste direttive sono riportati
in tab. 3.13, in cui sono illustrate le principali direttive di accesso, per una descrizione pi`
u
dettagliata di tutte le direttive e della relativa sintassi si pu`o fare nuovamente riferimento alla
documentazione di CUPS.
Un esempio del contenuto di /etc/cups/cupsd.conf, estratto (togliendo i commenti) dalla
versione installata con il pacchetto cupsys su una Debian Sarge, `e il seguente:
DefaultCharset notused
LogLevel info
Printcap /var/run/cups/printcap
Port 631
<Location />
119

si sono dati per noti i concetti relativi ad indirizzi IP e nomi a dominio, torneremo su di essi in dettaglio in
sez. 7.

3.4. IL SISTEMA DI STAMPA


Direttiva
Order

AuthClass

AuthType

Allow

Deny
Encryption

175

Significato
definisce la modalit`
a con cui vengono gestite le autorizzazioni con le direttive Deny e
Allow, prende come valori: Allow,Deny in cui si accettano tutte le richieste eccetto
quelle negate da un direttiva Deny e Deny,Allow in cui si accettano solo le richieste
consentite con una direttiva Allow.
definisce il livello di autenticazione richiesto, prende come valori: Anonymous che
disabilita lautenticazione, User che richiede utente e password, System che inoltre
richiede che lutente appartenga al gruppo sys (o a quello specificato con la direttiva
SystemGroup), Group che richiede che lutente appartenga al gruppo definito dalla
direttiva AuthGroupName.
definisce le modalit`
a di autenticazione, prende come valori: None che non effettua
nessuna autenticazione, Basic che effettua lautenticazione usando e credenziali standard della macchina, Digest e BasicDigest che utilizzano le credenziali specifiche
memorizzate in /etc/cups/passwd.md5.
consente laccesso, prende come valore un numero IP di una singola macchina o di una
rete (in notazione CIDR, vedi sez. 7.2.2) o un nome a dominio, consentendo notazioni
del tipo *.dominio.it o .dominio.it per indicare tutti le macchine in un dominio,
o la parola chiave All.119
nega laccesso, usa gli stessi valori appena descritti per Allow.
abilita la cifrature della connessione, prende come valori: Never, IfRequested e
Required, il cui significato `e autoesplicativo.
Tabella 3.13: Le direttive di accesso usate in una collocazione.

Order Deny,Allow
Deny From All
Allow From 127.0.0.1
</Location>
<Location /admin>
AuthType Basic
AuthClass System
Order Deny,Allow
Deny From All
Allow From 127.0.0.1
</Location>

In questo esempio gran parte delle opzioni sono lasciate al valore di default, e ci si limita
in sostanza a consentire laccesso allinterfaccia via rete solo in locale, richiedendo per lamministrazione unautenticazione basata sul corrispondente utente sulla macchina su cui si sta
operando.
Oltre alla configurazione lato server `e possibile specificare una configurazione generale sul
lato client (per tutti i programmi cio`e che si appoggiano a CUPS per la stampa), che viene
mantenuta a livello di sistema nel file /etc/cups/client.conf, e pu`o essere personalizzata dal
singolo utente in un file .cupsrc nella propria home directory.
In genere le direttive principali che si utilizzano in detti file sono ServerName che prende come
valore il nome della macchina cui rivolgersi come server di stampa e Encryption che prende gli
stessi valori della omonima vista in tab. 3.13 per il server, che indica la modalit`a con cui eseguire
una eventuale cifratura della connessione.

3.4.3

I comandi di gestione per CUPS

Come accennato anche se la gran parte della gestione e della configurazione del sistema di stampa
viene gestita attraverso linterfaccia web fornita da CUPS `e comunque possibile utilizzare anche
una serie di comandi di shell; il primo di questi `e lpadmin, che `e quello che si pu`o utilizzare per
definire le propriet`
a generali delle stampanti presenti nel sistema. Il concetto di base `e quello

176

CAPITOLO 3. LA CONFIGURAZIONE DEI SERVIZI

di definire delle stampanti logiche,120 cui fare sempre riferimento con lopzione -p seguita dal
nome. In pratica tutte le invocazioni di lpadmin richiedono luso di questa opzione, tranne il
caso in cui si usi al suo posto -x che richiede la cancellazione di una stampante logica.
Per creare una stampante logica oltre ad identificarla con -p occorrer`a anche definire con
quale dispositivo vi si accede, cosa che si fa attraverso lopzione -v; questa prende come argomento quello che la documentazione chiama un device-URI, cio`e una stringa nella forma di un
indirizzo simile a quello di un sito web, che indica con quale modalit`a `e possibile raggiungere
la stampante stessa (se sulla porta parallela, seriale, USB, o via rete secondo vari protocolli di
comunicazione), un breve elenco di possibili valori `e riportato in tab. 3.14.
Nome
ipp://remote.printer.ip
smb://remote.printer.ip
lpd://remote.printer.ip
parallel:/dev/lp0
usb:/dev/lp0
serial:/dev/ttyS0

Descrizione
stampante di rete raggiungibile con protocollo IPP.
stampante di rete windows raggiungibile tramite Samba.
stampante di rete raggiungibile con protocollo LPD.
stampante locale sulla porta parallela.
stampante locale su porta USB.
stampante locale su porta seriale.

Tabella 3.14: Le diverse possibili specificazioni per gli indirizzi del dispositivo associato ad una stampante
(device-URI ).

Oltre a definire come si pu`


o parlare con la stampante `e necessario anche specificare quale
linguaggio usare, questo si fa con lopzione -P che associa alla stampante logica il relativo file
PPD (PostScript Printer Description) che ne descrive le capacit`a; questo `e un po lequivalente
del filtro di stampa, in quanto serve a definire quali sono le modalit`a con cui alla fine i file
vengono stampati.
Una delle caratteristiche pi`
u interessanti di CUPS `e quella di permettere di definire delle classi
di stampanti, in sostanza una classe definisce un gruppo di stampanti che pu`o essere trattato
come un insieme, cos` che indicando di stampare su quella classe la stampa viene effettuata su
una delle stampanti che ne fanno parte. La definizione delle classi viene fatta tramite le opzioni
-c e -r di lpadmin che permettono rispettivamente di inserire o eliminare una stampante dalla
classe passata come argomento; se una classe non esiste viene creata allinserimento della prima
stampante, se si elimina lultima stampante la classe viene cancellata.
Opzione
-p stampante
-x stampante
-d stampante
-c classe
-r classe
-v URI
-P file.ppd
-E
-h host

Descrizione
indica la stampante logica su cui si sta operando.
rimuove una stampante logica.
imposta la stampante come stampante di default.
inserisce in una classe una stampante logica.
rimuove una stampante logica da una classe.
indica il dispositivo da usare per parlare con la stampante
(secondo il formato illustrato in tab. 3.14).
definisce il file di descrizione della stampante da
utilizzare.
abilita una stampante logica rendendola disponibile per
la stampa.
indica la macchina remota su far operare il comando.

Tabella 3.15: Principali opzioni del comando lpadmin.

Le principali opzioni del comando sono riportate in tab. 3.15; al solito si pu`o fare riferimento
alla pagina di manuale o alla documentazione di CUPS per un elenco completo e per la descrizione
dettagliata.
120

le si chiamano cos` in quanto si possono associare pi`


u stampanti logiche ad una stessa stampante fisica, una
stampante logica ha una rozza equivalenza alla coda di stampa vista per LPD.

3.4. IL SISTEMA DI STAMPA

177

Una volta definita una stampante logica questa pu`o essere abilitata o disabilitata alla stampa
rispettivamente con i comandi enable e disable che prendono come argomento il nome della
stessa; il comando reject inoltre supporta lopzione -c che permette di rimuovere tutte le
stampe pendenti, e -r che prende come argomento una stringa in cui le motivazioni per cui la
stampante `e stata disabilitata (che sar`a riportata dai comandi diagnostici).
Si tenga presente comunque che abilitare o disabilitare una stampante logica significa sostanzialmente abilitare o disabilitare lesecuzione delle stampe su di essa, e che questa `e una
operazione diversa rispetto a quella di accettare o rifiutare limmissione di nuove stampe sulla
relativa coda; questa seconda operazione viene fatta invece con i comandi accept e reject, che
di nuovo richiedono come argomento il nome della stampante; come per disable anche reject
supporta lopzione -r con lo stesso significato.
Il comando per richiedere una stampa `e invece lp,121 che prende come argomento il file da
stampare, e lo invia sulla stampante di default, riportando a video un identificatore associato
alla stampa in maniera analoga a lpr. In questo caso per indicare la stampante da usare si
usa lopzione -d che prende come parametro il nome della stampante o della classe, mentre se
si vuole stampare su una macchina remota specifica occorre specificarla come parametro per
lopzione -h.
Opzione
-E
-d
-h
-i
-n
-q
-H

-P

Descrizione
forza una comunicazione cifrata col server.
specifica la stampante o la classe da usare.
specifica la macchina remota cui inviare la stampa.
specifica la stampa su cui operare.
specifica il numero di copie da stampare.
specifica una priorit`
a.
specifica quando eseguire una stampa: hold la blocca indefinitamente, un tempo in formato HH:MM la blocca ad
allora, resume la avvia immediatamente e restart riesegue una stampa completata (gli ultimi due valori richiedono luso di -i per identificare la stampa cui si fa
riferimento).
specifica quali pagine stampare (passati come lista
separate da virgole o intervalli separati da -).

Tabella 3.16: Principali opzioni del comando lp.

Altre due opzioni utili sono -n, che permette di specificare il numero di copie da stampare e
-q, che permette di impostare una priorit`a (un numero da 1 a 100, con valore di default pari a
50). Le opzioni principali sono riportate in tab. 3.16, per lelenco completo ed i dettagli si pu`
o
fare riferimento alla pagina di manuale.
Per cancellare una stampa si pu`
o invece usare il comando cancel, che prende come argomento
lidentificatore della stampa, o, se specificato con lopzione -a, una stampante o una classe, nel
qual caso saranno cancellate tutte le stampe presenti su di essa. Il comando supporta anche
lopzione -h con lo stesso significato di lp; al solito per i dettagli si faccia riferimento alla pagina
di manuale.
Infine per ottenere informazioni riguardo il sistema di stampa ci sono due comandi. Il primo
`e lpinfo che permette di vedere i dispositivi fisici ed i supporti per le stampanti disponibili
allinterno di CUPS; il comando richiede una delle opzioni -v o -m per stampare rispettivamente
la lista dei dispositivi utilizzabili e quella delle stampanti supportate. Ad esempio se si vuole
ottenere una lista dei dispositivi visibili da riutilizzare con lopzione -v di lpadmin si pu`o eseguire
il comando:
121

anche se CUPS supporta un sistema di compatibilit`


a allindietro con LPD che consente luso di lpr, con la
stessa sintassi vista in sez. 3.4.4.

178

CAPITOLO 3. LA CONFIGURAZIONE DEI SERVIZI


hain:~# lpinfo -v
network http
network ipp
network lpd
direct parallel:/dev/lp0
direct usb:/dev/usb/lp0
...
direct usb:/dev/usb/lp15
network smb

Il secondo comando `e lpstat, che riporta le informazioni relative alle singole stampanti,
classi e stampe attive. Il comando usa le opzioni -E e -h con lo stesso significato visto in
tab. 3.16. Lopzione -c richiede la stampa delle informazioni relative ad una classe (o a tutte se
non si specifica quale classe), lopzione -a riporta lo stato di una coda (e delle eventuali stampe
in attesa), mentre lopzione -p riporta lo stato di una stampante; entrambe richiedono il nome
di una stampante logica da interrogare, e riportano lo stato di tutte quelle definite se questa non
viene specificata. Ulteriori dettagli sul comando e lelenco completo delle opzioni si trovano al
solito sulla pagina di manuale.

3.4.4

Il sistema di stampa in stile BSD

Benche oggi non sia praticamente pi`


u usato, fino a qualche anno fa, prima dellavvento di CUPS,
il sistema di stampa pi`
u diffuso in ambiente Unix era quello sviluppato per BSD, e tuttora
` presente un porting anche per GNU/Linux,122
distribuito insieme a questo sistema operativo. E
ma il suo funzionamento `e stato a lungo difettoso ed il numero di stampanti supportate `e limitato.
Per questo esso veniva in genere sostituito da una reimplementazione alternativa sviluppata
indipendentemente, LPRng, che pur mantenendo la stessa interfaccia e le stesse funzionalit`a,
supportava diverse estensioni e molte pi`
u stampanti.123
Oggi nessuna delle due varianti viene pi`
u utilizzata gestire le stampanti, essendo entrambe
nettamente inferiori, sia in termini di funzionalit`a che di stampanti utilizzabili, a CUPS. Esiste
per`o, per supportare i programmi che ancora fanno riferimento alla vecchia interfaccia, un layer di
compatibilit`a fornito dallo stesso CUPS,124 che consente di implementare la vecchia interfaccia,
standardizzata nel protocollo LPD (acronimo di Line Printer Daemon), definito nellRFC 1179.
Il cuore del sistema di stampa in stile BSD `e costituito dal demone di stampa lpd (da cui
deriva il nome del protocollo) che si incarica sia della gestione delle code che dellinvio dei dati
alle stampanti. Il protocollo LPD prevede inoltre che il demone possa essere contattato anche
via rete (da un altro demone o direttamente da un client) per eseguire la stampa in remoto. Nel
caso di CUPS il demone viene sostituito da un apposito programma di emulazione, cups-lpd.125
Oltre a lpd il sistema di stampa in stile BSD prevede poi una serie di programmi usati per
limmissione delle stampe nelle code e per la gestione di queste ultime; anche questi sono stati
rimpiazzati da opportuni sostituiti dal funzionamento identico, forniti dal layer di emulazione di
CUPS, e sono questi quelli che tratteremo.
Per richiedere la stampa di un file si deve utilizzare il comando lpr, che prende come argomenti i file da stampare (se non si specifica nulla viene usato lo standard input). Una volta
messa in coda una serie di stampe il comando riporta sullo standard output un numero identificativo per ciascuna di esse che potr`
a essere usato con gli altri comandi per fare riferimento alle
stesse.126
122

nel caso di Debian si pu`


o installare con il pacchetto lpr.
sempre nel caso di Debian questa `e fornita dal pacchetto lprng.
124
nel caso di Debian questo viene fornito dal pacchetto cups-bsd (o cupsys-bsd per le versioni pi`
u vecchie).
125
il programma deve essere utilizzato in abbinamento ad un super-server come inetd o xinetd (vedi sez. 8.1.2
e sez. 8.1.3.)
126
le stampe sono spesso chiamate, seguendo la nomenclatura inglese, job, in particolare i comandi fanno
riferimento a questi identificativi come ai job ID e riportano il numero di stampe correnti come numero di job.
123

3.4. IL SISTEMA DI STAMPA


Opzione
-P
-h
-#
-C
-J
-m
-U

179

Significato
indica la coda, da passare come parametro, su cui stampare.
inibisce la stampa di una pagina di intestazione.
specifica il numero di copie da stampare, da passare come argomento.
specifica la priorit`
a della stampa, identificata da una lettera maiuscola
da A (pi`
u bassa) a Z (pi`
u alta), da passare come parametro.
associa alla stampa il nome passato come parametro, in modo che
questo venga stampato nellintestazione (quando questa `e prevista).
richiede linvio di una email allindirizzo passato come parametro
qualora la stampa fallisca.
permette di specificare (come parametro) lutente per conto del quale
eseguire la stampa (utilizzabile solo dallamministratore).
Tabella 3.17: Le principali opzioni del comando lpr.

Lopzione principale di lpr `e -P che permette di indicare su quale coda di stampa inviare
il file da stampare; se non la si specifica viene usato, se definito, il valore di una delle variabili
PRINTER, LPDEST, NPRINTER o NGPRINTER, oppure la stampante di default, che `e la prima definita
in /etc/printcap.127 Unaltra opzione utile `e -h che inibisce la stampa di eventuali pagine
iniziali per le code in cui questa `e prevista e -# che richiede la stampa di un certo numero di
copie; le altre opzioni principali sono riportate in tab. 3.17, per lelenco completo al solito si
faccia riferimento alla pagina di manuale.
Per la gestione delle stampe sono disponibili una serie di comandi per controllare lo stato
della coda ed eseguirvi sopra delle operazioni, il primo di questi `e lpq, che permette di esaminare
lo stato della coda. Se invocato senza argomenti esso stampa la lista delle stampe presenti, con
il formato:
parker:/root# lpq
Printer: rlp@parker Remote printer entry (dest epson@davis)
Queue: no printable jobs in queue
Server: no server active
Status: job root@parker+648 saved at 16:48:21.800
Rank
Owner/ID
Class Job Files
done
root@parker+648
A
648 /root/iptables
epson is ready and printing
root: active
[job 543 localhost]
/root/iptables
3072 bytes

Size Time
2748 16:48:21

altrimenti si pu`
o specificare come argomento il numero identificativo della stampa (quello riportato nella colonna Job) ed il comando riporter`a solo le informazioni ad essa relative.
Di default il comando esegue la ricerca delle stampe sulla coda di default, a meno di non
usare lopzione -P per selezionare una coda specifica. Si pu`o usare lopzione -a per fare eseguire
la ricerca su tutte le code; per le altre opzioni e per una descrizione dettagliata si pu`o fare
riferimento alla pagina di manuale.
Una volta creata una stampa, la si potr`a eliminare dalla coda con il comando lprm. Questo
prende come argomenti la lista delle stampe da rimuovere che possono essere indicate sia tramite
il loro identificativo (quello stampato da lpr o riportato da lpq), che tramite il nome dellutente
ad esse associato. Entrambe le forme supportano lutilizzo dei caratteri jolly del filename globbing
(vedi sez. 2.1.3). Luso della parola chiave all seleziona tutte le stampe presenti,128 mentre se
non si specifica nulla viene selezionata la prima che pu`o essere rimossa. Di nuovo il comando
127

questo `e il file che contiene la definizione delle stampanti nel sistema di BSD, con CUPS il file `e auto-generato,
e la prima riga corrisponde alla stampante usate.
128
questa `e una caratteristica della versione di lprm del pacchetto lpr-ng, il pacchetto originale del demone di
stampa di BSD non supporta questa opzione, al suo posto invece si deve usare semplicemente largomento -,
che seleziona tutte le stampe di un utente, o, se usato dallamministratore, del sistema.

180

CAPITOLO 3. LA CONFIGURAZIONE DEI SERVIZI

opera sulla coda di default a meno di non usare lopzione -P per specificarne unaltra o lopzione
-a per indicare di operare su tutte le code.
Luso di lprm serve a richiedere a lpd la cancellazione delle stampe selezionate, ma un utente
potr`a rimuovere solo quelle per i quali ha il permesso; con lopzione -U si pu`o richiedere, se si
`e lamministratore, di operare a nome di un altro utente. Per le altre opzioni ed i dettagli di
funzionamento del programma si faccia riferimento alla pagina di manuale.
Chiude la lista dei programmi ausiliari lpc, che serve per controllare lo stato del sistema di
stampa. Il programma prende come argomenti un comando seguito da eventuali parametri per
lo stesso. Come i precedenti esso opera sulla coda di default a meno di non usare lopzione -P
per specificarne unaltra o lopzione -a per indicarle tutte.
Se non si specificano argomenti il programma si porta su una linea di comando interna, da
cui questi possono essere specificati. Di questi nella versione installata da CUPS `e disponibile
soltanto un sottoinsieme limitato, ma la lista di tutti quelli disponibili si pu`o stampare con
help; con status invece si pu`
o ottenere la stampa dello stato della coda e relativa stampante
associata.

Capitolo 4

Amministrazione ordinaria del


sistema
4.1

Archiviazione e backup

Una delle attivit`


a fondamentali della amministrazione di un sistema `e quella dei backup. In
questa sezione, dopo una introduzione generale sugli scopi ed i criteri da usare per effettuare i
backup, prenderemo in esame i programmi per la gestione degli archivi di dati,1 per la gestione
dei backup e la duplicazione dei dati dei dispositivi. Tratteremo infine le modalit`a con cui si
possono eseguire i backup sia di file e directory che di interi filesystem.

4.1.1

Criteri generali per il backup

Quella dei backup `e probabilmente la pi`


u importante attivit`a di ogni sistemista. Nel mondo
dellinformatica i dati sono il principale prodotto del lavoro svolto, e la perdita degli stessi
significa spesso la perdita di grandi quantit`a di ore di lavoro. Per questo motivo occorre prendere
le opportune misure per assicurarsi contro questa evenienza, ed il backup `e la principale di
queste misure. Ci possono essere varie ragioni per cui si possono perdere dei dati, in generale
si tende a classificarle in quattro categorie diverse: disastri naturali, attivit`a umane, errori del
software e guasti dellhardware. Ciascuna di queste comporta rischi specifici e richiede opportune
contromisure.
Oggi lhardware tende ad essere sufficientemente affidabile, ci non di meno i guasti continuano ad esserci, e la sfortuna `e in agguato per farli avvenire nel peggior momento possibile. In
genere in questo caso i dispositivi pi`
u critici sono i dischi, che per quanto ben costruiti hanno una
loro fragilit`
a meccanica e sono comunque dispositivi basati sulla lettura di campi magnetici di
bassissima intensit`
a, per cui il rischio di malfunzionamento, per quanto ridotto, non `e trascurabile. Nel caso dei dischi una possibile assicurazione contro il malfunzionamento `e quello delluso
del RAID (vedi sez. 6.1), ma questo copre soltanto un caso particolare di guasti dellhardware e
non copre le altre ragioni (come la cancellazione accidentale) per cui sono necessari i backup.
Al contrario dellhardware laffidabilit`a del software non sembra subire particolari miglioramenti, ed un programma solido, affidabile e sicuro `e sempre un caso piuttosto raro, ed inoltre
laffidabilit`
a di un singolo programma `e relativamente inutile se un altro va a sovrascrivere per
errore i suoi dati. In questo la struttura di un sistema Unix, con la separazione dei privilegi,
e luso di utenti distinti pu`
o essere di aiuto, ma di nuovo non `e la soluzione al problema di
eventuali perdite di dati.
1

ci limiteremo ai programmi pi`


u elementari che si possono impiegare per eseguire i backup sulla macchina
stessa, per esigenze pi`
u complesse esistono programmi dedicati alla esecuzione di backup via rete di interi gruppi
di macchine, come Bacula, Amanda o BackupPC.

181

182

CAPITOLO 4. AMMINISTRAZIONE ORDINARIA DEL SISTEMA

Laffidabilit`
a delle persone `e sempre una variabile difficile da quantificare, sia in termini delle
competenze che riducano leventualit`
a di errori nelle operazioni (che per`o possono sempre accadere anche al pi`
u esperto degli amministratori) sia nella onest`a e correttezza della singola persona
rispetto al caso di eventuali azioni dolose che possono causare, direttamente o indirettamente,
la distruzione dei dati o il danneggiamento dei relativi supporti.
Per quanto riguarda i disastri naturali, ed altre eventualit`a remote completamente distruttive
di ogni tipo, occorre sempre valutare quanto la distruzione completa dei propri dati allinterno
di un evento catastrofico possa incidere in termini di perdite complessive e determinare se vale
la pena di prevedere delle contromisure specifiche per tali evenienze, che spesso comportano un
forte aggravio di costi sia in termini di attrezzature che di gestione.
Come accennato, mantenere dei backup `e la strategia pi`
u semplice ed efficace per proteggersi
dalle molteplici evenienze che possono causare la perdita di dati. Avere a disposizione copie
multiple dei propri dati rende meno critica la perdita di una di esse, ed il costo della perdita
si riduce semplicemente a quello del ripristino degli stessi dal backup, e non alla ricreazione da
zero degli stessi.
Perche questa strategia sia efficace occorre per`o che i backup siano effettuati in maniera appropriata; come ogni altra cosa del mondo reale infatti essi possono fallire ed al solito tenderanno
a farlo nel peggior modo e momento possibili, per cui potreste trovarvi senza disco e scoprire
che un nastro `e illeggibile, o che vi siete dimenticati di inserire nel backup alcune informazioni
essenziali, o che lunica unit`
a a nastro in grado di rileggere i vostri backup si `e rotta pure lei.
Per questo motivo nelleffettuare dei backup il primo punto `e quello di mettere a punto
una opportuna strategia. Ci sono infatti parecchie variabili da tenere sotto controllo, come la
quantit`a di dati che si vogliono mettere sotto controllo, la frequenza dei backup, il periodo che
si intende coprire con il backup, il mezzo utilizzato, le modalit`a di gestione degli stessi.
In genere un primo passo `e quello di definire cosa si intende inserire nel backup: ad esempio
non `e quasi mai strettamente indispensabile effettuare un backup dei programmi di sistema, se
non nel caso in cui una reinstallazione da zero non comporti un carico di lavoro eccessivo, mentre
pu`o essere importante salvare delle configurazioni ottenute come risultato finale di parecchie ore
di lavoro. Sono senzaltro da salvare tutti i dati di sistema, gli archivi della posta e di un
eventuale database e del web, e quantaltro non `e replicabile in maniera automatica, insieme
ai dati personali dei singoli utenti. Questo ad esempio vuol dire, nellambito di un sistema
GNU/Linux, che si devono salvare i contenuti delle directory /etc, /var e /home, mentre non `e
necessario salvare quelli di /usr.
Una volta determinata la dimensione totale dei dati che si vogliono archiviare, occorre stabilire anche il periodo di tempo che si intende coprire con i backup, e la frequenza con cui si
effettuano questi ultimi. Se infatti si avesse un sistema di backup contenente solo le informazioni
necessarie a ripristinare la situazione ad un certo istante, non si potrebbero recuperare eventuali
dati cancellati in precedenza. Nella pratica invece il caso pi`
u comune di recupero di dati da un
backup `e proprio quello di dati cancellati inavvertitamente, che, se assenti alla data dellultimo
backup disponibile, sarebbero irrimediabilmente perduti.
Questo comporta che deve essere determinata la frequenza con cui si vogliono effettuare i
backup, in modo da poter essere in grado di ricostruire la situazione dei propri dati ad istanti
diversi nel passato. La frequenza dei backup dipende ovviamente anche da quella con cui variano
i dati: in genere le configurazioni di sistema o un indirizzario variano senzaltro molto meno della
posta elettronica o dei dati di accesso a servizi web. Un altro fattore che incide sulla frequenza
`e il tempo che occorre a creare il backup, dato che se questo dovesse eccedere il periodo fra due
backup successivi si avrebbe una situazione in cui un backup non si completa prima dellinizio
del successivo, e non avrebbe senso usare una frequenza maggiore.
Infine la scelta del periodo da coprire con i backup dipende dalluso degli stessi, ad esempio
se servono solo a mantenere una copia di riserva che permetta il recupero di eventuali cancella-

4.1. ARCHIVIAZIONE E BACKUP

183

zioni accidentali passate inosservate, o se si vuole mantenere una storia completa per ragioni di
archiviazione. Ovviamente pi`
u lungo sar`a il periodo, pi`
u risorse dovranno essere utilizzate nella
manutenzione dei backup. Inoltre anche qualora non esistano esigenze di archiviazione, occorre
tenere presente che se una cancellazione accidentale `e rimasta inosservata per un periodo di
tempo superiore a quello di cui si mantiene il backup, questa non sar`a pi`
u recuperabile.
Unaltra decisione cruciale nella strategia di backup `e la scelta del supporto da utilizzare
per gli stessi. Le variabili in gioco sono il costo, laffidabilit`a, la velocit`a e lutilizzabilit`
a. Il
costo incide direttamente sulla quantit`a di dati che si possono salvare, per cui `e opportuno avere
un mezzo poco costoso. Laffidabilit`a invece `e fondamentale, dato che un backup inaffidabile
`e assolutamente inutile, ma laffidabilit`a dipende anche dal tipo di problema che ci si trova ad
affrontare: ad esempio i dischi sono affidabili, ma a lungo non sono stati considerati adatti come
mezzi di backup in quanto vincolati ad essere residenti nello stesso computer che contiene i dati
originali, che pu`
o andare distrutto, danneggiato o manomesso.
La velocit`
a `e senzaltro utile, ma diventa cruciale solo qualora un mezzo troppo lento rendesse
impossibile effettuare i backup con la frequenza necessaria. Lutilizzabilit`a viene spesso data per
scontata, ma occorre invece riflettere su quanto possa essere pericoloso avere uno splendido
sistema di backup perfettamente funzionante, che funziona per`o solo con una vecchia scheda
hardware fuori produzione.
Tenendo conto di tutte queste caratteristiche a lungo gli unici supporti considerati appropriati
per i backup erano i nastri magnetici. I CD o i DVD masterizzati infatti, benche funzionali e
relativamente poco costosi, hanno grossi problemi di stabilit`a nel lungo periodo,2 e sono quindi
inadatti per larchiviazione. La soluzione classica era allora quella di utilizzare unit`a a nastro
SCSI (vedi sez. 5.4.2). I nastri infatti hanno una ottima stabilit`a nel tempo,3 e consentono
di immagazzinare grandi quantit`
a di dati,4 e le interfacce SCSI han dimostrato di mantenersi
utilizzabili nellevoluzione della tecnologia; il solo difetto `e il costo piuttosto elevato.
Oggi per`
o, con la disponibilit`
a a basso costo di dischi rimuovibili su bus USB, le cose stanno
cambiando. Questi ultimi infatti si stanno affermando sempre di pi`
u come alternativa ai nastri,
rispetto ai quali presentano linnegabile vantaggio di un costo iniziale nettamente inferiore, non
essendo necessario per il loro funzionamento alcun dispositivo aggiuntivo. Lo svantaggio pu`
o
esserci in caso di necessit`
a di archiviazione di grandi quantit`a di dati, per i quali i nastri presentano una maggiore robustezza meccanica, e, su numeri elevati dei supporti da mantenere, un
costo inferiore.
Oltre alla scelta dei supporti una strategia di backup deve comunque anche prevedere la
definizione delle modalit`
a di conservazione degli stessi. Ad esempio pu`o non essere troppo
saggio tenere i propri supporti in un armadio nel corridoio, sotto una vecchia tubatura del
riscaldamento. Inoltre qualunque sia la modalit`a di stoccaggio utilizzata occorre anche prevedere
verifiche periodiche del funzionamento dei backup (effettuando dei ripristini di controllo), dato
che accorgersi che qualcosa `e andato storto nel momento del bisogno non `e molto simpatico.5
Una volta esaminati i principali rischi da cui ci si deve difendere, determinati quali dati si
intende proteggere e prese in considerazione le caratteristiche delle possibili risorse per eseguire
questa operazione si potr`
a iniziare a pianificare una strategia di backup. In genere si classificano
i backup in tre diverse categorie generali:
2

i supporti si deteriorano piuttosto rapidamente, e non danno garanzie gi`


a dopo pochi anni.
questo vale per i DLT ed i sistemi a nastro professionali, non altrettanto si pu`
o dire per i DAT, che hanno
grossi problemi di stabilit`
a.
4
con lespandersi della capacit`
a dei dischi questo oggi non `e pi`
u tanto vero, almeno in relazione alle dimensioni
medie dei dischi.
5
viene citato lesempio di un sistemista coscienzioso che aveva accuratamente pianificato tutta la sua strategia,
prevedendo anche lo stoccaggio dei nastri in un locale sicuro in una locazione remota, che si accorse la prima
volta che dovette recuperare dei dati che i suoi nastri erano stati rovinati dal campo magnetico generato dai fili
del riscaldamento del sedile della macchina su cui appoggiava i nastri quando li portava al sito di stoccaggio.
3

184

CAPITOLO 4. AMMINISTRAZIONE ORDINARIA DEL SISTEMA

backup completo (full backup)


si chiama cos` la realizzazione di una copia completa di tutti i dati che interessano,
eseguita ad un certo istante. Il vantaggio di disporre di un backup completo `e che
questo `e sufficiente da solo a garantire il ripristino dei dati al momento in cui `e stato
eseguito. Lo svantaggio `e che in genere lesecuzione di una copia completa di tutti i
dati richiede un tempo non trascurabile; inoltre per poter garantire la copertura con
il backup per un certo periodo di tempo occorre duplicare una grande quantit`a di dati
che per lo pi`
u saranno identici, utilizzando in maniera sostanzialmente inefficiente le
risorse su cui si salvano i dati.6
backup incrementale (incremental backup)
si chiama cos` la realizzazione di una copia di tutti i dati che sono stati modificati a
partire dallultimo backup eseguito (completo o incrementale che sia). In questo caso
cio`e non si ha una copia completa dei dati, ma solo di quello che `e cambiato rispetto
allultima esecuzione, per cui per poter eseguire un ripristino sar`a necessario non
soltanto avere lultimo backup incrementale eseguito, ma anche tutti quelli precedenti
fino allultimo backup completo disponibile. Il vantaggio dei backup incrementali `e che
permettono di limitare loccupazione di risorse ed i tempi di esecuzione dei backup,
mantenendo la capacit`
a di ricostruire la situazione ad un dato istante per un certo
periodo di tempo senza dover registrare tutte le volte linsieme completo dei dati.
Lo svantaggio `e che si complica la procedura di recupero dei dati, che necessiter`a
di un numero di passaggi crescente con il numero di backup incrementali coinvolti,
e si diminuisce laffidabilit`
a perche il fallimento di un backup incrementale render`a
inutilizzabili tutti quelli successivi basati su di esso.
backup differenziale (differential backup)
si chiama cos` la realizzazione di una copia di tutti i dati che sono stati modificati a
partire dallultimo backup completo. Un backup differenziale `e un compromesso fra un
backup completo ed un backup incrementale: non richiede di avere tutti i backup parziali precedenti dallultimo backup completo, ma solo questultimo. Pertanto si riduce
loccupazione delle risorse ed il tempo impiegato rispetto ad un backup completo, ma
in maniera inferiore rispetto a quanto si sarebbe ottenuto con un backup incrementale.
Rispetto a questultimo per`
o, non essendo necessari i backup differenziali precedenti,
ma solo lultimo backup completo, si ha il vantaggio di una maggior sicurezza e di una
procedura di ripristino pi`
u semplice.
In generale una strategia di backup si basa sulla opportuna combinazione di backup completi e
backup incrementali o differenziali. Si stabilisce una opportuna cadenza a cui eseguire dei backup
completi, e si copre il periodo di tempo dalluno allaltro con backup incrementali (o differenziali).
In un mondo ideale, con risorse infinite, la soluzione `e eseguire una sequenza continua di backup
completi mantenuti indefinitamente, cos` da avere il massimo della sicurezza.
Nel mondo reale per`
o ci si scontra con alcuni limiti, il primo dei quali `e il tempo necessario
alla esecuzione del backup: questo gi`
a pone un limite insormontabile alla frequenza dei backup
completi. Si tenga presente inoltre che in molti casi lesecuzione del backup richiede linterruzione
del servizio di cui si stanno salvando i dati,7 e non `e detto che si possa restare in questo stato
6

esistono in realt`
a soluzioni specifiche che consentono di mantenere comunque una copia unica degli stessi file,
posto che questi siano mantenuti su dei dischi, se si usano i nastri questo tipo di strategia non pu`
o essere invece
realizzata.
7
questo perche, specie con i database, se si copiano i dati a servizio attivo questi potrebbero essere in uno stato
inconsistente, a causa dellaccesso concorrente fatto dal programma che esegue il backup, che li legge, e da quello
che eroga il servizio, che li modifica.

4.1. ARCHIVIAZIONE E BACKUP

185

troppo a lungo. Questo `e il motivo per cui in genere le procedure di backup vengono eseguite a
notte fonda, onde diminuire al massimo gli eventuali disagi causati dal fermo dei servizi.8
Il secondo limite `e quello dello spazio disponibile per larchiviazione dei dati del backup, che
non `e mai infinito, ed in genere tende a finire assai prima di quanto si era previsto inizialmente.
Per questo motivo si ricorre quasi sempre a backup incrementali, che oltre a consentire una
esecuzione pi`
u veloce limitano la quantit`a di spazio occupato.
A titolo di esempio una strategia di backup comunemente utilizzata `e quella di effettuare
backup incrementali a frequenza giornaliera, intervallati da backup completi a cadenza settimanale, mantenendo uno storico mensile, ed eventualmente archiviando i backup mensili per un
periodo di tempo pi`
u o meno lungo a secondo delle esigenze di data retention che si possono
avere.
Si ricordi infine, ed `e opportuno sottolinearlo una seconda volta dato che questo aspetto viene
spesso sottovalutato, che una strategia di backup non pu`o definirsi tale se non prevede anche
in maniera esplicita, oltre alla esecuzione dei backup, una procedura per la verifica periodica
del loro ripristino, che assicuri leffettiva disponibilit`a dei dati in essi archiviati quando questi
dovranno essere recuperati.

4.1.2

I comandi tar e cpio

Il comando pi`
u usato per la gestione di archivi di file `e tar, chiamato cos` dallinglese Tape
ARchive dato che il comando `e nato proprio per archiviare i file su nastro magnetico. Al di l`
a
del suo uso per la creazione di archivi, tar `e anche il programma pi`
u diffuso per la distribuzione
di pacchetti di software dai sorgenti (come vedremo in sez. 4.2.1). La caratteristica del comando
`e che `e in grado di salvare su un singolo file di archivio (e ripristinare da esso) il contenuto e la
struttura di una o pi`
u directory, mantenendo invariate anche le caratteristiche specifiche di tutti
file (come permessi, proprietari, tempi, ecc.) in esse presenti.
Il comando tar supporta una grande variet`a di opzioni ed argomenti, e la versione GNU
`e stata dotata di una serie di ulteriori estensioni. In generale per`o si possono distinguere le
opzioni del comando in due classi principali: quelle che indicano delle operazioni e quelle che
specificano dei parametri. In ogni invocazione si pu`o specificare non pi`
u di una operazione,
mentre si possono avere un numero qualunque di parametri.

-c
-x
-t
-A
-d

Opzione
--create
--extract
--list
--concatenate
--diff

-u

--update

-r

--append
--delete
--compare
--get

Significato
crea un nuovo archivio.
estrae i file da un archivio.
elenca i file contenuti in un archivio.
aggiunge un archivio in coda ad un altro.
confronta i membri di un archivio con la controparte
sul filesystem e riporta ogni differenza in dimensioni,
permessi, proprietari e tempi.
aggiunge file in coda allarchivio, ma solo se sono pi`
u
recenti della versione gi`
a presente nellarchivio o non sono
presenti in esso.
aggiunge file in coda allarchivio.
cancella i file da un archivio (questo non pu`
o funzionare
sui nastri).
identica a --diff.
identica a --extract.

Tabella 4.1: Operazioni del comando tar.


8
per risolvere questo problema pu`
o essere di grande aiuto luso dei cosiddetti snapshot del filesystem, in cui
si genera una sorta di fotografia ad un certo istante dello stato dei propri file, accessibile in maniera opportuna
anche successivamente (ne vedremo un esempio in sez. 6.2); in questo caso si potr`
a fermare il servizio solo per il
tempo necessario a creare lo snapshot per poi eseguire il backup su di esso in tutta calma.

186

CAPITOLO 4. AMMINISTRAZIONE ORDINARIA DEL SISTEMA

Il comando prevede tre operazioni principali, -c per creare un archivio, -t per verificarne il
contenuto, e -x per estrarlo, ma le operazioni sono in totale otto, e sono illustrate in tab. 4.1 (sia
in forma breve che estesa). Si `e usata la sintassi delle opzioni nella forma prevista dal progetto
GNU, ma tar `e uno dei comandi storici di Unix, e ne esistono molte versioni. Per questo anche
la versione GNU, la sola che tratteremo, supporta varie sintassi, ed in particolare si pu`o sempre
fare a meno di utilizzare il - quando si specifica una opzione in forma breve.
Come accennato oltre alle operazioni tar supporta una enorme quantit`a di opzioni che
modificano il comportamento del programma. Di queste ne esistono due che sono di uso comune
e vengono utilizzate quasi sempre; la prima `e -v (o --verbose), che aumenta la prolissit`a del
comando, facendogli stampare a video durante lesecuzione molte pi`
u informazioni, ad esempio
in genere possibile aumentare ulteriormente la
la lista dei file inseriti o estratti dallarchivio. E
quantit`a di informazioni stampate inserendo la stessa opzione una seconda volta.
La seconda `e -f (o --file) che serve a specificare il nome del file da usare come archivio
da cui leggere o su cui scrivere. Il comando infatti, se non la si utilizza, usa come default
rispettivamente lo standard input e lo standard output, a meno che non sia stata definita la
variabile di ambiente TAPE, nel qual caso viene usato il dispositivo indicato in detta variabile,
che deve fare riferimento ad una unit`
a a nastro.9 Per evitare confusione `e pertanto opportuno
specificare sempre esplicitamente il nome dellarchivio con questa opzione.
Opzione
-v
-f
-z
-j
-O
-M
-G
-g list
-C dir

Significato
aumenta la prolissit`
a del comando facendogli stampare a video pi`
u
informazioni riguardo le operazioni correnti.
indica il file di archivio a cui fare riferimento con loperazione corrente.
comprime al volo larchivio utilizzando il programma gzip.
comprime al volo larchivio utilizzando il programma bzip2.
estrae i file sullo standard output.
opera su un archivio multivolume.
esegue il comando in modalit`
a incrementale (vecchio formato).
esegue il comando in modalit`
a incrementale nel nuovo formato,
appoggiandosi alla lista list .
esegue le operazioni sulla directory dir invece che su quella corrente.
Tabella 4.2: Principali opzioni generiche del comando tar.

Unaltra delle funzionalit`


a offerte da tar `e quella che consente, appoggiandosi ai comandi
trattati in sez. 2.2.4, di eseguire in maniera automatica la compressione (in creazione) e la decompressione (in estrazione) degli archivi. A tale scopo lopzione usata pi`
u comunemente `e -z
che effettua una compressione con gzip, ed `e invalso luso comune di utilizzare una ulteriore
estensione .gz al nome dellarchivio (che diventa qualcosa del tipo archivio.tar.gz) per identificare i file10 creati con questa opzione. Alternativamente si pu`o utilizzare lopzione -j,11 che
consente di utilizzare il programma bzip2 al posto di gzip.12
Come accennato per creare un archivio il comando necessita dellopzione --create o -c;
in questo caso dovr`
a anche essere specificato con -f il nome del file su cui saranno archiviati i
13
file, e se non si comprime di norma si utilizza lestensione .tar per identificare questi file. Date
queste due opzioni il comando prende come argomenti una lista dei singoli file da archiviare, se
9
come vedremo in sez. 5.4.2 in genere i nastri vengono utilizzati tramite linterfaccia SCSI, in tal caso valori possibili per TAPE sono /dev/st0 o /dev/nst0 (posto di avere un solo nastro) a seconda che si voglia il riavvolgimento
automatico o meno ogni volta che il file viene chiuso.
10
detti in gergo tarball .
11
si pu`
o anche specificare un programma di compressione qualunque con lopzione estesa --use-compressprogram seguita dal nome del programma da usare.
12
in questo caso per gli archivi si usa lulteriore estensione .bz2.
13
lopzione prende anche il valore - per indicare rispettivamente standard input e stardard output.

4.1. ARCHIVIAZIONE E BACKUP

187

per`o fra questi si inserisce una directory il comando archivier`a anche il contenuto di questultima,
e di tutte le directory sottostanti. Ad esempio si possono archiviare alcuni file con:
piccardi@anarres:~/truedoc/corso$ tar -cvf dispense.tar *.tex
advadmin.tex
appendici.tex
...
stradmin.tex
struttura.tex

e si noti come si sia usata anche lopzione -v per stampare la lista dei file archiviati; allo stesso
modo si potr`
a archiviare tutta una directory con:
piccardi@anarres:~/truedoc$ tar -cvf dispense.tar corso
corso/
corso/struttura.aux
corso/esercizi.txt
corso/struttura.tex
corso/shell.aux
corso/images/
corso/images/menuconfig1.png
corso/images/lvm_struct.eps
...
corso/corso.tex
corso/ringraziamenti.tex

e si noti come in questo caso vengano archiviate ricorsivamente anche tutte le directory sottostanti ed il relativo contenuto.
Si tenga presente che quando si crea un archivio con -c il file di destinazione viene sovrascritto, se si vuole invece aggiungere dei file ad un archivio preesistente occorre usare lopzione
-r. Inoltre, a meno di non specificare un pathname assoluto, il file viene creato nella directory corrente, questo significa anche che se questultima `e inclusa nellarchivio tar si trover`
a ad
affrontare il problema di come archiviare larchivio stesso. Il comando `e sufficientemente scaltro da accorgersi di questa situazione ed evitare di inserire nellarchivio che sta creando il file
dellarchivio stesso:
piccardi@anarres:~/truedoc$ tar -cf dispense.tar .
tar: ./dispense.tar: file is the archive; not dumped

Una ultima caratteristica di tar `e che qualora si utilizzino dei pathname assoluti per indicare
le directory o i file da archiviare, questi vengono sempre salvati con un pathname relativo in
cui la / viene eliminata, e si ricever`a un avviso al proposito. Questo avviene perche quando si
vanno ad estrarre i dati da un archivio tutti i file in esso contenuti vengono sempre ripristinati
a partire dalla directory corrente.14
Una volta creato un archivio se ne potr`a verificare il contenuto con -t o --list e di nuovo si
dovr`a utilizzare -f per indicare il file contenente larchivio, che in questo caso sar`a letto. Se non
si passano altri argomenti il risultato sar`a la stampa a video della lista di tutti i file contenuti
nellarchivio, anche senza la presenza dellopzione -v, specificando la quale si otterr`a invece una
lista in formato esteso, analogo a quella di ls -l. Si pu`o verificare la presenza di un singolo
file o di una lista passando come argomento il nome (o i nomi), si tenga presente per`o che in
questo caso deve essere specificato il nome completo del file cos` come `e stato archiviato (quello
stampato dallopzione -v in fase di creazione), il confronto infatti viene eseguito solo nei termini
della corrispondenza fra largomento ed il nome come questo viene visto nellarchiviazione.
Per estrarre i dati inseriti in un archivio si deve utilizzare lopzione --extract o -x, di
nuovo `e necessario specificare larchivio da cui si estraggono i file con -f. Come per la creazione
14

se ne pu`
o specificare una diversa con lopzione -C, ma lestrazione considera in ogni caso i pathname dei file
contenuti nellarchivio come relativi rispetto alla directory in cui essi verranno estratti.

188

CAPITOLO 4. AMMINISTRAZIONE ORDINARIA DEL SISTEMA

luso dellopzione -v permette di ottenere la lista dei file che vengono estratti dallarchivio.
Lestrazione avviene sempre nella directory corrente, e qualora si siano archiviate intere directory
ne viene ricreata lintera gerarchia. Se non si specifica nessun argomento il comando estrae il
contenuto completo dellarchivio, ma `e possibile estrarre un singolo file fornendone il nome (o
il pathname se questo `e collocato in una sottodirectory), che si pu`o ottenere dalla lista fornita
dallopzione -t.
Si tenga presente infine che nellestrazione il comando ricrea i file con tutte le caratteristiche
che essi avevano nel sistema su cui sono stati creati; questo significa anche che vengono mantenuti i permessi e lutente ed il gruppo proprietario del file, utente e gruppo che nel sistema corrente
possono non esistere o essere del tutto diversi.15 Di questo pu`o essere necessario dover tenere
conto quando si estraggono degli archivi creati da altri (come quelli dei pacchetti sorgenti di cui
parleremo in sez. 4.2). Inoltre dato che alcuni filesystem (come il vfat di Windows) non supportano la presenza di permessi, utenti e gruppi, il programma pu`o lamentarsi dellimpossibilit`a
di ricreare questi attributi dei file; un altro errore che viene segnalato, in caso di impostazione
sbagliata dellora di sistema, `e quando i file che vengono creati hanno dei tempi situati nel futuro.
Una delle capacit`
a pi`
u interessanti di tar `e quella di saper gestire backup incrementali con
luso dellopzione -g. In questo caso lopzione prende come parametro il nome di un file, detto
di snapshot, su cui tar si appoggia per determinare quali sono stati i file modificati dallultimo
backup.16 Alla prima esecuzione, quando il file non esiste, questo viene creato ed alle successive
esecuzioni sar`a possibile creare nuovi archivi contenenti solo i file modificati dopo lesecuzione del
backup a cui fa riferimento il file di snapshot. Ad ogni esecuzione con -g il file di snapshot viene
aggiornato con tutti i cambiamenti intercorsi, per cui sar`a possibile, utilizzando sempre lo stesso
` inoltre possibile, utilizzando una copia file di snapshot
file, eseguire backup incrementali. E
creato la prima volta nellesecuzione del backup completo, effettuare backup differenziali.
Un secondo comando usato storicamente nei sistemi unix-like per la gestione dellarchiviazione di file e directory `e cpio, che come tar permette di estrarre ed inserire file e directory
allinterno di un singolo file di archivio, per il quale `e anche in grado di usare lo stesso formato
usato da tar. A differenza di tar per`
o cpio prende sempre come argomento di ingresso una
lista di file.
Il comando cpio ha tre modalit`
a operative, che devono essere sempre indicate ad ogni invocazione del programma. In modalit`
a copy-out il comando copia i file dentro larchivio e per
attivarla deve essere specificata lopzione -o (o --create). Il programma legge una lista di
file dallo standard input e scrive larchivio risultante sullo standard output, ma `e uso comune
generare la lista direttamente con luso di find o ls. Si potranno cio`e replicare le operazioni di
archiviazione viste in precedenza con tar con qualcosa del tipo:
piccardi@anarres:~/truedoc/corso$ ls *.tex | cpio -ov > dispense.cpio
advadmin.tex
appendici.tex
...
stradmin.tex
struttura.tex
3974 blocks

mentre per archiviare tutta una directory si dovr`a eseguire:


piccardi@anarres:~/truedoc$ find corso -depth -print | cpio -ov > dispense.cpio
corso/struttura.aux
corso/esercizi.txt
15

utente e gruppo vengono mantenuti soltanto se larchivio viene estratto dallamministratore, gli utenti normali
infatti (vedi sez. 1.4.3) non possono creare file con proprietario diverso da se stessi e con gruppo diverso da quelli
a cui appartengono.
16
vengono utilizzate le date di ultima modifica per cui `e essenziale che il tempo di sistema (vedi sez. 2.4.3) non
sia stato modificato inopportunamente.

4.1. ARCHIVIAZIONE E BACKUP

189

corso/struttura.tex
corso/shell.aux
corso/images/menuconfig1.png
corso/images/lvm_struct.eps
...
corso/config.aux
corso/corso.tex
corso/ringraziamenti.tex
corso
80540 blocks

In modalit`
a copy-in il comando estrae i file contenuti in un archivio o ne elenca il contenuto; per attivare questa modalit`
a deve essere specificata lopzione -i o --extract. Larchivio
viene letto dallo standard input, se non si specifica nessuna opzione tutti i file vengono estratti,
altrimenti tutti gli argomenti che non sono opzioni vengono considerati come pattern secondo
la sintassi17 del filename globbing della shell (vedi sez. 2.1.3) e vengono estratti solo i file che
corrispondono. Si tenga presente che di default il comando non crea le directory, per cui se
si vuole estrarre il contenuto di un archivio che contiene un intero albero di directory occorre
utilizzare lopzione -d. Una invocazione tipica in questa modalit`a `e pertanto qualcosa del tipo:
cpio -idv < dispense.cpio
In modalit`
a copy-pass il comando copia dei file da una directory ad un altra, combinando
in sostanza le due modalit`
a copy-in e copy-out in un unico passo senza creare un archivio; per
attivare questa modalit`
a deve essere specificata lopzione -p o --pass-through. Il comando
legge la lista dei file da copiare dallo standard input e li copia nella directory che deve essere
specificata come argomento non opzionale. Pertanto una invocazione tipica in questa modalit`
a
`e del tipo:
cpio -pdv < lista

directory

Il comando, a parte quelle usate per specificarne la modalit`a di operazione, supporta molte
altre opzioni. In particolare con -v si richiede una maggiore prolissit`a nelle operazioni, con
la stampa dei nomi dei file che vengono processati; con -t si richiede di stampare la lista
del contenuto di un archivio, con -A di aggiungere i file ad un archivio esistente (invece di
sovrascriverlo).
Lelenco delle principali opzioni di cpio `e riportato in tab. 4.3, in cui si sono tralasciate le tre
opzioni principali per selezionare le modalit`a di operazione; al solito lelenco completo delle opzioni `e disponibile nella pagina di manuale accessibile con man cpio, anche se la documentazione
`e mantenuta principalmente nella pagina info accessibile con info cpio.

4.1.3

I comandi dump e restore

I comandi tar e cpio illustrati in precedenza, vengono usati per archiviare liste di file o directory
sulla base di quanto specificato al comando, per i backup esistono per`o anche dei comandi, come
dump e restore che permettono di effettuare larchiviazione a livello di un intero filesystem.
Il limite di un programma come dump `e che questo funziona solo per un filesystem che ne
supporti le operazioni salvando le informazioni necessarie. Questo nel caso di Linux `e vero solo
per il filesystem ext2 e la sua estensione journalled, ext3. Inoltre per poter utilizzare questa
funzionalit`
a occorre anche montare opportunamente il filesystem, e come vedremo in sez. 5.1.3,
17

con due eccezioni, vengono considerati validi come caratteri sui quali verificare una corrispondenza anche un
. allinizio del file e il carattere /, cos` da considerare nella corrispondenza anche i file nascosti e intere sezioni
di pathname.

190

CAPITOLO 4. AMMINISTRAZIONE ORDINARIA DEL SISTEMA


Opzione
-0

-a
-d
-f
-F
-m
-t
-u
-v

Significato
prende in ingresso una lista di stringhe terminate dal carattere NUL
(generabili con find -print0) per permettere larchiviazione di file il
cui nome contiene caratteri speciali.
ripristina il tempo di ultimo accesso sui file appena letti perche non
risultino tali.
ricrea le directory in cui si trovano i file.
copia solo i file che non corrispondono al pattern specificato.
permette di specificare un nome di file da usare come archivio al posto
dello standard input o dello standard output.
preserva i precedenti tempi di ultima modifica quando ricrea i file in
fase di estrazione.
stampa la lista dei file contenuti nellarchivio.
sovrascrive eventuali file gi`
a esistenti con quelli dellarchivio senza
chiedere conferma.
stampa informazioni aggiuntive sui file che vengono processati dal comando (in combinazione con -t viene usato un formato analogo a quello
di ls -l).
Tabella 4.3: Principali opzioni del comando cpio.

per questo il file /etc/fstab prevede un campo apposito, il quinto, che deve essere inizializzato
opportunamente ad un valore non nullo.
Una volta abilitato il supporto per il dump del filesystem tramite fstab effettuando operazioni di backup dello stesso tramite dump saranno salvate le informazioni necessarie a ricostruire
quali file sono stati cambiati da un backup allaltro, cos` da permettere dei backup incrementali.
Il funzionamento del programma prevede la possibilit`a 10 diversi livelli di dump, numerati da 0
a 9, da specificare con le opzioni omonime (cio`e -0, -1, ... -9), e se non viene specificato nulla
viene usato il livello 9.
Il livello 0 indica un backup completo, in cui si sono salvati tutti i file, e stabilisce un punto
di partenza per tutti gli altri livelli. Un livello superiore richiede il salvataggio di tutti i file
che sono cambiati dallultimo backup effettuato con un livello inferiore. Questo significa che un
backup di livello 9 salver`
a sempre solo i file modificati dopo lultimo backup precedente.
Quindi per fare un esempio,18 se si esegue un backup con livello 2 seguito da uno di livello
4 si avranno in questultimo solo i file cambiati dal momento in cui si `e eseguito il precedente
backup di livello 2; se poi si eseguisse un dump di livello 3 sarebbero salvati di nuovo tutti i file
modificati dopo il backup di livello 2 (e il livello 4 sarebbe ignorato), se al posto del dump di
livello 3 se ne fosse fatto uno di livello 5 invece si sarebbero salvati solo i file modificati dopo il
backup di livello 4.
Questo permette di poter eseguire i backup incrementali in maniera efficiente per ridurre al
minimo sia il tempo di recupero che il numero di supporti utilizzati. Una possibile strategia di
backup `e quella riportata nella pagina di manuale, in cui si fanno backup incrementali giornalieri,
usando un insieme di supporti da ruotare settimanalmente, usando un algoritmo di tipo torre
di Hanoi modificato.
A parte lopzione che ne specifica il livello il comando richiede la presenza dellopzione -f
seguita da un parametro che indica il file su cui effettuare il backup (in genere si usano le unit`a
a nastri, ma si pu`
o specificare un file ordinario o usare - per indicare lo standard output), e
prende come argomento il mount point del filesystem di cui si vuole eseguire il backup.19 Oltre
quelle citate dump prende numerose altre opzioni, molte delle quali sono relative alla gestione
18

si suppone che prima si sia partiti con un dump di livello 0, un passaggio iniziale infatti `e sempre necessario.
in realt`
a si pu`
o anche specificare una directory contenente i file che si vogliono archiviare e non un mount
point, in questo caso per`
o sono consentiti solo backup completi di livello 0 e tutto il contenuto della directory deve
risiedere nello stesso filesystem.
19

4.1. ARCHIVIAZIONE E BACKUP


Opzione
-D

-e
-E
-f

-L
-M
-u

-v

191

Significato
permette di cambiare il file su cui viene mantenuta linformazione relativa ai precedenti backup (completi o
incrementali) che di solito `e /var/lib/dumpdates.
esclude dal backup una lista di inode (vedi sez. 1.2.1)
passati per numero.
esclude una lista di inode elencati nel file specificato come
parametro.
scrive il backup sul file passato come parametro, si possono specificare pi`
u file separandoli con virgole, e saranno
considerati come volumi successivi.
usa la stringa passata come parametro come etichetta del
backup.
abilita il salvataggio multivolume (in cui si usa -f per
specificare pi`
u di un volume di backup).
aggiorna il file /var/lib/dumpdates che contiene la tabella in cui sono scritte i filesystem per i quali e le date
in cui sono stati effettuati i backup, e a quale livello.
aumenta la prolissit`
a del comando facendogli stampare a
video pi`
u informazioni riguardo le operazioni correnti.

Tabella 4.4: Principali opzioni del comando dump.

dei nastri su cui usualmente vengono salvati i backup. Si sono riportate le principali in tab. 4.4,
per lelenco completo si pu`
o al solito fare riferimento alla pagina di manuale.
Il comando che permette di recuperare i dati archiviati con dump `e restore, che esegue
esattamente il compito inverso, e come dump usa lopzione -f per indicare il file (ordinario o di
dispositivo) da cui recuperare i dati da ripristinare. Il comando inoltre prevede la necessaria
presenza di una serie di opzioni che ne indicano la modalit`a di operazione. Le principali sono
-C che effettua un confronto fra i file passati come argomento e quelli sul backup, -i che porta
in modalit`
a interattiva (dove possono essere dati una serie di comandi, descritti nella pagina di
manuale), -r che permette di ricostruire un intero filesystem da zero, -t che verifica se i file
passati come argomento sono nel backup o stampa a video il contenuto integrale dello stesso
se invocato senza argomenti, e -x che effettua il ripristino dal contenuto dellarchivio: di una
directory, se questa viene passata come argomento, o di tutto larchivio se non vengono passati
argomenti.
Opzione
-f
-C
-i
-r
-t
-x
-h
-M
-v

Significato
indica il file in cui `e stato memorizzato il backup.
esegue un confronto fra i file presenti nel filesystem e
quelli nel backup.
attiva la modalit`
a interattiva.
ricostruisce un intero filesystem da zero.
presenta un elenco di file nel backup.
estrae una directory dal backup (o tutto il contenuto).
estrae il contenuto di una directory, e non di quelle in
essa contenute.
abilita il ripristino da un archivio multivolume.
stampa una maggiore quantit`
a di informazione durante
le operazioni.

Tabella 4.5: Principali opzioni del comando restore.

Come dump anche restore prevede numerose opzioni, parecchie delle quali servono a controllare propriet`
a relative alluso dei nastri. Oltre a quelle brevemente spiegate in precedenza si
sono riportate in tab. 4.5 le pi`
u rilevanti; al solito tutti i dettagli e lelenco completo delle opzioni
(e dei comandi disponibili in modalit`a interattiva) sono riportati nella pagina di manuale.

192

4.1.4

CAPITOLO 4. AMMINISTRAZIONE ORDINARIA DEL SISTEMA

Altri comandi per il backup

Si sono raccolti in questultima sezione alcuni comandi specialistici utilizzati per effettuare delle
copie di dati che risultano di un certo interesse quando si devono eseguire dei backup.20 Se
infatti `e sempre possibile usare il semplice cp per copiare dei dati (in genere con lopzione -a
se si vogliono preservare anche le propriet`a dei file e copiare intere directory) esistono alcune
esigenze specifiche che vengono coperta in maniera pi`
u efficace ricorrendo ad altri comandi.
Il primo di questi comandi `e dd che viene normalmente utilizzato quando si devono effettuare
delle copie del contenuto di interi dispositivi (dischi, floppy, chiavette USB ed anche CDROM).
La principale differenza di dd rispetto a cp `e che questo `e nato, ed `e presente fino dalle prime
versioni di Unix, per effettuare delle copie a basso livello dei dati presenti sui dispositivi a
blocchi, e consente di eseguire letture e scritture con buffer dati di dimensioni precise, in modo
che queste corrispondano alle dimensioni dei blocchi dei dispositivi su cui va ad operare.21 Inoltre
il programma consente di specificare quanti dati copiare, sia in termini di numero di byte che
di blocchi che di punto di partenza della copia, ed `e per questo molto utile quando si devono
effettuare copie di parti specifiche di un disco, come il Master Boot Record (vedi sez. 5.1.2).
Date le sue origini agli albori di Unix il comando ha una sintassi abbastanza peculiare,
che non usa le normali opzioni, e prevede invece che tutti gli argomenti siano passati in forma
di assegnazione (con il carattere =) di valori ad altrettanti operatori che ne controllano il
comportamento. Se non si specificano argomenti il comando legge dallo standard input e scrive
sullo standard output, ma usato cos` non `e di grande utilit`a.
Per questo motivo il file da cui leggere e quello su cui scrivere vengono in genere indicati
esplicitamente con gli operatori if ed of, per cui uninvocazione tipica del comando, con il
quale `e ad esempio possibile effettuare una copia fisica del contenuto di una chiavetta USB, sar`a
qualcosa del tipo:22
dd if=/dev/sdb of=usbkey.img
ed invertendo i valori dei due operatori si potr`a effettuare il ripristino dalla copia.23
In questo modo il comando usa il valore di default di 512 byte per la dimensione dei blocchi;
questa si pu`o impostare con loperatore bs a cui assegnare sia un semplice valore numerico (che
specifica la dimensione in byte), che un valore con un prefisso che consente di indicare kilobyte,
megabyte, ecc.24
Altri operatori importanti sono count, che consente di indicare quanti blocchi copiare, skip
che consente di indicare un numero di blocchi dallinizio del file da saltare nella lettura, e seek
che esegue la stessa operazione sul file su cui scrivere. In questo modo `e possibile fare eseguire
a dd operazioni di copia di sezioni specifiche di un file su altre sezioni specifiche di un altro file.
Si sono riportati i principali operatori in tab. 4.6, per lelenco completo, che comprende anche
quelli che consentono di effettuare al volo alcune conversioni di dati, si consulti al solito la pagina
di manuale.
20
in questo caso si tratta sempre di backup completi, realizzati con la semplice esecuzione di una copia di
sicurezza dei dati che interessano.
21
come illustrato in sez. 1.2.1, nei sistemi unix-like tutto `e un file, per cui si potrebbero comunque usare anche
comandi ordinari come cp, dd fornisce per`
o un grado di controllo molto maggiore.
22
il file di dispositivo potrebbe anche essere un altro, a seconda della presenza o meno di altri dischi (vedi
sez. 5.1.1), ovviamente si dovranno avere gli opportuni premessi di accesso al dispositivo, che normalmente sono
disponibili solo allamministratore.
23
si faccia comunque molta attenzione quando si va a scrivere su un dispositivo, perche il comando non chiede
nessuna conferma, ed in caso di errore si rischia di distruggere totalmente il contenuto di un disco.
24
il comando supporta prefissi diversi per indicare sia i kilobyte metrici (1000 byte, con Kb) che gli usuali kilobyte
informatici (1024 byte, con K); lo stesso vale per le altre dimensioni (con M, G, ecc.), per i dettagli si consulti la
pagina di manuale.

4.1. ARCHIVIAZIONE E BACKUP


Operatore
if
of
count
seek
skip
bs
obs
ibs

193

Significato
file di ingresso da cui leggere i dati.
file di uscita su cui scrivere i dati.
numero di blocchi da leggere/scrivere.
numero di blocchi da saltare nel file di uscita prima di
iniziare la scrittura.
numero di blocchi da saltare nel file di ingresso prima di
iniziare la lettura.
dimensione di un blocco di dati (512 byte di default).
dimensione di un blocco di dati per la lettura.
dimensione di un blocco di dati per la scrittura.

Tabella 4.6: Principali operatori del comando dd.

Si tenga presente per`


o che per effettuare correttamente la copia a basso livello del contenuto
di un dispositivo a scopo di backup occorre che il filesystem presente nel dispositivo che si va
` per questo
a copiare non sia montato, in caso contrario infatti i dati saranno inconsistenti.25 E
motivo che per effettuare un backup a livello di dispositivo normalmente si usano i comandi
dump e restore di sez. 4.1.3, se per`o il dispositivo non `e montato o `e montato in sola lettura
(vedi sez. 5.1.3) la coerenza `e assicurata e si otterr`a una copia corretta.
Un secondo comando molto utile per la realizzazione di backup `e rsync. Il comando, come
indica il nome, nasce per mantenere sincronizzato il contenuto di singoli file o intere directory
sia in locale che in remoto. Rispetto alluso di comandi come tar e cp, oltre alla capacit`
a di
lavorare via rete, ha il vantaggio di essere in grado di mantenere al minimo la quantit`a di dati
trasferita; il programma infatti funziona operando soltanto sui file che sono stati modificati, e
trasmettendo soltanto le differenze presenti fra le due versioni, e non lintero contenuto.26
Per questo motivo rsync `e molto utile quando si deve eseguire una copia di dati via rete
o si ha a che fare con un mezzo lento (ad esempio un disco USB); se infatti si dispone gi`
a
di una versione precedente di quanto si vuole copiare, il comando trasferir`a solo le differenze
consentendo una operazione di copia molto pi`
u veloce.
La sintassi di base del comando `e analoga a quella di cp e prevede come argomenti una o pi`
u
sorgenti ed una destinazione; qualora ci siano pi`
u sorgenti (vale a dire pi`
u di due argomenti) la
destinazione deve essere una directory.27 Se usato localmente sorgenti e destinazione non sono
altro che dei pathname, ma il comando consente di utilizzare una sorgente o una destinazione
remota,28 nel qual caso la forma generica dellargomento sar`a qualcosa del tipo:
user@machinename:/path/to/dest_or_src
la sintassi del comando per`
o richiede che quando la sorgente `e remota questa debba essere unica
e la destinazione debba essere locale.
Luso pi`
u comune di rsync `e quello che prevede due directory come argomenti, per sincronizzare il contenuto della prima sulla seconda. Si tenga presente inoltre che quando si specifica
come sorgente una directory il comando si comporta diversamente a seconda che questa sia indicata o meno con una / finale, nel primo caso infatti la directory viene copiata allinterno
della directory di destinazione, mentre nel secondo caso nella destinazione ne viene copiato il
contenuto.29
25

se il filesystem `e montato il kernel lo aggiorner`


a in maniera autonoma, e non c`e nessuna garanzia sulla
coerenza dei dati che potranno essere visti da dd nel momento in cui il programma li legge.
26
il programma usa un algoritmo sofisticato che gli consente di determinare e trasmettere solo le differenze fra
due file.
27
il comando pu`
o essere usato anche con un solo argomento, nel qual caso fornisce la lista dei file presenti nella
sorgente.
28
non entriamo qui nei dettagli delle modalit`
a del trasferimento via rete, se non per dire che normalmente questo
avviene attraverso SSH, che tratteremo in sez. 8.3.
29
in entrambi i casi gli attributi della directory sorgente vengono comunque trasferiti sulla destinazione.

194

CAPITOLO 4. AMMINISTRAZIONE ORDINARIA DEL SISTEMA


Opzione
-a
-r
-l
-p
-t
-g
-o
-D
-u
-v
-z
-e
-A
-X
-H
--exclude
--delete

Significato
effettua un trasferimento in modalit`
a archivio, equivalente a -rlptgoD.
effettua una copia ricorsiva del contenuto della destinazione sulla sorgente.
copia i link simbolici come tali.
preserva i permessi.
preserva i tempi.
preserva il gruppo proprietario.
preserva lutente proprietario.
preserva file speciali e di dispositivo.
non esegue la sincronizzazione se a destinazione esiste una
versione pi`
u recente.
aumenta la prolissit`
a.
comprime i dati durante il trasferimento.
specifica la shell remota da usare.30
preserva le ACL.
preserva gli attributi estesi.
riconosce gli hard link e li mantiene nella destinazione
(dispendiosa).
esclude un insieme di file dalla copia.
cancella sulla destinazione quanto non presente nella
sorgente.

Tabella 4.7: Principali opzioni del comando rsync.

In generale quando lo si usa per eseguire copie il comando viene invocato con lopzione -a, che
consente di preservare link simbolici, file di dispositivo e tutti gli attributi (permessi, proprietari,
tempi) di file e directory. Una seconda opzione comune, usata soprattutto per i trasferimenti
via rete, `e -z che attiva la compressione dei dati, mentre con -v si aumenta la prolissit`a del
comando. Infine con -u si richiede al comando di non sincronizzare i file che risultano pi`
u recenti
(come tempo di ultima modifica) nella destinazione.
Un elenco delle altre opzioni pi`
u significative `e riportato in tab. 4.7, ed al solito per una
documentazione pi`
u completa si pu`
o far riferimento alla pagina di manuale. Vale per`o la pena
evidenziare due opzioni che utilizzabili solo in forma estesa; con --delete si pu`o richiedere la
cancellazione nella destinazione dei file non presenti nella sorgente (il default `e lasciarli) mentre
con --exclude si pu`
o indicare un insieme di file da non trasferire.31

4.2

La gestione dei pacchetti software

Affronteremo in questa sezione le varie modalit`a in cui un amministratore pu`o installare e rimuovere software dal sistema, in particolare esaminando i diversi sistemi di gestione dei pacchetti
messi a disposizione dalle varie distribuzioni che permettono di tenere traccia, aggiornare e
rimuovere tutto quello che si `e installato nella propria macchina.

4.2.1

Linstallazione diretta dai sorgenti

Una delle caratteristiche costitutive del software libero `e la disponibilit`a del sorgente dei programmi, pertanto `e sempre possibile effettuare una installazione diretta a partire dal codice che
viene distribuito direttamente dagli sviluppatori. In generale questo pu`o avvenire nelle modalit`a
30
il default rsh, che sui sistemi recenti `e un alias a ssh, ma lopzione consente di specificare lintera riga di
comando da invocare sullaltro lati della connessione.
31
lopzione prende come argomento una espressione analoga a quelle del filename globbing, la cui sintassi `e
supportata interamente, con alcune estensioni descritte in dettaglio nella pagina di manuale.

4.2. LA GESTIONE DEI PACCHETTI SOFTWARE

195

pi`
u disparate, e dipende anzitutto dal linguaggio in cui lo stesso software viene scritto. Tratteremo in questa sezione il caso pi`
u comune, in cui i programmi da installare devono essere prima
compilati, qualora il software sia stato scritto in un linguaggio interpretato in genere tutto quello
che servir`
a sar`
a semplicemente installare i file che lo compongono in maniera opportuna nella
propria macchina.
Nella maggior parte dei casi il software viene distribuito in forma sorgente in degli archivi
compressi chiamati gergalmente tarball , in quanto creati con il programma tar, trattato in
sez. 4.1.2. In genere gli archivi vengono pure compressi, per cui di norma li si trovano distribuiti
in file che usano lestensione .tar.gz32 dato che il programma di compressione pi`
u usato `e gzip;
una alternativa che si inizia a diffondere per gli archivi pi`
u grandi `e quella delluso di bzip2, che
comprime molto di pi`
u, anche se `e pi`
u lento, nel qual caso lestensione usata `e .tar.bz2.
Per installare un pacchetto dai sorgenti la prima cosa da fare `e scaricare larchivio degli stessi
dal sito di sviluppo: `e consigliato usare, se ci sono, degli eventuali mirror, dato che questi di
norma sono meno occupati del sito originale, e probabilmente anche pi`
u vicini in termini di
distanza sulla rete e quindi con una maggiore velocit`a di accesso.
Una volta scaricato il pacchetto se ne pu`o verificare il contenuto o scompattarlo usando il
comando tar usando la sintassi trattata in sez. 4.1.2. Ad esempio se il pacchetto `e distribuito nel
file pacchetto.tar.gz lo si potr`
a decomprimere con il comando tar -xvzf pacchetto.tar.gz.
In genere questo crea una directory identica a quella che conteneva tutti i file necessari sulla
` pratica comune usare una directory con lo stesso
macchina in cui `e stato creato larchivio. E
nome del pacchetto, a cui si suole aggiungere un numero di versione progressivo che consenta di
distinguere i vari rilasci.
A questo punto per linstallazione occorre eseguire le operazioni previste allo scopo dagli
sviluppatori. Queste possono risultare molto diverse da pacchetto a pacchetto, ma in genere
chiunque distribuisce software fornisce anche le informazioni necessarie su come effettuare linstallazione. Di norma queste vengono distribuite insieme ai sorgenti, ed `e prassi comune trovarle
nei file README o INSTALL.
Si tenga presente comunque che installare un pacchetto dai sorgenti presenta dei requisiti
maggiori rispetto allinstallazione di un pacchetto binario, in quanto non basta copiare dei file
nella loro destinazione finale. Infatti se il codice deve essere compilato sono necessari una serie
di programmi che tipicamente non vengono installati in macchine su cui non si fa sviluppo,33
come compilatori, programmi per la costruzione dei binari, file di sviluppo delle librerie.
Inoltre molti programmi per funzionare necessitano di altri programmi o di librerie. Essendo
questi per lo pi`
u sviluppati in maniera indipendente, non vengono distribuiti insieme ai sorgenti
del programma, e quindi non `e detto che siano gi`a presenti ed installati. Ci sono cio`e quelle che
tecnicamente vengono chiamate dipendenze, che devono essere risolte prima di poter procedere
allinstallazione.
Per cercare di semplificare la procedura di installazione dai sorgenti il progetto GNU ha
realizzato un insieme di programmi, chiamati autotool, che consente di verificare che tutto quello
che serve per la costruzione del pacchetto sia presente. Se un progetto usa gli autotool, o se segue
la procedura di installazione definita da questi ultimi, tutto quello che c`e da fare `e di entrare
nella directory dove si `e scompattato il contenuto della tarball ed eseguire la sequenza di comandi:
./configure
make
make install
32
talvolta abbreviata in tgz, per luso di sistemi obsoleti che hanno problemi coi nomi di file che hanno troppi
caratteri . al loro interno.
33
anzi `e buona norma di sicurezza non avere installati compilatori ed altri tool di sviluppo su server di
produzione, per rendere pi`
u complicata la vita ad eventuali intrusi che volessero installare i loro programmi.

196

CAPITOLO 4. AMMINISTRAZIONE ORDINARIA DEL SISTEMA

Il primo comando, ./configure, esegue uno script di shell che verifica che nel sistema sia
presente tutto quello che serve per compilare il pacchetto. Questo `e il punto pi`
u critico della
procedura, in quanto se manca qualcosa lo script si interromper`a dicendo o che non ci sono i
vari programmi di compilazione e costruzione, o che non esiste il supporto per una funzionalit`a
necessaria al programma o che mancano i file di dichiarazione relativi ad una certa libreria che
serve al programma, o la libreria stessa.
Per effettuare una installazione dei sorgenti il requisito fondamentale `e ovviamente quello di
avere installato il relativo compilatore. Nei casi pi`
u comuni i programmi sono scritti in linguaggi
come il C o il C++ e allora `e sufficiente installare i programmi gcc e g++ e tutto quanto fa parte
della GNU Compiler Collection che oltre a questi due compilatori contiene pure una serie di altri
programmi accessori. In genere questi programmi vengono forniti direttamente dalla propria
distribuzione, e si dovr`
a semplicemente installarli con le modalit`a previste da questultima.34
Un secondo programma essenziale per linstallazione dai sorgenti `e make, che, come dice il
nome, viene usato per automatizzare la costruzione dei binari a partire dai sorgenti, consentendo
di definire tutte le procedure necessarie per la creazione dei file nella giusta sequenza, sulla base
di una serie di ricette contenute negli appositi Makefile.35
Se si `e installato tutto quello che `e necessario alla compilazione, e si sono risolte tutte le
dipendenze da altro software o librerie, lo script configure terminer`a senza errori e si potr`a
passare al comando successivo. In questa fase uno degli errori pi`
u comuni che si pu`o presentare
`e che, pur avendo installato il software e tutte le librerie necessarie, non siano presenti i file
di dichiarazione associati alla librerie, che sono necessari al compilatore per poter accedere alle
funzioni in esse definite nella fase di compilazione.
Il problema `e comune perche per un programma binario gi`a compilato questi file non sono
necessari, e pertanto `e normale che non vengano installati anche quando ci sono le librerie
corrispondenti. Per`
o essi vengono messi a disposizione da tutte le distribuzioni come pacchetti
con lo stesso nome di quello della libreria a cui fanno riferimento, a cui viene aggiunto un -dev
per indicare che si tratta della parte necessaria allo sviluppo.36 In questo caso non che c`e altro
da fare che installare anche questi pacchetti di sviluppo, rifacendosi di nuovo al meccanismo di
gestione fornito dalla propria distribuzione.
Una volta che ./configure ha completato con successo le sue operazioni si potr`a eseguire
il secondo comando nella sequenza, make, che esegue la costruzione dei binari. Questo in genere
d`a luogo ad una lunga serie di messaggi da parte del compilatore, fino a quando le operazioni
non sono concluse. Se qualcosa va storto in questa fase restano solo due strade, si pu`o scrivere
un bug report a chi ha creato il pacchetto (evitando troppi accidenti e fornendo le righe in cui
si `e verificato lerrore) ed aspettare una risposta o provare a correggere lerrore da soli, ma in
questultimo caso dovrete essere un po pratici di programmazione, nel qual caso probabilmente
potete evitare di leggere queste pagine.37
Una volta completata la compilazione con make install si dice allo stesso programma di
eseguire le istruzioni di installazione. Si tenga presente che la procedura standard, seguendo
le linee guida del Filesystem Hierarchy Standard, prevede di installare i pacchetti compilati dai
sorgenti sotto /usr/local/, per cui per poterli utilizzare occorre avere le directory di questa
gerarchia secondaria nel PATH della shell (vedi sez. 2.1.3) e si deve essere in grado di usare le
eventuali librerie ivi installate dal pacchetto (secondo quanto illustrato in sez. 3.1.2). Se si usa
34
nel caso di Debian si pu`
o installare in un colpo solo tutto il necessario alla compilazione di programmi di base
richiedendo il meta-pacchetto build-essential.
35
il programma funziona eseguendo le istruzioni che trova in un file con questo nome posto nella directory
corrente, `e compito proprio dello script configure creare detti file con i corretti contenuti.
36
servono infatti non solo per compilare un programma per linstallazione, ma anche qualora si volessero
sviluppare programmi che utilizzano le corrispondenti librerie.
37
come ultima risorsa potete comunque provare a cercare sui motori di ricerca se qualcuno ha gi`
a incontrato un
problema simile al vostro e se ne `e stata fornita una qualche soluzione.

4.2. LA GESTIONE DEI PACCHETTI SOFTWARE

197

la versione di configure degli Autotool GNU `e possibile cambiare questa directory passando
allo script lopzione --prefix che prende come parametro il pathname della directory dove si
vuole che venga eseguita linstallazione.38
Si tenga presente che la procedura descritta vale solo se gli sviluppatori hanno deciso di usare
il sistema di costruzione e controllo fornito dagli autotool del progetto GNU. In generale non `e
detto che questo avvenga, nel qual caso occorre rifarsi alle istruzioni lasciate dal programmatore. Alternative possibili sono, per progetti non troppo complessi, la semplice invocazione del
comando make (e di un successivo make install), o luso diretto del compilatore (solo in casi
elementari).
Benche sia sempre possibile eseguire una installazione dai sorgenti, in una pratica di buona
amministrazione questo dovrebbe essere evitato il pi`
u possibile anche quando, come avviene
con la procedura appena illustrata, una tale installazione non risulti neanche particolarmente
complessa. Infatti a parte i problemi preliminari relativi a dover sistemare a mano tutte le
dipendenze di un pacchetto, o al tempo impiegato per eseguire la compilazione dei programmi,39
il problema maggiore resta la manutenzione di quanto si `e installato, a causa delle difficolt`
a
relative allaggiornamento e alla eventuale rimozione.
Infatti se installare `e facile, disinstallare `e molto pi`
u problematico. Alcuni pacchetti (una
minoranza purtroppo) forniscono uno speciale bersaglio 40 per make che consente la disinstallazione con make unistall. Ma se questo non c`e occorre tracciarsi a mano i file che sono stati
installati e cancellarli. In caso di aggiornamento poi la cosa si complica ancora di pi`
u perche
installando una nuova versione potr`
a essere necessario sovrascrivere file, o installarne di nuovi e
cancellarne di vecchi, tutte cose che non sono quasi mai previste dalla procedura di installazione
di un pacchetto.
Per questi motivi, come vedremo nelle sezioni seguenti, la gran parte delle distribuzioni
fornisce un sistema di gestione dei pacchetti che permetta di tenere traccia di cosa si installa e
di dove sono messi i file, che poi consente sia una cancellazione pulita del pacchetto quando lo
si vuole disinstallare, che un aggiornamento corretto di tutto quello che serve nelluso di nuove
versioni.

4.2.2

La gestione dei pacchetti con rpm e yum

Uno dei primi sistemi evoluti per la gestione dellinstallazione e rimozione di pacchetti software
`e RPM, realizzato da RedHat per la sua distribuzione.41 Data la sua efficacia esso `e stato in
seguito adottato da molte altre distribuzioni, diventando uno dei sistemi di gestione dei pacchetti
pi`
u diffusi.
Con RPM si intende sia il programma rpm, che permette di eseguire linstallazione e la
rimozione dei pacchetti, che il formato dei file con cui sono distribuiti i pacchetti,42 normalmente
caratterizzati dalla estensione .rpm. In realt`a il comando rpm fa molto di pi`
u che installare e
disinstallare: mantiene la lista dei pacchetti installati e di dove sono stati installati i singoli
38

alternativamente, per non rieseguire lo script di configurazione, si pu`


o modificare la variabile PREFIX definita
nelle prime righe del Makefile principale nella directory dei sorgenti.
39
questo per pacchetti piccoli pu`
o anche essere trascurabile, ma per pacchetti importanti come il server X pu`
o
essere, a seconda della potenza della macchina, dellordine delle ore o dei giorni.
40
si chiamano cos`, dallinglese target, gli argomenti che si passano a make e che normalmente indicano quali delle
varie sezioni dei comandi di costruzione e installazione scritti in un Makefile devono essere usati, non specificare
nulla significa usare il primo target disponibile che di norma esegue il compito principale; di solito ne esistono degli
altri, ad esempio `e comune clean che serve a cancellare i risultati della compilazione per riportare la directory del
pacchetto nelle condizioni iniziali precedenti alla costruzione dello stesso, per ulteriori dettagli sul funzionamento
di make si consulti [Make].
41
la sigla originariamente stava per RedHat Package Manager, essendo utilizzato da molte altre distribuzioni
oggi viene chiamato semplicemente RPM Package Manager.
42
in sostanza si tratta di archivi cpio dei file necessari, tanto che esiste il comando rpm2cpio che consente di
estrarre larchivio cpio da un file .rpm.

198

CAPITOLO 4. AMMINISTRAZIONE ORDINARIA DEL SISTEMA

file che ne fanno parte; cos` pu`


o accorgersi se un pacchetto va in conflitto con altri cercando
di installare gli stessi file. Inoltre `e in grado di accorgersi di dipendenze fra i vari pacchetti, di
effettuare verifiche su quanto `e stato installato e di eseguire degli script in fase di installazione
e disinstallazione con cui eseguire procedure di configurazione automatica del pacchetto stesso.
Il comando `e complesso e prevede diverse modalit`a operative, attivate da altrettante opzioni
che non possono essere usate contemporaneamente. Le due modalit`a pi`
u usate sono quella di
installazione, attivata dallopzione -i e quella di rimozione, attivata dallopzione -e. Altre modalit`a usate spesso sono quella di interrogazione del database dei pacchetti, attivata dallopzione
-q e quella di verifica attivata dallopzione -V. Per lelenco completo si consulti la pagina di
manuale.
Nel caso si debbano installare dei pacchetti RPM occorre anzitutto procurarsi i file .rpm con
il relativo contenuto, lopzione -i (o --install) di rpm infatti prende come argomento il file o
la lista di file dei nuovi pacchetti che si vogliono installare; alternativamente si pu`o usare negli
argomenti una URL al posto del nome di un file, nel qual caso il pacchetto indicato verr`a anche
scaricato direttamente dalla rete via HTTP o FTP.
I pacchetti RPM seguono anche una convenzione precisa per i nomi dei file; questi sono
composti da pi`
u parti separate dal carattere -. La prima parte indica il nome del pacchetto
stesso, e pu`o essere anche composta di pi`
u parole; segue il numero di versione, cos` come preso
dalla versione originale dal software, cui segue il cosiddetto numero di revisione che marca le
diverse versioni del pacchetto stesso. Infine segue, separate da un punto, larchitettura per cui
il pacchetto `e stato realizzato e lestensione; in sostanza si avr`a un nome del tipo:
logrotate-3.7.4-8.i386.rpm
Nellinstallare un pacchetto rpm controlla preliminarmente che tutte le sue dipendenze siano
soddisfatte, non installandolo in caso contrario ed indicando dove sta il problema. Il comando
si rifiuta di installare il pacchetto anche se un file in esso contenuto esiste di gi`a o se un altro
pacchetto con lo stesso nome `e gi`
a installato. Questo significa che non si pu`o usare lopzione -i
per eseguire un aggiornamento, essa deve essere usata soltanto per installare pacchetti nuovi.
Per eseguire un aggiornamento sono previste due opzioni alternative: -U (o --upgrade) con cui si
richiede linstallazione di nuovi pacchetti e laggiornamento di eventuali pacchetti gi`a installati,
e -F (o --freshen) con cui si richiede il solo aggiornamento di pacchetti gi`a installati.
Si tenga presente che oltre a gestire le dipendenze, rpm `e in grado di gestire anche gli eventuali
conflitti, cio`e i casi in cui due pacchetti (o due versioni diverse dello stesso pacchetto) cercano
di installare lo stesso file, ed in tal caso ovviamente dovr`a essere generato un errore. Esistono
casi per`o in cui, ad esempio a causa di un aggiornamento ad una versione di un pacchetto
malfunzionante, in cui pu`
o essere necessario evitare questi controlli.
A tale scopo sono state fornite alcune opzioni di controllo da aggiungere a -i per forzare
linstallazione, come --replacefiles, che consente di installare il pacchetto anche se i file
gi`a sono presenti, rimpiazzandoli, --replacepkgs che consente di installare i pacchetti anche
se alcuni di essi sono gi`
a presenti e --oldpackage che consente di effettuare un aggiornamento
poi disponibile
sostituendo una versione pi`
u recente dello stesso pacchetto con una precedente. E
lopzione --force che `e una abbreviazione per luso di tutte e tre le opzioni precedenti.
Come accennato disinstallazione di un pacchetto viene eseguita con lopzione -e (o --erase),
cui segue il nome del pacchetto o della lista dei pacchetti da rimuovere. Anche in questo caso
vengono fatti dei controlli preliminari, e ad esempio lazione viene abortita se un altro pacchetto
dipende da quello che si vuole eliminare. Di nuovo pu`o essere necessario forzare la disinstallazione, cosa che pu`
o essere fatta specificando la ulteriore opzione --nodeps, che consente di ignorare
i problemi dovuti alle dipendenze (la stessa opzione `e accettata anche da -i).
Con lopzione -q (o --query) `e possibile eseguire una serie di interrogazioni sul database
dei pacchetti installati; se non si specifica altro lopzione richiede come argomento un nome di

4.2. LA GESTIONE DEI PACCHETTI SOFTWARE

199

pacchetto di cui verifica la presenza nel sistema. Ad essa per`o sono associate una lunga serie
di altre opzioni che consentono di ottenere informazioni pi`
u specifiche; queste sono a loro volta
suddivise in quelle che indicano quali informazioni mostrare ed in quelle che indicano a chi
applicare la richiesta.
Ad esempio con rpm -qa si ottiene la lista di tutti i pacchetti installati nel sistema. Se invece
si usa -ql, seguito dal nome del pacchetto, si stampano i file in esso contenuti. Si pu`o anche
leggere il contenuto di un pacchetto non installato con -qpl dove -p serve a richiedere che come
argomento si specifichi il file del pacchetto. Qualora invece si volesse sapere a quale pacchetto
appartiene un file si potr`
a usare -qf indicando come argomento il file stesso.
La modalit`
a di verifica viene attivata con lopzione -V (o --verify) e richiede che si specifichi come argomento il nome di un pacchetto installato o -a per eseguire la verifica su tutti
quanti. Lopzione consente di controllare lintegrit`a dei file che sono stati installati da un pacchetto rispetto alle informazioni sullo stesso mantenute nel database controllando se permessi,
dimensioni e contenuto del file sono coincidenti con quelli previsti. Lopzione provvede luso di
ulteriori opzioni per selezionare quali verifiche effettuare e restituisce per ciascun file una stringa
con i risultati delle verifiche.
Una altra opzione che consente di verificare il contenuto dei pacchetti `e --checksig, che
serve a controllare originalit`
a e integrit`a di un file contenente un pacchetto RPM, verificandone
la firma digitale. Infine sono degne di nota le opzioni --setperms e --setugids che consentono
di ripristinare ai valori originari permessi e proprietario di tutti i file di un pacchetto, qualora li
si siano modificati per errore.
In tab. 4.8 si sono riportate le principali opzioni di rpm. La tabella `e stata suddivisa in varie
sezioni, accorpando insieme le opzioni relative alla varie modalit`a di operazione del comando,
e lasciando nellultima parte le opzioni generiche. Per ciascuna sezione si sono anche evidenziate, riportandole per prime, le opzioni obbligatorie che fanno riferimento a quella modalit`
a di
operazioni e che devono essere presenti per poter utilizzare le altre.

-i
-U
-F

-h
-e
-q
-a
-l
-f
-p

-V
-K
-v

Opzione
--install
--upgrade
--freshen
--replacefiles
--replacepkgs
--oldpackage
--force
--hash
--erase
--nodeps
--query
--all]
--list
--file
--package
--whatrequires
--whatprovides
--verify
--checksig
--setperms
--setugids

Significato
installa un nuovo pacchetto.
aggiorna o installa un pacchetto.
aggiorna un pacchetto gi`
a installato.
sovrascrive file di altri pacchetti.
installa anche se il pacchetto `e gi`
a installato.
installa una versione precedente a quella attuale.
riassume --replacefiles, --replacepkgs e --oldpackage.
stampa una barra di progressione.
rimuove un pacchetto.
non verifica le dipendenze.
interroga il database per la presenza di un pacchetto.
stampa tutti i pacchetti installati.
stampa i file contenuti in un pacchetto.
stampa il pacchetto che contiene un file.
stampa il contenuto del pacchetto contenuto nel file.
indica quali pacchetti dipendono da una certa funzionalit`
a.
indica quali pacchetti forniscono una certa funzionalit`
a.
verifica lo stato di un pacchetto.
verifica la firma digitale di un pacchetto.
stampa pi`
u informazioni nellesecuzione delle operazioni.
ripristina i permessi dei file del pacchetto.
ripristina proprietario e gruppo dei file del pacchetto.

Tabella 4.8: Principali opzioni del comando rpm suddivise per categorie.

A lungo rpm `e stato in grado di gestire le dipendenze solo in forma molto elementare, avvisando lutente di quali erano i file che dovevano essere gi`a presenti nel sistema perche un certo

200

CAPITOLO 4. AMMINISTRAZIONE ORDINARIA DEL SISTEMA

pacchetto potesse essere installato.43 Nelle versioni pi`


u recenti sono state per`o aggiunte funzionalit`a pi`
u evolute in grado di eseguire il controllo delle dipendenze a livello di pacchetto e non
di singolo file, e sono state introdotte anche nuove opzioni di interrogazione da abbinare allopzione -q, come --whatprovides, che indica quali pacchetti forniscono una certa funzionalit`a, e
--whatrequires che indica tutti i pacchetti che ne richiedono un altro per funzionare.
In questo modo il programma permette di sapere quali sono i pacchetti che non funzioneranno
a causa della mancanza di un qualche componente a loro essenziale che potr`a essere fornito da
altri pacchetti. Il meccanismo fornito da rpm per`o si limita a questo, sta allamministratore
trovare, scaricare ed installare i pacchetti mancanti,44 a meno che la propria distribuzione non
fornisca un sistema di gestione dei pacchetti di pi`
u alto livello, come yum o la versione per RPM
del sistema APT di Debian, che tratteremo nella prossima sezione.
A lungo infatti le distribuzioni basate su RPM sono state prive di un sistema di gestione dei
pacchetti di alto livello presente invece su Debian e sulle sue derivate, che permettesse di gestire
in maniera pi`
u semplice le dipendenze e gli aggiornamenti del software. Per questo ognuna ha
finito per sviluppare un suo sistema diverso; fra questi quello che ha avuto il maggior successo,
e che si avvicina di pi`
u alle funzionalit`
a presenti su Debian `e yum,45 creato inizialmente da
Yellowdog, in seguito modificato ed adottato da altre distribuzioni, come RedHat.
Il concetto generale di yum, ripreso pari pari dallAPT di Debian, `e quello di avere una o
pi`
u fonti, i cosiddetti repository, su cui sono contenuti sia i pacchetti che le informazioni ad essi
relative (come le dipendenze reciproche, le versioni, ecc.), organizzate in maniera opportuna.
Facendo riferimento ad un repository si potr`a allora conoscere quali pacchetti sono disponibili,
quali sono necessari per poterne installare un altro o di quali pacchetti esiste una versione pi`
u
recente, da usare come aggiornamento.
Operazione
install
check-update
update
upgrade
remove
erase
list
info
clean
search

Significato
installa un pacchetto.
verifica se sono disponibili aggiornamenti.
esegue laggiornamento dei pacchetti installati.
esegue laggiornamento anche da una distribuzione
precedente.
rimuove un pacchetto.
sinonimo di remove.
stampa un elenco dei pacchetti.
stampa informazioni descrittive sui pacchetti.
cancella la cache dei pacchetti scaricati.
esegue una ricerca della stringa passata come argomento
nelle descrizioni e nei nomi dei pacchetti.
Tabella 4.9: Principali operazioni di yum.

In genere yum viene invocato passandogli come primo argomento loperazione che si vuole
eseguire, seguita da eventuali altri argomenti successivi. Se ad esempio si vuole installare un
pacchetto sar`a necessario usare loperazione install e specificare poi il nome dello stesso;46
specificando pi`
u nomi verr`
a richiesta linstallazione di pi`
u pacchetti. Sar`a cura poi di yum
scaricare ed installare preventivamente a quelli richiesti anche gli ulteriori pacchetti aggiuntivi
ritenuti necessari a soddisfare le dipendenze.
43

con il non banale svantaggio di costringere lamministratore ad indovinare quale potesse essere il pacchetto
che li conteneva.
44
il che porta a quella situazione che viene chiamata dependency hell, quando un pacchetto dipende da un altro
che a sua volta dipende da una altro che a sua volta...
45
il nome sta per Yellowdog Updater Modified.
46
in questo caso basta il nome del pacchetto, usando dei repository non `e necessario ne il nome di un file ne un
numero di versione.

4.2. LA GESTIONE DEI PACCHETTI SOFTWARE

201

Viceversa per rimuovere un pacchetto (o pi`


u) si pu`o utilizzare loperazione erase (o lomonima remove) seguita dal nome (o dai nomi) dei pacchetti da rimuovere, mentre laggiornamento
viene effettuato con update;47 a questa si aggiunge upgrade che tiene in considerazione anche
gli aggiornamenti dai pacchetti installati da una distribuzione precedente lattuale. Infine con
list si possono elencare tutti i pacchetti disponibili (con versione e repository su cui si trovano)
mentre con info se ne possono ottenere le relative informazioni, entrambe le operazioni riconoscono come parametri aggiuntivi, oltre ad un elenco di nomi di pacchetti, per i quali `e anche
possibile usare le wildcard del filename globbing, le parole chiave all che elenca tutti i pacchetti,
available che elenca quelli disponibili per linstallazione, updates che elenca gli aggiornamenti,
installed che elenca quelli installati ed extras che elenca quelli installati ma non presenti in
nessun repository.
Per il funzionamento yum occorre per`o poter fare riferimento agli opportuni repository dei
pacchetti. Per linstallazione baster`a poter accedere al contenuto del repository per ottenere
automaticamente tutto quello che serve; questo pu`o essere fatto in una molteplicit`a di modi, ma
i principali sono via rete con i protocolli HTTP o FTP; il contenuto di un repository per`
o pu`
o
anche essere posto su una directory del proprio disco.48
Il file di configurazione principale di yum `e /etc/yum.conf, anche se viene pu`o essere usato
anche /etc/yum/yum.conf. Questo file usa il formato dei file .ini di Windows, che prevede
delle sezioni introdotte da un nome posto fra parentesi quadre, allinterno delle quali si possono
impostare le varie opzioni di configurazione nella forma di assegnazione di un valore ad una
parola chiave. Un esempio di questo file, preso dalla versione installata su una CentOS 5.2, `e il
seguente:
[main]
cachedir=/var/cache/yum
keepcache=1
debuglevel=2
logfile=/var/log/yum.log
pkgpolicy=newest
distroverpkg=redhat-release
tolerant=1
exactarch=1
obsoletes=1
gpgcheck=0
plugins=1
metadata_expire=1800

Il file richiede sempre la presenza di una (ed una sola) sezione main, che contiene le configurazioni generali del comando; `e qui ad esempio che si pu`o impostare, qualora sia necessario,
lutilizzo di un proxy web per il download dei pacchetti, assegnando allopzione proxy la URL dello stesso (utilizzando poi le ulteriori proxy_username e proxy_password per indicare eventuali
credenziali di accesso).
Altre opzioni comuni, presenti anche nel precedente esempio, sono cachedir che imposta
la directory dove verranno mantenuti i pacchetti scaricati ed dati ad essi associati, e logfile
che indica il file su cui vengono registrati i risultati delle varie operazioni. Oltre a queste sono
definite una grande quantit`
a di altre opzioni che consentono di controllare nei dettagli i vari
aspetti di funzionamento del comando, le principali sono riportate in tab. 4.10 ma per i dettagli
al solito occorre fare riferimento alla pagina di manuale, accessibile con man yum.conf.
Benche sia possibile indicare direttamente allinterno di yum.conf i repository che si vogliono
utilizzare, definendo per ciascuno di essi altrettante sezioni, normalmente viene definita solo la
sezione main e si preferisce usare tale scopo una serie di file separati, caratterizzati dallestensione
47
48

anche in questo caso si pu`


o passare una lista di nomi, nel qual caso saranno aggiornati solo i pacchetti indicati.
e nel caso di quelli usati da Debian si possono usare anche gli stessi CDROM di installazione.

202

CAPITOLO 4. AMMINISTRAZIONE ORDINARIA DEL SISTEMA


Opzione
cachedir
logfile
gpgcheck
pkgpolicy

proxy
proxy_password
proxy_username
reposdir
tolerant

Significato
imposta la directory dove sono mantenuti i pacchetti scaricati e
le relative informazioni.
imposta il file con il registro delle operazioni effettuate
(installazioni, aggiornamenti, rimozioni, ecc.) da yum.
richiede o meno il controllo delle firme GPG dei pacchetti
(rispettivamente con i valori 1 o 0).
imposta la politica seguire quando lo stesso pacchetto `e disponibili su diversi repository, con newest installa sempre la versione
pi`
u recente, con last installa la versione presente nel repository che viene per ultimo nella lista degli stessi fatta per ordine
alfabetico sul relativo identificatore.
imposta luso di un proxy, da specificare tramite la relativa URL.
imposta una password per laccesso al proxy.
imposta un utente per laccesso al proxy.
imposta la directory (o le directory) da cui prendere la lista dei
file .repo che definiscono i repository.
rende il comando pi`
u tollerante (rispettivamente con i valori
1 o 0) rispetto ad alcune classi di errori (come richiedere
linstallazione di un pacchetto gi`
a installato).

Tabella 4.10: Principali opzioni della sezione main di yum.conf.

.repo, che di default sono mantenuti nella directory /etc/yum.repo.d.49 In questo modo per
aggiungere un nuovo repository `e sufficiente installare un altro file allinterno di essa.
Il formato di un file .repo prevede che esso sia nella forma di una o pi`
u sezioni associate
ad altrettanti repository; il nome di ciascuna sezione, nella forma di una singola parola, deve
essere sempre diverso in quanto viene a costituire il cosiddetto repository id che serve come
riferimento univoco per identificare uno specifico repository. Ad esempio nel caso di CentOS 5.2
viene usato un file CentOS-Base.repo che definisce le sezioni base, updates, addons, extras e
centosplus per luso dei repository ufficiali supportati da questa distribuzione,50 ma in generale
ogni distribuzione fornir`
a i suoi repository ufficiali.
Opzione
name
baseurl
mirrorlist
gpgkey
exclude

enabled

Significato
una stringa di descrizione del repository.
la URL che indica lindirizzo a cui `e possibile raggiungere i
contenuti del repository.
si pu`
o usare al posto di baseurl per indicare un file che contiene
una lista di URL.
la URL da cui scaricare la chiave pubblica GPG per la verifica
di autenticit`
a del pacchetto.
una lista, separata da spazi, di pacchetti da non prendere in considerazione anche se presenti, supporta anche luso dei caratteri
jolly del filename globbing.
consente di disabilitare il repository se posto a 0, il valore di
default `e 1.

Tabella 4.11: Principali opzioni usabili per le sezioni che identificano un repository.

Ciascuna sezione dovr`


a poi contenere le opzioni che consentono di utilizzare il repository da
essa identificato, la principale di queste `e baseurl, che prende come argomento la URL a cui `e
possibile raggiungere i contenuti del repository.51 Oltre a questa si sono riportate le altre opzioni
49

questa directory pu`


o essere modificata tramite un opportuno valore per la direttiva reposdir nella sezione
main di yum.conf.
50
corrispondenti rispettivamente ai pacchetti di base, agli aggiornamenti, e ad una serie di diverse estensioni e
pacchetti aggiuntivi.
51
le forme supportate sono http:// per laccesso HTTP, ftp:// per laccesso FTP e file:// per laccesso su
una directory locale.

4.2. LA GESTIONE DEI PACCHETTI SOFTWARE

203

principali in tab. 4.11; come al solito per i dettagli si consulti la pagina di manuale.

4.2.3

Il sistema di gestione dei pacchetti APT

Uno dei punti di forza di Debian `e il sistema di gestione dei pacchetti creato da questa distribuzione; il sistema si chiama APT, sigla che sta per Advanced Package Tool. Anche in questo
caso c`e un programma di base per la gestione dei singoli pacchetti, con funzionalit`a analoghe a
quelle di rpm, questo per`
o `e solo una parte di una infrastruttura molto pi`
u ampia, che consente
una gestione semplice e funzionale dellinstallazione di pacchetti software.
I pacchetti Debian sono distribuiti in file con lestensione .deb ed anchessi seguono una
precisa convenzione relativa ai nomi che in questo caso sono composti da pi`
u parti tutte separate
dal carattere _. La prima parte indica il nome del pacchetto stesso, e pu`o essere anche composta
di pi`
u parole. Segue la versione del pacchetto che `e composta da due parti separate da un : il numero di versione del software originale, ed il numero di revisione che marca le diverse
versioni del pacchetto stesso. Infine segue larchitettura per cui il pacchetto `e stato realizzato e
lestensione, in sostanza si avr`
a un nome del tipo:
logrotate_3.7.1-3_i386.deb
Il programma di base analogo a rpm `e dpkg,52 e fornisce le stesse funzionalit`a: installa e
rimuove pacchetti mantenendo un database dei pacchetti e dei relativi file installati, provvede
allesecuzione di script in fase di installazione e rimozione, `e in grado di accorgersi di eventuali
conflitti con pacchetti gi`
a installati, e delle dipendenze da altri pacchetti, pu`o interrogare il
database dei pacchetti e ottenere informazioni sul loro contenuto.
Le opzioni principali del programma sono -i, che esegue linstallazione di un file .deb, e -r,
che rimuove un pacchetto dal sistema. Con -l se non si specifica nulla viene stampata la lista
dei pacchetti installati, se si specifica un nome viene ricercata la presenza di un pacchetto con
quel nome. Con -L si pu`
o stampare la lista dei file contenuti nel pacchetto e con -S quella dei
pacchetti che contengono un file corrispondente alla stringa passata come parametro. Le altre
opzioni principali sono riportate in tab. 4.12. Al solito le istruzioni complete e tutte le altre
opzioni sono descritte nella pagina di manuale.
Opzione
-i
-r
-l
-L
-S
-s
-p
-I
-c

Significato
installa il pacchetto.
rimuove il pacchetto.
interroga il database per la presenza di un pacchetto.
stampa i file contenuti in un pacchetto.
ricerca i pacchetti che contengono un file.
stampa lo stato di un pacchetto.
stampa informazioni su un pacchetto installato.
stampa informazioni su un .deb.
stampa il contenuto di un .deb.

Tabella 4.12: Principali opzioni del comando dpkg.

Benche ormai anche i .deb risultino piuttosto usati, dato che sono diventate parecchie le
distribuzioni basate su Debian, la loro diffusione su Internet come file singoli `e piuttosto ridotta.
Questo avviene proprio perche dpkg costituisce soltanto la parte di basso livello del sistema
di gestione dei pacchetti di Debian, per cui `e piuttosto raro dover usare questo comando per
installare un pacchetto.
Come accennato infatti uno dei grandi vantaggi di questa distribuzione, e di quelle che usano
lo stesso sistema di gestione, `e costituito dalla interfaccia di alto livello costituita da APT, che
permette di dimenticarsi completamente del problema delle dipendenze. I pacchetti Debian
52

in realt`
a dpkg `e nato prima di rpm, per cui forse sarebbe pi`
u corretto dire che rpm `e analogo a dpkg.

204

CAPITOLO 4. AMMINISTRAZIONE ORDINARIA DEL SISTEMA

infatti sono stati organizzati praticamente da sempre per indicare in maniera coerente da quali
altri pacchetti essi dipendono. Diventa cos` possibile richiedere linstallazione automatica non
solo di un singolo pacchetto, ma anche di tutti quelli da cui questo dipende. Inoltre in genere i
pacchetti vengono distribuiti direttamente via rete, con una modalit`a che permette il download
automatizzato degli stessi.
Il programma di gestione principale per i pacchetti Debian non `e allora dpkg, ma apt-get,
che serve appunto da front-end per tutto il sistema dellAdvanced Package Tool. Ad esso si `e
aggiunto, ed `e indicato come nuovo default, il comando aptitude, che oltre a funzionare a riga
di comando fornisce anche una interfaccia testuale semi-grafica. Dato che apt-get fornisce in
sostanza un sottoinsieme delle funzionalit`
a di aptitude, parleremo prima di lui.
Per il corretto funzionamento del sistema di APT `e fondamentale mantenere una lista delle
necessarie fonti dei pacchetti (i repository) nel file /etc/apt/sources.list.53 Il formato del
file sources.list prevede una serie di righe formate da campi divisi da spazi, ciascuna delle
quali indica una fonte di pacchetti. Il primo campo indica il tipo di pacchetti presenti in quel
repository; originariamente i soli valori possibili erano deb e deb-src, per indicare rispettivamente pacchetti binari e sorgenti. Il sistema di APT per`o `e stato portato anche su distribuzioni
basate su RPM, sulle quali `e possibile utilizzare per questo campo il valore rpm.
Il campo successivo `e una URI per laccesso al repository che indica la base del rispettivo
archivio. Come accennato laccesso pu`
o essere effettuato in modalit`a diverse, le principali delle
quali sono indicate con le URI riportate in tab. 4.13, a cui dovr`a seguire la opportuna specificazione della posizione del repository. Di queste queste lunica che necessita di una cura particolare
`e quella relativa ai pacchetti messi su un CDROM, che deve essere creata con il programma aptcdrom,54 che si incarica di indicizzare il contenuto di un CD e generare la relativa voce, cos` da
evitare problemi qualora si cambiasse disco nel lettore.55
URI
file:
cdrom:
http:
ftp:

Significato
accede ai pacchetti posti in una directory locale (o anche
remota se si usa NFS, vedi sez. 8.4.2).
accede ai pacchetti su un CDROM, una voce di questo
tipo deve essere creata con lausilio di apt-cdrom.
un ordinario riferimento ad un sito web.
un ordinario riferimento ad un sito FTP.

Tabella 4.13: Principali formati delle URI usate in sources.list.

I campi successivi prevedono due diverse sintassi. La prima `e quella in cui si specifica in
un unico campo il pathname della directory in cui si trovano i pacchetti, cos` come viene vista
relativamente alla base specificata con la URI del secondo campo. In questo caso il campo deve
essere obbligatoriamente terminato dal carattere / per distinguerlo dallaltra sintassi. Si usa
in genere questa forma per dei repository elementari in cui tutti i pacchetti sono stati inseriti in
una unica directory.
Nella seconda sintassi il terzo campo indica invece il nome associato alla versione della
distribuzione che si sta usando. Per Debian `e sempre possibile usare i nomi generici stable,
testing ed unstable ad indicare rispettivamente la versione stabile, quella di test e quella
di sviluppo; a ciascuno di questi viene anche associato un nome proprio, che per unstable `e
53

le versioni pi`
u recenti di APT prevedono anche luso della directory /etc/apt/sources.list.d/ dove si
possono indicare fonti aggiuntive; in tal caso `e sufficiente inserire in questa directory un file con lestensione .list
e lo stesso formato di sources.list, ed il suo contenuto sar`
a utilizzato come se lo si fosse incluso in questultimo.
54
se si `e installato da un CD la corrispondente voce sar`
a gi`
a stata creata.
55
per luso del comando si pu`
o consultare la pagina di manuale, ma in generale tutto quello che c`e da fare `e
inserire il CD nel lettore ed eseguire il comando apt-cdrom add, in seguito quando `e richiesta linstallazione di un
pacchetto dal CD sar`
a lo stesso apt-get a richiederne linserimento nel lettore.

4.2. LA GESTIONE DEI PACCHETTI SOFTWARE

205

sempre sid, mentre per le altre varia da rilascio a rilascio.56 A questo segue almeno un campo
aggiuntivo che indica la sezione del repository a cui si vuole avere accesso; nel caso di Debian le
sezioni sono tre e cio`e main, contrib e non-free.57
Quando si usa questa seconda sintassi, che `e quella usata di default per i repository ufficiali
dalle distribuzioni che usano APT, si fa riferimento a dei repository pi`
u strutturati, in cui
i pacchetti sono opportunamente organizzati in opportune directory.58 Si noti anche come in
nessuno dei due casi si sia fatto riferimento alla architettura hardware per la quale sono compilati
i pacchetti binari; con la prima sintassi questo avviene perche i repository specificati in quella
forma non supportano luso di architetture multiple, per cui si deve avere cura di indicarne
con pacchetti adatti alla propria. Nel secondo caso invece non `e necessario perche la scelta dei
pacchetti corretti viene fatta in maniera automatica.
Si tenga presente che `e possibile indicare anche diversi repository, sia per indicare fonti
aggiuntive di pacchetti,59 che eventuali mirror per poter scaricare da diverse fonti gli stessi
pacchetti per una maggiore disponibilit`a degli stessi; in questultimo caso si tenga conto che la
scansione avviene in ordine sequenziale, per cui `e opportuno mettere prima quelle pi`
u vicine. Un
esempio del file sources.list, tratto dalla versione installata su una Debian Etch, `e il seguente:
#deb cdrom:[Debian GNU/Linux testing _Etch_ - Official Beta i386 NETINST Binary1 20070317-20:46]/ etch contrib main
deb http://ftp.it.debian.org/debian/ etch main contrib
deb-src http://ftp.it.debian.org/debian/ etch main contrib
deb http://security.debian.org/ etch/updates main contrib
deb-src http://security.debian.org/ etch/updates main contrib

dove, sia per i pacchetti binari che per i sorgenti, `e stato indicato un mirror italiano dei repository
ufficiali di Debian, ed il repository speciale relativo agli aggiornamenti di sicurezza.
Una volta impostati i vari repository il comando che consente di operare sui pacchetti `e,
come accennato, apt-get. Questo prende sempre come primo argomento una parola chiave che
indica loperazione da eseguire, seguito da eventuali altri argomenti, quando previsti. Si tenga
presente che in generale, per evitare pericolosi intrecci, `e possibile eseguire una sola istanza alla
volta di apt-get o di qualunque altro programma che operi sulla installazione dei pacchetti.
Se pertanto `e gi`
a in corso una operazione sui pacchetti apt-get si bloccher`a notificando che il
sistema di gestione di APT `e in gi`
a in uso.
In generale il primo passo da fare per operare con apt-get `e eseguire il comando apt-get
update per scaricare una lista aggiornata di tutti i pacchetti disponibili. Sar`a possibile poi
installare un pacchetto qualunque con il comando apt-get install nomepacchetto, dove il
nome del pacchetto corrisponde alla prima parte (quella che precede il primo _) del nome del
file che lo contiene. Il programma si incaricher`a di effettuare automaticamente il download dello
stesso e di quelli necessari per soddisfare eventuali dipendenze, per poi procedere ad installare
il tutto. Qualora invece si voglia reinstallare in pacchetto gi`a installato, si dovr`a aggiungere
lopzione --reinstall.
Il comando gestisce anche eventuali conflitti, se ad esempio si cerca di installare un pacchetto
che fornisce in maniera alternativa lo stesso servizio di un altro occorrer`a prima rimuovere
56

i nomi vengono presi dai personaggi del film Toy Story, al momento della scrittura di queste dispense la
versione stabile `e etch mentre quella di test `e lenny.
57
sia il nome della versione, che le sezioni in cui essa `e divisa, dipendono dalla distribuzione; ad esempio con
Ubuntu, al momento della stesura di queste note, la versione corrente `e hardy, mentre le sezioni utilizzate sono
main, restricted, universe e multiverse.
58
i dettagli di tutto ci`
o vanno oltre lo scopo di questo testo, gli interessati possono consultare il capitolo 4
di [DebSys].
59
nel caso di Debian oltre al repository dei pacchetti ordinari si usa indicare anche quello degli aggiornamenti,
su cui vengono inseriti tutti i pacchetti rilasciati per chiudere bug di sicurezza, che `e mantenuto centralmente dal
security team del progetto.

206

CAPITOLO 4. AMMINISTRAZIONE ORDINARIA DEL SISTEMA

questultimo. In questo caso, ed anche tutte le volte che `e necessario installare altri pacchetti a
causa delle dipendenze, il comando si ferma indicando quali pacchetti intende installare e quali
rimuovere, e chiede una conferma prima di procedere nelle sue operazioni.
Si tenga presente poi che oltre alla installazione, nel sistema di gestione dei pacchetti Debian
`e integrato anche un meccanismo per lauto-configurazione dei programmi (chiamato debconf )
che fornisce una interfaccia generica con cui richiedere allamministratore le informazioni necessarie per generare automaticamente una configurazione corretta o notificargli eventuali azioni
necessarie per completare la configurazione.60 Questo risulta molto utile in caso di installazione
di programmi di servizio, dato che in questo modo APT non solo installa il pacchetto, ma lo
configura e rende immediatamente attivo. Pertanto la procedura di installazione pu`o venire
sospesa in attesa di una risposta da parte dellamministratore.61
Qualora si voglia rimuovere un pacchetto il comando `e apt-get remove nomepacchetto, ed
in questo caso, se altri pacchetti dipendono da quello che si vuole rimuovere, il comando chiede
conferma della volont`
a di rimuovere anche loro, ed in caso affermativo procede alla rimozione
anche di questi. Una delle caratteristiche di Debian `e che la rimozione di un pacchetto non
comporta normalmente la rimozione dei relativi file di configurazione, che potrebbero tornare
utili in una successiva reinstallazione. Se si vuole rimuovere definitivamente anche tutte le
configurazioni occorre aggiungere al precedente comando lopzione --purge.
Infine il sistema di APT consente una estrema facilit`a di aggiornamento del sistema, basta infatti usare il comando apt-get upgrade dopo aver usato apt-get update per ottenere
automaticamente laggiornamento a eventuali nuove versioni presenti sui repository di tutti i
pacchetti che sono gi`
a installati nel sistema. Il comando per`o non esegue mai un aggiornamento se questo comporta linstallazione di pacchetti aggiuntivi o la rimozione di un pacchetto
gi`a presente dal sistema, anche quando questo verrebbe sostituito da una diversa versione pi`
u
62
aggiornata.
Per risolvere questo tipo di situazioni, che nelluso di una versione stabile si incontrano soltanto quando si passa una versione alla successiva, si deve usare il comando apt-get dist-upgrade
che esegue una risoluzione intelligente dei conflitti ed `e in grado di effettuare laggiornamento
dei pacchetti principali a scapito di quelli secondari, accorgersi delle sostituzioni di pacchetti,
installare le parti che mancano, ecc. Qualora si usi una versione di test o di sviluppo (cio`e
testing o unstable) la situazione descritta invece `e comune e capita spesso di doverlo usare.
In tal caso si ponga attenzione alle eventuali rimozioni proposte che vengono sempre indicate
dal comando, il quale prima di operare chiede conferma mostrando i pacchetti che installer`a e
quelli che rimuover`
a; in caso di errori nei pacchetti (che in versioni di sviluppo si verificano con
una certa frequenza) si potrebbe rischiare di rimuovere parti essenziali per il funzionamento di
altri pacchetti.
Altre operazioni di apt-get riguardano la gestione dellarchivio dei pacchetti scaricati, che
normalmente vengono mantenuti in una apposita directory (/var/cache/apt/archive) cos` che
non ci sia da riscaricarli qualora si debbano reinstallare. Le principali operazioni di apt-get
sono riportate in tab. 4.14, lelenco completo, insieme alla descrizione dettagliata di tutte le
caratteristiche del comando, `e al solito disponibile nella relativa pagina di manuale.
60

il meccanismo `e realizzato dallomonimo pacchetto debconf, che pu`


o essere opportunamente configurato per
richiedere un quantitativo maggiore o minore di dettagli, fino allestremo di non fare chiedere nulla e generare un
default generico (probabilmente non funzionante); si tenga presente che il sistema `e opzionale e non `e detto che
sia utilizzato da tutti i pacchetti.
61
una altra caratteristica di debconf `e che pu`
o essere configurata la modalit`
a con cui viene eseguita la richiesta,
il default `e utilizzare una interfaccia semi-grafica a terminale, ma esistono varie alternative.
62
in genere il problema si presenta per librerie o per programmi che vengono suddivisi in pi`
u parti, in tal caso
se cambia il numero di versione della libreria cambia il nome del relativo pacchetto, mentre pu`
o non cambiare il
nome del pacchetto che la usa, oppure un pacchetto pu`
o essere spezzato in pi`
u parti e quello originario non esiste
pi`
u e devono essere installate tutte le varie parti.

4.2. LA GESTIONE DEI PACCHETTI SOFTWARE


Operazione
install
remove
update
upgrade
dist-upgrade
clean
autoclean

207

Significato
installa un pacchetto.
rimuove un pacchetto.
scarica la lista aggiornata dei pacchetti.
esegue laggiornamento dei pacchetti installati.
esegue laggiornamento della distribuzione.
cancella larchivio dei pacchetti scaricati.
cancella dallarchivio le vecchie versioni dei pacchetti scaricati.

Tabella 4.14: Principali operazioni dei comandi apt-get e aptitude.

Il comando supporta inoltre alcune opzioni generiche, oltre le gi`a citate --reinstall e -purge che sono specifiche delloperazione install. In particolare con -d si pu`o richiedere
che i pacchetti necessari per una operazione siano soltanto scaricati, mentre con -f `e possibile
richiedere un tentativo di correzione in caso di sistema in cui le dipendenze sono state spezzate
(ad esempio da un aggiornamento interrotto), per i dettagli si consulti al riguardo la pagina di
manuale.
Le operazioni di tab. 4.14 sono utilizzate anche dal comando aptitude, che viene ormai
considerato da Debian come il programma ufficialmente deputato alla gestione dei pacchetti
con APT. Come accennato il programma presenta il vantaggio di poter essere utilizzato in una
interfaccia semigrafica a terminale, cui si accede invocandolo senza nessun argomento, in tal caso
si otterr`a una schermata come quella illustrata in fig. 4.1, da cui si potranno dare i vari comandi
(ed utilizzare pure un help in linea).

Figura 4.1: Schermata di avvio di aptitude.

In generale per`
o aptitude pu`
o essere usato da riga di comando in maniera analoga ad
apt-get, fintanto che si usano le operazioni di base illustrate in tab. 4.14. Il comando per`
o
non `e totalmente equivalente, infatti le opzioni --purge e --reinstall non esistono e sono
state trasformate in omonime operazioni separate. Inoltre le operazioni di aggiornamento, pur
mantenendo per compatibilit`
a lo stesso nome, sono pi`
u sofisticate e ad esempio con upgrade
pacchetti non presenti possono essere installati per risolvere le dipendenze, e possono essere
disinstallati pacchetti non utilizzati.
Inoltre il programma consente una gestione pi`
u raffinata degli aggiornamenti, ad esempio
con loperazione hold si pu`
o bloccare indefinitamente laggiornamento di un pacchetto, fintanto

208

CAPITOLO 4. AMMINISTRAZIONE ORDINARIA DEL SISTEMA

che questo non viene sbloccata con unhold. In tab. 4.15 si sono riportate alcune operazioni
specifiche di aptitude, per tutti i dettagli (il comando `e estremamente potente e supporta un
gran numero di operazioni) si pu`
o di nuovo consultare la pagina di manuale o il manuale utente,
la cui versione testuale `e disponibile nel file /usr/share/doc/aptitude/README.
Operazione
hold
unhold
purge
reinstall
forbid-version
safe-upgrade
full-upgrade
search
show

Significato
blocca laggiornamento di un pacchetto.
sblocca laggiornamento di un pacchetto.
rimuove un pacchetto e le sue configurazioni.
forza la reinstallazione di un pacchetto.
evita laggiornamento per una certa versione.
equivalente di upgrade.
equivalente di dist-upgrade.
esegue una ricerca sul database dei pacchetti.
mostra le informazioni su un pacchetto.

Tabella 4.15: Principali operazioni specifiche di aptitude.

Oltre alla gestione dellinstallazione dei pacchetti aptitude consente anche di eseguire delle
interrogazioni sul database dei pacchetti per ottenere delle informazioni riguardo gli stessi. In
realt`a a tale scopo `e presente anche un comando dedicato, apt-cache, che presenta funzionalit`a molto pi`
u estese. Il funzionamento del programma `e simile agli altri e prevede un primo
argomento che indica loperazione da eseguire.
Si pu`o allora effettuare una ricerca di un testo qualunque nella descrizione dei pacchetti con il
comando apt-cache search testo, in cui il secondo argomento costituisce il testo da cercare,63
si possono in questo caso passare anche pi`
u argomenti successivi e verr`a eseguita una ricerca sulla
presenza di tutti quanti. Una seconda operazione comune `e apt-cache show pacchetto che
consente di ottenere le caratteristiche del pacchetto, secondo quanto scritto nella sua descrizione,
ad essa si affiancano altre operazioni, citate in tab. 4.16, che consentono di richiede informazioni
sulle dipendenze.
Operazione
search
show
policy
depends
rdepends
showpkg

Significato
esegue una ricerca sulle descrizioni dei pacchetti con le espressioni
regolari passate come argomenti.
mostra le informazioni relative alle caratteristiche del pacchetto passato
come argomento.
stampa le priorit`
a associate a ciascun pacchetto passato come
argomento ed i repository da cui esso pu`
o essere ottenuto.
stampa la lista dei pacchetti da cui dipende il pacchetto passato come
argomento (dipendenze dirette).
stampa la lista dei pacchetti che dipendono dal pacchetto passato come
argomento (dipendenze inverse).
stampa la versione e tutte le informazioni riguardo dipendenze dirette
ed inverse del pacchetto passato come argomento.
Tabella 4.16: Principali operazioni di apt-cache.

Le principali operazioni di apt-cache sono state riassunte in tab. 4.16, e come al solito si
pu`o ottenere lelenco completo dalla pagina di manuale del comando. Fra quelle riportate vale
la pena evidenziare apt-cache policy, che consente di ottenere le priorit`a delle varie versioni
di un pacchetto e lelenco dei repository da cui esso `e disponibile, perche questo ci consente di
introdurre una funzionalit`
a molto utile di APT che viene utilizzata spesso.
Uno dei problemi che si pu`
o avere con una distribuzione `e che i pacchetti distribuiti ufficialmente dalla stessa possono non essere molto aggiornati; questo `e particolarmente comune
con Debian che segue la politica di non aggiornare mai la versione dei pacchetti presenti nella
63

in realt`
a largomento viene utilizzato come espressione regolare.

4.3. LA GESTIONE DI UTENTI E GRUPPI

209

distribuzione stabile,64 se non per inserire correzioni di sicurezza, riportate indietro per`o sulla
versione del pacchetto presente nella distribuzione. In questo modo si evita lintroduzione di
eventuali nuovi errori o cambiamenti di comportamento che si potrebbero avere in una versione
successiva, ottenendo il massimo della stabilit`a, a scapito per`o delluso di funzionalit`a presenti
nelle versioni pi`
u recenti.
Esistono per`
o alcune situazioni in cui sono essenziali delle funzionalit`a presenti soltanto
nella versione pi`
u recente di un certo pacchetto; per questo `e possibile fare riferimento ad altri
repository oltre quelli ufficiali, da cui ottenere una versione aggiornata.65 In tal caso si tratta
di aggiungere le opportune fonti in sources.list, e quello che succede `e che APT installer`
a la
versione pi`
u recente fra quella dei pacchetti disponibili. In situazioni come queste luso di aptcache policy `e daiuto per capire quale versione del pacchetto si installa e da quale repository.
Un ultimo aspetto importante del sistema di gestione dei pacchetti di Debian `e che, come accennato, esso fornisce, con debconf, un meccanismo generico per lauto-configurazione degli stessi.
Questo non solo consente di richiedere (e memorizzare) le eventuali informazioni necessarie per
la configurazione automatica attraverso una interfaccia generica, ma fornisce anche delle funzionalit`a aggiuntive, come il fatto che aggiornando un pacchetto possa essere automaticamente
aggiornata anche la sua configurazione.66
In generale le informazioni necessarie per la configurazione vengono richieste quando si installano i pacchetti ed i relativi file di configurazione vengono generati automaticamente, pu`
o
capitare per`
o che si voglia riconfigurare il pacchetto in un secondo tempo. A tale scopo viene
fornito il comando dpkg-reconfigure che consente di ripetere questa procedura, rieseguendo
anche la richiesta delle eventuali informazioni e rigenerando la configurazione.
Il comando prende come argomento il pacchetto o i pacchetti che si vogliono riconfigurare,
o lopzione -a qualora li si vogliano riconfigurare tutti (cosa in genere non necessaria). Inoltre,
dato che il sistema di debconf supporta un sistema di priorit`a delle domande che consente di
evitare quelle al di sotto della priorit`a scelta,67 si pu`o usare lopzione -p per forzare luso di una
priorit`a diversa. Al solito per tutti i dettagli si consulti la pagina di manuale.

4.3

La gestione di utenti e gruppi

Tratteremo in questa sezione la gestione degli utenti e dei gruppi presenti nel sistema: vedremo
i comandi utilizzati per crearli, eliminarli, e impostarne attributi e propriet`a ed esamineremo
le modalit`
a con cui configurare le procedure di accesso al sistema, lautenticazione e luso delle
risorse assegnate agli utenti.

4.3.1

Una visione generale

Dato che GNU/Linux `e un sistema multiutente abbiamo finora dato per scontato la presenza di
utenti che potessero utilizzarlo. In realt`a la questione non `e affatto cos` immediata. Il kernel
infatti supporta la presenza di utenti e gruppi associando a questi degli identificatori numerici
64
la scelta non `e solo di Debian, anche RedHat segue una politica simile con la sua RHEL, perche in ambito
professionale la stabilit`
a `e un requisito fondamentale, e dover aggiornare le macchine ogni sei mesi `e un grave
problema, non un vantaggio.
65
in particolare per Debian `e estremamente comodo il repository di backports.org che contiene versioni pi`
u
recenti di molti pacchetti ricompilati per essere usati nella versione stabile senza dover installare niente altro che
il pacchetto stesso.
66
questo avviene soltanto se non si sono fatte modifiche manuali alla configurazione originale, in caso contrario
il sistema chiede cosa fare, consentendo anche di visualizzare le differenze fra nuova e vecchia configurazione; in
questo modo `e possibile effettuare una scelta, inoltre in caso di cambiamento viene sempre salvata una copia
del precedente file di configurazione (come .dpkg-old) se si `e deciso di installare il nuovo, o del nuovo (come
.dpkg-dist) se si `e deciso di mantenere il vecchio.
67
che si imposta appunto con dpkg-reconfigure debconf.

210

CAPITOLO 4. AMMINISTRAZIONE ORDINARIA DEL SISTEMA

che poi vengono usati nella gestione dei processi e dei file, ma come abbiamo abbondantemente
ripetuto in sez. 1.1 tutta la gestione del sistema, compresa quella che permette il riconoscimento
e laccesso agli utenti, viene realizzata da appositi programmi.
Questo vale in particolare anche, come accennato in sez. 1.1.2, per quella procedura di
collegamento al sistema che porta ad avere dei processi che vengono eseguiti dal kernel per conto
di un certo utente. Perche questa sia effettuata per`o occorrono le opportune informazioni che
permettano ai vari programmi che gestiscono la procedura (come login) di sapere quali utenti
ci sono, come riconoscerli e quali risorse assegnargli.
Questo ci porta ad una delle caratteristiche fondamentali di un qualunque sistema multitutente: il concetto di account. Come avviene per una banca, per poter utilizzare il sistema si
deve avere un conto presso di lui, che ci conceda laccesso e luso delle risorse. Ovviamente
perche questo accada non solo occorrer`
a, come accennavamo in sez. 1.4.1, che un utente si identifichi appropriatamente, ma dovranno anche essere identificate le risorse che gli si mettono a
disposizione.
Una delle parti pi`
u critiche dellamministrazione del sistema `e allora quella che permette
di creare e mantenere le informazioni relative agli account degli utenti presenti, che dovranno
contenere sia le informazioni necessarie allidentificazione degli stessi che quelle relative alle
risorse messe loro a disposizione.
Tradizionalmente in un sistema unix-like lautenticazione degli utenti viene fatta utilizzando
un username, che `e il nome che il sistema associa allutente, ed una password segreta la cui
conoscenza serve a dimostrare lautenticit`a della propria identit`a. Come accennato in sez. 1.4.1
il sistema prevede anche la presenza di gruppi di utenti, che a loro volta vengono identificati da
altri nomi (i groupname).68 Inoltre, come visto in sez. 1.2.2, ogni utente ha a disposizione una
home directory per i propri file, e quando si collega al sistema gli viene messa a disposizione una
shell, la shell di login, come illustrato in sez. 2.1.6. Tutte queste informazioni ed altre ancora
sono quelle che vengono mantenute ed utilizzate dai programmi per la gestione di utenti e gruppi.
Infine si tenga presente che utenti e gruppi vengono utilizzati dal sistema non solo per gestire
gli account delle persone fisiche che utilizzano il sistema, ma anche per associare una identit`a
ad alcuni servizi: ad esempio molti programmi server vengono eseguiti per conto di un utente a
loro riservato; questo permette di mantenere separati i loro file rispetto a quelli di altri servizi e
di non dare loro privilegi amministrativi,69 aumentando la sicurezza del sistema.
Si ricordi infatti che dal punto di vista del kernel esistono solo gli identificatori numerici
di utenti e gruppi illustrati in sez. 1.4.1; che uno di questi sia associato ad un utente fisico, o
semplicemente utilizzato da un programma di servizio per il kernel `e del tutto indifferente,70 e
sta ai programmi di gestione degli utenti stabilire una politica che allochi opportunamente gli
identificatori.
Nelle prime versioni di Unix tutte le informazioni relative agli utenti ed ai gruppi presenti
nel sistema erano memorizzate su due file, /etc/passwd e /etc/group, che tratteremo meglio
in sez. 4.3.2. Dato che questi, come tutti i file di configurazione del sistema, sono file di testo,
in teoria non ci sarebbe nessuna necessit`
a di programmi specifici per la loro gestione, visto che
possono essere modificati a mano con un qualunque editor.71
68

si ricordi che il kernel conosce solo degli identificativi numerici, i nomi degli utenti e dei gruppi sono informazioni disponibili solo in user-space, proprio per la presenza di un sistema di gestione degli stessi, il Name Service
Switch, che abbiamo gi`
a incontrato brevemente in sez. 4.3.6.
69
nella maggior parte dei casi questi, quando servono, sono garantiti solo allavvio del servizio, ed eliminati non
appena non sono pi`
u necessari.
70
lunica differenza che il kernel riconosce fra i vari utenti `e quella fra lamministratore e gli altri.
71
cosa che in certi casi `e comunque utile saper fare, ad esempio per togliere una password di amministratore
dal sistema contenuto in un disco montato a mano usando un sistema di recupero, poiche in quel caso i comandi
andrebbero ad operare sulla configurazione del sistema di recupero, e non di quello che si vuole riparare.

4.3. LA GESTIONE DI UTENTI E GRUPPI

211

Nei sistemi moderni per`


o il meccanismo di gestione di utenti e gruppi `e stato completamente modularizzato attraverso sia luso del Name Service Switch (vedi sez. 4.3.6) che di PAM
(Pluggable Authentication Modules, vedi sez. 4.3.7). In questo modo `e possibile mantenere le
informazioni ed effettuare i relativi controlli usando i supporti pi`
u disparati (server NIS, vari
database, server LDAP, ecc.), e quindi in generale non `e pi`
u possibile andare ad effettuare le
modifiche a mano con un editor; luso di un supporto modulare per`o fa s` che in molti casi si possano utilizzare buona parte degli stessi comandi che in origine operavano solo sui file di testo in
maniera trasparente rispetto al meccanismo con cui sono effettivamente gestite le informazioni.

4.3.2

Il database di utenti e gruppi

Nelle prime versioni di Unix tutte le informazioni relative ad utenti e gruppi venivano mantenute
in due soli file: /etc/passwd e /etc/group. In seguito, con lintroduzione delle shadow password,
ne sono stati aggiunti altri due: /etc/shadow e /etc/gshadow. Infine con luso di PAM (trattato
in sez. 4.3.7) e del Name Service Switch (trattato in sez. 4.3.6) `e divenuto possibile utilizzare i
supporti pi`
u vari. A tuttoggi per`
o la modalit`a pi`
u comune per mantenere il database degli utenti
e dei gruppi presenti su un sistema GNU/Linux resta quella di scrivere le relative informazioni
sui file di testo appena citati, che sono quelli che tratteremo in questa sezione.
Fin dalle prime versioni di Unix la lista degli utenti viene mantenuta nel file /etc/passwd,
chiamato cos` perche al suo interno venivano memorizzate anche le password. Il formato di
/etc/passwd `e molto semplice, per ogni utente deve essere presente una riga composta da 7
campi separati dal carattere : e non sono ammessi ne commenti ne righe vuote. Il significato
dei sette campi `e il seguente:
1.
2.
3.
4.
5.

il nome dellutente (lusername).


password cifrata (opzionale).
luser ID (vedi sez. 1.4.1) dellutente
il group ID del gruppo principale dellutente.
nome e cognome dellutente ed eventuali altri campi di commento separati da virgole;
questo campo `e detto anche Gecos.72
6. home directory dellutente (indicata con un pathname assoluto).
7. shell di login dellutente.
Tutti i dettagli relativi al formato ed al significato dei vari campi di /etc/passwd, ed in
particolare a quello del Gecos, si trovano sulla relativa pagina di manuale, accessibile con man 5
passwd. Un esempio del contenuto di questo file `e il seguente:
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/bin/sh
bin:x:2:2:bin:/bin:/bin/sh
sys:x:3:3:sys:/dev:/bin/sh
sync:x:4:100:sync:/bin:/bin/sync
games:x:5:100:games:/usr/games:/bin/sh
man:x:6:100:man:/var/cache/man:/bin/sh
...
piccardi:x:1000:1000:Simone Piccardi,,,:/home/piccardi:/bin/bash
...

Lelenco dei gruppi viene invece mantenuto nel file /etc/group; il suo formato `e analogo
a quello di /etc/passwd: un gruppo per linea senza commenti e righe vuote. In per`o questo
caso i campi presenti sono soltanto quattro, sempre separati dal carattere :, ed indicano
rispettivamente:
72

per maggiori informazioni sul significato di questa sigla si pu`


o consulti http://en.wikipedia.org/wiki/
Gecos.

212
1.
2.
3.
4.

CAPITOLO 4. AMMINISTRAZIONE ORDINARIA DEL SISTEMA


il nome del gruppo (il cosiddetto groupname).
la password del gruppo (si veda sez. 4.3.3).
il group ID (vedi sez. 1.4.1) del gruppo
la lista degli username degli utenti appartenenti al gruppo, separati da virgole.

Come per /etc/passwd si possono trovare tutti i dettagli sul formato ed il significato dei
campi di /etc/group nella rispettiva pagina di manuale, accessibile con man group; un esempio
del contenuto di questo file `e il seguente:
root:x:0:
daemon:x:1:
bin:x:2:
sys:x:3:
adm:x:4:
tty:x:5:piccardi,admin
...
piccardi:x:1000:
...

Si noti come in /etc/group non vengano riportati come membri di un gruppo gli utenti
che hanno lo stesso come gruppo principale. Questa informazione infatti viene mantenuta in
/etc/passwd, mentre qui vengono riportati solo gli utenti che hanno quel gruppo come gruppo
ausiliario. Si noti inoltre come in entrambi gli esempi sia presente una x nel campo dedicato
alla password; questo indica che nel caso sono attive le shadow password, su cui torneremo fra
poco.
In genere per modificare i dati di questi file si possono utilizzare gli opportuni comandi di
gestione, che vedremo in sez. 4.3.3; trattandosi di file di testo `e comunque possibile effettuare
interventi di emergenza anche con un semplice editor. Uno di questi potrebbe essere, qualora di
fosse persa la password di root e non si riuscisse pi`
u ad entrare nel sistema, quello di far ripartire
il computer con un CD di recupero o una distribuzione live e, montato il disco, togliere la x
lasciando vuoto il campo della password. Lassenza di un campo per la password infatti fa s`
che questa non venga pi`
u richiesta, e al successivo riavvio si potr`a cos` entrare nel sistema per
ripristinarla senza doversi autenticare.
Ovviamente, dato che la creazione di utenti e gruppi `e un compito riservato allamministratore, entrambi i file devono appartenere a root ed essere protetti da scrittura. Essi per`o devono
poter essere letti da chiunque, perche le informazioni mantenute in questi file sono quelle che
vengono usate da tutti i programmi (ad esempio anche da ls e ps) per tradurre gli identificativi
numerici del group ID e delluser ID usati dal kernel nei corrispondenti username e groupname.
Il fatto che questi file siano leggibili da tutti pu`o fare legittimamente sorgere il dubbio di come
questo si possa conciliare con il fatto che vi vengano mantenute delle password che si suppone
debbano restare segrete. Questo `e possibile perche le password non sono mai memorizzate in
chiaro; il testo della password non viene scritto da nessuna parte nel sistema, quello che viene
memorizzato `e solo il risultato della cifratura della password, cio`e quello che si chiama un hash
crittografico.
Tutte le volte che si richiede una autenticazione quello che il sistema fa `e semplicemente
ricalcolare questo valore per la password che gli si fornisce e verificare che coincida con quello
memorizzato.73 Dato che solo se si `e fornita la password originaria si potr`a riottenere lo stesso
risultato, in caso di coincidenza si `e ottenuta lautenticazione. Siccome poi, se il meccanismo
73
in realt`
a la procedura `e leggermente pi`
u complessa perche per evitare che a password uguali corrispondano
cifrature uguali ad esse viene aggiunto un valore casuale, detto salt, che serve a differenziarle in modo che due
utenti non si possano accorgere di avere la stessa password; questo salt viene memorizzato insieme alla cifratura
e riutilizzato nella verifica.

4.3. LA GESTIONE DI UTENTI E GRUPPI

213

crittografico utilizzato `e valido, `e praticamente impossibile risalire dal valore cifrato alla password
originale,74 il rendere leggibile questultimo non veniva ritenuto un problema.
Benche lalgoritmo crittografico con cui si calcolano le password sia piuttosto robusto,75
mantenere leggibili le password, anche se cifrate, espone comunque ad un attacco a forza bruta,
cio`e alla possibilit`
a che qualcuno tenti di provarle tutte. Se quando `e stato creato Unix questa
eventualit`
a, dati i computer dellepoca, era impraticabile, con la potenza dei computer di oggi
lo `e molto meno. Inoltre anche se oggi `e diventato possibile usare altri algoritmi di crittografia
che rendono pi`
u difficile un compito del genere, c`e sempre da fare i conti con la pigrizia degli
utenti che tendono ad usare password come pippo o ciccio.76
Per cui anche se gli attacchi a forza bruta non sono praticabili, `e comunque piuttosto semplice,
e ci sono programmi molto efficienti nel farlo, utilizzare quello che si chiama un attacco a
dizionario, in cui invece che tutte le combinazioni possibili si provano solo quelle relative ad un
dizionario di password probabili.77 E non giovano neanche trucchetti come quello di scrivere le
parole alla rovescia, aggiungere qualche cifra, invertire delle lettere o mettere un 3 al posto di
una e o un 1 al posto di una i, perche sono tutti trucchi ampiamente noti, che qualunque
programma decente di password cracking applicher`a alle parole del suo dizionario.
Per questo motivo non `e molto sicuro lasciare accessibili le password, anche nella loro forma
cifrata, ed alcuni anni fa `e stata effettuata una completa reimplementazione dei meccanismi
di gestione degli utenti, con lintroduzione quello che viene chiamato il sistema delle shadow
password. Con questo nuovo sistema, oltre a spostare le password cifrate in un file a parte non
accessibile in lettura, `e stato anche possibile aggiungere anche una ulteriore serie di funzionalit`
a
di sicurezza.
Quando nel sistema sono abilitate le shadow password nel secondo campo di /etc/passwd
ed /etc/group viene posta una x, e le password cifrate vengono spostate in /etc/shadow ed
/etc/gshadow.78 Dato che in questo caso le altre informazioni necessarie ai programmi restano
disponibili in /etc/passwd ed /etc/group si possono proteggere questi due nuovi file in lettura,
cos` che solo lamministratore possa accedervi.
Oltre alle password cifrate in /etc/shadow sono memorizzate una serie di ulteriori informazioni che permettono un controllo molto pi`
u dettagliato sulle modalit`a di autenticazione di un
utente, come il tempo di durata di una password, la data in cui la si `e cambiata lultima volta,
ecc. Il formato del file `e analogo ai precedenti, e prevede 9 campi (sempre separati dal carattere
:) il cui significato `e:
1. il nome dellutente (username).
2. la password cifrata.
3. il giorno in cui la password `e stata cambiata lultima volta (espresso in numero di giorni
dal 1/1/1970).
4. il numero di giorni che devono passare dallultimo cambiamento prima che la password
possa essere cambiata nuovamente.
5. il numero di giorni dallultimo cambiamento dopo i quali la password scade e deve essere
necessariamente cambiata.
74

si reputa il meccanismo valido proprio quando qualunque metodo si possa usare per fare questa conversione
inversa richiede una quantit`
a di calcolo equivalente a quello di provare tutte le possibili password.
75
lalgoritmo originale si chiama DES, ed ormai non viene pi`
u usato poiche prevede delle chiavi di dimensione
ridotta ed ha dei limiti sul numero di caratteri delle password (vengono usati solo i primi 8 caratteri) che rendono
relativamente semplice un attacco a forza bruta; per questo si usano algoritmi alternativi come MD5 che prende
password di dimensioni qualsiasi e utilizza chiavi pi`
u lunghe.
76
vedremo in sez. 4.3.7 che `e possibile forzare gli utenti ad usare password pi`
u solide, ma non `e detto che questo
sia sempre applicabile.
77
per una trattazione pi`
u accurata di queste problematiche si pu`
o consultare [SGL].
78
nei primi tempi questa era una opzione di installazione, ma ormai sono molti anni che qualunque distribuzione
utilizza direttamente le shadow password come default.

214

CAPITOLO 4. AMMINISTRAZIONE ORDINARIA DEL SISTEMA

6. il numero dei giorni precedenti quello di scadenza della password in cui gli utenti vengono
avvisati.
7. il numero dei giorni successivi a quello di scadenza della password dopo i quali lutente
viene disabilitato.
8. il giorno in cui lutente viene disabilitato (espresso in numero di giorni dal 1/1/1970).
9. campo riservato, non viene utilizzato.
Al solito tutti i dettagli relativi al formato di /etc/shadow ed al significato dei vari campi
possono essere trovati nella relativa pagina di manuale, un esempio del contenuto di questo file
`e il seguente:
root:n34MlzgKs8uTM:12290:0:99999:7:::
daemon:*:11189:0:99999:7:::
bin:*:11189:0:99999:7:::
sys:*:11189:0:99999:7:::
sync:*:11189:0:99999:7:::
games:*:11189:0:99999:7:::
...
piccardi:$1$KSRp2lZ3$s9/C2ms0Ke9UTaPpQ98cv1:11189:0:99999:7:::
...

Si noti come nellesempio per alcuni utenti nel campo della password cifrata sia presente il
carattere * (talvolta viene usato anche !). Questo `e un modo, dato che una password cifrata
non potr`a mai avere questo valore, di impedire che il corrispondente utente possa autenticarsi
presso il sistema, e lo si usa normalmente quando si vuole disabilitare laccesso ad un utente o
per gli utenti dei servizi di sistema che non necessitano di eseguire un login.
Come accennato lutilit`
a del sistema delle shadow password `e che questo consente anche di
impostare delle politiche di gestione delle stesse. Ad esempio si pu`o impostare un tempo di
durata massima forzando gli utenti a non utilizzare sempre la stessa password, cosa che a lungo
andare fa aumentare le possibilit`
a che essa venga scoperta.
Dato che anche i gruppi possono avere delle loro password, anche in questo caso `e stato
previsto un secondo file non accessibile in lettura, /etc/gshadow in cui poterle mantenere,
insieme ad altre informazioni. Il formato `e analogo a quello degli altri file, i campi in questo
caso sono 4 ed indicano rispettivamente:
1.
2.
3.
4.

nome del gruppo.


password cifrata.
utenti amministratori del gruppo (lista separata da virgole).
utenti appartenenti al gruppo (lista separata da virgole).

Di nuovo si `e riportato a seguire un esempio del contenuto di /etc/gshadow, il cui formato,


con la descrizione completa dei vari campi, `e documentato nella relativa pagina di manuale:
root:*::
daemon:*::
bin:*::
sys:*::
adm:*::
tty:*::piccardi,admin
...
piccardi:!::
...

Oggi tutte le distribuzioni installano di default le shadow password, ma quando si hanno dei
dati che originano da una situazione veramente obsoleta, `e possibile effettuare una conversione
automatica dal sistema tradizionale usando il comando pwconv. Il comando prima rimuove da

4.3. LA GESTIONE DI UTENTI E GRUPPI

215

/etc/shadow tutte le voci non presenti in /etc/passwd, poi riporta le password presenti in esso
allinterno di /etc/shadow,79 ed infine sovrascrive i valori di /etc/passwd con una x.
Inoltre pwconv usa i valori dei parametri PASS_MIN_DAYS, PASS_MAX_DAYS e PASS_WARN_AGE
di login.defs (vedi sez. 4.3.5) per impostare i rispettivi campi di /etc/shadow che non esistono
in /etc/passwd. Analogo a pwconv, ma operante sui gruppi ed i relativi file /etc/group e
/etc/gshadow `e grpconv; essendo le password dei gruppi poco utilizzate anche questo comando
non `e molto usato.
` possibile inoltre effettuare anche la conversione inversa, tornando dalle shadow password al
E
sistema tradizionale con i comandi pwunconv e grpunconv, in questo caso le password verranno
reinserite in /etc/passwd ed /etc/group, ma le informazioni aggiuntive (come i dati sulle
scadenze delle password) verranno persi.

4.3.3

I comandi per la gestione di utenti e gruppi

Benche sia possibile inserire a mano i dati nei vari file illustrati in sez. 4.3.2, in genere `e opportuno
utilizzare gli appositi comandi di gestione di utenti che si incaricano di effettuare le operazioni
in maniera corretta. Il primo di questi comandi `e useradd, che permette di aggiungere un nuovo
utente al sistema (cio`e di creare un account). Se usato senza opzioni il comando prende come
argomento il nuovo username e si limita a creare un voce per il nuovo utente in /etc/passwd
e /etc/shadow, inserendo dei valori di default in tutti i campi in cui ci`o `e possibile, ma non
imposta la password, che resta disabilitata, e non crea la home directory.
In genere il comando assegna automaticamente al nuovo utente un user ID, utilizzando il
primo numero libero maggiore di tutti gli altri user ID gi`a assegnati agli altri utenti, partendo comunque da un valore minimo previsto dal sistema, che viene stabilito dalla propria
distribuzione.80 Si pu`
o per`
o indicare anche un valore specifico come parametro per lopzione -u.
Per quanto riguarda la home directory questa viene impostata automaticamente con il nome
dellutente aggiunto ad una base che di default `e /home,81 ma si pu`o impostare una directory
qualsiasi con lopzione -d, che prende come parametro il relativo pathname assoluto. Inoltre con
lopzione -m si pu`
o richiedere anche la creazione della home directory, con tanto di creazione al
suo interno di tutti i file contenuti nella directory /etc/skel/ (vedi sez. 4.3.5).
In teoria si pu`
o impostare una password per lutente direttamente con useradd usando
lopzione -p; questa per`
o richiede come parametro una password specificata direttamente in
forma cifrata, per cui normalmente non si usa mai questa opzione, ma si provvede ad eseguire il
comando passwd in un secondo tempo.
Altre opzioni comuni sono -s, con cui si pu`o indicare, passando come parametro il relativo
pathname assoluto, una shell di login alternativa; -g con cui si specifica il gruppo principale,
indicato per nome o per group ID, e -G con cui si impostano gli eventuali altri gruppi a cui
lutente appartiene, indicati con una lista dei rispettivi nomi separati da virgole.
Si tenga presente per`
o che per poter eseguire le impostazioni dei gruppi occorre che questi
gi`a esistano. In particolare il gruppo principale dellutente deve comunque essere gi`a presente in
/etc/group. Se non lo si specifica useradd utilizza un valore di default; il comando standard
prevede che questo sia mantenuto nel file /etc/default/useradd, dove sono impostati tutti i
default del comando in forma di definizioni di altrettante variabili di shell; nel caso di Debian
viene usato il group ID 100, che corrisponde al gruppo users, RedHat invece usa una versione
79

che per`
o vengono mantenute cifrate nel vecchio formato; non `e infatti possibile, non avendo le password in
chiaro, eseguire una conversione delle stesse al nuovo algoritmo di cifratura.
80
il valore minimo viene controllato dalla direttiva UID_MIN di /etc/login.defs, (vedi sez. 4.3.5), valori tipici
sono 1000, usato da Debian e derivate, e 500, usato da RedHat e derivate; i valori fra 0 e detto limite sono usati
normalmente per gli utenti corrispondenti ai servizi di sistema.
81
si pu`
o cambiare detta base con lopzione -b insieme a -D.

216

CAPITOLO 4. AMMINISTRAZIONE ORDINARIA DEL SISTEMA

modificata del comando che crea automaticamente un gruppo con lo stesso nome scelto per
lutente.
Opzione
-d
-u
-p
-s
-g
-G
-o
-e
-f
-D
-m
-b

Significato
imposta la home directory dellutente.
specifica un valore numerico per luser ID.
imposta la password, che deve essere passata come
parametro, in forma cifrata.
imposta la shell di default.
imposta il gruppo primario dellutente.
imposta eventuali gruppi aggiuntivi.
permette di specificare un user ID gi`
a esistente.
imposta una data di scadenza per laccount.
imposta dopo quanto tempo laccount viene disabilitato
dopo la scadenza della password.
mostra i default o li cambia se invocato con -b, -s, -g,
-e, -f.
copia il contenuto di /etc/skel/ nella home.
imposta la base da cui viene generato il valore di default
della home directory.

Tabella 4.17: Principali opzioni del comando useradd.

Il comando inoltre consente, tramite lopzione -D, di leggere o impostare i valori di default;
in tal caso non si deve specificare nessun utente, e se usato senza opzioni il comando stamper`a
i valori correnti, mentre se utilizzato con una delle opzioni -s, -g, -e, -f cambia il default per
il rispettivo valore di impostazione. Inoltre si pu`o anche specificare lopzione -b che indica la
directory di base da cui viene creata la home directory di default, aggiungendo al valore passato
come parametro (il valore preimpostato `e /home) lusername dellutente. Le principali opzioni
sono riportate in tab. 4.17, comprese quelle che consentono di impostare alcuni attributi delle
shadow password, lelenco completo insieme a tutti i dettagli sul funzionamento del comando
sono disponibili nella pagina di manuale accessibile con man useradd.
Una volta creato un utente `e possibile modificarne le propriet`a con il comando usermod; il
comando `e simile a useradd, prende come argomento il nome dellutente che si vuole modificare
e molte opzioni (quelle elencate nella prima parte di tab. 4.17) sono identiche e hanno lo stesso
significato. Si tenga presente per`
o che luso dellopzione -G, che permette di indicare i gruppi
aggiuntivi di cui lutente fa parte, richiede che si passi come parametro la lista completa (sempre
separata da virgole) degli stessi. Questo significa che se non si inseriscono nella lista anche i
gruppi di cui lutente fa gi`
a parte, esso ne sar`a rimosso. Ovviamente questo non `e molto comodo,
per cui le versioni pi`
u recenti del comando supportano luso dellopzione -a, che consente di usare
-G per aggiungere lutente al gruppo passato come argomento mantenendo inalterati la presenza
nei gruppi a cui esso gi`
a appartiene.
Infine usermod supporta le opzioni -L e -U, usate rispettivamente per bloccare e sbloccare
laccesso di un utente. Il blocco viene realizzato con lapposizione del carattere ! al campo
contenente la password cifrata, cos` da far fallire comunque lautenticazione, per lo sblocco il
carattere viene semplicemente rimosso. Si sono riassunte le opzioni specifiche di usermod in
tab. 4.18, al solito per i dettagli si consulti la pagina di manuale.
Opzione
-l
-U
-L
-a

Significato
specifica un diverso username.
sblocca laccount di un utente.
blocca laccount di un utente.
consente di usare -G per aggiungere un gruppo.

Tabella 4.18: Opzioni specifiche del comando usermod.

4.3. LA GESTIONE DI UTENTI E GRUPPI

217

Per la gestione dei gruppi lanalogo di useradd `e groupadd che permette di creare un nuovo
gruppo, passato come argomento. Il comando permette di specificare un group ID specifico
con lopzione -g, altrimenti, come per useradd, viene preso il valore seguente al group ID pi`
u
alto assegnato.82 Se il group ID gi`
a richiesto `e gi`a in uso il comando normalmente fallisce con
un errore, se per`
o si usa lopzione -o si forza luso di un gruppo duplicato, mentre se si usa
lopzione -f si forza il successo del comando imponendo la scelta un group ID diverso con il
metodo ordinario. Infine si pu`
o impostare un gruppo di sistema con lopzione -r.83
Analogamente per modificare le propriet`a di un gruppo si pu`o usare il comando groupmod,
in particolare il comando permette di cambiare il group ID usando -g, supportando sempre
lopzione -o per poter specificare un gruppo gi`a assegnato, e di cambiare il nome del gruppo
con lopzione -n. Al solito per lelenco completo delle opzioni e tutti i dettagli si consultino le
pagine di manuale.
I comandi userdel e groupdel permettono invece di cancellare rispettivamente un utente e
un gruppo, da specificare come argomento. Nel caso di groupdel il comando non ha nessuna
opzione specifica, ma non effettuer`
a la rimozione di un gruppo se questo risulta essere il gruppo
primario di un utente; in tal caso occorre prima rimuovere lutente con userdel. Si tenga conto
che userdel si limita a cancellare lutente se si vuole anche rimuoverne la home directory84 si
dovr`a usare lopzione -r. Inoltre il comando prima di operare si assicura che lutente che si vuole
eliminare non sia collegato alla macchina85 rifiutandosi di proseguire altrimenti, la cancellazione
pu`o per`o essere forzata con lopzione -f.
Come alternativa ai precedenti, su Debian per la creazione e rimozione di utenti e gruppi
sono presenti i comandi adduser, addgroup, deluser e delgroup che forniscono una interfaccia pi`
u semplice. Con adduser ad esempio nella creazione dellutente vengono richiesti pure i
dati aggiuntivi e la password dal terminale, inoltre si pu`o aggiungere un utente ad un gruppo
semplicemente con il comando adduser utente gruppo. Nel caso della rimozione `e inoltre possibile richiedere, tramite le opportune opzioni, anche la cancellazione di tutti i file dellutente
presenti nel sistema, e non solo quelli della sua home; al solito per i dettagli sul funzionamento
si consultino le varie pagine di manuale ad essi dedicato.
Oltre ai comandi visti finora, che operano a livello generico su utenti o gruppi, ci sono
una serie di comandi che permettono di modificare alcuni attributi specifici. Il pi`
u importante `e
passwd, che permette di impostare la password di un utente e tutte le propriet`a ad essa connesse.
Lutilizzo pi`
u comune `e quello in cui si invoca il comando per cambiare la propria password, nel
qual caso non `e necessario nessun argomento; il comando chieder`a la password corrente e poi la
nuova password per due volte (la seconda per conferma, onde evitare errori di battitura).
Se si specifica un argomento questo indica lutente di cui si vuole cambiare la password, ma
si tenga presente che solo lamministratore pu`o cambiare la password di un altro utente, gli
utenti normali possono cambiare solo la propria e soltanto dopo essersi autenticati fornendo la
vecchia.86
Oltre alla semplice operazione di cambiamento delle password passwd supporta molte altre
funzionalit`
a relative alla gestione delle stesse, ed in particolare per limpostazione delle varie
propriet`a associate al sistema delle shadow password (trattate in sez. 4.3.2). Si sono riportate
in tab. 4.19 le opzioni pi`
u rilevanti insieme al rispettivo significato, si tenga presente che es82

anche in questo caso, come per gli utenti, a partire da un valore minimo impostato con la direttiva GID_MIN
di /etc/login.defs, (largomento `e trattato in dettaglio in sez. 4.3.5).
83
questa `e semplicemente una convenzione, per il kernel un gruppo di sistema `e un gruppo come tutti gli altri,
`e per`
o invalso luso di usare valori bassi dei group ID, inferiori al limite iniziale usato per gli utenti, per i gruppi
assegnati ai programmi che svolgono servizi nel sistema.
84
si tenga presente che questo non assicura la cancellazione di tutti i file di propriet`
a dellutente che potrebbero
essere in altre directory diverse dalla sua home.
85
per far questo viene controllato quanto riportato in /var/log/wtmp, si pu`
o eseguire una verifica invocando il
comando last (vedi sez. 2.4.4).
86
questo non vale per lamministratore, che pu`
o cambiare la propria password senza dover fornire la attuale.

218

CAPITOLO 4. AMMINISTRAZIONE ORDINARIA DEL SISTEMA


Opzione
-x

-n

-w
-i

-e

Significato
imposta in numero massimo di giorni per cui la password rimane valida, passati i quali lutente sar`
a forzato
a cambiarla.
imposta il numero minimo di giorni dopo il quale una password pu`
o essere cambiata, lutente non potr`
a modificarla
prima che siano passati.
imposta il numero di giorni per i quali lutente viene
avvertito prima della scadenza della password.
imposta il numero massimo di giorni per cui viene accettato il login dopo che la password `e scaduta, passati i
quali laccount sar`
a disabilitato.
fa scadere immediatamente una password, forzando cos`
lutente a cambiarla al login successivo.

Tabella 4.19: Opzioni del comando passwd per la gestione delle informazioni relative alle shadow password.

se possono essere utilizzate solo dallamministratore. Infine il comando permette di bloccare e


sbloccare luso di un account rispettivamente con le opzioni -l e -u, mentre lopzione -d consente di cancellare totalmente la password, in tal caso per`o chiunque potr`a entrare nel sistema
conoscendo soltanto lusername.
Per gestire le informazioni di scadenza delle password di un utente `e comunque disponibile un
comando apposito, chage. Questo, a parte quando invocato con lopzione -l che mostra i valori
attuali delle impostazioni, pu`
o essere usato solo dallamministratore e prende come argomento
lusername dellutente su cui si vuole operare. Le opzioni del comando, che consentono di
cambiare le varie propriet`
a di scadenza delle password, sono riportate in tab. 4.20; per maggiori
dettagli si consulti al solito la pagina di manuale del comando.
Opzione
-d

-E

-I

-m
-M
-W

Significato
imposta il giorno di ultimo cambiamento delle password,
in numero di giorni dal primo Gennaio 1970, o nel
formato YYYY-MM-DD (anno-mese-giorno).
imposta il giorno di scadenza dellaccount, oltre il quale
non sar`
a pi`
u utilizzabile, usa lo stesso formato di -d, il
valore 1 elimina la data di scadenza.
imposta per quanti giorni dopo la scadenza della
password laccount resta accessibile prima di essere
bloccato.
imposta la durata minima (in giorni) della password.
imposta la durata massima (in giorni) della password.
imposta il numero di giorni per i quali fornisce il
preavviso della prossima scadenza della password.

Tabella 4.20: Opzioni del comando chage per la gestione delle informazioni di scadenza delle password.

Oltre alle propriet`


a associate alle password ci sono altri due comandi che consentono di
modificare le altre caratteristiche degli utenti. Il primo di questi `e chfn che permette di cambiare
le informazioni mantenute nel campo chiamato Gecos (vedi sez. 4.3.2), in cui si scrivono il
nome reale e altri dati relativi allutente. Un utente pu`o modificare solo i suoi dati,87 previa
autenticazione, mentre lamministratore pu`o modificare tutti i dati di un utente qualunque. Se
non si specifica nulla il comando presenta sul terminale i dati attuali richiedendo limmissione
di un nuovo valore, si pu`
o per`
o specificare questultimo direttamente a riga di comando come
argomento per la rispettiva opzione. Per i dettagli e le singole opzioni si consulti al solito la
pagina di manuale.
87

e solo quelli permessi dal parametro CHFN_RESTRICT di login.defs (vedi sez. 4.3.5).

4.3. LA GESTIONE DI UTENTI E GRUPPI

219

Il secondo comando `e chsh, che permette ad un utente di cambiare la propria shell di login,
impostandone una diversa come argomento per lopzione -s.88 Anche in questo caso un utente
normale pu`
o operare solo su se stesso invocando il comando senza argomenti, e gli verr`a comunque richiesta lautenticazione; lamministratore invece pu`o operare su qualunque utente senza
restrizioni, passando il relativo username come argomento. Inoltre un utente normale non pu`
o
indicare come shell un programma qualunque, ma soltanto una shell fra quelle elencate nel file
/etc/shells (vedi sez. 4.3.5).
Abbiamo accennato in sez. 4.3.2 come, benche sia una caratteristica sostanzialmente inutilizzata e pressoche sconosciuta, `e possibile assegnare una password anche ad un gruppo, inoltre con
le introduzione delle shadow password `e possibile anche definirne degli amministratori, cio`e dei
membri del gruppo a cui `e possibile delegare la capacit`a di aggiungere e rimuovere utenti dallo
stesso. Il programma che permette di gestire tutto questo, ed in generale tutte le caratteristiche
dei gruppi, `e gpasswd.
Normalmente, come si pu`
o verificare nellestratto riportato in sez. 4.3.2, i gruppi hanno una
password disabilitata, vale a dire che il secondo campo di /etc/gshadow `e impostato ad un
valore (* o !) che non corrisponde a nessun hash valido. Questo significa che possono far
parte del gruppo solo gli utenti presenti come membri dello stesso in /etc/group,89 se si imposta
una password diventa invece possibile ad altri utenti diventare membri del gruppo, fornendo la
relativa password.
La password di un gruppo si pu`o impostare con gpasswd passando argomento il nome del
gruppo stesso. Il comando inoltre pu`o essere usato per aggiungere o rimuovere utenti da un
gruppo rispettivamente con le opzioni -a e -d (cui passare come parametro il nome dellutente).
Infine `e possibile anche rimuovere completamente la password di un gruppo (consentendo a
chiunque di diventarne parte) con lopzione -r, mentre con lopzione -R si disabilita luso della
password, riportandosi alla situazione ordinaria.
Tutte queste operazioni possono essere compiute solo dallamministratore di sistema o dagli
amministratori del gruppo; questi possono essere impostati solo dallamministratore di sistema
tramite luso dellopzione -A cui passare una lista di utenti separati da virgole. Sempre allamministratore di sistema `e riservato luso dellopzione -M che consente di definire i membri ordinari
del gruppo, passati sempre come lista di utenti separata da virgole.
Uno dei problemi che ci si trova ad affrontare con passwd e gpasswd `e che entrambi richiedono
che limmissione della password avvenga da un terminale e non laccettano qualora lo standard
input sia un file o provenga da una redirezione di un comando precedente. Pertanto non sono di
uso immediato qualora li si voglia usare in uno script, ad esempio per eseguire un cambiamento
di password su un gran numero di utenti in maniera automatica.
In teoria in casi come questo si potrebbe pensare di usare usermod e groupmod, che consentono di impostare la password con lopzione -p ma a parte le considerazioni di sicurezza,90 tale
opzione richiede che la password sia passata in forma cifrata nel formato adeguato.
Per risolvere questo problema si possono usare due comandi, chpasswd e chgpasswd, creati
appositamente per cambiare password rispettivamente a liste di utenti o di gruppi . Entrambi
leggono la lista delle modifiche da fare dallo standard input che in questo caso `e necessario sia
un terminale, il formato della lista `e analogo e prevede una riga per utente (o gruppo) divisa in
due campi separati dal carattere :, in cui il primo campo indica lusername (o il groupname)
ed il secondo la password, in chiaro, che verr`a cifrata dal comando stesso.
Si tenga presente che entrambi i comandi proseguono lesecuzione in caso di fallimento per
il cambiamento della password di un utente (o di un gruppo) passando a quello successivo e
riportando un errore solo alla fine dellesecuzione.
88

se non si specifica nulla la richiesta viene fatta in modalit`


a interattiva sul terminale.
in realt`
a vengono usati gli stessi dati presenti /etc/gshadow, che ha la precedenza in caso di differenze.
90
il valore passato comparirebbe nella riga di comando, visualizzabile con loutput di ps.
89

220

4.3.4

CAPITOLO 4. AMMINISTRAZIONE ORDINARIA DEL SISTEMA

Impersonare i ruoli di altri utenti e gruppi

Come gi`a accennato in sez. 1.4.1 larchitettura di un sistema unix-like prevede fin dalla sue
origini che tutti i programmi vengano eseguiti facendo sempre riferimento ad un utente ed ai
gruppi di cui questo fa parte, ed anche come laccesso al sistema sia vincolato al qualificarsi
presso lo stesso assumendo una certa identit`a, per conto della quale si potranno poi effettuare
tutte le operazioni successive.
Ci sono per`
o dei casi in cui, pur essendosi collegati al sistema con un certo utente, diventa
necessario assumere lidentit`
a di un altro utente per eseguire altri compiti: il caso pi`
u classico in
cui questo avviene `e quello in cui si devono compiere operazioni sul sistema come amministratore.
Ovviamente `e sempre possibile scollegarsi dal sistema e ricollegarsi come amministratore, ma,
specie se si `e allinterno di una sessione grafica, questo non solo `e scomodo ma anche pericoloso,
dato che non `e il caso di fare girare programmi ad interfaccia grafica con i privilegi di root.91
Ovviamente si pu`
o sempre andare in console e rieffettuare la procedura di login per assumere
lidentit`a dellutente che ci interessa,92 ma per semplificare la procedura ci vengono incontro una
serie di comandi grazie ai quali diventa possibile eseguire programmi per conto di altri utenti o
altri gruppi direttamente dalla propria sessione di lavoro. Dato che un utente normale non pu`o
eseguire programmi per conto di altri, per far questo i suddetti comandi sono tutti set user ID
per lutente di amministrazione, che `e lunico che ha questa capacit`a, e richiedono, a meno di
non essere lanciati dallamministratore stesso, che chi li esegue fornisca le opportune credenziali
di accesso (in genere la password) dellutente che vuole impersonare.
Il comando classico usato per cambiare identit`a `e su, che in genere viene invocato senza
argomenti per diventare amministratore (il nome sta appunto per super user ). Si pu`o comunque
diventare un utente qualsiasi passando al comando il relativo username. Il comando richiede
di autenticarsi con la password dellutente richiesto93 dopo di che esegue una shell per conto di
questultimo.94
Di default come effetto del comando viene lanciata la shell di login specificata dal sesto
campo della voce di /etc/passwd associata allutente che si va ad impersonare, da cui poi si
potranno eseguire i comandi per conto di questi; si pu`o per`o eseguire anche un singolo comando
(sempre allinterno di detta shell) specificandolo come parametro per lopzione -c. Si pu`o inoltre
richiedere luso di una shell rispetto a quella di login, specificandola come parametro per lopzione
-s.95
Infine si tenga presente che anche se su consente di avere una shell eseguita per conto di un
altro utente la directory di lavoro e lambiente restano quelli della shell da cui si era partiti; se ci
si vuole trovare in una situazione analoga a quella che avrebbe lutente scelto dopo il suo login,
si pu`o usare lopzione -l (o anche semplicemente -). Si sono riportate le principali opzioni del
comando in tab., al solito per i dettagli e lelenco completo si faccia riferimento alla pagina di
manuale.
In sez. 4.3.2 abbiamo detto che impostando una password su un gruppo si pu`o permettere
ad altri utenti che non ne sono membri di farne parte; non abbiamo per`o spiegato come farlo.
La modalit`a pi`
u comune `e attraverso luso del comando newgrp. Il comando permette infatti
91

una regola doro per evitare guai `e quella di non usare mai i privilegi di amministratore se non quando
assolutamente necessario, per luso ordinario del sistema root non serve, e per eseguire compiti amministrativi
quando si `e collegati come utente normale si possono usare i programmi che tratteremo in questa sezione.
92
si suppone ovviamente che si abbiano le relative credenziali di accesso.
93
a meno che non si sia gi`
a lamministratore nel qual caso non viene richiesta nessuna password; questo consente
allamministratore di impersonare qualunque utente senza doverne conoscere la password.
94
`e anche previsto, come ausilio per la verifica delle operazioni, che ogni operazione eseguita con su venga
opportunamente registrata nel syslog, nella facility auth (vedi sez. 3.2.3).
95
questo `e possibile per`
o soltanto se allutente non `e stata assegnata una shell non elencata in /etc/shell (quella
che, vedi sez. 4.3.5, viene chiamata una restricted shell ) in tal caso infatti lopzione, a meno che il comando non
sia stato invocato dallamministratore, viene ignorata.

4.3. LA GESTIONE DI UTENTI E GRUPPI


Opzione
-c cmd
-s shell
-l o -

221

Significato
richiede lesecuzione del solo comando passato come
argomento.
richiede luso della shell passata come argomento.
richiede la creazione di un ambiente analogo a quello
risultante dopo il login dellutente richiesto.
Tabella 4.21: Principali opzioni del comando su.

di eseguire una nuova shell aggiungendo il gruppo passato come argomento ai propri gruppi
ausiliari. Alternativamente si pu`
o usare anche il comando sg, che per`o, in analogia con su,
supporta lopzione -c che consente di eseguire un singolo comando con i privilegi del nuovo
gruppo. Entrambi i comandi prendono come argomento il nome del gruppo del quale si vogliono
avere i diritti e richiedono la relativa password,96 al solito per i dettagli si consultino le rispettive
pagina di manuale.
Benche su venga utilizzato comunemente per ottenere temporaneamente i privilegi di amministratore (o di un altro utente) una volta che questi sono stati ottenuti non c`e pi`
u nessuna
limitazione. Esistono invece molte situazioni in cui pu`o tornare utile far eseguire ad un normale
utente un programma per conto dellamministratore o di un altro utente, ma si vuole che questi
possa eseguire in questo modo solo quello specifico programma.
Per soddisfare questa esigenza esiste un apposito comando, sudo, che consente di delegare
lesecuzione per conto di altri di singoli comandi, script o programmi. Il programma `e controllato
da un apposito file di configurazione in cui si pu`o specificare quale programma pu`o essere lanciato
per conto di quale utente e quali sono gli utenti cui questo `e consentito.
Per utilizzare sudo basta specificare come argomento il comando che si vuole eseguire insieme alle eventuali opzioni; se questo `e consentito dalla configurazione verr`a richiesta la propria
password,97 dopo di che il comando verr`a eseguito. Se non si specifica nulla il comando viene eseguito per conto dellamministratore, ma si pu`o richiedere lesecuzione per conto di un qualunque
altro utente specificando prima del comando lopzione -u seguita o dallusername o dallUID.
Si tenga conto che una volta che ci si sia autenticati per lesecuzione di un comando sudo
mantiene lautorizzazione valida per un breve intervallo di tempo98 durante il quale non `e necessario fornire nuovamente la password, in questo modo si possono far eseguire pi`
u comandi di
seguito fornendo la password una sola volta, semplificando una eventuale sessione di lavoro. Il
comando registra comunque99 tutte le volte che ne viene richiesta lesecuzione, che questa abbia
successo o meno.
Unaltra funzionalit`
a di sudo, che si attiva usando lopzione -e o invocando il comando come
sudoedit, `e quella che consente di delegare la modifica di un singolo file. In tal caso infatti
delegare ad un utente luso di un editor con i privilegi di amministratore non `e una soluzione,
in quanto cos` si consentirebbe di modificare un file qualunque; con questa opzione invece viene
prima creata una copia del file passato come argomento, sulla quale viene invocato leditor di
default dellutente,100 ed una volta eseguite le modifiche sulla copia queste vengono riportate
sul file originale. Le altre principali opzioni sono riportate in tab. 4.22, per lelenco completo si
consulti al solito la pagina di manuale.
Il grande vantaggio di sudo `e che il comando consente di realizzare in userspace, con una
enorme flessibilit`
a, un meccanismo di delega per specifici compiti amministrativi a singoli utenti
96

ma la password non `e richiesta se i comandi vengono eseguito dallamministratore.


a meno che il comando venga eseguito dallamministratore o che si chieda unesecuzione per conto del proprio
utente.
98
il default `e di 15 minuti, ma si pu`
o impostare un valore diverso con lopzione timestamp_timeout in
/etc/sudoers.
99
sia presso il syslog sulla facility auth che su un eventuale file specificato nella configurazione.
100
quello indicato dalla variabile di ambiente EDITOR, o quello indicato in /etc/sudoers.
97

222

CAPITOLO 4. AMMINISTRAZIONE ORDINARIA DEL SISTEMA


Opzione
-e

-u user
-v
-S

Significato
invece di lanciare un comando consente la modifica del
file passato come argomento, `e equivalente allinvocazione
del comando come sudoedit.
richiede lesecuzione per conto dellutente user (specificato per username o UID).
rinnova il tempo di validit`
a della sessione allinterno del
quale non viene richiesta una password.
richiede la lettura della password dalla standard input
invece che dal terminale.

Tabella 4.22: Principali opzioni del comando sudo.

o gruppi,101 senza dover ricorrere a meccanismi di controllo di accesso pi`


u sofisticati a livello di
kernel. La potenza e la flessibilit`
a di sudo hanno per`o un costo, che `e quello di una adeguata
configurazione del programma stesso, che avviene tramite il file /etc/sudoers. Purtroppo
in questo caso la documentazione del file stesso, disponibile nella relativa pagina di manuale,
`e come minimo poco utilizzabile, gli autori intatti la hanno espressa in forma di Backus-Naur
estesa (EBNF)102 il che ha permesso a loro di scriverla in maniera compatta e precisa, scaricando
per`o lo sforzo necessario per tradurla un significato pi`
u comprensibile sul povero utente finale,
costretto ad impararsi la notazione EBNF anche quando ne avrebbe fatto volentieri a meno.
Per questo motivo cercheremo qui di dare qui una descrizione imprecisa, ma sperabilmente
pi`
u intellegibile, del formato del file, che resta comunque molto complesso. La parte principale
del file `e quella delle regole che consentono di specificare quale utente pu`o eseguire quale comando
per conto di quale altro utente e su quali macchine.103 Oltre a queste per`o `e possibile definire
anche degli alias per ciascuno dei citati componenti delle regole, per raggruppare pi`
u utenti (o
comandi, o nomi di macchine) sotto una opportuna etichetta. Si possono infine impostare dei
default per le modalit`
a di funzionamento del comando, anche questi specificabili per gruppi di
utenti, macchine o comandi.
Al solito le righe che iniziano per # vengono considerate commenti, e le righe vuote vengono ignorate; inoltre si possono scrivere regole o alias su pi`
u righe terminando ciascuna con il
carattere \ per indicare di proseguire sulla seguente; la sintassi di base di una regola `e nella
forma:
utente ALL = (altroutente) comando, comando
Una regola viene espressa come una serie di componenti; il primo componente, specificato
allinizio della riga, identifica lutente che `e abilitato ad usare sudo per eseguire i comandi previsti
nella stessa; questo primo componente pu`o essere un singolo username, come nel precedente
esempio, o il nome di un gruppo preceduto dal carattere %, che consentir`a luso della regola a
tutti i membri del gruppo stesso, o un alias, con il quale si possono specificare liste di utenti,
gruppi e altri alias. Si pu`
o altres` usare la parola chiave ALL, che significa qualunque utente.
101
tanto che una distribuzione come Ubuntu ha addirittura disabilitato luso di root, usando sudo per assegnare allutente che si crea in fase di installazione la possibilit`
a di eseguire qualunque comando con privilegi
amministrativi.
102
la EBNF (Extended Backus-Naur Form) `e un modo di esprimere una sintassi generica in una forma compatta
e precisa; il problema `e appunto che essendo una forma compatta, `e anche poco chiara, e lascia allutilizzatore
il tuttaltro che banale compito di decomprimere linformazione in essa contenuta; il risultato `e che ci vuole un
lavoro notevole anche solo per capire le cose pi`
u elementari.
103
si possono cio`e assegnare regole che si applicano solo a certe macchine allinterno di una rete, o a certe reti o
a singole macchine; tutto questo quando si ha a che fare con una singola macchina non ha alcun significato, ma
potrebbe essere utile per usare lo stesso file di configurazione su una serie di macchine o allinterno di una rete; in
realt`
a questa scelta lascia molto perplessi, visto che la complessit`
a aggiuntiva nella sintassi di configurazione non
pare fornire vantaggi significativi rispetto al mantenere diverse versioni del file sulle singole macchine.

4.3. LA GESTIONE DI UTENTI E GRUPPI

223

Il secondo componente, separato dal primo da uno o pi`


u spazi, nel precedente esempio `e
specificato con la parola chiave ALL, il cui significato `e ovvio. Questo componente servirebbe ad
indicare la macchina o lelenco di macchine, o la rete, ecc. su cui la regola `e attiva, ma siccome
faremo sempre riferimento ad una configurazione che vogliamo sia effettiva sulla macchina su cui
la installiamo useremo sempre questo valore con cui si garantisce un accesso valido su qualunque
macchina; se si hanno esigenze diverse su macchine diverse si potranno sempre usare dei file
/etc/sudoers contenenti regole diverse.104
Il terzo componente, separato dal secondo dal carattere uguale, nel caso dellesempio riporta
la specificazione, messa fra parentesi tonde, dellutente per conto del quale si potranno eseguire
i comandi indicati nelle componenti successive. Questo componente `e opzionale, e pu`o essere
omesso, nel qual caso lesecuzione verr`a fatta per conto dellamministratore. Lutente pu`o essere
indicato sia per username, come nellesempio, che per UID (con lindicazione del relativo valore
numerico preceduto dal carattere #), che con il nome di un gruppo (anche qui preceduto dal
carattere %) nel qual caso si potranno usare i comandi per conto degli utenti membri del detto
gruppo ed infine anche con un alias o con la parola chiave ALL che consente lesecuzione per
conto di qualunque utente.
Al terzo componente segue, separato da spazio, il comando di cui si vuole consentire lesecuzione; se ne pu`
o anche specificare pi`
u di uno, separandoli con delle virgole. Anche qui vale
la parola chiave ALL per indicare un comando qualsiasi, inoltre si pu`o usare il valore riservato
sudoedit che serve ad indicare che si sta abilitando la modifica di un file (da indicare come
argomento) e non lesecuzione di un comando. I comandi devono essere specificati con un pathname assoluto al relativo programma,105 se non si specifica altro essi potranno essere usati con
qualunque argomento, si possono per`o specificare anche opzioni ed argomenti e sudo consentir`
a
lesecuzione del comando soltanto con quegli opzioni e quegli argomenti,106 infine se non si vuole
che vengano usati argomenti si dovr`a far seguire al comando la stringa "".
La sintassi delle regole viene ulteriormente complicata dal fatto che `e possibile esprimere pi`
u
blocchi dei componenti successivi al primo separandoli con il carattere :, cos` da avere una
regola che indica comandi diversi eseguiti per conto di utenti o su macchine diverse; ma di nuovo
in casi come questi `e pi`
u semplice e chiaro scrivere due regole separate piuttosto che usare una
sintassi complessa e poco leggibile.
Tag
NOPASSWD
PASSWD
SETENV

NOSETENV
EXEC

NOEXEC

Significato
evita che sudo richieda lautenticazione dellutente che
intende eseguire il comando.
rimuove leffetto di un precedente NOPASSWD.
vengono mantenute nellesecuzione le variabili di ambiente presenti nella shell del chiamante, evitando le eventuali
restrizioni imposte nella configurazione di default.
rimuove leffetto di un precedente SETENV.
evita che un comando possa lanciare al suo interno altri
programmi (ad esempio che dallinterno di vi si possa
eseguire una shell).
rimuove leffetto di un precedente EXEC.

Tabella 4.23: I tag per le indicazioni dei comandi in /etc/sudoers.

Inoltre nello specificare un comando sono disponibili alcuni tag che consentono di controllarne
le modalit`
a di esecuzione, questi vengono specificati indicandoli prima del comando a cui si
applicano seguiti dal carattere :; una volta specificati valgono anche per i comandi successivi
104

o studiarsi la sintassi completa delle modalit`


a con cui si indicano i nomi delle macchine.
ma si possono usare le wildcard del filename globbing per fare selezioni multiple.
106
in tal caso si tenga presente che i caratteri usati nella specificazione delle regole, come :, =, ,, \ dovranno
essere adeguatamente protetti con un \ se presenti nelle opzioni o negli argomenti del comando stesso.
105

224

CAPITOLO 4. AMMINISTRAZIONE ORDINARIA DEL SISTEMA

nella regola, a meno che lindicazione non venga soprascritta da unaltra specificazione. Lelenco
dei tag ed il relativo significato `e illustrato in tab. 4.23.
Come accennato una delle funzionalit`a presenti in /etc/sudoers `e quella che consente la
creazione di alias che permettono di esprimere in maniera pi`
u sintetica gruppi di utenti, o di
macchine o liste di comandi; gli alias sono espressi nella forma di assegnazione di una stringa
identificativa al rispettivo valore, preceduta da una delle direttive di definizione riportate in
tab. 4.24.
Direttiva
User_Alias

Host_Alias
Runas_Alias

Cmd_Alias

Significato
Un alias utilizzabile per indicare gli utenti che possono eseguire un certo comando, prende come argomenti
username, groupname (preceduti da %) o altri alias.
Un alias utilizzabile per indicare una lista di macchine o
reti.
Un alias utilizzabile per indicare gli utenti per dei quali si
pu`
o eseguire un certo comando, prende come argomenti
username, UID (preceduti da #), groupname (preceduti
da %) o altri alias.
Un alias utilizzabile per indicare una lista di comandi.

Tabella 4.24: Le direttive per la creazione di alias in /etc/sudoers.

Infine tutta una serie di propriet`


a generali concernenti le modalit`a di funzionamento di sudo,
come il tempo per il quale non viene richiesta nuovamente una password dopo essersi autenticati,
possono essere impostate tramite la direttiva Defaults. Questa prende come argomenti una serie
di nomi di opzioni che identificano le suddette propriet`a da configurare, separate da virgole. La
sintassi prevede che limpostazione venga effettuata in forma di assegnazione di un valore al nome
dellopzione, ad eccezione del caso di opzioni che hanno valore logico, nel qual caso basta citare
lopzione per attivarla o farla precedere da un ! per disattivarla. A complicare limpostazione
si aggiunge il fatto che si possono definire delle impostazioni di default per singoli gruppi di
utenti, macchine e comandi.107
Opzione
env_reset

env_keep

setenv
passwd_tries
timestamp_timeout
editor

syslog

Significato
valore logico; di default a on, richiede la ripulitura dellambiente lasciando definite soltanto le variabili
LOGNAME, SHELL, USER, USERNAME e le eventuali SUDO_*.
stringa; nella forma di lista di nomi separati da virgole;
imposta lelenco delle variabili di ambiente che vengono
preservate oltre a quelle di env_reset.
valore logico; di default a off, richiede che tutte le
variabili di ambiente vengano preservate.
valore numerico; imposta il numero di tentativi di
immissione delle password.
valore numerico; imposta il tempo, in minuti, per cui
sudo ritiene la sessione valida e non richiede la password.
stringa, nella forma di lista di nomi separati da virgole;
imposta la lista di editor che possono essere usati con
visudo.
imposta la facility del syslog su cui mandare i messaggi,
il default `e authpriv.

Tabella 4.25: Le principali opzioni per i default di /etc/sudoers.

Come citato le opzioni possono avere valori numerico, testuale o logico, a seconda del tipo di funzionalit`
a che controllano; in generale non `e necessario specificare nessuna opzione, in
107

in una forma che non tratteremo, si consulti nel caso la pagina di manuale, facendo riferimento agli esempi.

4.3. LA GESTIONE DI UTENTI E GRUPPI

225

quando i default hanno valori ragionevoli. Una delle opzioni pi`


u importanti108 `e lopzione logica
env_reset, che richiede la ripulitura dellambiente passato al comando; questo viene fatto per
evitare possibili abusi che potrebbero avvenire sfruttando le variabili di ambiente.109 Si pu`
o
controllare con maggiore dettaglio lambiente passato al comando utilizzando anche lopzione
env_keep, che prende come valore la lista, separata da virgole, delle variabili di ambiente che
possono essere mantenute nellesecuzione del comando. Se invece si vuole preservare completamente lambiente si pu`
o usare lopzione setenv. In tab. 4.25 si sono riportate le opzioni
principali, al solito per lelenco completo si consulti la pagina di manuale.
Come esempio di configurazione che illustra la sintassi del file riportiamo il contenuto di
un /etc/sudoers che consente laccesso amministrativo agli utenti del gruppo admin (secondo
lapproccio usato da Ubuntu), mentre consente allutente webmaster di riavviare i servizi di
Apache con luso del comando apachectl:
# /etc/sudoers
#
# This file MUST be edited with the visudo command as root.
#
# See the man page for details on how to write a sudoers file.
#
Defaults
env_reset
User_Alias
Cmnd_Alias

WEBMASTER = webmaster
APACHECTL = /usr/sbin/apachectl

# User privilege
root
ALL
%admin
ALL
WEBMASTER
ALL

specification
= (ALL) ALL
= (ALL) ALL
= NOPASSWD: APACHECTL

dove si sono usati (anche se nel caso sono del tutto superflui) due alias per definire lutente ed
il comando da far eseguire per il controllo del demone di Apache.
In questo file sono presenti tre regole, che illustrano abbastanza bene le sintassi pi`
u comuni.
Anzitutto si noti che per tutte quante viene usata la indicazione generica ALL = che rende
la regola valida su qualunque macchina. La prima si applica ad un singolo utente (nel caso
lamministratore) e la seconda ai membri del gruppo admin ma i permessi sono identici, con
(ALL) si consente di impersonare qualunque utente, e con il successivo ALL di usare qualunque
comando. La terza regola usa invece un alias per indicare lutente precedentemente definito
a cui consente luso del comando apachectl (anchesso definito in un alias) con privilegi di
amministratore (si noti che non c`e una indicazione dellutente da usare per lesecuzione del
programma), inoltre avendo usato il tag NOPASSWD non verr`a neanche richiesta una password.
Infine si tenga presente che benche sia possibile eseguire la modifica direttamente, la modalit`
a
pi`
u corretta per effettuare una riconfigurazione di sudo `e quella di usare il comando visudo che
consente di chiamare un editor per modificare /etc/sudoers in maniera sicura. Il programma
infatti evita che si possano effettuare modifiche simultanee (bloccando laccesso al file se `e in
corso luso da parte di qualcun altro) e prima di salvare la nuova versione esegue un controllo di
base, per evitare errori.
108

su Debian `e lunica opzione che viene impostata esplicitamente nell/etc/sudoers installato di default, su
RedHat oltre a questa viene usata anche env_keep, le versioni recenti del comando comunque tengono attiva
questa opzione.
109
si potrebbe ad esempio definire LD_LIBRARY_PATH (vedi sez. 3.1.2) per fare usare ad un programma delle
librerie opportunamente modificate, per far eseguire ad un programma delle operazioni non troppo benevole.

226

4.3.5

CAPITOLO 4. AMMINISTRAZIONE ORDINARIA DEL SISTEMA

Le configurazioni della gestione degli utenti e degli accessi

In sez. 4.3.2 abbiamo trattato i file in cui classicamente vengono mantenuti i dati di utenti e
gruppi, mentre in sez. 4.3.3 abbiamo visto i comandi che consentono di gestirli; ci restano da
trattare tutti quei file di configurazione che controllano da una parte le modalit`a con cui si
creano utenti e gruppi e dallaltra le modalit`a con cui questi accedono al sistema.
Agli albori di Unix lunica procedura per collegarsi al sistema era quella del login da terminale
che, come accennato in sez. 2.1.2, `e gestita dai due programmi getty e login. Le modalit`a con
cui questi programmi (ed in particolare il secondo) garantiscono laccesso vengono impostate
attraverso una serie di file di configurazione, che sono quelli che tratteremo in questa sezione.
In realt`a al giorno doggi tutte le distribuzioni usano i Pluggable Authentication Modules (PAM,
che tratteremo in sez. 4.3.7), e buona parte dei file di configurazione che un tempo venivano usati
da login adesso vengono utilizzati attraverso questa libreria, che ne consente luso a qualunque
programma abbia necessit`
a di gestire laccesso al sistema.
Il primo file che prendiamo in considerazione `e /etc/issue, che contiene il messaggio di
presenza stampato sui terminali prima dellaccesso dellutente. Questo file viene usato da getty
per essere stampato sul terminale prima della stringa login: dopo la quale viene richiesto
lusername; `e possibile modificarlo in modo da personalizzare la schermata di accesso al sistema.
Il contenuto del file viene stampato integralmente, ma si possono inserire, attraverso luso
del carattere \, delle direttive che permettono di stampare alcune informazioni dinamiche; ad
esempio con \s si inserisce automaticamente il nome del sistema operativo, con \l il nome
del terminale, con \n il nome della macchina. I principali valori sono riportati in tab. 4.26,
mentre lelenco completo `e riportato nella pagina di manuale di getty.
Carattere
\d
\l
\m
\n
\r
\s
\t

Significato
data completa.
nome del terminale.
architettura (i486, PPC, ecc.).
nome della macchina (hostname).
versione del kernel.
nome del sistema (Debian, RedHat, ecc).
ora del giorno.

Tabella 4.26: Principali caratteri di estensione per /etc/issue.

Analogo a /etc/issue `e /etc/issue.net, che viene usato al suo posto quando il collegamento viene effettuato via rete con telnet; si tenga conto che questo vale solo per un login
remoto eseguito con telnet, se invece si usa ssh (vedi sez. 8.3) detti file normalmente vengono
ignorati.
Un secondo file utilizzato allingresso del sistema, questa volta quando il login `e stato completato, `e /etc/motd che contiene il messaggio di benvenuto mostrato a tutti gli utenti che si
sono collegati con successo;110 il nome del file sta per message of the day, e scrivere un messaggio
in questo file `e una modalit`
a veloce per mandare un avviso a tutti gli utenti che entrano nel
sistema dallinterfaccia a riga di comando.
Un altro file di controllo della procedura di login `e /etc/securetty. Questo file contiene la
lista delle console da cui si pu`
o collegare lamministratore di sistema (cio`e lutente root). Viene
usato dal programma login,111 che legge da esso i nomi dei dispositivi di terminale dai quali `e
consentito laccesso. Un esempio di questo file (preso da una Debian Etch) `e il seguente:
110
questo al contrario del precedente viene gestito da PAM con il modulo pam_motd.so, per cui pu`
o essere
utilizzato non solo sul collegamento da terminale, ma anche da tutti gli programmi che consentono laccesso al
sistema, come ssh (vedi sez. 8.3).
111
per essere precisi dal modulo di PAM pam_securetty.so, vedi sez. 4.3.7.

4.3. LA GESTIONE DI UTENTI E GRUPPI

227

console
vc/1
vc/2
...
tty1
tty2
...

il formato del file prevede che ogni linea definisca un nome di dispositivo dal quale `e possibile il
login, le linee vuote o che iniziano per # vengono ignorate. La pagina di manuale fornisce una
descrizione completa.
Dato che i terminali virtuali usualmente associati alle connessioni di rete non sono indicati in
questo file, normalmente non `e possibile utilizzare un programma come telnet (vedi sez. 7.7.1)
per collegarsi da remoto come amministratore. Benche sia possibile consentirlo aggiungendo
una riga al contenuto appena illustrato, questo non `e assolutamente una buona idea per cui se
proprio volete farlo dovrete studiarvelo da soli.112
Quando si vuole bloccare temporaneamente laccesso al sistema degli utenti ordinari, lamministratore pu`
o creare il file /etc/nologin; questo non `e propriamente un file di configurazione,
dato che il suo contenuto `e ininfluente, la sua presenza serve solo a dire alla procedura di collegamento al sistema che solo lamministratore pu`o entrare.113 La sua rimozione ripristiner`
a
laccesso per tutti gli utenti.
Oltre a quelli appena citati esistono vari altri file che consentono di controllare le modalit`
a
della procedura per laccesso al sistema ed in particolare controllare alcune risorse assegnate
agli utenti, oggi tutto questo viene gestito attraverso PAM per cui rimandiamo la trattazione di
questi aspetti pi`
u avanzati alla sez. 4.3.7.
Tratteremo per`
o qui /etc/login.defs, che un tempo era il principale file deputato alla configurazione della procedura di login, e conteneva anche le impostazioni di login per controllare
le modalit`
a di autenticazione ed accesso.114 Come accennato nelle distribuzioni recenti tutto
quello che riguarda lautenticazione dellutente e la gestione della sessione di lavoro viene gestito
tramite PAM, per cui login non fa pi`
u alcun uso di questo file,115 esso per`o resta come file di
configurazione dellintero sistema delle shadow password, ed in particolare viene utilizzato per
la configurazione di parametri usati dai programmi di gestione degli utenti trattati in sez. 4.3.3.
Il formato di login.defs `e molto semplice, al solito sono considerati commenti le righe che
iniziano per # ed ignorate le righe vuote; ciascuna riga contiene lassegnazione di un parametro
di configurazione, fatta nella forma di un nome che lo identifica seguito dal valore da assegnargli,
separato da uno o pi`
u spazi. A seconda del parametro il valore pu`o essere una stringa, un numero,
o un valore logico (specificato nella forma yes o no). Abbiamo gi`a incontrato alcuni di questi
parametri, come UID_MIN e UID_MAX in sez. 4.3.3, un elenco di quelli pi`
u rilevanti `e stato riportato
in tab. 4.27, lelenco completo si trova nella pagina di manuale associata al file. Un esempio del
contenuto di questo file, estratto della versione installata su una CentOS 5.2, `e il seguente:
MAIL_DIR
PASS_MAX_DAYS
PASS_MIN_DAYS
PASS_MIN_LEN
PASS_WARN_AGE
UID_MIN
UID_MAX
112

/var/spool/mail
99999
0
5
7
500
60000

in generale non `e comunque una buona idea neanche quella di usare telnet, quindi `e meglio se proprio lasciate
perdere completamente la cosa.
113
dato che anche leffetto di questo file viene gestito con PAM, ed in particolare con il modulo pam_nologin.so
(vedi sez. 4.3.7), laccesso pu`
o essere bloccato in generale, anche dallinterfaccia grafica.
114
come il numero di possibili errori nel fornire la password, o il tempo per cui si attende la sua immissione.
115
anche se spesso vi si trovano riferimenti a direttive obsolete ormai non pi`
u utilizzate.

228

CAPITOLO 4. AMMINISTRAZIONE ORDINARIA DEL SISTEMA


Parametro
CHFN_RESTRICT

GID_MAX
GID_MIN
PASS_MAX_DAYS
PASS_MIN_DAYS
PASS_WARN_AGE

UID_MAX
UID_MIN
MAIL_DIR

USERDEL_CMD

Significato
indica quali campi del Gecos possono essere cambiati con chfn da un
utente ordinario, indicati con una lettera identificativa, per i dettagli si
consulti la pagina di manuale.
imposta il valore massimo del group ID assegnabile coi comandi
useradd e groupadd.
imposta il valore minimo del group ID assegnabile coi comandi useradd
e groupadd.
imposta il valore di default per la massima durata della validit`
a di una
password, usato al momento della creazione dellutente.
imposta il valore di default per la minima durata della validit`
a di una
password, usato al momento della creazione dellutente.
imposta il valore di default per il numero di giorni precedenti la scadenza di una password per i quali viene mandato un avviso, usato al
momento della creazione dellutente.
imposta il valore massimo delluser ID assegnabile col comando
useradd.
imposta il valore minimo delluser ID assegnabile col comando useradd.
indica la directory della posta dellutente, viene usato dai comandi
di gestione dellutente per creare, spostare o rimuovere la posta dello
stesso.
se definito indica il comando che verr`
a eseguito alla rimozione di un
utente (ad esempio per compiere controlli aggiuntivi come la rimozione
di eventuali stampe sospese).

Tabella 4.27: Principali parametri di configurazione di /etc/login.defs.

GID_MIN
GID_MAX
...

500
60000

Si tenga presente infine che se si fa riferimento al contenuto effettivo di /etc/login.defs vi


si troveranno definiti anche una gran quantit`a di parametri non citati nella pagina di manuale;
alcuni di questi sono semplicemente obsoleti e non hanno nessun effetto in quanto gran parte
delle impostazioni presenti un tempo, ed in particolare quelle usate da programmi come login,
passwd e su, viene oggi effettuata attraverso i moduli di PAM, alcuni di questi per`o, anche a
seconda di come sono stati costruiti i comandi citati, potrebbero essere tenuti in conto come
valori di riserva qualora le impostazioni eseguite con PAM non funzionassero.
Un altro file utilizzato dal sistema di gestione degli utenti `e /etc/shells, che contiene la
lista delle shell valide che lutente pu`
o selezionare con il comando chsh (vedi sez. 4.3.3). Il file
utilizza il solito formato in cui le righe inizianti per # sono considerate commenti e le righe
vuote sono ignorate. Ogni riga non vuota contiene un solo campo che specifica il pathname
completo del programma che pu`
o essere usato come shell. Un utente che voglia cambiare la
propria shell di default potr`
a usare solo una shell fra quelle che sono indicate in questo file; in
questo modo lamministratore pu`
o lasciare allutente la libert`a di modificare la propria shell di
login, restringendola per`
o alle shell autorizzate.
Il file per`o ha degli effetti anche sul funzionamento di altri programmi, in particolare viene
usato verificare se un utente `e un utente ordinario con accesso al sistema, sulla base della presenza
della sua shell di login116 in questo file; si dice infatti che un utente `e dotato di una restricted
shell quando la sua shell di login non `e fra quelle elencate in /etc/shells. Sono esempi tipici
di utenti associati ad una restricted shell quelli utilizzati per i servizi di sistema,117 che spesso
hanno come shell programmi come /bin/false (vedi sez. 2.1.5) o /usr/bin/nologin118 che non
consentono comunque di collegarsi al sistema.
116

che si ricordi `e quella definita nellultimo campo di /etc/passwd (vedi sez. 4.3.2).
come gli utenti associati ai servizi di fornitura di pagine web o gestione della posta elettronica.
118
questo `e un semplice programma che stampa un messaggio dicendo che lutente non `e utilizzabile e ritorna
117

4.3. LA GESTIONE DI UTENTI E GRUPPI

229

La presenza di una restricted shell viene usata da vari programmi per modificare il proprio
comportamento; ad esempio alcuni server FTP rifiutano laccesso ad username corrispondenti
ad utenti che non hanno una shell valida fra quelle elencate in /etc/shells, mentre, come
accennato in sez. 4.3.4, su si rifiuta di eseguire un comando per conto di un altro utente usando
una shell diversa da quella di login se questi ha una restricted shell.
Si tenga conto comunque che qualora lutente abbia comunque un accesso ad una shell
limpedirgli di cambiare la shell di login al di fuori di quelle di /etc/shells non significa che gli si
pu`o impedire di usare unaltra shell, questi infatti potr`a comunque installare nella propria home
directory unaltra shell ed usare quella al posto della shell di login, lanciandola semplicemente
come un qualunque altro programma; non potr`a per`o cambiare quella con cui entra nel sistema
al login.
Infine, come ultimo argomento relativo alle configurazioni che attengono alla gestione degli
utenti, dobbiamo trattare la directory /etc/skel/. Come accennato in sez. 4.3.3, nella creazione
di un nuovo utente `e possibile richiedere la creazione della sua home directory; questa pu`o anche
essere creata con uno scheletro di contenuti, che siano gli stessi per ogni nuovo utente. Con questo
si pu`o far s` ad esempio che alcune impostazioni personali di programmi di uso comune119 siano
predefinite ed assegnate in modo uniforme alla creazione di ogni nuovo utente.
La directory /etc/skel/, come il nome stesso suggerisce, `e quella che contiene questo scheletro. Tutti i file e le directory che si vuole siano creati nella home directory dei nuovi utenti
possono essere messi in questa directory. Tutti i file presenti in /etc/skel/ saranno automaticamente copiati nella relativa home alla creazione di ogni nuovo utente, i permessi dei file
verranno mantenuti, mentre la propriet`a degli stessi verr`a assegnata al nuovo utente ed al suo
gruppo principale. Il contenuto tipico di questa directory sono gli scheletri dei file di personalizzazione della shell degli utenti: ad esempio nel caso di Debian Etch il contenuto di default
prevede ad esempio i file .bashrc, .profile, .bash_logout, ma `e possibile spingersi oltre ed
inserire al suo interno anche altre configurazioni, ad esempio CentOS vi crea anche lo scheletro
delle directory .kde e .mozilla.

4.3.6

Il Name Service Switch

Una delle funzionalit`


a di base fornite fin dai primi Unix dalle librerie standard del sistema (nel
caso di Linux le glibc) `e quella che consente di associare agli identificativi numerici utilizzati dal
kernel dei nomi simbolici di pi`
u immediata fruizione. In generale tutto ci`o viene realizzato grazie
ad una serie di funzioni che permettono ai programmi di ottenere queste informazioni, come le
corrispondenze fra nomi degli utenti e user ID o fra nomi dei gruppi ed il group ID, che come
abbiamo visto in sez. 4.3.2, venivano mantenute nei file /etc/passwd e /etc/group.
In generale oltre che per i nomi degli utenti e dei gruppi, il problema di ottenere delle
corrispondenze fra un identificativo numerico ed un valore simbolico si presenta anche in altri
casi, ad esempio con le corrispondenze fra nomi assegnati alle macchine e gli indirizzi di rete.120
Tradizionalmente queste corrispondenze, e le ulteriori informazioni ad esse collegate, venivano
mantenute in opportuni file di configurazione posti sotto /etc. Con levolversi delle funzionalit`
a
disponibili sui sistemi pi`
u moderni si `e progressivamente manifestata la necessit`a di mantenere
questo tipo di informazioni anche in maniera diversa, come quella di centralizzarle per interi
gruppi di macchine tramite opportuni servizi di rete.121
un codice di errore; nologin `e stato creato apposta per essere usato come restricted shell da assegnare agli utenti
di servizio che non necessitano di avere un accesso al sistema.
119
si ricordi che, come accennato in sez. 3.1.1, molti programmi consentono allutente di usare configurazioni
personalizzate con dei file nella propria home.
120
torneremo su questo argomento in sez. 7.4.2 quando tratteremo questo tipo di corrispondenze associate ai
parametri relativi alla rete.
121
gli esempi pi`
u comuni sono il NIS (Network Information Service) ed LDAP (Lightweight Directory Access
Protocol ) due servizi di rete con cui si possono centralizzare le informazioni relative agli utenti.

230

CAPITOLO 4. AMMINISTRAZIONE ORDINARIA DEL SISTEMA

Con lintroduzione di estensioni che consentissero luso di queste nuove funzionalit`a si presentava per`o anche il problema di come indicare alle varie funzioni di libreria dove prendere le
informazioni. Allinizio questo veniva fatto introducendo tutta la casistica possibile nellimplementazione delle funzioni stesse, con degli ovvi problemi di estensibilit`a e compatibilit`a. Per
risolvere il problema allora `e stata creata una interfaccia generica, il Name Service Switch,122
che permette di demandare a delle librerie esterne, configurabili in maniera indipendente, le
modalit`a con cui queste informazioni vengono ottenute.
Il grande vantaggio del Name Service Switch `e che diventa possibile definire in maniera
modulare ed estendibile sia delle classi di informazioni, cosicche qualora si debba fornire qualche
nuovo servizio si ha linfrastruttura gi`
a pronta, che il supporto su cui queste informazioni sono
mantenute, che pu`
o essere su file, database o servizi di rete; `e possibile inoltre indicare al sistema
anche in quale ordine utilizzare le varie fonti, permettendo anche configurazioni ibride.
Le modalit`a di funzionamento del Name Service Switch vengono gestite attraverso il suo
file di configurazione principale che `e /etc/nsswitch.conf; un esempio di questo file, come
installato su una Debian Sid, `e il seguente:
#
#
#
#
#

/etc/nsswitch.conf
Example configuration of GNU Name Service Switch functionality.
If you have the glibc-doc and info packages installed, try:
info libc "Name Service Switch" for information about this file.

passwd:
group:
shadow:

compat
compat
compat

hosts:
networks:

files dns
files

protocols:
services:
ethers:
rpc:

db
db
db
db

netgroup:

nis

files
files
files
files

Il formato del file `e sempre lo stesso, le linee vuote o che iniziano per # vengono ignorate, le
altre linee indicano una opzione. La pagina di manuale contiene una lista completa delle opzioni
disponibili. La prima colonna, terminata dal carattere : indica una classe di informazioni,
di seguito vengono elencate, separate da spazi, le modalit`a con cui queste informazioni possono
essere ottenute; la ricerca dei dati sulle varie fonti sar`a eseguita nellordine in cui queste sono
indicate. Lelenco delle classi di informazioni disponibili `e riportato in tab. 4.28, ulteriori dettagli
possono essere ottenuti consultando la pagina di manuale del file o la sezione Name Service Switch
delle pagine info delle glibc.
Delle varie classi di informazioni riportate in tab. 4.28 le prime tre sono utilizzate per gestire
in maniera modulare i dati relativi ad utenti e gruppi, esattamente come questi sono presenti negli
omonimi file sotto /etc visti in sez. 4.3.2. Le altre attengono ad altre propriet`a, principalmente
legate agli identificativi usati dai protocolli di rete, che tratteremo pi`
u avanti in sez. 7.4.
Per ciascuna modalit`
a di gestione delle informazioni deve esistere una opportuna libreria che
garantisca laccesso alle stesse con quella modalit`a; queste librerie si trovano tutte sotto /lib/ e
devono avere un nome del tipo libnss_NOME.so.X, dove X fa riferimento alla versione delle glibc
che si sta usando,123 mentre NOME indica il tipo di supporto per quellinformazione, cos` come
122

il sistema venne introdotto la prima volta nelle librerie standard di Solaris, le librerie standard GNU hanno
ripreso in seguito lo stesso schema.
123
vale 1 per le glibc 2.0 e 2 per le glibc 2.1 e successive.

4.3. LA GESTIONE DI UTENTI E GRUPPI


Classe
shadow

passwd
group
aliases
ethers
hosts
netgroup
networks
protocols
rpc
services

231

Tipo di corrispondenza
corrispondenze fra username, shadow password ed altre
informazioni relative alla gestione delle password (vedi
sez. 4.3.2).
corrispondenze fra username, identificatori di utente e
gruppo principale, shell di default, ecc. (vedi sez. 4.3.2).
corrispondenze fra nome del gruppo e propriet`
a dello
stesso (vedi sez. 4.3.2).
alias per la posta elettronica.
corrispondenze fra numero IP e MAC address della
scheda di rete (vedi sez. 7.6.4).
corrispondenze fra nome a dominio e numero IP (vedi
sez. 7.4.3).
corrispondenze gruppo di rete e macchine che lo
compongono.
corrispondenze fra nome di una rete e suo indirizzo IP
(vedi sez. 7.4.4).
corrispondenze fra nome di un protocollo e relativo
numero identificativo (vedi sez. 7.4.4).
corrispondenze fra nome di un servizio RPC e relativo
numero identificativo (vedi sez. 7.6.5).
corrispondenze fra nome di un servizio e numero di porta
(vedi sez. 7.4.4).

Tabella 4.28: Le diverse classi di corrispondenze definite allinterno del Name Service Switch.

viene scritto in /etc/nsswitch.conf (nel caso dei supporti citati nellesempio sar`a files, db,
compat, ecc.).
Di norma non c`e niente da cambiare in /etc/nsswitch.conf, a meno che non si debba
aggiungere un ulteriore supporto da cui ottenere le informazioni. Ad esempio nel caso delle
informazioni relative agli utenti si potrebbe voler utilizzare un sistema di autenticazione centralizzato su un servizio di rete come LDAP; in quel caso si dovr`a installare lapposito pacchetto di
supporto,124 ed inserire il relativo nome (nel caso ldap) in posizione opportuna nellelenco dei
supporti su cui sono disponibili le informazioni.125
La configurazione di default del Name Service Switch, quella vista nellesempio precedente,
prevede soltanto luso dei file classici trattati in sez. 4.3.2, ma questo, pur restando ancora oggi
quello pi`
u diffuso, `e solo uno dei metodi per mantenere le informazioni riguardo gli account degli
utenti. Pertanto esaminare il contenuto di questi file non `e detto sia sufficiente ad identificare
tutti gli utenti di un sistema, in quanto in generale le informazioni potrebbero essere mantenute
anche altrove.
Per questo motivo `e disponibile un apposito comando, getent, che consente di interrogare
in maniera generica il sistema dal Name Service Switch ed ottenere una lista completa anche
quando le informazioni sono distribuite su pi`
u supporti. Il comando richiede come argomento
il nome della classe di informazioni gestite dal Name Service Switch per la quale si vogliono
ottenere i dati, da indicare con uno dei valori riportati in tab. 4.28, dopo di che esegue una
ricerca su tutti i supporti attivi per tale classe e stampa a video il risultato.
Come si pu`
o notare da tab. 4.28 le classi relative alle informazioni degli utenti e dei gruppi
gestite dal Name Service Switch hanno un nome corrispondente al file in cui sono mantenute
dal sistema delle shadow password, ed anche il formato con cui esse vengono mostrate attraverso
luso di getent segue la stessa regola; pertanto volendo ottenere una lista completa degli utenti si
potr`a eseguire il seguente comando, ottenendo un risultato analogo al contenuto di /etc/passwd:
124

nel caso di Debian questo `e libnss-ldap, che fornisce la libreria libnss_ldap.so.2 ed i relativi file di
configurazione.
125
per un esempio dettagliato di questa configurazione si consulti la sez. 1.4 di [IS-LDAP].

232

CAPITOLO 4. AMMINISTRAZIONE ORDINARIA DEL SISTEMA


piccardi@hain:~/truedoc/corso$ getent passwd
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/bin/sh
...
piccardi:x:1002:1002:Simone Piccardi,,,:/home/piccardi:/bin/bash
admin:x:1003:1003:Utente Amministrativo,,,:/home/admin:/bin/bash

dove per`o, se presenti, compariranno anche i dati mantenuti in tutti gli eventuali altri supporti
utilizzati dal Name Service Switch.

4.3.7

I Pluggable Authentication Modules

La necessit`a di una maggiore flessibilit`


a della gestione degli utenti non riguarda soltanto la
possibilit`a di mantenere su diversi supporti i dati loro associati, ma anche e soprattutto quella
di permettere la gestione di diverse modalit`a per gestire lautenticazione. A questo provvede il
sistema chiamato Pluggable Authentication Modules, in breve PAM, introdotto inizialmente su
Solaris e poi portato anche su GNU/Linux.
Lidea `e quella di realizzare un meccanismo che ricopra per i programmi di autenticazione il
ruolo che ha il Name Service Switch per quelli che richiedono una corrispondenza fra identificatori numerici e simbolici. Dato che in questo caso la richiesta `e pi`
u sofisticata il sistema sar`a
pi`
u complesso, ma in sostanza si tratta sempre della definizione di una interfaccia di programmazione generica per cui tutti i programmi che necessitano di compiere una qualche forma di
autenticazione (come login o passwd) lo fanno attraverso una libreria che fa da intermediario
rispetto al meccanismo con cui poi le operazioni vengono effettivamente svolte, cos` che questo
possa essere, in maniera totalmente trasparente ai programmi scelti, sostituito con un altro.
Nel gestire linsieme dei metodi per lautenticazione e laccesso al sistema PAM suddivide il
lavoro in quattro tipologie di servizio indipendenti fra loro, illustrate in tab. 4.29, dove si sono
riportate anche le quattro parole chiave usate nelle configurazioni per identificarle.
Servizio
account
auth

password
session

Significato
fornisce il servizio di verifica della presenza di un account e della relativa
validit`
a (le password sono scadute, si pu`
o accedere al servizio, ecc.).
fornisce il servizio di verifica dellidentit`
a di un utente, in genere sulla base di un meccanismo di sfida/risposta (come dare la password),
ma pu`
o essere esteso in maniera generica (permettendo luso anche di
dispositivi ausiliari come smart-card, apparati biometrici ed altro).
fornisce il servizio di aggiornamento dei meccanismi di autenticazione
(come cambiare la password), ed `e strettamente collegato ad auth.
fornisce i servizi di preparazione per le risorse che devono essere messe a
disposizione dellutente (ad esempio il montaggio della home directory)
allinizio di una sessione di lavoro e quelli relativi alla liberazione delle
stesse alla fine della sessione.
Tabella 4.29: Le quattro tipologie di servizi forniti da PAM.

La flessibilit`
a di PAM `e dovuta al fatto che il sistema `e implementato come una libreria
dinamica che permette di caricare una serie di moduli, usualmente mantenuti in /lib/security,
che realizzano diverse funzionalit`
a in una o pi`
u delle classi di tab. 4.29. Una delle caratteristiche
pi`
u interessanti di PAM `e che questi moduli possono essere impilati in modo da combinare le
funzionalit`a di ciascuno nella fornitura di un determinato servizio. Inoltre il sistema permette
di utilizzare impostazioni diverse per le differenti applicazioni che lo usano.
La configurazione di PAM pu`
o essere effettuata in due modi; quello pi`
u comune `e luso di una
serie di file, uno per ciascuna applicazione che usa il sistema, posti nella directory /etc/pam.d/.
In questo modo infatti `e molto pi`
u semplice per le singole applicazioni mantenere un proprio
file di configurazione. Ogni applicazione che necessita delluso del sistema sar`a controllata da

4.3. LA GESTIONE DI UTENTI E GRUPPI

233

un suo file il cui nome corrisponde a quello del relativo servizio, in genere questo coincide con
quello dellapplicazione stessa, si avranno cio`e file come login, su, passwd, ecc. Uno di questi
nomi, other, `e riservato e serve per indicare le regole di default che verranno applicate tutte le
volte che non viene richiesto un servizio specifico.
Ciascun file contiene una regola per riga, usata per invocare un determinato modulo; si
pu`o proseguire una regola su pi`
u righe terminandole con il carattere \, ed al solito righe
vuote ed inizianti per # vengono ignorate. Una regola `e sempre composta da almeno tre
campi separati da spazi (o tabulatori), al terzo di questi campi, che indica il modulo di PAM
da utilizzare, possono seguire ulteriori campi che specificano degli argomenti per il modulo, in
numero variabile che dipende dal modulo stesso. La forma generica di una regola da utilizzare
in un file di /etc/pam.d/ pertanto `e:
type

control

module-path

[arguments ...]

Il primo campo, denominato type, indica, con una delle parole chiave di tab. 4.29, la classe
di servizi a cui la regola fa riferimento. Il secondo campo, control, serve a definire il comportamento che si dovr`
a avere in caso di successo o fallimento del compito assegnato al modulo. Per
indicare un valore in questo campo nella gran parte dei casi si pu`o usare una sintassi semplificata
che prevede lutilizzo di una delle parole chiave riportate in tab. 4.30, tramite le quali si indica
lazione che deriva dal controllo effettuato.
Controllo
requisite

required

sufficient
optional
optional

Significato
il fallimento del modulo invocato comporta limmediata terminazione
della procedura di valutazione, gli altri eventuali moduli non verranno
invocati.
il fallimento del modulo comporta il fallimento della procedura di valutazione, ma gli altri moduli specificati nelle regole seguenti vengono
comunque invocati.
il successo del modulo comporta il successo delloperazione, fintanto che
nessun precedente modulo required `e fallito.
il successo o il fallimento del modulo non ha nessuna influenza sul
risultato finale a meno che questo non sia lunico modulo utilizzato.
il successo o il fallimento del modulo non ha nessuna influenza sul
risultato finale a meno che questo non sia lunico modulo utilizzato.

Tabella 4.30: I principali valori per il campo di controllo dei risultati usati nei file di configurazione di PAM.

Infine il terzo campo indica il file (in genere una libreria condivisa, quindi un file .so)
contenente il codice del modulo. Questo viene normalmente espresso con un pathname relativo
alla directory /lib/security/ dove vengono usualmente installati i moduli;126 al nome del
modulo pu`
o seguire una lista (separata da spazi) degli argomenti da passare a questultimo, che
varia da modulo a modulo a seconda delle funzionalit`a da esso fornite.127
Una forma alternativa di configurazione, oggi totalmente in disuso, `e quella delluso del file
/etc/pam.conf in cui si inseriscono tutte le regole di gestione che starebbero dentro i file di
/etc/pam.d.128 Il file prevede una linea per ciascuna regola ed al solito si ignorano le righe
vuote e quelle inizianti per #; la differenza con il precedente formato `e che queste prendono un
ulteriore campo iniziale che indica il servizio cui la regole fa riferimento (quello che in /etc/pam.d
sarebbe il nome del file), pertanto una regola sar`a nella forma:
service

type

control

module-path

[arguments ...]

dove service indica il nome dellapplicazione cui si applica la regola (quello che con /etc/pam.d
`e il nome del file).
126

si pu`
o comunque usare un file qualunque, specificando un pathname assoluto.
anche se come vedremo esistono alcuni valori utilizzabili per qualunque modulo.
128
se questultima `e presente il file /etc/pam.conf viene ignorato.
127

234

CAPITOLO 4. AMMINISTRAZIONE ORDINARIA DEL SISTEMA

La configurazione di un programma per luso PAM prevede che nel corrispondente file sotto
/etc/pam.d si elenchino, per ciascuna delle quattro classi di servizio illustrate in tab. 4.29, i
moduli che si vuole siano da esso utilizzati. Come accennato questi possono essere impilati, vale
a dire che si pu`
o richiedere per un singolo servizio luso di pi`
u moduli in successione in modo da
poter eseguire diversi tipi di richieste o di operazioni di controllo e gestione. Ad esempio si pu`o
voler usare una procedura di autenticazione che prenda in considerazione sia le credenziali poste
nei file di sez. 4.3.2 che quelle poste in un qualche sistema di centralizzazione delle informazioni
come LDAP; in questo caso si specificheranno due moduli diversi, uno per autenticarsi sui file
classici e laltro per utilizzare LDAP.
Il sistema prevede che per ciascuna tipologia di servizio si elenchino i moduli che si vogliono utilizzare. Questi, normalmente, verranno eseguiti uno dopo laltro nellordine in cui sono
elencati. Sia lordine di esecuzione che il risultato finale dipendono per`o dallazione di controllo
richiesta in risposta al risultato di ciascun modulo, ad esempio con sufficient e requisite si
interrompe immediatamente la scansione della pila, mentre azioni come optional e required
fanno proseguire con lesecuzione dei moduli successivi.
Un altro aspetto dellesecuzione di ciascun modulo, anche questo dipendente dallazione di
controllo indicata, riguarda leffetto del risultato ottenuto modulo stesso sul risultato finale
restituito da PAM; ad esempio il fallimento ottenuto nellesecuzione di un modulo per cui si
`e utilizzato required o requisite comporta il fallimento dellintera procedura, optional `e
ininfluente,129 mentre sufficient ne comporta il successo, ma solo se non c`e stato in precedente
fallimento di un required.
Oltre alle azioni di controllo di tab. 4.30 si possono usare come valori per il campo control
altre due parole chiave: la prima `e include, che consente di indicare al posto di un modulo un
altro file da cui includere le impostazioni,130 in questo modo si possono mettere configurazioni
comuni a pi`
u servizi in un solo file.131 La seconda parola chiave `e substack, il cui effetto `e
analogo a quello di include con la differenza che le regole incluse dal file vengono considerate
come parte di una pila secondaria; questo comporta che quando le azioni di controllo impostate
nel file incluso richiedono la terminazione della scansione questa avviene solo per la parte inclusa
con tale direttiva e non per le altre regole contenute nel file da cui la `e usato substack.
Infine benche sia la scansione della pila dei moduli che il relativo risultato sia gestibile nella
maggior parte dei casi con le azioni di controllo espresse nella forma semplificata di tab. 4.30,
esistono casi in cui occorre un controllo pi`
u dettagliato, ottenibile soltanto attraverso la sintassi
completa che consente di specificare la singola azione da associare a ciascun possibile valore di
ritorno restituito dal modulo invocato. Per usare questa sintassi al posto delle parole chiave di
tab. 4.30 si deve specificare una lista di assegnazioni nella forma valore=azione compresa fra
parentesi quadre. Con valore si indica il nome simbolico associato al valore di ritorno, e con
azione lazione di controllo che si vuole gli sia associata.
Linterfaccia di PAM prevede infatti che tutti i moduli possono restituire una serie ben
precisa di valori di ritorno, ciascuno dei quali ha un preciso significato. Alcuni dei pi`
u comuni
sono success, dal significato evidente, ignore, che indica la richiesta di ignorare il modulo stesso
(cui in genere si assegna lazione omonima), new_authtok_reqd, che indica la richiesta di una
ulteriore credenziale di autenticazione, user_unknown che indica che lutente `e inesistente. La
lista completa dei nomi associati ai possibili valori di ritorno `e riportata nella pagina di manuale
129

a meno che questo non sia lunico risultato ottenuto.


la sintassi `e la stessa che si usa negli altri file.
131
delle configurazioni presenti nel file incluso verranno usate solo quelle che si applicano al tipo di servizio
specificato prima di include, questo significa che occorrer`
a ripetere la direttiva per ciascuno dei servizi di tab. 4.29;
nel caso di Debian viene fornita una sintassi non standard, nella forma di una direttiva @include file da mettere
su una sola riga, che consente di utilizzare tutte le configurazioni messe dentro file, vengono poi creati per le
configurazioni di default anche quattro file common-*, uno per ciascuno dei servizi di tab. 4.29, che vengono inclusi
da praticamente tutti i file di /etc/pam.d/.
130

4.3. LA GESTIONE DI UTENTI E GRUPPI


Azione
bad

die
done
ignore
ok

reset

235

Significato
indica che il valore di ritorno ottenuto deve essere considerato come
un fallimento della richiesta effettuata al modulo, e se questo `e il primo
fallimento avuto nella scansione della pila questo sar`
a usato anche come
risultato finale.
equivalente alluso di bad ma con lulteriore effetto di concludere
immediatamente la scansione della pila.
equivalente alluso di ok, ma con lulteriore effetto di concludere
immediatamente la scansione della pila.
il valore di ritorno ottenuto viene ignorato e non avr`
a nessun effetto sul
risultato finale.
indica che il codice di ritorno deve essere considerato come un successo
della richiesta effettuata al modulo; ma questo verr`
a utilizzato solo
come risultato finale solo se non sono presenti fallimenti precedenti.
cancella lo stato corrente ottenuto dai risultati dei precedenti moduli
della pila, ripartendo da zero dal modulo successivo.

Tabella 4.31: Azioni associabili ad un valore di ritorno di un modulo di PAM.

della configurazione, accessibile con man pam.conf, ma la documentazione del loro significato `e
praticamente nulla.132 Inoltre si pu`
o utilizzare il nome speciale default per comprendere tutti
i valori non esplicitamente indicati in risposta ai quali impostare una azione prestabilita.
Come azione associabile a ciascun valore di ritorno si pu`o specificare o un intero positivo n o
una delle parole chiave riportate in tab. 4.31. Nel primo caso si richiede di saltare allinterno della
pila dei moduli per andare ad eseguire quello che segue il modulo corrente di n posizioni, senza
che questi contribuisca al risultato finale; nel secondo caso lazione sar`a invece quella associata
alla parola chiave secondo quanto illustrato in tab. 4.31. Lespressione dei codici semplificati di
tab. 4.30 nei termini di questa sintassi completa `e la seguente:
required equivale a [success=ok new_authtok_reqd=ok ignore=ignore default=bad]
requisite equivale a [success=ok new_authtok_reqd=ok ignore=ignore default=die]
sufficient equivale a [success=done new_authtok_reqd=done default=ignore]
optional equivale a [success=ok new_authtok_reqd=ok default=ignore]
ed una possibile configurazione che non rientra in questo schema semplificato potrebbe essere la
seguente:133
[success=ok ignore=ignore user_unknown=ignore default=die]
simile alluso di requisite, ma che evita il fallimento immediato in caso di utente non esistente,
facendo arrivare ai moduli successivi.134
La potenza di PAM sta nella grande variet`a di moduli che mette a disposizione per realizzare
i compiti pi`
u disparati. Ciascuno di questi prevede, come accennato, la possibilit`a di essere
invocato passandogli degli argomenti che consentono di controllarne il comportamento. Prima
di esaminare i moduli pi`
u importanti, ed il relativo funzionamento, `e per`o opportuno citare
il fatto che esistono una serie di argomenti generici, riportati in tab. 4.32, che possono essere
utilizzati per qualunque modulo.135
In particolare sono molto utili argomenti come use_first_pass e try_first_pass che consentono, quando si utilizzano pi`
u moduli che devono eseguire una operazione richiedendo una
132

viene fatto riferimento al file /usr/include/security/_pam_types.h che nei commenti ha qualche breve
spiegazione.
133
ripresa da quanto specificato per il modulo pam_securetty.so per la configurazione di login.
134
lo scopo `e evitare che si possa distinguere dalla procedura di login se un utente esiste o meno.
135
anche se in realt`
a hanno effetto soltanto se il modulo stesso ne prevede lutilizzo.

236

CAPITOLO 4. AMMINISTRAZIONE ORDINARIA DEL SISTEMA


Argomento
use_first_pass

try_first_pass

expose_account

use_authtok

Significato
il modulo non deve richiedere una password allutente ma
usare quella gi`
a fornita in una precedente invocazione di
un altro modulo; se questa non `e valida allutente non
saranno fatte ulteriori richieste (largomento `e valido solo
per i servizi auth e passwd).
il modulo deve usare la password gi`
a fornita in una precedente invocazione di un altro modulo, ed eseguire direttamente una richiesta qualora questa non sia valida
(largomento `e valido solo per i servizi auth e passwd).
segnala al modulo che pu`
o essere pi`
u permissivo nel rivelare informazioni riguardo lutente (in genere questo
viene evitato per non fornire appigli ad un attaccante).
forza il modulo a non richiedere una nuova password
(quando si esegue una cambiamento della stessa) ma
ad usare quella proveniente da un modulo precedente
(largomento `e valido solo per il servizio passwd).

Tabella 4.32: Alcuni argomenti generici che possono essere passati ai moduli di PAM.

password, di non ripetere la richiesta ad ogni invocazione, facendo invece riferimento a quanto
immesso nella invocazione di un modulo precedente.
Il primo dei moduli che prendiamo in considerazione `e pam_unix,136 che `e senza dubbio
uno dei pi`
u importanti in quanto `e quello che fornisce autenticazione e gestione delle risorse
degli utenti secondo le modalit`
a classiche di Unix ed `e il default usato dalla gran parte delle
distribuzioni. Il modulo utilizza i file di sez. 4.3.2 per quanto riguarda sia la verifica che il
cambiamento della password, sia per i controlli ausiliari relativi alla validit`a dellutenza e delle
credenziali e delle relative scadenze; si incarica inoltre di registrare gli accessi nei log di sistema;
per questo motivo deve essere utilizzato per tutti e quattro i servizi auth, password, account e
session.
Luso di questo modulo implementa in sostanza il funzionamento classico di un sistema Unix
cos` come era prima delluso di PAM, anche se sono presenti alcune piccole differenze e migliorie.
Una differenza `e che agli utenti senza password viene comunque negato laccesso, a meno di
non aver passato lopzione nullok come argomento; con nullok_secure inoltre si pu`o garantire
laccesso senza password, ma solo se questo avviene su uno dei terminali consentiti elencati in
/etc/securetty (vedi sez. 4.3.5).137
Alcune estensioni vengono attivate con luso di altri argomenti, ad esempio si pu`o richiedere
la cifratura della password con algoritmi diversi usando le opzioni md5, sha256, sha512,138
imporre una dimensione minima della stessa con largomento min=n dove n indica il numero
di caratteri, o impedire il riuso delle ultime n password utilizzate con remember=n.139 Queste
opzioni, attenendo al cambiamento della password, hanno effetto solo se indicate sul servizio
password.
Oltre a pam_unix per reimplementare il comportamento classico di un sistema Unix sono
disponibili una serie di altri moduli elementari che consentono di utilizzare attraverso PAM i vari
file di configurazione della procedura di login illustrati in sez. 4.3.5. Ad esempio usare pam_motd
sul servizio session consente di stampare il contenuto di /etc/motd allinizio di una sessione,
mentre sul servizio auth si possono usare pam_nologin per disabilitare laccesso agli utenti
136

in questa trattazione indicheremo i moduli per nome, tralasciando il .so finale, che per`
o deve essere usato
quando li si richiamano nelle configurazioni di /etc/pam.d.
137
queste due opzioni hanno effetto solo se usate sul servizio auth.
138
la configurazione di default prevede luso di md5 per lalgoritmo MD5, gli altri sono algoritmi alternativi, e
pi`
u sicuri, che possono essere utilizzati qualora siano supportati.
139
le vecchie password saranno mantenute in /etc/security/opasswd, cos` da evitare il riutilizzo.

4.3. LA GESTIONE DI UTENTI E GRUPPI

237

normali se `e presente /etc/nologin e pam_securetty per impedire laccesso allamministratore


dai terminali non elencati in /etc/securetty.
Un altro modulo che consente di ottenere in maniera generica con PAM una delle funzionalit`
a
fornite una volta direttamente da login `e pam_limits,140 che consente di imporre dei limiti
su alcune delle risorse del sistema che un utente pu`o utilizzare durante una sessione, come un
numero massimo di processi contemporanei, numero di file aperti, quantit`a di memoria utilizzata,
il tempo massimo di CPU, ed altre risorse pi`
u complesse.
Il kernel infatti supporta la possibilit`a per qualunque processo di impostare una serie di limiti
su alcune delle risorse che da esso verranno utilizzate. Questi limiti possono essere impostati
solo allinterno del singolo processo,141 ma vengono ereditati nella creazione di eventuali processi
figli ed in questo modo una volta impostati su un processo iniziale (ad esempio la shell di login)
possono essere mantenuti per tutti i comandi da essa eseguiti.
La shell consente di controllare i limiti sulle risorse con il comando interno ulimit, che oltre a
mostrare la situazione corrente (con lopzione -a che stampa i valori correnti dei limiti) permette
anche di impostarne i valori. Questi, come avviene per le quote disco che tratteremo in sez. 6.4,
prevedono la possibilit`
a di avere due valori, un limite soffice (o soft limit, selezionabile con
lopzione -S) o un limite duro (hard limit, selezionabile con lopzione -H). Per le altre opzioni,
che permettono di indicare il limite ed il relativo valore, si consulti la pagina di manuale della
shell.
` cura del kernel assicurarsi che un processo non possa utilizzare una risorsa per valori supeE
riori a quelli indicati nel rispettivo limite soffice, generando un errore quando questi vengono
raggiunti. Il valore del limite duro serve invece come tetto massimo che pu`o essere assegnato
ad un limite soffice. Un utente ordinario pu`o imporsi dei limiti assegnando un valore sia al
limite soffice che a quello duro, il primo per`o non potr`a mai superare quello del secondo.
Inoltre una volta che un utente abbia impostato un limite duro il valore di questultimo potr`
a
142
solo essere ulteriormente ridotto.
Luso dei limiti consente di contrastare efficacemente i comportamenti inappropriati di quegli
utenti che cercano di abusare delle risorse del sistema dando origine ad eventuali disservizi.143 Il
problema `e che i limiti devono essere imposti dallamministratore solo a monte della procedura
di collegamento al sistema; nel caso di un login da console questo potrebbe essere fatto usando
il comando ulimit nel file /etc/profile, ma varrebbe solo per le shell che usano questo file,
ed inoltre il limite verrebbe applicato in maniera indifferenziata.
La soluzione a questo problema viene fornita appunto dal modulo pam_limits, da inserire
come requisite nelle regole associate al servizio session per i vari programmi che danno accesso
al sistema. Il modulo si appoggia al file /etc/security/limits.conf allinterno del quale si
possono impostare tutti i limiti che verranno attivati fin dallinizio della sessione di lavoro, e
mantenuti pertanto nel corso della stessa. Il file prevede una sintassi molto semplice dove al
solito righe vuote o inizianti con # vengono ignorate; ciascuna riga `e divisa in quattro campi
separati da spazi, nella forma:
domain

type

item

value

Il primo campo, domain, indica a chi si applica la regola, vi si pu`o specificare un nome utente,
o un nome di gruppo (apponendovi il carattere @), o lindicazione di un valore di default usando
il carattere *. Il secondo campo, type, specifica il tipo di limite e pu`o essere soft o hard per
indicare i rispettivi tipi, o - per indicare un limite sia soft che hard. Il terzo campo, item,
140

le versioni di login precedenti alluso di PAM, effettuavano direttamente limpostazione dei limiti con il file
/etc/limits, oggi non pi`
u utilizzato.
141
per i dettagli sul funzionamento si pu`
o consultare sez. 8.3.2 di [GaPiL].
142
lamministratore pu`
o alzare anche i valori del limite duro.
143
o ad evitare tentativi espliciti di disservizio come le fork bomb, in cui si lanciano un numero indefinito di
processi fino a bloccare completamente il sistema.

238

CAPITOLO 4. AMMINISTRAZIONE ORDINARIA DEL SISTEMA

indica a quale risorsa si vuole applicare il limite, il cui valore deve essere indicato nellultimo
campo. Ciascuna risorsa viene identificata da una parola chiave, ed uno specifico intervallo ed
unit`a di misura per il valore del limite; si sono riportate le pi`
u rilevanti in tab. 4.33, per lelenco
completo si consulti la pagina di manuale, accessibile con man limits.conf.
Nome
fsize
nofile
cpu
nproc
maxlogins

maxsyslogins

nice

Risorsa
massima dimensione utilizzabile per un singolo file.
massimo numero di file che un processo pu`
o aprire in
contemporanea.
massimo tempo di CPU utilizzabile dal singolo processo.
numero massimo di processi che possono essere creati
dallo stesso utente.
numero massimo di collegamenti contemporanei al sistema da parte dellutente (valido solo per utenti
normali).
numero massimo di collegamenti contemporanei al sistema (come somma di quelli tutti gli utenti) oltre il quale
lutente non avr`
a accesso.
massimo valore di nice che pu`
o essere assegnato ad un
processo.

Tabella 4.33: Nomi delle principali risorse che possono essere specificate come valore per il terzo campo di
/etc/security/limits.conf.

Si noti poi come oltre alle limitazioni sulluso delle risorse da parte dei singoli processi,
pam_limits consenta anche di impostare limiti relativi alla situazione generale del sistema,
come quelli sul numero massimo di collegamenti contemporanei. Un esempio del contenuto di
questo file potrebbe essere il seguente:
*
*
@student
@student
@student

hard
hard
hard
hard
-

nproc
nofile
nproc
nofile
maxlogin

1024
1024
100
100
10

Un primo esempio di come le funzionalit`a dei tradizionali possono essere estese attraverso
luso di PAM `e quello del modulo pam_cracklib, da utilizzare nel servizio password. Il modulo consente di impostare delle politiche di gestione sul tipo di password usate dagli utenti,
supportando una analisi di quelle da essi fornite nei confronti di un dizionario per evitare luso
di parole comuni facili da indovinare. Consente cos` allamministratore di imporre criteri che
garantiscano una sufficiente complessit`
a delle stesse per rendere pi`
u difficoltoso anche un attacco
a dizionario.
Luso del modulo fa s` che alla prima immissione di una password questa venga controllata
per verificarne una sufficiente complessit`
a sia facendo ricorso ad un dizionario che ad eventuali
regole aggiuntive. Se il controllo viene passato allora verr`a effettuata la seconda richiesta per
conferma, altrimenti la password sar`
a rifiutata e allutente sar`a richiesto di immetterne una
diversa con un breve messaggio esplicativo. Il modulo usa le librerie cracklib, da cui deriva il
nome, per effettuare il controllo della password nei confronti di uno o pi`
u dizionari di parole
comuni ed applica poi una serie di controlli ulteriori controlli, come il fatto che la nuova password
non sia troppo simile alla predente, o troppo corta o gi`a usata in precedenza come per pam_unix.
Il modulo prevede una serie di argomenti che consentono di controllare le condizioni aggiuntive. Con minlen, assegnato ad un intero positivo, si indica la lunghezza minima di una password;
il default `e 9, ma al numero di caratteri effettivo viene aggiunto anche un bonus di un punto per
ciascun tipo di carattere diverso che si `e messo nella password (numero, maiuscola, minuscola o
punteggiatura) per cui si pu`
o superare il limite anche con un numero inferiore di caratteri. Un
altro argomento che consente di agire sulla complessit`a richiesta `e difok (anchesso da assegnare

4.4. AMMINISTRAZIONE SISTEMISTICA DI UNA BASE DI DATI

239

ad un intero positivo) che richiede il numero minimo di caratteri che devono essere diversi dalla
password precedente. Un esempio di uso di questo modulo `e il seguente:
password

required pam_cracklib.so difok=3 minlen=10

Un secondo esempio di estensione delle funzionalit`a di controllo che tramite PAM possono
essere applicate a qualunque programma, `e quello del modulo pam_listfile. Questo modulo
infatti consente di attivare un meccanismo di restrizione dellaccesso basato sul contenuto di
un file in cui si elenca la lista dei valori consentiti o proibiti di una certa propriet`a associata
alla sessione (username, terminale, macchina da cui ci si collega, ecc.). In questo modo diventa
possibile applicare restrizioni aggiuntive, indipendenti fra loro, al singolo programma che usa il
modulo.
Valore
tty
user
rhost
ruser
group
shell

Significato
terminale di accesso.
nome dellutente.
macchina remota.
utente remoto.
gruppo dellutente.
shell di login.

Tabella 4.34: Valori usabili per largomento item del modulo pam_listfile.

La propriet`
a della sessione che si vuole controllare nei confronti della propria lista si imposta
con largomento item, da assegnare ad uno dei valori di tab. 4.34. Gli altri argomenti necessari
al funzionamento del modulo sono sense cui assegnare rispettivamente i valori allow o deny
a seconda che si voglia usare la lista per consentire o negare laccesso e file, cui assegnare il
pathname che identifica il file in cui mette lelenco dei valori della propriet`a indicata con item.
La documentazione pi`
u dettagliata sul modulo ed i suoi argomenti pu`o essere ottenuta dalla
relativa pagina di manuale, accessibile con man pam_listfile.

4.4

Amministrazione sistemistica di una base di dati

Benche la gestione delle basi di dati sia una attivit`a usualmente distinta dalla gestione sistemistica,144 la diffusione delluso dei database relazionali comporta anche per lamministratore
di sistema la necessit`
a di avere un minimo di nozioni al riguardo. Pertanto in questa sezione
tratteremo le problematiche di gestione di un database esclusivamente dal punto di vista di un
amministratore di sistema, in particolare per quanto riguarda la gestione sistemistica di server
come PostgreSQL o MySQL, ed introdurremo alcune nozioni elementari sul linguaggio SQL.

4.4.1

Alcuni concetti base dei database relazionali

Benche la teoria dei database relazionali vada al di l`a di quanto interessa trattare in questo testo,
vale la pena illustrare alcune nozioni di base che consentano quantomeno di avere una idea del
quadro generale in cui si va ad operare quando si ha a che fare con queste problematiche, ed
introdurre un minimo di terminologia che consenta di orientarsi nella documentazione.
Si tenga comunque presente che il concetto di base di dati `e molto pi`
u generale di quello di
database relazionale, tanto che oggi si sta assistendo ad un fiorire di database, detti NoSQL, che
non adottano pi`
u questo modello, che `e sostanzialmente basato sulla strutturazione dei dati in
forma di tabelle. Per molti anni il vantaggio di avere un modello con una chiara rappresentazione
144

in genere a questo `e dedicata la figura del DBA (Data Base Administrator che richiede competenze specifiche sulle migliori modalit`
a di gestione dei dati e della loro ottimizzazione, tutti argomenti che non prenderemo
assolutamente in esame.

240

CAPITOLO 4. AMMINISTRAZIONE ORDINARIA DEL SISTEMA

matematica ed implementazioni ben funzionanti ha portato a cercare di ridurre tutti i problemi a questo modello,145 ma oggi ci si sta rendendo conto delle sue inadeguatezze e si stanno
sviluppando modelli alternativi, che sono pi`
u vicini al tipo di dati che si devono gestire.146
Semplificando molto una teoria piuttosto complessa, che non tratteremo neanche superficialmente, si pu`
o considerare un database relazionale come un insieme di tabelle di dati. Ogni
tabella `e costituita da un elenco di dati organizzati in righe (che vengono chiamate anche record
o tuple), dove ciascuna riga individua un singolo oggetto nella tabella. Ciascuna riga `e composta da una serie di campi detti campi o attributi (in inglese field o attributes), che vanno a
costituire le colonne della tabella. Avendo in genere detti campi un significato preciso, vengono
identificati da un nome, che viene a costituire la struttura della tabella stessa, definita appunto
come lelenco dei campi che ne costituiscono le righe.
In sostanza creare una tabella significa definire lelenco dei campi che compongono le righe
in essa contenute, associando a ciascuno di essi un nome identificativo ed il tipo di valore che
pu`o assumere.147 Una riga sar`
a costituita dalla serie dei valori avuti da ciascuno dei suoi campi,
alcuni dei quali possono anche essere assenti o indefiniti, nel qual caso si parla di valore nullo
(il cosiddetto null value), che viene identificato specificamente.148 Il contenuto di una tabella
`e semplicemente costituito dallinsieme dei record che essa contiene, che non `e previsto debba
avere alcun ordinamento specifico.
Uno dei concetti principali nei database relazionali infatti `e quello delluso delle cosiddette
chiavi per effettuare le ricerche. Il concetto `e di natura logica, tratta in sostanza di usare
i valori che hanno alcuni campi (sia presi singolarmente che eventualmente come insieme) per
ottenere i record che hanno quel valore. In pratica le chiavi non sono altro che i campi sui quali si
effettuano le ricerche.149 Quando una chiave consente di identificare in maniera univoca una riga
della tabella, si parla di chiave primaria (o primary key) della tabella.150 Questa caratteristica
ne comporta delle altre, ad esempio una primary key non pu`o avere valore nullo, non pu`o essere
modificata, e non pu`
o essere riutilizzata in caso di cancellazione della riga corrispondente.
Il nome di database relazionale dato a questo tipo di strutturazione dei dati deriva dal fatto
che una tabella pu`
o essere vista come una relazione151 fra i dati che la costituiscono, tanto che
talvolta questo (o linglese relation) `e un nome alternativo con cui vengono indicate le tabelle.
La potenza di un database relazionale sta nel fatto che grazie alle chiavi primarie si possono
definire delle relazioni fra tabelle diverse.152 Ad esempio si pu`o avere una tabella di autori ed
una di libri, e metterle in relazione fra loro usando ad esempio come campo autore nella tabella
dei libri il valore di una chiave primaria della tabella degli autori, in modo che questi possano
essere univocamente identificati, ed i loro dati mantenuti in maniera indipendente su una diversa
tabella; in questo caso il valore del campo `e quello che si chiama una chiave esterna o foreign
key.
In genere si indica con RDBMS (Relational Database Management System) il software che
consente di operare su dati mantenuti in un database relazionale, anche se spesso si finisce
semplicemente per chiamarlo database. Un RDBMS ad operare in maniera veloce ed efficiente
145

anche se esistono da molto tempo modelli alternativi, come quello ad albero usato da LDAP e quello chiavevalore usato da BerkleyDB.
146
la trattazione di questi argomenti va comunque al di l`
a dello scopo di questo testo.
147
esistono ovviamente diversi tipi di valori possibili, ed anche il tipo di valore va a costituire la struttura di una
tabella.
148
`e `e identificato nel linguaggio SQL che vedremo in sez. 4.4.4 da una opportuna parola chiave (NULL).
149
sui quali viene eseguita una opportuna indicizzazione in modo da renderle il pi`
u veloci possibile.
150
spesso queste le primary key vengono generate automaticamente per essere sicuri dellunivocit`
a, dato che
alcuni campi non `e detto abbiano questa propriet`
a.
151
il concetto deriva direttamente dallalgebra ed ha una fondazione matematica rigorosa, per approfondimenti
si consulti ad esempio http://it.wikipedia.org/wiki/Algebra_relazionale.
152
in realt`
a largomento sarebbe molto pi`
u ampio, ma la sua trattazione va al di l`
a di quanto appropriato per
questa introduzione.

4.4. AMMINISTRAZIONE SISTEMISTICA DI UNA BASE DI DATI

241

sui dati con il linguaggio SQL (che vedremo pi`


u avanti in sez. 4.4.4), esso deve pertanto gestire
da una parte linterpretazione del linguaggio e la esecuzione dei relativi comandi, dallaltro
lopportuno salvataggio dei dati e la loro integrit`a. In genere il software consente anche di
fornire degli opportuni controlli per laccesso e la manipolazione dei dati del database.

4.4.2

Configurazione e gestione di base di PostgreSQL

PostgreSQL `e uno dei pi`


u completi, stabili ed efficienti database server disponibili, che supporta
numerose funzionalit`
a avanzate come transazioni, subselect, trigger, viste, foreign key ed integrit`a referenziale che gli consentono di poter sostituire il ben pi`
u famoso (e costoso) Oracle, con
il quale `e in grado di lottare ad armi pari nella gran parte dei casi.
Non tratteremo linstallazione del programma, in quanto questo viene fornito gi`a pacchettizzato dalle principali distribuzioni,153 e trattandosi di un server di grande importanza per la
propria infrastruttura `e sempre opportuno utilizzare una versione pacchettizzata per la quale la
propria distribuzione garantisca il supporto per gli aggiornamenti. Anche PostgreSQL, come per
la gran parte degli RDBMS, adotta un modello client/server, in cui laccesso ai dati viene fornito
da un programma server (nel caso postmaster) cui si possono fare richieste tramiti opportuni
client, pertanto a seconda dei casi si dovranno installare i relativi pacchetti.
La configurazione (del server) viene mantenuta allinterno di una directory dipendente dalla
installazione, quando il programma viene installato dai sorgenti lapproccio degli sviluppatori `e
quello mantenere tutti i file, dati e configurazioni, nella directory di installazione; questo per`
o
contrasta con le direttive del Filesystem Hierarchy Standard, per cui le versioni pacchettizzate
possono fare scelte diverse. Ad esempio nel caso di Debian i file di configurazione vengono riportati in una directory sotto /etc/ nella forma /etc/postgresql/N.N/main (dove N.N `e il numero
della versione, ad esempio 7.4 o 8.3).154 Il file di configurazione principale `e postgresql.conf
che contiene le direttive di configurazione nella classica forma chiave=valore.155
Non staremo qui a trattare i dettagli della configurazione del server, che, riguardando principalmente le modalit`
a di gestione ed utilizzo dei dati e le relative ottimizzazione, vanno al di l`
a
dello scopo introduttivo di questo paragrafo, se per`o si vuole che il server possa essere raggiunto
via rete e non soltanto in locale occorrer`a inserire inserire la direttiva:156
listen_addresses = *

Il secondo file di interesse per la configurazione di PostgreSQL `e pg_hba.conf, che definisce


le regole per il controllo di accesso da parte dei client. Il file `e composto da una serie di
righe ciascuna delle quali indica una modalit`a di accesso, e la prima che corrisponde a quelle
effettivamente utilizzate verr`
a utilizzata.
Le righe sono composte di un serie di campi separati da spazi vuoti, il primo campo indica
la modalit`
a di connessione al server, ed in genere si usa o il valore local per usare un socket
locale, o il valore host per una connessione via rete. I due campi successivi sono identici
indipendentemente dal valore del primo campo: il secondo indica il nome del database a cui si
applica il criterio di accesso, ed il valore pi`
u comune `e all per indicarli tutti; il terzo indica
lutente, e di nuovo il valore all indica lutente generico.
Nel caso si sia usato come criterio di accesso host, i campi successivi servono per determinare
gli indirizzi di rete consentiti, si pu`
o specificare il singolo indirizzo e rete in notazione CIDR, o
153

nel caso di Debian sono addirittura pacchettizzate le diverse versioni stabili, e per Lenny sono disponibili sia
la versione 7.4 che la 8.3.
154
la scelta della sottodirectory con la versione `e dovuta al supporto contemporaneo di diverse versioni del
programma.
155
con la solita convenzione di ignorare righe vuote e tutto ci`
o che segue il carattere #.
156
il default `e ascoltare soltanto sullindirizzo locale (per i concetti relativi alle reti si rimanda al solito a sez. 7.2.

242

CAPITOLO 4. AMMINISTRAZIONE ORDINARIA DEL SISTEMA

in due campi separati indirizzo e maschera di rete.157 Si faccia attenzione, nel caso di singolo
indirizzo IP, a specificarlo comunque come rete in una delle due forme.
Nel caso si sia usato come criterio di accesso local, non `e necessario specificare nessun indirizzo e pu`o passare direttamente agli ultimi due campi che indicano il metodo di autenticazione
e le eventuali relative opzioni. In genere per le connessioni via rete si usa il metodo md5 che
indica che lutente deve essere autenticato con il valore della password cifrata mantenuto dal
server stesso. Nel caso di local si pu`
o far ricorso al metodo password, che richiede linvio di
una password in chiaro, o ident sameuser che richiede che il client sia posto in esecuzione da
un utente unix con lo stesso nome usato dal rispettivo utente del database.158
Un estratto di questo file, preso dalla versione installata di default da una Debian Lenny, `e
il seguente, sar`a necessaria una modifica soltanto nei casi in cui si vogliano consentire accessi da
altre reti, aggiungendovi una opportuna riga host:
# Database administrative login by UNIX sockets
local
all
postgres

ident sameuser

# TYPE

METHOD

DATABASE

USER

CIDR-ADDRESS

# "local" is for Unix domain socket connections only


local
all
all
# IPv4 local connections:
host
all
all
127.0.0.1/32
# IPv6 local connections:
host
all
all
::1/128

password
md5
md5

Il comando principale per usare il database `e psql che invoca il programma con cui ci si pu`o
connettere al database. Se usato interattivamente le istruzioni da eseguire verranno lette da un
prompt sul terminale, ma lo si pu`
o usare anche in modalit`a non interattiva facendo leggere le
istruzioni da un file o comunque con una redirezione dello standard input.
Il comando richiede come argomenti il nome del database a cui collegarsi e di seguito il
nome dellutente che si vuole utilizzare. Se non si specifica un database si potranno usare solo i
comandi di servizio che non fanno riferimento ai dati, e se non si specifica lutente verr`a usato
lusername dellutente con cui lo si invoca. Il default `e usare una connessione locale, ma ci si
pu`o collegare via rete indicando esplicitamente usando lopzione -h per indicare la macchina a
cui collegarsi (per indirizzo IP o nome a dominio).
Opzione
-h
-p
-f
-c
-l

Significato
si collega allindirizzo di rete passato come parametro.
si collega alla porta passata come parametro.
legge i comandi da eseguire file passato come parametro.
esegue il comando passato come parametro (da inserire
come stringa) ed esce immediatamente.
elenca i database disponibili sul server.

Tabella 4.35: Principali opzioni del comando psql.

Una volta effettuata la connessione al server, ed a meno che non si sia indicato un file da
cui leggere i comandi con lopzione -c o la redirezione dello standard input, il comando mette a
disposizione un prompt su cui scrivere interattivamente le proprie istruzioni dopo aver stampato
un messaggio di benvenuto con una legenda dei comandi di controllo pi`
u importanti,159 Questi si
157

al solito per queste notazioni si fa riferimento ai concetti spiegati in sez. 7.2.


questa `e la modalit`
a usata da Debian per dare accesso allutente postgres usato per la gestione generale del
database, creando un utente omonimo nel sistema, a cui viene anche assegnata la propriet`
a dei file del server.
159
trattasi di comandi che attengono alla gestione del server stesso, e non alle operazioni sui dati per i quali si
deve usare il linguaggio illustrato in sez. 4.4.4.
158

4.4. AMMINISTRAZIONE SISTEMISTICA DI UNA BASE DI DATI

243

distinguono dalle istruzioni previste dal linguaggio SQL160 in quanto sono preceduti dal carattere
\. Un elenco degli stessi pu`
o essere ottenuto con \?, mentre con \h si ottengono invece
i comandi SQL. Per uscire dal comando si pu`o usare \q. Gli altri comandi di controllo pi`
u
importanti sono riportati in tab. 4.36.
Comando
\c
\q
\l
\!
\d
\u
\q

Significato
si connette a un database (da passare come parametro).
esce dal programma.
stampa lelenco dei database presenti.
esegue il comando di shell passato come parametro.
stampa lelenco delle tabelle del database corrente.
stampa lelenco degli utenti.
esce dal programma.

Tabella 4.36: Principali comandi di controllo di psql.

Come accennato PostgreSQL fornisce anche un sistema di controllo degli accessi basato
sulla presenza di utenti a cui possono essere assegnati diversi permessi sia sulle possibilit`
a di
intervenire sui singoli database gestiti dal server, sia in termini di amministrazione generale
del server stesso. Gli utenti vengono mantenuti su delle tabelle interne al database, ma per
semplificarne la gestione sono stati creati due comandi appositi.161
Il primo `e createuser e si utilizza per creare un nuovo utente.
Il secondo `e createdb e si utilizza per creare un nuovo database.
Infine uno dei comandi pi`
u importanti per la gestione sistemistica di PostgreSQL `e pg_dump,
che consente di effettuare esportare di tutti i dati di un database in un file di testo contenente
tutte le istruzioni SQL necessarie a ricreare da zero un database con lo stesso contenuto di quello
esportato.
Da completare...

4.4.3

Configurazione e gestione di base di MySQL

MySQL `e il database server libero (disponibile con licenza GPL) pi`


u diffuso,162 usato da innumerevoli applicazioni Web, tanto da costituire la terza lettera dellacronimo LAMP.163 Le
sue caratteristiche sono la leggerezza e la semplicit`a di amministrazione, ma ha solo una parte
delle funzionalit`
a disponibili con PostgreSQL, anche se nella maggior parte dei casi queste sono
sufficienti.
Come per PostgreSQL non tratteremo le modalit`a di installazione, essendo gi`a disponibili i
relativi pacchetti in tutte le principali distribuzioni.164 Anche MySQL funziona adottando un
modello client/server, in cui laccesso ai dati viene eseguito tramite un programma server (nel
caso mysqld) cui si possono fare richieste con i relativi client, per luso dei quali si dovranno
installare i relativi pacchetti.
Il file di configurazione del server `e /etc/mysql/my.cnf, che contiene le direttive che ne
controllano il funzionamento e che consentono di ottimizzarne le prestazioni. Il formato `e molto
160

anche se in realt`
a alcuni di essi sono abbreviazioni predefinite dei comandi SQL necessari ad ottenere le
informazioni volute.
161
in realt`
a entrambi i comandi non sono che wrapper per i comandi SQL CREATE ROLE e DROP ROLE, e possono
essere usati anche in questo modo dallinterno del client.
162
anche grazie fatto di aver potuto contare sulla promozione da parte dellazienda che ne deteneva il codice e
che vendeva licenze proprietarie per chi non voleva sottostare alle condizioni della GPL; oggi il codice `e divenuto
propriet`
a di Oracle, cosa che ha fatto sorgere qualche dubbio relativo al suo futuro sviluppo, essendo un chiaro
concorrente dellomonimo prodotto proprietario.
163
che sta ad indicare, a seconda delle preferenze di linguaggio del programmatore, la lista Linux, Apache,
MySQL, Perl/PHP/Python.
164
nel caso di Debian il pacchetto si chiama mysql-server e fa parte della distribuzione ufficiale.

244

CAPITOLO 4. AMMINISTRAZIONE ORDINARIA DEL SISTEMA

semplice, con direttive di configurazione nella classica forma chiave=valore e con la solita
convenzione di ignorare righe vuote e tutto ci`o che segue il carattere #.
Per lo scopo introduttivo di questo paragrafo le sole direttive di uso sistemistico che possono
interessare sono quelle relative alle modalit`a con cui il server pu`o essere interrogato via rete, e
se lo si vuol rendere raggiungibile non solo in locale occorrer`a inserire inserire la direttiva:165
bind_address = 0.0.0.0

Da completare...
Il comando principale per usare il database `e mysql che invoca il programma con cui ci si pu`o
connettere al database. Se usato interattivamente le istruzioni devono essere inviate dal prompt
sul terminale, ma il comando pu`
o essere invocato anche in modalit`a non interattiva, facendogli
leggere le istruzioni da un file o con una redirezione dello standard input.
Da completare...
Per il controllo del database MySQL mette a disposizione un apposito comando di amministrazione mysqladmin, dedicato allesecuzione di operazioni amministrative sul server.
Da completare...
Infine anche per MySQL `e presente un opportuno comando di esportazione per i contenuti
di un database in istruzioni SQL registrate su un file di testo, mysqldump.
Da completare...

4.4.4

Nozioni elementari di SQL

Il linguaggio SQL (Structured Query Language) nasce, come dice il nome, come linguaggio per
eseguire richieste su una base di dati relazionale. Benche la sua conoscenza attenga pi`
u alle
competenze di un programmatore o di un amministratore di database, `e opportuno anche per un
amministratore di sistema padroneggiare almeno le istruzioni pi`
u semplici di questo linguaggio,
data la sempre maggior diffusione delluso di database SQL da parte di molti programmi.
Sta infatti diventando sempre pi`
u comune, anche grazie alla diffusione di programmi come
SQLite che consentono di mantenere un database relazionale su semplici file, memorizzare dati
di gestione (e talvolta anche configurazioni) di un programma su un database di questo tipo per
sfruttarne la velocit`
a di accesso nelle ricerche. In questo caso molto spesso un amministratore
di sistema si trova nelle condizioni di dover intervenire ed eseguire delle modifiche direttamente
su tali dati, e per questo `e necessaria una conoscenza delle basi del linguaggio SQL.
Purtroppo, nonostante esista una certa standardizzazione,166 il linguaggio SQL presenta
innumerevoli varianti ed estensioni, nel nostro caso ci limiteremo ad esaminare le forme pi`
u
elementari che sono sostanzialmente le stesse nelle varie implementazioni. Inoltre quanto segue
non `e da considerarsi minimamente una introduzione sistematica o formale a questo linguaggio,
ma soltanto un riassunto delle principali istruzioni ad uso di un amministratore di sistema,
orientate alla realizzazione di specifiche operazioni (come cercare o ottenere informazioni, o
eseguire semplici modifiche).
Il primo passo per luso del linguaggio `e quello di collegarsi al proprio database per eseguire
i relativi comandi dalla console fornita dallo stesso. Questo avviene, per i veri e propri database
server, con una connessione (anche di rete) eseguita tramite un programma client,167 o, nel caso
di SQLite, con un programma che opera direttamente sui file dei dati. La sintassi per effettuare
il collegamento varia ovviamente da programma a programma, ed abbiamo visto nelle sezioni
165

come per PostgreSQL il default `e ascoltare soltanto su localhost (per i concetti relativi alle reti si rimanda
al solito a sez. 7.2.
166
il primo standard, realizzato dalla ANSI, `e denominato SQL-86, ad esso sono seguite diverse revisioni, per un
riassunto si legga http://en.wikipedia.org/wiki/SQL#Standardization.
167
in genere in questo caso un database server pu`
o gestire anche molte basi di dati in parallelo, ed occorrer`
a
indicare quale si vuole utilizzare.

4.4. AMMINISTRAZIONE SISTEMISTICA DI UNA BASE DI DATI

245

precedenti come fare per PostgreSQL e MySQL, nel caso si usi SQLite dato che ogni file `e un
database, baster`
a eseguire il comando:168
sqlite3 filedidati.db
Una delle operazioni pi`
u comuni da effettuare su un database `e quella relativa alla ricerca dei
dati. Trattandosi di database relazionale la struttura dei dati `e sempre in forma di tabelle, ed i
dati devono essere cercati allinterno delle stesse. Purtroppo non esiste una istruzione generica
per ottenere un elenco delle tabelle di un database, ed ogni programma usa in genere comandi
diversi.169
Listruzione di ricerca dei dati `e SELECT,170 che nella forma pi`
u semplice deve essere seguita
dalla lista delle colonne di cui si vogliono ottenere i valori, forma di elenco di nomi separate da
virgole, o alternativamente, per ottenere i dati di tutte le colonne, dal carattere *; a questo
deve seguire la parola chiave FROM, usata per identificare una tabella anche da altre istruzioni,
seguita dal nome di questultima. Pertanto una delle modalit`a pi`
u comuni per esaminare il
contenuto di una tabella `e eseguire il comando:
SELECT * FROM tablename;
qualora invece si vogliano avere soltanto i valori di alcune colonne si dovr`a inserire lelenco delle
stesse, con qualcosa del tipo:
SELECT column1,column2 FROM tablename;
Luso delle due istruzioni precedenti comporta la stampa del contenuto di tutte le righe
(completo o solo per i valori delle colonne richieste) contenute nella tabella. Se questa `e grande
si rischia di essere annegati nei risultati, pertanto diventa ...
Da completare.

168

faremo riferimento alla versione 3 del programma, la ultima disponibile, in genere infatti il comando sqlite
viene usato per la precedente, e tuttora piuttosto diffusa, versione 2.
169
in realt`
a questi si riducono spesso alla ricerca dei dati allinterno di una tabella interna (nel caso di SQLite si
deve usare la tabella riservata XXX) ma spesso questa ricerca viene mascherata tramite alcuni comandi inseriti
nella sintassi della propria versione di SQL.
170
in genere il linguaggio SQL `e case insensitive nelle sue istruzioni, ma per convenzione si tende a scriverle in
lettere maiuscole, anche per distinguerle dai valori.

246

CAPITOLO 4. AMMINISTRAZIONE ORDINARIA DEL SISTEMA

Capitolo 5

Amministrazione straordinaria del


sistema
5.1

La gestione dei dischi e dei filesystem

In questa sezione, dopo una introduzione su alcune nozioni di base relative allhardware, tratteremo in dettaglio le modalit`
a con cui vengono gestiti in un sistema GNU/Linux dischi e filesystem,
quelle con cui si pu`
o accedere ai dati in essi contenuti, le strategie di partizionamento e tutto
quanto riguarda le operazioni di manutenzione, gestione e controllo degli stessi.

5.1.1

Alcune nozioni generali

Prima di affrontare luso dei programmi per la gestione di dischi e filesystem occorre introdurre
qualche concetto relativo al funzionamento della gestione dei dischi rigidi. In genere, e per
questo sono chiamati dispositivi a blocchi, lo spazio disponibile sui piatti magnetici di un disco
viene suddiviso in blocchi elementari di dati, delle dimensioni di 512 byte, chiamati settori.1
Dal disco si pu`
o sempre leggere un settore alla volta e non un singolo byte; questo viene fatto
direttamente dal kernel o dal BIOS che dice allinterfaccia hardware di leggere un determinato
settore fornendogli lindirizzo dello stesso.
In generale laccesso ai dischi deve eseguito attraverso una apposita interfaccia hardware che
consente al processore di farsi inviare in memoria i dati mantenuti sul disco. Fino a pochi anni
fa la stragrande maggioranza dei computer montava come interfaccia per laccesso ai dispositivi
a blocchi (dischi, CDROM) una interfaccia di gestione chiamata alternativamente IDE (acronimo di Integrated Drive Electronics, come indicato nella specificazione originaria della Western
Digital) o ATA (acromino di Advanced Technology Attachment).
Linterfaccia IDE/ATA ha subito diverse evoluzioni,2 volte principalmente a migliorarne le
prestazioni, ma una caratteristica rimasta sempre presente `e quella di poter supportare due
dispositivi per ciascun canale di comunicazione,3 denominate master e slave, e determinate da
appositi jumper da impostare sui dischi. Ogni disco `e in grado di agire sia da master che da
slave, a seconda delle opportune impostazioni che si possono effettuare su di esso, in genere
1

anche se con alcuni dischi pi`


u recenti e le ultime versioni degli standard `e divenuto possibile usare settori di
4096 byte (4K sectors).
2
un escursus storico sulla evoluzione delle diverse caratteristiche di questa interfaccia pu`
o essere trovato su
Wikipedia a questo indirizzo: http://en.wikipedia.org/wiki/Integrated_Drive_Electronics.
3
vale a dire la possibilit`
a di poter collegare due dischi (o altre periferiche IDE, come CDROM o masterizzatori)
sullo stesso cavo.

247

248

CAPITOLO 5. AMMINISTRAZIONE STRAORDINARIA DEL SISTEMA

attraverso opportuni ponticelli,4 che consentono di indicare un ruolo esplicito o far decidere alla
posizione sul cavo.5
Le interfacce IDE/ATA sono supportate da Linux fin dalle prime versioni del kernel; per il
loro classico utilizzo come interfacce per laccesso ai dischi le relative periferiche sono da sempre
associate a file di dispositivo inizianti con prefisso hd (da hard disk ), con una terza lettera che,
in ordine alfabetico, identifica il disco a cui si fa riferimento.6 Lassegnazione dei nomi dei
dispositivi per`o risente della caratteristica dellinterfaccia di consentire due dischi per canale,
per cui lordine non `e detto sia strettamente alfabetico, dato che ad ogni canale sono sempre
assegnate due lettere consecutive.
Questo significa che, nella configurazione pi`
u comune in cui si hanno due canali IDE/ATA,7 i
dispositivi sul primo canale saranno identificati come /dev/hda (per il master ) e /dev/hdb (per
lo slave) mentre i dispositivi posti sul secondo canale avranno rispettivamente i nomi /dev/hdc
e /dev/hdd, e questo indipendentemente dal fatto che sul primo canale siano stati effettivamente
collegati dei dispositivi o meno. Si tenga presente poi che nel caso di dischi non si usano quasi
mai questi dispositivi dato che normalmente vi si accede facendo riferimento ad una partizione,
identificata tramite un ulteriore numero (vedi sez. 5.1.2).
A lungo lunica alternativa alle interfacce IDE/ATA `e stata linterfaccia SCSI (vedi sez. 5.4.2);
questa presentava una serie di vantaggi, come quello di permettere il collegamento di pi`
u periferi8
che su uno stesso cavo e velocit`
a di trasferimento pi`
u alte, ma lo svantaggio di essere nettamente
pi`
u costosa. Dato che con linterfaccia SCSI laccesso ai dischi viene gestito in maniera completamente diversa, anche i file di dispositivo ad essa associata vengono indicati in maniera diversa,
utilizzando il prefisso sd (da SCSI disk ) sempre seguito da una lettera progressiva in ordine
alfabetico che identifica i diversi dischi presenti, assegnata secondo lordine di riconoscimento
degli stessi.9 Questo significa che il primo disco SCSI sar`a /dev/sda, il secondo /dev/sdb, il
terzo /dev/sdc, ecc.
Una caratteristica dellinterfaccia SCSI `e che per gestire laccesso ai dischi `e stato definito un
protocollo generico, poi riutilizzato anche da altre interfacce di comunicazione. Questo protocollo
viene gestito dal kernel in maniera indipendente dallhardware sottostante (vedi fig. 5.6) il che
comporta che anche per laccesso a dischi posti su periferiche collegate tramite altre interfacce di
comunicazione come lUSB (vedi sez. 5.4.4) o la IEEE 1394 (pi`
u nota come FireWire o i.LINK )
si dovranno usare i file di dispositivo di una interfaccia SCSI vera e propria.
Inoltre oggi le interfacce IDE/ATA classiche sono ormai quasi universalmente sostituite dallo
standard Serial ATA (SATA), che consente velocit`a di comunicazione pi`
u elevate con un cablaggio pi`
u compatto. In questo caso, a parte un breve periodo di transizione in cui anche questi
dispositivi venivano trattati come i normali IDE/ATA, in tutti i kernel attuali laccesso `e gestito in maniera unificata attraverso una libreria interna, chiamata libATA, che di nuovo usa il
protocollo SCSI per gestire la comunicazione con i dischi. Infine recentemente anche il supporto
di molti chipset che usano il tradizionale standard IDE/ATA (quello che ormai viene chiamato
parallel ATA) `e stato riscritto per utilizzare libATA. Il risultato finale `e che al giorno doggi
4
i cosiddetti jumper, che sono presenti su ogni disco, dove in genere viene anche riportato lo schema con
lindicazione del significato delle varie posizioni.
5
le sigle usate sono in genere MA per master, SL per slave e CS per cable select, che indica la selezione automatica
con la posizione sul cavo, ovviamente nel collegamento occorrer`
a che tutti i dischi sullo stesso canale siano impostati
in maniera coerente.
6
il nome non varia anche quando il dispositivo non corrisponde ad un disco: anche un CDROM sar`
a identificato
come /dev/hdX.
7
in genere il chipset che fornisce linterfaccia IDE gestisce almeno due canali, anche se esistono chipset che
gestiscono un numero di canali pi`
u elevato.
8
un confronto dettagliato fra le due interfacce va al di l`
a dello scopo di questo testo.
9
in questo caso /dev/sdX fa riferimento soltanto ai dischi, vedremo in sez. 5.4.2 che per gli altri dispositivi
vengono utilizzati nomi diversi.

5.1. LA GESTIONE DEI DISCHI E DEI FILESYSTEM

249

praticamente quasi tutti i dischi vengono visti come dischi SCSI e sono acceduti attraverso file
di dispositivo nella forma /dev/sdX, pur essendo collegati con le interfacce pi`
u diverse.
Ma anche se sul piano della diffusione dellhardware le interfacce IDE/ATA classiche vanno
sparendo, esistono una serie di concetti ereditati da esse che continuano ad essere presenti, come
quello della cosiddetta geometria dei dischi. Le prime interfacce IDE/ATA infatti separavano
fisicamente le linee di indirizzamento che consentivano di richiedere la lettura di un particolare
settore allinterno del disco in tre gruppi diversi, pertanto una operazione di accesso imponeva
di utilizzare tre parametri diversi (uno per linea) per indicarne su quale settore operare.
Il primo gruppo di linee serviva per indirizzare le testine dei diversi piatti del disco, da cui
il nome head e la sigla H usati per indicare il corrispondente parametro; in sostanza vedendo
il disco come un cilindro questo parametro indicava la coordinata in altezza lungo lasse dello
stesso, facendo riferimento ad un determinato piatto nel disco.
Il secondo gruppo serviva per muoversi lungo la coordinata angolare allinterno di un piatto, da cui il nome sector e la sigla S; infine lultimo gruppo indicava come muoversi lungo la
coordinata radiale, da cui il nome cylinder e la sigla C. Questa nomenclatura sopravvive ancora
oggi quando si parla di geometria di un disco, per cui quando se ne vuole identificare la dimensione si indicano i rispettivi valori massimi di questi tre parametri (la terna chiamata CHS),
moltiplicando i quali si ottiene il numero totale dei settori, e quindi la capacit`a del disco.
Nelle prime interfacce IDE erano previste 10 linee per indicare il cilindro, 4 per le testine, e
6 per i settori, impostati attraverso altrettanti valori binari dei parametri di controllo, ma ben
presto i segnali vennero utilizzati per una indicazione logica e non fisica;10 restarono comunque
le dimensioni indicate, che consentivano un totale di 1024x16x63 settori,11 pari a 504Mb di
dimensione massima. Anche il BIOS usava questa suddivisione nella funzione di accesso al disco
che richiedeva, per accedere ad un certo settore, una terna di valori indicanti appunto il numero
di cilindro, testina e settore. Questi venivano passati tramite il contenuto di alcuni registri del
processore, ed in particolare 10 bit erano utilizzati per indicare il cilindro, 6 bit per indicare il
settore ed 8 bit per la testina.12
La corrispondenza diretta fra valori di head, sector e cylinder e coordinate fisiche del settore
indirizzato `e andata persa quasi subito. Ma per mantenere la compatibilit`a con i sistemi operativi che usavano il BIOS per leggere e scrivere su disco, linterfaccia di accesso di questultimo
`e rimasta invariata; laccesso ad un settore veniva poi eseguito direttamente dallhardware in
maniera trasparente, indipendentemente dalla geometria reale del disco. Dato che il parametro
indicante la testina ha una dimensione massima di 8 bit la dimensione massima di un disco ottenibile con questa interfaccia `e di un totale di 1024x256x63 settori, pari a circa 8.4Gb, allepoca
considerata una dimensione irraggiungibile.
La dimensione irraggiungibile per`o venne raggiunta piuttosto velocemente, e a quel punto
ci si trov`
o di fronte al limite non pi`
u superabile delle restrizioni sui valori massimi di cilindro,
testina e settore dovuti alla modalit`a con cui veniva invocata la funzione di accesso, da cui
derivava il problema di non poter accedere a dischi superiori a detta dimensione che affliggeva i
BIOS di quel tempo, con quello che venne chiamato il limite del 1024-simo cilindro.
Tutto questo venne superato con lintroduzione del cosiddetto Linear Block Addressing
(LBA), in cui anche per i dischi IDE laccesso viene eseguito, come per i dischi SCSI,13 spe10

in realt`
a nella suddivisione fisica delle tracce, il numero di settori `e in genere variabile, avendo pi`
u spazio sulle
tracce esterne rispetto alle interne.
11
praticamente da sempre il numero di settore `e stato indicato con un valore da 1 a 63, il settore 0 non viene
mai usato.
12
la funzione di accesso del BIOS, denominata INT13 perche faceva uso della tredicesima trappola di interruzione
software del processore, prendeva come argomenti alcuni registri di processore, usando 16 bit per cilindro e settore,
e 8 bit per la testina; per tutti i dettagli sui registri e sulle varie limitazioni che si sono susseguite storicamente si
pu`
o leggere il Large Disk HOWTO.
13
il protocollo SCSI non ha mai avuto problemi di geometria, dato che ha sempre previsto luso di un valore
lineare per indicare il settore di un disco, anche se poi il BIOS si doveva inventare una sua geometria fittizia per

250

CAPITOLO 5. AMMINISTRAZIONE STRAORDINARIA DEL SISTEMA

cificando semplicemente un numero di settore che cresce linearmente da 0 al valore massimo.14


Per questo tutti i BIOS attuali al posto della vecchia funzione di accesso usano una nuova funzione che utilizza direttamente il numero del settore in forma lineare e non soffrono pi`
u di questo
limite.
Per un certo periodo perci`
o alcuni sistemi operativi e vari programmi non sono stati in grado
di utilizzare questa nuova interfaccia, non potendo quindi accedere ai contenuti del disco posti
sopra il limite del 1024-simo cilindro. Questo problema non si `e mai posto per Linux, dato
che il kernel `e sempre stato in grado di accedere nativamente allinterfaccia IDE ed indirizzare
direttamente laccesso ai singoli settori, non risentendo delle limitazioni del BIOS. Il problema
si presentava per`
o per i bootloader che dovendo stare nei pochi byte a disposizione nel Master
Boot Record (il primo settore di un disco, dove viene installato il bootloader, vedi sez. 5.1.2) non
possono implementare un accesso al disco indipendente.
Dato che il compito di un bootloader (vedi sez. 5.3.1) `e lanciare il kernel leggendolo dal
disco, questo risultava impossibile quando il kernel era posto una zona del disco che il BIOS non
riusciva a raggiungere. Con tutti i computer attuali questo problema `e totalmente superato, ma
si presentava installando dischi pi`
u nuovi su macchine molto vecchie. In tal caso si doveva avere
laccortezza di mettere il kernel in una sezione di disco che sia entro il 1024-simo cilindro, cio`e
nella parte iniziale del disco. Questo comportava la necessit`a di creare una partizione iniziale, per
la quale il Filesystem Hierarchy Standard prevede luso della directory /boot, su cui mantenere
le immagini del kernel.15

5.1.2

Il partizionamento dei dischi

Uno dei compiti di preparazione da eseguire tutte le volte che si installa un nuovo disco `e quello
di suddividerne lo spazio in opportune partizioni. In genere questo viene fatto dal programma
di installazione del sistema, che in tutte le distribuzioni pi`
u recenti `e in grado di eseguire il
compito in maniera semi-automatica. Quando per`o si vuole installare un nuovo disco, o si vuole
effettuare loperazione manualmente per avere un maggior controllo, occorre saper utilizzare un
programma di partizionamento.
Prima di entrare nel dettaglio del funzionamento dei vari programmi di partizionamento `e
opportuno fornire alcune informazioni di base relativamente alla gestione delle partizioni. Le
partizioni nacquero infatti come funzionalit`a fornita dal BIOS per consentire di suddividere un
singolo disco in pi`
u parti, in modo che queste potessero essere accedute in maniera indipendente
luna dallaltra, come fossero dispositivi separati.
Nellarchitettura dei PC tutte le informazioni sulle partizioni venivano originariamente mantenute nel primo settore di ciascun disco, il cosiddetto Master Boot Record (MBR), chiamato
cos` perche `e su di esso che viene installato il bootloader, cio`e il programma di avvio usato dal
BIOS per lanciare il sistema operativo (vedi sez. 5.3). Una parte di questo settore costituisce
la cosiddetta tabella delle partizioni, dove vengono memorizzati i valori del settore di inizio e di
fine di quelle che oggi sono note come partizioni primarie. Dato lo spazio limitato disponibile
nellMBR, nella tabella delle partizioni non possono essere memorizzate pi`
u di quattro partizioni.
Architetture meno obsolete, come SPARC, PowerPC, o Alpha, non hanno mai avuto questo
limite, ed il numero di partizioni `e molto pi`
u grande.16 Nellarchitettura PC, per mantenere
la compatibilit`
a con le vecchie versioni e superare questa limitazione, sono state introdotte le
cosiddette partizioni logiche. Per poterle utilizzare `e necessario marcare una delle partizioni
poter continuare ad usare le sue routine di accesso.
14
anche qui comunque sono entrati in gioco altri limiti, come il valore massimo del numero, che nelle versioni
pi`
u recenti `e passato da 32 bit (LBA32) che consentiva un massimo di 2 terabyte, a 48 bit (LBA48).
15
oggi lunica ragione tecnica resta quella di mantenere su una partizione in chiaro quanto necessario ad avviare
di un sistema installato completamente su dispositivi cifrati.
16
ad esempio sui vecchi MacInstosh PowerPC il limite era di 16.

5.1. LA GESTIONE DEI DISCHI E DEI FILESYSTEM

251

primarie mantenute nella tabella delle partizioni dellMBR come partizione estesa e a questo
punto sar`
a possibile utilizzare il primo settore di detta partizione per installare una tabella
secondaria che `e quella su cui si indicheranno le ulteriori partizioni logiche.17
Partizioni primarie e secondarie possono coesistere, nei termini in cui si usa lo spazio di una
partizione primaria come partizione estesa dove indicare la tabella delle successive partizioni
secondarie. In genere questo si fa creando tre partizioni primarie ed utilizzando la quarta come
partizione estesa per poter poi creare anche le partizioni secondarie; ma si pu`o usare una partizione primaria qualunque, (ad esempio la seconda) tenendo presente per`o che quando si usa
una partizione primaria come partizione estesa per introdurre le partizioni logiche, le partizioni
primarie successive (nellesempio la terza e la quarta) non saranno pi`
u utilizzabili.18
Il kernel legge la tabella delle partizioni allavvio,19 ed assegna a ciascuna partizione un
diverso file di dispositivo grazie al quale `e possibile accedere direttamente al contenuto della
stessa. Usualmente il nome di questo file viene ottenuto aggiungendo il numero della partizione
al nome del file di dispositivo associato al disco. Le partizioni primarie sono numerate da 1 a 4,
mentre quelle logiche vanno dal 5 in poi,20 cos` ad esempio /dev/hda2 `e la seconda partizione
primaria del primo disco del primo canale IDE, mentre /dev/hdb5 `e la prima partizione logica
del secondo disco del primo canale IDE, e /dev/sda6 `e la seconda partizione logica del primo
disco SCSI,21 e cos` via.
Sui PC il comando utilizzato tradizionalmente per partizionare un disco `e fdisk,22 che si
trova con lo stesso nome, anche se con sintassi diverse, anche in altri sistemi operativi. Ad
esso si sono in seguito aggiunti altri programmi, caratterizzati per lo pi`
u ad una interfaccia pi`
u
funzionale o pi`
u semplice.23 Il comando opera esclusivamente sulla tabella delle partizioni, ed
in genere se si effettuano modifiche su di esse il relativo contenuto viene perduto.24 Per questo
motivo lutilizzo di fdisk `e in genere limitato al momento dellinstallazione del sistema o di un
nuovo disco.
Il comando prende come argomento il file di dispositivo del disco su cui si vuole operare (ad
esempio /dev/hdc per un disco IDE o /dev/sda per un disco SCSI), le uniche opzioni che ha
senso usare sono -l che si limita a stampare la tabella delle partizioni presente e -s che stampa
le dimensioni totali di una partizione (se passata come argomento) o del disco. Le altre opzioni
servono per specificare le caratteristiche del disco e normalmente non servono in quanto i valori
sono determinati automaticamente, e per quanto riguarda numero di cilindri, testine e settori
possono essere modificati anche allinterno del comando.
Quando il comando viene lanciato stampa un messaggio di benvenuto, e avvisa di potenziali
problemi (quelli accennati in sez. 5.1.1) quando il numero dei cilindri `e maggiore di 1024, avviso
17

per questo motivo le partizioni logiche talvolta vengono chiamate anche partizioni secondarie.
in realt`
a se la partizione estesa non esaurisce tutto lo spazio disco questo non `e vero, ma questo tipo di
configurazione non `e consigliata dato che non tutti i sistemi o i programmi di partizionamento sono in grado di
capirla.
19
questo comporta che se si modifica la tabella delle partizioni il kernel pu`
o non essere in grado di vedere le
modifiche fino al riavvio successivo, se il disco `e in uso infatti la funzione che consente la rilettura della tabella
delle partizioni fallir`
a, per evitare che il kernel possa usare una versione non corrispondente a quella in uso al
momento.
20
tradizionalmente il kernel prevede un massimo di 63 partizioni per i dischi IDE e di 16 per gli SCSI, con dei
limiti che originano da ragioni storiche relative ai valori dei minor number (vedi sez. 1.4.4) dei relativi dispositivi,
in realt`
a oggi, grazie alluso di LVM (vedi sez. 6.2) luso di un gran numero di partizioni non `e pi`
u necessario,
potendo utilizzare alla bisogna un gran numero di volumi logici.
21
o meglio, se si ricorda quanto detto in sez. 5.1.1, del primo disco gestito con il protocollo SCSI, quindi anche
USB, Serial ATA, ecc.
22
non tratteremo qui le altre architetture, che hanno programmi diversi.
23
in particolare alcuni di questi, come qtparted o gparted, sono dotati di interfaccia grafica e sono in grado di
effettuare anche operazioni di ridimensionamento dei filesystem contenuti nelle partizioni (vedi sez. 6.3.2).
24
a meno di non aver fatto un semplice ridimensionamento e trattato opportunamente il filesystem, vedi sempre
sez. 6.3.2.
18

252

CAPITOLO 5. AMMINISTRAZIONE STRAORDINARIA DEL SISTEMA

ormai obsoleto a meno di non usare sistemi operativi obsoleti. Un esempio del risultato del
comando `e il seguente:
hain:/root# fdisk /dev/sda
The number of cylinders for this disk is set to 2213.
There is nothing wrong with that, but this is larger than 1024,
and could in certain setups cause problems with:
1) software that runs at boot time (e.g., old versions of LILO)
2) booting and partitioning software from other OSs
(e.g., DOS FDISK, OS/2 FDISK)
Command (m for help):

dove dopo la stampa iniziale fdisk si pone in attesa dei comandi che vengono specificati con
le relative lettere. Cos` se vogliamo una lista dei comandi disponibili possiamo premere m come
indicato, ottenendo:
Command (m for help): m
Command action
a
toggle a bootable flag
b
edit bsd disklabel
c
toggle the dos compatibility flag
d
delete a partition
l
list known partition types
m
print this menu
n
add a new partition
o
create a new empty DOS partition table
p
print the partition table
q
quit without saving changes
s
create a new empty Sun disklabel
t
change a partitions system id
u
change display/entry units
v
verify the partition table
w
write table to disk and exit
x
extra functionality (experts only)
Command (m for help):

questo ci dice che con p possiamo stampare la tabella delle partizioni corrente, nel caso otterremo:
Command (m for help): p
Disk /dev/sda: 255 heads, 63 sectors, 2213 cylinders
Units = cylinders of 16065 * 512 bytes
Device Boot
/dev/sda1
/dev/sda2

Start
1
2177

End
2176
2213

Blocks
17478688+
297202+

Id
83
82

System
Linux
Linux swap

che ci mostra come nel disco siano presenti due partizioni. Si noti anche come viene riportata
una geometria per il disco; questa `e quella che `e vista dal kernel, ed in genere coincide con quanto
visto dal BIOS, ma `e possibile cambiarla con uno dei comandi delle funzionalit`a avanzate.
A questo punto si potr`
a usare d per cancellare una partizione (il comando ne chieder`a il
numero), ed n per crearne una nuova, nel qual caso fdisk prima chieder`a se primaria o secondaria
e poi il relativo numero. Una volta scelta la partizione il programma chieder`a il settore di
partenza (proponendo come default il primo che risulta libero) e la dimensione. Questultima
pu`o essere specificata in varie unit`
a di misura o direttamente con il settore finale (il comando
propone come default lultimo settore del disco).
Il comando t permette di impostare il valore numerico che identifica il tipo di partizione;
questo viene in genere utilizzato per indicare che tipo di filesystem sar`a contenuto nella stessa.

5.1. LA GESTIONE DEI DISCHI E DEI FILESYSTEM

253

Per i filesystem di Linux il valore `e 83 (in esadecimale) e vale per tutti i filesystem. I filesystem
Windows invece usano vari codici diversi a seconda del tipo di filesystem. Il valore 82 `e invece
usato per indicare una partizione destinata alluso come swap (vedi sez. 5.1.7). Altri valori usati
da Linux sono fd o da per indicare le partizioni usate per il RAID software (vedi sez. 6.1.3) e
8e per quelle usate per il Logical Volume Manager (vedi sez. 6.2).
Qualunque modifica si sia effettuata sulla tabella delle partizioni questa non verr`a scritta
su disco a meno di non effettuare una richiesta esplicita di scrittura con il comando w; questo
comunque chieder`
a conferma prima di effettuare la scrittura, avvertendo che si possono perdere
tutti i dati presenti sul disco. Si esce da fdisk con il comando q, che non salva le modifiche
effettuate.

Figura 5.1: Schermata del comando cfdisk.

Un comando alternativo a fdisk `e cfdisk, un programma pi`


u amichevole che permette luso
una interfaccia testuale semigrafica ed interattiva in cui si possono eseguire le varie operazioni
spostandosi su comandi e partizioni con luso delle frecce. In fig. 5.1 `e mostrata la schermata
iniziale di cfdisk, dalla quale `e possibile dare tutti i comandi.
Infine un terzo programma che consente di manipolare la tabella delle partizioni `e sfdisk,
che ha la caratteristica di operare a riga di comando in modalit`a non interattiva, e pertanto
pu`o essere utilizzato anche allinterno di script. Il comando prende sempre come argomento il
file di dispositivo relativo ad un disco (ad esempio /dev/hda), tranne che quando invocato con
lopzione -s, che stampa la dimensione delle partizioni, nel qual caso si pu`o usare anche il file di
dispositivo di una singola partizione. Con lopzione -l invece il comando stampa la tabella delle
partizioni in un formato leggibile, e se non si specifica nessun dispositivo esegue loperazione per
tutti i dischi.
Se invocato senza opzioni il comando legge dallo standard input le istruzioni relative al
partizionamento del disco indicato; quando invocato su un terminale le istruzioni sono richieste
in modalit`
a interattiva, ma qualora si sia rediretto lo standard input queste possono essere lette
direttamente da un file consentendo cos` di automatizzare le operazioni di partizionamento in
modalit`a non interattiva.
Le istruzioni consentono di cancellare, spostare e modificare le partizioni, e seguono una
sintassi specifica (per i dettagli si pu`o consultare la pagina di manuale); benche il comando
abortisca qualora si commetta un errore di sintassi, si deve avere ben presente che basta inserire
un qualche valore sbagliato per perdere tutto il contenuto di un disco. Per questo vengono
fornite le opzioni -O e -I. Lopzione -O consente di salvare, sul file indicato come parametro, il
contenuto di tutti i settori modificati dalla conseguente esecuzione di sfdisk,25 cosicche se si
25

vale a dire che se si devono effettuare delle modifiche con sfdisk `e sempre opportuno invocarlo con un comando
del tipo: sfdisk /dev/hda -O hda.save.

254

CAPITOLO 5. AMMINISTRAZIONE STRAORDINARIA DEL SISTEMA

`e commesso un errore sar`


a possibile ripristinare la situazione precedente invocando il comando
con lopzione -I.26
Opzione
-s
-l
-d

-V
-n
-O
-I

Significato
stampa la dimensione delle partizioni di un disco (o della singola
partizione).
stampa una lista delle partizioni presenti sul disco.
scrive il contenuto della tabella delle partizioni di un disco nel formato
delle istruzioni di sfdisk, cos` che loutput del comando pu`
o essere
usato come input per una successiva invocazione dello stesso.
esegue una verifica della tabella delle partizioni e riporta ogni eventuale
anomalia.
simula le operazioni senza scrivere nulla sul disco.
salva sul file passato come parametro il contenuto binario dei settori
modificati dal comando.
ripristina il contenuto del disco utilizzando le informazioni ottenute dal
file passato come parametro (che deve essere stato prodotto usando
lopzione -O nella precedente invocazione del comando).
Tabella 5.1: Le principali opzioni del comando sfdisk.

In realt`a luso di sfdisk per eseguire delle modifiche manuali `e piuttosto ridotto, dato
che un comando come cfdisk `e molto pi`
u comodo; dove esso diventa molto utile `e quando si
vogliono partizionare molti dischi nella stessa maniera.27 In tal caso infatti `e possibile eseguire
il partizionamento del primo disco, e poi salvare la struttura della tabella delle partizioni con
lopzione -d, che genera sullo standard input una serie di istruzioni che possano essere a loro
volta utilizzate come input per lo stesso sfdisk; cos` se si vuole replicare il partizionamento di
/dev/hda su /dev/hdc baster`
a eseguire il comando:28
sfdisk -d /dev/hda | sfdisk /dev/hdc
Ovviamente il partizionamento di un disco `e una operazione privilegiata, che pu`o compiere
solo lamministratore, e richiede il permesso di scrittura sul dispositivo su cui si esegue il relativo
comando. E come accennato `e anche un compito molto delicato, in quanto se si cambia la
tabella delle partizioni cancellando o modificando una di quelle presenti il relativo contenuto
andr`a perso. Occorre quindi stare molto attenti ed evitare di salvare le modifiche fintanto che
non si `e assolutamente sicuri di quanto si `e fatto.
Infatti, anche se in realt`
a gli unici dati che vengono cambiati sono quelli della tabella delle
partizioni, una volta che questa `e stata modificata non saranno pi`
u presenti sul disco i confini
delle partizioni preesistenti e dato che ogni filesystem viene creato per stare esattamente nelle
dimensioni di una partizione, se se ne modificano dimensioni o posizione i dati del filesystem in
essa contenuto non saranno pi`
u utilizzabili.
Questo ci dice anche che, fintanto che non si va a modificare il contenuto effettivo del disco,
laccesso ai dati pu`
o essere riottenuto ripristinando la tabella delle partizioni. Per farlo esistono
molti metodi, a partire da quello pi`
u semplice di tutti che consiste nel segnarsi il contenuto
29
precedente.
Un altro metodo, pi`
u complesso, ed utilizzabile solo se nel frattempo non si `e
26

vale a dire che, nel caso dellesempio illustrato nella nota precedente, sar`
a possibile tornare indietro con un
comando del tipo: sfdisk /dev/hda -I hda.save.
27
il caso pi`
u comune `e quando si devono impostare le partizioni dei vari dischi componenti un RAID (vedi
sez. 6.1).
28
si tenga presente per`
o che -d non `e una alternativa alluso di -O per ripristinare un cambiamento di tabella
delle partizioni, se infatti si pu`
o riportare la tabella delle partizioni nella forma originaria, non saranno recuperate
eventuali modifiche fatte ad altre parti del disco, come pu`
o accadere qualora si creino delle partizioni logiche su
dischi ove non esistevano e poi si voglia tornate indietro.
29
operazione che come abbiamo visto `e semplicissima da fare con sfdisk.

5.1. LA GESTIONE DEI DISCHI E DEI FILESYSTEM

255

riavviata la macchina,30 `e quello recuperare usando i dati dalle informazioni mantenute dal
kernel attraverso il contenuto di /proc/partition ed i risultati del comando hdparm. Infine
si pu`o usare il comando gpart, da eseguire a disco non montato, che `e in grado di trovare,
utilizzando opportuni criteri di identificazione dei dati dei filesystem, i confini di partizioni
preesistenti, cos` da poterle ripristinare.
Il fatto che la modifica delle dimensioni di una partizione comporti la perdita dei dati in essa
contenuti ci fa capire che `e sempre opportuno pianificare con cura le dimensioni assegnate alle
varie partizioni fin dallinstallazione del sistema, perche modificarle in un secondo tempo comporta spesso la necessit`
a di dover fare un backup dei contenuti.31 Esiste comunque il comando
parted (che tratteremo in sez. 6.3.2), che permette di ridimensionare un filesystem e restringere,
allargare o spostare la partizione che lo contiene, ma loperazione resta complessa e delicata.
Tutto questo significa che nellinstallazione occorre decidere una buona strategia di partizionamento, cio`e decidere quante partizioni fare e come assegnarle. Per questo occorre tenere ben
presenti le indicazioni sul contenuto delle varie directory di sistema illustrate in sez. 1.2.3. Una
delle strategie pi`
u semplici `e quella di creare una partizione unica e mettere tutto quanto su di
essa. Questo schema ha il vantaggio di non doversi preoccupare del dimensionamento delle altre
partizioni ne del rischio di esaurire lo spazio su una partizione mentre le altre sono vuote. Ha
per`o lo svantaggio che qualora si debba eseguire una reinstallazione i dati degli utenti (quelli
sotto /home) e quelli di sistema (come pagine web, posta archiviata e tutto quanto in genere
si tiene sotto /var o /srv) verr`
a sovrascritto. Inoltre se si hanno pi`
u dischi non `e ovviamente
possibile mettere tutto su una sola partizione. Infine anche qualora si usi una sola partizione
per tutto il sistema, `e in generale una buona pratica creare comunque una seconda partizione
per larea di swap (vedi sez. 5.1.7).
Per questo motivo di solito si preferisce creare almeno unaltra partizione su cui montare
/home per i dati degli utenti. O qualora si abbiano dati di sistema unaltra per /var o /srv. Se
poi si vuole separare anche quanto non strettamente necessario allavvio dal resto del sistema si
pu`o mettere anche /usr su una partizione separata. Inoltre, onde evitare che gli utenti possano
riempire la radice con file temporanei, `e sempre opportuno usare una partizione separata per
/tmp.32 Infine in certi casi per il problema del 1024 cilindro visto in sez. 5.1.1 poteva essere
necessario creare una partizione separata per /boot, oggi questi non si verificano pi`
u ma questa
partizione pu`
o restare necessaria quando si esegue una installazione su dispositivi cifrati, in tal
caso infatti il bootloader dovr`
a accedere ai file necessari allavvio (vedi sez. 5.3) in chiaro.
Usare diverse partizioni (e pi`
u dischi) ha comunque una serie di controindicazioni; anzitutto
si pu`o sprecare inutilmente spazio disco quando una partizione si riempie mentre le altre sono
vuote, e a questo punto si ha solo lalternativa di ripartizionare o di spostare pezzi da una
partizione allaltra e farvi riferimento con dei link simbolici, che non `e il massimo della semplicit`
a
di gestione e pu`
o comportare una serie di problemi con i programmi di backup che di norma,
per evitare di inserire nel backup cose che non centrano nulla, prevedono di archiviare solo i file
presenti sul filesystem corrente.
Inoltre una volta che si sono spostate su partizioni diverse /home, /var, /srv, /tmp e /usr
(ed eventualmente /opt) non `e che resti molto altro da spostare,33 e per quanto grandi si possano
fare le partizioni, non si risolver`
a mai il problema di esaurire lo spazio in quelle con la maggior
parte dei contenuti, quando loccupazione dei dati di una partizione cresce oltre la capacit`
a
30
si ricordi che il kernel legge la tabella delle partizioni allavvio e la mantiene in memoria; per questo se si
ripartiziona un disco in uso occorre riavviare il sistema.
31
a parte il caso in cui la si allarga con dello spazio disponibile alla sua fine, in genere nel modificare una
partizione occorre anche operare sul filesystem in essa contenuto, e questo pu`
o comportare diversi problemi.
32
su questo aiuta la quota di disco riservata per lamministratore che molti filesystem supportano (vedi
sez. 5.1.4), salvo il caso in cui `e lamministratore stesso a creare, per sbaglio, troppi file temporanei.
33
a parte esercizi di stile come lo spostamento di /var/tmp o /usr/local, la cui utilit`
a, visto laumento della
complessit`
a di gestione, `e molto dubbia.

256

CAPITOLO 5. AMMINISTRAZIONE STRAORDINARIA DEL SISTEMA

del pi`
u grande dei dischi che si hanno. In casi come questo si `e costretti ad usare pi`
u dischi
dividendo i contenuti che normalmente starebbero sotto una sola directory, cosa che pu`o rendere
la gestione molto pi`
u complicata, specie se questo accade per directory che non siano /home.
Per questultima infatti, che `e quella pi`
u facilmente soggetta alla possibilit`a di esaurimento dello
spazio, `e sempre stata prevista, sia pure al prezzo di una maggiore attenzione nella creazione
degli utenti (si ricordi quanto visto in sez. 4.3.3), la possibilit`a di suddividerne il contenuto su
pi`
u dischi, creando le home directory degli utenti su pathname diversi.
Come si vede luso delle partizioni comporta una serie di potenziali problemi di gestione
dovuti alla necessit`
a di pianificare adeguatamente in fase di installazione la gestione dello spazio
disco; cosa che non sempre `e possibile fare in maniera sicura.34 Per risolverli alla radice `e perci`o
disponibile, a partire dai kernel della serie 2.4.x, il sistema del Logical Volume Manager che
permette di unire partizioni35 e dischi fisici diversi, utilizzando poi dei volumi logici allinterno dei
quali creare i relativi filesystem senza dover fare riferimento diretto ad una specifica partizione.
Tratteremo questo argomento in sez. 6.2.

5.1.3

La gestione del contenuto dei dischi

Come illustrato in sez. 1.2.3 una delle caratteristiche dei sistemi unix-like che disorientano maggiormente chi proviene da altri sistemi operativi `e la presenza di un unico albero delle directory.
Dato che il concetto di volume o disco come entit`a separata non esiste, la conseguenza `e che il
contenuto dei dischi, o degli altri dispositivi contenenti file come CDROM, floppy o chiavette
USB, deve essere fatto apparire allinterno dellunico albero dei file, cos` che possa essere visto
dal sistema allinterno di opportune directory.
Come gi`a accennato loperazione che permette di fare comparire i dati del filesystem contenuto in un dispositivo allinterno di una directory viene chiamata montaggio, ed una delle
caratteristiche di Linux (e degli altri Unix) `e che allavvio del sistema il kernel si limita a montare
soltanto la directory radice36 che deve il suo nome appunto allessere la radice dellalbero dei
file. Questo significa che se si `e seguita la prassi comune di installare i dati su partizioni separate, queste dovranno essere montate in un secondo momento.37 Lo stesso dicasi se si vogliono
utilizzare dati presenti in un dispositivo (floppy, CDROM, o altro) reso disponibile in un tempo
successivo allavvio.38
Il comando che permette di montare il filesystem contenuto in un disco allinterno di una
directory `e mount, che di norma si limita ad invocare la omonima system call del kernel.39 Se lo
si invoca senza argomenti il programma si limita a mostrare lelenco dei filesystem attualmente
montati; ma normalmente esso viene sempre invocato nella forma:
mount -t fs_type /dev/device /path/to/dir
dove lopzione -t serve ad specificare il tipo di filesystem che `e contenuto nel dispositivo che
si vuole montare, che deve essere indicato tramite il suo file di dispositivo /dev/device; infine
34

anche perche le condizioni di uso di una macchina possono cambiare.


si noti come in fig. 5.1 compaia appunto una partizione di tipo Linux LVM, che `e quella da usare per i volumi
fisici che verranno usati con LVM come componenti di un volume logico.
36
vedremo in sez. 5.3 come definire quale sia il dispositivo su cui si trova il filesystem che contiene la radice sia
una delle impostazioni fondamentali relative allavvio del sistema.
37
questo viene fatto nella procedura di avvio, e come abbiamo visto in sez. 1.2.3, `e uno dei motivi per cui certe
directory e certi programmi devono necessariamente stare nel filesystem che contiene la radice.
38
le distribuzioni moderne vengono incontro allutente prevedendo, come supporto per il software installato
insieme allinterfaccia grafica, un meccanismo di riconoscimento automatico di eventuali altri volumi resisi
disponibili, con tanto di montaggio automatico degli stessi, ci`
o non toglie che loperazione debba comunque essere
effettuata; noi vedremo qui come lo si fa in maniera manuale.
39
si tenga presente che per alcuni filesystem (in particolare per quelli di rete come nfs e smbfs) per lesecuzione
del comando non `e sufficiente la chiamata alla omonima system call, ma devono essere usati dei programmi ausiliari;
questi vengono lanciati con linvocazione automatica di un corrispondente programma /sbin/mount.fs_type.
35

5.1. LA GESTIONE DEI DISCHI E DEI FILESYSTEM

257

/path/to/dir indica la directory, che viene detta mount point, in cui il filesystem verr`a montato,
vale a dire la directory allinterno della quale comparir`a il contenuto del filesystem.
Il comando richiede quindi la conoscenza del tipo di filesystem presente nel dispositivo che si
vuole montare, da indicare come parametro per lopzione -t. Lelenco dei nomi principali tipi di
filesystem supportati `e riportato in tab. 5.2; `e possibile comunque usare anche un meccanismo di
ricerca automatico, che viene attivato o usando auto come tipo di filesystem o non specificando
lopzione. In questo caso viene effettuato automaticamente un controllo se nel dispositivo `e
presente uno dei filesystem riconosciuti.40
Tipo
adfs
cramfs
ext2
ext3
ext4
btrfs
hfs
hfsplus
hpfs
iso9660
udf
jfs
minix
ntfs
qnx4
reiserfs
romfs
ufs
vxfs
xfs
befs
msdos
vfat
proc
tmpfs
sysfs
devpts
nfs
coda
smbfs

Descrizione
Acorn Disc Filing System, il filesystem del sistema operativo RiscOS.
Compressed ROM File System, un filesystem su ROM per sistemi embedded.
Second Extended File System, il vecchio filesystem standard di Linux.
Third Extended File System, il filesystem standard di Linux corrente, nato come
versione journaled del precedente.
Fourth Extended File System, nuova versione del filesystem standard di Linux,
evoluzione del precedente.
B-tree File System, nuovo filesystem, progettato per le funzionalit`
a pi`
u avanzate e
indicato come futuro sostituto dei vari extN.
Hierarchy File System, il filesystem del MacOS (non MacOS X).
Hierarchy File System Plus, il filesystem del MacOS X.
High Performance File System, il filesystem di OS/2.
il filesystem dei CD-ROM, definito dallo standard ISO 9660.
Universal Disk Format, filesystem per i dispositivi ottici (CD e DVD), successore di
ISO 9660.
Journaling File System, il filesystem journaled della IBM portato su Linux.
Minix File System, il filesystem del sistema operativo Minix.
NT File System, il filesystem di Windows NT.
QNX4 File System, il filesystem usato da QNX4 e QNX6.
Reiser File System un filesystem journaled per Linux.
un filesystem speciale per accedere ai dati memorizzati su una ROM.
Unix File System, il filesystem usato da vari Unix derivati da BSD (SunOS, FreeBSD,
NetBSD, OpenBSD e MacOS X).
Veritas VxFS File System, filesystem standard di UnixWare disponibile anche su
HP-UX e Solaris.
X File System, il filesystem di IRIX, portato dalla SGI su Linux.
BeOS File System, il filesystem del sistema operativo BeOS.
il filesystem elementare usato dallMSDOS.
il filesystem FAT usato da Windows 95/98.
filesystem virtuale che fornisce informazioni sul sistema.
filesystem in RAM, usato per mantenere su unarea di memoria dati temporanei.41
filesystem virtuale, introdotto con i kernel della serie 2.6.x, che permette di accedere
alle informazioni relative ai dispositivi presenti e relativi driver.
filesystem virtuale per consentire un accesso efficiente ai terminali virtuali.
Network File System, filesystem per la condivisione di file attraverso la rete tramite
il protocollo NFS (vedi sez. 8.4.1) creato da Sun.
Coda File System, filesystem distribuito su rete che supporta funzionalit`
a evolute
come autenticazione, replicazione e operazioni disconnesse.
SMB File System, filesystem usato per montare le directory condivise di Windows.

Tabella 5.2: Principali filesystem disponibili su Linux e relativi nomi per lopzione -t di mount.

Se il riconoscimento non riesce viene effettuato un ulteriore controllo: prima viene letto
/etc/filesystems e, se questo non esiste, /proc/filesystems, per eseguire una prova con
tutti quelli ivi elencati. In genere si usa /etc/filesystems se si vuole cambiare lordine in cui il
40

allo scopo vengono usati i comandi blkid o vol_id che vedremo a breve.
si tratta di un disco in RAM che si appoggia al sistema della memoria virtuale, i file creati non vengono mai
salvati su disco, ma in caso di esaurimento della memoria viene utilizzata la partizione di swap (vedi sez. 5.1.7)
per non perdere il contenuto.
41

258

CAPITOLO 5. AMMINISTRAZIONE STRAORDINARIA DEL SISTEMA

controllo viene effettuato,42 si pu`


o poi indicare luso ulteriore di /proc/filesystems terminando
/etc/filesystems con un asterisco (*).
Si tenga presente che per poter usare /proc/filesystems occorre che il filesystem virtuale
/proc (che abbiamo gi`
a incontrato in sez. 1.2.3) sia stato preventivamente montato. Un esempio
del contenuto di questo file, preso da una Debian Sarge, `e il seguente:
nodev
nodev
nodev
nodev
nodev
nodev
nodev
nodev
nodev
nodev
nodev

rootfs
bdev
proc
sockfs
tmpfs
shm
pipefs
ext2
ramfs
devpts
usbdevfs
usbfs
iso9660

in cui i filesystem virtuali sono marcati dalla parola chiave nodev, e non vengono usati nel
procedimento di ricerca automatica appena illustrato.
Altre due importanti opzioni di mount sono -L e -U che consentono di indicare il filesystem che
deve essere montato senza fare riferimento al relativo file di dispositivo. Entrambe necessitano
delluso del file /proc/partitions, dove sono mantenute le informazioni relativi alle partizioni
dei dischi ed al loro contenuto. Usando -L `e possibile indicare quale filesystem montare invece
che attraverso il corrispondente file di dispositivo tramite una etichetta (che deve essere stata
impostata in fase di creazione, vedi sez. 5.1.4), mentre con -U si pu`o fare la stessa operazione
usando invece il valore dellUUID (Universally Unique Identifier ) associato al filesystem. Questo
`e un numero di 128 bit utilizzato per identificare univocamente un oggetto; in genere viene
espresso con 32 cifre esadecimali suddivise in 5 sezioni separate dal carattere -; la prima
versione cercava di garantire lunivocit`
a facendo riferimento al MAC address (vedi sez. 7.6.4) del
proprio computer e ad una marca temporale, le versioni pi`
u recenti prevedono una opportuna
generazione di un numero univoco.43
Queste due opzioni sono oggi utilizzate sempre pi`
u spesso, proprio in quanto consentono (in
particolare la seconda, che assicura la non ambiguit`a della identificazione) di rendere non pi`
u
necessari i riferimenti espliciti ai vari file di dispositivo, che, come vedremo in sez. 5.4.5, ormai
vengono allocati prevalentemente in maniera dinamica tramite il sistema di udev e hotplug e
possono, in particolare con la diffusione dei dischi rimuovibili, essere di volta in volta diversi.
Luso di identificativi generici che permettono di riconoscere esattamente un filesystem, indipendentemente dal nome assegnato al rispettivo file di dispositivo, comporta anche la necessit`a
di disporre degli opportuni programmi che consentano di rilevare dette corrispondenze. Se sono
note o letichetta o lUUID associato ad un filesystem il rispettivo file di dispositivo pu`o essere
trovato con il comando findfs. Il comando `e molto semplice e prende un argomento nella forma
LABEL=etichetta o UUID=valore, stampando il corrispondente file di dispositivo. Loperazione
inversa pu`o essere fatta con il comando vol_id, che prende come argomento un file di dispositivo
e stampa come risultato le propriet`
a del filesystem in esso contenuto, ad esempio:
ellington:~# vol_id /dev/sda1
ID_FS_USAGE=filesystem
ID_FS_TYPE=ext3
ID_FS_VERSION=1.0
42

questo restava utile ad esempio per provare prima vfat di msdos, evitando che venisse usato questultimo
quando era disponibile il primo, perdendo la relativa informazione.
43
per i dettagli si consulti http://en.wikipedia.org/wiki/UUID.

5.1. LA GESTIONE DEI DISCHI E DEI FILESYSTEM

259

ID_FS_UUID=aaf4126a-0dc0-4bb8-8429-557eb8c56fba
ID_FS_UUID_ENC=aaf4126a-0dc0-4bb8-8429-557eb8c56fba
ID_FS_LABEL=
ID_FS_LABEL_ENC=
ID_FS_LABEL_SAFE=

Allo stesso scopo si pu`


o usare anche il comando blkid che riunisce le funzionalit`a dei due
precedenti. Il comando stampa le propriet`a (file di dispositivo, tipo di filesystem, eventuale
etichetta e UUID) relative a qualunque dispositivo a blocchi. Se invocato senza argomenti
esegue lelenco per tutti i dispositivi a blocchi presenti, altrimenti si pu`o effettuare una selezione
passando come argomento il nome di un file di dispositivo. Inoltre si pu`o, attraverso lopzione -t,
eseguire la selezione per etichetta, UUID o tipo di filesystem, passando allopzione un parametro
rispettivamente nella forma LABEL=value, UUID=value o TYPE=value, dove in questultimo caso
il tipo di filesystem deve essere indicato con uno dei valori di tab. 5.2.
Altre opzioni importanti del comando mount, utilizzate spesso nellinvocazione, sono -v, che
aumenta la prolissit`
a dei messaggi e -a che monta tutti i filesystem elencati per il montaggio
automatico in /etc/fstab (sul cui uso torneremo a breve). Si sono riportate le altre principali opzioni in tab. 5.3, mentre per lelenco completo si pu`o consultare la pagina di manuale,
accessibile con man mount.
Opzione
-a
-t type
-o opt
-v
-n
-r
-w

Significato
monta tutti i filesystem marcati per il montaggio
automatico allavvio in /etc/fstab.
specifica il tipo di filesystem type .
specifica una opzione di montaggio opt .
aumenta la prolissit`
a nella stampa dei messaggi.
non aggiorna lelenco dei filesystem montati tenuto in
/etc/mtab.
monta il filesystem in sola lettura.
monta il filesystem in sola scrittura.

Tabella 5.3: Le principali opzioni del comando mount.

Si `e lasciata per ultima, da trattare a parte per la sua rilevanza peculiare, lopzione -o che
viene usata per specificare le cosiddette opzioni di montaggio con sui si possono impostare la
caratteristiche di utilizzo del filesystem che viene montato. Ogni filesystem infatti pu`o presentare
diverse modalit`
a di funzionamento, che vengono controllate appunto attraverso le sue opzioni
di montaggio; alle opzioni specifiche di ogni singolo filesystem si aggiungono quelle che sono
disponibili in generale per qualunque filesystem, riportate in tab. 5.4.
Ciascuna opzione di montaggio `e identificata da un nome, che viene passato come parametro
di -o; se ne pu`
o anche specificare una lista, scrivendone i rispettivi nomi separati da virgole e
senza spazi in mezzo. Si tenga presente alcune delle opzioni elencate in tab. 5.4, in particolare
auto, user, users e defaults e relative negazioni, hanno significato solo quando vengono usate
nel quarto campo del file /etc/fstab, su cui torneremo fra breve.
Oltre a specificare delle opzioni di montaggio coi valori riportati in tab. 5.4 lopzione -o
consente anche di effettuare alcune operazioni speciali; ad esempio utilizzando il valore remount
diventa possibile rimontare al volo un filesystem gi`a montato senza smontarlo, per cambiare
alcune delle opzioni precedenti. Uno degli usi pi`
u comuni per questa opzione `e quello di rimontare
44
si ottengono cos` in termini di prestazioni gli stessi risultati di noatime senza causare problemi ai programmi
che usano il tempo di ultimo accesso per identificare i file che sono stati letti (come fa un client di posta come
mutt per identificare i messaggi gi`
a letti), a partire dal kernel 2.6.30 questa opzione `e diventata il default, e si pu`
o
riottenere il precedente comportamento con lindicazione esplicita della nuova opzione strictatime.

260

CAPITOLO 5. AMMINISTRAZIONE STRAORDINARIA DEL SISTEMA


Valore
async

atime
auto

defaults
dev
dirsync

group

exec
noatime
noauto
nodev
noexec
nosuid
relatime
ro
rw
suid
sync
user

nouser
users

Significato
tutto lI/O sul filesystem viene eseguito in maniera asincrona, cio`e le funzioni di
scrittura ritornano ed `e il kernel che si incarica di eseguire la effettiva scrittura
dei dati nel momento pi`
u opportuno (`e il valore di default).
Aggiorna il valore del tempo di ultimo accesso ai file (vedi sez. 1.2.2) presenti
sul filesystem (era il valore di default fino al kernel 2.6.30).
tutti i filesystem con questa opzione citati in /etc/fstab vengono montati
dal comando mount -a (che in genere `e quello che viene eseguito allavvio del
sistema).
usa le opzioni di default: rw, suid, dev, exec, auto, nouser, e async.
consente la presenza di file di dispositivo allinterno del filesystem (`e il valore
di default).
esegue in maniera sincrona le operazioni che comportano una scrittura sulle
directory (creazione di link, creazione, spostamento e cancellazione di file,
creazione e cancellazione di directory e file di dispositivo).
consente ad un utente di montare il filesystem se questi appartiene al gruppo
proprietario del relativo dispositivo; questa opzione comporta automaticamente come restrizioni le opzioni noexec, nosuid, e nodev, se non soprassedute
esplicitamente con exec, suid, e dev.
consente lesecuzione di programmi presenti sul filesystem (`e il valore di
default).
non aggiorna il valore del tempo di ultimo accesso al file (utile quando si
vogliono evitare ulteriori accessi al disco).
il filesystem deve essere montato esplicitamente (viene ignorato dallopzione
-a).
non consente luso di file di dispositivo presenti sul filesystem.
non consente lesecuzione di programmi presenti sul filesystem.
non consente che i bit suid e sgid (vedi sez. 1.4.2) abbiano effetto.
aggiorna il tempo di ultimo accesso al file soltanto quando questo `e anteriore
al tempo di ultima modifica.44
monta il filesystem in sola lettura.
monta il filesystem in lettura e scrittura (`e il valore di default).
consente che i bit suid e sgid abbiano effetto (`e il valore di default).
tutto lI/O sul filesystem deve essere sincrono (vale a dire che le funzioni di
scrittura prima di proseguire aspettano che i dati vengano scritti su disco).
consente anche ad un utente normale di montare il filesystem, con le stesse
restrizioni viste per group; il nome utente viene scritto su /etc/mtab e solo lui
potr`
a smontarlo.
solo lamministratore pu`
o montare il filesystem (`e il valore di default).
consente ad un qualunque utente di montare il filesystem, con le stesse
restrizioni viste per group, e ad un qualunque altro di smontarlo.

Tabella 5.4: Valori delle opzioni di montaggio disponibili per qualunque tipo di filesystem.

in lettura/scrittura un filesystem che si `e montato in sola lettura per poterci effettuare un


controllo, o viceversa.45
Unaltra opzione molto utile `e loop; in questo caso in realt`a non si tratta propriamente di
una opzione di montaggio relativa ad un filesystem quanto di un modo per effettuare automaticamente limpostazione di un dispositivo di loopback tramite il quale diventa possibile montare
un filesystem contenuto in un ordinario file di dati.46 Cos` se ad esempio il file geomorphix.iso
`e limmagine ISO di un CD, si potr`
a accedere al contenuto della stessa in maniera trasparente,
montando il file come se fosse un CD, con il comando:
mount -t iso9660 -o loop geomorphix.iso /mnt/images
45

si tenga presente per`


o che fin quando ci sono file aperti in lettura/scrittura, loperazione di rimontaggio in
sola lettura fallir`
a.
46
ovviamente il file deve contenere un filesystem completo.

5.1. LA GESTIONE DEI DISCHI E DEI FILESYSTEM

261

con questa stessa interfaccia `e possibile anche montare un filesystem opportunamente cifrato, nel
qual caso si dovr`
a specificare lopzione encryption per indicare lalgoritmo di cifratura usato e
lopzione keybits per specificare la lunghezza (in bit) della chiave; la password di accesso verr`
a
chiesta sul terminale.47
Come accennato luso dellopzione loop `e un meccanismo semplificato per eseguire automaticamente limpostazione di un dispositivo di loopback. Questo non `e altro che un dispositivo
virtuale che consente di accedere al contenuto di un file di dati come se si trattasse di un dispositivo fisico. In generale limpostazione deve essere fatta manualmente con il comando losetup,
che consente di associare il contenuto di un file, passato come argomento, ad un apposito dispositivo, accessibile con il nome /dev/loopN, dove N `e un numero progressivo che, se non si
specifica niente, viene allocato automaticamente.48
Il comando consente anche, con -f, di indicare quale specifico file di dispositivo deve essere
usato, passandolo come parametro allopzione, o di ottenere il primo dispositivo libero se non
si specifica nessun argomento. Si pu`o poi rimuovere lassociazione e liberare il dispositivo con
lopzione -d (che prende come argomento il nome del dispositivo stesso), o ottenere un elenco
dei dispositivi definiti con lopzione -a; per lelenco delle opzioni e tutti i dettagli sul comando
si consulti la pagina di manuale.
Ci si pu`
o chiedere, a parte lesempio citato, a cosa possa servire una funzionalit`a come quella
del loopback, dato che avere a disposizione un file contenente un filesystem pu`o sembrare un
caso abbastanza esoterico. In realt`
a, dato che in un sistema unix-like tutto `e un file, il caso `e
abbastanza comune; basta infatti copiare con dd un file di dispositivo su un file per ottenere
limmagine del contenuto del dispositivo stesso, come illustrato in sez. 4.1.4, ed a questo punto
poterne ispezionare il contenuto e verificare lintegrit`a `e senzaltro molto utile.
Come accennato pi`
u volte in precedenza nel funzionamento di mount `e fondamentale il file
49
/etc/fstab, che pu`
o essere considerato come una specie di file di configurazione del comando. In generale `e cura della procedura di installazione creare un file /etc/fstab che contenga
tutte le informazioni necessarie a montare tutti i filesystem creati sulla base d elle scelte sul
partizionamento fatte in tale occasione.
Il formato del file `e molto semplice: ogni linea definisce un filesystem da montare, ed `e
composta da sei campi. Linee vuote o che iniziano per # vengono ignorate, i campi di ogni
linea sono separati da spazi o tabulatori. La pagina di manuale, accessibile con man fstab, ne
spiega i dettagli; un esempio del suo contenuto `e il seguente:
# /etc/fstab:
#
# file system
/dev/hdb5
/dev/hdb6
proc
/dev/fd0
/dev/cdrom
/dev/sr0
/dev/hdb1
/dev/hda1
/dev/hdc4

static file system information.


mount point
/
none
/proc
/floppy
/cdrom
/mnt/cdrom
/boot
/mnt/win
/mnt/zip

type
ext2
swap
proc
auto
iso9660
iso9660
ext2
vfat
auto

options
defaults,errors=remount-ro
sw
defaults
defaults,user,noauto
defaults,ro,user,noauto
defaults,ro,user,noauto
rw
defaults,user,noauto
defaults,user,noauto

dump
0
0
0
0
0
0
0
0
0

pass
1
0
0
0
0
0
2
0
0

Il primo campo specifica quale `e il filesystem da montare che viene normalmente indicato
tramite il file di dispositivo su cui lo stesso risiede: nel caso dellesempio si avevano due dischi
47

questo uso `e comunque deprecato, e non pi`


u disponibile sui kernel recenti, in quanto presenta grossi problemi
di sicurezza; al suo posto pu`
o essere utilizzato il sistema del device mapper che vedremo in sez. 6.2.
48
questo fintanto che non si supera il numero massimo di dispositivi di loopback disponibili; il valore di default
del limite `e 8, ma pu`
o essere cambiato fino ad un massimo assoluto di 256 caricando il modulo di kernel che
implementa il dispositivo con una opportuna opzione (vedi sez. 5.2.5).
49
il cui nome sta per file system table.

262

CAPITOLO 5. AMMINISTRAZIONE STRAORDINARIA DEL SISTEMA

rigidi IDE con varie partizioni, indicati con i vari /dev/hdaN e /dev/hdbN, un floppy, indicato
con /dev/fd0, uno ZIP su IDE, indicato come /dev/hdc4, un CDROM ed un masterizzatore
SCSI, indicati rispettivamente con /dev/cdrom e /dev/sr0, dove nel caso del CDROM si era
usato un link simbolico.50
Si noti che per il filesystem /proc, il cui contenuto non `e mantenuto in nessun dispositivo
fisico ma viene fornito direttamente dal kernel, si `e usata invece la parola chiave proc. Se ci
fossero stati dei filesystem di rete montati con NFS (vedi sez. 8.4.2) si sarebbero potute avere
anche righe del tipo:
davis.truelite.it:/data /mnt/nfs

nfs

defaults,user,noauto

in cui viene nel primo campo viene indicata la directory remota da montare.
Infine quando nella creazione di un filesystem si impostano delle etichette identificative o degli
UUID, si possono usare i valori di questi ultimi al posto del file di dispositivo,51 come avviene
sempre pi`
u spesso nelle installazioni di distribuzioni recenti, che fanno questa scelta per evitare
problemi con eventuali variazioni dei nomi dei file di dispositivo.52 Nel caso di identificazione
tramite lUUID si sarebbe allora avuta una riga analoga alla seguente:
UUID=3d9393cc-4fab-497f-9ec3-a105be531811

/usr

ext3 defaults,relatime 0

mentre nel caso di una etichetta associata al filesystem il primo campo sarebbe stato nella forma
LABEL=etichetta.
Il secondo campo di etc/fstab indica il mount point, cio`e la directory dove i file contenuti
nel dispositivo indicato nel primo campo saranno resi disponibili, e deve essere specificato con
il suo pathname assoluto. Se sul dispositivo non esiste un filesystem che deve essere montato,
come avviene nel caso di una partizione di swap (vedi sez. 5.1.7), al posto del pathname si deve
usare la parola chiave none.
Il terzo campo indica il tipo di filesystem che sta sul dispositivo che si vuole montare, e deve
essere specificato allo stesso modo con cui lo si indica allopzione -t di mount, utilizzando gli
stessi valori gi`a riportati in tab. 5.2. Si noti per`o come nellesempio precedente in corrispondenza
a /dev/hdb6 venga usata la parola chiave swap, che non compare in tab. 5.2. Essa infatti serve
ad indicare che il dispositivo non contiene un filesystem, ma viene usato per la swap (vedi
sez. 5.1.7).
Il quarto campo di /etc/fstab indica le opzioni con cui si deve montare il filesystem, e
prende gli stessi valori dellopzione -o di mount, riportati in tab. 5.4. Nel caso si usi lopzione
defaults la successiva specificazione di unaltra opzione soprassiede il valore di default. Come
per -o pi`
u opzioni vanno specificate di seguito, separate da virgole e senza spazi interposti.
Gli ultimi due campi sono relativi alla manutenzione del filesystem, il quinto campo indica
se effettuare il dump 53 del filesystem ed in genere viene lasciato a 0 (per attivarlo occorre usare
invece 1) mentre il sesto campo indica la sequenza con cui allavvio viene lanciato il comando
fsck per controllare lo stato dei dischi (vedi sez. 5.1.5), uno zero indica che il controllo non deve
essere eseguito.
Luso principale di /etc/fstab `e il controllo del comportamento del comando mount -a,
che viene utilizzato nella procedura di avvio del sistema per montare automaticamente tutte
le directory del sistema (ad esempio /var, /usr e /home) se queste sono state installate su
50

lesempio fa riferimento ad una installazione precedente la versione 2.3 del FHS, e che non prevedeva sistemi
di rilevazione automatica dei dispositivi rimuovibili e non richiedeva luso della directory /media.
51
valgono le stesse indicazioni delle opzioni -L e -U e cio`e che deve essere disponibile /proc/partitions.
52
ad esempio perche rimontati su un diverso canale IDE, o per il passaggio alluso di libata che fa apparire
i dischi come SCSI, o per un diverso ordine di riconoscimento sul bus SCSI che pu`
o avvenire con i dischi USB
rimuovibili o con luso di controller multipli.
53
`e un valore utilizzabile solo per i filesystem (attualmente ext2 ed ext3) che supportano il comando di backup
dump (vedi sez. 4.1.3); se attivato con un valore non nullo verranno salvate le informazioni che consentono a dump
di eseguire i backup incrementali.

5.1. LA GESTIONE DEI DISCHI E DEI FILESYSTEM

263

filesystem separati rispetto alla radice. In questo caso `e necessario marcare la riga relativa con
lopzione auto; per i filesystem che non devono essere montati invece (ad esempio CD-ROM e
floppy) si deve specificare lopzione noauto.
La presenza di una configurazione in /etc/fstab permette inoltre di semplificare luso di
mount poiche per i filesystem in esso elencati il comando pu`o essere invocato specificando solo il
mount point. Inoltre questa sintassi consente luso di mount anche agli utenti normali,54 i quali
potranno montare un dispositivo qualora si siano specificate le opzioni user, group o users
nella riga relativa. In questo modo si pu`o permettere agli utenti di montare i propri CD e floppy,
senza per`
o consentirgli di modificare il mount point o le opzioni di montaggio.
Dal punto di vista dellamministrazione si potr`a avere che fare con /etc/fstab tutte le
volte che si aggiunge un disco, o un nuovo dispositivo a blocchi, o si cambiano le partizioni. In
questo caso occorrer`
a identificare qual`e il file di dispositivo da usare e scegliere una directory
su cui montarlo. Deve poi essere specificato il filesystem da usare (o auto se si vuole tentare il
riconoscimento automatico) e le eventuali opzioni di montaggio.
Nellesempio precedente si noti come per ZIP e floppy si sia consentito agli utenti di montare
il filesystem, ma si sia disabilitato il montaggio allavvio, e pure il controllo dello stato del
filesystem, dato che non `e detto che il floppy o lo ZIP siano inserito nel rispettivo lettore. Lo
stesso vale per il CDROM e il masterizzatore, per i quali per`o si `e pure aggiunto lopzione di
montaggio in sola lettura.55 Si noti inoltre lopzione di montaggio usata per il filesystem radice,
per il quale si `e indicato di rimontare il filesystem in sola lettura nel caso di errori. Nel disco
fisso andr`
a poi scelto se montarlo allavvio o meno, e in questo caso usare il sesto campo per
indicare in quale ordine rispetto agli altri dovr`a essere effettuato il controllo del filesystem (il
primo deve essere il filesystem usato come radice).
Un secondo file collegato alluso di mount `e /etc/mtab, che contiene lelenco dei filesystem
montati mostrato dal comando quando lo si invoca senza opzioni. Il file viene creato ed aggiornato automaticamente da mount nelle sue operazioni e non deve essere modificato manualmente,
ma si tenga presente che se la radice `e in sola lettura (o se si `e usata lopzione -n per eseguire
un montaggio) le sue informazioni possono non essere aggiornate.
Le stesse informazioni sono presenti anche allinterno di /proc/mounts, ma in questo caso
sono mantenute direttamente dal kernel e sono quindi sempre aggiornate, tanto che talvolta si
suggerisce di sostituire /etc/mtab con un link simbolico a questo file. In realt`a in /etc/mtab
vengono mantenute informazioni aggiuntive, come lutente che ha montato un filesystem nel caso
dellopzione user, che non funzionerebbe nel caso di un link simbolico.
Si tenga presente che quando si monta un filesystem su una directory un eventuale contenuto
di questultima viene oscurato dal contenuto del nuovo filesystem, e non sar`a pi`
u possibile
accedervi fintanto che questo non viene smontato. Se per`o si sono aperti dei file in essa presenti
questi continueranno a funzionare regolarmente (in quanto sono visti attraverso il loro inode,
si ricordi quanto detto in sez. 1.2.2). Inoltre a partire dal kernel 2.4 diventa possibile impilare
pi`
u operazioni di mount sulla stessa directory, che presenter`a il contenuto dellultimo filesystem
montato (valendo quanto appena detto per il contenuto dei precedenti).
In maniera analoga a come lo si `e montato, quando non si ha pi`
u la necessit`a di accedere ad
un filesystem, questo potr`
a essere smontato. In questo modo diventa possibile rimuovere, nel
caso di kernel modulare, (vedi sez. 5.2.5) le eventuali risorse aggiuntive, e liberare la directory
utilizzata per il montaggio per un eventuale riutilizzo.56
54

loperazione di montaggio di un filesystem `e privilegiata e pu`


o essere effettuata in modo generico solo
dallamministratore.
55
le distribuzioni pi`
u recenti tendono comunque a gestire i dispositivi rimuovibili attraverso programmi dedicati
che sono in grado di rilevare la loro presenza e montarli automaticamente, in tal caso in genere quello che si fa `e
inserire lutente in un apposito gruppo che contiene quelli a cui `e consentito utilizzare dispositivi rimuovibili (su
Debian ed Ubuntu il gruppo `e plugdev).
56
come accennato a partire dalla serie 2.4.x del kernel questo non `e pi`
u necessario, in quanto si possono impilare

264

CAPITOLO 5. AMMINISTRAZIONE STRAORDINARIA DEL SISTEMA

Il comando in questo caso `e umount57 che pu`o prendere come argomento sia il mount point
che il file di dispositivo, e distacca il relativo filesystem dallalbero dei file. Si tenga presente
che fintanto che il filesystem `e utilizzato questa operazione non viene permessa. Questo significa
che fintanto che si hanno processi che hanno aperto dei file contenuti nel filesystem, o la cui
directory di lavoro (vedi sez. 1.3.2) `e nel filesystem, non sar`a possibile effettuarne lo smontaggio,
e luso del comando dar`
a luogo ad un errore di risorsa occupata.
Il problema pu`
o risultare particolarmente antipatico quando si ha a che fare con un dispositivo
rimovibile che si vuole estrarre, in tal caso per`o si pu`o ricorrere al comando lsof (vedi sez. 2.4.5)
per individuare i processi che stanno ancora utilizzando il filesystem e terminarli o cambiargli
directory di lavoro (se trattasi di shell). Inoltre dal kernel 2.4.11 `e disponibile un lazy umount,
attivabile con lopzione -l, che distacca immediatamente il filesystem (impedendo ogni ulteriore
accesso allo stesso) ma esegue le successive operazioni di pulizia e la chiusura del filesystem
soltanto quando tutte le risorse occupate vengono liberate.
Una sintassi alternativa per umount `e luso dellopzione -a, che smonta tutti i filesystem
elencati in /etc/mtab (tranne, a partire dalla versione 2.7 del comando, /proc), in questo
caso ovviamente non `e necessario indicare quale dispositivo smontare, ma si pu`o restringere le
operazioni a tutti i filesystem di un determinato tipo, specificando questultimo con lopzione
-t. Lelenco completo delle opzioni del comando `e disponibile nella relativa pagina di manuale,
accessibile con man umount.
Si tenga presente che quando si smonta un filesystem tutte le modifiche effettuate fino a
quel momento dovranno essere registrate su disco; questo significa, dato che il kernel prevede la
bufferizzazione dei dati,58 che in certe occasioni luso di umount pu`o risultare piuttosto lento e
scatenare una forte attivit`
a di accesso al disco, dato che il comando non termina fintanto che
tutti i buffer sono stati scaricati. Questa operazione pu`o essere forzata, senza dover smontare il
filesystem, con il comando sync che si limita semplicemente a richiedere al kernel che lo scarico
dei buffer sia effettuato immediatamente.
Altri comandi essenziali per la gestione dei dischi sono quelli che consentono di verificare lo
spazio disco utilizzato e la percentuale di uso dei vari filesystem. Il primo di questi `e df; se invocato senza argomenti il comando stampa loccupazione dello spazio disco di ciascun filesystem
montato,59 con un sommario della relativa dimensione totale, dei blocchi occupati e liberi e della
percentuale di occupazione, producendo un risultato del tipo:
Filesystem
/dev/md0
tmpfs
udev
tmpfs
/dev/hdf1

1K-blocks
Used Available Use% Mounted on
114389928 82038556 26540668 76% /
258436
0
258436
0% /lib/init/rw
10240
64
10176
1% /dev
258436
4
258432
1% /dev/shm
192292124 115097092 67427112 64% /bacula

Il default prevede che il comando indichi loccupazione di spazio disco in blocchi da 1K


(1024 byte), ma si possono richiedere dimensioni diverse o la stampa in un formato pi`
u leggibile
con lopzione -h. Si pu`
o inoltre indicare al comando un singolo filesystem, per ottenere i dati
relativi solo a quello o un tipo tramite lopzione -t, che prende come parametro uno del valori di
tab. 5.2. Infine con lopzione -i si pu`
o richiedere un rapporto relativo alluso degli inode invece
che a quello dello spazio disco. Al solito per i dettagli e tutte le opzioni si consulti la pagina di
manuale.
pi`
u montaggi sulla stessa directory; `e comunque necessario smontare un device rimovibile come il floppy o il CD,
prima di poterlo estrarre e sostituire.
57
si dice che la n si sia persa nei meandri delle prime implementazioni di Unix.
58
dato che laccesso a disco `e lento il kernel cerca di eseguire i trasferimenti dei dati nella maniera pi`
u efficace possibile, salvando le modifiche in memoria ed effettuando le scritture in gruppo al momento reputato pi`
u
opportuno.
59
riportando soltanto quelli che hanno un contenuto reale, non vengono cio`e mostrati filesystem virtuali come
/proc o /sys che non hanno una reale occupazione di spazio disco o di altre risorse.

5.1. LA GESTIONE DEI DISCHI E DEI FILESYSTEM

265

Qualora invece del totale a livello di intero filesystem si voglia conoscere lo spazio disco
occupato dai file posti allinterno di una certa directory si pu`o usare il comando du. Il comando
prende come argomenti una lista di file e directory e stampa un sommario dello spazio occupato
da ciascuno di essi, in kilobyte. Se non si specificano argomenti viene usata la directory corrente.
Il comando stampa ricorsivamente la quantit`a di spazio disco occupato allinterno di ciascuna
sottodirectory a partire da quelle indicate come argomenti, se si vuole conoscere solo il totale
relativo alle directory indicate si pu`
o utilizzare lopzione -s. Una seconda opzione utile `e -c che
permette, quando si indicano pi`
u argomenti, di ottenere anche la stampa delloccupazione totale
relativa a tutti gli argomenti. Per i dettagli sul funzionamento del comando (cambiare unit`
a di
misura, escludere file dal calcolo, ecc.) si consulti al solito la pagina di manuale.

5.1.4

La creazione di un filesystem

Abbiamo visto in sez. 5.1.3 come si pu`o rendere disponibile il contenuto di un filesystem nellalbero delle directory. Quando si installa il sistema o quando si aggiunge un disco per`o i filesystem
devono essere creati, in modo da strutturare per luso lo spazio disponibile (che sia una partizione
o un dispositivo fisico o virtuale), operazione comunemente detta formattazione.
Filesystem
reiserfs

Opzione
-b
-s
-j
-h

N
N
file
hash

-l label
-u UUID
msdos
-F N
-n name
-c
vfat
ext2
-b N
-F
-i N
-j
-J opts
-m N
-c
-L label
-U UUID
-T type

ext3
ext4
xfs
-s N
-L label

Descrizione
mkreiserfs
specifica la dimensione dei blocchi.
specifica la dimensione del giornale.
specifica un file di dispositivo per il giornale.
specifica un algoritmo di hashing per la ricerca veloce dei file allinterno
delle directory.
imposta una etichetta sul filesystem (16 caratteri).
associa un UUID al filesystem.
mkdosfd o mkfs.msdos
specifica la dimensione della FAT (File Allocation Table).
specifica un nome per il volume (11 caratteri).
esegue il controllo del dispositivo per eventuali settori difettosi.
mkfs.vfat
esegue mkdosfs.
mke2fs o mkfs.ext2
specifica la dimensione dei blocchi.
forza successivo controllo del filesystem.
specifica ogni quanti byte di spazio disco deve essere creato un inode,
non pu`
o essere inferiore alle dimensioni di un blocco.
crea il giornale per il filesystem (equivalente ad invocare il comando
come mkfs.ext3).
permette di specificare i parametri per la gestione del file di giornale.
specifica la percentuale di spazio disco riservata per lamministratore
che gli utenti normali non possono usare.
esegue il controllo del dispositivo per eventuali settori difettosi.
associa una etichetta al filesystem.
associa un UUID al filesystem.
specifica la tipologia di utilizzo del filesystem, con una indicazione generica che consente di stabilire lo spazio da assegnare a inode e spazio
per i file.
mkfs.ext3
esegue mke2fs con le opportune opzioni.
mkfs.ext4
esegue mke2fs con le opportune opzioni.
mkfs.xfs
specifica la dimensione dei blocchi.
specifica un nome per il volume (12 caratteri).

Tabella 5.5: Le principali opzioni per i comandi di creazione dei filesystem.

266

CAPITOLO 5. AMMINISTRAZIONE STRAORDINARIA DEL SISTEMA

Si tenga presente che questa `e una operazione diversa dalla formattazione fisica del dispositivo che divide lo spazio sul disco in tracce e settori, come quella che di solito si fa sui dischetti. In
genere per i dischi questa operazione non `e pi`
u necessaria dato che viene eseguita direttamente
dal fabbricante una volta per tutte. Si deve invece eseguirla per i floppy, con il comando fdformat, ma questo non comporta che poi si possa utilizzarlo, occorrer`a anche creare il filesystem:
in Linux infatti la formattazione fisica del dispositivo e la creazione del filesystem, che sono
delle operazioni distinte, vengono sempre tenute separate, nonostante alcuni sistemi operativi le
eseguano insieme.
La creazione di un filesystem su un dispositivo si esegue con il comando mkfs, questo prende
come argomento il file di dispositivo su cui si vuole creare il filesystem, mentre il tipo di filesystem
che si vuole creare si specifica con lopzione -t. In realt`a mkfs `e solo un front-end, che chiama
per ciascun tipo di filesystem un comando specifico. Cos` ad esempio se si vuole formattare un
filesystem FAT per Windows, con mkfs -t vfat verr`a invocato mkfs.vfat.
In generale i programmi di formattazione sono forniti insieme agli altri programmi di supporto per il filesystem, come quelli per il controllo di consistenza o il ridimensionamento, e
possono avere un nome specifico: ad esempio per ReiserFS il programma si chiama mkreiserfs
mentre quello per ext2/ext3/ext4 `e mke2fs, e possono essere invocati direttamente. Perche
la forma generica mkfs -t type funzioni per`o deve essere presente il corrispondente comando
mkfs.type.60
Le altre opzioni dipendono dal filesystem scelto, e possono essere trovate nella relativa pagina
di manuale, accessibile al solito con man mkfs.type. Un elenco delle principali opzioni disponibili
con i principali filesystem `e riportato in tab. 5.5.
Benche oggi esistano molteplici alternative (ReiserFS, JFS, XFS), il filesystem pi`
u usato con
Linux `e ext3 con un progressivo passaggio al nuovo ext4. In realt`a entrambi sono una evoluzione
della precedente versione ext2, e tutti quanti usano una strutturazione dei dati su disco analoga
per cui alla fine i vari programmi di manutenzione sono gli stessi e mantengono i nomi originari
(quelli di ext2 ) il primo di questi `e mke2fs, un cui esempio `e:
anarres:/home/piccardi# mke2fs /dev/hda3
mke2fs 1.35-WIP (07-Dec-2003)
Filesystem label=
OS type: Linux
Block size=1024 (log=0)
Fragment size=1024 (log=0)
25064 inodes, 100000 blocks
5000 blocks (5.00%) reserved for the super user
First data block=1
13 block groups
8192 blocks per group, 8192 fragments per group
1928 inodes per group
Superblock backups stored on blocks:
8193, 24577, 40961, 57345, 73729
Writing inode tables: done
Writing superblocks and filesystem accounting information: done
This filesystem will be automatically checked every 37 mounts or
180 days, whichever comes first. Use tune2fs -c or -i to override.

Se usato senza specificare altro che il dispositivo61 da formattare mke2fs si limita a creare
` particolarmente
il filesystem, stampando tutta una serie di informazioni ad esso relative. E
60

che nel caso di XFS `e comunque automaticamente vero, dato che il comando nativo di formattazione di XFS
ha esattamente questo nome.
61
anche se volendo si pu`
o anche usare un file normale che potr`
a poi essere montato in loopback.

5.1. LA GESTIONE DEI DISCHI E DEI FILESYSTEM

267

significativa quella relativa a dove sono stati posti i vari backup del superblock.62 Questo `e
un blocco speciale che contiene tutte le informazioni relative alla configurazione del filesystem,
ed `e essenziale per poterlo montare. La perdita del superblock causerebbe la perdita completa
del filesystem per cui ne vengono mantenute varie copie in modo che in caso di distruzione o
corruzione si possa usare una delle copie. Pertanto `e bene annotarsi la posizione delle varie
copie, anche se `e possibile recuperarla in un secondo momento con dumpe2fs.
Al di l`
a della invocazione semplice appena mostrata il comando prevede numerose opzioni che
permettono di impostare tutta una serie di caratteristiche del filesystem che si va a creare. Una
delle principali `e la dimensione dei blocchi in cui lo spazio disco viene suddiviso, da specificare
tramite lopzione -b. Con blocco si indica in genere lunit`a minima di spazio disco che viene
allocata per inserirvi i dati di un file; in genere63 ogni file consuma almeno un blocco, e le
dimensioni dei file sono dei multipli interi di questo valore. Valori tipici sono 1024, 2048 o 4096.
Qualora si ometta questo parametro il suo valore viene stabilito con una valutazione euristica
sulla base della dimensione del disco e del tipo di uso che si vuole fare del filesystem.64 Qualora
si usi un valore negativo questo viene preso come limite inferiore per la dimensione di un blocco.
Un altro parametro importante `e quello del numero di inode da creare (si ricordi che, come
detto in sez. 1.2.2, ogni file `e sempre associato ad un inode). Questi di norma vengono mantenuti
in una sezione apposita del filesystem, le cui dimensioni vengono determinate in sede di creazione
del filesystem.65 Il comando permette, con luso dellopzione -i di impostare ogni quanti byte
di spazio disco deve essere creato un inode. Si deve dare cio`e la valutazione della dimensione
media di un file sul disco: specificare un valore troppo alto creer`a pochi inode, con il rischio di
esaurirli, un valore troppo basso ne creer`a troppi, con conseguente spreco di risorse.66
Si tenga presente che per la gestione dei file in un filesystem blocchi e inode sono due risorse
indipendenti, si possono cio`e esaurire sia i blocchi liberi che gli inode disponibili, anche se il
primo caso `e di gran lunga quello pi`
u comune, e trovarsi cos` nella condizione di non poter pi`
u
creare nuovi file. Per questo motivo per una gestione ottimale del disco di solito occorre una
scelta opportuna sia delle dimensioni dei blocchi che del rapporto fra blocchi disponibili e inode.
Tenere le dimensioni dei blocchi basse riduce lo spreco di spazio per quelli occupati parzialmente,
ma implica un maggiore lavoro per la gestione (e maggiore spazio per le informazioni relative).
Usare pochi inode permette di risparmiare spazio ed essere pi`
u veloci nella ricerca, ma si corre
il rischio di finirli prima di esaurire lo spazio disco.
Altre caratteristiche aggiuntive di un filesystem ext2 possono essere impostate attraverso
lopzione -O, che prende una lista di parametri, separata da virgole se sono pi`
u di uno, che
67
specificano le caratteristiche da abilitare. I valori possibili per i parametri di -O sono illustrati
in tab. 5.6. Nelle vecchie versioni del comando di default venivano attivate le due caratteristiche
sparse_super e filetype, che non sono compatibili con le implementazioni di ext2 antecedenti i kernel della serie 2.2.x, oggi il default `e controllato dalla voce base_features del file
62
la spiegazione esatta del significato dei vari parametri come quelli relativi a group blocks e fragments va al di
l`
a di quanto sia possibile fare qui, in breve per`
o si pu`
o dire che un filesystem ext2 divide lo spazio disco in blocchi
che a loro volta vengono raggruppati nei group blocks, che contengono al loro interno le tabelle degli inode e lo
spazio per i blocchi di dati e le informazioni per evitare la frammentazione dello spazio disco, per una spiegazione
pi`
u completa di pu`
o leggere il file filesystem/ext2.txt distribuito nella documentazione allegata ai sorgenti del
kernel.
63
per alcuni filesystem pi`
u evoluti esistono dei meccanismi automatici che permettono di mettere il contenuto
di diversi file di piccole dimensioni in un solo blocco.
64
questo pu`
o essere indicato tramite lopzione -T, che prende i tre valori news (un inode ogni 4kb), largefile
(un inode ogni 1Mb) e largefile4 (un inode ogni 4Mb) per assegnare un diverso rapporto fra numero di inode e
spazio disco disponibile.
65
alcuni filesystem pi`
u evoluti permettono di cambiare questo parametro anche in un secondo tempo.
66
e soprattutto un maggior lavoro per le operazioni sugli stessi, che dovranno essere eseguite su intervalli pi`
u
ampi.
67
se si fa precedere il parametro da un accento circonflesso (^) si richiede invece la disabilitazione dello stesso.

268

CAPITOLO 5. AMMINISTRAZIONE STRAORDINARIA DEL SISTEMA


Parametro
dir_index
filetype
has_journal
journal_dev
resize_inode
sparse_super
large_files

Significato
usa una struttura ad alberi ed hash per la gestione del contenuto delle
directory.
memorizza il tipo di file nelle voci delle directory.
crea anche il file per il giornale (equivalente alluso di -j).
richiede che sul dispositivo indicato sia creato un giornale invece di un
filesystem.
riserva dello spazio per consentire un successivo allargamento del
filesystem con resize2fs (vedi sez. 6.3.2).
crea un filesystem con meno copie del superblock per non sprecare spazio
sui filesystem molto grandi.
il filesystem pu`
o contenere file di dimensione superiore a 2Gb (attivato
automaticamente nei kernel recenti alla creazione di un tale file).

Tabella 5.6: Principali parametri per lattivazione delle estensioni dei filesystem ext2 e ext3 attivabili mediante
lopzione -O di mke2fs.

/etc/mke2fs.conf,68 per la cui sintassi si rimanda alla pagina di manuale. Infine luso del
valore speciale none permette di disabilitare tutte le caratteristiche aggiuntive.
Nel caso si voglia creare un filesystem di tipo ext3, si deve utilizzare lopzione -j che permette di creare un file apposito per il giornale (affronteremo il tema dei filesystem journaled in
sez. 5.1.5), a questa si abbina di solito -J che permette di specificarne delle ulteriori caratteristiche. Qualora non venga utilizzata sono utilizzati i valori di default, altrimenti questi possono
essere specificati nella forma parametro=valore. Un elenco dei parametri specificabili con -J `e
illustrato in tab. 5.7, con relativa spiegazione.
Parametro
size
device

Significato
specifica la dimensione del giornale, da specificare in megabyte. Deve
essere un minimo di 1024 blocchi, e non pu`
o superare 102400 blocchi.
permette di impostare un dispositivo esterno per mantenere il giornale.
Al posto di un file di dispositivo si pu`
o specificare una letichetta associata al filesystem (con lopzione -L). Il dispositivo che fa da giornale
deve essere inizializzato con mke2fs -O journal_dev.

Tabella 5.7: Parametri per la gestione del giornale di un filesystem ext3 specificabili tramite lopzione -J di
mke2fs.

Un problema che si pu`


o avere nella gestione dei dischi `e quello dei settori difettosi. In genere
il verificarsi di errori di questo tipo indica che il disco si sta degradando ed `e prossimo ad una
` comunque
rottura definitiva per cui `e bene provvedere ad un backup ed alla sua sostituzione. E
possibile, con ext2 ed ext3, creare il filesystem in modo da non utilizzare i blocchi contenenti
settori difettosi.
Questo si fa tramite lopzione -c che prima della creazione del filesystem esegue un controllo
per verificarne la presenza ed escluderli dalluso qualora rilevati. Se lopzione viene specificata
due volte il controllo viene eseguito in maniera pi`
u approfondita, ed estremamente lenta, scrivendo e rileggendo tutto il disco. Specificando lopzione -l invece di eseguire il controllo si indica
luso di una lista di blocchi difettosi letta da un file. Di norma questo pu`o essere prodotto indipendentemente dal programma badblocks, che `e quello che viene eseguito anche quando si usa
lopzione -c per effettuare il controllo. Le altre opzioni principali di mke2fs sono riportate nella
lista di tab. 5.5, per un elenco completo si faccia al solito riferimento alla pagina di manuale.
Se lo si usa indipendentemente da mke2fs anche badblocks vuole come argomento il file di
dispositivo da esaminare, ed opzionalmente il blocco di partenza e quello finale del controllo. Si
deve aver cura di specificare con lopzione -b la dimensione dei blocchi, che dovr`a ovviamente
68

su una Debian Etch questo prevede sparse_super, filetype, resize_inode e dir_index.

5.1. LA GESTIONE DEI DISCHI E DEI FILESYSTEM

269

coincidere con quella usata con mke2fs, per cui in genere `e sempre meglio non usare direttamente
il programma, ma invocarlo tramite mke2fs o e2fsck.
Lopzione -c permette di selezionare quanti blocchi vengono controllati alla volta (il default
`e 16); aumentandolo si accresce la velocit`a di esecuzione del comando ma anche il suo consumo
di memoria. Con lopzione -i si indica un file contenente una lista nota di blocchi danneggiati
(quella presente nel filesystem `e ottenibile con dumpe2fs), mentre con -o si indica un file su
scrivere i risultati.
Infine ci sono una serie di opzioni per indicare il tipo di test da eseguire, normalmente viene
eseguita una lettura dei blocchi per verificare errori, se non ce ne sono si prosegue. Con -p
che pu`o specificare quante volte ripetere la scansione di un blocco prima di decidere che non ci
sono errori. Con -w si richiede di eseguire il controllo scrivendo dei dati e poi rileggendoli per
verificarne lintegrit`
a; il metodo `e molto pi`
u preciso, ma anche molto pi`
u lento, inoltre in questo
modo il controllo `e distruttivo in quanto sovrascrive i dati, pertanto non pu`o essere usato su
un filesystem montato. Si pu`
o eseguire questo stesso tipo di test in modalit`a non distruttiva
con lopzione -n, nel qual caso per`
o il controllo diventa estremamente lento. Per le rimanenti
opzioni del comando si pu`
o al solito fare riferimento alla pagina di manuale.
Una volta creato il filesystem, come mostrato anche nelloutput di mke2fs, si possono modificarne alcune caratteristiche con luso del comando tune2fs. Luso pi`
u comune di tune2fs `e
probabilmente quello per trasformare un filesystem ext2 in un filesystem ext3 creando il giornale;
questo `e ottenibile immediatamente con lopzione -j, e si pu`o usare -J con le stesse opzioni di
tab. 5.7 per indicare le caratteristiche del giornale.
Opzione
-c
-C
-T

-e

-i

-j
-J
-l
-L
-m
-O
-r
-u
-g
-U

Significato
imposta il numero di volte che un filesystem pu`
o essere rimontato prima
di subire un controllo; prende come parametro un numero.
modifica il contatore del numero di volte che un filesystem `e stato
montato; prende come parametro un numero.
modifica il valore del tempo in cui il filesystem `e stato verificato per lultima volta; prende come parametro lindicazione della data nel formato
usato da date o il valore now per indicare il tempo corrente.
modifica il comportamento del kernel quando viene rilevato un errore sul filesystem, prende come parametro uno dei valori: continue
(continua ignorando lerrore), remount-ro (rimonta il filesystem in sola
lettura), panic (si ferma causando un kernel panic).
imposta lintervallo di tempo fra due controlli successivi; prende come
parametro un numero di giorni, di settimane se si pospone il carattere
w, di mesi se si pospone il carattere m.
aggiunge un giornale per il filesystem.
sovrascrive i parametri del giornale, prende come parametro uno dei
valori di tab. 5.7.
stampa i contenuti del superblock (come dumpe2fs), vedi sez. 5.1.5).
imposta il nome del volume, per un massimo di 16 caratteri.
imposta la percentuale di blocchi riservati, messi a disposizione
dellutente specificato con -u (di norma lamministratore).
imposta le caratteristiche avanzate del filesystem, prende come
parametri uno dei valori di tab. 5.6.
imposta il numero di blocchi riservati.
imposta lutente che pu`
o usare i blocchi riservati.
imposta il gruppo che pu`
o usare i blocchi riservati.
associa un UUID al filesystem.
Tabella 5.8: Principali opzioni per il comando tune2fs.

Unaltra opzione di uso comune `e -c che permette di impostare il numero di volte che il
filesystem pu`
o essere montato senza che venga forzato un controllo di consistenza con fsck,
analoga a questa `e -i che specifica lintervallo massimo, in giorni, mesi o settimane, fra due

270

CAPITOLO 5. AMMINISTRAZIONE STRAORDINARIA DEL SISTEMA

controlli. Con -C si pu`


o anche modificare a mano il contatore del numero di volte che un
filesystem `e stato montato, in modo da poter forzare il controllo ad un successivo riavvio.
Con lopzione -O si possono modificare in un secondo tempo le caratteristiche avanzate
specificando come parametro una lista dei valori gi`a illustrati in tab. 5.6, in questo caso per
disabilitare una funzionalit`
a si pu`
o apporre un carattere ^ al corrispondente parametro. Si
tenga presente che se si modificano i parametri sparse_super, resize_inode o filetype sar`a
poi necessario eseguire una riparazione del filesystem con e2fsck.
Infine si pu`
o usare lopzione -L per impostare una etichetta sul filesystem, che viene a costituire il nome del volume. Analogamente si pu`o modificare il valore dellUUID associato al
filesystem con lopzione -U, cui deve essere passato come parametro il nuovo valore. Diventa cos`
possibile, come visto in sez. 5.1.3, fare riferimento al filesystem in /etc/fstab usando letichetta
o lUUID al posto del file di dispositivo. Le altre opzioni principali sono illustrate in tab. 5.8,
al solito si ottenere lelenco completo ed una descrizione dettagliata dalla pagina di manuale del
comando.

5.1.5

Controllo e riparazione di un filesystem

Benche il sistema sia molto stabile e problemi di questo tipo siano piuttosto rari, vengono forniti
anche una serie di comandi diagnostici per il controllo e la riparazione di un filesystem che possa
essersi danneggiato. In questa sezione tratteremo in maggior dettaglio quelli disponibili per ext2
ed ext3, anche se, in particolare per la riparazione, esistono programmi analoghi per qualunque
filesystem.
Come gi`a accennato in sez. 5.1.4 il comando dumpe2fs pu`o essere usato per recuperare
una serie di informazioni riguardo ad un filesystem ext2 /ext3 /ext4. Se invocato senza opzioni il
comando stampa una lunga lista di informazioni ricavate dal contenuto del superblock e dei group
block, come esempio riportiamo solo la prima parte delloutput del comando, quella relativa alle
sole informazioni del superblock, ottenibili specificando lopzione -h:
anarres:~# dumpe2fs -h /dev/hda4
dumpe2fs 1.35-WIP (07-Dec-2003)
Filesystem volume name:
<none>
Last mounted on:
<not available>
Filesystem UUID:
d0cb4773-dbf8-4898-94e8-bb2acc41df0d
Filesystem magic number: 0xEF53
Filesystem revision #:
1 (dynamic)
Filesystem features:
has_journal filetype needs_recovery sparse_super
Default mount options:
(none)
Filesystem state:
clean
Errors behavior:
Continue
Filesystem OS type:
Linux
Inode count:
4169760
Block count:
8324194
Reserved block count:
416209
Free blocks:
5365536
Free inodes:
3935324
First block:
0
Block size:
4096
Fragment size:
4096
Blocks per group:
32768
Fragments per group:
32768
Inodes per group:
16352
Inode blocks per group:
511
Last mount time:
Fri Jan 30 20:59:45 2004
Last write time:
Fri Jan 30 20:59:45 2004
Mount count:
16
Maximum mount count:
22
Last checked:
Sun Dec 21 14:45:22 2003

5.1. LA GESTIONE DEI DISCHI E DEI FILESYSTEM


Check interval:
Next check after:
Reserved blocks uid:
Reserved blocks gid:
First inode:
Inode size:
Journal inode:
First orphan inode:
Journal backup:

271

15552000 (6 months)
Fri Jun 18 15:45:22 2004
0 (user root)
0 (group root)
11
128
13
2421098
inode blocks

Le altre opzioni principali del comando sono -b, che restituisce lelenco dei blocchi marchiati
come danneggiati in un filesystem, -ob che permette di specificare il blocco (indicato per numero)
da usare come superblock al posto di quello standard (in caso di corruzione di questultimo), -oB
per indicare la dimensione dei blocchi (anche questa `e una informazione necessaria solo in caso di
corruzione del filesystem). Infine -i permette di leggere le informazioni invece che dal filesystem
da una immagine creata con il comando e2image. Per un elenco completo e relative spiegazioni
si faccia al solito riferimento alla pagina di manuale.
Una delle misure di precauzione che si possono prendere per tentare un recupero in caso
di corruzione di un filesystem ext2 `e quella di crearne una immagine con il comando e2image.
Questo comando permette di salvare su un file i dati critici del filesystem in modo da poterli
riutilizzare con programmi di riparazione come e2fsck o debugfs. Il comando prende come
argomenti il dispositivo su cui si trova il filesystem ed il nome del file su cui salvare limmagine.
Lunica opzione `e -r che crea una immagine binaria che pu`o essere usata dai vari programmi di
controllo come se fosse lintero filesystem.69
In generale il funzionamento dei filesystem in Linux `e estremamente stabile, ed una volta
creati `e praticamente impossibile70 danneggiarli nel corso delle normali operazioni. Se per`o si ha
un black-out improvviso, o qualcuno inciampa nel cavo di alimentazione del server, `e normale che
il filesystem, dal momento in cui laggiornamento dei dati su disco `e stato interrotto brutalmente,
si possa trovare in uno stato incoerente.
In questo caso si pu`
o avere un danneggiamento della struttura del filesystem, che deve essere
riparato. In genere ogni filesystem prevede lesistenza di un flag su disco, attivato quando viene
montato, che indica che `e in uso, e che viene azzerato solo quando il filesystem viene smontato,
nel qual caso si `e certi che tutte le operazioni sospese sono state completate e lo stato `e coerente.
Se c`e stata uninterruzione della corrente, od un qualunque altro problema che ha comportato un
riavvio non pulito, questo flag rester`a attivo ed il sistema potr`a rilevare, al successivo tentativo
di montaggio, che qualcosa `e andato storto.
Quello che pu`
o succedere in questi casi dipende dal filesystem. Coi filesystem tradizionali
mount rileva lerrore e non monta il filesystem o lo monta in sola lettura (a seconda delle opzioni
scelte). A questo punto occorre usare lopportuno programma di controllo per verificare lo
stato del filesystem ed eventualmente riparare gli errori. Di norma, in caso di rilevamento di un
errore durante la procedura di avvio del sistema, questo viene lanciato automaticamente secondo
quanto specificato in /etc/fstab (vedi sez. 5.1.3).
La procedura di controllo e riparazione pu`o essere molto lunga e complessa, specie per filesystem di grandi dimensioni, in quanto prevede una serie di verifiche dettagliate per identificare
informazioni incoerenti e parziali, che comportano varie scansioni del contenuto del filesystem
stesso. Questo pu`
o significare dei tempi che possono diventare ore o addirittura giorni per i
dischi pi`
u grandi. Per ovviare a questo inconveniente alcuni filesystem pi`
u avanzati supportano
il cosiddetto journaling, un sistema che permette di riportare il filesystem in uno stato coerente
con grande velocit`
a.
69
per far questo viene creato uno sparse file delle stesse dimensioni del filesystem; uno sparse file `e un file in
cui non sono state scritte le parti vuote, pertanto anche se la sua dimensione pu`
o essere enorme, pari appunto ad
un intero filesystem, in realt`
a viene occupato su disco solo lo spazio relativo alle parti non vuote.
70
a meno di non usare kernel sperimentali; in questo caso si stanno cercando rogne, ed `e anche possibile trovarle.

272

CAPITOLO 5. AMMINISTRAZIONE STRAORDINARIA DEL SISTEMA

Il concetto fondamentale del journaling `e che le operazioni sul filesystem vengono prima
registrate su un giornale,71 e poi riportate sul filesystem. Cos` se si ha una interruzione improvvisa si hanno due casi: se linterruzione `e avvenuta durante laggiornamento del filesystem,
il giornale sar`a intatto e lo si potr`
a utilizzare per completare laggiornamento interrotto. Se
invece linterruzione `e avvenuta durante la scrittura nel giornale sar`a questo ad essere scartato;
si perderanno cos` le ultime modifiche, ma il filesystem rester`a in uno stato coerente.
In questo modo quando si ha un filesystem journaled si pu`o evitare il lungo procedimento di
riparazione. In realt`
a non `e che il procedimento non avvenga, solo che grazie alla presenza del
giornale questo viene eseguito con grande rapidit`a, non dovendo effettuare il controllo completo
del filesystem. In generale per`
o, anche se si usa un filesystem journaled, `e opportuno mantenere
un controllo periodico sul filesystem, in quanto errori sul disco, cavi difettosi o bug del kernel
potrebbero comunque aver corrotto le informazioni.
Il programma generico per il controllo di un filesystem `e fsck (da File System ChecK ) che,
come mkfs, non `e altro che un front-end per i singoli programmi specifici di ciascun tipo di
filesystem. Questi vengono attivati attraverso lopzione -t seguita dal nome del filesystem. Il
programma prende come argomenti un elenco di filesystem da controllare specificati per dispositivo, o anche per mount point, se sono citati in /etc/fstab. Se si indica pi`
u di un filesystem
la lista dei relativi tipi, separata da virgole, deve essere specificata come parametro per -t.
Quando viene invocato con lopzione -A (di solito questo viene fatto nella procedura di avvio)
il comando esegue una scansione di /etc/fstab e cerca di controllare ogni filesystem ivi elencato,
a meno che il sesto campo del file non sia impostato a zero (si ricordi quanto detto in sez. 5.1.3).
Il comando prima prover`
a ad eseguire il controllo per il filesystem radice e passer`a poi a tutti
gli altri in ordine di valore crescente del suddetto campo.
Come per mkfs le opzioni disponibili dipendono dallo specifico filesystem: di solito sono definite due opzioni generiche, -a che cerca di eseguire le riparazioni in modo automatico, senza
chiedere lintervento dellamministratore, e -r che invece esegue le riparazioni in modalit`a interattiva. Per le altre opzioni si pu`
o fare riferimento alle pagine di manuale dei vari programmi
dedicati di ciascun filesystem.
Nel caso di Linux tutti i filesystem pi`
u recenti (ReiserFS, JFS e XFS) supportano nativamente
il journaling; ed anche il tradizionale ext2 ha ottenuto questa funzionalit`a con la successiva
versione ext3. Luso di un giornale ha per`o un impatto sulle prestazioni del filesystem, e non `e
detto che sia sempre utilizzato. Questo comporta che la diffusione di ext2 resta relativamente
ampia, e continua ad avere senso per i filesystem che possono essere utilizzati in sola lettura
(come la radice e /usr).
Inoltre partendo da un filesystem ext2 la conversione ad ext3 `e molto semplice, basta aggiungere il giornale al filesystem con tune2fs -j e rimontarlo come ext3. Per questo motivo si
possono sostanzialmente considerare ext2 ed ext3 come il filesystem pi`
u diffuso; ci concentreremo
pertanto sulla versione dei programmi di riparazione e controllo specifici di questo filesystem.
Il programma di controllo e riparazione del filesystem ext2 `e e2fsck, che prende come argomento il dispositivo da controllare. Il comando supporta le opzioni generiche -a e -r illustrate
in precedenza, che sono state mantenute solo per compatibilit`a, in realt`a -a `e deprecata in
favore della pi`
u recente -p mentre -r non fa niente dato che il comando viene sempre esegui` comunque possibile usare lopzione -y per far rispondere yes
to in modalit`a interattiva. E
automaticamente a tutte le domande in modo da poter eseguire il comando in modalit`a non
interattiva (ad esempio da uno script), mentre con -n si fa la stessa cosa aprendo il filesystem
in sola lettura,72 e dando una risposta di no a tutte le domande.
71

un file apposito a questo dedicato, in genere invisibile e mantenuto direttamente dal kernel.
eccetto il caso in cui si siano specificate le opzioni -c, -l o -L nel qual caso il filesystem viene aperto in
scrittura per aggiornare la lista dei settori difettosi.
72

5.1. LA GESTIONE DEI DISCHI E DEI FILESYSTEM

273

In caso di filesystem pesantemente corrotto, o di cui si `e cancellata la parte iniziale,73 si


possono poi specificare il superblock da utilizzare con -b e la dimensione di un blocco con -B. Se
si `e usato un giornale posto su un altro dispositivo questo deve essere specificato con lopzione
-j. Quando si `e usata lopzione -b e il filesystem non `e stato aperto in sola lettura e2fsck si
cura anche di ripristinare anche il superblock al completamento del controllo.
Usando lopzione -c si pu`
o richiedere anche la scansione per il rilevamento di settori difettosi,
e specificandola due volte viene usato il metodo approfondito di scansione con scrittura e rilettura. Con lopzione -l si pu`
o specificare un file con una lista da aggiungere a quella dei blocchi
difettosi, mentre con -L il file indica la nuova lista di blocchi difettosi. Le altre opzioni principali
del comando sono riportate in tab. 5.9, per un elenco completo e la relativa documentazione si
pu`o al solito fare riferimento alla pagina di manuale del comando.
Opzione
-b
-B
-c
-f
-j
-l
-L
-n
-t
-y

Significato
specifica un superblocco alternativo.
specifica le dimensioni di un blocco.
esegue il controllo del dispositivo per eventuali settori difettosi.
forza il controllo del filesystem.
specifica il dispositivo di un giornale esterno.
specifica il file con una lista di blocchi difettosi da aggiungere a quelli
gi`
a presenti.
specifica il file con la nuova lista dei blocchi difettosi (sovrascrivendo
quella presente).
esegue il controllo rispondendo automaticamente no a tutte le
domande.
stampa delle statistiche di esecuzione.
esegue il controllo rispondendo automaticamente yes a tutte le
domande.
Tabella 5.9: Principali opzioni per il comando e2fsck.

In genere non c`e necessit`


a di eseguire direttamente e2fsck, in quanto di norma questo viene
eseguito dagli script di avvio. Nel caso lo si voglia eseguire comunque, oltre a specificare lopzione
-f occorre assicurarsi che il filesystem relativo non sia montato, o sia montato in sola lettura.
Di norma lesecuzione automatica (quella ottenuta con -a o -p) prevede che il filesystem sia
riparato senza necessit`
a di intervento da parte dellutente. Ci sono casi comunque in cui questo
non `e possibile, nel qual caso il programma si ferma.
Quando questo avviene durante la procedura di avvio di norma il sistema viene portato in
single user mode (si veda sez. 5.3.5) e viene richiesto di rieseguire il programma manualmente.
In tal caso di norma il filesystem non `e montato, a meno che il filesystem danneggiato non sia
la radice, nel qual caso esso deve essere comunque montato,74 ma in sola lettura.
Qualora anche la riparazione con e2fsck eseguito manualmente fallisca ci si trova di fronte
ad un filesystem pesantemente danneggiato. In questo caso lultima risorsa `e quella di utilizzare
debugfs per provare ad eseguire manualmente la riparazione. Il comando permette di aprire
anche un filesystem danneggiato, e di eseguire su di esso delle operazioni. Non `e detto che si riesca
a riparare completamente il filesystem,75 ma si possono tentare delle operazioni di ripulitura che
potrebbero portare lo stesso in uno stato riparabile da e2fsck.
Il comando prende come argomento il dispositivo contenente il filesystem da esaminare;
questo viene sempre aperto in sola lettura a meno che non si specifichi lopzione -w. In caso
73

cosa che pu`


o capitare se ad esempio si `e sbagliato il dispositivo di uscita di un dd.
chiaramente se il filesystem `e danneggiato cos` gravemente da non poter neanche essere montato si avr`
a un
kernel panic.
75
per questo occorre una conoscenza dettagliata della struttura di un filesystem ext2, in effetti il programma,
come dice il nome, non `e uno strumento per il controllo quanto per il debugging, ad uso dei cosiddetti filesystem
guru.
74

274

CAPITOLO 5. AMMINISTRAZIONE STRAORDINARIA DEL SISTEMA


Opzione
-b
-s
-w
-f
-c

Significato
specifica la dimensione dei blocchi.
specifica un superblocco alternativo.
apre il filesystem in lettura/scrittura.
legge i comandi dal file passato come parametro.
apre il filesystem in modalit`
a catastrofe, in cui non vengono letti
neanche i dati generali dello stesso.
Tabella 5.10: Principali opzioni per il comando debugfs.

di filesystem pesantemente danneggiato lopzione -b permette di specificare una dimensione dei


blocchi, lopzione -s permette di specificare il superblock. Le opzioni principali sono riportate in
tab. 5.10, per lelenco completo al solito si consulti la pagina di manuale.
Comando
ls
cd
lsdel
undel
cat
rm
rmdir
cat
ln
unlink
dump
stat

Significato
mostra la lista dei file (con i dati degli inode).
cambia directory di lavoro.
mostra la lista dei file cancellati.
ripristina un file cancellato.
mostra il contenuto di un file.
cancella un file.
cancella una directory.
stampa il contenuto di un file.
crea un hard link ma non aggiorna il numero di collegamenti.
rimuove il collegamento ad un inode ma non aggiorna il numero di
collegamenti.
salva i dati del file/inode su un altro file.
stampa i dati di un inode.
Tabella 5.11: Principali comandi di debugfs.

Una volta aperto un filesystem con debugfs si viene portati su una riga di comando da cui
diventa possibile operare a basso livello con i dati del filesystem, compiendo anche operazioni
impossibili con i normali comandi dei file, come cancellare o creare un hard link senza aggiornare
il numero di riferimenti ad un inode, recuperare un file cancellato ecc. Molti dei comandi del
programma riprendono i nomi degli ordinari comandi di shell, eseguendo compiti analoghi, ma
operano direttamente sui dati del filesystem e possono usare come argomenti sia dei normali
nomi di file che dei numeri di inode, questi ultimi per`o devono essere indicati esplicitamente fra
parentesi angolari (<>). Si `e riportato un breve riassunto dei comandi principali in tab. 5.11,
per i dettagli si consulti come sempre la pagina di manuale.
Infine si tenga presente che per Linux non esistono programmi di uso comune per la deframmentazione del disco.76 Questa infatti `e un problema solo per quei filesystem la cui architettura
`e talmente inadeguata da renderlo tale. In generale un qualunque filesystem unix-like `e in grado di gestire la allocazione dello spazio disco in maniera da evitare il sorgere del problema fin
dallinizio.
Benche si siano presi in esame in dettaglio, per la loro maggiore diffusione, i programmi di
gestione relativi ai filesystem ext2 /ext3 /ext4, si deve avere presente che ne esistono di analoghi
anche gli altri tipi di filesystem, e di seguito tratteremo brevemente quelli relativi agli altri due
tipi di filesystem pi`
u diffusi, ReiserFS e XFS.
Nel caso di ReiserFS il programma che consente di eseguire la riparazione di un filesystem
(quello invocato con fsck.reiserfs) `e reiserfsck. Il programma deve essere usato su un filesystem smontato, anche se alcune opzioni, come --check, possono essere usate su un filesystem
montato in sola lettura. Il comando richiede come argomento obbligatorio il file di dispositivo
76

in effetti ci sono alcuni programmi per eseguire questa operazione, ma normalmente non vengono usati, proprio
perche assai poco utili.

5.1. LA GESTIONE DEI DISCHI E DEI FILESYSTEM

275

contenente il filesystem da controllare. Le opzioni principali sono riportate in tab. 5.12, per i
dettagli si consulti al solito la pagina di manuale.
Opzione
--check
--fix-fixable
--rebuild-tree

-B
-a, -p

-f

Significato
esegue un controllo di consistenza e riporta i risultati, senza eseguire
nessuna riparazione.
esegue le riparazioni relative a problemi minori effettuabili senza dover
effettuare una ricostruzione completa dellintero filesystem.
ricostruisce lintero filesystem dai dati presenti sul disco, da usare solo in
caso di danni gravi riportati da --check e previo backup della partizione
contenente il filesystem in quanto potenzialmente distruttiva.
indica il file contenente la lista dei blocchi difettosi.
opzioni usate nel controllo automatico allavvio, causano un controllo
dello stato del filesystem e la successiva esecuzione con lopzione --fixfixable se vengono riportati danni minori.
forza lesecuzione del comando anche se il filesystem risulta a posto.
Tabella 5.12: Principali opzioni di reiserfsck.

Analogo a tune2fs `e invece il comando reiserfstune, che consente di modificare i parametri di un filesystem ReiserFS; ad esempio con lopzione -l si pu`o impostare una etichetta
sul filesystem mentre con -u se ne pu`o modificare lUUID. Il comando richiede che si specifichi
sempre come argomento il dispositivo su cui `e presente il filesystem; le altre opzioni principali
sono riportate in tab. 5.13, e per i dettagli si consulti come sempre la pagina di manuale.
Opzione
-B file
-l lab
-u uuid
-c days
-m N

Significato
imposta lista dei blocchi difettosi leggendola dal file passato come
parametro.
imposta letichetta passata come parametro.
imposta lUUID passato come parametro.
imposta il numero massimo di giorni che possono passare dallultimo
controllo del filesystem.
imposta il numero massimo di montaggi che possono essere effettuati
dallultimo controllo del filesystem.
Tabella 5.13: Principali opzioni di reiserfstune.

Nel caso di XFS il comportamento dei programmi di gestione, a causa delle diverse modalit`
a
di funzionamento di questo filesystem, `e piuttosto diverso. Ad esempio nel caso di XFS il
comando fsck.xfs pur esistendo non fa assolutamente niente ed ha sempre successo, in quanto
il controllo di consistenza del filesystem non viene effettuato allavvio, ma direttamente quando
il filesystem viene montato, ed eventuali riparazioni relative a corruzioni minori vengono eseguite
automaticamente in quelloccasione senza dover utilizzare un comando specifico.
Opzione
-v
-f
-s

Significato
modalit`
a prolissa, produce una quantit`
a di informazioni eccessiva ed `e
intesa ad uso di debug.
da usare quando il filesystem `e contenuto in un file e non in un
dispositivo.
riporta solo gli errori gravi, da usare per ridurre la quantit`
a di informazioni in caso di problemi molto rilevanti per evitare di perdersi nei
dettagli.
Tabella 5.14: Principali opzioni comandi di xfs_check.

Qualora si voglia effettuare una verifica manuale `e comunque possibile eseguire direttamente il

276

CAPITOLO 5. AMMINISTRAZIONE STRAORDINARIA DEL SISTEMA

comando xfs_check, che richiede per`


o che il filesystem sia smontato o montato in sola lettura.77
Il comando prende come argomento il dispositivo contenente il filesystem e a meno di eseguirlo
in modalit`a prolissa (con lopzione -v, non scrive nulla se non in caso di problemi. Le altre
opzioni principali sono elencate in tab. 5.14
Opzione
-v
-f
-d

Significato
modalit`
a prolissa, produce una quantit`
a di informazioni eccessiva ed `e
intesa ad uso di debug.
da usare quando il filesystem `e contenuto in un file e non in un
dispositivo.
esegue la riparazione in modalit`
a definita pericolosa a filesystem montato in sola lettura, necessaria quando il filesystem `e quello della
radice.
Tabella 5.15: Principali opzioni di xfs_repair.

Qualora invece si voglia effettuare una riparazione di un filesystem XFS danneggiato il comando da usare `e xfs_repair; questo al solito prende come argomento obbligatorio il dispositivo
o il file su cui si trova il suddetto filesystem che deve essere smontato, pena ulteriori danni. Si
sono riportate le principali opzioni in tab. 5.15, per i dettagli si consulti al solito la pagina di
manuale.
Opzione
-f
-l
-L
-u
-U

Significato
da usare quando il filesystem `e contenuto in un file e non in un
dispositivo.
stampa letichetta associata al filesystem.
imposta letichetta associata al filesystem.
stampa lUUID associato al filesystem.
imposta lUUID associato al filesystem.
Tabella 5.16: Principali opzioni di xfs_admin.

Infine come analogo di dumpe2fs, si pu`o usare il comando xfs_info78 che ne stampa le
informazioni, mentre come analogo di tune2fs, per impostare un etichetta o un UUID sul
filesystem, si pu`
o usare xfs_admin. Entrambi i comandi richiedono che si indichi come argomento
il dispositivo su cui `e mantenuto il filesystem. In tab. 5.16 si sono riportate le principali opzioni
di xfs_admin, per i dettagli e lelenco completo si rimanda alla pagina di manuale.

5.1.6

Il sistema dellautomounter

Abbiamo visto in sez. 5.1.3 come sia possibile impostare grazie a /etc/fstab il montaggio
allavvio di tutti i filesystem necessari, e in quella occasione abbiamo anche accennato anche
come la gran parte dei sistemi desktop sia in grado di eseguire automaticamente il montaggio di
eventuali dispositivi estraibili quando il loro uso viene rilevato dal kernel.79
Esiste per`o unaltra esigenza relativa al montaggio automatico dei filesystem, che non attiene
a dispositivi estraibili o temporanei, ma piuttosto a filesystem sempre disponibili, ma utilizzati solo sporadicamente, come potrebbero essere filesystem di rete per accedere a informazioni
condivise. In questo caso pu`
o essere utile poter avere un montaggio a richiesta, soltanto in
a questa esigenza che risponde il sistema dellautomounter il cui
occasione del loro utilizzo. E
77

il comando pu`
o essere usato comunque, ma con un filesystem in uso potrebbero essere riportati problemi
inesistenti.
78
in realt`
a questo `e un alias per una opzione del comando di ridimensionamento (xfs_growfs -n), che vedremo
in sez. 6.3.2.
79
funzionalit`
a che oggi viene gestita da appositi programmi che si appoggiano ad udev, che tratteremo in
sez. 5.4.5, e che non ha nulla a che fare con quanto prenderemo in esame qui.

5.1. LA GESTIONE DEI DISCHI E DEI FILESYSTEM

277

scopo `e proprio quello di montare automaticamente un filesystem in reazione allaccesso alla


directory in cui questo deve comparire.
Il sistema consente in questo modo di rimandare al momento del loro uso effettivo il montaggio di filesystem di rete senza la necessit`a di dover eseguire un comando in maniera esplicita;
questo consente anche di evitare intoppi nella procedura di avvio, quando in caso di malfunzionamento della rete detti filesystem non potrebbero venire montati. Infine essendo stata prevista
la possibilit`
a di mantenere le informazioni relative ai filesystem da montare automaticamente su
servizi di rete centralizzati,80 si pu`
o semplificare la gestione in caso si debbano configurare allo
stesso modo molte macchine.
Il supporto per lautomounter, denominato autofs, viene fornito direttamente da parte dal
kernel81 a partire dalla versione 2.2,82 con lausilio di alcuni programmi in user-space.83 Lintero
sistema `e controllato da un file di configurazione principale, /etc/auto.master, che contiene
lelenco dei mount-point su cui verranno montati automaticamente i filesystem.
Il formato del file, con la solita convenzione di ignorare righe vuote e tutto quello che segue il
carattere # prevede che ogni riga indichi un mount-point a cui viene associata una mappa che
descrive quali filesystem vi devono essere montati e delle eventuali opzioni; il tutto deve essere
specificato da tre campi separati da spazi.
Fino alla versione 4 di autofs erano supportate soltanto le cosiddette mappe indirette,84 ,
in cui il campo del mount-point deve indicare una directory sul filesystem (ad esempio /misc)
sotto compariranno tutti i filesystem elencati nella mappa corrispondente. In sostanza con una
mappa indiretta laccesso ad una sottodirectory (ad esempio sotto /misc/disk) provoca una
ricerca nella mappa associata con la chiave espressa dal nome della sottodirectory (nel caso
dellesempio disk) che se trovata provoca lesecuzione della rispettiva operazione di montaggio.
Con la versione 5 di autofs `e divenuto disponibile anche il supporto per le cosiddette mappe
dirette, in questo caso il mount-point viene indicato come /-,85 mentre le chiavi usate nella
mappa diretta devono corrispondere ai pathname assoluti dove si vuole che i rispettivi filesystem
vengano montati. Si tenga presente che in entrambi i casi se le directory indicate non esistono
queste verranno create automaticamente al montaggio del filesystem che devono ospitare, e
rimosse al suo smontaggio.
Il secondo campo di /etc/auto.master serve ad indicare la mappa associata al rispettivo
mount-point. Nella sua forma pi`
u semplice questa `e espressa semplicemente come il pathname del
file che la contiene. In realt`
a come accennato le mappe possono essere mantenute anche tramite
servizi di rete, per cui la sintassi estesa di questo secondo campo `e nella forma tipo:mappa,86
dove tipo indica di che mappa si tratta e nome deve essere espresso in forma adeguata al relativo
tipo, ma non tratteremo queste forme pi`
u complesse, per le quali si rimanda alla lettura della
pagina di manuale con accessibile man auto.master.
Il terzo campo di auto.master consente di specificare delle opzioni facoltative. Qualora
queste siano indicate senza un trattino iniziale verranno semplicemente passate come opzioni
per lesecuzione del comando mount per i filesystem della mappa, il trattino iniziale consente
invece di passare opzioni relative al funzionamento della mappa. Anche in questo caso per i
dettagli si consulti la pagina di manuale.
80

sono supportati NIS e LDAP, ma trattare il loro uso va al di l`


a degli obiettivi di queste dispense.
esiste anche un supporto in user-space, fornito da un apposito demone (amd, o auto mount daemon), ripreso
da quello usato su Solaris, che per`
o non prenderemo in considerazione.
82
il relativo supporto deve comunque essere stato compilato allinterno del kernel, vedi sez. 5.2.3.
83
esistono due versioni, la 4 e la 5, su Debian vengono fornite rispettivamente dai pacchetti autofs e autofs5.
84
il supporto per le mappe dirette era primitivo, non affidabile e disabilitato di default.
85
che non corrisponde alla directory - sotto la radice.
86
ad essere pignoli la sintassi completa `e tipo,formato:mappa, ma in tutti i casi pratici il default del formato
`e sempre quello corrispondente al tipo di mappa, quindi non viene mai indicato.
81

278

CAPITOLO 5. AMMINISTRAZIONE STRAORDINARIA DEL SISTEMA

Si tenga presente inoltre che esiste, a partire dalla versione 5, una speciale mappa interna
(che non richiede riferimenti ad altre risorse) utilizzabile specificando -host nel relativo campo.
Questa mappa consente montare automaticamente un qualunque filesystem NFS disponibile
sulla propria rete; in tal caso la sottodirectory del mount-point verr`a interpretata come un
nome di una macchina sulla rete, ed al di sotto di detta sottodirectory verranno montati tutti i
filesystem esportati con NFS da quella macchina. In questo modo non `e pi`
u necessario mantenere
una mappa con lelenco degli stessi.
Un possibile esempio del contenuto di /etc/auto.master `e il seguente, dove si `e richiesto
il montaggio automatico sotto /misc dei filesystem elencati in /etc/auto.misc e in /net dei
filesystem NFS disponibili nella propria rete:
/misc
/net

/etc/auto.misc
-host

Lavvio del sistema dellautomounter `e effettuato dallo script /etc/init.d/autofs che esamina il contenuto di /etc/auto.master e per ciascuna voce esegue87 il programma automount
che `e quello che si incarica, allaccesso alle directory indicate in /etc/auto.master, di eseguire
la scansione delle relative mappe e di effettuare il montaggio automatico. Ad ogni modifica di
/etc/auto.master occorre eseguire /etc/init.d/autofs reload per far rieseguire automount
sulle voci presenti,88 mentre una modifica di un file delle mappe (ad /etc/auto.misc nel caso
dellesempio) viene vista immediatamente al successivo utilizzo dello stesso. Inoltre `e possibile
modificare alcune le impostazioni generali del sistema con il file /etc/default/autofs, in cui
queste sono espresse in forma di assegnazione di variabili di shell. Si sono riportate in tab. 5.17
le pi`
u rilevanti, lelenco completo si trova al solito nella pagina di manuale di auto.master.
Variabile
TIMEOUT
APPEND_OPTIONS

LOGGING

Significato
tempo in secondi dopo il quale un filesystem inutilizzato viene smontato
automaticamente.
determina se le opzioni di montaggio inserite nelle mappe vengono aggiunte (default yes) o se rimpiazzano quelle eventualmente specificate
in auto.master.
indica il livello di log.

Tabella 5.17: Variabili di configurazione per i default di autofs.

Il formato di un file di una mappa autofs prevede di tre campi separati da spazi, di cui il
secondo `e opzionale; il primo campo `e la stringa che costituisce la chiave di ricerca sulla mappa,
e che come detto corrisponde alla sottodirectory della voce di auto.master corrispondente alla
mappa su cui verr`
a montato il filesystem indicato nellultimo campo.
Il secondo campo, che se presente deve iniziare con il carattere -, indica le opzioni, espressa
da una lista separata da virgole, da usare nel montaggio del filesystem,89 con leccezione dellopzione speciale -fstype=tipo che serve invece ad esprimere il tipo di filesystem;90 se non si
specifica -fstype il default `e usare nfs, e se non si devono specificare opzioni il secondo campo
si pu`o omettere.
Lultimo campo indica invece il filesystem da montare, nel caso di NFS questo deve essere
espresso nella forma hostname:pathname nello stesso formato che si userebbe per il primo campo
di /etc/fstab. Qualora si voglia invece montare il contenuto di un dispositivo locale lo si dovr`a
indicare tramite il corrispondente file di dispositivo preceduto dal carattere :, qualora di tratti
87

come singole istanze del programma nella versione 4, come thread aggiuntivo di una unica istanza nella versione

5.
88

le istanze relative a voci rimosse verranno eliminate e ne verranno fatte partire di nuove per le voci aggiunte.
devono corrispondere cio`e ai parametri dellopzione -o che si userebbero per montare il filesystem con il
comando mount.
90
cio`e tipo deve corrispondere al valore che si darebbe allopzione -t del comando mount.
89

5.1. LA GESTIONE DEI DISCHI E DEI FILESYSTEM

279

di una condivisione di rete con protocollo SMB invece la si dovr`a indicare, sempre preceduta dal
carattere :, con la convenzione per gli indirizzi usata dal comando smbclient (per la quale
si rimanda a sez. 8.4.3). Sono inoltre supportate alcune funzionalit`a avanzate, come luso di
montaggi multipli, e la sostituzione di alcune variabili per generare mappe dinamiche, per la
trattazione delle quali si rimanda alla pagina di manuale del formato delle mappe, accessibile
con man 5 autofs.

5.1.7

La gestione della swap e dei CDROM

Tratteremo in questa ultima sezione due argomenti attinenti solo in modo parziale alla gestione
di dischi e filesystem. Il primo di questi `e quello relativo alla gestione dello spazio disco dedicato
alla swap ed al funzionamento di questultima. Questa costituisce un complemento alla gestione
della memoria virtuale, il meccanismo con cui il kernel controlla lallocazione della memoria
fisica ai vari processi.
Come accennato in sez. 1.1 e poi approfondito in sez. 1.3.2 il kernel gestisce, con laiuto della
MMU (Memory Management Unit) del processore, una rimappatura dello spazio degli indirizzi
dei processi sulla memoria fisica effettivamente disponibile. In questo modo ciascun processo
pu`o usare un suo spazio di indirizzi virtuale (usando un qualunque valore fa quelli possibili), e
tramite la MMU acceder`
a ad un indirizzo reale della memoria effettivamente disponibile.
Una delle caratteristiche del meccanismo `e che in questo modo ciascun processo mantiene un
suo spazio di indirizzi separato; se un processo usa un indirizzo che non corrisponde a nessuna
pagina di memoria si avr`
a quello che si chiama un segmentation fault ed il sistema si accorger`
a
immediatamente dellerrore inviando al processo un segnale di SIGSEGV. Ma la potenza del
meccanismo della memoria virtuale consiste nel fatto che esso consente di utilizzare anche dello
spazio disco come supporto aggiuntivo rispetto alla memoria fisica, quando luso di questa diventa
eccessivo.
` questo lo scopo della cosiddetta area di swap, una sezione di disco (in genere una partizione,
E
ma si pu`o usare anche un file) su cui il kernel pu`o salvare le pagine di memoria meno utilizzate
di un processo,91 in modo che altri possano utilizzare la memoria fisica che cos` viene liberata.
Chiaramente quando si andr`
a a rieseguire il processo le cui pagine di memoria sono state salvate
sullarea di swap e questo cercher`
a di accedere a quelle, si avr`a quello che si chiama un page fault 92
a questo punto il sistema della memoria virtuale provveder`a a recuperare la pagina dallarea di
swap e a rimetterla in memoria, cos` che il processo possa proseguire la sua esecuzione come se
niente fosse.93
Perche il kernel possa usare unarea di swap questa deve essere opportunamente inizializzata,
come si fa per un filesystem;94 a questo provvede il comando mkswap che prende come argomento
il file da usare come area di swap. In genere si usa il comando specificando come argomento un
file di dispositivo indicante una partizione appositamente riservata (vedi sez. 5.1.2), in questo
caso infatti laccesso al disco `e diretto (`e quindi pi`
u veloce) rispetto al caso, comunque possibile,
95
in cui si usa un file normale.
91

ma anche i dati mantenuti nei dischi in RAM generati con tmpfs.


quello che succede `e che quando la MMU si accorge che la pagina richiesta non `e mappata su della memoria
fisica invia un segnale al processore, cos` che questo possa eseguire la opportuna sezione del kernel, questultimo
si occuper`
a o di recuperare la pagina dalla swap (se lindirizzo era giusto) o di inviare un segnale di SIGSEGV (se
laccesso era sbagliato).
93
in realt`
a ovviamente tutto questo richiede tempi che sono ordini di grandezza superiori rispetto allaccesso
diretto alla RAM, per cui il niente `e solo teorico, in pratica il programma sar`
a infinitamente pi`
u lento.
94
si tenga presente comunque che in questo caso non si ha a che fare con un filesystem, dato che larea deve
essere solo utilizzata per copiarci pagine, per cui caso non sono affatto necessarie tutte le infrastrutture mostrate
in sez. 1.2.2.
95
per il quale si dovrebbe prima passare attraverso il relativo filesystem.
92

280

CAPITOLO 5. AMMINISTRAZIONE STRAORDINARIA DEL SISTEMA

Dato che le prestazioni del sistema della memoria virtuale dipendono direttamente, in caso
di utilizzo dellarea di swap, dai tempi di accesso a questultima e dalla velocit`a di trasferimento
` per
dei dati, `e in genere una pessima idea usare un disco vecchio e lento per questo scopo. E
questo motivo inoltre che a volte si suggerisce di usare per larea di swap lultima partizione
disponibile, considerata come quella che contiene i settori pi`
u esterni del disco, dove la velocit`a
di trasferimento `e maggiore.
Il comando prevede (per compatibilit`a con le vecchie versioni) un secondo argomento che
specifica la dimensione dellarea di swap; se non lo si specifica viene automaticamente utilizzato
tutto lo spazio disponibile. Come per mkfs lopzione -c richiede un controllo della partizione
per la presenza di settori difettosi. Lopzione -p permette di specificare come parametro la dimensione delle pagine di memoria (in genere 4096 byte, ma dipende dallarchitettura hardware),
lelenco delle opzioni `e riportato in tab. 5.18.
Opzione
-c
-f
-p
-v

Significato
esegue un controllo per la presenza di settori difettosi.
forza lesecuzione del comando anche se si sono dati argomenti sbagliati
(come un dimensione dellarea maggiore di quella della partizione).
specifica, con il valore passato come parametro, la dimensione delle
pagine di memoria.
specifica la versione della formattazione dellarea di swap, con -v0 usa
il vecchio stile (deprecato), con il -v1 usa il nuovo.
Tabella 5.18: Opzioni per il comando mkswap.

Si tenga presente che per i kernel precedenti il 2.4.10 erano possibili fino ad un massimo di
8 aree di swap, a partire da esso sono state portate a 32; un elenco di quelle attive `e visibile in
/proc/swaps. La dimensione massima dellarea di swap dipende sia dalla versione utilizzata che
dallarchitettura hardware. Con la vecchia versione il massimo dipendeva solo dalla dimensione
delle pagine ed era di 128Mb con le pagine di 4096 byte della architettura standard dei PC
portati poi a 2Gb; oggi `e di 64Gb.
Una volta creata unarea di swap questa non verr`a utilizzata dal kernel fintanto che non la
si attiva con il comando swapon; questo prende come argomento il file da usare coma area di
swap, che verr`a immediatamente attivata. In generale per`o il comando non viene mai invocato
direttamente, ma chiamato con lopzione -a negli script di avvio, ed in questo caso attiver`a tutti
i dispositivi che sono marcati con swap allinterno di /etc/fstab.96 Se invece si vuole avere
una lista dei dispositivi attualmente utilizzati si potr`a usare lopzione -s, ottenendo qualcosa
del tipo:
hain:/home/piccardi/truedoc/corso# swapon -s
Filename
Type
/dev/hda2
partition

Size
498004

Used
1936

Priority
-1

Unaltra opzione importante `e -p, che permette di impostare una priorit`a (un parametro di
valore fra 0 e 32767) per luso della partizione. Quando si ha una sola area questo valore non `e
significativo in quanto il kernel si limiter`
a ad usare la prima sezione libera che trova, se le aree
sono pi`
u di una lalgoritmo di utilizzo prevede che il kernel usi a turno quelle della stessa priorit`a
(realizzando cos` una forma di RAID-0, vedi sez. 6.1.1) e passi ad una di priorit`a inferiore solo
quando quelle di priorit`
a superiore sono piene.
Se non si specifica nulla le priorit`
a vengono assegnate automaticamente andando a diminuire
nellordine di attivazione (cos` che la prima area attivata `e quella a priorit`a maggiore), usando -p
si pu`o forzare la stessa priorit`
a ottenendo un uso pi`
u efficace e maggiore velocit`a. Si pu`o ottenere
96

si ricordi di nuovo che la swap non `e un filesystem, pertanto anche se la voce ad essa relativa compare in
/etc/fstab, sintassi, come gi`
a visto in sez. 5.1.3, `e diversa, e che non si pu`
o usare il comando mount per montarne
il contenuto in una directory.

5.1. LA GESTIONE DEI DISCHI E DEI FILESYSTEM

281

questo risultato anche per le aree di swap attivate con swapon -a specificando in /etc/fstab
nel relativo campo lopzione pri=N dove N `e lo stesso valore che si userebbe con -p.
Infine si pu`
o disattivare unarea di swap usando il comando swapoff, anche in questo caso
occorre fornire come argomento il file di dispositivo indicante larea da disabilitare; il comando
consente anche luso dellopzione -a nel qual caso non sar`a necessario passare argomenti e saranno
disattivate tutte le aree di swap presenti, cos` come indicate in /proc/swaps e /etc/fstab.
Benche totalmente diversi dai dischi, anche i CDROM sono dispositivi a blocchi, e come visto
in sez. 5.1.3 per poter accedere al loro contenuto occorre che questi vengano opportunamente
montati.97 Abbiamo anche accennato come in genere detto contenuto sia mantenuto in uno
specifico filesystem di tipo iso9660, definito nello standard omonimo.
Il problema che per`
o non abbiamo affrontato in sez. 5.1.4 `e come creare un tale filesystem e
come registrarlo su un CDROM quando si vuole crearne uno. In questo caso infatti, trattandosi
di un dispositivo fisico diverso, non esiste il concetto delle partizioni, e se laccesso diretto in
lettura pu`
o essere fatto, come per dischi, tramite il file di dispositivo, non altrettanto accade per
una eventuale scrittura con un masterizzatore.98
Il comando che consente la creazione di un filesystem iso9660 `e mkisofs,99 ma per quanto
appena detto a differenza dei vari mkfs questo non pu`o essere usato direttamente con un file di
dispositivo,100 ma serve a creare una immagine dello stesso su un file, che `e quello che potr`
a
essere usato in seguito con un programma di masterizzazione.
La sintassi del comando prevede che si passino come argomenti le directory che si vogliono
includere nellimmagine, in genere si usa sempre lopzione -o per specificare il file dellimmagine
ISO (altrimenti il comando scrive sullo standard output. Il comando prevede inoltre una sterminata quantit`
a di opzioni che consentono di controllare le modalit`a di creazione dellimmagine
e supportare le innumerevoli varianti delle estensioni fatte allo standard originale, che essendo
nato come minimo comun denominatore delle caratteristiche dei filesystem dellepoca, supporta funzionalit`
a minime, derivate per lo pi`
u dalle limitazioni dovuto al dover essere compatibile
con lMSDOS del tempo, come ad esempio nomi dei file di al massimo otto caratteri pi`
u tre di
estensione.101
Dato che con filesystem pi`
u recenti questo costituirebbe un limite scarsamente accettabile,
sono state introdotte diverse estensioni, come le Rock Ridge, attivabili con lopzione -R, che
consentono di crearvi un vero filesystem Unix (con permessi, proprietari dei file, link simbolici,
nomi estesi, ecc.) o le Joliet, attivabili con lopzione -J, ed usate nei sistemi Windows per
estendere i nomi dei file. Le due opzioni possono essere combinate per aver il supporto di
entrambe le funzionalit`
a. Si possono inoltre creare immagini adatte a sistemi Macintosh con le
estensioni HFS, abilitate con lopzione -hfs.
Oltre ai semplici CD di dati il comando `e anche in grado di creare CDROM avviabili in diversi
formati, e ad esempio si pu`
o usare lopzione -b per indicare come parametro il file contenente
una immagine di disco di avvio per PC secondo le estensioni El Torito.102 Le altre opzioni
pi`
u rilevanti si sono riportate in tab. 5.19, ed al solito per i dettagli e delle spiegazioni pi`
u
approfondite si consulti la pagina di manuale.
97
stiamo parlando dei CD di dati, i CD audio non contengono un filesystem e si utilizzano in maniera totalmente
diversa, che non approfondiremo qui.
98
vale a dire che se `e sempre possibile leggere limmagine di un disco con un comando come dd if=/dev/cdrom
of=file.iso non `e possibile creare un CDROM con qualcosa del tipo dd if=file.iso of=/dev/cdrom anche se
si ha un masterizzatore e non un semplice lettore.
99
questo `e il nome del programma originale, sempre disponibile come link, ma la gran parte delle distribuzioni
oggi usa la versione sviluppata dopo un fork, genisoimage.
100
a meno di non voler formattare una partizione o un disco con questo filesystem, cosa che non ha alcuna utilit`
a
pratica.
101
oltre ovviamente a non supportare nessuna forma di permessi o propriet`
a dei file, link simbolici, ecc.
102
in sostanza limmagine di un floppy di avvio, creata ad esempio con syslinux (vedi sez. 5.3.2), che pu`
o avere
dimensioni fisse di 1200, 1440, 2880 kb.

282

CAPITOLO 5. AMMINISTRAZIONE STRAORDINARIA DEL SISTEMA


Opzione
-R
-C
-hfs
-b image
-o file
-m glob

Significato
crea una immagine con le estensioni Rock Ridge per luso da parte di
sistemi unix-like.
crea una immagine con le estensioni Joliet per luso da parte di sistemi
Windows.
crea una immagine con le estensioni HFS per luso da parte di sistemi
Macintosh.
crea una immagine con incluso il disco di avvio image secondo le
estensioni El Torito.
indica il file su cui scrivere limmagine ISO.
esclude dai file inseriti nellimmagine quelli selezionati con lespressione
glob (indicata con la sintassi del filename globbing della shell).
Tabella 5.19: Opzioni per il comando mkisofs.

5.2

La gestione di kernel e moduli

Tratteremo in questa sezione la gestione del kernel, in tutti i suoi aspetti: dalla scelta delle
diverse versioni, al tipo di kernel da utilizzare, la sua ricompilazione, linstallazione, la gestione
dei moduli, lutilizzo delle patch e tutto quanto attiene la manutenzione dello stesso.

5.2.1

Le versioni del kernel

Uno dei primi problemi che ci si trova ad affrontare nella gestione del kernel `e quello della scelta
di quale versione usare. Nella maggior parte dei casi il kernel viene installato dalla propria
distribuzione durante linstallazione, e molti, non avendo necessit`a specifiche (ad esempio la
mancanza di supporto per un qualche dispositivo) evitano di installarne un altro.
Le esigenze che portano allinstallazione di un nuovo kernel sono varie, la principale comunque
resta quella ottimizzare il kernel per renderlo pi`
u adatto alla propria configurazione hardware;
molti kernel di installazione infatti sono compilati con un supporto generico (per tipo di processore o per il chipset della piastra madre) per poter essere impiegati su qualunque PC; pertanto
pu`o essere utile ricompilarli per eliminare il supporto di funzionalit`a superflue non disponibili e
attivare quello per la versione specifica del proprio hardware.103
In questo caso si hanno due scelte, si pu`o ricompilare il kernel della propria distribuzione (in
genere tutte forniscono i relativi sorgenti), o utilizzare un kernel ufficiale.104 In genere infatti le
varie distribuzioni installano una propria versione del kernel, modificata applicando vari patch 105
che si ritiene migliorino le prestazioni o la stabilit`a ed aggiungono funzionalit`a reputate rilevanti,
ma non ancora incluse nel kernel ufficiale.
Qualora si scelga il kernel della propria distribuzione c`e solo da procurarsi i relativi sorgenti,
i file di configurazione e provvedere alla ricompilazione secondo le istruzioni di sez. 5.2.3. Se
invece si vuole installare un kernel ufficiale (ad esempio per avere le funzionalit`a aggiunte nello
sviluppo effettuato nel frattempo) occorre scegliere una versione adeguata.
La scelta della versione di kernel da utilizzare `e in linea generale abbastanza semplice: occorre
prendere lultima versione stabile. Le politiche di rilascio sono per`o cambiate notevolmente, ed
anche se per stabilire di quale versione si tratta basta andare sul sito ufficiale del kernel, la logica
che sta dietro la numerazione delle versioni `e stata modificata profondamente.
Fino al kernel 2.6.15 versioni ufficiali erano caratterizzate da tre numeri separati da punti.
Il primo numero esprime la major version, un numero di versione che cambia solo in caso di
103

questa esigenza `e sempre meno comune in quanto ormai tutte le distribuzioni forniscono versioni del kernel
compilate specificatamente per i vari tipi di processore.
104
si chiama cos` il kernel pubblicato su http://www.kernel.org, curato dal mantainer ufficiale (lo stesso Linus
Torvalds o chi lui ha delegato al compito).
105
si chiamano cos` le modifiche, in forma di file prodotti dal programma diff, da applicare ai sorgenti tramite
il comando omonimo, per ottenere una nuova versione degli stessi.

5.2. LA GESTIONE DI KERNEL E MODULI

283

fondamentali modifiche strutturali dellinfrastruttura, cosa avvenuta finora una sola volta, nel
passaggio dei formati dei binari dalla.out allELF. Al momento la major version `e la 2 e non
sembrano esserci allorizzonte modifiche tali da giustificare una 3.
Il secondo numero esprime il cosiddetto patchlevel, ed indica la serie di sviluppo. Questo
fino alla serie 2.4.x era quello che veniva cambiato periodicamente in base ai cicli di sviluppo.106
Prima della serie 2.6.x la convenzione scelta dagli sviluppatori era che un numero pari indicava
una versione stabile, mentre un numero dispari indicava la versione sperimentale, di sviluppo, in
cui venivano introdotte tutte le nuove funzionalit`a e le modifiche infrastrutturali che avrebbero
portato alla successiva versione stabile.
Per esempio i kernel della serie 2.4.x erano i kernel stabili, usati per le macchine in produzione,
lo sviluppo dei quali era centrato esclusivamente alla eliminazione dei bug e alla stabilizzazione
del sistema, mentre i kernel della serie 2.5.x erano i kernel sperimentali, nei quali venivano
introdotte le nuove funzionalit`
a, riscritte parti che non si consideravano soddisfacenti, ecc.
Lultimo numero di versione veniva poi utilizzato come numero progressivo per identificare
i vari rilasci successivi allinterno di una serie, nella direzione della stabilizzazione per le serie
pari, nella direzione delle nuove funzionalit`a ed infrastrutture per quelle di sviluppo. Ogni serie
stabile aveva, ed ha tuttora (anche per le pi`
u vecchie, come la 2.0.x) un suo mantainer che
coordina lo sviluppo ed il rilascio delle nuove versioni.107
Con il rilascio della serie 2.6.x questo modello `e stato totalmente cambiato; in precedenza
infatti per un certo periodo tutti gli sforzi venivano concentrati nella stabilizzazione della nuova
versione stabile, per poi dar vita ad una nuova versione di sviluppo. Accadeva spesso per`
o che
le distribuzioni, non volendo attendere i tempi lunghi del rilascio di una nuova versione stabile,
introducessero nuove funzionalit`
a o eseguissero il backporting di codice dalla versione di sviluppo
a quella stabile, introducendo delle differenze significative fra le loro versioni e quella ufficiale.
Questo, insieme al fatto che diventava sempre meno sostenibile mantenere i kernel stabili
rinunciando ai grandi miglioramenti introdotti in fase di sviluppo, `e stato uno dei motivi che
ha spinto al cambiamento di politica, diventato ufficiale nel novembre 2004 con il rilascio del
kernel 2.6.9. La nuova politica non prevede la creazione di nuove serie di sviluppo, ma il rilascio
di versioni successive nella stessa serie, integrando anche grossi cambiamenti infrastrutturali fra
una versione stabile e la seguente.
Questo ha ovviamente comportato delle difficolt`a sul piano della stabilit`a, dato che spesso
emergevano errori sulla versione stabile in una fase successiva al suo rilascio, con il problema di
come risolverli nel periodo di tempo, non sempre brevissimo, necessario per arrivare alla versione
stabile successiva.108
Per questo motivo `e stato creato un team incaricato di fornire delle ulteriori sotto-versioni
di manutenzione dei kernel stabili rilasciati, introducendo un quarto livello di numerazione. In
queste sotto-versioni vengono inserite solo delle modifiche elementari o urgenti, come la chiusura
di problemi di sicurezza e piccole correzioni per malfunzionamenti ed errori. La loro creazione e manutenzione inoltre viene terminata in corrispondenza del rilascio delle versioni stabili
successive.109
Si tenga comunque presente che lindicazione di utilizzare lultimo kernel della serie stabile
non ha valore assoluto. Esistono infatti anche delle buone ragioni, come limiti sulle risorse e nel
supporto di periferiche (i nuovi kernel tendono a occupare pi`
u memoria e a non supportare pi`
u
piattaforme hardware particolarmente datate) che spingono a mantenere lutilizzo di kernel di
106

si sono avute cio`e le serie 2.0.x, 2.2.x, 2,4.x, e la corrente `e la 2.6.x.


quello delle versioni di sviluppo `e sempre stato lo stesso Linus Torvalds.
108
lo sviluppo della quale inizia sempre con due settimane in cui si inseriscono tutte le funzionalit`
a ed i cambiamenti che si ritengono maturi per lingresso nel kernel stabile, cui segue un periodo di stabilizzazione, che in
genere dura al pi`
u qualche mese.
109
pu`
o accadere cio`e, come al momento della stesura di questa parte delle dispense, di avere in contemporanea
al rilascio di una nuova versione stabile (la 2.6.20) e quello di una versione di stabilizzazione (la 2.6.19.3).
107

284

CAPITOLO 5. AMMINISTRAZIONE STRAORDINARIA DEL SISTEMA

serie precedenti, a partire dalla 2.0.x fino alla 2.4.x, che per questo sono tuttora mantenute, sia
pure senza nessuno sviluppo, ed al solo livello della correzione dei pochi errori restanti.

5.2.2

Sorgenti e patch

Una volta scelta la versione del kernel da utilizzare, il passo successivo `e quello di scaricare
i sorgenti e ricompilarli. Come accennato il sito per la distribuzione delle versioni ufficiali `e
http://www.kernel.org, che in genere ha molto carico, per cui si consiglia luso di uno dei vari
mirror italiani disponibili, la cui lista `e segnalata sulla stessa pagina.
I sorgenti vengono distribuiti nella directory /pub/linux (vi si accede sia in FTP che in
HTTP) e sono disponibili in tre forme,110 le prime due sono degli archivi completi in formato
tar compressi o con bzip2 o con gzip, il cui nome sar`a qualcosa del tipo linux-2.6.19.tar.bz2
o linux-2.6.19.tar.gz (il primo `e pi`
u compresso e si scarica pi`
u velocemente, ma si tratta
comunque di varie decine di megabyte) oppure attraverso dei patch che permettono di passare
da una versione precedente alla successiva, in modo che sia possibile evitare di riscaricare da
capo larchivio completo tutte le volte. Cos` ad esempio, una volta che si abbiano i sorgenti del
kernel 2.6.18, si potr`
a passare al 2.6.19 scaricando soltanto il file patch-2.6.19.gz (di norma
viene compresso anche questo). Cos` diventa possibile aggiornare alla versione successiva senza
dover effettuare download di grosse dimensioni.
Una volta scaricati gli archivi si dovranno scompattare questi ultimi con tar,111 ottenendo una corrispondente directory linux-2.6.xx nella directory corrente. In genere si tende a
mettere detti sorgenti in /usr/src ma nella procedura di compilazione ed installazione niente
obbliga a questa scelta, anzi, dato che non `e necessario usare lutente di amministrazione per la
compilazione, luso della propria home directory potrebbe anche essere una scelta migliore.
Un discorso diverso va fatto qualora si vogliano utilizzare i patch per eseguire un aggiornamento di una precedente installazione dei sorgenti. Capire questa procedura `e importante
in quanto non riguarda soltanto il passaggio da una versione di kernel alla successiva, ma anche lapplicazione di eventuali patch relativi allinstallazione di funzionalit`a aggiuntive che non
sono ancora state incluse nei sorgenti del kernel ufficiale, ma delle quali si voglia introdurre il
supporto.112
Per questo occorre capire cos`e un patch;113 si tratta semplicemente di un file il cui contenuto `e definito dalle differenze di due file, in genere dei sorgenti di programmi, ma la cosa
vale per qualunque file di testo, che viene prodotto con il comando diff. In questo modo `e
possibile ottenere quali righe sono cambiate da una versione allaltra e salvare su un file le sole
differenze. Si pu`
o cos` passare da una versione di un programma alla successiva trasmettendo
solo le differenze nel relativo sorgente.
Il comando diff pu`
o inoltre essere eseguito ricorsivamente su due intere directory, registrando le differenze sia per quanto riguarda i singoli file che esse contengono, che per laggiunta o la
rimozione di alcuni di essi. Si pu`
o poi salvare il tutto su unico file, ed `e questo che ad esempio
viene distribuito come patch per passare da una versione stabile del kernel alla successiva; un
esempio del contenuto di un patch `e il seguente:
--- linux-2.4.25/arch/i386/defconfig
2004-02-18 05:36:30.000000000 -0800
+++ linux-2.4.26/arch/i386/defconfig
2004-04-14 06:05:25.000000000 -0700
@@ -2,7 +2,6 @@
# Automatically generated make config: dont edit
110

in realt`
a esiste anche una forma di distribuzione tramite il protocollo rsync, che permette di ridurre la quantit`
a
di dati da scaricare, ed attraverso il programma di gestione dei sorgenti git.
111
il procedimento `e lo stesso illustrato in sez. 4.2.1 per linstallazione dei sorgenti.
112
esistono infatti molte estensioni rispetto al kernel cosiddetto vanilla, anche di grande interesse, ma ancora
sperimentali o molto specialistiche, che vengono mantenute al di fuori dello sviluppo del kernel ufficiale.
113
il nome deriva proprio dalluso pi`
u comune, che `e quello che li vedeva rilasciati per mettere delle pezze a
programmi con errori o problemi di sicurezza.

5.2. LA GESTIONE DI KERNEL E MODULI

285

#
CONFIG_X86=y
-CONFIG_ISA=y
# CONFIG_SBUS is not set
CONFIG_UID16=y
@@ -31,12 +30,14 @@
# CONFIG_MPENTIUM4 is not set
# CONFIG_MK6 is not set
# CONFIG_MK7 is not set
+# CONFIG_MK8 is not set
# CONFIG_MELAN is not set
# CONFIG_MCRUSOE is not set
# CONFIG_MWINCHIPC6 is not set
# CONFIG_MWINCHIP2 is not set
# CONFIG_MWINCHIP3D is not set
# CONFIG_MCYRIXIII is not set
+# CONFIG_MVIAC3_2 is not set
CONFIG_X86_WP_WORKS_OK=y
CONFIG_X86_INVLPG=y
CONFIG_X86_CMPXCHG=y
...

dove la prima riga indica qual`e file originale da cui si `e partiti, mentre la seconda la nuova
versione. Si noti che si tratta di un pathname relativo, che ha come origine la directory in cui
si trovano i due diversi alberi quando `e stato eseguito il diff. Le righe che iniziano per @@
indicano a quale riga nei due file fanno riferimento i dati riportati di seguito, nel caso 7 righe
del primo file a partire dalla 12, che diventano 6 del secondo a partire sempre dalla stessa riga.
Le differenze sono mostrate apponendo un + alle righe aggiunte nel secondo file ed un - a
quelle tolte.
Con il comando patch si pu`
o invece compiere loperazione inversa rispetto a diff, e cio`e
applicare ad un certo file le differenze ottenute con il metodo precedente, in modo da convertirlo
nella nuova versione. La cosa pu`
o essere effettuata anche ricorsivamente, su un intero albero
di file e directory. Cos` chi dispone sia dei nuovi sorgenti del kernel 2.4.26 che di quelli della
precedente versione 2.4.25 potr`
a generare un patch con tutte le differenze.
Questo applicato da una persona ai sorgenti del kernel 2.4.25 li trasformer`a in quelli del
2.4.26. Lutilit`
a dei patch `e che in questo modo anche chi cura la manutenzione di ulteriori
funzionalit`
a non presenti nei kernel ufficiali potr`a limitarsi a distribuire il patch che contiene le
relative aggiunte e modifiche, cos` che un utente possa, se lo desidera, applicarle senza dover
scaricare tutto un nuovo albero dei sorgenti.
Il meccanismo `e del tutto generale, ed inoltre il comando patch `e sufficientemente intelligente
da essere in grado di applicare su uno stesso albero anche pi`
u patch distinti in successione,
fintanto che questi non vadano ad operare esattamente sulle stesse righe degli stessi file eseguendo
modifiche incompatibili fra di loro. Cos` diventa possibile, applicando in successione pi`
u patch,
inserire nel kernel pi`
u funzionalit`
a aggiuntive, fintanto che queste non interferiscono fra loro. Allo
stesso modo `e possibile passare da una versione di kernel ad unaltra che non sia la successiva.
Come accennato il comando per applicare un patch `e appunto patch. Nel caso pi`
u semplice,
in cui si deve operare su un singolo file, la sua sintassi `e immediata, e si pu`o eseguire il comando
con un qualcosa del tipo:
patch original patch.diff
nel qual caso, a meno che non si sia specificata lopzione -b (o --backup) per richiedere un
backup, la nuova versione prender`
a il posto delloriginale.
Quando per`
o si ha a che fare con un patch che coinvolge pi`
u file (come quelli che si applicano
ad un albero di sorgenti) i nomi dei file cui esso va applicato sono riportati nel file stesso, e non

286

CAPITOLO 5. AMMINISTRAZIONE STRAORDINARIA DEL SISTEMA

devono quindi essere specificati; inoltre in questo caso il comando legge il contenuto del patch
dallo standard input, per cui occorre usare una redirezione.
Per capire il funzionamento del comando conviene rifarsi allesempio di patch mostrato in
precedenza: il comando ricerca (a partire dalla directory corrente) il file che considera la vecchia
versione e cerca di applicarvi le differenze. Il problema che ci si trova di fronte `e che normalmente
si ha a disposizione solo la versione di partenza e non quella di arrivo, ad esempio si potranno
avere i sorgenti del kernel 2.4.25 nella directory linux-2.4.25 ma non ci sar`a la directory linux2.4.26. Per questo motivo di solito bisogna dire al comando da quale livello si vuole partire per
applicare il patch, usando lopzione -p.
Il livello 0 usa semplicemente quanto specificato nel patch stesso, ma nel caso dellesempio
di patch illustrato in precedenza questo non pu`o funzionare, in quanto il file di destinazione non
esiste. Se per`o ci si pone direttamente dentro la directory linux-2.4.25, ignorando il primo
livello di directory, tutti i pathname relativi sono risolti; per questo quello che si fa per applicare
un patch sui sorgenti del kernel `e qualcosa del tipo:
cd /usr/src/linux
patch -p1 < /path/to/patch/patch.diff
Si tenga presente che se non si specifica un livello, il default di patch `e di utilizzare solo il
nome del file, ignorando le directory presenti nei pathname relativi in esso contenuti, per cui in
genere lapplicazione fallir`
a. Se il comando non riesce ad applicare un patch (ad esempio perche
se ne `e gi`a applicato uno incompatibile, o si `e sbagliato file) generer`a automaticamente dei file
terminanti in .rej che contengono le modifiche che `e stato impossibile effettuare.
Inoltre patch `e in grado di rilevare il caso in cui si `e prodotto il patch invertendo le versioni,
nel qual caso avvisa richiedendo il permesso di applicare il patch alla rovescia; questo pu`o essere
richiesto esplicitamente con lopzione -R (o --reverse). Si tenga presente per`o che se si tenta
di applicare uno stesso patch due volte ci si trover`a proprio in questa situazione e proseguire
nellapplicazione non sarebbe corretto; per questo esiste lopzione -N (o --forward) che indica
di ignorare i patch che sembrano invertiti o gi`a applicati.
Il comando patch prende molte altre opzioni ed `e in grado di utilizzare vari formati per i
patch ed anche di interagire direttamente con vari programmi per il controllo di versione per
identificare quali sono i file su cui operare. Per tutti i dettagli sul funzionamento del comando
e sul significato delle opzioni si pu`
o al solito fare riferimento alla pagina di manuale, accessibile
con man patch.

5.2.3

La ricompilazione del kernel

Una volta che si sono scompattati i sorgenti ed applicati gli eventuali patch ritenuti opportuni
si pu`o passare alla compilazione del kernel. Questa, come per la maggior parte dei pacchetti
che si installano dai sorgenti, viene eseguita tramite il comando make, ma nel caso non viene
utilizzata la procedura illustrata in sez. 4.2.1 perche nel caso del kernel non esiste uno script
di configurazione e tutto viene gestito attraverso una procedura di costruzione dedicata, creata
dagli stessi sviluppatori. Pertanto tutto la procedura `e controllata dal Makefile principale
presente nella base della directory dei sorgenti, e le varie operazioni sono compiute invocando
gli opportuni target 114 del comando make.
Una delle caratteristiche peculiari di Linux (torneremo sullargomento in dettaglio anche in
sez. 5.2.5) `e quella di essere modulare. A differenza cio`e degli altri sistemi unix-like in cui il
kernel `e un unico programma monolitico, caricato in memoria allavvio del sistema ed in cui
devono essere inserite tutte le funzionalit`
a che si vogliono usare, Linux pu`o partire con un kernel
114

si ricordi quanto accennato in sez. 4.2.1 relativamente al funzionamento di questo comando.

5.2. LA GESTIONE DI KERNEL E MODULI

287

contenente le sole funzionalit`


a di base e poi caricare da disco in maniera dinamica delle ulteriori
sezioni di codice, dette moduli, che aggiungono funzionalit`a aggiuntive o il supporto di certi
dispositivi solo quando servono.
Questa `e una delle caratteristiche pi`
u rilevanti di Linux, che gli permette una flessibilit`
a

di utilizzo che i kernel monolitici tradizionali non hanno. E possibile infatti modularizzare lo
sviluppo del kernel separandone le funzionalit`a, ed evitare di mantenere permanentemente in
memoria parti di codice che sono utilizzate solo per limitati periodi di tempo (ad esempio il codice
per accedere a CDROM o floppy occupa inutilmente memoria se non li si stanno utilizzando),
indicare opzioni specifiche per la gestione di un dispositivo in fase di caricamento, o modificarle
senza bisogno di un riavvio (basta rimuovere il modulo e ricaricarlo con le nuove opzioni).
Luso dei moduli ha pertanto una grande rilevanza e deve essere pianificato accuratamente in
fase di compilazione e configurazione. Un primo aspetto delluso dei moduli `e che quando si usano
diverse versioni del kernel devono essere usate anche diverse versioni dei moduli. Ci`o comporta
che ogni kernel deve avere la sua versione dei moduli, che sono identificati, come questultimo,
per la relativa versione, quella che viene mostrata dal comando uname -r.115 Sorge allora un
problema quando si vogliono ottenere due (o pi`
u) kernel diversi a partire dagli stessi sorgenti,
dato che in questo caso la versione sar`a la stessa.
Per risolvere questo problema `e allora possibile definire una versione personalizzata. La versione del kernel `e indicata dai sorgenti, ed `e codificata nelle prime righe del Makefile principale,
che per i kernel ufficiali sono nella forma:
VERSION = 2
PATCHLEVEL = 4
SUBLEVEL = 27
EXTRAVERSION =
KERNELRELEASE=$(VERSION).$(PATCHLEVEL).$(SUBLEVEL)$(EXTRAVERSION)

e come si vede `e qui che viene definita la variabile KERNELRELEASE che poi sar`a usata in tutto il
resto della procedura. Si noti allora la presenza, appositamente predisposta, della variabile EXTRAVERSION, che serve appunto a specificare un ulteriore identificativo di versione, che permetta
di tenere separati kernel diversi (ad esempio per le opzioni di compilazione che si sono scelte)
ottenuti a partire dagli stessi sorgenti. Nelle versioni ufficiali EXTRAVERSION resta sempre non
definita,116 `e cura di chi esegue una ricompilazione definirla adeguatamente, evitando di usare
caratteri speciali, come lo spazio, che possono essere interpretati negli script (il caso pi`
u comune
`e aggiungere un -qualcosa).
In genere questa `e lunica modifica117 che pu`o essere necessario fare a mano,118 tutte le altre
configurazioni sono gestite in maniera indipendente, attraverso la modalit`a che vedremo pi`
u
avanti. Le uniche altre eventuali (anche se poco probabili) modifiche che si possono voler fare
al Makefile riguardano la variabile CROSS_COMPILE, che pu`o essere usata per compilare kernel
per una architettura diversa dalla propria (ad esempio un kernel per PowerPC su una macchina
Intel), e le opzioni per le ottimizzazioni del gcc, che `e meglio lasciar stare al valore di default,
che `e sicuro, a meno di non sapere esattamente quello che si sta facendo, o essere in vena di
sperimentazione.
Un secondo aspetto delluso dei moduli che occorre tener presente `e che per poterli utilizzare
occorre anzitutto poter caricare in memoria il loro codice; il che significa che si deve essere in
115

in realt`
a come vedremo in sez. 5.2.5, i moduli sono identificati soprattutto per la directory in cui sono
mantenuti, che `e /lib/modules/uname -r.
116
questo non vale per le release intermedie, per gli aggiornamenti delle serie 2.4.x.y e per i sorgenti mantenuti
indipendentemente da altri sviluppatori, che usano appunto questa variabile per marcare le loro versioni.
117
nel kernel 2.6.x `e prevista una opzione per impostarla direttamente anche dallinterno del programma di
configurazione e non `e pi`
u necessario modificare direttamente il Makefile.
118
anche se il kernel-package di Debian fornisce il comando make-kpkg che `e in grado di farla automaticamente.

288

CAPITOLO 5. AMMINISTRAZIONE STRAORDINARIA DEL SISTEMA

grado di usare i relativi file oggetto,119 dato che questi non sono altro che codice, come quello dei
programmi ordinari, anche se un po particolare.120 Questo comporta allora che le funzionalit`a
del kernel necessarie ad accedere al supporto su cui si trovano i file dei moduli non possono
essere ottenute con luso di questi ultimi per cui dovranno essere inserite allinterno del kernel
in maniera monolitica.
Per capire quali sono queste funzionalit`a occorre ricordare quali sono i due compiti di base
eseguiti dal kernel allavvio: montare la directory radice ed eseguire init. Per il primo compito
occorre il supporto per accedere al dispositivo su cui si trova la radice e quello per il relativo
filesystem, per il secondo il supporto per luso del formato binario di esecuzione dei programmi.
Quanto necessario a svolgere questi due compiti, anche se modularizzabile, dovr`a comunque
essere inserito permanentemente nel kernel, pena il fallimento dellavvio con un kernel panic.121
A parte le eventuali modifiche del Makefile per modificare la EXTRAVERSION, il primo passo
per la compilazione del kernel `e quello della configurazione, in cui si scelgono quali funzionalit`a
attivare e quali no, quali mettere direttamente dentro il kernel, e quali utilizzare come moduli.
Una volta che si sia specificato quanto voluto, il kernel verr`a costruito di conseguenza.
Tutto questo viene fatto, dal punto di vista della compilazione e della costruzione del kernel, tramite il contenuto del file .config, sempre nella directory base dei sorgenti, dove sono
memorizzate tutte le opzioni di configurazione. Un estratto del contenuto del file `e il seguente:
#
# Automatically generated make config: dont edit
#
# CONFIG_UID16 is not set
# CONFIG_RWSEM_GENERIC_SPINLOCK is not set
CONFIG_RWSEM_XCHGADD_ALGORITHM=y
CONFIG_HAVE_DEC_LOCK=y

Le opzioni di configurazione sono tutte dichiarate come variabili nella forma CONFIG_XXX,
quelle attivate non sono commentate ed assegnate al relativo valore, alcune indicano dei valori
generici, come il tipo di processore o la codifica NLS122 usata di default, ma la maggior parte
possono avere come valori possibili soltanto y, che richiede linclusione nel kernel o la semplice
attivazione della stessa, o m, che richiede lutilizzo come modulo, e che ovviamente `e disponibile
soltanto qualora lopzione faccia riferimento ad una funzionalit`a che pu`o essere modularizzata.
Come scritto in testa allestratto illustrato in precedenza, il file .config non deve essere
scritto a mano, ma opportunamente generato, dato che, a meno di non sapere esattamente
quello che si sta facendo, si rischia di attivare opzioni incompatibili fra di loro o inconsistenti.
Per questo la generazione di questo file viene eseguita invocando make con uno dei target di
configurazione.
Il primo target possibile `e config; questo avvia uno script di shell che effettua la configurazione chiedendo di immettere sul terminale uno per uno i valori da assegnare varie opzioni che
si vogliono attivare. Ovviamente eviter`
a di eseguire ulteriori domande qualora non si attivi una
opzione che le prevede, ma il procedimento `e comunque molto scomodo in quanto non esiste un
meccanismo per correggere una impostazione una volta che si sia fatto un errore, per cui occorre
ricominciare da capo.
119

un file oggetto, in genere identificato dallestensione .o, `e un file che contiene il codice compilato di una o pi`
u
funzioni, in cui per`
o gli indirizzi non sono stati assegnati; in questo modo, attraverso un procedimento successivo
detto collegamento (in inglese linking) si possono unire insieme pi`
u funzioni per dar luogo a quello che poi andr`
a
a costituire un eseguibile; questo `e anche quello che si fa quando si produce limmagine del kernel, e luso dei
moduli consente di ripetere il procedimento sul codice del kernel in esecuzione.
120
ed infatti a partire dalla serie 2.6.x li si `e distinti dai normali file oggetto usando lestensione .ko al posto di
.o (ma si ricordi che lestensione in Unix `e solo una convenzione, nel caso conta solo il contenuto).
121
si chiama cos` un crash fatale del kernel; questo pu`
o avvenire solo per errori fatali durante lesecuzione dello
stesso (in caso di bug particolarmente gravi, molto rari, o di problemi hardware, assai meno rari), o in fase di
avvio, se mancano delle componenti essenziali per lavvio del sistema.
122
il Native Language Support, indica la codifica dei vari codici ASCII per le stringhe, come iso8859-1 o utf-8.

5.2. LA GESTIONE DI KERNEL E MODULI

289

Pertanto `e oggi praticamente in disuso, a parte per una sua versione modificata, invocabile
con il target oldconfig, che si limita a rileggere e riprocessare il file di configurazione precedente
ricavando da questo, invece che dalle nostre risposte sul terminale, le risposte alle domande.
Questo pu`
o risultare utile qualora si siano effettuate modifiche a mano del file .config e si
voglia essere sicuri di ottenere un file di configurazione coerente.
Gli altri due target sono menuconfig e xconfig che attivano invece due interfacce utente,
testuale la prima e grafica la seconda, con finestre e menu che permettono di selezionare interattivamente le varie opzioni ed effettuare le relative scelte in maniera casuale, senza serializzare
le domande. Le due interfacce, a parte lapparenza, sono sostanzialmente equivalenti, per cui
tratteremo solo la prima. A partire dal kernel 2.6.x le interfacce grafiche sono diventate 2; la
prima, sempre accessibile con make xconfig `e basata sulle librerie QT, la seconda, accessibile
con make gconfig, `e basata sulle librerie GTK.

Figura 5.2: Schermata di avvio della configurazione del kernel con make menuconfig.

Eseguendo make menuconfig nella directory dei sorgenti del kernel si otterr`a la pagina di
avvio del programma di configurazione, mostrata in fig. 5.2. In genere il programma viene
compilato la prima volta che si esegue il relativo bersaglio, questo talvolta fallisce in quanto
per la compilazione necessitano le librerie ncurses su cui `e basata linterfaccia a finestre. Di
norma queste vengono installate, ma non altrettanto avviene per i file di dichiarazione necessari
alla compilazione (si ricordi quanto detto in sez. 4.2.1), nel qual caso andr`a installato il relativo
pacchetto di sviluppo123 (e quelli delle glibc, qualora anchessi fossero assenti).
La finestra di avvio riporta nella prima riga in alto la versione del kernel, se si `e modificata
la EXTRAVERSION questa dovr`
a comparire. Subito sotto c`e il titolo della sezione in cui ci si trova
(nel caso `e il menu principale), seguito da un breve riassunto dei principali comandi disponibili.
Le frecce verticali permettono di spostarsi nella finestra centrale che contiene le varie sezioni in
cui sono state suddivise le opzioni di configurazione. Nella parte bassa ci sono le tre opzioni
principali che permettono di selezionare una opzione, uscire dalla finestra corrente e ottenere
una finestra di aiuto (contestuale allopzione selezionata), che possono essere cambiate con le
frecce orizzontali.
Dal menu principale `e possibile selezionare una sezione premendo invio (a meno di non aver
cambiato lopzione di selezione), e questo ci porter`a nella finestra di configurazione delle relative
123

le librerie ncurses sono presenti in tutte le distribuzioni, per cui `e sempre il caso di usare i relativi pacchetti,
per Debian sono ncurses e libncurses-dev.

290

CAPITOLO 5. AMMINISTRAZIONE STRAORDINARIA DEL SISTEMA

opzioni, un esempio della quale `e mostrato in fig. 5.3. I valori delle opzioni sono riportati
allinizio di ogni riga, quelli indicati fra parentesi tonde sono per le opzioni che richiedono un
valore generico, che pu`
o essere selezionato da un menu a tendina o inserito da una finestra di
immissione che si attiva quando lopzione viene selezionata.

Figura 5.3: Schermata di configurazione del kernel con make menuconfig.

I valori fra parentesi quadre indicano le opzioni per le quali `e possibile solo scegliere fra
lattivazione o meno e la scelta pu`
o essere fatta premendo il tasto y per attivare e n per
disattivare, premendo la barra si pu`
o ciclare fra le due opzioni. Un asterisco indica che la
funzionalit`a `e attivata, uno spazio vuoto che non `e attivata. Si tenga presente che se si tratta
del supporto per funzionalit`
a specifiche del kernel questo implica che il relativo codice sar`a incluso
monoliticamente, molte di queste opzioni per`o servono anche per attivare ulteriori configurazioni
o specificare caratteristiche di unaltra opzione (che pu`o anche essere modulare), nel qual caso
le successive descrizioni appariranno indentate.
I valori fra parentesi angolari indicano invece le opzioni relative a funzionalit`a che possono
essere anche modularizzate; rispetto alle precedenti possono presentare anche il valore M (attivabile direttamente premendo m o ciclando fra i valori possibili con la barra) che indica che si
`e optato per la creazione del relativo modulo, se invece si ha un * la funzionalit`a sar`a inserita
direttamente nel kernel.
Infine per alcune sezioni sono presenti delle ulteriori sottosezioni (sono indicate dalla assenza
del valore delle opzioni e dal fatto che terminano con una freccia, come nel menu principale).
Una volta che si sono effettuate le proprie scelte selezionando la voce di uscita si pu`o tornare al
menu precedente, se si `e gi`
a nel menu principale invece si uscir`a direttamente dal programma
di configurazione, e comparir`
a una finestra che richiede se si vuole che le nuove configurazioni
siano salvate sovrascrivendo un nuovo .config, o scartate.
Due opzioni specifiche per il menu principale sono poi quelle disponibili separatamente in
fondo allo stesso, che permettono di salvare i valori della configurazione su, o caricarli da, un
file specificabile dalla solita riga di immissione dei dati. Questo pu`o comunque essere ottenuto
con delle semplici copie del file .config.
Data la quantit`
a (molte centinaia) di opzioni disponibili non `e possibile commentarle tutte,
pertanto ci limiteremo ad una descrizione sommaria del contenuto delle varie sezioni del menu
principale. Queste sono state completamente riorganizzate nel passaggio dal kernel 2.4.x al 2.6.x,

5.2. LA GESTIONE DI KERNEL E MODULI

291

ed inoltre nel corso dello sviluppo ne state aggiunte delle altre; alla stesura di queste dispense124
erano disponibili:
General setup
Questa `e la sezione dove si attivano le opzioni di configurazione generali; qui si pu`
o
impostare la extraversion del kernel (con Local version - append to kernel release) e le opzioni che consentono la visualizzazione di altre opzioni specialistiche
come Prompt for development and/or incomplete code/drivers che permette di attivare tutte le opzioni che sono classificate come sperimentali o Configure
standard kernel features (for small systems) che permette di eseguire ulteriori configurazioni per i sistemi con poche risorse. In particolare `e sempre opportuno
abilitare Prompt for development and/or incomplete code/drivers prima
di iniziare una configurazione in quanto buona parte delle opzioni sperimentali sono
ampiamente utilizzate e perfettamente funzionanti; le opzioni pericolose vengono
adeguatamente segnalate nelle relative descrizioni.
Inoltre sono presenti in questa sezione le opzioni per il supporto per alcune funzionalit`
a fornite del kernel, come i meccanismi di intercomunicazione fra processi, il controllo
e la suddivisione delle risorse,125 e vari supporti per tecnologie di debug, profilazione
e controllo delle prestazioni. Infine vanno esplicitamente ricordate due opzioni molto importanti per il funzionamento del sistema: il supporto per il ramdisk iniziale
(vedi sez. 5.2.4) con lopzione Initial RAM filesystem and RAM disk (initramfs/initrd) support e per la swap (vedi sez. 5.1.7) con lopzione Support for
paging of anonymous memory (swap).
Loadable module support
In questa sezione si attivano le opzioni per abilitare la gestione dei moduli ed il relativo supporto nel kernel. In generale si possono attivare tutte, si pu`o disattivare quelle
che introducono dei controlli di versione per i moduli, in particolare quella relativa ai
sorgenti. In generale `e utile mantenere attiva quella marcata Module versioning
support per evitare vengano caricati per errore moduli compilati per unaltra versione del kernel non compatibile;126 questo pu`o comportare problemi qualora si vogliano
utilizzare moduli compilati a parte o distribuiti in forma binaria.
Enable the block layer
Questa sezione contiene le opzioni relative alla gestione generica dei dispositivi a blocchi che deve essere sempre inserita nel kernel perche il sistema possa funzionare (deve
poter montare la radice). Qui si trovano in questa sezione anche le opzioni relative ai
diversi scheduler (IO schedulers) usabili per ottimizzare lI/O su disco.127
Processor type and features
Questa sezione contiene le opzioni relative alla scelta del tipo di CPU presente, con le
opzioni per il supporto di vari insiemi di istruzioni estese (MTRR (Memory Type
Range Register) support), ai vari tipi di timer usati dal sistema, la frequenza
124

la revisione `e dellAprile 2011, e fa riferimento al kernel 2.6.38.


come i control group (Control Gruop support) e varie funzionalit`
a (Namespace support) utilizzate
per il supporto ai cosiddetti container, una tecnologia che consente di eseguire macchine virtuali allinterno di
contenitori forniti dal sistema, senza dover eseguire una virtualizzazione dellhardware.
126
nel 2.4 il meccanismo funziona aggiungendo una checksum a tutti i nomi dei simboli del kernel, cosicche le
relative funzioni possono essere chiamate solo allinterno dello stesso kernel, nel 2.6 questa informazione viene
mantenuta a parte e pu`
o essere ignorata.
127
il kernel `e in grado di utilizzare diverse strategie per organizzare laccesso a disco in maniera ottimale da parte
di diversi processi, queste possono essere stabilite in fase di avvio ed il default pu`
o essere impostato con lopzione
Default I/O scheduler, presente in questa sezione.
125

292

CAPITOLO 5. AMMINISTRAZIONE STRAORDINARIA DEL SISTEMA


dello stesso (Timer frequency). Di particolare importanza `e poi lopzione per il
Simmetric multi-processing che consente luso di macchine multiprocessore, e
quelle (Preemption Model) che controllano le modalit`a di gestione dello scheduler
dei processi a seconda del tipo di utilizzo. Sempre qui vanno attivate una serie di
opzioni relative alla gestione della memoria, come quelle per luso di grandi quantit`a
di memoria (High Memory Support) quando si ha pi`
u di 1Gb su macchine a 32
bit. Si trovano qui anche alcune opzioni di supporto per essere eseguito come ospite
in una macchina virtualizzata (Paravirtualized guest support).

Power management options and ACPI options


Questa sezione contiene tutte le opzioni relative al supporto delle funzionalit`a di risparmio energetico e di gestione dellalimentazione, spegnimento, sospensione su disco
` qui che si configura il supporto per lACPI (Advanced Configuration
ed in RAM ecc. E
and Power Interface) o per il vecchio APM (Advanced Power Management).
Bus options
Questa sezione contiene tutte le opzioni di configurazione relative a vari bus hardware
(vedi sez. 5.4) supportati da Linux, come PCI, ISA, PCMCIA, ecc. Sono di particolare
importanza le opzioni relative al bus PCI che devono essere sempre inserite allinterno
del kernel in quanto questo `e il bus usato dalla quasi totalit`a dei computer odierni
per accedere alle periferiche principali (dischi, scheda video, schede sonore, ecc.), ed `e
pertanto necessario per poter accedere ai dischi e montare la radice.
Executable file formats
Questa sezione contiene le opzioni relative al supporto per i formati binari dei file che
il kernel `e in grado di eseguire come programmi. Il supporto per il formato ELF deve
essere sempre abilitato nel kernel (altrimenti sar`a impossibile eseguire /sbin/init),
gli altri possono essere abilitati come moduli.
Networking support
Questa sezione contiene le sottosezioni relative al supporto delle varie tecnologie di
rete, wireless, infrarossi, bluetooth, per ciascuna delle quali occorre abilitare (anche
come moduli) le funzionalit`
a necessarie. Di particolare importanza `e poi, raccolto
nella sottosezione Networking options, il supporto per i vari protocolli di rete ed
ai diversi tipi di socket e le funzionalit`a relative al filtraggio dei pacchetti (Network
packet filtering) ed al routing avanzato; in questa sottosezione sono da attivare
TCP/IP networking, Packet socket e Unix domain sockets, per gli ultimi
due `e possibile farlo anche in maniera modulare. Oltre a questi si pu`o poi abilitare
il supporto per tutta una serie di altri protocolli di rete o estensioni dei protocolli
standard come IPSEC.128
Device Drivers
Questa `e la sezione pi`
u corposa e pi`
u importante in quanto contiene le opzioni di configurazione per tutti vari tipi di periferiche che si possono utilizzare con Linux; tratteremo separatamente in coda a questa panoramica sulle opzioni del menu principale
le varie sottosezioni in cui essa `e suddivisa.
Firmware Drivers
Questa sezione, relativamente recente, contiene le opzioni per il supporto di alcune interfacce di comunicazione con il firmware (il BIOS o alternative) della propria
macchina.
128

la versione cifrata dellordinario protocollo IP, vedi il capitolo 4.2 di [SGL].

5.2. LA GESTIONE DI KERNEL E MODULI

293

File systems
Questa sezione contiene le opzioni per il supporto di un gran numero di diversi filesystem. Si deve essere sicuri di inserire nel kernel il supporto per il filesystem della
radice, qualunque esso sia (i pi`
u usati sono ext2, ext3, ext4, reiserfs e XFS). Qui si pu`
o
anche abilitare, da altrettante sotto-sezioni, il supporto per i filesystem di CDROM e
sempre opportuno abilitare il supporto per
DVD, e per i vari filesystem di Windows. E
il filesystem /proc (che `e usato da moltissimi programmi) nella sotto-sezione Pseudo
filesystems. Una sotto-sezione a parte (Network File Systems) `e dedicata ai
filesystem di rete (NFS, SMB ed altri), dove pu`o essere configurato il relativo supporto. Infine si trovano in questa sezione anche le opzioni relative alla gestione delle
quote disco (vedi sez. 6.4), dellautomounter (vedi sez. 5.1.6), dei vari meccanismi di
notifica delle modifiche dei file,129 ed il supporto per la realizzazione di filesystem in
user-space (FUSE).
Kernel hacking
Questa sezione contiene le opzioni per la configurazione del supporto di una lunga serie
di funzionalit`
a di controllo utilizzate principalmente dagli sviluppatori per il debug del
kernel. Pu`
o essere utile abilitare lopzione Magic SysRq key che permette luso di
particolari combinazioni di tasti (a partire appunto da SysRq) per tentare un recupero
in estremo dei dati in caso di crash del kernel.
Security options
Questa sezione contiene le opzioni relative alle infrastrutture di sicurezza (come SELinux, Tomoyo, AppArmor o eventuali altri moduli che consentono di supportare diverse
qui che si
politiche di sicurezza) che possono essere attivate allinterno del kernel. E
sceglie quale di questi moduli deve essere usato di default.
Cryptographic API
Questa sezione contiene le opzioni per il supporto di vari algoritmi crittografici allinterno del kernel, compreso leventuale supporto hardware per alcuni di questi. In
genere viene utilizzato per supportare filesystem cifrati e per IPSEC. Sono inserite in
questa sezione anche le opzioni per abilitare gli algoritmi di compressione.
Virtualization
Questa contiene le opzioni di configurazione per il supporto di varie tecnologie di
virtualizzazione dellhardware con cui diventa possibile fare eseguire dal kernel un altro
sistema operativo a velocit`a nativa, creando opportunamente una macchina virtuale
sia in termini di emulazione del processore che di alcuni dispositivi.
Library routines
Questa sezione contiene le opzioni per la configurazioni di alcune funzioni di libreria
usate dal kernel.
Il precedente elenco riporta solo un breve sommario dei contenuti delle varie sezioni in cui
sono state suddivise le varie opzioni nel menu principale del programma di configurazione del
kernel. Come accennato per`
o la sezione Device Drivers ha una rilevanza particolare in quanto
`e al suo interno che si trovano la maggior parte delle opzioni di configurazione.
Detta sezione infatti `e divisa in un gran numero di ulteriori sottosezioni, relative alle varie
tipologie di dispositivi che il kernel `e in grado di supportare; per questo motivo si `e deciso di
riportare di seguito anche una breve descrizione delle principali sottosezioni in essa contenute:
Generic Driver Options
Contiene le opzioni generali relative alla gestione dei driver, in particolare il supporto
per il caricamento dei firmware sulle periferiche e la creazione di un contenuto minimo
129

principalmente ad uso dei programmi ad interfaccia grafica.

294

CAPITOLO 5. AMMINISTRAZIONE STRAORDINARIA DEL SISTEMA


per /dev ad uso di emergenza, disponibile anche senza la presenza di udev (vedi
sez. 5.4.5). Consentiva anche lindicazione, ora deprecata, del programma da utilizzare
per la gestione degli eventi generati dal kernel che nelle versioni recenti vengono gestiti
da udev.

Memory Technology Devices (MTD) support


Questa sezione contiene le opzioni relative ai supporti di memoria opzionali come flash,
memorie a stato solido ecc. Vengono utilizzate prevalentemente nei sistemi embedded,
ancorche alcune di queste stanno trovando uso anche in sistemi ordinari dotati di dischi
a stato solido.
Parallel port support
Questa sezione contiene le opzioni relative al supporto per la porta parallela, necessarie
per poter utilizzare i dispositivi (ad esempio una stampante) ad essa collegati. Pu`o
essere completamente modulare ed `e in disuso per la sempre minore diffusione di questa
interfaccia.
Plug and Play support
Questa sezione contiene le opzioni per abilitare il supporto alluso del Plug and Play per
le schede che lo supportano (vedi sez. 5.4.1). Riguarda hardware ormai praticamente
scomparso e pu`
o essere completamente modulare.
Block devices
Questa sezione contiene le opzioni per abilitare il supporto di una serie di dispositivi a
blocchi (i floppy, vari disk-array e RAID hardware, i ramdisk e il loopback ). A meno
di non avere la radice su uno di questi dispositivi il supporto pu`o essere modulare.
A parte il supporto per i sempre meno comuni floppy (con Normal floppy disk
support) le funzionalit`
a pi`
u usate sono quelle relative ai dischi in RAM (RAM
block device support) e al dispositivo di loopback (Loopback device support)
gi`a visto in sez. 5.1.3), in particolare se si usa un meccanismo di avvio che utilizza un
ramdisk un occorrer`
a inserire RAM block device support allinterno del kernel.
Si configurano qui anche il dispositivo a blocchi virtuale ad uso di macchine virtualizzate (Virtio block driver) ed il RAID via rete con DRDB (DRBD Distributed
Replicated Block Device support).
Misc devices
Questa sezione contiene le opzioni relative ad una miscellanea di dispositivi diversi,
molti dei quali relativi al supporto di funzionalit`a presenti su specifiche macchine (in
genere portatili); pu`
o essere completamente modulare.
ATA/ATAPI/MFM/RLL support
Questa sezione contiene le opzioni per il supporto del bus IDE/ATA tradizionale (detto talvolta anche Parellel ATA), e di tutti i relativi dispositivi (dischi, CDROM, ecc.).
Questa sezione fa riferimento al supporto classico del bus IDE e non al nuovo supporto
tramite libata, la cui configurazione si effettua nella successiva sezione Serial ATA
and Parallel ATA drivers. Qualora si utilizzi questa modalit`a di supporto e la
radice sia su un disco IDE occorrer`a abilitarla ed inserirla direttamente nel kernel, inoltre al suo interno occorrer`
a abilitare le due opzioni generic/default IDE chipset
support e generic ATA/ATAPI disk support, oltre al supporto specifico per
il proprio chipset; tutto il resto pu`o essere modulare. Si pu`o lasciare attivo Generic
PCI IDE Chipset Support che permette lavvio con un supporto generico. Questo
supporto `e per`
o in dismissione e la sezione `e deprecata, in quanto tutto quello che non
`e relativo ad hardware in disuso `e gi`a stato trasferito nella nuova sezione citata.

5.2. LA GESTIONE DI KERNEL E MODULI

295

SCSI device support


Questa sezione contiene le opzioni per il supporto dei dispositivi SCSI (dischi, CDROM,
nastri), del relativo protocollo, e dei vari controller. Lopzione SCSI support deve
essere abilitata anche se non si hanno dispositivi SCSI in quanto il protocollo viene
usato da altri sistemi, come i programmi per la masterizzazione (che usano lemulazione IDE-SCSI) e le chiavette e i dischi esterni USB o i dischi Serial ATA (che usano
il protocollo SCSI per accedere ai dati). Se si ha la radice su un disco SCSI tutto
tranne SCSI device support, SCSI disk support ed il supporto per il proprio
controller pu`
o essere modulare. Nella sottosezione SCSI low-level drivers si pu`
o
poi selezionare il supporto per i vari tipi di controller.
Serial ATA and Parallel ATA drivers
Questa sezione contiene le opzioni per il supporto dei nuovi dispositivi Serial ATA, e,
con le versioni pi`
u recenti del kernel, anche quello per alcuni dispositivi che usano linterfaccia IDE/ATA tradizionale (il cosiddetto Parallel ATA); in questultimo caso questo supporto va a sostituire quello della precedente sezioneATA/ATAPI/MFM/RLL
support. Se si ha la radice su questo tipo di dispositivi, oltre a quello dello specifico chipset della propria scheda madre, occorre anche abilitare il supporto SCSI per
i dischi (le due opzioni SCSI device support, SCSI disk support della precedente sezione), dato che in questo caso i dischi vengono gestiti con il protocollo SCSI
(si ricordi quanto illustrato in sez. 5.1.1). Se la radice `e su uno di questi dispositivi
occorrer`
a inserire nel kernel il relativo supporto.
Multiple device driver support (RAID and LVM)
Questa sezione contiene le opzioni per abilitare il supporto del RAID software (vedi
sez. 6.1) e del Logical Volume Manager (vedi sez. 6.2) ed in generale del sistema del
device mapper che consente una serie di funzionalit`a avanzate (come luso di dischi
cifrati). A meno di non avere la radice su uno di questi dispositivi il supporto pu`
o

essere modulare. E presente in questa sezione anche il supporto per il multipath che
consente di accedere tramite diversi nomi agli stessi dispositivi (ad uso dei dispositivi
SAN).
IEEE 1394 (FireWire) support
Questa sezione contiene le opzioni per il supporto delle interfacce e dei protocolli per
il bus IEEE 1394 (il cosiddetto firewire), un bus seriale veloce simile allUSB, usato
sia per utilizzare dischi rimuovibili esterni che per la trasmissione dati da periferiche
(viene usato principalmente per le telecamere).
Macintosh device drivers
Questa sezione contiene le opzioni per il supporto di alcune funzionalit`a specifiche
ad uso delle macchine Macintosh prodotte dalla Apple (come lemulazione dei tasti
mancanti sul mouse).
Network device support
Questa sezione contiene le opzioni di configurazione per le varie schede di rete utilizzabili con Linux (sia Ethernet che di altro tipo), pi`
u il supporto per alcuni protocolli
di comunicazione di basso livello (PPP, SLIP, ecc.) e dispositivi virtuali. Il supporto
pu`
o anche essere modulare, a meno di non avere la radice su un filesystem di rete.
Questa `e una delle sezioni pi`
u ampie ed `e suddivisa in una lunga serie di sottosezioni
relative ai vari driver disponibili.
ISDN support
Questa sezione contiene le opzioni per il supporto dei dispositivi ISDN e dei relativi
protocolli.

296

CAPITOLO 5. AMMINISTRAZIONE STRAORDINARIA DEL SISTEMA

Telephony support
Questa sezione contiene le opzioni relative al supporto di schede telefoniche dedicate,
che consentono di telefonare direttamente dal computer, ed usare questo come ponte
fra linea telefonica normale e VoIP.
Input device support
Questa sezione contiene le opzioni per il supporto per mouse, tastiere, joystick ed altri
dispositivi analoghi.
Character devices
Questa sezione contiene le opzioni di configurazione per una lunga serie di dispositivi a caratteri. Qui `e essenziale lopzione per il supporto del terminale sullo schermo
(Virtual terminal) che serve per poter disporre allavvio della console di siste sempre in questa sezione che si abilita il supporto per le porte seriali nella
ma.130 E
sottosezione Serial drivers,131 e il supporto dei termininali virtuali (quelli usati da
tutti i programmi che emulano un terminale) con lopzione Unix98 PTY support.
Hardware Monitoring support
Questa sezione contiene le opzioni relative al supporto dei dispositivi di controllo di
funzionamento dellhardware presenti sulle schede madri moderne (ad esempio i sensori
di temperatura).
Multimedia devices
Questa sezione contiene le opzioni di configurazione di Video For Linux, linfrastruttura del kernel per i dispositivi video, che comprende il supporto per lutilizzo di
schede TV, schede di acquisizione video, webcam ed anche quello delle schede di
sintonizzazione radio.
Graphics support
Questa sezione contiene le opzioni per il supporto di funzionalit`a relative alla grafica:
luso del bus AGP (/dev/agpgart (AGP Support)), il supporto per il DRI132 di
X11 (Direct Rendering Manager), il supporto per i framebuffer e per la console
sia su VGA che su framebuffer, come avviene per le macchine che non usano la VGA,
come gli Apple.
Sound card support
Questa sezione contiene le opzioni relative al supporto delle schede audio per Linux,
sono presenti due sottosezioni, relative alle due modalit`a alternative di supporto disponibili, il vecchio OSS (Open Sound System), ormai deprecato ed in via di sostituzione
` alil cui uso `e da evitare, ed il nuovo ALSA (Advanced Linux Sound Architecture), E
linterno di dette sottosezioni che poi si potr`a abilitare il supporto per le varie schede
sonore.
HID Devices
Questa sezione contiene le opzioni per il supporto dellinterfaccia dei dispositivi di
interazione uomo-macchina, cio`e tutto quello che attiene il cosiddetto HID (Human
Interface Device), una astrazione che permette di usare in maniera generica dispositivi
come il mouse.
USB support
Questa sezione contiene le opzioni relative al supporto dei vari chipset del bus USB
(vedi sez. 5.4.4) e dei vari dispositivi che si possono inserire su di esso; `e qui che si
130

`e il supporto per i terminali su console, che consente di usare i dispositivi /dev/tty1, /dev/tty2, ecc.
e se si vuole la console sulla porta seriale si deve abilitare allinterno di questa lopzione Console on
8250/16550 and compatible serial port.
132
linterfaccia di accesso a basso livello alle funzionalit`
a di accelerazione delle schede grafiche, vedi sez. 3.3.2.
131

5.2. LA GESTIONE DI KERNEL E MODULI

297

abilita il supporto per i dischi su USB che consente di usare le chiavette ed i dischi
esterni.
MMC/SD/SDIO card support
Questa sezione contiene le opzioni relative al supporto delle varie carte Secure Digital
e MultiMediaCard e dei chipset che consentono di leggerle.
Una volta completata la configurazione, qualunque sia il metodo con cui la si `e effettuata,
viene salvato il nuovo .config. A questo punto la procedura cambia a seconda che si stia
utilizzando un kernel dalla serie 2.4.x o precedenti o della serie 2.6.x. Infatti con la serie 2.6.x
anche la procedura di ricompilazione `e stata profondamente modificata e semplificata.
Con i kernel della serie 2.4.x e precedenti se si effettua la compilazione per la prima volta, il
primo passo `e creare le dipendenze con il comando make dep. Il comando esegue due compiti, il
primo `e creare le dipendenze133 per la compilazione, il secondo, se si `e abilitato il controllo della
versione dei moduli, `e calcolare le informazioni per il versionamento nei simboli.134 Pertanto
quando se non si `e abilitato il versionamento `e necessario eseguire questo comando soltanto la
prima volta che si effettua una compilazione, altrimenti deve essere eseguito ogni volta che si
cambia la configurazione, in quanto linformazione sulla versione dei simboli dipende da questa.
Nei kernel della serie 2.6.x tutto questo non `e pi`
u necessario e pertanto questo comando `e
deprecato e non deve essere utilizzato (qualora lo si usi viene semplicemente stampato un avviso).
Il passo successivo, sempre per i kernel della serie 2.4.x, `e quello di compilare limmagine del
kernel. Sui normali PC compatibili a 32bit questo si fa con il comando make bzImage, che crea
lomonima immagine compressa nella directory arch/i386/boot, con i kernel 2.6 pi`
u recenti
le architettura a 32 e 64 bit sono state unificate, e limmagine del kernel si trova sempre in
arch/x86/boot; su altre architetture si usa in genere make vmlinux che crea una immagine
non compressa nel file omonimo nella directory dei sorgenti. Un altro possibile comando `e make
zImage, che crea una immagine compressa generica, valida anche per altre architetture.
Questultimo era il comando originale per la creazione delle immagini del kernel, e pu`
o
essere ancora usato fintanto che il kernel `e di dimensione inferiore a 512kb. Se la dimensione `e
superiore occorre invece usare make bzImage, non tanto, come qualcuno ancora ritiene, perche
cos` limmagine viene compressa di pi`
u,135 quanto perche nel primo caso il kernel viene caricato
nella cosiddetta low memory (cio`e sotto i primi 640k) e viene utilizzato un meccanismo davvio
diverso, mentre nel secondo caso viene caricato sopra 1M.
Al giorno doggi lunica ragione per usare zImage potrebbe essere quella della compatibilit`
a
con macchine obsolete (ormai praticamente scomparse) su cui ci sono vecchie versioni di LILO
e vecchi BIOS che non supportano la procedura di avvio di bzImage, che non risente del limite
di 512k nella dimensione, ed `e anche pi`
u veloce. Questo ovviamente vale solo per larchitettura
PC, se si usano altre architetture ci possono essere altri bersagli o pu`o non essere necessario
luso di un kernel compresso (`e il caso dellarchitettura PPC dei Macintosh).
Una volta compilata limmagine del kernel il passo successivo `e, se li si sono abilitati, passare
alla compilazione dei moduli. Questo viene fatto con il comando make modules. I due passi della
compilazione (compilazione dellimmagine e dei moduli) ed i relativi target per make, pur essendo
disponibili anche con i kernel della serie 2.6.x, sono deprecati, in quanto tutta la procedura di
compilazione pu`
o essere eseguita in un colpo solo invocando semplicemente il comando make,
133
cio`e determinare quali file di dichiarazione (i .h) sono necessari per produrre i relativi file binari (i .o)
contenenti il codice di kernel e moduli.
134
si chiamano cos` i nomi delle funzioni che vengono dichiarate allinterno di un modulo, ma possono essere
usati da altri; per far questo si dice che il simbolo deve essere esportato, il versionamento funziona aggiungendo
al nome di ciascun simbolo un hash unico che impedisce di chiamare da un kernel diverso le suddette funzioni.
135
la compressione `e identica nei due casi e fino al kernel 2.6.30 `e sempre stata effettuata con gzip; nonostante
il nome bzImage possa trarre in inganno bzip2 non veniva mai usato; a partire da questo kernel `e stato aggiunto
il supporto per diversi algoritmi di compressione (bzip e lzma).

298

CAPITOLO 5. AMMINISTRAZIONE STRAORDINARIA DEL SISTEMA

questo si cura anche di compilare limmagine del kernel nel giusto formato per la piattaforma
hardware che si sta usando.
La compilazione del kernel (e dei moduli) `e in genere un processo piuttosto lungo e che
utilizza pesantemente le risorse (memoria e CPU) della macchina. Pertanto viene spesso anche
usato come test di carico. Il procedimento pu`o essere reso pi`
u veloce usando lopzione -j del
comando make che consente di parallelizzare la compilazione. Questa `e una funzionalit`a del
tutto generale di make136 che consente di specificare come parametro dellopzione un numero di
processi da eseguire in parallelo,137 ciascuno dei quali compiler`a parti indipendenti,138 cos` da
avere in generale sempre qualche processo in compilazione anche quando gli altri sono bloccati
sullI/O.

5.2.4

Installazione manuale del kernel e del ramdisk iniziale

Una volta eseguita con successo la compilazione i passi successivi riguardano linstallazione del
nuovo kernel cos` ottenuto; il primo passo `e quello di installare i moduli, questo viene fatto,
usando un ulteriore target, con il comando make modules_install. I moduli vengono sempre
installati sotto /lib/modules, in una directory diversa per ciascuna versione del kernel, con
lo stesso nome della versione del kernel (cos` come definita nel Makefile); questo significa che
se si installano i moduli del kernel 2.4.24 i moduli e tutti i relativi file saranno installati in
/lib/modules/2.4.24/. Questo passo deve essere eseguito, ottenendo lo stesso risultato, anche
con la nuova procedura dei kernel della serie 2.6.x.
I passi successivi sono linstallazione nel sistema della nuova immagine del kernel e dei file
ad essa associati. Per questo vengono anche forniti altri target specifici per make (come make
install, make rpm o make deb-pkg) che consentono di automatizzare linstallazione, ma in
generale `e possibile eseguire loperazione manualmente, anche perche in questo caso le operazioni
sono indipendenti dal bootloader (vedi sez. 5.3) che si intende usare.
Come spiegato in sez. 1.2.3 i file necessari allavvio del sistema sono mantenuti in /boot,
pertanto `e qui che deve essere copiata limmagine del kernel, che nella maggior parte dei casi `e
arch/x86/boot/bzImage;139 la convezione `e chiamare il file sotto /boot con il nome vmlinuzversione, dove la versione `e quella impostata con il Makefile. Occorre inoltre copiare anche
il file System.map, che contiene le informazioni che permettono di identificare per nome (e non
tramite lindirizzo in memoria) le varie routine del kernel, la cosiddetta mappa dei simboli.140
Il contenuto di questo file `e utilizzato dal processo interno al kernel che invia al servizio del
syslog gli eventuali errori riscontrati nellesecuzione del kernel; questi contengono degli indirizzi
binari, ed il file viene usato per poter ottenere i nomi delle funzioni coinvolte invece dei loro
indirizzi.141 La sua assenza perci`
o non comporta problemi di funzionamento del sistema, ma
solo una maggiore difficolt`
a per chi dovr`
a andare ad analizzare gli errori.
Lo stesso file `e utilizzato anche in sede di installazione dei moduli quando vengono calcolate
le dipendenze di un modulo da un altro, ed il comando depmod (che vedremo in sez. 5.2.5) dar`a
degli errori in caso di sua mancanza o di non corrispondenza con il kernel attivo. Come per
136

in realt`
a la funzionalit`
a `e della versione GNU di make, non `e detto la si ritrovi su altre versioni.
la cosa `e particolarmente efficiente su macchine multiprocessore.
138
questo `e possibile sfruttando appunto le informazioni sulle dipendenze usate da make per affidare a processi
diversi la compilazioni di sorgenti indipendenti.
139
questo vale per larchitettura degli ordinari PC a 32 bit, su architetture hardware diverse il file pu`
o cambiare.
140
`e in questo file cio`e che viene mantenuto lelenco completo dei nomi delle funzioni esportate (cio`e rese visibili
anche alle altre funzioni, cos` che queste possano chiamarle) allinterno del kernel, sia quelle presenti nellimmagine
di avvio che quelle presenti nei moduli.
141
la funzionalit`
a di per se non `e essenziale, ma senza questa informazione diventa molto complesso per chi sviluppa il kernel capire dove si `e verificato lerrore, ed anche pi`
u difficile per voi chiedere aiuto o cercare informazioni
relativamente allerrore stesso.
137

5.2. LA GESTIONE DI KERNEL E MODULI

299

limmagine del kernel questo viene di norma copiato su /boot appendendo un - e la versione;
questo fa s` che ogni kernel sia in grado di trovare ed utilizzare la sua mappa dei simboli.
Target
config
oldconfig
menuconfig
xconfig
dep
depend
zImage
bzImage
vmlinux
modules
modules_install
clean
mrproper
distclean

install
rpm
deb-pkg

Significato
interfaccia di configurazione a linea di comando.
interfaccia di configurazione a linea di comando, che riutilizza i valori
precedentemente immessi.
interfaccia di configurazione a grafica testuale, basata sulle librerie
ncurses.
interfaccia di configurazione grafica.
crea le dipendenze per la compilazione e le informazioni per il
versionamento dei moduli, inutile per i kernel della serie 2.6.x.
identico a dep.
crea una immagine compressa del kernel (valida su tutte le
architetture).
crea una immagine compressa del kernel (su architettura PC) con una
diversa procedura di avvio.
crea una immagine non compressa del kernel.
compila i moduli.
installa i moduli nella relativa directory.
cancella tutti i file oggetto (i .o) presenti prodotti da una predente
compilazione.
oltre a quanto esegue clean, cancella anche le informazioni sulle
dipendenze.
oltre a quanto esegue mrproper e cancella ulteriori file prodotti cercando
di riportare lalbero dei sorgenti identico allo stato immediatamente
dopo la scompattazione.
esegue linstallazione del kernel.
crea un pacchetto RPM contenente limmagine del kernel.
crea un pacchetto Debian contenente immagine del kernel e moduli.

Tabella 5.20: Principali target del comando make per la compilazione del kernel.

Infine `e buona norma, tutte le volte che si installa un nuovo kernel, mantenere traccia anche
delle opzioni di configurazione con cui lo si `e prodotto;142 questo comporta la necessit`a di salvare
il contenuto del corrispondente file .config e di norma lo si fa (questa ad esempio `e la scelta di
Debian) copiandolo sempre sotto /boot, ed assegnandogli, usando la stessa convenzione usata
per la mappa dei simboli e limmagine del kernel, un nome nella forma config-versione.
In tab. 5.20 si sono riportati i principali target di make usati per la compilazione e linstallazione del kernel dai sorgenti; in questo caso la documentazione non `e disponibile in una
pagina di manuale, ma si pu`
o trovare una lista completa dei vari target disponibili nel capitolo
10 di [LinuxNutshell].
Ricapitolando, linsieme dei vari passi per ottenere un nuovo kernel ed installare tutti i file
relativi, se si usa un kernel della serie 2.4.x o precedente, dovr`a essere qualcosa del tipo:
make menuconfig
make dep
make bzImage
make modules
make modules_install
cp arch/i386/boot/bzImage /boot/vmlinuz-2.4.24-my
cp System.map /boot/System.map-2.4.24-my
cp .config /boot/config-2.4.24-my
142

tanto che nella serie 2.6.x `e possibile far generare direttamente al kernel stesso il contenuto di detto file, posto
che si sia abilitato il relativo supporto durante la compilazione (opzione Kernel .config support in General
setup).

300

CAPITOLO 5. AMMINISTRAZIONE STRAORDINARIA DEL SISTEMA

mentre se il kernel `e della serie 2.6.x la procedura si potr`a ridurre a:


make menuconfig
make
make modules_install
cp arch/i386/boot/bzImage /boot/vmlinuz-2.6.25.10-my
cp System.map /boot/System.map-2.6.25.10-my
cp .config /boot/config-2.6.25.10-my
dopo di che occorrer`
a configurare il proprio bootloader (vedi sez. 5.3) per luso del nuovo kernel.
Si tenga presente per`
o che il procedimento appena illustrato pu`o funzionare soltanto se
nel kernel si `e inserito direttamente il supporto necessario a montare la radice, vale a dire sia
il supporto per la classe di dispositivi su cui si trova il filesystem (ed eventualmente per lo
specifico hardware che ne consente laccesso) che per il filesystem stesso. In caso contrario una
volta lanciato il kernel non sar`
a in grado di montare la radice, e ci si trover`a di fronte ad una
brusca interruzione della procedura di avvio con un kernel panic.
Tutto questo, una volta che si conosca lhardware specifico della propria macchina, non `e un
problema,143 baster`
a inserire allinterno del kernel il relativo supporto. Lo `e per`o quando, come
accade per i kernel standard forniti dalle distribuzioni, il kernel deve poter funzionare con una
macchina generica; in tal caso infatti si dovrebbero inserire allinterno del kernel tutti i possibili
driver per tutti i possibili tipi di hardware,144 la gran parte dei quali poi sarebbe inutilizzato ed
occuperebbe inutilmente una risorsa preziosa come la RAM.
Benche sia possibile seguire questo approccio, e rimandare ad una successiva ricompilazione
linstallazione di un kernel pi`
u adatto alla propria specifica macchina, la gran parte delle distribuzioni utilizza un approccio diverso che passa attraverso lutilizzo di quello che in gergo viene
chiamato un ramdisk iniziale, o initrd. In questo caso quello che si fa `e inserire nel kernel soltanto il supporto per questo unico tipo di dispositivo che viene montato come radice provvisoria
durante lavvio.
` allinterno del ramdisk che viene installato un sistema minimale che si incarica di caricare
E
i moduli necessari e compiere le operazioni necessarie ad accedere al dispositivo su cui si trova
la radice. A questo punto sar`
a possibile montare la radice reale del sistema, e, tramite un
145
apposito comando,
renderla la nuova radice, da cui eseguire lordinario avvio descritto in
sez. 5.3.5, liberando al contempo la memoria utilizzata dal ramdisk e non pi`
u necessaria.
Perche questa procedura funzioni con un kernel generico occorre ovviamente poter generare
un ramdisk appropriato. Nelloriginario initrd questo veniva creato come immagine di un filesystem146 in cui si era inserito tutto il necessario. A partire dai kernel della serie 2.6.x invece
`e presente un nuovo meccanismo, chiamato initramfs, che fornisce il supporto per creare un
ramdisk vuoto e popolarlo automaticamente con il contenuto di un archivio cpio compresso con
gzip,147 ed `e questo il meccanismo usato oggi da tutte le principali distribuzioni.
Qualunque sia il metodo occorre comunque poter creare un appropriato ramdisk iniziale che
contenga, oltre a tutti i moduli che possono servire, anche tutti i programmi e le relative librerie
143

a parte ovviamente la necessit`


a di individuare quali sono le opzioni di configurazione che corrispondono al
supporto per il proprio hardware, cosa talvolta non banale.
144
ad esempio con le comuni macchine odierne sarebbe necessario il supporto per tutti i possibili chipset serial
ATA.
145
il comando si chiama pivot_root, come la omonima system call, ed `e specifico di Linux; una volta che la
radice reale sia stata montata in una directory allinterno di quella provvisoria il comando consente di rendere
questa la nuova radice del sistema.
146
in genere venivano usati filesystem minimali come cramfs o romfs ed ovviamente doveva essere inserito
direttamente nel kernel il relativo supporto.
147
non `e pertanto necessario inserire nel kernel il supporto per nessun filesystem specifico, ma solo quello per
luso del ramdisk iniziale.

5.2. LA GESTIONE DI KERNEL E MODULI

301

che consentano di caricarli per accedere al dispositivo, montare la radice reale, e eseguire da
questa la procedura di avvio ordinaria. Per questo motivo ogni distribuzione mette a disposizione
un suo programma che consente di creare, dopo aver installato un nuovo kernel, un opportuno
ramdisk ad esso associato.
Il comando usato originariamente sia su sistemi RedHat che Debian era mkinitrd.148 Si
trattava comunque, nonostante il nome fosse lo stesso, di programmi diversi funzionanti in
maniera diversa; tratteremo solo la versione di mkinitrd usata da RedHat e derivate dato che `e
la sola sopravvive ancora oggi e che non `e altro che uno script di shell che si cura della generazione
del ramdisk. Il comando prevede due argomenti, il primo `e il nome del file su cui verr`a creato
il ramdisk ed il secondo la versione del kernel per cui crearlo (per quella corrente `e sufficiente
usare il risultato di uname -r).
Il comando supporta una serie di opzioni che consentono di omettere alcune classi di moduli,
per ridurre le dimensioni del ramdisk qualora si sappia per certo che queste non servano (ad
esempi i moduli per i dischi SCSI). Si pu`o inoltre specificare una lista di moduli da aggiungere
o togliere, ed ulteriori opzioni per controllare il formato del ramdisk e le sue modalit`a di funzionamento, per le quali si pu`
o consultare la pagina di manuale. Lunica opzione che vale la pena
citare `e -f che consente di sovrascrivere un file esistente.
Nel caso di mkinitrd viene sempre generato un ramdisk che contiene i moduli strettamente
necessari allavvio della propria macchina, cos` come sono stati determinati durante linstallazione della stessa. Lo script di avvio del ramdisk si limita a caricali, in modo da montare la radice
reale e poi far proseguire lordinaria procedura di avvio. Si deve pertanto stare attenti qualora si
sposti il disco del sistema su unaltra macchina, perche non `e detto che i moduli necessari siano
gli stessi, nel qual caso non si sarebbe pi`
u in grado di avviare la macchina.149
Per superare questi problemi, e fornire un meccanismo che consenta lavvio su una macchina
generica, Debian e derivate hanno sostituito mkinitrd con mkinitramfs,150 un programma che
permette di creare un ramdisk in cui sono presenti tutti i moduli necessari ad effettuare lavvio da
un dispositivo generico. Questo significa che saranno presenti non solo i moduli per il supporto
delle diverse schede SCSI o dei vari chipset per il serial ATA, ma anche quelli per luso di
dispositivi virtuali il RAID software (vedi sez. 6.1) o LVM (vedi sez. 6.2) e quelli necessari per
lavvio via rete. Inoltre saranno presenti anche i moduli per i vari filesystem utilizzabili per la
radice, ed infine un sistema minimale con tutto loccorrente per determinare quali sono i moduli
da caricare per montare la radice reale ed eseguire lavvio definitivo.
Per creare un nuovo ramdisk occorre invocare il programma specificando con lopzione -o il
file su quale si vuole scriverlo. Se non si indica altro viene sottinteso luso del kernel corrente,
altrimenti occorrer`
a indicarne esplicitamente la versione come argomento. Per le altre opzioni e
la documentazione completa si consulti al solito la pagina di manuale.
Lo svantaggio di mkinitramfs `e che il ramdisk iniziale creato `e in genere di dimensioni
maggiori, anche se `e possibile indicare al programma di inserirvi soltanto lo stretto indispensabile
o escludere alcune classi di moduli se si sa che questi non serviranno. Il vantaggio, oltre alla
disponibilit`
a dei vari moduli che consentono di avviare lo stesso kernel anche con macchine
diverse, `e quello che nel ramdisk `e presente un sistema minimale dotato di una sua shell ed un
sottoinsieme di comandi a cui si viene portati in caso di problemi, il che consente di operare
manualmente e tentare un recupero se qualcosa non funziona.
Il comportamento di mkinitramfs `e controllato dal rispettivo file di configurazione che `e
/etc/initramfs-tools/initramfs.conf, il formato del file `e quello di una serie di dichiarazioni
148

si tenga presente che nonostante il nome, la versione in uso nelle distribuzioni recenti utilizza il nuovo meccanismo di initramfs, anche se quella usata da RedHat e CentOS `e in grado di produrre ramdisk anche con il vecchio
meccanismo per kernel della serie 2.4.x.
149
lo stesso dicasi qualora si volesse riutilizzare il kernel ed il relativo ramdisk su una macchina diversa.
150
nel caso di Debian `e presente pure il programma update-initramfs che semplifica la creazione dei ramdisk per
i kernel installati sotto /boot; entrambi con i loro file di configurazione fanno parte del pacchetto initramfs-tools.

302

CAPITOLO 5. AMMINISTRAZIONE STRAORDINARIA DEL SISTEMA

di variabili di shell, che controllano il comportamento di mkinitramfs.151 In generale non c`e da


modificare nulla, il file `e comunque ben commentato ed anche per lui `e disponibile una pagina
di manuale.
Infine una ulteriore alternativa `e costituita dal comando yaird, che a differenza dei precedenti nasce come progetto indipendente disponibile per qualunque distribuzione. La filosofia del
programma `e simile a quella di mkinitrd, cio`e mira a creare un ramdisk iniziale di dimensioni
minime che contenga soltanto lo stretto indispensabile. Contrariamente a mkinitrd il programma esegue una serie di controlli estesi,152 volti ad assicurarsi che il ramdisk prodotto sia adatto
allhardware effettivamente presente sulla propria macchina ed assicuri un avvio senza problemi,
senza i quali si rifiuta di creare limmagine.
Il comando deve essere invocato o con lopzione --output tramite la quale si indica il file
su cui produrre limmagine, o con lopzione --test che esegue soltanto un controllo sul sistema
per verificare la capacit`
a di produrre il ramdisk. Come argomento si deve specificare la versione
di kernel per cui creare il ramdisk e come per mkinitramfs se non si specifica nessun argomento
verr`a usata la versione corrente. Per le altre opzioni ed i dettagli si rimanda di nuovo alla relativa
pagina di manuale.
Qualunque sia il programma utilizzato, se si `e deciso di optare per un kernel da avviare con
lausilio di un ramdisk, lultimo passo dellinstallazione manuale `e sempre quello di copiare il
file dellimmagine sotto del ramdisk nella directory /boot con un nome adeguato (in genere si
usa qualcosa del tipo initrd-versione) per poi essere in grado di farlo utilizzare al bootloader
(vedi sez. 5.3.3 e 5.3.4).

5.2.5

La gestione dei moduli

Abbiamo gi`a sottolineato come una delle caratteristiche pi`


u significative del kernel Linux sia il
supporto modulare che consente di aggiungere funzionalit`a e supporto di periferiche anche dopo
lavvio caricando gli opportuni moduli. Ma oltre alla possibilit`a di effettuare questa operazione
in maniera manuale, fin dalla nascita del supporto modulare era anche il kernel stesso ad essere in grado di effettuare autonomamente, ad esempio in corrispondenza della richiesta di una
funzionalit`a mancante, il caricamento degli eventuali ritenuti necessari.153
Nelle prime versioni del kernel questo era realizzato attraverso un apposito demone, kerneld,
che riceveva le richieste dal kernel ed eseguiva il caricamento dei moduli. A partire dalla serie
2.4.x il meccanismo `e stato realizzato con un apposito sottosistema del kernel, chiamato kmod.
Tramite questo allinterno del kernel diventa possibile invocare una apposita funzione che dato
il nome del modulo che si vuole caricare154 si incarica di mettere in esecuzione un programma
in user space in grado di eseguire tutte le operazioni necessarie al caricamento dello stesso.155
Per questo motivo, oltre a quanto illustrato nei paragrafi precedenti riguardo configurazione,
compilazione ed installazione del kernel per il supporto modulare, per poter utilizzare a pieno
questultimo sono necessari anche tutti quei programmi in user space che permettono di gestire
i moduli stessi (ed in particolare il loro caricamento) che sono raccolti in un apposito pacchetto
che viene distribuito coi sorgenti del kernel.
Inoltre con i kernel della serie 2.6.x la gestione dei moduli `e stata completamente ristrutturata, e a quanto appena illustrato `e stata affiancata una ulteriore infrastruttura in user space
151

come `e naturale dato che questultimo `e uno script di shell.


svolti tramite i dati ottenuti dal filesystem /sys.
153
a partire dalla serie 2.6.x in realt`
a il meccanismo prevede che per il supporto ai dispositivi i moduli siano
caricati in corrispondenza al riconoscimento degli stessi.
154
la funzione si chiama request_module, ed in realt`
a con essa si possono richiedere non soltanto dei moduli
specifici ma anche delle funzionalit`
a generiche, sempre identificate da un nome, che poi possono essere fatte
corrispondere, anche a moduli diversi.
155
a partire dalla serie 2.4.x il programma `e modprobe, che tratteremo in dettaglio pi`
u avanti, ma si pu`
o utilizzare
al suo posto un programma qualsiasi scrivendo il relativo pathname assoluto in /proc/sys/kernel/modprobe.
152

5.2. LA GESTIONE DI KERNEL E MODULI

303

(vedi sez. 5.4.5) che oltre alla creazione dinamica dei file di dispositivo sotto la directory /dev
sulla base dellhardware effettivamente presente sulla propria macchina, fosse in grado di gestire
la rilevazione dei dispositivi presenti, compresa quella occasionale dei dispositivi rimuovibili, ed
il caricamento contestuale dei moduli necessari per il relativo funzionamento.
Nellambito di questa ristrutturazione linterfaccia per il caricamento dei moduli `e stata
drasticamente semplificata, ed ora la gran parte del lavoro viene effettuata allinterno del kernel.
Per questo i programmi per la gestione dei moduli sono stati completamente riscritti, e rilasciati
nel pacchetto modules-init-tools. I nuovi programmi garantiscono comunque la compatibilit`
a
allindietro con i precedenti del pacchetto modutils, chiamando questultimi quando invocati
con un kernel della serie 2.4.x.156
Il programma che consente di caricare un modulo allinterno del kernel, in modo da poterne
usare le funzionalit`
a, `e insmod. Fino alla serie 2.4.x era il programma stesso che leggeva il codice
dal disco, effettuava la risoluzione dei simboli, controllando che questi fossero compatibili con
la versione del kernel in esecuzione, ed infine eseguiva il collegamento al codice del kernel. Con
la serie 2.6.x il lavoro di controllo dei simboli ed il collegamento viene operato direttamente dal
kernel stesso, per cui il comando non `e che un programma minimale che legge il file contenente
il codice del modulo che si vuole utilizzare e lo passa alla nuova versione della system call del
kernel che gestisce il caricamento.157
Si tenga presente per`
o che insmod consente di inserire nel kernel solo un modulo alla volta e
che per farlo ha bisogno di risolvere tutti i simboli (vale a dire le funzioni chiamate allinterno del
codice del modulo) necessari al modulo stesso. Se alcuni di questi non sono presenti nel kernel
in esecuzione, ma disponibili soltanto attraverso altri moduli non ancora caricati, il comando
per questo motivo che non si usa quasi mai
fallir`a con un errore di unresolved symbol. E
insmod direttamente per caricare un modulo, ma lo si fa attraverso modprobe, che vedremo a
breve.
Se un modulo li prevede, possono essere specificati come ulteriori argomenti del comando dei
parametri di configurazione nella forma parametro=valore,158 dove parametro dipende dal
modulo stesso,159 ed valore pu`
o essere una stringa, un numero intero, o una lista di numeri
interi separati da virgole; i numeri inoltre sono specificabili sia in forma decimale (17), che ottale
(021), che esadecimale (0x11).160
Con i kernel della serie 2.4.x il comportamento del programma `e invece pi`
u complesso, in
161
quanto in tal caso il comando prende come argomento solo il nome del modulo,
e per trovare
il file il comando cerca il corrispondente file oggetto sotto la directory /lib/modules/uname
-r, a meno che non sia stata definita la variabile di ambiente MODPATH o si sia specificata una
diversa opzione nel file di configurazione /etc/modules.conf per indicare una directory diversa.
Per i restanti argomenti la sintassi resta invariata nelle diverse versioni e si possono specificare
i parametri per il modulo esattamente come illustrato in precedenza.
A differenza della versione per i kernel 2.6, la versione di insmod usata per i kernel della
serie 2.4.x supporta anche una serie di opzioni che ne modificano il comportamento; ad esempio
come norma di sicurezza insmod non carica i moduli se i relativi file non appartengono allamministratore, onde evitare che il contenuto di un modulo possa essere sovrascritto in caso di
156

questo viene fatto chiamando per ciascun programma viene eseguito, in maniera del tutto trasparente per
lutente, un corrispondente comando con estensione .old (o .modutils a seconda della versione).
157
questa si chiama init_module, e si limita a prendere da un buffer il codice del modulo letto dal file, e gli
eventuali parametri passati come stringa.
158
si tenga presente che ogni argomento aggiuntivo viene interpretato come parametro, per cui si abbia cura di
non inserire spazi prima e dopo lassegnazione con =.
159
la lista dei parametri disponibili per ciascun modulo si pu`
o ottenere tramite il comando modinfo, che
tratteremo a breve.
160
vale a dire scrivendoli normalmente, apponendovi uno zero per lottale, ed uno 0x per lesadecimale.
161
in questo caso non serve il pathname completo, ma solo il nome, che si ricordi `e nella forma nome.o (lestensione
.ko `e stata introdotta con i kernel 2.6.x).

304

CAPITOLO 5. AMMINISTRAZIONE STRAORDINARIA DEL SISTEMA

compromissione dellutente cui appartiene, con la conseguente possibilit`a di far eseguire direttamente al kernel il codice che si vuole; questo comportamento pu`o essere disabilitato con lopzione
-r (ad uso principalmente degli sviluppatori).
Inoltre in questo caso `e insmod che controlla che la versione del kernel corrente e quella del
modulo combacino per evitare di caricare moduli che appartengano a kernel diversi, e questo
comportamento pu`
o essere disabilitato con lopzione -f. Si tenga presente per`o che specificando
questa opzione viene evitato soltanto il controllo sulla versione del kernel, il controllo sulluso
dei nomi dei simboli non pu`
o essere evitato, questo significa che se si sono compilati i moduli
con il supporto per il versionamento (che crea dei nomi di simboli contenenti una checksum) non
sar`a comunque possibile utilizzarli.162
Come accennato insmod (qualunque sia la sua versione) consente di inserire un modulo solo
quando tutti i simboli di cui questo ha bisogno possono essere referenziati; questo comporta
che se alcuni di questi sono definiti da un altro modulo non ancora caricato il caricamento
fallir`a. Occorrer`
a pertanto identificare tale modulo e caricarlo prima dellaltro, e se anche
questo dipender`
a da simboli presenti in altri moduli, ripetere la procedura. Per ovviare a tutto
questo, ed automatizzare il caricamento dei moduli, `e stato allora creato un secondo comando,
modprobe, che permette di risolvere le dipendenze, trovare quali sono gli altri moduli che servono
per poter utilizzare quello richiesto, e caricare preventivamente anche questi.
Il meccanismo tramite cui modprobe `e in grado di risolvere le dipendenze si basa sul contenuto
del file modules.dep posto nella directory in cui sono installati i moduli. Questo file viene di
norma prodotto in fase di installazione degli stessi tramite il comando depmod (su cui torneremo
pi`
u avanti) ed ha un formato del tipo:
/lib/modules/2.6.25/kernel/fs/ext2/ext2.ko: /lib/modules/2.6.25/kernel/fs/mbcache.ko

che ricalca esattamente quello di un Makefile; per ciascun modulo che ha delle dipendenze nel
file `e presente una riga contenente la lista degli altri moduli da cui esso dipende, che modprobe
si incaricher`a di caricare preventivamente.
Come per la vecchia versione di insmod anche modprobe effettua la ricerca dei moduli da caricare fra quelli compilati per il kernel corrente, sotto /lib/modules/uname -r, dove vengono
installati dallesecuzione di make modules_install. A partire dal kernel 2.4 tutti i moduli sono
installati sotto la directory kernel, e allinterno di questa suddivisi in ulteriori directory per
categorie. Queste sono:163 fs per il supporto dei filesystem, arch per i moduli specifici per la
propria architettura hardware, driver per il supporto delle periferiche, net per il supporto dei
protocolli di rete, crypto per gli algoritmi di crittografia, sound per linfrastruttura di gestione
dellaudio, security per le estensioni di sicurezza. A loro volta i moduli installati sotto drivers
sono suddivisi in altre sottodirectory per tipologia di hardware.
Come avvenuto per insmod anche modprobe `e stato modificato nella ristrutturazione della
gestione dei moduli effettuata con il passaggio ai kernel della serie 2.6.x, e di nuovo se il comando
rileva luso di un kernel della serie 2.4.x chiamer`a in maniera automatica e trasparente allutente
la versione precedente. Nel seguito faremo riferimento alla versione di modprobe in uso con i
kernel della serie 2.6.x, che ormai sono stati adottati da tutte le principali distribuzioni, ma in
questo caso, a parte alcune opzioni, non si hanno differenze significative per quel che riguarda
la sintassi ordinaria del comando.
Lutilizzo pi`
u comune di modprobe prevede che gli si passi come argomento il nome del modulo
da caricare, stavolta senza estensioni e senza fare riferimento ad un pathname; per comodit`a
inoltre il comando non distingue fra i caratteri - e _ qualora essi siano presenti nel nome del
modulo. Se modprobe rileva la necessit`
a di caricare altri moduli come dipendenze del modulo
162

questo meccanismo non esiste pi`


u nel kernel 2.6, per il quale viene usata una checksum interna che pu`
o essere
ignorata.
163
al momento della stesura di queste dispense, con riferimento al kernel 2.6.26.

5.2. LA GESTIONE DI KERNEL E MODULI

305

indicato provveder`
a a farlo in maniera automatica. Dato che il lavoro effettivo di caricamento
del modulo `e fatto dal kernel stesso, modprobe non `e in grado di riportare nessun errore specifico
sui motivi per i quali il caricamento fallisce; in questo caso sar`a necessario consultare i messaggi
del kernel nei file di log o con dmesg.
Come per insmod anche con modprobe si possono specificare negli argomenti successivi gli
eventuali parametri da passare al modulo che viene caricato, il vantaggio di modprobe `e che
attraverso luso del suo file di configurazione, come vedremo a breve, si possono impostare dei
valori di default da assegnare a questi argomenti, senza doverli pi`
u scrivere esplicitamente.
Oltre a caricare un modulo modprobe, se invocato con lopzione -r, `e anche in grado di
rimuoverlo; in questo caso, se i moduli da cui quello rimosso dipende non sono utilizzati, il
comando cercher`
a di rimuovere anche quelli. Inoltre a differenza dellinserimento, se si richiede
la rimozione si possono specificare negli argomenti anche pi`
u di un modulo alla volta. Si tenga
presente infine che se il modulo `e utilizzato il comando fallir`a.
Una seconda opzione importante `e -f che consente di forzare linserimento di un modulo
anche qualora questo non corrisponda alla versione del kernel corrente. Nel caso del kernel 2.6
il controllo avviene sia attraverso luso di apposite informazioni sulla versione di salvate quando
`e stato abilitato il relativo supporto nel kernel (vedi sez. 5.2.3), che tramite una stringa di informazioni (detta vermagic) che viene mantenuta comunque allinterno del modulo.164 Lopzione
consente di eliminare tutte queste informazioni, consentendo il caricamento del modulo. Dato
che nel passaggio da una versione allaltra del kernel possono essere state introdotte delle differenze non banali una operazione di questo tipo `e rischiosa, e pu`o dar luogo, nella peggiore delle
ipotesi, anche ad un crash del sistema.
Le altre opzioni principali del comando sono riportate in tab. 5.21, lelenco completo ed una
descrizione dettagliata delle stesse `e come sempre disponibile nella pagina di manuale, accessibile
con man modprobe.
Opzione
-a
-n
-r
-v
-C
-i
-c
-f

Significato
consente di indicare come argomenti una lista di moduli
da caricare.
esegue tutta la procedura eccettuato il caricamento finale
del modulo.
rimuove il modulo specificato e linsieme di moduli da cui
esso dipende.
abilita la stampa di un maggior numero di informazioni.
permette di usare un differente file di configurazione (da
passare come parametro per lopzione).
ignora le direttive remove e install del file di
configurazione.
stampa la configurazione di default.
forza il caricamento del modulo anche qualora la versione
non corrisponda a quella richiesta dal kernel corrente.

Tabella 5.21: Principali opzioni del comando modprobe

Come accennato il comportamento di modprobe `e controllato da un opportuno file di configurazione. Fino al kernel 2.4 detto file era /etc/modules.conf,165 e attraverso di esso si
controllavano, oltre al comportamento di modprobe, anche le directory usate da insmod per
cercare i moduli da caricare. Con i kernel della serie 2.6.x la configurazione `e stata spostata in
/etc/modprobe.conf; alternativamente, se detto file non esiste, viene usato al suo posto il con164
sono disponibili anche due opzioni pi`
u specifiche, --force-modversion e --force-vermagic, per ignorare solo
una delle due fonti di informazioni sulla versione.
165
in alcuni sistemi pi`
u vecchi pu`
o essere usato invece il file /etc/conf.modules, che `e deprecato e non deve
essere pi`
u utilizzato.

306

CAPITOLO 5. AMMINISTRAZIONE STRAORDINARIA DEL SISTEMA

tenuto della directory /etc/modprobe.d/, considerando come configurazione la concatenazione


di tutti i file in essa contenuti.166
Sia /etc/modules.conf che /etc/modprobe.conf (che i singoli file di /etc/modprobe.d/)
hanno un formato molto semplice in cui si specifica con una direttiva per riga nella forma di
una parola chiave seguita da eventuali argomenti. Al solito con righe vuote o che iniziano
per il carattere # che vengono ignorate. La differenza principale fra /etc/modules.conf e
/etc/modprobe.conf `e nelle direttive utilizzabili che per questultimo (lunico che tratteremo)
sono quelle illustrate in tab. 5.22; esiste comunque uno script di conversione in caso si voglia
riutilizzare il contenuto di un vecchio modules.conf.
Direttiva
alias

blacklist
include

install

option

remove

Significato
definisce un nome da associare a un modulo, da passare rispettivamente
come primo e secondo argomento; eventuali ulteriori argomenti saranno
utilizzati come parametri per il modulo in fase di caricamento.
richiede che il modulo passato come argomento venga ignorato dal
sistema di caricamento automatico dei moduli.
consente di includere le configurazioni presenti nel file passato come argomento, questo pu`
o essere anche una directory, nel qual caso includer`
a
le configurazioni definite nei file in essa contenuti.
consente a modprobe di eseguire il comando, passato come secondo argomento quando si richiede il caricamento del modulo indicato come
primo argomento.
definisce, per il modulo passato come primo argomento, quali sono
i parametri da utilizzare nel caricamento dello stesso passati negli
argomenti successivi.
analogo ad install ma il comando viene eseguito quando si richiede la
rimozione di un modulo con modprobe -r.

Tabella 5.22: Le direttive del file di configurazione modprobe.conf.

La direttiva principale `e alias, che permette di associare un nome (un alias appunto) ad un
modulo, indicato con il nome del relativo file oggetto, ma senza estensione. In questo modo si pu`o
usare il nome dellalias al posto di quello del modulo nella invocazione di modprobe. La direttiva
svolgeva un ruolo fondamentale nella gestione dei moduli dei kernel della serie 2.4.x dato che
in tal caso buona parte della gestione automatica dei dispositivi veniva realizzata richiedendo il
supporto di una certa funzionalit`
a attraverso luso del sistema di kmod che a sua volta richiedeva
il caricamento dei moduli necessari invocando modprobe con un opportuno identificativo.167
Il problema `e che questo identificativo non era associato direttamente al modulo necessario
(anche quando questo era univoco) e quindi per ottenerne il caricamento occorreva impostare
un alias dentro /etc/modules.conf. Inoltre cera lulteriore problema di sapere quali erano gli
identificativi utilizzati dal kernel per funzionalit`a e dispositivi, e a quali moduli farli corrispondere. Il kernel 2.6 ha reso tutto questo marginale in quanto tutte le volte che il modulo necessario
per una certa funzionalit`
a `e univoco questo viene caricato direttamente, mentre buona parte del
lavoro di identificazione dei dispositivi presenti e caricamento dei moduli necessari al loro uso `e
stato trasferito alla nuova infrastruttura per il rilevamento e la gestione dinamica dellhardware
che vedremo in sez. 5.4.5.
Per questo con modprobe.conf la direttiva alias viene usata per lo pi`
u qualora si voglia
far caricare un modulo a modprobe usando un nome diverso; resta possibile utilizzarla per associare uno specifico modulo ad una specifica richiesta effettuata dal kernel, solo che queste sono
166

con Debian veniva usata la directory /etc/modutils/ per ottenere lo stesso risultato anche con i kernel della
serie 2.4.x, solo che in questo caso il meccanismo prevedeva la generazione di un opportuno /etc/modules.conf a
partire dai contenuti di questa directory tramite il comando update-modules; tutto questo `e stato eliminato nelle
versioni pi`
u recenti con il passaggio al kernel 2.6.
167
vale a dire che con request_module veniva eseguita una richiesta con un identificativo generico associato alla
funzionalit`
a voluta, a cui poi occorreva associare il modulo che la realizzava tramite una direttiva alias.

5.2. LA GESTIONE DI KERNEL E MODULI

307

diventate molto meno comuni. Si tenga presente infine che non si possono definire degli alias a
nomi definiti da un altro alias,168 mentre invece si possono specificare ulteriori argomenti nella
direttiva, che verranno utilizzati come parametri da passare al modulo in fase di caricamento.
Una seconda direttiva molto utilizzata `e option, che prende come argomenti il nome di un
modulo seguito dai parametri da passare al suddetto quando questo viene caricato. Si tenga
presente che i parametri cos` definiti verranno aggiunti a quelli eventualmente specificati con
modprobe sulla riga di comando e a quelli eventualmente definiti in una direttiva alias. La
direttiva `e utile in quanto consente di impostare dei default per i parametri di un modulo in
modo da non doverli scrivere tutte le volte che viene chiamato modprobe.
Una terza direttiva molto importante `e blacklist, che nel caso in cui ci siano pi`
u moduli
che supportano la stessa periferica, consente di evitare che uno di essi, indicato come argomento, venga utilizzato per il supporto della stessa nel caricamento automatico. Questa `e lunica
direttiva che `e specifica del kernel 2.6, infatti `e a partire da esso che fra le informazioni presenti
allinterno di ciascun modulo sono stati inseriti anche gli alias dei dispositivi e delle funzionalit`
a
che questo supporta,169 cos` che il sistema di rilevamento e la gestione dinamica dellhardware
(vedi sez. 5.4.5) possa caricarli in maniera automatica.
Ci sono comunque dei casi in cui una stessa periferica `e supportata da moduli diversi, ma si
sa che uno di questi `e preferibile agli altri; oppure casi in cui non si vuole che una certa periferica,
pur essendo presente, venga attivata automaticamente.170 Leffetto della direttiva blacklist `e
di far ignorare i valori degli alias interni al modulo passato come argomento, cos` che questo non
sia mai caricato automaticamente, pur essendovi dellhardware a cui esso `e in grado di fornire
supporto. Si tenga presente che indipendentemente dalla presenza di una tale direttiva, sar`
a
possibile caricare il modulo con luso esplicito di modprobe.
Infine le due direttive install e remove consentono sostituire rispettivamente il caricamento
o la rimozione del modulo indicato come primo argomento con lesecuzione del comando indicato
come secondo argomento. In questo modo diventa possibile effettuare operazioni anche molto
complesse (il comando pu`
o essere anche uno script di shell) contestualmente al caricamento o
alla rimozione del modulo scelto. Occorrer`a per`o, perche poi il modulo alla fine venga caricato o
rimosso davvero, rieseguire modprobe allinterno del comando eseguito,171 utilizzando lopzione
-i per disabilitare leffetto di queste direttive.
Come accennato per il funzionamento di modprobe occorre che nella directory dei moduli sia
` grazie a questo file
presente il file modules.dep che identifica le dipendenze fra i vari moduli. E
che `e possibile determinare quali sono i moduli che contengono i simboli necessari ad un altro
modulo, cos` da poter effettuare il caricamento di tutti quelli che servono nella giusta sequenza.
Questo file viene creato tramite il comando depmod che esegue una scansione di tutti i moduli
installati, identificando quali sono i simboli forniti ed utilizzati da ciascuno, per costruire cos` le
relative dipendenze.172
Se invocato senza argomenti depmod esamina i moduli relativi al kernel corrente, operando sotto /lib/modules/uname -r, ma passandogli come argomento un numero di versione il
comando utilizzer`
a i moduli relativi a tale versione.173 Si possono passare come ulteriori argomenti una lista di file nel qual caso il comando si limiter`a ad esaminare il contenuto degli stessi.
In genere viene specificata anche lopzione -a, che richiede il controllo di tutti i moduli, che
comunque `e sottintesa fintanto che non si specifica una lista di file.
168

questa `e unaltra differenza rispetto a quanto avveniva per /etc/modules.conf.


che possono essere visualizzati, come vedremo a breve, con il comando modinfo.
170
infatti il contenuto tipico del file /etc/modprobe.d/blacklist, dove normalmente si inseriscono queste direttive, `e per lo pi`
u costituito da direttive riguardanti il supporto per le funzionalit`
a di watchdog che non si vuole
siano attivate se non viene esplicitamente avviato anche un demone che le gestisce.
171
ovviamente solo se lo scopo del comando non `e proprio quello di evitare il caricamento del modulo.
172
oltre a modules.dep il comando crea anche altri file, utilizzati dallinfrastruttura di udev (vedi sez. 5.4.5).
173
si suppone ovviamente che essi siano stati installati correttamente sotto /lib/modules.
169

308

CAPITOLO 5. AMMINISTRAZIONE STRAORDINARIA DEL SISTEMA

In genere depmod viene invocato automaticamente quando si installano i moduli con make
modules_install e non `e necessario invocarlo di nuovo a meno che non si sia installato un
qualche altro modulo in maniera indipendente, ad esempio se si sono installati in un secondo
tempo dei moduli non presenti nel kernel che si sta utilizzando per ottenere qualche funzionalit`a
aggiuntiva. Anche in tal caso comunque `e molto probabile che nello script di installazione degli
stessi sia prevista linvocazione del comando.
Lunica opzione degna di nota `e -A che prima di effettuare il calcolo delle dipendenze controlla
preventivamente i tempi dei file, aggiornando modules.dep solo se qualcosa `e cambiato. Per la
descrizione dettagliata del comando, di tutte le altre opzioni e del file di configurazione,174 ad
uso principalmente degli sviluppatori, si pu`o fare riferimento alle rispettive pagine di manuale
accessibili con man depmod e man depmod.conf.
Un altro degli aspetti rilevanti della gestione dei moduli `e la possibilit`a, che abbiamo appena illustrato, di controllarne alcune caratteristiche di funzionamento tramite il passaggio di
opportuni parametri in fase di caricamento. In genere in questo caso il problema maggiore `e
identificare detti parametri ed impostarne un valore appropriato. Ma se riuscire a determinare
il significato dei parametri e dei rispettivi valori pu`o richiedere ricerche pi`
u o meno complesse
nella documentazione del kernel, se non addirittura la consultazione diretta del codice, per poter
iniziare a cercare occorre quantomeno sapere quali sono i parametri supportati.
A questo scopo diventa molto utile il comando modinfo che consente di esaminare il file
oggetto del modulo passato come argomento ed estrarne una serie di informazioni, la principale
delle quali `e la lista dei parametri supportati dal modulo. Un esempio del comando `e il seguente:
anarres:/home/piccardi# modinfo 8139cp
filename:
/lib/modules/2.6.26-1-686/kernel/drivers/net/8139cp.ko
license:
GPL
version:
1.3
description:
RealTek RTL-8139C+ series 10/100 PCI Ethernet driver
author:
Jeff Garzik <[email protected]>
srcversion:
5CF4FE9D06468F0B10B2660
alias:
pci:v00000357d0000000Asv*sd*bc*sc*i*
alias:
pci:v000010ECd00008139sv*sd*bc*sc*i*
depends:
mii
vermagic:
2.6.26-1-686 SMP mod_unload modversions 686
parm:
debug:8139cp: bitmapped message enable number (int)
parm:
multicast_filter_limit:8139cp: maximum number of filtered multic
ast addresses (int)

Loutput del comando riporta una serie di campi, identificati per nome e seguiti da un valore.
Nel caso dei parametri del modulo i campi di interesse sono quelli di tipo parm; nellesempio
allora vediamo come il modulo 8139cp abbia due parametri con valore intero, debug e multicast_filter_limit. Si noti anche come il comando riporti anche le dipendenze del modulo (nel
campo depends) ed una serie di campi alias che dicono a quali classi di dispositivi o funzionalit`a
il modulo `e in grado di fornire supporto.175
Se invocato con lopzione -k, seguita da un identificativo di versione, il comando esaminer`a
il modulo disponibile per quella versione di kernel, piuttosto che quello per il kernel corrente; la
cosa pu`o risultare utile se si vogliono esaminare le informazioni di un kernel che si `e installato
ma non si sta usando. Oltre a questa il comando supporta una serie di opzioni gli permettono di
stampare solo alcune delle informazioni disponibili, al solito per la descrizione completa si pu`o
fare riferimento alla pagina di manuale.
174

che dovrebbe essere /etc/depmod.conf, ma essendo il default del comando assolutamente appropriato alluso
ordinario, di norma questo file non esiste.
175
il nome `e dovuto al fatto che questi campi fanno riferimento proprio ai nomi usati nella direttiva alias di
modprobe.conf per associare un modulo ad una certa funzionalit`
a o dispositivo, e vengono usati dal sistema di
udev (vedi sez. 5.4.5) per il caricamento automatico dei moduli.

5.2. LA GESTIONE DI KERNEL E MODULI

309

Una volta che un modulo non sia pi`


u utilizzato, se ne pu`o richiedere la rimozione. Abbiamo
visto a come questo possa essere fatto in maniera intelligente con lopzione -r del comando
modprobe, che rimuove anche le eventuali dipendenze. Questa funzionalit`a per`o `e presente in
questa forma solo a partire dal kernel 2.6, in precedenza era previsto un comando apposito,
rmmod, che resta ancora come comando di basso livello per la rimozione dei moduli, nello stesso
senso in cui lo `e insmod per linserimento.
Il comando prende come argomento il nome di un singolo modulo di cui esegue la rimozione.
Ovviamente perche questa avvenga con successo il modulo in questione non deve essere in uso, ne
contenere simboli usati da un altro modulo (cio`e non devono esserci altri moduli che dipendano
` comunque possibile, a proprio rischio e pericolo, forzare la rimozione con lopzione
da esso). E
176
-f.
Alternativamente si pu`
o usare lopzione -w che blocca ogni ulteriore utilizzo del modulo
indicato, ma prima di effettuarne la rimozione si ferma in attesa che questo venga liberato da
ogni uso residuo. Per lelenco completo delle opzioni si consulti al solito la pagina di manuale.
Infine per consultare la lista dei moduli caricati in memoria, e ottenere le informazioni relative
al loro stato si pu`
o utilizzare il comando lsmod. Il comando non prende opzioni ne argomenti e
con il kernel 2.6 non `e altro che un semplice programma che formatta in maniera pi`
u leggibile il
contenuto del file /proc/modules. Un esempio del risultato di questo comando `e il seguente:
anarres:/home/piccardi# lsmod
Module
Size
cp2101
11428
usbserial
26472
i915
25280
drm
65256
binfmt_misc
7528
tun
8292
ppdev
6468
parport_pc
22500
lp
8164
parport
30988
autofs4
16420
...

Used by
0
1 cp2101
2
3 i915
1
0
0
0
0
3 ppdev,parport_pc,lp
0

La prima colonna indica il nome del modulo, mentre la seconda le sue dimensioni in memoria.
La terza colonna infine indica se il modulo `e in uso ed `e divisa in due parti; allinizio viene
riportato il numero di riferimenti presenti, che dice quante volte il modulo `e utilizzato, a questo
segue, se ve ne sono, la lista dei nomi degli altri moduli che dipendono da esso. Un valore nullo
del numero di riferimenti indica che il modulo non `e utilizzato e pu`o essere rimosso.
Il comando consente di verificare se un modulo `e in uso, operazione che `e utile fare prima
di richiedere una rimozione che altrimenti fallirebbe. Inoltre con lsmod si pu`o anche verificare
se un modulo `e effettivamente utilizzato, o risulta occupato soltanto a causa della presenza
di dipendenze da esso da parte di altri moduli. In questultimo caso, avendone la lista, li si
potranno rimuovere preventivamente liberando il modulo originario, che a questo punto potr`
a
essere rimosso a sua volta.
Infine un altro file utilizzato da varie distribuzioni nella gestione dei moduli `e /etc/modules,
in cui si pu`
o inserire la lista dei moduli che si vuole siano caricati allavvio del sistema. Il formato
del file `e estremamente semplice, ogni linea deve contenere il nome di un modulo, al solito le
linee vuote o che iniziano per # vengono ignorate. Un possibile esempio del contenuto di questo
file, preso dalla versione installata su una Debian Etch, `e il seguente:
176
per poterla usare si deve avere abilitato in fase di compilazione del kernel lopzione Forced module unloading; una rimozione forzata resta comunque una operazione estremamente pericolosa, perche rimuovendo un
modulo in uso il relativo codice sparisce dal kernel nonostante vi siano riferimenti ad esso, con effetti che possono
molto facilmente causare il crollo completo del sistema.

310

CAPITOLO 5. AMMINISTRAZIONE STRAORDINARIA DEL SISTEMA


# /etc/modules: kernel modules to load at boot time.
#
# This file should contain the names of kernel modules that are
# to be loaded at boot time, one per line. Comments begin with
# a #, and everything on the line after them are ignored.
#ide-floppy
auto
#
# I2C adapter drivers
i2c-isa
i2c-ali15x3
# I2C chip drivers
w83781d
eeprom

In genere si utilizza questo file per forzare il caricamento di un modulo allavvio senza aspettare che questo venga caricato automaticamente. Oltre al file modules, che viene usato per
qualunque kernel, Debian supporta anche la configurazione dei moduli da caricare allavvio di
kernel specifici; ad esempio con il file modules-major, dove major indica il numero di versione
principale, 2.4 o 2.6, si possono indicare i moduli da caricare con i kernel della serie 2.4.x
o 2.6.x, mentre con il file modules-version, dove version indica una versione di kernel177 si
indicano i moduli da caricare allavvio di quella specifica versione.

5.3

La gestione dellavvio del sistema

In questa sezione prenderemo in esame la procedura di avvio del sistema, dettagliando i vari
passaggi che portano dallaccensione della macchina al pieno funzionamento del sistema, e come si
possa intervenire (trattando i vari programmi coinvolti ed i relativi meccanismi di configurazione)
a ciascuno stadio di questa procedura.

5.3.1

Lavvio del kernel

Una delle caratteristiche comuni di tutti i computer moderni `e che questi devono prevedere una
apposita procedura di avvio che porti dalla macchina spenta ad un sistema attivo o funzionante.
Questo consiste in quel processo che in inglese viene chiamato bootstrap, usando unespressione
gergale che fa riferimento al paradosso del sollevarsi da terra tirandosi per i lacci degli stivali,
che sembra analogo al fatto di riuscire a far eseguire un programma ad un computer che quando
parte non ne contiene alcuno.
In realt`a questo non `e vero ed in tutte le piattaforme hardware `e prevista la presenza di
un programma iniziale, che serve appunto a gestire il bootstrap della macchina. Il successo
della procedura `e dovuto ad una caratteristica comune di tutti i processori, che prevede che
quando questi vengono accesi inizino ad eseguire il programma posto ad una specifica locazione
` cura di chi assembla la macchina far corrispondere questa posizione di memoria al
di memoria. E
suddetto programma di gestione dellavvio, che viene mantenuto nella memoria non volatile178
di cui ogni computer moderno `e dotato. In genere si fa riferimento a questo programma con il
nome di firmware, come via di mezzo fra hardware e software.
In generale ogni piattaforma hardware ha un suo firmware specifico per quella stessa piattaforma, ed esiste anche una versione libera e multi-piattaforma di firmware (openfirmware, creato
dalla Sun ed usato anche da Apple e IBM per piattaforme diverse da quelle degli ordinari PC
177

quella impostata in fase di compilazione e riportata da uname -r.


si tratta della ROM, o pi`
u precisamente nella EPROM (in quanto riscrivibile) di cui `e dotata ciascuna piastra
madre.
178

5.3. LA GESTIONE DELLAVVIO DEL SISTEMA

311

compatibili). Nei comuni PC il firmware `e pi`


u noto con il nome di BIOS, acronimo di Basic
Input/Output System, che `e il nome dato al firmware nei primi PC prodotti dalla IBM.
Oggi esistono anche alternative, come EFI,179 o lo stesso Linux che pu`o essere installato
direttamente al posto del BIOS su alcune piastre madri. Nella maggior parte dei casi per`
o
lavvio `e comunque gestito dal BIOS per cui nel seguito faremo riferimento al comportamento
generico di questultimo.
Le modalit`
a con cui il BIOS permette di lanciare un sistema operativo dipendono dalla
versione installata,180 ma in genere tutte le versioni pi`
u recenti permettono di avviare il sistema
da una variet`
a di dispositivi: oggi tutti i BIOS supportano lavvio da floppy, disco e CDROM,181
anche se sulle macchina recenti non `e pi`
u disponibile il floppy. Altre modalit`a di avvio supportate
ormai da tutte le macchine nuove, ma che potrebbero essere assenti su quelle un po pi`
u datate,
sono quella via rete o da chiavetta USB.
In genere il dispositivo da cui effettuare lavvio si pu`o selezionare tramite lapposito menu di
configurazione del BIOS che permette di determinare la sequenza in cui vengono controllati tutti
i dispositivi da cui questo `e possibile. Il primo su cui si trovano dati opportuni verr`a utilizzato,
per cui in genere si mettono in cima alla lista i dispositivi rimuovibili, cos` da non dover cambiare
la configurazione e poterli utilizzare semplicemente inserendoli nella macchina.
La procedura con cui il BIOS pu`o caricare in memoria il sistema operativo dipende ovviamente dal supporto da cui questultimo viene prelevato, nel caso di un floppy il meccanismo `e
molto semplice: il BIOS legge il primo settore ed esegue il programma che ivi contenuto, che
`e quello che deve incaricarsi di eseguire lavvio. Per i CDROM il meccanismo `e lo stesso, solo
che detto settore deve essere letto dalla immagine di un floppy presente allinterno del CD, disponibile qualora questo sia stato masterizzato con le opportune estensioni (le El Torito, vedi
sez. 5.1.7).182
Il caso pi`
u comune comunque `e quello in cui lavvio viene fatto dal disco rigido,183 in questo
caso la procedura prevede che il BIOS legga il primo settore del disco scelto per lavvio,184
(che anche per questo motivo viene chiamato Master Boot Record ), ma a differenza del caso del
floppy, in cui il primo settore conteneva solo il codice da eseguire, nellMBR `e presente anche
la tabella delle partizioni, ed il codice posto in esecuzione deve essere stato installato in una
posizione opportuna.
Come accennato su tutte le macchine recenti il BIOS supporta anche lavvio da chiavette
USB, secondo una modalit`
a denominata USBHDD, in cui queste vengono viste come normali
dischi, e la procedura di avvio `e la stessa.185 Infine nel caso sia disponibile il bootstrap via rete
questo viene eseguito tramite il supporto PXE (Pre-boot eXecution Environment) che consente
di scaricare il programma di avvio da un server tramite gli opportuni protocolli.186
Indipendentemente dal supporto scelto, la caratteristica generale resta quella che il BIOS
non `e in grado di lanciare direttamente il sistema operativo e deve ricorrere ad un programma
esterno, chiamato bootloader, il quale deve essere stato opportunamente installato sui dispositivi
utilizzati per lavvio. Questa `e una limitazione specifica del BIOS che da sempre ha previsto luso
179

vedi http://www.intel.com/technology/efi/, usato ad esempio dai nuovi MacIntosh della Apple.


in pratica ogni produttore ha realizzato una sua variante di BIOS, e anche se una serie di caratteristiche sono
comuni, ci sono anche innumerevoli differenze.
181
anche se alcuni residui di un lontano passato potrebbero non supportare il boot da CD.
182
in sostanza il BIOS vede solo limmagine del floppy contenuta nel CD, che tratta come tale.
183
tipicamente da dischi IDE (ATA o Serial ATA), ma la cosa `e identica per i dischi SCSI, solo che in tal caso in
molti BIOS occorre impostare un avvio specifico su SCSI, ed avere un controller SCSI che supporti la procedura
davvio (oggi lo fanno tutti), le versioni pi`
u recenti dei BIOS inoltre trattano indifferentemente i vari tipi di disco.
184
per BIOS molto vecchi questo poteva essere solo il primo disco IDE, tutti i BIOS pi`
u recenti permettono di
usare anche gli altri dischi.
185
esiste una modalit`
a alternativa denominata USBZIP, usata per avviare da dischi estraibili ZIP su USB, ormai
dismessa ma che che su alcune vecchie macchine pu`
o essere presente lunica disponibile.
186
occorrono i servizi TFTP e DHCP per mettere a disposizione tutti i dati necessari.
180

312

CAPITOLO 5. AMMINISTRAZIONE STRAORDINARIA DEL SISTEMA

di un bootloader separato per effettuare lavvio del sistema operativo; questa limitazione non `e
presente nei firmware di altre piattaforme hardware che sono in grado di lanciare direttamente
il sistema operativo, in genere caricandolo da una apposita partizione, con una gestione che per
questo risulta notevolmente semplificata.
In generale il bootloader `e un programma elementare il cui unico compito `e quello di trovare il
sistema operativo,187 caricarlo in memoria ed eseguirlo, passandogli eventuali parametri di avvio.
Si tenga presente che un bootloader oltre che nel Master Boot Record, pu`o essere installato anche
nel settore iniziale di una partizione. Questo permette allora di concatenare pi`
u bootloader
in modo che il primo lanci il successivo, e cos` via e in particolare questa `e la tecnica usata
normalmente per lanciare il bootloader di Windows da parte dei bootloader usati per Linux.
Una delle caratteristiche di Linux, essendo in fin dei conti anche il kernel un programma,
`e che allavvio gli si possono passare degli argomenti, solo che in questo caso non esiste una
riga di comando da cui darglieli, se non quella che pu`o mettere a disposizione il bootloader,188
per questo tutti i bootloader usati per lanciare Linux (che tratteremo nei prossimi paragrafi)
prevedono anche una modalit`
a per eseguire questo compito.
In genere gli argomenti passati al kernel servono ad impostare parametri per alcuni sottosistemi o ad attivare o disabilitare funzionalit`a specifiche allavvio. Essi vengono espressi nella
stessa forma dei parametri per i moduli illustrati in sez. 5.2.5,189 sia come singola parola chiave,
che nella forma chiave=valore, dove valore pu`o essere un numero, una stringa, o una lista
separata da virgole.
In tab. 5.23 si `e `e riportato un elenco degli argomenti del kernel pi`
u rilevanti nelluso comune
ed il relativo significato, si pu`
o trovare una lista pi`
u completa nel file kernel-parameters.txt
della documentazione allegata ai sorgenti del kernel190 o nel boot-prompt-HOWTO.
Argomento
initrd=file

root=dev
init=command
console=dev
ro
single
noapic
quiet
rootdelay
nosmp
noacpi
mem=size

Significato
specifica un RAM disk iniziale che verr`
a usato come radice provvisoria;
in realt`
a questo parametro viene utilizzato solo dal bootloader che ha
anche il compito di interpretare il significato di file per ottenere i dati
del ramdisk.
specifica (in genere col nome del file di dispositivo) il disco (o la
partizione) da montare come radice.
specifica il programma da lanciare come primo processo del sistema (di
default `e /sbin/init).
specifica un file di dispositivo da usare come console per i messaggi del
kernel.
allavvio monta la directory radice in sola lettura.
indica ad init di andare in single user mode (vedi sez. 5.3.6).
disabilita luso delle I/O APIC (vedi sez. 5.4.1).
disabilita la stampa sulla console della maggior parte dei messaggi del
kernel.
numero di secondi da attendere prima di tentare di montare la radice
(utile per dischi lenti a partire).
disabilita il funzionamento in modalit`
a multiprocessore.191
non utilizza ACPI per linstradamento degli interrupt di processore.
imposta la dimensione della memoria da utilizzare, veniva utilizzato per
soprassedere il malfunzionamento del sistema di auto-rilevamento del
kernel.

Tabella 5.23: Principali argomenti per la linea di comando del kernel.


187

nel caso di Linux questo significa trovare limmagine del kernel e, se lo si usa, del ramdisk.
che in questo caso svolge il ruolo della shell, e deve anche essere in grado, per alcuni argomenti, di fornire una
opportuna interpretazione.
189
anche perche i moduli che supportano luso di parametri a cui assegnare un valore in fase di caricamento (vedi
sez. 5.2.5), qualora compilati allinterno del kernel riceveranno detto valore in questo modo.
190
la lista `e solo parziale, e riguarda solo i parametri del kernel, quelli dei moduli e quelli relativi ad architetture
specifiche sono riportati in altri file sempre sotto la directory Documentation allegata ai sorgenti.
188

5.3. LA GESTIONE DELLAVVIO DEL SISTEMA

313

In alcuni casi per`


o pu`
o essere necessario usare degli argomenti di avvio diversi da quelli
preimpostati; uno dei pi`
u comuni `e quello in cui si deve usare largomento root per cambiare il
dispositivo da usare come radice (ad esempio perche si `e spostato il disco, o si vuole fare lavvio
da una partizione diversa) oppure occorre usare largomento init per specificare un programma
di avvio diverso da /sbin/init.192
A parte questi laltro parametro pi`
u usato `e console che consente di specificare il dispositivo
relativo ad una console su cui dirigere i messaggi del kernel (viene usato in particolare per
mandare i messaggi sulla linea seriale, a cui si potr`a accedere con un modem). Una volta
avviato il sistema `e comunque possibile ottenere la quale linea di comando con la quale `e stato
avviato il kernel, dato che questultima viene riportata nel contenuto del file /proc/cmdline.
Infine pu`
o capitare, in particolare con alcune schede madri e BIOS difettosi, di dover disabilitare alcune funzionalit`
a del kernel che altrimenti possono causare un blocco dellavvio dello
stesso a causa di alcuni bug; per questo motivo in certi casi pu`o essere necessario far partire il
kernel disabilitando alcune funzionalit`a, ad esempio disabilitando il sistema di APIC
Una volta avviato il kernel effettuer`a una serie di operazioni preliminari, come le inizializzazioni delle infrastrutture generiche, e dei dispositivi il cui supporto `e stato compilato direttamente
nel kernel. Una volta completata linizializzazione dellhardware tutto quello che resta da fare `e
semplicemente montare il dispositivo su cui si trova la directory radice e lanciare il programma
di avvio del sistema, che di norma `e /sbin/init, a meno che non si stia utilizzando un ramdisk di avvio, nel qual caso invece verr`a lanciato il programma di avvio dello stesso al posto di
/sbin/init. Le operazioni di avvio comunque, per quanto riguarda il kernel, si concludono con
il lancio di init, tutto il resto verr`
a eseguito da questultimo in user space.

5.3.2

Il bootloader SYSLINUX

Il bootloader SYSLINUX viene per lo pi`


u utilizzato per creare le immagini di avvio usate per
193
floppy o CDROM;
`e ad esempio quello usato nei dischi di installazione di molte distribuzioni
(come Debian). Per questo scopo viene utilizzato anche sulle chiavette USB; inoltre la sua
variante PXELINUX, `e molto diffusa come programma per gestire lavvio via rete.194
Il programma deve la sua popolarit`a alla relativa semplicit`a con cui consente di creare immagini di avvio, in una tipologia di utilizzo cio`e in cui non `e molto importante avere una grande
flessibilit`
a nel cambiare la versione di kernel da avviare, come avviene per un CDROM o una
chiavetta di installazione.
Uno dei suoi punti di forza `e che i dati da cui creare limmagine davvio vengono mantenuti
in un filesystem FAT, cosa che lo rende facilmente utilizzabile anche per luso diretto su chiavette USB che in genere vengono formattate in questo modo, che possono essere rese avviabili
semplicemente copiandoci i vari file. Luso di un filesystem FAT rende inoltre molto semplice
modificare una precedente immagine di avvio, in quanto baster`a montarla (direttamente o in
loopback se la si `e messa su un file) per accedere ai relativi contenuti.
191
opzione di compatibilit`
a che disabilita le I/O APIC (vedi sez. 5.4.1) oltre far funzionare il kernel in modalit`
a
monoprocessore, `e lequivalente di maxcpus=0, valore particolare dellopzione che a sua volta consente di specificare
quanti processori usare su un sistema SMP, in genere, come noapci e noapic la si usa in caso di problemi di avvio
dovuti a implementazioni difettose del kernel, del BIOS o della scheda madre.
192
in genere si usa sostituirlo con /bin/sh per poter partire direttamente con una shell di root saltando la
procedura di autenticazione, cos` da essere in grado di accedere alla macchina con privilegi amministrativi per
ripristinare una password di root persa o dimenticata.
193
per i CD `e disponibile anche la variante ISOLINUX, che supporta la stessa sintassi del file di configurazione
ma non necessita di una immagine di un filesystem FAT e pu`
o usare direttamente il contenuto del CD.
194
tutte queste varianti condividono la stessa sintassi generale del file di configurazione, e la stessa forma e
funzionalit`
a del prompt di avvio, per questo buona parte di quanto illustrato in questa sezione pu`
o applicarsi
anche alle altre varianti.

314

CAPITOLO 5. AMMINISTRAZIONE STRAORDINARIA DEL SISTEMA

Per creare una immagine davvio baster`a copiare i file necessari sul filesystem FAT e poi
eseguire il comando syslinux che sovrascriver`a opportunamente il settore iniziale del disco e
copier`a nella directory radice il file ldlinux.sys che costituisce il programma di avvio. Se non
si specifica altro allavvio il bootloader caricher`a limmagine del kernel dal file linux.
Se si `e installata limmagine di avvio direttamente su un supporto (ad esempio un floppy o
una chiavetta USB) il comando deve essere eseguito passandogli come argomento il nome del
rispettivo file di dispositivo (nel caso rispettivamente /dev/fdN o /dev/sdX), ma se invece si `e
usata una immagine montata in loopback baster`a indicare il nome del file.195 Lunica opzione
significativa `e -s che installa una versione safe, slow and stupid che funziona anche con alcuni
BIOS difettosi.
Direttiva
default

append

label

kernel
initrd
timeout

prompt

display
f1,. . . ,f12

Significato
imposta il kernel da usare di default, indicato tramite letichetta (fra
quelle specificate in una successiva label) ad esso associata, se non
specificato viene usato il valore linux.
imposta lelenco di argomenti da passare al kernel, eventuali altri argomenti inseriti al prompt verranno accodati a questi (consentendo
una sovrascrittura), se specificata prima della prima label si applica
globalmente.
imposta letichetta che identifica una immagine di kernel, richiede che
si specifichi di seguito una direttiva kernel per indicare limmagine del kernel ed ulteriori direttive che verranno usate qualora si usi
quelletichetta come valore per default o la si scriva sul prompt di
avvio.
imposta il pathname allimmagine del kernel che verr`
a caricata
allavvio.
imposta il pathname allimmagine del ramdisk che verr`
a caricato
allavvio.
imposta il tempo di attesa (in decimi di secondo) per accedere al prompt
di avvio che parta il caricamento del kernel; un valore nullo (il default)
inizia immediatamente il caricamento.
il valore 1 richiede di mostrare sempre allavvio il prompt della riga di
comando syslinux, in caso di valore nullo o in assenza della direttiva il
prompt viene mostrato solo premendo uno dei tasti di controllo (Alt,
Shift, ecc.).
pathname di un file di testo il cui contenuto viene stampato sulla
schermata del prompt di avvio.
pathname di un file il cui contenuto viene stampato al prompt di avvio
in conseguenza della pressione dei tasti F1, . . . , FN.
Tabella 5.24: Direttive di configurazione di syslinux.cfg.

Il comportamento del bootloader viene controllato dal file di configurazione syslinux.cfg,


che deve essere anchesso copiato nella radice del filesystem FAT.196 Il formato del file segue
la convenzione di ignorare righe vuote e quanto segue un #, mentre le configurazioni devono
essere indicate da righe inizianti con una parola chiave da uno o pi`
u parametri posti sulla stessa
riga.
La direttiva label, seguita da un nome,197 consente di etichettare diverse immagini del kernel
da avviare, queste devono essere specificate con la direttiva kernel seguita dal pathname del file,
la direttiva initrd consente di specificare un ramdisk ; eventuali argomenti del kernel devono
essere specificati con una direttiva append. Un riassunto delle principali direttive `e riportato
in tab. 5.24. Per i dettagli si pu`
o fare riferimento alla pagina di manuale di syslinux al solito
accessibile con man syslinux.
195

questo `e il caso quando si vuole creare una immagine da usare per lavvio da un CDROM.
`e comunque supportata anche la lettura da /boot/syslinux/syslinux.cfg e /syslinux/syslinux.cfg.
197
si tenga presente che per i nomi valgono alcune limitazioni presenti per i nomi dei file MSDOS, ad esempio
usare etichette con pi`
u di un . nel nome far`
a ignorare quanto segue il secondo punto.
196

5.3. LA GESTIONE DELLAVVIO DEL SISTEMA

315

Allavvio del sistema SYSLINUX mette a disposizione una riga di comando (esplicitamente
o con la pressione di uno dei tasti di controllo (Alt, Shift, ecc.) con un prompt da cui `e possibile
scegliere quale immagine usare fra quelle disponibili. Questa pu`o essere scelta indicandola con il
valore usato nella corrispondente direttiva label della configurazione, altrimenti si pu`o usare il
valore di default linux, ed eventualmente aggiungere ulteriori parametri di avvio del kernel, che
andranno ad aggiungersi quelli eventualmente impostati nella configurazione di syslinux.cfg.

5.3.3

Il bootloader LILO

Uno dei primi bootloader creati per Linux `e stato LILO, abbreviazione di LInux LOader, che a
lungo `e stato anche quello che veniva usato da tutte le distribuzioni per lavvio da disco rigido.
Si tratta di un bootloader con una architettura elementare, che si affida al BIOS per la lettura
del disco, e pertanto risente di tutti i limiti che questo pu`o avere. Uno di questi problemi `e che,
a causa delle restrizioni ereditate dai primi PC illustrate in sez. 5.1.1, alcuni vecchi BIOS non
sono capaci di leggere i dischi oltre il 1024-simo cilindro.
In genere LILO viene installato nellMBR alla fine della procedura di installazione di una
distribuzione. In generale `e possibile, come accennato in precedenza, installarlo allinterno di
una partizione, se si dispone di un altro bootloader in grado di eseguirlo. Una volta eseguito (sia
direttamente dal BIOS, che da un altro bootloader ) LILO si incarica di trovare limmagine del
kernel sul disco, caricarla in memoria, passare tutti gli eventuali parametri di avvio specificati
in fase di configurazione, e poi eseguirla.198 Da questo punto in poi il controllo passa al kernel,
che si incarica di tutto il resto.
La configurazione di LILO `e gestita tramite il file /etc/lilo.conf, questo contiene sia le
opzioni passate al kernel in fase di avvio, che le direttive che permettono di controllare direttamente il comportamento del bootloader. Si tenga presente per`o che, al contrario di quanto
avviene in genere per altri file di configurazione, non basta modificarlo perche i cambiamenti diventino effettivi al riavvio successivo. Si deve invece far girare il programma lilo che reinstalla
il bootloader con le nuove opzioni.
In genere si ha a che fare con questo file tutte le volte che si vuole usare un nuovo kernel.
Infatti per poter lanciare un kernel occorre specificarne la posizione su disco al bootloader in
modo che questo possa caricarlo. La cosa va fatta anche se si `e semplicemente sovrascritto un
kernel precedente con un altro e pertanto non si `e neanche dovuto modificare /etc/lilo.conf;
si ricordi infatti che LILO (il bootloader, quello che sta nellMBR) conosce solo la posizione fisica
del kernel nel disco, non quella logica nel filesystem; pertanto se si sovrascrive un file non `e
affatto detto che la posizione fisica del nuovo file sia la stessa (anzi di norma non lo `e affatto)
per cui al successivo riavvio senzaltro LILO potrebbe non essere pi`
u in grado di trovare il kernel,
con la conseguente impossibilit`
a di lanciare il sistema.
Il formato di /etc/lilo.conf `e simile a quello degli altri file di configurazione, le linee vuote
o che iniziano per # vengono ignorate. Le altre linee indicano una opzione o una direttiva. Un
esempio di questo file `e il seguente:
# Support LBA for large hard disks.
#
lba32
# Specifies the boot device. This is where Lilo installs its boot
# block. It can be either a partition, or the raw device, in which
# case it installs in the MBR, and will overwrite the current MBR.
#
boot=/dev/hda
# Specifies the device that should be mounted as root. (/)
#
198

qualora lo si sia richiesto, si pu`


o caricare in memoria anche limmagine di un ramdisk, che serve come filesystem
iniziale per il kernel.

316

CAPITOLO 5. AMMINISTRAZIONE STRAORDINARIA DEL SISTEMA


root=/dev/hdb5
# Installs the specified file as the new boot sector
#
install=/boot/boot.b
# Specifies the location of the map file
#
map=/boot/map
# Specifies the number of deciseconds (0.1 seconds) LILO should
# wait before booting the first image.
#
delay=30
# message=/boot/bootmess.txt
prompt
#
single-key
#
delay=100
timeout=30
# Kernel command line options that apply to all installed images go
# here. See: The boot-prompt-HOWTO and kernel-parameters.txt in
# the Linux kernel Documentation directory.
#
# append=""
# Boot up Linux by default.
#
default=linux
image=/boot/vmlinuz-2.2.21
label=linux
read-only
optional
image=/boot/vmlinuz-2.2.20
label=linuxold
read-only
optional
# If you have another OS on this machine to boot, you can uncomment the
# following lines, changing the device name on the other line to
# where your other OS partition is.
#
other=/dev/hda1
label=dos
#
restricted
#
alias=3

Le direttive sono divise in tre classi principali: le direttive che specificano opzioni globali,
che si applicano al comportamento generale del bootloader, le direttive che specificano opzioni
relative alle singole immagini dei sistemi che si vogliono lanciare, e le direttive che permettono
di passare delle opzioni al kernel (Linux).
La maggior parte delle direttive ricade nella prima classe; di queste forse la pi`
u importante `e
boot, che specifica il dispositivo su cui installare il bootloader, nel caso `e lMBR del primo disco
IDE, indicato tramite il suo file di dispositivo come /dev/hda. Si pu`o specificare allo stesso
modo una partizione, ad esempio se si volesse installare LILO sulla seconda partizione del primo
disco si sarebbe potuto usare /dev/hda2.
La direttiva map specifica il file (di norma boot.map) che contiene la mappa della posizione
su disco delle varie immagini del kernel; questa viene definita automaticamente alla installazione
del pacchetto e ricostruita tutte le volte che si lancia il comando lilo. La direttiva install
invece specifica qual`e il file che contiene il programma del bootloader, ne possono esistere varie
versioni, che presentano una interfaccia di avvio semplificata a menu o semplicemente testuale.
In genere tutti questi i file referenziati da queste direttive vengono tenuti, come illustrato in
sez. 1.2.3, nella directory /boot.
Le altre direttive globali pi`
u usate sono quelle che controllano le modalit`a di avvio. Se si

5.3. LA GESTIONE DELLAVVIO DEL SISTEMA

317

specifica prompt il bootloader si ferma allavvio presentando una riga di comando da cui lutente
pu`o immettere dei comandi (si tratta in genere di scrivere il nome di uno dei kernel predefiniti,
seguito dalle eventuali opzioni che gli si vogliono passare). Specificando un numero con timeout
si introduce un tempo massimo (in decimi di secondo) dopo il quale, pur avendo specificato
prompt, si proceder`
a automaticamente allavvio. Se non si specifica prompt invece lavvio verr`
a
effettuato automaticamente, senza possibilit`a di intervento dellutente,199 dopo il numero di
decimi di secondo specificato con delay.
Direttive come lba32 e linear servono ad indicare a LILO quale metodo utilizzare per caricare il kernel. Per trovare limmagine del kernel sul disco infatti LILO utilizza la posizione dello
stesso specificata dalla boot map che contiene la lista degli indirizzi sul disco da cui leggere una
immagine del kernel. Di default questi indirizzi sono indicati nella notazione classica, specificando cilindro, testina e settore, ed il caricamento del kernel viene utilizzando linterfaccia classica
illustrata in sez. 5.1.1, questo comporta che si avranno problemi tutte le volte che si installa un
kernel al di l`
a del limite del 1024-simo cilindro. Con i BIOS (e le versioni di LILO) pi`
u recenti, si
deve sempre specificare la direttiva lba32, in tal caso gli indirizzi nella boot map saranno tenuti
in forma lineare, e verr`
a usata la nuova interfaccia di accesso del BIOS, e ci si potr`a dimenticare
di tutti i problemi relativi alla geometria dei dischi.
Qualora il BIOS non supporti queste estensioni, la direttiva linear mantiene sempre gli
indirizzi nella boot map in forma lineare, ma per laccesso al disco esegue una conversione al
vecchio formato, usando la funzione originale. Questo pu`o essere utile in quanto non `e detto
che Linux ed il BIOS concordino sempre sulla geometria del disco; se questo accade e non si
`e usato linear allavvio LILO user`a dei valori per cilindro, testina e settore relativi ad una
geometria diversa a quella vista dal BIOS, con relativo fallimento. Usando linear invece lidea
della geometria che ha il kernel diventa irrilevante, e sar`a LILO ad usare allavvio la conversione
dellindirizzo lineare usando la geometria che gli fornisce il BIOS. Luso di questa direttiva
comunque ha senso solo per i vecchi BIOS che non supportano LBA.
Con la direttiva default si pu`
o scegliere quale, fra le varie immagini del kernel installate o
gli altri sistemi operativi presenti su altre partizioni, viene selezionato come default per lavvio
(e lanciato quando scade il tempo specificato da timeout). Per farlo basta fare riferimento
alletichetta che si `e associata con la direttiva label a ciascuna immagine o altro sistema presente.
Unaltra direttiva fondamentale `e root che definisce il dispositivo da cui montare la directory
radice, nel nostro esempio /dev/hdb5.200 Di solito la si specifica allinizio del file per utilizzarla
come valore di default per tutti i kernel, ma pu`o essere anche specificata per ciascuna immagine.
La direttiva che permette di identificare un kernel da lanciare `e image, che prende come
parametro il file che contiene limmagine del kernel. Si ricordi che benche qui essa sia specificata
tramite il pathname del file che la contiene, LILO vi acceder`a direttamente usando la posizione
di questultima nel disco. Questo significa che se si copia su una di queste immagini un altro
file (ad esempio per un aggiornamento), essendo questo creato altrove (quando si sovrascrive
con cp prima viene creata la copia, poi cancellato il file preesistente e assegnato il suo nome al
nuovo), fintanto che non si ricrea la boot map e la si reinstalla, LILO continuer`a ad accedere alla
posizione del vecchio file. Questo significher`a nel migliore dei casi, se si `e fortunati e nessuno ha
sovrascritto i dati, che si utilizzer`
a ancora la vecchia immagine, mentre in caso di sovrascrittura
lavvio fallir`
a (in maniera pi`
u o meno spettacolare a seconda dei casi).
Per ciascuna direttiva image vanno poi fornite una serie di ulteriori direttive specifiche da
applicare allavvio di quella immagine. Una sempre necessaria `e label che definisce letichetta
che identifica limmagine, da usare nella fase di avvio e per la direttiva default.
La direttiva initrd specifica il file da utilizzare come ramdisk per lavvio, la direttiva append
permette di specificare dei parametri di avvio al kernel, analoghi a quelle che si possono scrivere
199
200

in realt`
a `e comunque possibile ottenere la riga di comando se ti tiene premuto il tasto di shift.
si noti che non `e assolutamente detto che questa debba stare sullo stesso disco da cui si lancia il kernel.

318

CAPITOLO 5. AMMINISTRAZIONE STRAORDINARIA DEL SISTEMA

al prompt, la direttiva read-only fa montare la radice in sola lettura (in genere `e cura degli
script di avvio di rimontarla anche in scrittura).
Nel caso si voglia lanciare un altro sistema operativo (cosa che di norma si fa tramite un altro
bootloader ) si deve usare la direttiva other specificando la partizione su cui si trova questultimo.
Anche questa direttiva deve essere seguita da una label. Lelenco completo di tutte le direttive
si trova al solito nella pagina di manuale, accessibile con man lilo.conf.
Una direttiva utile per la sicurezza `e password che permette di proteggere con una password
la procedura di avvio. Dato che la password `e scritta in chiaro nel file di configurazione, qualora
si usi questa funzione si abbia anche la cura di proteggerne laccesso in lettura (il comando
lilo in ogni caso stampa un avviso se questa direttiva viene utilizzata con un file accessibile in
lettura).
Luso di questa direttiva permette di controllare le modalit`a con cui si fanno partire le varie
immagini (o i sistemi operativi alternativi), attraverso ulteriori direttive da indicare nelle relative
sezioni del file di configurazione. Specificando bypass non viene applicata nessuna restrizione;
specificando restricted si impedisce allutente di passare dei parametri al kernel sul prompt, a
meno di non fornire la password; specificando mandatory `e necessario fornire la password anche
per avviare la relativa immagine.
Una volta che si sono definite le impostazioni in /etc/lilo.conf, si pu`o attivarle con il
comando lilo. Questo si limita a leggere il suddetto file e a reinstallare il bootloader con i nuovi
valori. Il comando prende varie opzioni che permettono di soprassedere i valori specificati da
lilo.conf, al solito si pu`
o fare riferimento alla pagina di manuale, accessibile con man lilo,
per lelenco completo.
Vale la pena per`
o di ricordarne due, la prima `e -r che permette di specificare una directory
nella quale eseguire un chroot prima di eseguire il comando. Essa `e molto utile quando si avvia
il sistema da un disco di recupero (ad esempio se si `e fatto qualche errore con LILO ed il sistema
non parte pi`
u) perche permette di correggere i valori nel lilo.conf del disco, e ripristinare
il sistema reinstallando il bootloader come se lo si fosse fatto direttamente dal disco originale;
ovviamente in tal caso occorre montare il disco da qualche parte nel sistema usato come recupero
e poi usare lilo -r sulla directory su cui lo si `e montato.
La seconda opzione `e -R che invece specifica una riga di comando da passare a LILO al
successivo riavvio, come se la si scrivesse direttamente dal prompt. Lutilit`a dellopzione `e che
questo avviene una sola volta, per cui solo il riavvio successivo user`a le nuove opzioni; cos` se
qualcosa non va, ed il riavvio fallisce, baster`a far riavviare la macchina unaltra volta per riavere
i valori precedenti, che si presume siano funzionanti.

5.3.4

Il bootloader GRUB

Uno dei pi`


u sofisticati bootloader disponibili per Linux, e ad oggi senzaltro il pi`
u diffuso, `e
GRUB, nome che sta per Grand Unified Bootloader. GRUB `e nato come bootloader per il
sistema HURD201 ma `e in grado di avviare qualunque altro tipo di sistema (compreso Linux e
BSD).
La caratteristica principale rispetto a LILO `e che GRUB `e formato da diverse parti, dette
stadi, ciascuno dei quali, come gli omonimi dei razzi, viene usato per lanciare il successivo. In
sostanza poi gli stadi sono due, il primo `e un analogo di LILO e viene installato sullMBR; il suo
unico compito `e quello di lanciare lo stadio successivo, che poi si incaricher`a di effettuare tutte
le operazioni successive.
Il grande vantaggio di GRUB `e che siccome il primo stadio deve solo occuparsi di trovare
il secondo ed `e questultimo che fa tutto il lavoro, tutte le restrizioni che si applicano ad un
201

HURD `e un sistema libero sperimentale realizzato dalla FSF, basato su una architettura microkernel, con
funzionalit`
a teoricamente molto avanzate; ma il cui sviluppo `e ancora molto limitato.

5.3. LA GESTIONE DELLAVVIO DEL SISTEMA

319

programma che deve stare nellMBR scompaiono. Per questo GRUB `e in grado di leggere
nativamente i principali filesystem, cosicche non solo si pu`o fare riferimento alle immagini del
kernel attraverso un pathname, ma si ha anche a disposizione una micro-shell che consente
di navigare attraverso un filesystem ed esplorarne il contenuto. Questo vuol dire che basta
cambiare il file di configurazione di GRUB o sovrascrivere una immagine del kernel perche la
nuova versione sia usata al successivo riavvio, e non `e necessario eseguire la reinstallazione nel
Master Boot Record come per LILO, evitando i guai che nascono tutte le volte che ci si dimentica
di farlo.
Un altro grande vantaggio `e che GRUB pu`o ricevere i comandi allavvio non solo dalla
console, ma anche via seriale e via rete, dato che non ha bisogno del BIOS per gestire lI/O, il
che lo rende molto pi`
u flessibile. Inoltre non `e limitato, sui vecchi BIOS che non lo supportano,
a lanciare il sistema dal primo canale IDE, ma, essendo di nuovo indipendente dal BIOS, pu`
o
usare uno qualunque dei dischi presenti.
Tutti i file di GRUB sono mantenuti in /boot/grub, in questa directory si trovano i file
stage1 e stage2 che contengono i due stadi standard usati nellavvio, e una serie di file *_stage1_5 che contengono gli stadi intermedi che GRUB utilizza per accedere ai contenuti di diversi
filesystem.202 Il file device.map contiene invece la lista dei dispositivi riconosciuti da GRUB
in fase di installazione, e come questi vengono mappati nella notazione interna di GRUB; un
esempio di questo file `e il seguente:
piccardi@hain:/boot/grub$ cat device.map
(fd0)
/dev/fd0
(hd0)
/dev/hda

che ci mostra come sulla macchina siano presenti un floppy ed un disco rigido.
I dispositivi vengono identificati da GRUB con un nome fra parentesi tonde, il floppy viene
sempre identificato con fd0 (nel caso ci siano due floppy ci sarebbe anche fd1) mentre i dischi
vengono identificati, in ordine di rilevazione, con hd0, hd1, ecc. Si tenga presente che GRUB non
distingue i nomi per i dischi IDE o SCSI, quindi anche questi ultimi verrebbero identificati con la
sigla hdN, dove N `e semplicemente un numero progressivo che dipende dallordine di rilevamento.
Il file device.map viene generato con il comando di installazione di GRUB, grub-install;
questo prende come argomento il dispositivo su cui si vuole installare GRUB come bootloader.203
Il comando copia anche nella directory /boot tutti i file di GRUB, e gli si pu`o dire di usare una
radice diversa con lopzione --root-directory=DIR. Il comando esegue anche una scansione dei
dispositivi e crea device.map.
In teoria GRUB non ha un vero e proprio file di configurazione, infatti se avviato come
bootloader mette a disposizione una shell da cui `e possibile eseguire tutti i suoi comandi interni.
Questa stessa shell `e disponibile anche se lo si esegue come semplice programma in user space,
lanciandolo con il comando grub. I comandi di GRUB sono molteplici ed oltre a quelli usati per
impostare lavvio dei vari kernel, ce ne sono altri da usare in modalit`a interattiva, come quelli
che forniscono la capacit`
a di cercare i file e di visualizzarne il contenuto;204 la shell di GRUB
inoltre offre funzionalit`
a avanzate come lauto-completamento di comandi e nomi dei file, ed
anche un help on line con il comando help.
Ma al di l`
a della possibilit`
a di uso interattivo la modalit`a principale con cui viene usato
GRUB `e quella in cui si inseriscono tutti i comandi necessari in un apposito file, menu.lst,
posto sempre sotto /boot/grub, cos` che questi vengano eseguiti automaticamente allavvio. In
questo modo menu.lst diventa una sorta di file di configurazione,205 ed i vari comandi di GRUB
assumono il significato di direttive di configurazione.
202

ne esiste uno per tipo di filesystem, e sono supportati tutti i principali filesystem di Linux.
si tenga presente che in tal caso si andr`
a a sovrascrivere un eventuale altro bootloader presente su tale
dispositivo.
204
rispettivamente find e cat, come gli analoghi della shell.
205
tanto che alcune distribuzioni installano sotto /etc il file grub.conf come link simbolico a questo file.
203

320

CAPITOLO 5. AMMINISTRAZIONE STRAORDINARIA DEL SISTEMA

Il vantaggio di usare menu.lst `e che questo permette di creare anche un menu semi-grafico
in formato testo dal quale scegliere quale kernel o altro sistema avviare, pertanto in genere
allinstallazione di GRUB come bootloader segue anche quella di un appropriato menu.lst. Il
contenuto tipico di questo file `e qualcosa del tipo:
## default num
# Set the default entry to the entry number NUM. Numbering starts from 0, and
# the entry number 0 is the default if the command is not used.
#
# You can specify saved instead of a number. In this case, the default entry
# is the entry saved with the command savedefault.
default
0
## timeout sec
# Set a timeout, in SEC seconds, before automatically booting the default entry
# (normally the first entry defined).
timeout
5
# Pretty colours
color cyan/blue white/blue
## password [--md5] passwd
# If used in the first section of a menu file, disable all interactive editing
# control (menu entry editor and command-line) and entries protected by the
# command lock
# e.g. password topsecret
#
password --md5 $1$gLhU0/$aW78kHK1QfV3P2b2znUoe/
# password topsecret
title
root
kernel
initrd
savedefault

Debian GNU/Linux, kernel 2.6.18-4-686


(hd0,0)
/boot/vmlinuz-2.6.18-4-686 root=/dev/hda1 ro
/boot/initrd.img-2.6.18-4-686

title
root
kernel
initrd
savedefault

Debian GNU/Linux, kernel 2.6.18-4-686 (recovery mode)


(hd0,0)
/boot/vmlinuz-2.6.18-4-686 root=/dev/hda1 ro single
/boot/initrd.img-2.6.18-4-686

e su Debian si pu`
o anche usare il comando update-grub, che effettua una ricerca dei kernel
presenti in /boot/ e crea automaticamente una lista con le relative voci in menu.lst.206
Le varie voci che compariranno nel menu iniziale sono introdotte dal comando title, che
specifica la stringa con cui queste verranno mostrato, ad esso si associa in genere il comando
root, che specifica quale disco e partizione usare come radice per cercare i file a cui si fa
riferimento nei comandi seguenti. Questa viene indicata con la notazione di GRUB, in cui si
indica fra parentesi tonda il dispositivo, seguito da una virgola e dal numero progressivo della
partizione a partire da zero. Nel caso precedente allora si dice di cercare il kernel nella prima
partizione del primo disco, in sostanza /dev/hda1.
Limmagine del sistema operativo da caricare si specifica con la direttiva kernel, seguita dal
pathname del file. Si tenga presente che questo `e relativo alla partizione stessa (non esiste il
concetto di radice in GRUB), per cui se ad esempio si `e posto /boot su unaltra partizione non
`e pi`
u necessario specificarla nel nome del file. Nel caso di Linux al nome del file si devono far
seguire le opzioni da passare al kernel allavvio, fra cui occorre comunque specificare il dispositivo
206

il comando di Debian usa anche alcuni dei commenti dentro menu.lst per generare parametri e valori usati
nelle singole voci create automaticamente.

5.3. LA GESTIONE DELLAVVIO DEL SISTEMA

321

da montare come radice (nellesempio precedente con root=/dev/hda1), se si usa un ramdisk si


dovr`a specificare anche il relativo file con il comando initrd.
Comando
default
timeout
title
kernel
initrd
root
chainloader

makeactive

password

Significato
indica quale fra le voci del menu deve essere avviata di default, prende
come argomento un numero progressivo che parte da 0.
indica dopo quanto tempo, in secondi, deve passare prima che venga
avviata la voce di default.
imposta una voce nel menu di avvio, e usa largomento seguente come
titolo della stessa.
indica il file da cui caricare in memoria il codice da eseguire come kernel
allavvio.
indica il file da cui caricare limmagine di un ramdisk.
imposta il dispositivo (disco e partizione) da usare come radice per i
nomi dei file usati dagli altri comandi.
indica di lanciare il bootloader che si trova allinizio della partizione
impostata come radice, prende in genere un argomento (+1 nel caso di
Windows) che indica a quanti settori dallinizio della partizione stessa
si trova il secondo bootloader.
marca come attiva la partizione indicata come radice, necessario quando questa `e la partizione di avvio di Windows (usato in abbinamento
con chainloader).
imposta una password che blocca laccesso alla riga di comando durante
lavvio.

Tabella 5.25: Principali comandi usati nella configurazione di GRUB.

Il comando default permette di stabilire quale, nella lista di immagini dichiarate, deve essere
lanciata se lutente non interviene, dopo un tempo di attesa specificato con timeout. Come con
LILO `e anche possibile proteggere laccesso alla shell di GRUB, che di default `e sempre possibile,
con la direttiva password, che oltre alla password in chiaro accetta come argomento anche la
stessa in formato MD5, nella stessa forma in cui viene espressa in /etc/shadow.
I principali comandi usati come direttive di configurazione allinterno di menu.lst sono
riportati in tab. 5.25, una lista dei comandi interattivi come accennato pu`o essere ottenuta con
il comando help, mentre lelenco completo delle funzionalit`a di GRUB `e illustrato in dettaglio
sia nel GRUB-HOWTO che nelle pagine info del programma, accessibili con info grub.

5.3.5

Il sistema di inizializzazione alla System V

Come accennato in sez. 5.3.1 una volta lanciato il kernel si cura solo dellinizializzazione dellhardware, di montare la directory radice e di eseguire il programma di avvio del sistema, che
per tradizione `e /sbin/init. Questo `e uno dei motivi per cui questo programma, come tutti
quelli essenziali allavvio, deve stare nella radice, in /sbin.
Due degli errori pi`
u comuni, che comportano limpossibilit`a di proseguire nella procedura di
avvio, sono proprio quelli relativi allimpossibilit`a di montare la radice, ad esempio perche ci si
`e dimenticati di inserire nel kernel il supporto per accedere al dispositivo su cui essa si trova o
quello per il suo filesystem, o allimpossibilit`a di lanciare init ad esempio perche si `e danneggiato
il programma, o qualche libreria, o si `e indicata come radice una partizione sbagliata.
Una volta lanciato init il kernel non esegue pi`
u direttamente nessun altro compito, tutto il
` a questo punto
resto viene effettuato attraverso gli opportuni programmi invocati da init. E
che emerge una delle principali differenze fra i vari sistemi che si ispirano a Unix. Essa origina
dalla divisione che ci fu negli anni 70, fra la versione sviluppata alla AT/T, che poi diventer`
a
System V, e quella sviluppata a Berkeley, che dar`a origine alla famiglia dei BSD. Una delle
differenze principali fra i due sistemi `e proprio quella del procedimento di avvio.

322

CAPITOLO 5. AMMINISTRAZIONE STRAORDINARIA DEL SISTEMA

La differenza non `e tanto nel meccanismo di funzionamento del sistema, dato si che tratta
sempre di lanciare gli opportuni programmi, quando nella modalit`a in cui questi vengono avviati.
Nei sistemi derivati da BSD questo viene fatto attraverso lesecuzione di alcuni script. Attivare
o meno un servizio dipende dallinserimento o meno (al posto giusto) delle opportune righe di
avvio allinterno di essi. Nel caso di Linux poche distribuzioni (Slackware `e la pi`
u nota), hanno
adottato questa modalit`
a, la gran parte han preferito, per la sua maggiore flessibilit`a, lo stile di
avvio di System V.
I sistemi derivati da System V usano una procedura pi`
u complessa, ma che offre maggiore
funzionalit`a e soprattutto `e pi`
u modulare. La gran parte delle distribuzioni di GNU/Linux207
ha adottato questo sistema. In realt`
a comunque, dato che si tratta comunque di programmi
in user space, negli anni sono state proposte varie alternative, anche per cercare di superare
le problematiche relative alla intrinseca sequenzialit`a della procedura di avvio classica, che pu`o
portare a tempi di partenza del sistema anche piuttosto lunghi.
Per questo motivo sono state realizzate varie alternative ad init, ispirate a filosofie progettuali completamente diverse, in cui si cerca di eseguire in parallelo tutte le azioni possibili, o
avviare solo i servizi su richiesta. Fra queste la pi`
u promettente pare essere il sistema di upstart
creato da Ubuntu e da essa usato come default, che `e in corso di adozione anche da parte di
RedHat. Dato per`
o che anche in questo caso viene mantenuta una compatibilit`a con il sistema
di avvio classico di System V, che resta in assoluto il pi`
u utilizzato, per il momento ci limiteremo
a trattare solo questo.
Lavvio alla System V (o SysV init, come viene spesso chiamato) avviene sulla base dei
cosiddetti runlevel, una sorta di modalit`
a operative del sistema in cui vengono lanciati un par`
ticolare insieme di programmi, che garantiscono la presenza di un certo gruppo di servizi. E
possibile selezionare sia quali programmi lanciare (ed in che ordine) in ciascun runlevel, sia quale
` compito di init portare
runlevel utilizzare. Inoltre `e possibile passare da un runlevel allaltro. E
il sistema in un certo runlevel, secondo quanto specificato nella sua configurazione.
I runlevel validi sono 8, quelli effettivamente utilizzati sono numerati da 0 a 6. A questi si
aggiunge il runlevel S, che riveste un ruolo speciale e serve ad indicare quali sono i servizi che
devono essere attivati comunque. La standardizzazione di LSB prevede che tre runlevel siano
riservati; il runlevel 0 viene usato per fermare il sistema, mentre il runlevel 6 per riavviarlo.
Infine il runlevel 1 serve per andare nel cosiddetto single user mode, la modalit`a di recupero in
cui pu`o entrare nel sistema solo lamministratore e solo dalla console, con tutti i servizi disattivati
e con la directory radice montata in sola lettura.
Per gli altri runlevel le caratteristiche possono variare da distribuzione a distribuzione (con
o senza servizi di rete, avvio terminante con il login direttamente da X, etc.). Per Debian il
default prevede che da 2 a 5 essi siano tutti equivalenti, mentre RedHat e SUSE usano il 2 per
lavvio in console senza rete, il 3 per lavvio in console con la rete ed il 5 per lavvio in modalit`a
grafica.
Tutto il procedimento di avvio viene controllato dal file di configurazione di init che `e
/etc/inittab. Il formato di questo file `e molto semplice, come per molti altri le linee vuote o
che iniziano per # vengono ignorate, le altre prevedono la presenza di quattro campi separati
dal carattere : nella forma:
id:runlevels:action:process
Il primo campo, id, `e una semplice etichetta composta da 1 a 4 caratteri che identifica
la singola linea (anche se in certi casi fa riferimento a delle azioni speciali). Il secondo campo,
runlevels, indica la lista dei runlevel a cui si applica la riga in questione. Il terzo campo, action,
indica la modalit`
a con cui init eseguir`
a il comando indicato nel quarto campo, process, quando
207

GNU/Linux `e stato sviluppato da zero, per cui non deriva da nessuna delle due famiglie di Unix, per questo
in genere si `e cercato di prendere il meglio da entrambe.

5.3. LA GESTIONE DELLAVVIO DEL SISTEMA

323

il runlevel corrente corrisponde ad uno di quelli elencati nel secondo campo. In questo modo `e
possibile utilizzare inittab per elencare ad init quali sono i programmi da lanciare allavvio e
quali sono le operazioni da eseguire per ciascun runlevel.
Per capire meglio il funzionamento della procedura di avvio di SysV conviene per`o fare
riferimento ad un esempio del contenuto di inittab; riportiamo di seguito un estratto dalla
versione del file installata su una Debian Sarge:
# The default runlevel.
id:2:initdefault:# Boot-time system configuration/initialization script.
# This is run first except when booting in emergency (-b) mode.
si::sysinit:/etc/init.d/rcS
# /etc/init.d executes the S and K scripts upon change
# of runlevel.
l0:0:wait:/etc/init.d/rc 0
l1:1:wait:/etc/init.d/rc 1
l2:2:wait:/etc/init.d/rc 2
l3:3:wait:/etc/init.d/rc 3
l4:4:wait:/etc/init.d/rc 4
l5:5:wait:/etc/init.d/rc 5
l6:6:wait:/etc/init.d/rc 6
# What to do when CTRL-ALT-DEL is pressed.
ca:12345:ctrlaltdel:/sbin/shutdown -t1 -a -r now
# What to do when the power fails/returns.
pf::powerwait:/etc/init.d/powerfail start
pn::powerfailnow:/etc/init.d/powerfail now
po::powerokwait:/etc/init.d/powerfail stop
# /sbin/getty invocations for the runlevels.
#
# The "id" field MUST be the same as the last
# characters of the device (after "tty").
1:2345:respawn:/sbin/getty 38400 tty1
2:23:respawn:/sbin/getty 38400 tty2
3:23:respawn:/sbin/getty 38400 tty3
4:23:respawn:/sbin/getty 38400 tty4
5:23:respawn:/sbin/getty 38400 tty5
6:23:respawn:/sbin/getty 38400 tty6

Si tenga presente che questo file viene letto da init allavvio mentre le azioni in esso specificate vengono eseguite sia nella procedura di avvio che ad ogni cambio di runlevel (torneremo
su questo argomento pi`
u avanti). Specificando come azione wait si richiede che il programma
sia eseguito una sola volta, attendendo che esso sia concluso prima di passare allazione successiva; nellesempio `e questo il caso con lo script /etc/init.d/rc che, come vedremo fra poco, `e
quello che viene usato per avviare e fermare i servizi. Se invece non `e necessario attendere la
conclusione si pu`
o usare once.
Specificando respawn si chiede che il comando sia messo in esecuzione immediatamente,
senza attendere la sua conclusione, per proseguire coi successivi; si richiede inoltre che esso
sia rilanciato automaticamente ogni volta che se ne termina lesecuzione. Questo `e quello che
nellesempio viene fatto con getty per avere i terminali di login attivi sulle varie console: ogni
volta che ci si collega al sistema getty eseguir`a login per lautenticazione e questo eseguir`
a la
208
shell,
alluscita dalla shell, init, accorgendosi della terminazione del processo, rilancer`
a di
nuovo getty.
Il problema che spesso si verifica nella interpretazione del contenuto di inittab `e che il
significato di alcune azioni non `e di immediata comprensione, in quanto ve ne sono indipendenti
dal runlevel scelto, come powerwait, powerfailnow, powerokwait, mentre initdefault non
208

si ricordi che mettere in esecuzione un nuovo programma non comporta la creazione di un nuovo processo,
nella catena di esecuzioni successive il processo rester`
a sempre lo stesso.

324

CAPITOLO 5. AMMINISTRAZIONE STRAORDINARIA DEL SISTEMA

esegue nulla ma serve invece ad impostare il runlevel di default.209 Inoltre non contribuisce alla
chiarezza il fatto che il campo id pu`
o essere soggetto a delle restrizioni, come nel caso delle righe
di getty che richiedono vi si usi il numero della console.
Argomento
respawn

wait

once

boot
bootwait

sysinit

initdefault
ctrlaltdel

powerwait

powerokwait
powerfailnow

Significato
il comando viene eseguito allingresso nel runlevel senza
aspettare la sua terminazione e viene rieseguito tutte le
volte che termina.
il comando viene eseguito una volta allingresso nel runlevel specificato e si aspetta la sua terminazione prima di
proseguire.
il comando viene eseguito una volta allingresso nel runlevel specificato senza aspettare la sua terminazione prima
di proseguire.
il comando viene eseguito una sola volta allavvio del
sistema; il valore del runlevel viene ignorato.
il comando viene eseguito una sola volta allavvio del sistema attendendo per il suo completamento; il valore del
runlevel viene ignorato.
il comando viene eseguito allinizio della procedura di avvio, prima di di qualunque voce relativa alle azioni boot
o bootwait; il valore del runlevel viene ignorato.
indica quale runlevel deve essere utilizzato allavvio, il
campo indicante il programma da eseguire viene ignorato.
esegue il processo specificato quando init riceve un segnale di SIGINT o se si utilizza la combinazione di tasti ctrl-alt-del, viene usato in genere per invocare
shutdown (vedi sez. 5.3.6).
eseguito quando viene notificata ad init la caduta della
linea elettrica da parte del programma di gestione del
gruppo di continuit`
a.
eseguito quando viene notificato ad init il ritorno della
corrente sulla linea elettrica.
eseguito quando viene comunicato ad init da parte del
programma di gestione del gruppo di continuit`
a che le
batterie si stanno esaurendo.

Tabella 5.26: Principali valori delle azioni indicabili nel terzo campo di /etc/inittab.

In tab. 5.26 si sono riportati i principali valori ed il rispettivo significato delle parole chiave
che possono essere usate per il campo action; i dettagli e lelenco completo si trovano al solito
nella pagina di manuale, accessibile con man inittab.
In genere non c`e molto da fare con questo file, lunica cosa che pu`o servire `e cambiare la linea
dellazione initdefault per cambiare il runlevel di default, e passare ad esempio dal login da
console a quello grafico.210 Una seconda azione che si pu`o voler modificare (ad esempio disabilitare) `e quella che imposta la reazione alla combinazione di tasti ctrl-alt-del che nellestratto
`e specificata dallazione ctrlaltdel, ed invoca il programma shutdown (vedi sez. 5.3.6) per
riavviare il computer.
Si noti come nellesempio citato il primo comando eseguito sia quello associato dallazione
sysinit. Questa `e una delle azioni speciali indipendente dal runlevel, che viene eseguita soltanto
allavvio della macchina e che nellesempio prevede lesecuzione dello script /etc/rc.d/rcS. Questa `e la scelta di Debian in cui questo script non fa altro che chiamare lo stesso /etc/init.d/rc
invocato sul runlevel S, in modo che si possono inserire nella directory /etc/rcS.d gli script
che si vuole siano eseguiti allavvio indipendentemente da qualunque runlevel. Su RedHat (e
209

cio`e quello che viene usato quanto viene fatto partire il sistema.
sempre che questo sia previsto come un runlevel indipendente dalla distribuzione; per RedHat questo significa
mettere un 5 al posto di 3, mentre in Debian questa differenza non esiste.
210

5.3. LA GESTIONE DELLAVVIO DEL SISTEMA

325

derivate) viene invece usato al suo posto lo script /etc/rc.d/rc.sysinit in cui di nuovo sono
inserite tutte le operazioni di prima inizializzazione del sistema, da eseguire qualunque sia il
runlevel scelto.
Come accennato il grosso della procedura di avvio viene gestito dallo script /etc/init.d/rc
che nellesempio precedente viene invocato, sia pure con un argomento diverso, per ciascun
` compito infatti di questo
runlevel, utilizzando lazione wait per attenderne il completamento. E
script fermare e avviare i servizi che sono richiesti per il runlevel specificato come argomento.
Per eseguire questo compito esso si basa sul fatto che le modalit`a con cui si ferma ed avvia
un servizio sono state a loro volta standardizzate. In particolare secondo le specifiche LSB `e
previsto che ciascun programma e servizio debba fornire un proprio script di avvio, da porsi,
secondo quanto specificato dal Filesystem Hierarchy Standard, in /etc/init.d.211 Questi script
devono prevedere anche luso di alcuni argomenti standard: start, che avvia il servizio, stop che
lo ferma, restart che prima lo ferma e poi lo riavvia, reload che fa rileggere la configurazione.
Se allora si va ad analizzare il codice di /etc/init.d/rc212 ci si accorger`a che a grandi linee
quello che lo script fa `e verificare presenza di una directory /etc/rcN.d,213 dove N corrisponde
al numero del runlevel passato come argomento, per ricavare la lista dei file in essa presenti.
Osservando il contenuto di queste directory vedremo che contengano tutte una serie di link
simbolici agli script di avvio dei servizi posti in /etc/init.d, chiamati con lo stesso nome ma
preceduto da una sigla composta da una S od una K seguite da un numero di due cifre.
Dopo aver letto la lista dei file presenti /etc/init.d/rc si limita ad eseguire tutti questi
script in ordine alfabetico, passando largomento stop a quelli che iniziano per K (che sta per
kill ) e largomento start a quelli che iniziano per S (che sta per start). In questo modo i
servizi indicati dai rispettivi script vengono fermati o avviati, e nellordine stabilito dalle due
cifre usate nella sigla.
In questo modo `e possibile, per ogni servizio, avere uno script di avvio personalizzato, da
mettere in /etc/init.d, e poi programmarne la partenza o larresto in un certo runlevel creando
un semplice link simbolico nella relativa directory. Si pu`o anche, grazie alle due cifre presenti nei
nomi dei link, decidere anche in quale punto della sequenza di avvio lanciare un certo servizio
(ad esempio un server di rete dovr`
a essere lanciato sempre dopo che questa `e stata attivata).
Si noti inoltre come la presenza dei servizi presenti in un determinato runlevel possa dipendere
da come si `e arrivati ad esso; nel passaggio da un runlevel ad un altro infatti i servizi avviati
dal primo vengono fermati dal secondo solo in presenza di un corrispondente script iniziante
per K, altrimenti restano attivi, anche se non sono previsti fra quelli che verrebbero avviati se si
andasse direttamente in quel runlevel.
Benche sia possibile attivare o disattivare un servizio su un certo runlevel creando semplicemente un link simbolico con lopportuna sigla iniziale, sono comunque disponibili innumerevoli
programmi in grado di automatizzare il compito. Alcuni di questi consentono anche di generare
la corretta posizione nella sequenza di avvio, utilizzando le informazioni presenti negli script
stessi (in genere in forma di commento iniziale).
Nel caso di Debian e derivate gli script di avvio sono in genere gestiti con update-rc.d. Il
comando prende come primo argomento il nome dello script di avvio, e come secondo lazione
da compiere su di esso. Luso pi`
u comune del comando `e con lazione remove, che consente di
rimuovere da tutti i runlevel ogni riferimento (sia di avvio che di arresto) allo script indicato.
In genere, a meno che non si sia gi`
a cancellato lo script da /etc/init.d/, occorre anche usare
lopzione -f, altrimenti il comando fallir`a, pertanto se si vuole rimuovere dalla procedura di
avvio luso di atd si potr`
a eseguire il comando:
211

tradizionalmente gli script di avvio di RedHat erano posti invece sotto /etc/rc.d; questo non corrisponde alla
standardizzazione di LSB, per cui nelle versioni pi`
u recenti di questa distribuzione le varie directory previste dallo
standard sono state realizzate tramite dei link simbolici, alcuni pathname potrebbero comunque non corrispondere.
212
pu`
o essere un buon esercizio per studiare la sintassi avanzata della shell.
213
alcune vecchie distribuzioni potrebbero mantenerla ancora sotto /etc/init.d.

326

CAPITOLO 5. AMMINISTRAZIONE STRAORDINARIA DEL SISTEMA


update-rc.d -f atd remove

Se invece si vuole installare uno script di avvio si potr`a usare lazione default, che utilizzando
le informazioni presenti nello script stesso214 lo installer`a (in avvio o in arresto a secondo di
quanto richiesto) su tutti i runlevel. Il comando consente anche di specificare singolarmente
quale servizio avviare e fermare su quale runlevel ed a quale punto della sequenza, ma per i
dettagli si rimanda alla lettura della relativa pagina di manuale.
La gestione dei link simbolici `e stata comunque anche standardizzata allinterno di LSB, che
prevede a questo scopo un altro comando, chkconfig, che `e quello presente anche su RedHat e
la maggior parte delle altre distribuzioni.215 Il comando consente di elencare tutti i servizi disponibili con lopzione --list, aggiungerne uno con --add o rimuoverlo con --del. Ad esempio
su una RedHat si potr`
a rimuovere atd con:
chkconfig --del atd
Anche in questo caso il comando fa riferimento alle informazioni contenute negli script per
determinare su quali runlevel e con quale numero di sequenza inserire gli script, si pu`o comunque
soprassedere il default specificando una lista di runlevel con lopzione --level. Per i dettagli
anche in questo caso si faccia riferimento alla pagina di manuale.
Benche con il tempo la procedura di avvio classico appena illustrata sia stata standardizzata,
e sia ormai possibile inserire una operazione specifica in un qualunque punto della sequenza di avvio, esistono alcuni file che storicamente venivano usati per effettuare delle configurazioni aggiuntive alla fine della sequenza stessa. In particolare un file ancora utilizzato `e /etc/rc.local.216
Esso viene eseguito alla fine della procedura di avvio,217 ed assume un po il significato di quello
che `e lautoexec.bat del DOS: contiene i comandi che si vogliono eventualmente dare dopo
che tutti i servizi sono partiti, senza doversi preoccupare di doverli inserire opportunamente
allinterno della sequenza di avvio.
Una modalit`
a alternativa (supportata ad esempio da Debian), `e quella delluso della directory
/etc/rc.boot nella quale si possono mettere gli script che si vuole siano eseguiti alla fine della
procedura di inizializzazione. In tal caso occorre tenere presente che i file dovranno essere
eseguibili, e il loro nome non dovr`
a contenere caratteri speciali.218
Entrambi questi metodi di personalizzazione delle operazioni da compiere dopo lavvio sono
comunque sempre meno utilizzati, la standardizzazione del sistema di avvio prevede che si utilizzi
direttamente un apposito script da inserire nel runlevel opportuno.

5.3.6

Riavvio, spegnimento e cambiamento di runlevel

Abbiamo trattato nella sezione precedente le modalit`a in cui avviene lavvio ed in cui il sistema
si porta in un certo runlevel, vedremo in questa come `e possibile cambiare runlevel e istruire
il sistema, anche una volta avviato, a passare da un runlevel ad un altro. Dato poi che, come
accennato, anche il riavvio o lo spegnimento di una macchina si effettuano utilizzando uno
specifico runlevel (rispettivamente il 6 e lo 0) vedremo anche i vari comandi che si possono
utilizzare per eseguire queste due operazioni.
Una delle modalit`
a in cui si pu`
o modificare il runlevel su cui una macchina viene avviata `e
quella che prevede il passaggio tramite il bootloader delle opportune opzioni di avvio per il kernel
214
se queste non sono presenti il comando lo installa in avvio sui runlevel 2, 3, 4 e 5, ed in arresto su 0, 1 e 6,
con numero di sequenza pari a 20.
215
`e comunque possibile installarlo anche su Debian, dove `e disponibile un pacchetto omonimo.
216
questa `e la posizione usata sia da Debian che da RedHat nelle versioni pi`
u recenti, ma su distribuzioni pi`
u
vecchie lo si pu`
o anche trovare fra gli script di avvio.
217
nel caso di Debian esso viene eseguito alla fine di tutti i runlevel tranne il single user mode.
218
infatti Debian esegue gli script usando lo speciale comando run-parts che, come visto in sez. 3.2.1, lancia
tutti gli script presenti in una directory posto che il loro nome sia nel formato adatto.

5.3. LA GESTIONE DELLAVVIO DEL SISTEMA

327

(quelle illustrate in sez. 5.3.1); alcune di queste infatti vengono passate direttamente ad init,
in particolare il passaggio di un valore numerico porta nel relativo runlevel, ed `e inoltre possibile
usare lopzione single per avviarsi in single user mode. Ovviamente questo tipo di indicazione,
fintanto che non viene impostata in maniera permanente nella configurazione del bootloader,219
vale soltanto per il singolo avvio.
Nelle operazioni ordinarie, una volta portatisi nel runlevel di default, normalmente non c`e
la necessit`
a di dover passare dalluno allaltro. Pu`o capitare per`o di essere partiti in single user
mode, o di esservi arrivati a causa di problemi nella fase si avvio, e che una volta che si siano
completati i compiti amministrativi o si sia risolto il problema, si voglia passare ad un runlevel
ordinario. Oppure, in seguito allinsorgere di problemi, ci si pu`o voler portare in single user
mode.
In tal caso il comando usato per cambiare runlevel `e telinit; questo per`o non `e altro che
un link allo stesso init, per cui si pu`o usare anche direttamente questultimo per compiere le
stesse operazioni. Il comando prende come argomento il numero di runlevel su cui ci si vuole
portare, e semplicemente notifica ad init, inteso qui come il processo in esecuzione con PID 1,
la richiesta di cambiamento di runlevel.220 A questo punto sar`a compito di init registrare in
/var/log/wtmp il cambiamento di runlevel (vedi sez. 2.4.4) e di far eseguire prima gli script di
arresto e poi quelli di avvio secondo quanto previsto per il runlevel scelto.221
Oltre al valore numerico del runlevel di destinazione si possono passare a telinit altri
argomenti; ad esempio con q si indica ad init di riesaminare /etc/inittab mentre con s
si richiede di andare in single user mode (le lettere possono essere indifferentemente maiuscole
o minuscole). Il comando pu`
o essere anche invocato, utilizzando le opportune opzioni, per
modificare semplicemente il comportamento di init; in particolare con lopzione -t si pu`
o
indicare un tempo diverso, rispetto ai 5 secondi di default, fra linvio del segnale SIGINT e quello
del segnale SIGKILL quando viene eseguito larresto della macchina.
Variabile
PATH
RUNLEVEL
PREVLEVEL
CONSOLE
INIT_VERSION

Significato
le directory dei comandi, come illustrato in sez. 2.1.3,
inizializzata a /bin:/usr/bin:/sbin:/usr/sbin.
il runlevel corrente.
il runlevel precedente.
la console di sistema, il default `e /dev/console.
la versione di init.

Tabella 5.27: Variabili di ambiente definite da init per i suoi figli.

` possibile inoltre cambiare i valori delle variabili di ambiente che init definisce per i processi
E
che lancia o definirne di nuove con lopzione -e, seguita dallassegnazione delle variabili stesse.
In generale infatti quando init esegue una delle azioni specificate in inittab definisce anche
per il processo eseguito le variabili di ambiente riportate in tab. 5.27.
Benche sia possibile arrestare una macchina o riavviarla usando direttamente i runlevel 0
e 6, `e abbastanza comune effettuare queste operazioni rispettivamente con i comandi halt e
reboot. A questi si aggiunge, come sostanziale sinonimo di halt, poweroff, che richiede esplicitamente lo spegnimento fisico.222 In realt`a tutti questi comandi corrispondono sempre allo
stesso programma, halt, che `e quello che effettua la richiesta di arresto, riavvio o spegnimento
al kernel.
219

`e questo il motivo per cui nellestratto di configurazione di GRUB visto in sez. 5.3.4 `e presente una voce
separata per lavvio in single user mode.
220
allo scopo init usa la pipe /dev/initctl come dispositivo di controllo.
221
a condizione ovviamente che i relativi servizi siano presenti nel runlevel di partenza, non verranno cio`e fermati
servizi non attivi, ne fatti partire servizi gi`
a attivi.
222
questo richiede lopportuno supporto di ACPI o APM nel kernel, ed in genere, se detto supporto `e presente,
lo spegnimento viene effettuato anche da halt.

328

CAPITOLO 5. AMMINISTRAZIONE STRAORDINARIA DEL SISTEMA

Il comportamento di default prevede che, a meno che non si sia gi`a nel runlevel 0 (per halt)
o 6 (per reboot), venga preventivamente invocato shutdown per arrestare i servizi prima di
fermare (o riavviare) definitivamente la macchina.223 Si pu`o usare lopzione -f per disabilitare
questo comportamento, si tenga presente infatti che se per qualche motivo (ad esempio un
/var/log/wtmp corrotto) il comando non `e in grado di determinare il runlevel chiamer`a sempre
shutdown, che non `e detto sia quello che si vuole. Per le altre opzioni (comuni per tutti e tre i
comandi) e per tutti i dettagli si consulti al solito la pagina di manuale.
Benche come abbiamo appena visto sia possibile spegnere o riavviare direttamente la macchina con gli appositi comandi, in genere `e sempre opportuno eseguire loperazione con un minimo
di preparazione ed avvisare gli utenti, ed `e per questo motivo che per procedere allarresto o al
riavvio si fa ricorso a shutdown; questo comando infatti consente di pianificare unoperazione di
fermo macchina, e di notificare gli utenti della stessa.
Il comando prende come primo argomento lorario a cui deve essere eseguita loperazione
di shutdown, e come argomento successivo un messaggio da inviare a tutti gli utenti collegati.
Lorario pu`o essere indicato in vari formati, a partire da un tempo assoluto specificato nella
forma hh:mm con ore e minuti, ad un tempo relativo nella forma +m dando un numero di minuti;
lesecuzione immediata si ottiene utilizzando now, sinonimo di +0. Il default del comando `e
quello di portare il sistema in single user mode (cio`e di porsi sul runlevel 1), ma si pu`o richiedere
larresto della macchina (runlevel 0) con lopzione -h o il riavvio (runlevel 6) con lopzione -r.
Opzione
-t

-k
-r
-h
-c
-f
-F

Significato
specifica il numero di secondi da attendere fra linvio del
segnale SIGINT e quello del segnale SIGKILL ai processi
residui (come per telinit).
non esegue loperazione ma invia soltanto il relativo
messaggio agli utenti.
esegue il riavvio della macchina.
esegue lo spegnimento della macchina.
annulla uno shutdown in corso.
richiede che al riavvio non venga eseguito il controllo dei
filesystem.
richiede che al riavvio venga eseguito forzatamente un
controllo dei filesystem.

Tabella 5.28: Principali opzioni del comando shutdown

Una volta eseguito il comando notificher`a tutti gli utenti connessi ad un terminale dellimminenza delle operazioni di arresto,224 cos` che questi possano salvare eventuali cambiamenti ai
file e scollegarsi, verr`
a inoltre automaticamente disabilitata la possibilit`a di collegarsi al sistema.
Allo scadere del tempo specificato il sistema verr`a portato sul runlevel richiesto per compiere
il riavvio, lo spegnimento o linserimento in single user mode. Si sono riportate le altre principali opzioni di shutdown in tab. 5.28, per lelenco completo e tutti i dettagli si faccia al solito
riferimento alla pagina di manuale.
Si tenga presente infine che quando `e previsto uno spegnimento o una manutenzione che
render`a impossibile laccesso al sistema, `e buona norma avvisare preventivamente gli utenti.
Abbiamo visto che shutdown `e in grado di farlo al momento della sua invocazione, ma questo
vale soltanto per gli utenti che in quel momento sono effettivamente collegati alla macchina. Se
si conoscono le necessit`
a con sufficiente anticipo `e allora opportuno segnalare i futuri momenti
223

fino a qualche tempo fa questo comando non doveva essere invocato direttamente, ma solo alla conclusione
dei runlevel 0 o 6.
224
questo viene fatto con lausilio del comando wall che consente di scrivere un messaggio su tutti i terminali a
cui `e collegato un utente, e che pu`
o essere usato in generale per inviare notifiche, per i dettagli si consulti al solito
la pagina di manuale.

5.4. LA GESTIONE DI INTERFACCE E PERIFERICHE

329

di fermo a chiunque si collegher`


a alla macchina tramite i messaggi di benvenuto che vengono
stampati allaccesso, controllati dai file visti in sez. 4.3.5.225

5.4

La gestione di interfacce e periferiche

Tratteremo in questa sezione gli argomenti relativi allutilizzo di una serie di tipiche interfacce
hardware di cui sono dotati i moderni computer, e come, con le versioni pi`
u recenti di Linux, il
relativo supporto venga gestito in maniera il pi`
u possibile automatica attraverso sistemi come
hotplug e udev.

5.4.1

Gestione delle interfacce di espansione

Una delle caratteristiche essenziali dellarchitettura hardware dei computer moderni `e quella di
disporre di opportune interfacce di espansione in cui inserire delle schede dedicate che permettono luso di nuove periferiche; si ha cos` la possibilit`a di ampliare le capacit`a di un computer
utilizzando degli appositi dispositivi in grado effettuare i pi`
u svariati compiti.
Una interfaccia di espansione in sostanza non fornisce direttamente delle funzionalit`a finali,
che sono specifiche del singolo dispositivo che si pone su di essa, quanto una interfaccia hardware
comune che consente una comunicazione fra la CPU e la memoria e tutti i dispositivi che sono
posti su detta espansione. In questo modo il sistema operativo pu`o inviare comandi e scambiare
dati con le singole periferiche, in modo da poterne utilizzare le capacit`a specifiche.
In Linux il supporto per queste interfacce `e ovviamente fornito direttamente dal kernel,
che predispone tutta linfrastruttura software con cui `e possibile leggere i dati relativi a dette
interfacce, e poi dialogare con i singoli dispositivi su di esse presenti. Questi ultimi, seguendo il
criterio fondamentale dellarchitettura di un sistema unix-like per cui tutto `e un file, potranno
poi essere acceduti attraverso linterfaccia generica illustrata in sez. 1.2.1.226
Le due interfacce di espansione tradizionalmente pi`
u utilizzate nel mondo dei computer basati sulla architettura classica dei cosiddetti PC (in sostanza la piattaforma basata su Intel o
compatibili) sono la ormai superata ISA (Industry Standard Architecture) e la pi`
u recente ed
ampiamente utilizzata PCI (Peripheral Component Interconnect). Entrambe queste interfacce
definiscono uno standard sia hardware (consistente in piedinatura, dimensioni, specifiche dei
segnali elettrici ecc.) che software (i comandi che la CPU deve dare per comunicare con linterfaccia ed i dispositivi presenti sulla stessa). Ad oggi ISA `e completamente abbandonata,
mentre lo standard PCI ha subito diverse evoluzioni, ma i concetti di base restano comunque
sostanzialmente gli stessi.
La struttura di base di queste interfacce `e quella di definire uno speciale canale di comunicazione (il cosiddetto bus) sul quale far passare sia i dati che i comandi che vanno dal sistema
centrale (CPU e memoria) ai dispositivi inseriti nellinterfaccia stessa (le periferiche appunto), e
viceversa. Le interfacce forniscono inoltre un opportuno meccanismo che permetta di comunicare in maniera indipendente (identificando opportunamente i flussi di dati sul bus) con ciascuna
delle periferiche presenti sullinterfaccia.
Una descrizione dettagliata del funzionamento di queste interfacce va ben oltre lo scopo di
queste dispense, la loro gestione `e infatti completamente realizzata allinterno del kernel attraverso il codice relativo al loro supporto. Quello che interessa dal punto di vista dellamministrazione
di sistema `e capire quali sono le risorse utilizzate e come allocarle e le funzionalit`a messe a disposizione del kernel che consentono di accedere alle informazioni relative a dette interfacce ed
ai dispositivi su di esse presenti a scopo di configurazione o di controllo.
225

vale a dire inserire un opportuno avviso o in /etc/motd o allinterno di /etc/issue e /etc/issue.net.


con leccezione delle interfacce di rete, che non rientrando bene in questa astrazione, vengono utilizzate
diversamente.
226

330

CAPITOLO 5. AMMINISTRAZIONE STRAORDINARIA DEL SISTEMA

Le risorse fondamentali usate da una interfaccia sono sostanzialmente due gli interrupt e
i canali DMA. Un interrupt `e un meccanismo con cui un dispositivo hardware pu`o inviare un
segnale al processore227 (usando quella che si chiama una linea di interrupt) cos` che questo possa
interrompere le operazioni e rispondere allesigenza di attenzione cos` manifestata dal dispositivo.
In genere un processore ha un numero limitato di linee di interrupt (originariamente nei PC erano
8, poi sono state portate a 15), in altre architetture sono 32 o 64.
Nei computer pi`
u recenti, con il crescere del numero di dispositivi e la presenza di sistemi
multiprocessore la gestione degli interrupt `e stata demandata ad un apposito sistema, denominato APIC, da Advanced Programmable Interrupt Controllers, questo oltre a fornire un numero
di interrupt molto pi`
u elevato, la definizione di priorit`a e lallocazione dinamica degli stessi,
consente anche di risolvere i problemi connessi alla presenza di pi`
u processori,228 realizzando un
meccanismo di smistamento fra gli stessi.
Il sistema prevede la presenza di due componenti, lAPIC locale (LAPIC), presente nella
misura di una unit`
a per processore, che gestisce gli interrupt destinati al singolo processore e
quelli creati fra processori, e lI/O APIC, presente nella misura di una unit`a per bus di periferiche,
che gestisce gli gli interrupt ricevuti dalle periferiche stesse e li instrada verso gli APIC locali,
per il trattamento da parte dei singoli processori.
La seconda risorsa `e quella dei canali DMA, questi sono un meccanismo hardware che consente dei trasferimenti diretti di dati da una periferica alla memoria senza che questi debbano
essere letti direttamente con lintervento della CPU, che pu`o essere utilizzata in altre operazioni.
Con luso dei canali DMA il sistema si limita a richiedere solo un intervento iniziale della CPU
per indicare al dispositivo in quale zona di memoria inviare i dati, che saranno poi trasferiti in
maniera asincrona. In genere luso di un canale DMA si abbina sempre a quello di un interrupt
che serve a segnalare la conclusione del trasferimento, cos` che la CPU venga avvertita che `e
possibile utilizzare i dati disponibili in memoria.
Uno dei problemi relativi alla gestione delle interfacce di espansione `e allora proprio quello
della allocazione degli interrupt e dei canali DMA ai dispositivi esistenti,229 che di norma pu`o
essere eseguita a livello di BIOS. In particolare alcuni interrupt sono assegnati staticamente a
periferiche presenti sui PC da prima che fosse possibile una allocazione dinamica, come linterfaccia IDE per i dischi, le seriali e la parallela; gli altri poi possono essere lasciati liberi per luso
da parte delle interfacce di espansione o di altre interfacce interne come USB (che vedremo in
sez. 5.4.4).
I problemi che possono sorgere sono allora quelli dellallocazione di queste risorse; il kernel
permette di esaminare lo stato corrente di queste allocazioni attraverso i due file /proc/interrupts
per gli interrupt e /proc/dma per i canali DMA; un esempio potrebbe essere il seguente:
# cat /proc/interrupts
CPU0
0:
584706
1:
15435
2:
0
8:
4
9:
2
10:
933383
11:
2170
12:
319229
14:
56
15:
162630
227

XT-PIC
XT-PIC
XT-PIC
XT-PIC
XT-PIC
XT-PIC
XT-PIC
XT-PIC
XT-PIC
XT-PIC

timer
keyboard
cascade
rtc
usb-uhci, usb-uhci, btaudio, bttv
EMU10K1, eth0
ide2, ide3, aic7xxx
PS/2 Mouse
ide0
ide1

nei sistemi tradizionali questo viene fatto fisicamente alzando un livello su uno dei piedini del processore a
questo dedicato.
228
in tal caso si tratta di decidere a quale processore inviare linterrupt perche lo processi.
229
in realt`
a questo `e un problema che si aveva quasi esclusivamente sui PC intel-compatibili, che avevano pochi
interrupt e canali DMA e tutta una serie di limitazioni ereditate dallarchitettura originaria che su altre piattaforme
non esistono.

5.4. LA GESTIONE DI INTERFACCE E PERIFERICHE


NMI:
LOC:
ERR:
MIS:

331

0
584659
848
0

che mostra lallocazione degli interrupt, il cui numero progressivo `e riportato in prima colonna,
rispettivamente ai dispositivi ad essi associati (riportati nellultima); nella seconda colonna sono
riportati il numero di interrupt registrati al momento ed un sommario di questa statistica `e
riportato nelle ultime quattro righe. Analogamente abbiamo:
# cat /proc/dma
4: cascade

che mostra lallocazione dei canali DMA.


Luso di APIC sulle macchine pi`
u moderne permette in genere di risolvere i problemi di
allocazione degli interrupt, ma pu`
o accadere che ne introduca a sua volta di altri. In particolar
modo a causa di errori sia nellimplementazione dellhardware, che nel supporto da parte del
kernel, ci si pu`
o trovare con un sistema non funzionante. Per questo motivo su Linux `e disponibile
fra le opzioni di avvio del kernel (vedi sez. 5.3.1) noapic che disabilita luso di questo sistema,
o nosmp che inoltre disabilita anche luso in modalit`a multiprocessore. Si tratta di soluzioni di
emergenza a cui si pu`
o provare a ricorrere in caso si manifestino problemi.
Una terza risorsa usata da alcune periferiche `e quella delle porte di I/O, una modalit`
a di
comunicazione diretta fra la CPU e le stesse effettuata attraverso laccesso ad alcune locazioni di
memoria riservate (chiamate appunto in questo modo) leggendo e scrivendo dalle quali si andava
a leggere e scrivere direttamente sui dispositivi. Anche in questo caso alcune di queste porte
sono allocate staticamente a periferiche standard come le seriali, mentre altre possono dover
essere allocate opportunamente quando si inserisce il relativo dispositivo su una interfaccia di
espansione; la situazione corrente dellallocazione `e riportata dal kernel nel file /proc/ioports,
un cui esempio `e:
# cat /proc/ioports
0000-001f : dma1
0020-003f : pic1
0040-005f : timer
0060-006f : keyboard
0070-007f : rtc
0080-008f : dma page reg
00a0-00bf : pic2
00c0-00df : dma2
00f0-00ff : fpu
0170-0177 : ide1
01f0-01f7 : ide0
02e8-02ef : serial(set)
02f8-02ff : serial(set)
0376-0376 : ide1
03c0-03df : vga+
03f6-03f6 : ide0
03f8-03ff : serial(set)
0cf8-0cff : PCI conf1
5c20-5c3f : ALi Corporation M7101 PMU
...

Di nuovo con tutto lhardware recente questa allocazione viene gestita in maniera dinamica
e trasparente per lutente, ci sono casi per`o, specie con vecchie periferiche, in cui non `e cos` e
pu`o essere necessario dover effettuare una allocazione manuale (in genere tramite il BIOS).
Una delle prime interfacce di espansione realizzate nei PC tradizionali `e stata la ISA, che
nacque come estensione dei bus dei vecchi PC, che consentivano lutilizzo di schede di espansione
dedicate. Originariamente linterfaccia prevedeva un bus a 8 bit, quasi subito portato a 16; veniva

332

CAPITOLO 5. AMMINISTRAZIONE STRAORDINARIA DEL SISTEMA

usata principalmente per modem interni e schede sonore, al giorno doggi `e totalmente in disuso,
e si trova soltanto su delle macchine molto vecchie.
Le prime versioni dellinterfaccia prevedevano la presenza di opportuni interruttori sulle schede stesse (i cosiddetti jumper ) che permettevano di selezionare in maniera manuale gli interrupt,
i canali DMA o le porte di I/O da utilizzare. In questo caso era cura del sistemista allocare queste risorse in maniera compatibile fra le varie schede (con le opportune impostazioni sui jumper );
in particolare gli interrupt che a differenza del pi`
u recente bus PCI non possono essere condivisi
fra schede diverse.
Per evitare questo problema e facilitare luso delle schede di espansione da parte degli utenti
meno esperti venne creato uno standard per lautoconfigurazione delle schede chiamato Plugn
Play,230 in cui le precedenti risorse potevano essere allocate dinamicamente dal sistema operativo
o dal BIOS ed impostate sulle schede. Il supporto per questa funzionalit`a prevede un meccanismo
di configurazione detto isolation,231 in cui ad ogni scheda venga assegnato un Card Serial Number
(in breve CSN) che la identifica e ne vengono rilevate le caratteristiche, dopo di che alle varie
schede vengono assegnate le risorse da utilizzare in modo che non ci sia conflitto.
In questo modo un driver pu`
o utilizzare la scheda conoscendo i parametri che indicano
quale risorsa utilizzare; nel caso di Linux buona parte dei moduli delle schede ISA utilizzano i
parametri irq, ioport e dma che permettono di utilizzare la scheda sapendo quali sono le risorse
ad essa allocate. Il problema `e che se un modulo viene caricato prima che il PnP abbia eseguito
lallocazione la scheda non sar`
a utilizzabile, inoltre se il meccanismo fallisce ci si pu`o trovare con
delle schede presenti ma non utilizzabili, se poi si cerca di riallocare le risorse di una scheda in
uso gli effetti possono essere anche peggiori.232
Le modalit`a con cui le schede vengono configurate sono sostanzialmente due: alcuni BIOS
sono in grado di eseguire da soli il procedimento di allocazione delle risorse, e presentare il
risultato finale al sistema operativo;233 altri non sono in grado di farlo234 ed il procedimento
dovr`a allora essere effettuato direttamente dal sistema operativo prima di poter utilizzare i
driver.235
In genere236 quando il BIOS esegue la configurazione delle schede PnP questa viene salvata
nella memoria non volatile (la cosiddetta ESCD, Extended System Configuration Data, dove
vengono mantenute tutte le configurazioni del BIOS) in modo da poter essere riutilizzata al
riavvio successivo; quando viene inserita una nuova scheda Plugn Play questa verr`a riconosciuta
e configurata e la configurazione sar`
a aggiunta nella ESCD. Sebbene in teoria questo permetta
di evitare la riconfigurazione tutte le volte che si riavvia la macchina, con Linux c`e il problema
che quando la configurazione viene eseguita in un secondo tempo i nuovi valori non vengono
salvati nella ESCD.
Per tutta questa serie di motivi il meccanismo del Plugn Play finisce con il complicare
notevolmente le cose, dato che molte delle funzionalit`a vengono a dipendere dalla versione di
BIOS disponibile e da come questo e le relative schede supportano lo standard. Per questo
motivo con Linux `e in genere preferibile usare le capacit`a di configurazione fornite direttamente
dal sistema.
230

quasi immediatamente ribattezzato in Plugn Pray visto che spesso il meccanismo non funzionava e le risorse
venivano allocate in maniera non compatibile con altre schede, con conseguente impossibilit`
a di usare le espansioni.
231
una descrizione pi`
u dettagliata pu`
o essere trovata nel Plug-and-Play HOWTO.
232
con buona probabilit`
a il blocco completo del sistema.
233
questo nel caso di Linux significa solo che si dovranno individuare quali sono le risorse assegnate, passando
gli opportuni valori ai moduli che le utilizzano.
234
o si pu`
o dire al BIOS di non farlo specificando che si ha un sistema operativo PnP enabled che si occuper`
a
del compito nella apposita sezione di configurazione.
235
questo, nel caso di Linux, significa che la configurazione dovr`
a essere effettuata prima di caricare i moduli
relativi a dette schede.
236
alcuni BIOS meno evoluti non supportano questa funzionalit`
a.

5.4. LA GESTIONE DI INTERFACCE E PERIFERICHE

333

Prima dei kernel della serie 2.4.x, lunico modo di eseguire la configurazione era grazie al
programma isapnp, a partire da essi il supporto per la configurazione `e stato introdotto nel
kernel grazie al modulo isa-pnp che viene chiamato dai vari driver dei dispositivi per eseguire
lallocazione delle risorse. Il programma viene comunque ancora utilizzato (e lo descriveremo
a breve) anche se non `e pi`
u strettamente necessario, almeno fin quando i driver ed il supporto
sulle schede funzionano correttamente.
Il comando prende come unico argomento il nome di un file di configurazione (che in genere `e
/etc/isapnp.conf), ed esegue le impostazioni secondo le direttive in esso contenute. Le uniche
opzioni sono --help e --version il cui significato `e evidente; a partire dalla versione 1.18 si pu`
o
usare anche - come nome di file, per indicare una lettura dallo standard input.
Eseguendo il comando si esegue la configurazione delle schede e lassegnazione delle risorse
secondo quanto specificato nella configurazione. In genere dovrebbe essere eseguito ad ogni
riavvio, in quanto con Linux non c`e modo di salvare le impostazioni precedenti. Se non si fa cos`
si corre il rischio, usando Windows (95 o 98) sulla stessa macchina che questo configuri le schede
in maniera differente, cos` che al successivo riavvio con Linux queste diventino inutilizzabili.
Il formato di isapnp.conf `e piuttosto complesso, e non staremo qui a descriverlo (gli interessati possono fare riferimento alla pagina di manuale, accessibile con man isapnp.conf) dato
che in genere questo file viene prodotto automaticamente grazie al comando pnpdump. Questo
comando permette infatti di ricavare i dati delle schede presenti sulla macchina eseguendo una
scansione del bus ISA alla ricerca di schede che supportano il Plugn Play e leggendo da ciascuna
di esse lelenco delle risorse necessarie (il PnP prevede che esse siano memorizzate allinterno
della scheda).
Il problema `e che in certi casi le informazioni riportate non sono accurate; questo perche
fintanto che le schede non erano necessarie allavvio alcuni produttori sono stati piuttosto pigri
nella specificazione delle risorse necessarie allinterno della scheda, contando sulluso del driver
(ovviamente fornito solo per DOS/Windows) per eseguire le impostazioni. Questo significa che
in certi casi le informazioni ricavate da pnpdump non sono corrette, e potrebbe essere necessario
controllare quali sono le risorse utilizzate sotto Windows per ricavare dati esatti.
Il comando comunque esegue la scansione effettuando vari tentativi di comunicazione con le
eventuali schede, interrogando in fila tutte le porte di I/O possibili (nellintervallo fra 0x203 e
0x3ff, riservato alle schede ISA), per identificare quali di queste corrispondono ad un dispositivo
presente sul BUS, cui richiedere le informazioni. Si tenga presente per`o che in certi casi si
possono avere conflitti (linterrogazione cio`e pu`o interferire con altre schede non PnP o gi`
a
configurate) con risultati che vanno dalla successiva inutilizzabilit`a delle suddette schede al
blocco completo del sistema. Pertanto `e sempre opportuno eseguire il comando in single user
mode (vedi sez. 5.3.5).
Se invocato senza argomenti il comando stampa sullo standard output il risultato della
scansione, direttamente nel formato utilizzato per la configurazione del programma isapnp;
di default per`
o tutte le istruzioni sono commentate, pertanto `e comune salvare il file e poi
modificarlo per togliere i commenti. Se per`o lo si invoca con lopzione -c il comando stesso cerca
di determinare le impostazioni pi`
u sicure e fornisce una versione pronta (cio`e senza necessit`
a di
togliere i commenti) del file stesso. Si tenga presente per`o che se lallocazione risulta impossibile
il comando pu`
o bloccarsi indefinitamente nel tentativo di trovare una soluzione.
Se il comando viene invocato con un solo argomento questo viene interpretato come il valore
minimo della porta di I/O da cui iniziare la scansione sul bus ISA, si pu`o cos` limitare lintervallo
evitando di interrogare schede gi`
a configurate o non PnP. Largomento pu`o essere specificato
come valore esadecimale (se inizia con le cifre 0x), ottale (se inizia per 0) o decimale.
Se si usano due argomenti in questo caso il primo dei due assume il significato di numero
di schede gi`
a identificate e configurate dal BIOS, nel qual caso il programma non esegue la
procedura di ricerca, e inizia la scansione per nuove schede a partire dallindirizzo passato come

334

CAPITOLO 5. AMMINISTRAZIONE STRAORDINARIA DEL SISTEMA


Opzione
-c

-d

-h
-i

-v
-o

Significato
tenta di determinare delle impostazioni sicure per i dispositivi, e produce un output direttamente utilizzabile senza necessit`
a di rimuovere i
commenti.
scarica i valori dei registri interni per ogni scheda e li stampa sullo standard output, in questo modo `e possibile vedere le eventuali impostazioni
fatte dal BIOS o mantenute di default dalle schede stesse.
stampa un messaggio di aiuto.
ignora gli errori di checksum nel riconoscimento degli indirizzi delle
porte di I/O; in alcuni casi questo non `e dovuto a conflitti e porta
a classificare come non valide tutte le porte, ignorandolo si potranno
trovare lo stesso le schede presenti.
stampa la versione.
scrive il risultato sul file passato come parametro invece che sullo
standard output.
Tabella 5.29: Principali opzioni per il comando pnpdump.

secondo argomento. Le opzioni principali del comando sono riportate in tab. 5.29. Al solito per
lelenco completo ed i dettagli si faccia riferimento alla pagina di manuale.
Lo standard PCI Peripheral Connect Interface venne creato per fornire un bus di espansione
generico che fosse adatto allevoluzione dei computer, ed in grado di supportare velocit`a di
trasferimento dei dati molto superiori al precedente ISA. Il bus nasce a 32 bit e prevede una
frequenza per le operazioni di 33.3MHz, per una banda passante teorica di circa 1Gbit/s. In
seguito sono state realizzate varie estensioni dello standard, fra cui il bus AGP delle schede video
(che `e sostanzialmente un PCI con frequenze operative pi`
u alte), ed ulteriori evoluzioni come il
PCI-X ed il PCI Express.237
A differenza del bus ISA nel caso di PCI la allocazione delle risorse `e dinamica; in genere gli
interrupt vengono associati sulla base dello slot su cui `e inserita la scheda di espansione, inoltre
il bus supporta la condivisione degli interrupt. Unaltra caratteristica specifica del bus PCI `e che
ogni scheda riporta al suo interno (nel firmware) una serie di informazioni fra cui una coppia di
numeri che specificano sia il produttore che il tipo della scheda, che possono essere confrontati con
un database delle schede prodotte (usualmente mantenuto nel file /usr/share/misc/pci.ids).
In un bus PCI ciascuna periferica viene identificata univocamente grazie ad un indirizzo che
`e composto da tre numeri: il numero di bus, il numero di dispositivo ed il numero di funzione.
Il numero di bus identifica su quale bus si trova la scheda, infatti lo standard supporta la
possibilit`a di avere pi`
u bus (fisicamente distinti) sulla stessa macchina, fino ad un massimo di
256. Una caratteristica comune del PCI `e che i bus possono essere collegati fra di loro attraverso
dei dispositivi appositi detti PCI bridge, per cui con una scheda apposita si pu`o controllare
un altro bus PCI contenente altre schede. Per ciascun bus si possono poi inserire fino a 32
schede diverse (identificate per numero di dispositivo) che possono supportare fino a 8 diverse
periferiche cadauna (in caso di schede multifunzione); il tutto compone un numero a 16 bit che
viene a costituire lindirizzo hardware della periferica sul bus PCI.
I computer pi`
u recenti in genere hanno sempre almeno due bus (uno dei quali viene usato
principalmente per lAGP), la CPU `e collegata attraverso il cosiddetto host bridge sul bus principale che `e sempre il bus 0, ulteriori bus sono agganciati su questo con un PCI bridge e su di
essi possono essere agganciati ulteriori bus in modo da formare un albero. Uno schema della
disposizione dei bus pi`
u comune nelle architetture PC `e in fig. 5.4.
In generale il kernel riporta le informazioni relative a tutte le periferiche disponibili sul bus
PCI allinterno del filesystem proc nella directory /proc/bus/pci. Allinterno della directory `e
presente, per ogni bus PCI presente nel sistema, una sottodirectory identificata con il numero
assegnato a ciascun bus che contiene un file per ciascuna periferica nella forma NumeroDispo237

che riguardano diversi formati per le schede, uso di bus a 64 bit e maggiori velocit`
a di trasferimento.

5.4. LA GESTIONE DI INTERFACCE E PERIFERICHE

335

Figura 5.4: Schema della disposizione del bus PCI e delle varie interfacce di espansione.

sitivo.NumeroFunzione, ed il file devices in cui sono riportate le informazioni relative a tutte


le schede presenti (ed agli eventuali moduli cui sono associate).238
La lista dei dispositivi presenti sul bus pu`o essere ottenuta anche con il comando lspci; nei
nuovi kernel questo `e il metodo canonico, e sar`a lunico supportato in futuro. Il comando non
prende argomenti e stampa sullo standard output la lista delle schede rilevate sul bus PCI, con
qualcosa del tipo:
[root@gont corso]# lspci
00:00.0 Host bridge: VIA Technologies, Inc. VT8363/8365 [KT133/KM133] (rev 03)
00:01.0 PCI bridge: VIA Technologies, Inc. VT8363/8365 [KT133/KM133 AGP]
00:07.0 ISA bridge: VIA Technologies, Inc. VT82C686 [Apollo Super South] (rev 4
0)
00:07.1 IDE interface: VIA Technologies, Inc. VT82C586/B/686A/B PIPC Bus Master
IDE (rev 06)
00:07.2 USB Controller: VIA Technologies, Inc. USB (rev 16)
00:07.3 USB Controller: VIA Technologies, Inc. USB (rev 16)
00:07.4 Host bridge: VIA Technologies, Inc. VT82C686 [Apollo Super ACPI] (rev 4
0)
00:09.0 SCSI storage controller: Adaptec AHA-2940U/UW/D / AIC-7881U (rev 01)
00:0f.0 Ethernet controller: Realtek Semiconductor Co., Ltd. RTL-8139/8139C/813
9C+ (rev 10)
01:00.0 VGA compatible controller: nVidia Corporation NV11 [GeForce2 MX/MX 400]
(rev a1)

Il comando riporta nella prima colonna lindirizzo di ciascun dispositivo ordinato per numero
di bus, numero di dispositivo e numero di funzione seguito da una descrizione sommaria della
periferica relativa; usando lopzione -v si pu`o avere una descrizione pi`
u dettagliata comprensiva
delle risorse utilizzate dalla periferica stessa, con qualcosa del tipo di:
0000:00:12.0 Ethernet controller: VIA Technologies, Inc. VT6102 [Rhine-II] (rev 74)
Subsystem: Micro-Star International Co., Ltd.: Unknown device 7120
Flags: bus master, medium devsel, latency 32, IRQ 23
I/O ports at dc00 [size=256]
238

nelle vecchie versioni del kernel esisteva solo il file /proc/pci, contenente una lista descrittiva delle schede
presenti, eliminato nella serie 2.6.x, e presente per compatibilit`
a nella serie 2.4.x.

336

CAPITOLO 5. AMMINISTRAZIONE STRAORDINARIA DEL SISTEMA


Memory at dffffe00 (32-bit, non-prefetchable) [size=256]
Capabilities: <available only to root>

e ripetendo una seconda volta lopzione si possono avere ancora pi`


u dettagli.
Con lopzione -t si pu`
o invece avere una stampa della struttura ad albero del bus, mentre con
-s si pu`o selezionare quali dispositivi guardare, passando un parametro che esprime il relativo
indirizzo nella forma bus:slot.func (il formato della prima colonna del precedente esempio)
dove ciascun numero identificativo pu`
o essere sostituito dal carattere jolly *. Le altre opzioni
principali sono riportate in tab. 5.30, per un elenco completo si faccia al solito riferimento alla
pagina di manuale del comando.
Opzione
-v
-n
-b
-t
-s

-d

-i

Significato
aumenta le informazioni stampate (pu`
o essere ripetuto due volte).
riporta il valore numerico degli identificatori delle schede invece di usare
la descrizione testuale riportata nel database.
riporta la lista degli interrupt per come li vede il bus (con APIC nel
kernel vengono rimappati).
mostra una schematizzazione ad albero della disposizione dei
dispositivi.
mostra le informazioni relative ad uno o pi`
u dispositivi che corrispondono ad un certo indirizzo sul bus espresso da un parametro nella forma
bus:slot.func.
mostra le informazioni relative ai dispositivi di un singolo produttore
(usando gli identificativi della scheda sulla base del valore del parametro
vendorID:deviceID) dove entrambi gli identificativi sono espressi come
numeri esadecimali.
usa il file passato come parametro come database degli identificativi
delle schede PCI.
Tabella 5.30: Principali opzioni per il comando lspci.

Un secondo comando utilizzabile per operare sul bus PCI `e setpci, che pu`o essere utilizzato
per interrogare e configurare i singoli dispositivi presenti sul bus. Il comando necessita sempre
di una opzione di selezione per indicare su quale dispositivo operare, questa pu`o essere sia -s per
usare lindirizzo che -d per usare lidentificativo della scheda; entrambe usano la stessa sintassi
gi`a vista in tab. 5.30 per lspci.
Il comando prende come argomento il nome del registro239 su cui si vuole operare. Indicando
solo il nome di un registro ne sar`
a stampato il valore corrente, indicando una assegnazione nella
forma registro=valore ne sar`
a invece cambiato il contenuto (si tenga conto che il valore deve
essere espresso in esadecimale). Al nome del registro si possono aggiungere i suffissi .B, .W e .L
per indicare che si vuole eseguire loperazione su un registro di dimensione pari ad un byte, una
parola (16 bit) o una parola lunga (32 bit). Al posto del nome pu`o anche essere usato un valore
esadecimale che ne indica la posizione nello spazio dei registri.
Un elenco sommario dei principali registri e del relativo significato `e riportato in tab. 5.31, un
elenco completo di tutti i nomi definiti `e riportato nella pagina di manuale di setpci (i nomi sono
riportati in maiuscolo, ma possono essere specificati anche in minuscolo), per il relativo significato
si pu`o fare riferimento alla dichiarazione delle costanti omonime in /usr/include/linux/pci.h
o alle specifiche dello standard PCI.

5.4.2

Gestione delle interfacce SCSI

Linterfaccia SCSI (Small Computer System Interface) potrebbe essere inserita fra le interfacce
di espansione generiche trattate in sez. 5.4.1 in quanto anche essa definisce una struttura a bus
239

lo standard PCI prevede che tutte le schede debbano avere una serie di registri di configurazione, che contengono informazioni o controllano vari aspetti del loro funzionamento, come il tempo massimo che un dispositivo
pu`
o tenere il bus.

5.4. LA GESTIONE DI INTERFACCE E PERIFERICHE


Registro
device_id
vendor_id
latency_timer

min_gnt

max_lat

337

Significato
identificativo del dispositivo.
identificativo del produttore del dispositivo.
imposta un temporizzatore scaduto il quale il dispositivo rilascia luso
del bus (cos` si permette un uso pi`
u corretto del bus da parte di altri
dispositivi presenti).
valore (in sola lettura) del tempo minimo per il quale deve essere garantito luso del bus al dispositivo (in unit`
a di quarti di
microsecondo).
valore (in sola lettura) che specifica quanto spesso il dispositivo
necessita di accedere al bus (in unit`
a di quarti di microsecondo).

Tabella 5.31: Costanti identificative di alcuni registri PCI usate dal comando setpci.

su cui vengono innestati dispositivi multipli. La trattiamo a parte in quanto in realt`a questa
non `e necessariamente una interfaccia collegata ad un solo PC240 e di norma viene realizzata
tramite luso di apposite schede (i controller SCSI ) che si inseriscono in una delle interfacce
precedentemente citate (ormai esclusivamente PCI, anche se alcuni vecchi controller usavano
linterfaccia ISA) e vengono utilizzati tramite esse.
Una seconda differenza con le interfacce generiche di sez. 5.4.1 `e che nonostante sia possibile
inserire dispositivi diversi su un bus SCSI, linterfaccia `e utilizzata quasi esclusivamente per
laccesso a periferiche di stoccaggio di dati (principalmente dischi e nastri, ma anche CD e
masterizzatori) e non alluso di periferiche generiche,241 ed il protocollo stesso della trasmissione
dei dati sul bus `e dedicato a questo tipo di lavoro. Infine il bus non `e di solito cablato in soluzione
unica su una piastra madre, ma pu`o essere realizzato anche con un insieme di connettori che
collegano fra loro le varie periferiche.
Uno dei problemi maggiori con le interfacce SCSI `e che dalla prima definizione dello standard
(SCSI-1, del 1986) si sono susseguite molte modifiche: lo SCSI-2, cui segue lo SCSI-3 che per`
o
non `e mai stato rilasciato come tale ed `e stato suddiviso in parti distinte dellinterfaccia; ma
anche allinterno degli stessi standard le modalit`a di realizzazione delle cablature, dei connettori
e dei segnali sono varie il che ha portato ad una discreta confusione.
Lo standard originario (SCSI-1) prevedeva un bus basato su un connettore a 50 pin, di cui
8 (pi`
u uno di parit`
a) erano riservati per la trasmissione dei dati, la frequenza di trasmissione
era di 5MHz, con una corrispondente velocit`a massima di trasferimento di 5MB/s, erano poi
previste 4 linee per gli indirizzi, consentendo fino ad un massimo di 8 periferiche sul bus.
Una prima modifica, chiamata Fast SCSI venne fatta aumentando la frequenza del bus a
10MHz per raddoppiare la velocit`
a di trasferimento. Altre modifiche vennero fatte riguardo la
modalit`a di gestione dei segnali sui cavi ed il tipo di cablatura, questo port`o allo sviluppo di
un secondo standard (lo SCSI-2). Lo standard prevedeva una lunga serie di estensioni, molte
delle quali relative alla gestione dei segnali sui cavi ed alla composizione della cablatura stessa
(terminazione attiva, segnali differenziali, nuovi connettori), oltre ad un aumento dei comandi
disponibili e allintroduzione del sistema del command queing che permetteva ad un singolo
dispositivo di accettare pi`
u comandi, in modo da poterne ottimizzare lordine di esecuzione.
Una delle modifiche principali (detta Wide SCSI ), che richiede un connettore diverso a 68
pin, prevedeva la possibilit`
a di usare un bus per il trasferimento dati a 16 bit (detto wide, in
contrapposizione con il precedente, detto narrow ) raddoppiando anche il numero di periferiche
inseribili nel bus. In questo modo si otteneva a parit`a di frequenza (con il cosiddetto Fast Wide
SCSI ) un raddoppio della velocit`
a di trasferimento 20MB/s.
240
`e infatti possibile, e viene fatto normalmente con sistemi di dischi condivisi, collegare pi`
u PC alla stessa
interfaccia SCSI.
241
unica eccezione ancora in uso `e quella degli primi scanner che, non essendo allepoca disponibile una interfaccia
pi`
u semplice con sufficienti capacit`
a, venivano pilotati da una interfaccia SCSI.

338

CAPITOLO 5. AMMINISTRAZIONE STRAORDINARIA DEL SISTEMA

Figura 5.5: Schema della struttura delle interfacce SCSI.

Passi successivi sono state lintroduzione di bus con frequenze sempre maggiori consentendo
velocit`a di trasferimento sempre maggiori: Ultra SCSI a 40MB/s, Ultra2 a 80MB/s, Ultra160
a 160MB/s e ultimamente pure Ultra 320 a 320MB/s e Ultra 640 a 640MB/s. Inoltre `e stato
introdotto pure il SAS, Serial Attached SCSI in cui si `e abbandonato il bus parallelo per passare ad un collegamento di tipo seriale ad alta velocit`a mantenendo il protocollo dei comandi
SCSI, come avvenuto con il Serial ATA. Infine con iSCSI ci si `e resi indipendenti dal mezzo di
collegamento fisico, facendo passare i comandi del protocollo sulla rete.
Lo schema classico di una interfaccia SCSI `e riportato in fig. 5.5, il bus prevede lesistenza
di almeno una unit`
a di controllo, la scheda, detta controller SCSI, che in genere si mette sul bus
PCI del computer, e a cui si collegano le altre periferiche utilizzando gli appositi connettori. Un
singolo controller pu`
o gestire anche pi`
u bus, nel qual caso sar`a in grado di alloggiare pi`
u connettori. Tutte le periferiche sul bus, compresa lunit`a di controllo, vengono identificate attraverso
un indirizzo di identificazione, detto SCSI ID.

Figura 5.6: Strutturazione del supporto alle interfacce SCSI nel kernel.

Nel caso di Linux il supporto SCSI `e presente fin dalle prime versioni del kernel, ma dato che
lo standard prevede vari tipi di periferiche a partire dal kernel 2.4 il sistema `e stato organizzato
su tre livelli, secondo lo schema illustrato in fig. 5.6. Al livello pi`
u alto, utilizzati direttamente dai
programmi quando accedono ai relativi file di dispositivo, stanno i driver per le periferiche che
si trovano sul bus, come CD, nastri o dischi, ciascuno dei quali richiede una modalit`a daccesso

5.4. LA GESTIONE DI INTERFACCE E PERIFERICHE

339

distinta; a questi si aggiunge il supporto generico che viene usato come interfaccia per inviare
direttamente comandi ad una periferica (che viene usato per pilotare dispositivi particolari come
gli scanner o i masterizzatori).
Il livello intermedio costituisce il collante fra i driver dei dispositivi finali ed i driver che invece
si occupano di gestire i controller per laccesso al bus, che saranno diversi a seconda della scheda
SCSI utilizzata. Oltre a questultimi per`o si situano a questo livello anche tutti i moduli che
consentono di utilizzare il protocollo SCSI per controllare dispositivi posti su altre interfacce. Ad
esempio il protocollo viene utilizzato per accedere ai dischi sia sul bus USB (che siano memorie
a stato solido o veri e propri hard disk) che Serial ATA, sia per utilizzare i masterizzatori IDE
attraverso un meccanismo di emulazione. In tal caso i comandi del protocollo SCSI, invece di
diventare segnali elettrici su connettore attaccato ad un controller, saranno inviati su un bus
virtuale fornito dal driver per il supporto di dette funzionalit`a.
Le periferiche accedute tramite interfaccia SCSI sono identificate attraverso quattro numeri:
il primo `e lhost adapter number che identifica, come il nome stesso indica, quale `e linterfaccia
(in genere la scheda col controller, ma pu`o essere anche linterfaccia di un bus virtuale) con
cui si accede ai dispositivi; il numero viene assegnato dal kernel allavvio a seconda dellordine
in cui rileva le schede presenti o di quando viene abilitato il supporto per bus virtuali che si
utilizzeranno. Lhost adapter number `e un numero progressivo che parte da zero.
Il secondo numero `e il cosiddetto channel number, che identifica ciascun bus (detto anche, in
altra nomenclatura, canale SCSI) associato ad un host adapter ; alcuni controller infatti possono
gestire pi`
u di un bus, e questi saranno numerati progressivamente a partire da zero, nellordine
in cui ladattatore stesso li presenta (che dipender`a ovviamente da come `e fatto questultimo).
Anche questo `e un numero progressivo che parte da zero.
Allinterno di ciascun canale si avr`a poi lidentificativo del singolo dispositivo posto su di
esso (lo SCSI ID di cui abbiamo gi`a parlato). In genere sui dispositivi questo viene stabilito
dallutente con degli appositi interruttori; di norma sono presenti dei jumper che permettono di
impostare le linee corrispondenti, anche se in alcuni confezionamenti sono disponibili dei selettori.
Per i controller invece lidentificativo pu`o essere modificato dal BIOS di configurazione, ma `e in
genere preimpostato al valore pi`
u alto (in genere 7) che `e quello che ha maggiore priorit`a.
Infine alcuni dispositivi pi`
u sofisticati (come le unit`a a nastro dotate di libreria, o i juke-box di
CDROM) possono avere al loro interno diverse funzionalit`a che vengono allora indirizzate da un
quarto numero detto Logical Unit Name, o LUN. In questo caso la periferica da usare (ad esempio
lunit`a a nastro o il meccanismo di controllo della libreria) viene identificata completamente
usando anche il LUN; per la maggioranza dei dispositivi, che non hanno pi`
u periferiche a bordo,
questo `e nullo.
Pertanto una modalit`
a di indicare le periferiche SCSI `e quella di fornire una quadrupletta di
numeri che indicano interfaccia, canale, ID e LUN, del tipo di:
<scsi(_adapter_number), channel, id, lun>
e quando esse vengono riconosciute dal kernel in fase di avvio si avr`a in messaggio del tipo:
scsi0 : SCSI emulation for USB Mass Storage devices
Vendor: IC35L120 Model: AVV207-0
Rev: 0 0
Type:
Direct-Access
ANSI SCSI revision: 02
USB Mass Storage device found at 2
...
SCSI device sda: 241254720 512-byte hdwr sectors (123522 MB)
sda: assuming drive cache: write through
sda: sda1
Attached scsi disk sda at scsi0, channel 0, id 0, lun 0

340

CAPITOLO 5. AMMINISTRAZIONE STRAORDINARIA DEL SISTEMA

e si noti come in questo caso sia stato rilevato un disco su USB, in cui linterfaccia di emulazione
viene vista come scsi0, ed il dispositivo viene riconosciuto (non essendo qui disponibile un
meccanismo di assegnazione degli ID ogni dispositivo verr`a associato ad una diversa interfaccia)
con valori del canale, ID e LUN nulli.
Il kernel mantiene le informazione relative alle interfacce SCSI disponibili nella directory
/proc/scsi, ed in particolare nel file scsi; un esempio del contenuto del file, quando si ha una
interfaccia cui sono agganciati pi`
u dispositivi `e il seguente:
root@ellington:~# cat /proc/scsi/scsi
Attached devices:
Host: scsi0 Channel: 00 Id: 00 Lun: 00
Vendor: MATSHITA Model: CD-R
CW-7502
Type:
CD-ROM
Host: scsi0 Channel: 00 Id: 01 Lun: 00
Vendor: PIONEER Model: CD-ROM DR-U16S
Type:
CD-ROM
Host: scsi0 Channel: 00 Id: 02 Lun: 00
Vendor: SEAGATE Model: ST118202LW
Type:
Direct-Access

Rev: 4.10
ANSI SCSI revision: 02
Rev: 1.01
ANSI SCSI revision: 02
Rev: 0004
ANSI SCSI revision: 02

ed in questo caso si noti come ci siano tre diversi ID per tre diverse periferiche.
Come gi`a mostrato nel precedente esempio sul contenuto dei messaggi di avvio ogni volta
che una periferica viene rilevata su una interfaccia SCSI gli viene assegnato un file di dispositivo,
questultimo dipende dal tipo di dispositivo, come visto in sez. 5.1.1 nel caso di dischi essi sono
tutti nella forma /dev/sdX dove X `e una lettera progressiva a partire da a; le eventuali partizioni
saranno accedute per numeri crescenti a partire da 1, esattamente come per i dischi IDE classici.
Qualora invece si abbia a che fare con dei CDROM si avranno dispositivi diversi, in particolare
nel caso del secondo esempio si avr`
a (andando a controllare i messaggi di avvio) un risultato del
tipo:
Attached scsi CD-ROM sr0 at scsi0, channel 0, id 0, lun 0
Attached scsi CD-ROM sr1 at scsi0, channel 0, id 1, lun 0
i CD infatti vengono acceduti con i dispositivi /dev/srN dove N `e un numero progressivo a partire
da 0; un nome equivalente, anchesso utilizzato, `e /dev/scdN. Gli altri dispositivi utilizzati sono
/dev/sgN per lutilizzo del driver generico (quello con cui si pilotano ad esempio masterizzatori
e scanner) e /dev/stN per i nastri (con lalternativa di /dev/nstN, in cui il nastro non viene
riavvolto quando arriva alla fine).
Una caratteristica speciale del file /proc/scsi/scsi `e che questo pu`o essere acceduto anche
in scrittura, si possono cos` rimuovere e aggiungere dispositivi, funzionalit`a che pu`o essere utile
qualora si disponga di periferiche hot-swap che possono essere estratte a caldo dal bus242 ; questo
pu`o essere fatto con comandi come:
echo "scsi remove-single-device H C I L" > /proc/scsi/scsi
echo "scsi add-single-device H C I L" > /proc/scsi/scsi
dove H, C, I ed L sono la solita quadrupletta di numeri che identifica il dispositivo. Ovviamente
un dispositivo potr`
a essere rimosso solo se non `e al momento utilizzato.
Le altre informazioni presenti nella directory /proc/scsi sono una directory per ciascuna
interfaccia utilizzata, con il nome del relativo modulo di kernel, contenente un file con nome
corrispondente al numero di ciascun host adapter number presente con quella interfaccia, nella
forma:
242

questo `e possibile solo se il bus e le periferiche sono cablati con dei connettori appositi che supportino questa
funzionalit`
a.

5.4. LA GESTIONE DI INTERFACCE E PERIFERICHE

341

/proc/scsi/<driver_name>/<scsi_adapter_number>
cos` nelle situazioni dei due esempi illustrati potremo trovare la directory aic7xxx in caso e la
directory usb-storage nellaltro, e in questultimo caso, quando utilizziamo oltre al disco fisso
anche una penna USB, otterremo al suo interno due file, corrispondenti alle due istanze della
stessa interfaccia viste come host adapter diversi.243
Rispetto agli equivalenti dispositivi IDE classici in genere dischi e CDROM SCSI hanno
prestazioni superiori per la capacit`
a del bus di gestire linvio di comandi multipli, vista per`
o la
maggiore complessit`
a del protocollo sono anche in genere pi`
u costosi, per questo CD e masterizzatori sono ormai praticamente inesistenti da anni, e rimangono sostanzialmente solo dischi e
nastri per luso professionale, anche se i primi subiscono sempre di pi`
u la concorrenza da parte
del Serial ATA che ha prestazioni sostanzialmente equivalenti.
Un secondo aspetto da tenere presente nel caso di dispositivi SCSI classici `e che in genere
il cablaggio degli stessi `e piuttosto delicato, alcuni bus infatti devono essere opportunamente
terminati per consentire una corretta trasmissione dei segnali, inoltre la presenza di diversi
standard sullo stesso bus pu`
o portare a degrado di prestazioni. Infine occorre tenere sotto
controllo lallocazione degli ID, che `e di norma a carico degli utenti, la presenza di due dispositivi
con lo stesso ID infatti li rende entrambi inutilizzabili.
Nelle distribuzioni recenti i programmi di gestione dellinterfaccia SCSI sono distribuiti con
il pacchetto scsitools;244 il principale `e scsiinfo che permette di interrogare un dispositivo
(passato come argomento) per ricavarne tutta una serie di propriet`a (per lelenco completo e le
relative spiegazioni si consulti la pagina di manuale), `e invece da segnalare luso dellopzione -l,
da fare senza specificare un dispositivo, che riporta quelli presenti.
Infine sempre con questo pacchetto viene anche fornito lo script rescan-scsi-bus.sh che
esegue una scansione del bus abilitando nuovi dispositivi eventualmente aggiunti dopo il boot,
utilizzando i comandi da inviare sul file /proc/scsi/scsi illustrati in precedenza; con i kernel
della serie 2.6 questo in genere non `e necessario dato che la gestione dei dispositivi viene affidata
al sistema di udev che `e in grado di riconoscere automaticamente laggiunta di nuovi dispositivi.

5.4.3

Gestione delle interfacce seriali

Le interfacce seriali sono una delle prime interfacce create per la comunicazione fra computer,
e prevedono appunto una comunicazione via cavo estremamente semplice (e di breve distanza)
basata sullinvio dei dati lungo una linea di trasmissione, in cui un dato viene trasmesso appunto
come una sequenza di singoli segnali che traducono direttamente il valore dello stesso espresso
come sequenza di bit.
Le seriali sono presenti da sempre sui PC, le configurazioni standard di molte schede madri
prevedono due interfacce, che possono essere estese a 4, anche se negli ultimi tempi, per la
presenza di nuove interfacce pi`
u veloci come lUSB,245 tendono ad essere meno presenti. Ci`
o
non di meno esse restano le interfacce tipiche con cui vengono gestiti i modem,246 ed una delle
interfacce pi`
u semplici per collegarsi a dispositivi esterni come router o switch programmabili.
Data la loro presenza fin dai primi PC compatibili, lassegnazione delle risorse delle porte
seriali `e predefinita, e sia le porte di I/O che gli interrupt utilizzati per le 4 porte previste
dallarchitettura classica del PC sono riportati in tab. 5.32, insieme ai file di dispositivo con cui
si pu`o accedere ad essi.
A causa delle limitazioni dellarchitettura originale dei PC, luso contemporaneo di due porte
seriali crea problemi se queste condividono la stessa linea di interrupt. Per questo se `e necessario
243

si avrebbe lo stesso risultato nel caso si installassero pi`


u schede con lo stesso controller.
in precedenza esistevano vari altri comandi, come scsi_info, ormai completamente abbandonati.
245
per il quale sono comunque disponibili adattatori che consentono la connessione verso una linea seriale.
246
quelli esterni, ma pure alcuni di quelli interni, sia che siano modem reali che modem finti, come i winmodem.
244

342

CAPITOLO 5. AMMINISTRAZIONE STRAORDINARIA DEL SISTEMA


Interrupt
4
3
4
3

Porta I/O
0x3F8
0x2F8
0x3E8
0x2E8

Dispositivo
/dev/ttyS0
/dev/ttyS1
/dev/ttyS2
/dev/ttyS3

Tabella 5.32: Risorse e file di dispositivo usati dalle porte seriali.

un numero maggiore di porte seriali occorre utilizzare delle schede di estensione apposite (esistono
ad esempio delle schede dedicate ad alta velocit`a, usate per lo pi`
u dai provider per gestire i
modem), per le quali il kernel `e in grado di supportare la condivisione degli interrupt. Un caso
di conflitto pi`
u comune `e invece quello in cui, come parte di una scheda ISDN o di un modemfax interno, viene installata una nuova interfaccia seriale ed in tal caso occorrer`a verificare che
questa non sia sulla stessa linea di interrupt di una porta seriale che `e gi`a in uso.
Uno dei problemi pi`
u comuni che si possono avere utilizzando altre porte oltre quelle standard
`e che queste possono non essere configurate correttamente. Per ovviare a questo problema si
pu`o utilizzare il programma di configurazione delle interfacce seriali setserial. Questo prende
come primo argomento il file di dispositivo da configurare (o controllare), se utilizzato senza
opzioni viene stampato un breve riassunto delle principali caratteristiche dello stesso:
hain:/home/piccardi/truedoc/corso# setserial /dev/ttyS1
/dev/ttyS1, UART: 16550A, Port: 0x02f8, IRQ: 3

dove sono mostrate rispettivamente il tipo di chip della porta seriale (nel caso un 16550A) la
porta di I/O e la linea di interrupt utilizzate.
Quando il comando viene utilizzato con lopzione -g gli argomenti vengono interpretati come
un lista di dispositivi di cui stampare le propriet`a; loutput delle informazioni riportate dal
comando `e controllato dalle ulteriori opzioni -a, che fa stampare tutte le informazioni possibili,
e -b che riporta solo un riassunto della configurazione del dispositivo; lelenco delle principali
opzioni `e riportato in tab. 5.33.
Opzione
-a
-b
-G
-z

Significato
stampa tutte le informazioni disponibili.
stampa un riassunto della configurazione.
stampa le informazioni nel formato in cui vengono prese
sulla riga di comando.
azzera tutti i valori prima di fare le impostazioni.

Tabella 5.33: Principali opzioni per il comando setserial.

Se invocato senza lopzione -g, gli argomenti successivi al primo permettono di indicare quale
parametro del dispositivo deve essere impostato dal comando; in generale soltanto lamministratore pu`o modificare i parametri dellinterfaccia, ma alcuni di questi possono essere impostati
anche da un utente normale.
I due parametri principali impostabili dal comando sono port e irq, il cui significato `e ovvio e
che prendono rispettivamente come ulteriore argomento il numero di porta e di interrupt. Si pu`o
inoltre impostare a mano (qualora non venisse riconosciuta correttamente) il tipo di interfaccia
(la UART, Universal Asynchronous Receiver/Transmitter ) con uart; infine si pu`o controllare
la velocit`a della porta seriale con la serie di argomenti spd_* il cui significato, insieme a quello
degli altri parametri principali, `e riportato in tab. 5.34; al solito per una descrizione dettagliata
su pu`o fare riferimento alla pagina di manuale di setserial.

5.4. LA GESTIONE DI INTERFACCE E PERIFERICHE


Opzione
port 0xHHHH
irq N
uart type

autoconfig

auto_irq
baud_base X

spd_hi
spd_vhi
spd_shi
spd_warp
spd_normal
spd_cust
divisor N

343

Significato
imposta la porta di I/O.
imposta il numero della linea di interrupt.
imposta il tipo di chip, i principali valori sono 8250, 16450, 16550,
16550A, ecc. (per la lista si faccia riferimento alla pagina di manuale);
con none si disabilita la porta.
fa eseguire una auto-configurazione al kernel (la porta di I/O deve essere
gi`
a impostata) con cui determinare la UART e se auto_irq anche la
linea di interrupt.
richiede di auto-configurare anche la linea di interrupt.
imposta la frequenza delle operazioni di base, in bit per secondo,
in genere vale 115200, che `e il massimo raggiungibile da una seriale
standard.
richiede luso di una velocit`
a di 57600bps (bit per secondo).
richiede luso di una velocit`
a di 115200bps (bit per secondo).
richiede luso di una velocit`
a di 230400bps (bit per secondo).
richiede luso di una velocit`
a di 460800bps (bit per secondo).
richiede luso di una velocit`
a di 38400bps (bit per secondo).
richiede una velocit`
a personalizzata pari a valore di baud_base diviso
per quello di divisor.
imposta il divisore con cui calcolare una velocit`
a personalizzata.

Tabella 5.34: Principali direttive di impostazione del comando setserial.

5.4.4

Gestione delle interfacce USB

Linterfaccia USB (Universal Serial Bus) nasce sulla piattaforma PC allo scopo di fornire una
interfaccia di comunicazione semplificata e con prestazioni ridotte, ma molto semplice da realizzare e poco costosa per la realizzazione di dispositivi semplici (ed in genere portabili, `e infatti
prevista anche la capacit`
a di fornire alimentazione) che non necessitano di tutte le risorse (in
termini di velocit`
a di accesso, potenza di alimentazione e banda passante nella trasmissione dei
dati) fornite dalle usuali interfacce di espansione trattate in sez. 5.4.1.
Un bus USB `e costruito in maniera gerarchica ed `e controllato da una unit`a di controllo (o
host), a cui `e direttamente collegato un concentratore (o hub) radice a cui tutti i dispositivi o
eventuali altri concentratori secondari vanno ad agganciarsi, secondo la struttura mostrata in
fig. 5.7. Il protocollo prevede che le comunicazioni siano tutte controllate dallunit`a di controllo,
che `e lunica che pu`
o iniziare una comunicazione, ed i dispositivi possono solo rispondere allunit`
a
di controllo; non `e prevista nessuna possibilit`a di comunicazione dei singoli dispositivi fra di
loro.247
In genere su un computer `e presente un solo host (anche se alcuni ne hanno pi`
u di uno, ed
`e comunque possibile aggiungerne altri usando schede di espansione) cui sono agganciate 2 o 4
porte. A ciascuna porta USB si pu`o agganciare un dispositivo o un hub, il quale a sua volta
avr`a altre porte cui agganciare altri dispositivi ed hub. Il bus prevede fino ad un massimo di
127 unit`a per ciascuna unit`
a di controllo; la presenza di hub secondari permette lutilizzo di un
maggior numero di periferiche rispetto alle porte presenti sul PC, ma si tenga conto che anche
essi contano come unit`
a sul bus, pertanto le unit`a disponibili per le periferiche sono in realt`
a
127 meno il numero di hub aggiuntivi.
Come mostrato in fig. 5.7 il bus prevede due direzioni per il flusso dei dati, dallhost alla
periferica e viceversa, indicati con downstream e upstream; inoltre vengono specificati quattro
tipi di trasferimento:
247

altre architetture non hanno queste limitazioni, ma USB `e stata progettata con un compromesso fra prestazione
ed economicit`
a, per cui si sono evitate funzionalit`
a avanzate come larbitraggio del bus che comportano una
maggiore complessit`
a realizzativa per dispositivi che dovevano essere estremamente semplici.

344

CAPITOLO 5. AMMINISTRAZIONE STRAORDINARIA DEL SISTEMA

Figura 5.7: Schema della struttura di un bus USB.

Control transfers
utilizzati per inviare pacchetti di controllo, che devono essere di dimensioni ridotte e
trasportati con affidabilit`
a; viene usata per configurare i dispositivi e per supportare
i comandi di controllo di base.
Bulk transfers
usata per trasmettere dati alla massima velocit`a possibile in maniera affidabile; viene
usata per i trasferimenti di dati da e verso i dispositivi.
Interrupt transfers
simili ai precedenti, ma ripetuti periodicamente, la richiesta viene ripetuta periodicamente, vengono utilizzati come meccanismo di notifica (dato che non esiste un vero e
proprio interrupt).
Isochronous transfers
usata per inviare e riceve dati potendo contare su una quantit`a di banda garantita,
ma senza affidabilit`
a, usata per trasferimenti real-time (ad esempio i trasferimenti per
video e audio).
La presenza di due direzioni nel flusso di dati si riflette anche sui connettori, che in genere
sono classificati in due tipi diversi, a seconda che siano rivolti allunit`a di controllo (di tipo A)
o verso una periferica (di tipo B). Inoltre i dispositivi si possono suddividere in auto-alimentati,
alimentati dal bus,248 o entrambi. Unaltra distinzione fra i dispositivi `e fra quelli lenti (come
248

che fornisce un massimo di 400 mA, quindi attenzione a non sovraccaricare, pena il rischio di non far funzionare
nulla per mancanza di potenza.

5.4. LA GESTIONE DI INTERFACCE E PERIFERICHE

345

mouse, tastiere, ecc.) che comunicano al massimo ad 1.5MB/s e quelli veloci che possono usare
potenzialmente fino al 90% della banda passante massima.
La prima versione del protocollo (USB 1.0) consentiva una banda passante massima di
12MB/s. Tuttavia luso di dispositivi lenti, gli interrupt e loverhead del protocollo non consentono velocit`
a superiori a 8.5MB/s anche in condizioni ideali, mentre prestazioni tipiche sono
intorno ai 2MB/s. La seconda versione del protocollo, la USB2 permette invece di portare la
banda passante ad un massimo teorico 480MB/s, ampliando notevolmente lutilizzabilit`a del bus
per lutilizzo con dispositivi di stoccaggio esterni (in particolare con dischi rimuovibili).
Negli ultimi tempi praticamente qualunque PC compatibile viene fornito di interfaccia USB,
usualmente fornita direttamente dal chipset della piastra madre, anche se sono disponibili schede
PCI con a bordo delle unit`
a di controllo. Per quanto riguarda USB 1.0 le unit`a di controllo sono
sostanzialmente di due tipi, o compatibili con le specifiche Open Host Controller Interface (o
OHCI) della Compaq (usata anche nel mondo Mac) o con le specifiche Universal Host Controller
Interface (o UHCI) della Intel. Le funzionalit`a sono le stesse, ma la seconda specifica richiede
hardware pi`
u semplice e quindi `e meno costosa, ma richiede un driver pi`
u complesso e quindi un
maggior carico sulla CPU.
Il supporto per USB `e stato introdotto per la prima volta a partire dal kernel 2.2.7; ma nella
serie 2.2.x il supporto `e molto grezzo, almeno fino al 2.2.18 in cui furono incluse parecchie funzionalit`a del 2.4; per un supporto pieno delle funzionalit`a del bus (ed in particolare per utilizzare
dischi su USB) occorre comunque usare un kernel della serie 2.4.x o successivo. In ogni caso
Linux supporta entrambi i tipi di unit`a di controllo (UHCI o OHCI), utilizzando rispettivamente
i moduli usb-uhci e usb-ohci (da selezionare nella relativa sezione di configurazione del kernel,
vedi sez. 5.2.3).
In genere `e estremamente facile riconoscere quale delle due interfacce viene utilizzata, basta
infatti usare lspci per verificare il tipo di unit`a di controllo; avremo allora, a seconda dei casi,
per una macchina che ha una unit`
a UHCI:
holland:~# lspci -v
...
00:04.2 USB Controller: VIA Technologies, Inc. VT82xxxxx UHCI USB 1.1 Controlle
r (rev 10) (prog-if 00 [UHCI])
Subsystem: VIA Technologies, Inc. (Wrong ID) USB Controller
Flags: bus master, medium devsel, latency 32, IRQ 9
I/O ports at b400 [size=32]
Capabilities: [80] Power Management version 2
...

mentre per una unit`


a OHCI si avr`
a:
davis:~# lspci -v
...
00:0f.2 USB Controller: ServerWorks CSB6 OHCI USB Controller (rev 05) (prog-if
10 [OHCI])
Subsystem: ServerWorks: Unknown device 0220
Flags: bus master, medium devsel, latency 32, IRQ 5
Memory at fe120000 (32-bit, non-prefetchable) [size=4K]
...

Invece se si dispone di una unit`a USB 2, le specifiche utilizzate sono quelle della Extended
Host Controller Interface, identificata con la sigla EHCI, mentre in questo caso il modulo da
utilizzare `e ehci-hcd. Un tempo la scelta di quale modulo usare doveva essere fatta in sede di
installazione, e fissata con la configurazione dei moduli (vedi sez. 5.2.5), con i kernel recenti e
luso di udev e hotplug questa in genere avviene automaticamente, anche se in certi casi, in caso
di errori nel rilevamento, pu`
o risultare necessario effettuare una configurazione manuale.
Una delle caratteristiche del bus USB `e che (a differenza ad esempio di quanto avviene per il
bus SCSI) la numerazione delle periferiche presenti non deve essere effettuata a mano, in quanto

346

CAPITOLO 5. AMMINISTRAZIONE STRAORDINARIA DEL SISTEMA

questo compito `e eseguito dal bus stesso. Laltra caratteristica interessante del bus `e che esso
supporta sempre la possibilit`
a di disconnettere a caldo i dispositivi, anche se questo pu`o avere
conseguenze poco piacevoli se fatto senza accortezza. Per questo motivo in genere alluso del bus
`e legato quello del sistema di hotplug (vedi sez. 5.4.5) che `e in grado di rilevare la connessione e la
disconnessione di nuove periferiche caricando (e rimuovendo) automaticamente i relativi moduli.
Il bus fornisce inoltre al kernel la possibilit`a di rilevare tutta una serie di informazioni dai
singoli dispositivi (il protocollo infatti prevede che questi forniscano i dati relativi a loro stessi);
in genere questa informazione `e disponibile sotto /proc/bus/usb una volta che si sia montato il
filesystem virtuale procbususb,249 cosa che tutte le distribuzioni ormai prevedono nella procedura
di avvio.
In questo caso sotto la directory /proc/bus/usb compariranno tante directory quanti sono i bus disponibili (numerate in ordine crescente), ciascuna delle quali conterr`a un file con
nome il numero associato a ciascun dispositivo presente su detto bus, contenente i relativi dati. Un sommario con una presentazione pi`
u leggibile degli stessi dati `e fornito invece dal file
/proc/bus/usb/devices che riporta lelenco di tutti i dispositivi presenti con un contenuto del
tipo:
T:
B:
D:
P:
S:
S:
S:
C:*
I:
E:

Bus=01 Lev=00 Prnt=00 Port=00 Cnt=00 Dev#= 1 Spd=480 MxCh= 6


Alloc= 0/800 us ( 0%), #Int= 0, #Iso= 0
Ver= 2.00 Cls=09(hub ) Sub=00 Prot=01 MxPS= 8 #Cfgs= 1
Vendor=0000 ProdID=0000 Rev= 2.06
Manufacturer=Linux 2.6.6 ehci_hcd
Product=VIA Technologies, Inc. USB 2.0
SerialNumber=0000:00:10.3
#Ifs= 1 Cfg#= 1 Atr=40 MxPwr= 0mA
If#= 0 Alt= 0 #EPs= 1 Cls=09(hub ) Sub=00 Prot=00 Driver=hub
Ad=81(I) Atr=03(Int.) MxPS=
2 Ivl=256ms

T:
D:
P:
S:
S:
S:
C:*
I:
E:
E:

Bus=01 Lev=01 Prnt=01 Port=00 Cnt=01 Dev#= 2 Spd=480 MxCh= 0


Ver= 2.00 Cls=00(>ifc ) Sub=00 Prot=00 MxPS=64 #Cfgs= 1
Vendor=04b4 ProdID=6830 Rev= 0.01
Manufacturer=Cypress Semiconductor
Product=USB2.0 Storage Device
SerialNumber=600000001814
#Ifs= 1 Cfg#= 1 Atr=c0 MxPwr= 0mA
If#= 0 Alt= 0 #EPs= 2 Cls=08(stor.) Sub=06 Prot=50 Driver=usb-storage
Ad=02(O) Atr=02(Bulk) MxPS= 512 Ivl=0ms
Ad=88(I) Atr=02(Bulk) MxPS= 512 Ivl=0ms

Il principale utilizzo di questo file `e per verificare se il riconoscimento di una periferica e la


relativa numerazione `e stata eseguita correttamente, infatti per ciascun dispositivo presente sul
bus viene riportata nel file una diversa sezione con tutti i dati ad esso relativi. Ogni sezione `e
introdotta da una linea che inizia con la lettera T e che indica il posizionamento del dispositivo
allinterno del bus, dove Bus indica il numero progressivo del bus, Lev il livello (in termini
di passaggi per eventuali hub secondari) e Dev il numero progressivo assegnato. Nelle righe
successive sono poi riportate altre informazioni relative al dispositivo, sono particolarmente
importanti, come riportati nella riga iniziante per P, gli identificatori del venditore e del prodotto
che vengono utilizzati per selezionare automaticamente il modulo da utilizzare per il supporto
del dispositivo, ma che in caso di fallimento possono essere utilizzati per cercare informazioni su
Internet; informazioni utili relative al dispositivo sono quelle delle stringhe fornite dal produttore
e mostrate nelle righe inizianti per S. Per il resto della sintassi si pu`o fare riferimento alla Linux
USB Guide disponibile su http://www.linux-usb.org/USB-guide/book1.html
249

si ricordi di abilitarne il supporto in caso di ricompilazione del kernel, altrimenti gran parte dei programmi
di visualizzazione dei dati del bus non funzioneranno.

5.4. LA GESTIONE DI INTERFACCE E PERIFERICHE

347

Per una visualizzazione pi`


u intelligibile di queste informazioni si possono usare i programmi
del pacchetto usbutils, in particolare il programma lsusb permette di avere una lista molto
semplice dei dispositivi presenti nella forma:
piccardi@hain:~/truedoc/corso$ lsusb
Bus 001 Device 002: ID 04b4:6830 Cypress Semiconductor Corp.
Bus 001 Device 001: ID 0000:0000

Il programma pu`
o comunque stampare la lista anche in forma gerarchica usando lopzione -t,
mentre si possono ottenere informazioni molto pi`
u dettagliate con lopzione -v. Si possono poi
usare le opzioni -s e -d in maniera analoga a come si fa con lspci per selezionare un singolo dispositivo sulla base rispettivamente del suo bus e numero identificativo (con la sintassi bus:num)
o del produttore (usando i rispettivi identificatori cui abbiamo accennato in precedenza). Al
solito si faccia riferimento alla pagina di manuale per una descrizione completa.

5.4.5

La gestione dei dispositivi con udev e hotplug

Come accennato in sez. 5.2.5 nello sviluppo del kernel 2.6 `e stata completamente ristrutturata
la gestione dei moduli come conseguenza della creazione di una rappresentazione generale dei
dispositivi da parte del kernel. In concomitanza a questo `e stato poi sviluppato, in considerazione
del sempre maggiore utilizzo di Linux in ambienti di tipo desktop, un meccanismo di gestione
il pi`
u trasparente e semplificato possibile per automatizzare rilevamento e supporto dei vari
dispositivi.
In particolare uno dei problemi affrontati `e quello dei dispositivi rimuovibili a caldo, sempre
pi`
u diffusi anche nelle macchine comuni anche grazie a bus come lUSB o il Firewire. Per
questo sono state realizzate diverse infrastrutture, in particolare fin dal kernel 2.4 era stato
introdotto un meccanismo, denominato hotplug, per cui in reazione alla avvenuta presenza di
dispositivi rimuovibili il kernel stesso provvedeva allesecuzione di un apposito programma in
user space, /sbin/hotplug,250 che si incaricava di caricare gli opportuni moduli ed effettuare
tutte le operazioni reputate necessarie alla gestione del dispositivo.
Il meccanismo classico di hotplug prevedeva il passaggio delle informazioni necessarie al
programma tramite delle opportune variabili di ambiente; queste poi venivano analizzate dal
programma per identificare il dispositivo che aveva generato levento, ed eseguire le azioni necessarie alla sua gestione, fra cui ovviamente il caricamento dei moduli per il relativo supporto.
Tutte queste operazioni venivano realizzate tramite una serie di script di shell mantenuti in
/etc/hotplug.d, e suddivisi per i vari tipi di bus.
Con lo sviluppo dei kernel della serie 2.6.x questo meccanismo ha cominciato a mostrare
i suoi limiti; da una parte infatti si erano ampliate le richieste di notifiche di eventi non pi`
u
semplicemente legati alla disponibilit`a di un nuovo dispositivo,251 dallaltra lo sviluppo della
rappresentazione generica dei dispositivi (il cosiddetto device model del kernel) richiedeva la
generazione di eventi tutte le volte che si doveva registrare una qualche nuova informazione.
Limpatto dellanalisi di tutti questi eventi iniziava ad essere pesante.
Allo stesso tempo i kernel della serie 2.6.x avevano visto una completa ristrutturazione della
infrastruttura per la creazione dinamica dei file di dispositivo,252 con una realizzazione interamente in user space che rimpiazzasse il precedente devfs,253 La nuova infrastruttura, denominata
250

o qualunque altro programma fosse stato indicato in /proc/sys/kernel/hotplug.


ad esempio viene generato un evento anche in risposta allinserimento di un cavo in una scheda di rete, cos`
da poterla configurare automaticamente.
252
dinamica nel senso che prevedesse la presenza in /dev soltanto dei file relativi ai dispositivi effettivamente
presenti, e non di tutti quelli possibili.
253
questo era un filesystem virtuale che creava automaticamente il contenuto di /dev, ma oltre a non essere
pi`
u mantenuto e presentare notevoli problemi nella realizzazione, costringeva ad inserire le politiche relative alla
gestione dei dispositivi (i permessi ad esempio) allinterno del kernel; per questo `e stato sostituito ed il relativo
supporto `e stato completamente rimosso a partire dal kernel 2.6.13.
251

348

CAPITOLO 5. AMMINISTRAZIONE STRAORDINARIA DEL SISTEMA

udev, prevedeva luso delle informazioni mantenute nellapposito filesystem sysfs e degli eventi
di hotplug per la creazione automatica dei file di dispositivo sotto /dev, ed un insieme di regole
in grado di governare non solo i nomi, ma anche i permessi e le altre caratteristiche da assegnare
ai singoli dispositivi.
Per un certo periodo i due sistemi, udev ed hotplug, sono stati sviluppati indipendentemente,
ma nel corso della ristrutturazione di hotplug per far fronte al crescente numero di eventi gli
sviluppatori si sono resi conto che dato che udev doveva comunque analizzare tutti gli eventi per
creare i file di dispositivo, non aveva senso usare un programma a parte per caricare i moduli
necessari, e che questo compito poteva essere eseguito direttamente dal sistema di udev.
Questo risultava possibile anche grazie alla ristrutturazione della gestione dei moduli stessi;
come abbiamo visto in sez. 5.2.5 ogni modulo porta con se, fra i parametri ad esso associati,
una lista degli alias che indicano a quale tipo di dispositivo esso pu`o venire associato; quando
il kernel riconosce la presenza di un nuovo dispositivo `e suo compito generare un alias per lo
stesso,254 che sar`
a quello usato da udev per caricare il relativo modulo.255
Per questo motivo tutte le distribuzioni recenti non prevedono pi`
u luso degli script di hotplug
e la directory /etc/hotplug.d `e sostanzialmente vuota se non proprio assente. Il caricamento
dei moduli viene infatti gestito direttamente dal sistema di udev per qualunque dispositivo
venga rilevato dal kernel,256 mentre le eventuali operazioni da compiere per gli eventi relativi a
dispositivi rimuovibili vengono gestite in genere passando tutti gli eventi ad un apposito demone.
Ovviamente `e possibile evitare luso di udev, creando un contenuto statico per /dev e mantenendo nel kernel il supporto per i dispositivi essenziali (`e quello che viene fatto per i ramdisk di
avvio), ma linfrastruttura si `e dimostrata estremamente flessibile, ed `e stata adottata da tutte
le distribuzioni. La flessibilit`
a di udev deriva dal fatto che la creazione dei file di dispositivo
sotto /dev pu`o essere controllata attraverso una serie di regole, che consentono non solo di
specificarne le propriet`
a come nome, permessi, proprietario, ecc. ma anche di associare alla
creazione stessa azioni ulteriori, come la creazione di pi`
u nomi o di link simbolici, e lesecuzione
di ulteriori programmi.
Come accennato udev si appoggia al nuovo filesystem sysfs, introdotto con i kernel della
serie 2.6.x. Si tratta di un filesystem virtuale analogo a /proc, il cui scopo principale `e quello
di rendere visibile le informazioni presenti nel kernel riguardo dispositivi e relativi moduli (il
cosiddetto device model del kernel) ai programmi in user-space. Come richiesto dal Filesystem
Hierarchy Standard (vedi sez. 1.2.3) deve essere montato sotto /sys.257 In sostanza lidea era
quella di esporre in questo filesystem caratteristiche e propriet`a dei dispositivi e sottosistemi
gestiti dal kernel e di fornire qui la possibilit`a di effettuare eventuali impostazioni, cercando di
riportare /proc al suo scopo originale di fornire informazioni relative ai processi.
Il vantaggio di sysfs `e che le informazioni sui dispositivi ed i moduli vengono generate direttamente allorigine dal kernel stesso, e non sono necessarie ulteriori intermediazioni; ogni volta
che il kernel riconosce un nuovo oggetto allinterno del suo device model viene automaticamente
creata la relativa informazione dentro questo filesystem.
In particolare sotto /sys/device viene creata automaticamente la gerarchia generale di
tutti i dispositivi rilevati dal kernel, espressa come un albero di directory che rappresentano le
dipendenze reciproche fra gli stessi. Cos` ad esempio un dispositivo PCI (come un controller
254

il kernel lo ricava dalle informazioni ottenute dal dispositivo stesso, grazie agli identificativi previsti nei vari
bus (si ricordi quanto appena visto per PCI e USB).
255
questo `e quanto avviene oggi, a lungo, almeno fino al 2.6.15, il meccanismo prevedeva che il kernel creasse
delle variabili di ambiente che poi dovevano essere esaminate da hotplug per identificare il modulo.
256
questo cambia anche le modalit`
a con cui viene eseguito il caricamento dei moduli, in precedenza infatti questo
era associato al primo accesso ad un dispositivo, adesso invece `e associato alla sua rilevazione, `e per questo motivo
che se non si vuole che certi moduli non siano caricati a meno che non li si utilizzi, questi deve essere impedito
esplicitamente (si riveda quanto detto riguardo la direttiva blacklist di modprobe.conf in sez. 5.2.5).
257
in questo caso la richiesta `e ancora pi`
u stringente, tutti i programmi e le utilit`
a di basso livello fanno
lassunzione che sysfs sia montato sotto /sys, e non funzionano se lo si sposta.

5.4. LA GESTIONE DI INTERFACCE E PERIFERICHE

349

SATA) sar`
a rappresentato da una directory inserita sotto la directory relativa al bus PCI su cui
esso si trova, ed un disco attaccato a un controller sar`a inserito in una directory sotto quella del
suo controller.
Inoltre sotto /sys/device vengono rappresentati anche quei dispositivi che non corrispondono ad una periferica (ad esempio la CPU) ma che sono parte integrante del sistema (sotto
/sys/device/system) e quelli specifici di alcune piattaforme hardware che non rientrano in
nessuna gerarchia, come le porte di I/O usate per la seriale che si trovano solo sui PC (sotto
/sys/device/platform).
Oltre a questo il sistema prevede la generazione di serie di informazioni aggiuntive. Ad
esempio la directory /sys/bus viene automaticamente popolata con link simbolici agli stessi
dispositivi classificati secondo i bus che sono stati registrati come tali nel kernel, mentre la
directory /sys/class conterr`
a invece la classificazione dei dispositivi secondo le relative classi,258
e /sys/block lelenco dei dispositivi a blocchi. Inoltre la directory /sys/modules conterr`
a una
directory per ciascun modulo caricato dal kernel con le relative informazioni.
Unaltra delle caratteristiche distintive di sysfs `e che `e possibile associare in maniera molto
semplice a ciascun dispositivo o modulo degli attributi che verranno visualizzati nel filesystem
come file, su cui `e possibile leggere (e anche scrivere). In questo modo diventa semplice rendere disponibili informazioni o caratteristiche (eventualmente modificabili per effettuare impostazioni)
relative agli stessi.
Con lo sviluppo del kernel il contenuto si sysfs si `e ampliato molto, sono stati aggiunti contenuti e molte propriet`
a dei dispositivi ed altre funzionalit`a del kernel possono essere impostate
direttamente attraverso i file presenti in /sys, con lindicazione da parte dagli sviluppatori del
kernel di spostare al suo interno tutte quelle funzionalit`a che in precedenza sarebbero state gestite tramite /proc, che dovrebbe invece tornare ad essere un filesystem dedicato alla gestione
dei processi.259
La creazione dinamica del contenuto di /dev viene realizzata tramite il demone udevd, che
viene lanciato allavvio e riceve dal kernel gli eventi di notifica per ciascun dispositivo che viene
` compito di udevd identificare il tipo di
aggiunto o rimosso dal sistema o che cambia stato. E
dispositivo utilizzando sia le informazioni ricevute con levento che quelle presenti sotto /sys, e
creare di conseguenza i file di dispositivo sotto /dev che viene creata come directory posta su
un filesystem temporaneo in RAM.260
Il comportamento di base del sistema di udev `e controllato dal relativo file di configurazione
/etc/udev/udev.conf; questo usa la sintassi di un file di assegnazioni di variabili di shell. In
genere lo si usa per impostare delle alcune variabili chiave che consentono di soprassedere i valori
di default usati dal sistema. Le sole chiavi che pu`o valer la pena di modificare sono udev_log,
che controlla la priorit`
a dei messaggi inviati al sistema di syslog (con i valori di tab. 3.5) e
tmpfs_size che controlla le dimensioni del filesystem temporaneo su cui `e creata /dev, un
contenuto tipico `e il seguente (estratto da una Debian Lenny):
# The initial syslog(3) priority: "err", "info", "debug" or its
# numerical equivalent. For runtime debugging, the daemons internal
# state can be changed with: "udevadm control --log_priority=<value>".
udev_log="err"
# maximum size of the /dev tmpfs
tmpfs_size="10M"

Oltre a detto file di configurazione generale le funzionalit`a di udev vengono controllate grazie
alluso di appropriate regole con cui si esprimono le operazioni da effettuare in conseguenza ai
vari eventi che udevd riceve dal kernel. Alla ricezione di ciascun evento udevd processa le regole
258

di nuovo queste vengono definite direttamente dal kernel e gestite al suo interno.
questo per`
o non significa che questo abbia completamente sostituito /proc ed in particolare /proc/sys.
260
la si pu`
o anche osservare nelloutput di df mostrato in sez. 5.1.3.

259

350

CAPITOLO 5. AMMINISTRAZIONE STRAORDINARIA DEL SISTEMA

ed esegue le operazioni in esse indicate, inoltre tutta linformazione viene comunque memorizzata
in un database e pu`
o essere acceduta da altri programmi.
Le regole devono essere inserite appositi file con lestensione .rules (altre estensioni sono
ignorate), mantenuti normalmente sotto /etc/udev/rules.d,261 che `e la directory riservata
agli utenti per la configurazione delle regole. Se presenti per`o vengono utilizzate anche le regole
predefinite di sistema poste in /lib/udev/rules.d, ed eventuali regole temporanee poste in
/dev/.udev/rules.d.
Quando udevd parte tutti i file delle regole vengono letti e processati in ordine alfabetico,
indipendentemente dalle directory in cui si trovano.262 Questo significa che se ci sono regole da
eseguire per prime queste devono essere inserite in file il cui nome abbia la precedenza, questo `e il
motivo per cui i file di regole di /etc/udev/rules.d hanno normalmente nomi che iniziano con
dei codici numerici, cos` da identificare in maniera pi`
u immediata la sequenza in cui verranno
utilizzati.
La sintassi con cui si esprimono le regole `e abbastanza complessa; ogni riga del file, a parte
quelle vuote ed i commenti introdotti dal solito carattere #, deve contenere almeno una coppia
chiave/valore; `e poi possibile specificarne anche pi`
u di una con una lista separate da virgole.
Esistono due tipi di chiavi, le chiavi di confronto (dette matching key) usate per selezionare gli
eventi a cui applicare la regola e quelle di assegnazione (dette assign key) con cui si controllano
le operazioni da eseguire.
Operatore
==
!=
=
+=
:=

Significato
confronta leguaglianza di una matching key.
confronto la diseguaglianza di una matching key.
assegna un valore a una assign key.
aggiunge un valore a una assign key.
assegna definitivamente un valore a una assign key.

Tabella 5.35: Operatori delle regole di udev.

Ciascun tipo di chiave prevede diversi operatori con cui essa viene associata al proprio valore
nella forma di una assegnazione in cui il valore viene espresso come stringa fra apici doppi. Gli
operatori utilizzabili sono riportati in tab. 5.35, nella parte superiore ci sono gli operatori di
confronto, il cui uso identifica una matching key, nella parte inferiore quelli di assegnazione, il
cui uso identifica una assign key. Si tenga presente inoltre che nelle espressioni dei valori usati
con le matching key `e generalmente supportato luso degli operatori del filename globbing (*,
? e []), con lo stesso significato che hanno nella shell.
Chiave
KERNEL
SUBSYSTEM
ACTION
NAME
ATTR{name}

Significato
nome del dispositivo secondo il kernel, come riportato nellevento.
nome del sottosistema riportato dallevento.
nome dellazione riportato dellevento.
nome dellinterfaccia di rete o del file di dispositivo sotto /dev.263
valore dellattributo name associato su sysfs al dispositivo dellevento.
Tabella 5.36: Chiavi di confronto per le regole di udev.

Si tenga presente inoltre che alcune chiavi, a seconda delloperatore che vi si applica, possono essere usate sia per confronto o per assegnazione; un elenco delle chiavi di confronto pi`
u
significative `e riportato in tab. 5.36 mentre in tab. 5.37 si sono riportate quelle di assegnazione.
Per lelenco completo ed i dettagli si consulti la pagina di manuale di udev con man udev.
261
`e possibile, anche se non c`e nessun motivo per farlo, cambiare questa directory con la chiave udev_rules in
/etc/udev/udev.conf.
262
ma in caso di uguaglianza dei nomi hanno la precedenza i file presenti in /etc/udev/rules.d.
263
usabile se assegnato in una regola precedente.

5.4. LA GESTIONE DI INTERFACCE E PERIFERICHE


Chiave
NAME
OWNER
GROUP
MODE
RUN

351

Significato
nome dellinterfaccia di rete o del file di dispositivo sotto /dev.
proprietario del file di dispositivo.
gruppo proprietario del file di dispositivo.
permessi del file dispositivo.
programma da eseguire.

Tabella 5.37: Chiavi di assegnazione per le regole di udev.

Se in corrispondenza ad un evento tutte le matching key presenti in una riga corrispondono,


verranno assegnati i valori alle assign key presenti nella stessa; questo, a seconda di quali chiavi
si sono usate, pu`
o comportare lesecuzione di varie operazioni, come la creazione di un file di
dispositivo, o di un link simbolico, fino anche alla esecuzione di un programma ad hoc.
Come esempio di un file di regole possiamo prendere in esame il seguente contenuto del file
z60_hdparm.rules, installato con il pacchetto Debian del programma hdparm (vedi sez. 6.3.1):
ACTION=="add", SUBSYSTEM=="block", KERNEL=="[sh]d[a-z]", RUN+="/etc/init.d/hdparm hotplug"

In questo caso nel caso che il kernel riporti laggiunta di un dispositivo a blocchi il cui nome
corrisponda a quelle di un disco, si richiede laggiunta alla lista dei programmi da eseguire del
lancio dello script di avvio di hdparm cos` che questo possa tener conto del nuovo disco.
Per controllare il comportamento di udev erano stati forniti inizialmente alcuni programmi
singoli (udevinfo e udevmonitor) le cui funzionalit`a sono state in seguito raccolte in un unico
programma, udevadm che consente di operare sul sistema. Il comando richiede che si specifichi
come argomento un sotto-comando indicate il tipo di operazioni che si vogliono effettuare, che
vengono specificate ulteriormente tramite le opportune opzioni.
In particolare con udevadm info, che sostituisce udevinfo, si possono ottenere le informazioni presenti nel database di udev relative ad un qualunque dispositivo riconosciuto dal kernel.
Il comando richiede che si indichi il dispositivo di cui si richiedono le informazioni e questo pu`
o
essere fatto in due modi; il primo `e tramite lopzione -p (o --path) che consente di specificarlo
tramite il pathname con cui esso compare sotto /sys/device, ma in genere, dato che detto pathname pu`
o risultare molto complesso per via della gerarchia dei dispositivi, si utilizza la molto
pi`
u spesso lopzione -n (o -name), che prende invece il nome del dispositivo come compare sotto
/dev.264
Le richieste di informazione vengono controllate dallopzione -q (o --query) che prende
un argomento consente di specificare le informazioni che si richiedono, il cui possibile valore
`e illustrato in tab. 5.38, in genere si usa path per ottenere il pathname del dispositivo sotto
/sys/device.
Valore
name
symlink
path
property
all

Significato
file di dispositivo sotto /dev.
link simbolici relativi al dispositivo.
pathname sotto /sys.
propriet`
a del dispositivo.
tutte le precedenti.

Tabella 5.38: Possibili valore per lopzione -q di udevadm info.

Inoltre, se si usa lopzione -a (o --attribute-walk) invece di -q `e possibile ottenere i valori


di tutti gli attributi associati al dispositivo (e ai bus o dispositivi di cui fa parte nella gerarchia
di sysfs), vale a dire quelli controllabili con le matching key di tipo ATTR{name}.
264

la prima opzione per`


o, al costo di una identificazione pi`
u complicata, consente di ottenere le informazioni
anche quando per un qualche malfunzionamento delle regole di udev non viene creato un file di dispositivo sotto
/dev.

352

CAPITOLO 5. AMMINISTRAZIONE STRAORDINARIA DEL SISTEMA

Una altro sotto-comando molto utile, specie quando si deve effettuare una diagnosi di funzionamento di udev, `e udevadm monitor, (che sostituisce udevmonitor) che pone sotto osservazione
il sistema e stampa sulla console i dati relativi sia agli eventi inviati dal kernel che a quelli generati dal sistema stesso. In questo caso esistono varie opzioni che consentono di controllare e
filtrare loutput del comando, ad esempio con --kernel si pu`o richiedere la stampa degli eventi
del kernel, con --udev di quelli interni ad udev, o usare --subsystem-match per chiedere (tramite la stringa che lo identifica passata come parametro) la stampa dei soli eventi relativi ad un
sottosistema (quelli di /sys/subsystem).
Sotto-comando
info
control
monitor
test
help

Significato
ricerca informazioni nei dati di sysfs e udev.
esegue operazioni di controllo su udevd.
si pone in ascolto degli eventi e stampa informazioni a video.
simula un evento.
stampa lelenco dei sotto-comandi.
Tabella 5.39: Sotto-comandi del comando udevadm.

In tab. 5.39 si sono riportati i principali sotto-comandi di udevadm. Un elenco completo si


pu`o ottenere con udevadm help, e per le informazioni dettagliate riguardo a tutte le opzioni
disponibili per ciascuno di essi si rimanda alla pagina di manuale, accessibile al solito con man
udevadm.

Capitolo 6

Amministrazione avanzata del


sistema
6.1

Lutilizzo del RAID

Tratteremo in questa prima sezione lutilizzo dei sistemi RAID, una tecnologia che permette
di utilizzare i dischi a gruppi (detti array) per ottenere migliori prestazioni o una maggiore
affidabilit`
a; partiremo con una introduzione teorica a questa tecnologia per poi vedere le varie
modalit`a con cui essa viene realizzata e pu`o essere utilizzata con Linux.

6.1.1

Introduzione

La tecnologia RAID (acronimo che sta per Redundant Arrays of Inexpensive Disks) nasce con
un articolo pubblicato nel 1987 a Berkeley, dove si descrivevano varie tipologie di disk array.
Lidea di base `e quella di combinare pi`
u dischi indipendenti di piccole dimensioni per ottenere o
prestazioni, o affidabilit`
a o quantit`
a di spazio disco superiori a quelle ottenibili con un qualunque
disco SLED (Single Large Expensive Drive).
Larticolo presentava cinque diversi tipi di architetture RAID (da RAID-1 a RAID-5) ciascuna delle quali prevedeva diversi gradi di ridondanza per fornire tolleranza alla rottura e
diversi gradi di prestazioni. A queste si `e aggiunta poi la notazione RAID-0 per indicare una
configurazione senza ridondanza.
Oggigiorno alcune delle configurazioni previste nellarticolo non sono pi`
u supportate (se non
in sistemi specializzati), e non le prenderemo neanche in considerazione, ne sono poi emerse
altre come la combinazione del RAID-0 con il RAID-1, denominata RAID-10, o quella definita
linear. Con il kernel 2.6.x inoltre `e stato introdotto anche il RAID-6 analogo al RAID-5 ma in
grado di assicurare una maggiore affidabilit`a. In generale comunque ci si suole riferire a queste
configurazioni con il nome di livelli, quelli che prenderemo in esame sono pertanto:
linear

In questo livello due o pi`


u dischi vengono combinati in un singolo dispositivo. I
dischi sono semplicemente accodati uno sullaltro, cos` che scrivendo in maniera
lineare prima verr`
a riempito il primo e poi i successivi. La dimensione dei singoli
dischi in questo caso `e del tutto irrilevante.
Questo livello non assicura nessun tipo di ridondanza, e se uno dei dischi si rompe
si perderanno probabilmente tutti i dati. Data la modalit`a di scrittura comunque si
perderanno solo i dati presenti nel disco rotto, e qualche forma di recupero potrebbe
comunque essere possibile.
Questa configurazione non migliora le prestazioni di lettura o scrittura sulla singola
operazione, ma quando pi`
u utenti accedono allarray si pu`o avere una distribuzione
353

354

CAPITOLO 6. AMMINISTRAZIONE AVANZATA DEL SISTEMA


del carico sui vari dischi, qualora per un caso fortuito vengano eseguiti degli accessi
a dati posti su dischi diversi.

RAID-0

Questo livello `e anche chiamato stripe mode; in questo caso i dischi dovrebbero
avere la stessa dimensione (anche se non `e strettamente necessario). In questo caso
le operazioni sullarray vengono distribuite sui singoli dischi. Se si scrive un blocco di
dati questo verr`
a suddiviso in strisce (le stripes, appunto) di dimensione predefinita1
che vengono scritte in sequenza su ciascuno dei vari dischi che compongono larray:
una striscia sul primo, poi sul secondo, ecc. fino allultimo per poi ricominciare con il
primo. In questo modo la capacit`a totale resta la somma di quella dei singoli dischi.
In questo modo le prestazioni di lettura e scrittura possono essere notevolmente
aumentate, in quanto le operazioni vengono eseguite in parallelo su pi`
u dischi, e se i
dischi sono veloci ed in numero sufficiente si pu`o facilmente saturare la capacit`a del
bus, o se questultimo `e veloce si pu`o ottenere una banda passante totale pari alla
somma di quella dei singoli dischi.
Se `e presente un disco di dimensioni maggiori si potr`a continuare ad accedere operando solo sullo spazio presente sulla parte finale dello stesso, ma in questo caso si
operer`
a su un solo disco, e non si avr`a quindi nessun miglioramento delle prestazioni
per quanto riguarda i dati che vanno a finire su di esso.
Come nel caso precedente questo livello non fornisce nessuna ridondanza. La rottura
di un disco comporta la perdita totale di tutti i dati, compresi pure quelli sugli altri
dischi, dato che in questo caso non esistono, a differenza di linear, blocchi di dati
continui pi`
u lunghi della dimensione di una striscia. In questa modalit`a lMTBF
(sigla che sta per Mean Time Between Failure) diminuisce per`o proporzionalmente
al numero di dischi dellarray in quanto la probabilit`a di fallimento dellarray `e
equivalente a quella di un singolo disco moltiplicata per il numero dei dischi che
compongono larray.

RAID-1

Questo `e il primo livello che fornisce della ridondanza. Richiede almeno due dischi
per larray e leventuale presenza di dischi di riserva. Inoltre i dischi devono essere
tutti uguali, se sono diversi la dimensione dellarray sar`a quella del pi`
u piccolo dei
dischi. I dati vengono scritti in parallelo su tutti i dischi che compongono larray,
pertanto basti che sopravviva anche un solo disco dellarray perche i dati siano
intatti, in quanto ciascun disco ne ha una copia completa. Gli eventuali dischi di
riserva vengono utilizzati in caso di fallimento di un disco dellarray, per dare inizio
ad una ricostruzione immediata dellarray stesso.
Con questo livello di RAID si aumenta laffidabilit`a in quanto la probabilit`a di
fallimento dellarray `e equivalente a quella di un singolo disco divisa per il numero
dei dischi dellarray. In realt`
a poi `e ancora minore, in quanto la probabilit`a che i
dischi falliscano tutti insieme `e ancora minore, per cui basta sostituire un disco rotto
per recuperare lintera funzionalit`a dellarray.
Come controparte per laffidabilit`a le prestazioni di scrittura di un RAID-1 sono in
genere peggiori di quelle del singolo disco, in quanto i dati devono essere scritti in
contemporanea su pi`
u dischi, e se questi sono molti (e si usa una implementazione
software) facendo passare tante copie si pu`o superare il limite di banda del bus su
cui sono posti i dischi abbastanza facilmente. In questo caso i controller hardware
hanno il vantaggio di gestire internamente la replicazione dei dati, richiedendo linvio
su bus di una sola copia.

questa viene di norma definita in fase di creazione dellarray, ed `e uno dei parametri fondamentali per le
prestazioni dello stesso.

6.1. LUTILIZZO DEL RAID

355

Le prestazioni in lettura sono invece migliori, non tanto sulla singola lettura, ma
quando ci sono molte letture contemporanee e spostamenti sui dati. In tal caso
infatti i dati possono essere letti in parallelo da dischi diversi, e si pu`o approfittare
del diverso posizionamento delle testine sui dischi per leggere i dati da quello che
deve compiere un minore spostamento delle testine.2
RAID-4

Benche disponibile `e senzaltro il meno usato. Necessita di tre o pi`


u dischi. Mantiene
delle informazioni di recupero su un disco di parit`a, ed utilizza gli altri in RAID-0.
I dischi devono essere di dimensioni identiche, altrimenti larray avr`a la dimensione
del pi`
u piccolo di essi. Se uno dei dischi in RAID-0 si rompe `e possibile utilizzare le
informazioni di recupero del disco di parit`a per ricostruire i dati in maniera completa.
Se si rompono due dischi si perderanno invece tutti i dati.
Questo livello cerca di bilanciare i vantaggi di affidabilit`a del RAID-1 con le prestazioni del RAID-0, ma non viene usato molto spesso per`o perche il disco di parit`
a
viene a costituire un collo di bottiglia in quanto comunque tutte le informazioni
devono esservi replicate, lunico caso di impiego reale `e quello di un disco veloce
affiancato ad un gruppo di dischi pi`
u lenti.

RAID-5

Come per il RAID-4 anche in questo caso si cercano di ottenere sia vantaggi di
affidabilit`
a che quelli di prestazioni, ed `e il pi`
u usato quando si hanno pi`
u di due
dischi da mettere in RAID. Anche per il RAID-5 sono necessari almeno tre dischi,
ma in questo caso, per evitare il problema del collo di bottiglia, le informazioni di
parit`
a, queste vengono distribuite su tutti i dischi che fanno parte dellarray. In
questo modo anche se uno dei dischi si rompe le informazioni di parit`a presenti
sugli altri permettono di mantenere intatti i dati. Inoltre se si sono inseriti dei
dischi di riserva la ricostruzione del disco rotto o indisponibile viene fatta partire
immediatamente. Se per`o si rompono due dischi i dati sono persi.
Il RAID-5 presenta inoltre, dato che dati sono comunque distribuiti su pi`
u dischi,
gli stessi vantaggi nella lettura presentati dal RAID-0. In scrittura invece le prestazioni sono meno predicibili, e le operazioni possono essere anche molto costose,
quando richiedono pure le letture necessarie al calcolo delle informazioni di parit`
a,
o dellordine di quelle del RAID-1. In generale comunque le prestazioni aumentano
sia in lettura che in scrittura. Inoltre nel caso di RAID software `e richiesto un certo
consumo di risorse (sia di memoria che di CPU) per il calcolo delle informazioni di
parit`
a.

RAID-10 Si suole definire cos` una configurazione in cui si effettua un RAID-0 di pi`
u array
configurati in RAID-1. In questo modo si ottiene sia la ridondanza del RAID-1 che
laumento di prestazioni del RAID-0. Rispetto al RAID-5 ha il vantaggio che possono
rompersi anche pi`
u dischi, ma fintanto che almeno ne resta almeno uno attivo nei
due RAID-1 le informazioni saranno integre. Il tutto al prezzo di un numero molto
maggiore di dischi per ottenere la stessa capacit`a.
RAID-6

` concettualmente identico al RAID-5, di cui presenta le stesse caratteristiche funzioE


nali, ma prevede che le informazioni di parit`a siano distribuite su due dischi aggiuntivi, cos` che sia possibile sopportare la rottura contemporanea di due dischi anziche
uno solo.3 Rispetto al RAID-5 ha il vantaggio di una maggiore ridondanza dato che

2
`e caratteristica comune degli hard disk avere tempi di risposta nettamente diversi per la lettura sequenziale
di dati, rispetto al posizionamento (il cosiddetto seek time).
3
evento che si `e dimostrato tuttaltro che improbabile; i dischi di uno stesso produttore infatti, specie se
provenienti dalla stessa catena di produzione, hanno dimostrato di avere una durata molto simile, cosa che

356

CAPITOLO 6. AMMINISTRAZIONE AVANZATA DEL SISTEMA


possono rompersi anche due dischi in contemporanea, mantenendo l-integrit`a dei
dati fintanto che gli altri restano attivi. Il tutto al prezzo di dover usare un disco in
pi`
u rispetto al RAID-5 per ottenere la stessa capacit`a.

Un altro concetto relativo alla gestione del RAID, che si applica in genere ai livelli che
forniscono ridondanza, come RAID-1, RAID-5 e RAID-6, `e quello dei cosiddetti dischi di riserva,
o spare disk. In questo caso si tratta di dischi che possono essere associati ad un array RAID
senza per`o venirne a far parte come membri attivi. Il loro scopo, come dice il nome, `e quello
di essere usati come riserva quando uno dei dischi attivi si dimostra difettoso. In questo caso `e
previsto che la implementazione del RAID si accorga del problema ed inizi immediatamente ed
in maniera automatica la ricostruzione dellarray utilizzando il disco di riserva al posto di quello
difettoso, cos` da aumentare ulteriormente la salvaguardia dei dati.
Al giorno doggi lo scopo pi`
u comune delluso di un RAID `e comunque quello di proteggersi
dal fallimento o dalla rottura di un disco mantenendo automaticamente la ridondanza delle
informazioni. Per questo il RAID-0 non deve mai essere usato in un sistema di produzione,
perche il rischio di fallimento hardware si moltiplica per il numero di dischi, e con questo quello
della perdita completa dei dati, cosa che normalmente non vale il limitato guadagno di prestazioni
che si potrebbe ottenere.
Si tenga presente infine che lutilizzo di un livello di RAID che assicuri la ridondanza non
`e mai un sostituto di una buona politica di backup. Un array RAID infatti pu`o proteggere
dal fallimento dellhardware di uno o pi`
u dischi, ma non pu`o nulla contro la corruzione di un
filesystem, contro un utente che cancella i dati dal disco, o contro un qualunque altro incidente
che distrugga il vostro array.

6.1.2

Il RAID su Linux

In generale per poter creare un array di dischi in RAID ci sono due opzioni fondamentali: RAID
hardware o RAID software. Nel primo caso occorre poter disporre di un supporto hardware,
cio`e di un controller per i dischi che esegue le operazioni necessarie alla realizzazione del RAID
al suo interno, e presenti poi al sistema operativo linsieme dei dischi come un dispositivo unico.
In teoria un RAID hardware `e lopzione migliore sul piano delle prestazioni in quanto non
necessita di utilizzare dalle risorse (CPU e memoria) della macchina per gestire il RAID e
consente di eseguire il trasferimento di dati una volta sola (dal sistema al dispositivo hardware).
In per`o genere richiede parecchie risorse (specie per i controller RAID SCSI di fascia alta) dal
punto di vista del portafoglio.
Inoltre la superiorit`
a di prestazioni in certi casi `e solo teorica, molti controller hardware
(specie quelli IDE o serial ATA disponibili a costi limitati) si sono rivelati essere molto pi`
u
lenti dellimplementazione del RAID software di Linux, sia per la scarsa potenza dei processori
utilizzati che per la scarsa qualit`
a del software della scheda.4 Questo, unito al fatto che in molti
casi nei server la CPU `e una risorsa meno rilevante rispetto alla stabilit`a e alla sicurezza dellI/O
su disco, ha fatto s` che lopzione del RAID software sia estremamente competitiva nella maggior
parte dei casi.
A questo si aggiunge poi il problema che alcuni controller hardware usano implementazioni
proprietarie nella gestione dei dati del RAID e di come questi sono salvati su disco. Questo
finisce poi col rendere impossibile riutilizzare i dati contenuti sugli stessi dischi su controller di
marca diversa, e talvolta anche su versioni diverse di schede della stessa marca. Tutto ci`o non `e
ovviamente mai vero nel caso del RAID software fatto dal kernel, che `e in grado di riutilizzare i
dischi qualunque sia la scheda su cui questi sono montati.
comporta assai frequentemente delle rotture se non contemporanee comunque molto ravvicinate fra loro, con il
rischio di non fare a tempo a sostituire un disco rotto prima che si rompa anche il secondo.
4
cosa che talvolta li rende anche inaffidabili; questo non `e vero in genere per i controller SCSI di fascia alta,
che hanno per`
o anche un livello di costi totalmente diverso.

6.1. LUTILIZZO DEL RAID

357

In ogni caso Linux supporta vari controller RAID hardware, sia SCSI che IDE che Serial
ATA. Nel caso di controller SCSI in molti casi `e cura del controller stesso presentare tutto
larray RAID come un singolo disco, che pertanto sar`a visto semplicemente con uno dei nomi
associati ai dischi SCSI (come /dev/sda). In tal caso le operazioni di gestione del RAID sono
demandate al firmware della relativa scheda e dipendono ovviamente da questultima, per cui in
genere `e necessario effettuare la configurazione allavvio della macchina operando allinterno del
BIOS con linterfaccia messa a disposizione dalla scheda stessa.
Per alcuni controller RAID dedicati esistono dei driver specifici disponibili nella sezione
Block Devices della configurazione del kernel. In questo caso i dispositivi RAID sono in genere
accessibili attraverso opportune sottodirectory o file di dispositivo sotto /dev che dipendono dal
tipo di controller. Ad esempio per il DAC Mylex viene usata una directory rd mentre per gli
array Compaq vengono usate, a seconda del tipo le directory ida e cciss. In questi casi i singoli
array vengono identificati per canale (spesso i controller supportano pi`
u di una singola catena
SCSI) e per disco, un dispositivo tipico di un array `e sempre nella forma /dev/rd/c0d0 che
indica il primo array sul primo canale. Una volta partizionato larray (che a questo punto viene
visto come un altro disco) le partizioni saranno accessibili con nomi del tipo /dev/ida/c0d0p1.
Nel caso di RAID su IDE non ci sono canali, ed i dispositivi sono accessibili, una volta
attivato il relativo supporto, che `e nella sezione ATA/IDE/MFM/RLL support, attraverso
i file di dispositivo generici disposti nella directory /dev/ataraid, i cui nomi sono analoghi ai
precedenti, soltanto che non presentano un numero di canale; si avr`a cio`e ad esempio qualcosa
del tipo di /dev/ataraid/d0p1. Nel caso di Serial ATA di nuovo alcuni controller consentono
di utilizzare una forma di RAID hardware presentando al kernel larray RAID come un singolo
dispositivo; di nuovo verranno visti come un disco SCSI.5
Per quando non si dispone di un supporto hardware Linux fornisce un supporto software,
attivabile nella sezione Multiple device driver support (RAID and LVM), che supporta la
` cio`e possibile far costruire
creazione di RAID-0, RAID-1, RAID-4, RAID-5, RAID-6 e linear. E
al kernel stesso degli array utilizzando qualunque tipo di dispositivo a blocchi; dato che gli stessi
RAID software sono a loro volta dispositivi a blocchi, `e possibile riutilizzarli per metterli in
RAID fra di loro (pertanto `e possibile creare un RAID-10 mettendo semplicemente in RAID-0
un precedente array software creato in RAID-1). Una volta costruiti gli array si potr`a accedere
ad essi con i file di dispositivo /dev/mdN dove N `e un numero progressiva (in genere si parte da
zero) associato a ciascun dispositivo RAID in fase di creazione.
A parte abilitare il supporto nel kernel (cui abbiamo accennato in sez. 5.2.3), per lutilizzo
del RAID software `e necessario utilizzare anche gli opportuni programmi in user space. Fino al
kernel 2.4 di questi esistevano due versioni, i raidtools (disponibili nellomonimo pacchetto) e
il programma mdadm. Con i kernel della serie 2.6 tutto viene gestito con mdadm che `e un singolo
programma che raccoglie al suo interno tutte le funzionalit`a che prima erano suddivise nei vari
componenti dei raidtools. Questi oggi sono deprecati e non sono neanche pi`
u disponibili in
tutte le distribuzioni pi`
u recenti.

6.1.3

La gestione del RAID software

Per la creazione di un RAID software occorre anzitutto disporre di un opportuno numero di


dischi da utilizzare come membri del RAID, questo significa almeno 2 per il RAID-1, almeno
3 per il RAID-5 ed almeno 4 per il RAID-6. Benche sia possibile utilizzare un intero disco
come membro di un array, `e molto pi`
u comune utilizzare delle singole partizioni (cosa che ad
esempio nel caso del RAID-1 consente di riutilizzare direttamente anche il singolo disco). Questo
consente anche, suddividendo i dischi in partizioni uguali, di creare pi`
u dispositivi RAID dallo
5

si tenga presente che in molti casi le prestazioni e laffidabilit`


a di queste schede a basso costo si sono dimostrate
molto limitate, tanto da sconsigliarne comunque luso a favore del supporto software presente nel kernel.

358

CAPITOLO 6. AMMINISTRAZIONE AVANZATA DEL SISTEMA

stesso insieme di dischi, da utilizzare nella stessa maniera in cui si usano le diverse partizioni di
un unico disco.
Si tenga presente per`
o che non ha alcun senso usare due partizioni dello stesso disco come
membri di un RAID; infatti in tal caso gli stessi dati verrebbero scritti su due parti diverse dello
stesso disco e non si avrebbe cos` alcuna ridondanza. Inoltre dato che i dati di un RAID vengono
scritti in contemporanea su tutti i membri dellarray una tale configurazione comporterebbe uno
stress notevole del disco che dovrebbe eseguire accessi contemporanei su zone diverse, e quindi
un grosso lavoro di spostamento delle testine; le conseguenza sarebbero un enorme degrado delle
prestazioni ed un forte stress meccanico, con aumento della probabilit`a di rottura.
Una seconda considerazione deve essere fatta riguardo la configurazione hardware dei dischi.
Si deve infatti tener presente che con il RAID software i dati vengono inviati in copia su ciascun
disco, questo significa ad esempio che se si hanno molti veloci dischi su un unico bus SCSI, si
potrebbe raggiungere il limite di banda passante del bus e non sfruttare a pieno la velocit`a di
trasferimento dei singoli dischi.
Un problema simile si ha quando si usano dischi IDE, in tal caso infatti se si montano due
dischi sullo stesso canale IDE essendo laccesso al bus conteso le prestazioni degradano dato
che i dati possono essere inviati soltanto un disco alla volta; inoltre se uno dei dischi si rompe
questo pu`o comportare anche il blocco dellintero canale, con il conseguente disastroso fallimento
dellintero array.6 Per questo motivo quando si usano dischi IDE questi devono sempre essere
posti su canali IDE diversi.
Si tenga presente infine che, a parte il caso del linear, per poter creare un RAID occorrer`a
che i dischi (o le singole partizioni) che andranno a far parte dellarray siano delle stesse dimensioni. In realt`a questo non `e strettamente necessario, in quanto se si usano dischi o partizioni di
dimensioni diverse in fase di creazione del RAID verr`a usata la pi`
u piccola di quelle disponibili,
e lunico inconveniente potr`
a essere quello dello spreco di un po di spazio disco. Le cose per`o
possono diventare molto pi`
u complicate in caso di sostituzione di un disco: accade spesso infatti
che le dimensioni dichiarate dai costruttori siano tuttaltro che precise, ed `e comune trovarsi con
due dischi che solo nominalmente sono della stessa dimensione, il problema `e che se il nuovo
disco `e anche solo leggermente pi`
u piccolo della dimensione usata per il RAID con il vecchio,
7
non `e pi`
u possibile utilizzarlo.
Come accennato in sez. 5.1.2 le partizioni utilizzate per il RAID software possono essere
marcate come tali impostando un tipo specifico; i valori possibili sono due, fd che identifica le
vecchie partizioni di tipo RAID autodetect e da che `e il valore consigliato per le nuove partizioni (denominato non fs data). Luso di fd infatti comporta da parte del kernel il tentativo
di assemblare e far partire automaticamente il RAID software quando rileva una partizione di
questo tipo,8 cosa che non `e detto sia sempre voluta.9 Per questo motivo questa funzionalit`a,
creata per poter far partire automaticamente un RAID da montare come radice, `e attualmente
deprecata (anche se sempre disponibile) in favore delluso di un opportuno ramdisk di avvio
(vedi sez. 5.2.4) contenente i programmi in grado di assemblare il RAID in modo opportuno.10
Come gi`a accennato a partire dai kernel della serie 2.6 tutte le operazioni di gestione del RAID
software sono state demandate al programma mdadm; dato che detto programma `e disponibile
6

questo non si applica invece al Serial ATA, che non supporta il concetto di master/slave.
per questo c`e chi usa sempre una partizione leggermente pi`
u piccola delle dimensioni reali del disco, per
lasciarsi un margine per casi di questo tipo.
8
questa funzionalit`
a `e comunque disponibile solo se il supporto `e compilato allinterno del kernel e solo con
certe versioni del RAID software, ed in particolare con la versione 0.90 del cosiddetto RAID superblock, che al
momento (Aprile 2009) `e ancora il default.
9
e che in certi casi, come quello in cui si sposta un disco su unaltra macchina senza cancellarlo, pu`
o creare
danni notevoli se questo viene assemblato come parte di un array gi`
a attivo.
10
ad esempio facendo riferimento agli UUID associati a ciascun dispositivo RAID software.
7

6.1. LUTILIZZO DEL RAID

359

anche per i kernel della serie 2.4 non tratteremo affatto i vecchi raidtools il cui interesse ormai
`e esclusivamente storico.
Una delle caratteristiche principali di mdadm, che lo distingue nettamente dai raidtools, `e
quella di poter funzionare anche senza la presenza di un file di configurazione,11 ma il comando fa comunque riferimento al contenuto /etc/mdadm/mdadm.conf o, se questo non esiste, di
/etc/mdadm.conf. In genere questo file viene utilizzato, oltre che per impostare una serie di
valori di default, per mantenere la lista degli array presenti sulla propria macchina e viene sempre creato in fase di installazione, Un esempio del suo contenuto `e quello riportato dal seguente
estratto dalla versione presente su una Debian Lenny su cui sono stati creati tre array RAID-1:
# by default, scan all partitions (/proc/partitions) for MD superblocks.
# alternatively, specify devices to scan, using wildcards if desired.
DEVICE partitions
# auto-create devices with Debian standard permissions
CREATE owner=root group=disk mode=0660 auto=yes
# automatically tag new arrays as belonging to the local system
HOMEHOST <system>
# instruct the monitoring daemon where to send mail alerts
MAILADDR root
# definitions of existing MD arrays
ARRAY /dev/md0 level=raid1 num-devices=2 UUID=63492dc1:8eaa5c05:5fb94220:239df376
ARRAY /dev/md1 level=raid1 num-devices=2 UUID=fa83ab9c:8d008d80:ded268eb:c0534d8f
ARRAY /dev/md2 level=raid1 num-devices=2 UUID=e11003b2:7eda78aa:0e5f395c:9308b30d

Il formato di mdadm.conf `e quello tipico in cui le righe vuote e quelle inizianti con il carattere
# vengono ignorate; le configurazioni vengono specificate ponendo la parola chiave che identifica
la direttiva allinizio della riga, seguita poi da eventuali parametri separati da spazi o tabulazioni.
Una riga che inizia con un carattere di spaziatura viene considerata una prosecuzione della riga
precedente. Le principali direttive ed i loro parametri sono illustrate in tab. 6.1, le parole chiavi
ivi riportate possono essere scritte per intero o con una abbreviazione di tre lettere. Al solito per
lelenco completo di direttive e parametri ed i dettagli sul loro significato si pu`o fare riferimento
alla pagina di manuale accessibile con man mdadm.conf.
Dato che tutti gli aspetti della gestione del RAID software vengono gestiti con mdadm, le
operazioni del comando sono state suddivise su sette diverse modalit`a di utilizzo, riportate in
tab. 6.2. Le prime cinque modalit`
a sono da attivare esplicitamente tramite luso delle corrispondenti opzioni, mentre la modalit`a Manage `e sottintesa se si passa come primo argomento
prima di ogni opzione il file di dispositivo di un array o se la prima opzione `e --add, --fail o
--remove. Tutte le restanti possibilit`a fanno capo alla modalit`a Misc.
In generale nella gestione del RAID il primo utilizzo di mdadm deve essere effettuato in
modalit`a Create (con lopzione -C o --create) per creare larray a partire dalla serie di dischi
che ne fanno parte, a cui deve seguire il nome del file di dispositivo a cui larray sar`a associato. Si
tenga presente che in questo caso creare significa predisporre su ciascuno dei membri di un array
i dati che ne contengono le caratteristiche e le informazioni di gestione, che sono mantenuti
nel cosiddetto superblocco (in inglese superblock ); una piccola sezione di disco utilizzata per
mantenere le informazioni relative allarray di cui esso viene a far parte.13 Fra queste la pi`
u
11

la scelta deriva dal fatto che quando la radice `e su RAID il contenuto di /etc non `e accessibile senza aver
prima attivato il RAID stesso.
12
si sono dati per scontati i concetti di nome a dominio e di nome della macchina, li tratteremo in dettaglio in
sez. 7.4.
13
fino alla versione 0.90 questo era posto in coda al disco (o alla partizione), `e stato poi spostato allinizio e
nellultima versione a 4K dallinizio della partizione, `e cura del RAID software evitare che il lo spazio allocato per
il superblocco venga sovrascritto dai dati.

360

CAPITOLO 6. AMMINISTRAZIONE AVANZATA DEL SISTEMA


Opzione
ARRAY

DEVICE

CREATE

MAILADDR
HOMEHOST

Significato
identifica un array, il primo parametro `e il nome del file di dispositivo
ad esso associato, seguito da una lista di parametri che identificano le
caratteristiche dellarray; questi sono nella forma chiave=valore dove
ciascuna chiave identifica la caratteristica indicata dal corrispondente
valore, le principali chiavi sono: uuid che indica lUUID associato allarray, level che indica il tipo di RAID, num-devices che indica il
numero di componenti; per un elenco completo si consulti la pagina di
manuale.
indica la lista dei dispositivi che possono contenere un componente di
un array, questi possono essere indicati tramite i rispettivi file di dispositivo, usando anche i caratteri jolly del filename globbing, alternativamente si pu`
o usare la parola chiave partitions per indicare al comando
di leggere ed utilizzare il contenuto di /proc/partitions.
indica i permessi da assegnare al file di dispositivo di un array quando questo viene creato in modalit`
a automatica (con lopzione -a di
--create); prevede luso di una serie di parametri nella forma chiave=valore, di nuovo si consulti la pagina di manuale per i dettagli,
anche se i nomi delle chiavi, come user, group o mode sono piuttosto
espliciti.
indica lindirizzo email, a cui inviare gli allarmi quando mdadm viene
eseguito in modalit`
a Monitor.
indica il nome della macchina usato come valore di default per lopzione
--homehost di mdadm; pu`
o essere un nome a dominio o la parola chiave
<system> che la ottiene direttamente dal sistema.12

Tabella 6.1: Principali direttive di configurazione di mdadm.conf.

importante `e il valore dellUUID associato allarray, che `e quello che poi pu`o essere utilizzato in
seguito per farlo ripartire (al riavvio della macchina o qualora lo si fosse fermato), e che compare
fra i parametri della direttiva ARRAY di mdadm.conf.
Sempre nel superblocco viene registrato il nome della macchina su cui si `e creato larray, cosa che consente di evitare che questo venga attivato automaticamente su una macchina diversa
quando si usano le opzioni per la partenza automatica dellarray. Il nome da usare viene impostato tramite la direttiva HOMEHOST di mdadm.conf il cui default, come mostrato nellesempio
precedente, `e <system>, che indica di usare il nome stesso della macchina; il valore pu`o per`o
anche essere specificato direttamente sulla riga di comando, soprassedendo quanto indicato con
detta direttiva, come argomento per lopzione --homehost.14
Si tenga presente che nella gestione del RAID software la modalit`a Create deve essere impiegata soltanto una volta, quando si costruisce larray; in seguito infatti sar`a sufficiente utilizzare
le informazioni permanenti registrate nel superblocco per fare ripartire larray riassemblando
(come vedremo analizzando la modalit`
a Assemble) i vari dischi che ne fanno parte. Si pu`o per`o
anche creare un array con la modalit`
a Build in cui questo viene costruito senza registrare informazioni permanenti sui suoi componenti; in tal caso non esistono controlli che permettono di
evitare di assemblare un array con dati non coerenti, e in caso di errore si rischia ovviamente la
perdita completa del contenuto dello stesso.
Una volta selezionata la modalit`
a con --create si deve specificare come primo argomento
il file di dispositivo che si vuole sia usato per accedere allarray. Si pu`o per`o usare lopzione
-a per richiedere una allocazione dinamica dello stesso; in tal caso il dispositivo viene creato
sotto /dev/md con un numero progressivo anche se il classico /dev/mdN viene fornito come link
simbolico al precedente, si deve poi specificare il tipo di RAID con lopzione -l (o --level),15
14
questa `e una delle opzioni generiche che possono essere usate in diverse modalit`
a ; il suo compito `e quello
di indicare quale nome di macchina deve essere preso come riferimento nei confronti di quello memorizzato sul
superblocco.
15
si ricordi che in caso di opzioni estese mdadm richiede che il relativo valore venga specificato in forma di

6.1. LUTILIZZO DEL RAID

361

Modalit`
a
Create

Opzione
--create

-C

Build

--build

-B

Assemble

--assemble

-A

Grow

--grow

-G

Monitor

--monitor

-F

Incr. Assembly

--incremental

-I

Manage

Misc

Significato
Crea da zero un nuovo array di dischi, registrando sui
singoli dischi le informazioni di gestione ad esso relative
con linstallazione del cosiddetto superblocco.
Costruisce ed attiva un array ignorando eventuali informazioni di gestione del superblocco, pertanto `e possibile
costruire un array con dischi anche completamente scorrelati fra loro distruggendo completamente i dati precedentemente presenti, inoltre per riavviare larray occorre
ricordarsi esattamente i dischi usati, `e pertanto da usare esclusivamente quando si sa esattamente cosa si sta
facendo.
Assembla un array precedentemente creato con la registrazione del superblocco sui singoli dispositivi; viene
utilizzato per far partire un dispositivo RAID allavvio.
Consente di allargare o restringere un array, o di modificarne le caratteristiche. In pratica viene usato per modificare le dimensioni dei singoli componenti di un array
o per cambiare il numero di dischi attivi per i RAID del
livelli 1, 4, 5 e 6.
Denominato anche Follow (attivabile anche con -follow) consente di tenere sotto osservazione lo stato di
integrit`
a uno o pi`
u array (ha senso solo per gli array che
supportano la ridondanza).
Una variante di Assemble in cui si specificano i membri
di un array uno alla volta invece che tutti insieme; viene in genere utilizzato per far partire un RAID quando
questo `e composto di dischi hot-plug che possono essere
riconosciuti in sequenza.
la modalit`
E
a in cui si pu`
o operare sui singoli componenti
di un array, con operazioni come laggiunta di nuovi dischi di riserva, la rimozione dallarray di dischi difettosi
e simili.
` la modalit`
E
a utilizzata per tutte le operazioni di varia
natura che non rientrano nelle categorie precedenti.

Tabella 6.2: Modalit`


a di operazione di mdadm.

che richiede un successivo parametro che indichi il livello. Questo deve essere specificato con
una delle parole chiave stripe o mirror, sinonimi rispettivamente di RAID-0 e RAID-1, oppure
specificando direttamente il valore del livello nella forma raidN o semplicemente con N, (dove N
pu`o assumere i valori 0, 1, 4, 5, 6 e 10).
Laltra opzione obbligatoria in fase di creazione di un array `e -n (o --raid-devices) con
cui si specifica il numero di dispositivi che ne fanno parte; allopzione deve essere fatta seguire
una lista di altrettanti file di dispositivo, si pu`o per`o includere nella lista, per i livelli di RAID
che supportano la ridondanza, la parola chiave missing,16 che consente di creare un array senza
la presenza di tutti i dischi dichiarati.17 Se si vogliono impostare anche dei dischi di riserva
il loro numero deve essere specificati con lopzione -x (o --spare-devices) cui come nel caso
precedente si deve far seguire lelenco dei relativi file di dispositivo.18
assegnazione.
16
il numero di volte in cui si pu`
o farlo dipende ovviamente dal tipo di RAID scelto: con i RAID-4 e RAID-5 una
sola volta, con il RAID-6 due volte e quante volte si vuole con il RAID-1, ovviamente sar`
a necessario comunque
indicare, per ciascuna di queste modalit`
a, un numero di dispositivi sufficiente (almeno due, tranne che per il
RAID-1).
17
ovviamente in questo caso larray creato sar`
a degradato fin dallinizio, ma si potranno aggiungere i dischi
mancanti in seguito.
18
in realt`
a si possono specificare le due opzioni ed file di dispositivo in un ordine qualunque, ma il numero di
file di dispositivo indicati (comprendendo fra questi eventuali missing) deve corrispondere alla somma dei due

362

CAPITOLO 6. AMMINISTRAZIONE AVANZATA DEL SISTEMA

Pertanto un possibile esempio di creazione con mdadm di un dispositivo RAID-1 a partire da


due dischi IDE su cui si `e usata una unica partizione potrebbe essere il seguente:
mdadm --create /dev/md0 --level=mirror --raid-devices 2 /dev/hda1 /dev/hdc1
mentre per la creazione di un RAID-5 a partire da tre dischi SCSI, con un disco IDE come spare,
sempre con una unica partizione, si potrebbe usare il comando:
mdadm -C /dev/md1 -l 5 -n 3 /dev/sda1 /dev/sdb1 /dev/sdc1 -x 1 /dev/hda1
Una volta creato un array con --create questo viene immediatamente attivato, questo comporta anche, per i livelli che supportano la ridondanza, lavvio della procedura di sincronizzazione
dei dati dei vari dischi che lo compongono.19 Lo stato degli array RAID presenti su una macchina pu`o essere controllato tramite il file /proc/mdstat. Un esempio tipico di questo file, in
una situazione ordinaria di utilizzo di un array, `e il seguente:
gethen:~# cat /proc/mdstat
Personalities : [raid1]
read_ahead 1024 sectors
md0 : active raid1 hdc1[1] hda1[0]
116214080 blocks [2/2] [UU]
unused devices: <none>

in cui viene mostrata lo stato su una macchina in cui `e presente un solo array RAID-1 composto
da due dischi, sincronizzato e attivo.
In una situazione in cui un array `e stato appena creato, e pertanto il contenuto dei membri
deve esser ancora sincronizzato, si avr`
a invece un risultato analogo al seguente:
alterra:~# cat /proc/mdstat
Personalities : [raid1]
md2 : active raid1 sda3[0] sdb3[1]
7618816 blocks [2/2] [UU]
[=========>...........] resync = 45.0% (3433728/7618816) finish=63.2min
speed=11018K/sec

dove entrambi i dischi di un RAID-1 sono membri attivi dellarray, ma `e un corso la sincronizzazione dei loro contenuti.
Infine quando per un qualche motivo uno dei dischi che fa parte di un array `e viene disattivato
ed in seguito riattivato, il RAID dovr`
a essere ricostruito; in tal caso si potr`a avere invece un
risultato analogo al seguente:
urras:~# cat /proc/mdstat
Personalities : [raid1]
read_ahead 1024 sectors
md0 : active raid1 hdc1[0] hda1[1]
5855552 blocks [2/2] [UU]
md1 : active raid1 hdc2[2] hda2[1]
69336448 blocks [2/1] [_U]
[>....................] recovery =
in speed=6232K/sec
md2 : active raid1 hdc3[2] hda3[1]
4490048 blocks [2/1] [_U]

0.8% (581632/69336448) finish=183.7m

numeri.
19
e il conseguente inizio di una frenetica attivit`
a sui dischi.

6.1. LUTILIZZO DEL RAID

363

dove viene mostrato lo stato di una macchina con tre array RAID-1 costituiti dalle prime tre
partizioni di due dischi IDE; in questo caso per un errore il secondo disco (/dev/hdc) era stato
disattivato, ed una volta riattivato /proc/mdstat mostra la situazione in cui il primo array ha
completato la risincronizzazione dei dischi, il secondo `e attivo con un solo disco ma in fase di
ricostruzione ed il terzo `e attivo su un solo disco, in attesa di essere a sua volta sincronizzato.20
Il formato di /proc/mdstat prevede la presenza di una intestazione che riporta la liste dei
tipi di RAID utilizzati,21 seguita da una diversa sezione per ciascun array presente. Ciascuna
di queste inizia con il nome del file di dispositivo ad esso associato, seguito dallo stato e dalla
lista dei dispositivi membri dellarray indicati dai rispettivi file di dispositivo con fra parentesi
quadra la posizione dello stesso nellarray.22
La riga seguente indica la dimensione, in blocchi, dellarray, seguita dallindicazione fra
parentesi quadre del numero di dispositivi che ne fan parte verso quelli attivi. Lo stato dei
singoli viene rappresentato graficamente anche da una stringa in cui ogni dispositivo attivo
viene rappresentato da una lettera U, mentre i dispositivi non attivi sono rappresentati dal
carattere _. In caso di ricostruzione, come nellesempio precedente, viene mostrato anche una
indicazione semigrafica dello stato della procedura di ricostruzione con una stima del tempo
mancante alla sua conclusione.
Quando un array non `e attivo, che questo sia avvenuto per il risultato di una operazione
esplicita di blocco,23 o perche si `e allavvio del sistema, esso deve essere esplicitamente riattivato24
assemblando tutti i dispositivi che ne fanno parte usando mdadm in modalit`a Assemble. Le
modalit`a con cui si pu`
o effettuare questa operazione sono molteplici; la pi`
u diretta `e quella in
cui si passa come primo argomento il nome del dispositivo associato allarray e come argomenti
successivi lelenco dei dispositivi che ne fanno parte; ad esempio nel caso dellarray RAID-1 creato
con il primo dei comandi illustrati in precedenza si potr`a far ripartire larray con il comando:
mdadm --assemble /dev/md0 /dev/hda1 /dev/hdc1
Alternativamente si possono riavviare in un colpo solo tutti gli array che sono stati creati
utilizzando soltanto lopzione --scan; questa `e una opzione generica presente in diverse modalit`
a
che consente di determinare automaticamente gli argomenti riguardanti la composizione di un
array mancanti sulla riga di comando, come i dispositivi che ne fan parte, il file di dispositivo
ad esso associato o gli UUID dello stesso. Pertanto se si vogliono avviare tutti gli array creati
in precedenza si potr`
a usare semplicemente il comando:
mdadm --assemble --scan
Luso della sola opzione --scan comporta una serie di operazioni abbastanza complesse;
come primo passo viene usato, se presente, mdadm.conf, ed assemblati gli array ivi dichiarati
con le direttive ARRAY, altrimenti viene usato il contenuto di /proc/partitions per identificare
la presenza di dispositivi che possono far parte di un array e se il nome della macchina a cui
fanno riferimento corrisponde a quello della direttiva HOMEHOST questi vengono fatti partire
automaticamente.
20

quando pi`
u array coinvolgono gli stessi dischi la sincronizzazione viene sempre effettuata un array alla volta
per evitare eccessivo sforzo sulla meccanica del disco che altrimenti dovrebbe spostare le testine da una partizione
allaltra.
21
nellesempio precedente si ha Personalities : [raid1] dato che in quel caso veniva utilizzato solo il
RAID-1, altrimenti sarebbero state presenti anche voci corrispondenti alle altre personalit`
a.
22
il numero non significa nulla di per se, `e solo un indice in una tabella, ma serve ad identificare la posizione
del dispositivo nella rappresentazione dei dispositivi attivi mostrata nelle righe successive.
23
ad esempio si pu`
o fermare un qualunque array, se questo non `e in uso, con il comando mdadm --stop /dev/md0.
24
si ricordi che come accennato lattivazione automatica viene eseguita dal kernel solo per i dispositivi marcati
come membri di un RAID software nella tabella delle partizioni, e solo con la specifica versione del superblocco.

364

CAPITOLO 6. AMMINISTRAZIONE AVANZATA DEL SISTEMA

Infine siccome che non `e detto che si voglia far partire sempre tutti gli array presenti,25 `e
possibile avviare un singolo array utilizzando lUUID che viene associato a ciascun RAID quando
questo viene creato. In tal caso si dovr`
a usare lopzione -u (o --uuid) per specificare il valore
dellUUID e con --scan verranno identificati ed utilizzati automaticamente solo i dispositivi ad
esso corrispondenti.
Una volta assemblato un array con --assemble questo in genere viene anche avviato e reso
disponibile, ma soltanto se si sono specificati negli argomenti tutti i componenti che ne fanno
parte o si `e usato --scan che li inserisce automaticamente. Nel caso di RAID che supportano la
ridondanza `e possibile anche far partire un array in modalit`a degradata, escludendo ad esempio,
fintanto che gli altri sono sufficienti a far funzionare larray, alcuni dei suoi componenti; in tal
caso per`o deve essere specificata lopzione --run, altrimenti larray sar`a assemblato, ma non
avviato.
Si tenga presente comunque che difficilmente, a parte il caso di problemi, capiter`a di eseguire
queste operazioni a mano; gli script di avvio usati da tutte le distribuzioni infatti si incaricano
usualmente di avviare automaticamente tutti gli array di una macchina. Qualora per`o per un
qualche motivo detto avvio fallisse,26 si potr`a far ripartire un array utilizzando mdadm in questa
modalit`a.
Nella gestione ordinaria, fintanto che non ci sono problemi, `e assai raro dover usare mdadm;
la situazione cambia quando un componente di un array fallisce, come nel caso di un disco che
si rompe, per cui ci si trover`
a in presenza di un array degradato e si dovranno prendere gli
opportuni provvedimenti. Il primo passo `e accorgersi di queste situazioni e per questo motivo
mdadm prevede una apposita modalit`
a Monitor,27 che normalmente viene attivata direttamente
allavvio dalla gran parte delle distribuzioni.
Se usato in questa modalit`
a mdadm resta attivo e continua a controllare lo stato degli array,
registrando eventuali cambiamenti di stato ed inviando gli allarmi via email allamministratore.
In genere il comando viene fatto eseguire in background come demone, usando lopzione -f (o -daemonise), direttamente dagli script di avvio, altrimenti resta attivo sulla console stampando
i suoi messaggi sullo standard output. In questa modalit`a si pu`o specificare la lista degli array
da tenere sotto controllo con i relativi file di dispositivo, ma al solito lopzione --scan consente
di mettere sotto controllo in un colpo solo tutti quelli definiti in mdadm.conf.
Il programma rileva una serie di cambiamenti di stato, e genera altrettanti eventi, che, usando
lopzione -y (o --syslog), vengono registrati sul sistema del syslog. Inoltre per alcuni di questi
eventi (quelli che indicano una situazione problematica, come il fallimento di un disco o il degrado
di un array) `e previsto linvio automatico di una email di avvertimento allindirizzo specificato
nella direttiva MAILADDR di mdadm.conf, che pu`o comunque essere soprasseduto con lopzione
-m (o --mail). Altre opzioni significative sono -d (o --delay), che consente di modificare
lintervallo di tempo in cui vengono effettuati i controlli e -l (o --oneshot) che consente di
eseguire un controllo singolo; al solito per i dettagli, e per il significato e le priorit`a dei vari
eventi, si consulti la pagina di manuale.
Una volta che si sia stati notificati di un problema sugli array, occorrer`a provvedere alla sua
soluzione; per far questo la modalit`
a da usare `e la Manage. Il caso classico `e quello della rottura
di un disco che dovr`
a essere sostituito nel pi`
u breve tempo possibile; il primo passo `e rimuovere il
disco rotto dallarray con lopzione -r (o --remove), dopo di che si potr`a spegnere la macchina28
e sostituire il disco; al riavvio il nuovo disco potr`a essere reinserito nellarray con -a (o --add).
25

ad esempio se si vogliono effettuare dei controlli sui singoli componenti e non avviare un array, o farlo partire
in modalit`
a degradata.
26
cosa che pu`
o accadere se ad esempio i dischi che ne fanno parte non sono stati ancora riconosciuti al momento
in cui se ne richiede lavvio.
27
la modalit`
a ha senso solo per i livelli che supportano la ridondanza, in cui laccesso ai dati continua a funzionare;
negli altri casi il fallimento diventa immediatamente evidente.
28
a meno di non avere dischi che supportano un cambiamento a caldo.

6.1. LUTILIZZO DEL RAID

365

Si tenga presente che si possono rimuovere da un array soltanto i dischi non in uso, vale a dire o
` anche possibile, con lopzione
dischi con errori che sono stati marcati come fail o dischi spare. E
-f (o --fail), forzare il fallimento di un disco funzionante, cosa che si pu`o usare ad esempio
qualora si voglia sostituire un disco anche se non `e fisicamente rotto.
In tutti questi casi mdadm richiede che si indichi sempre per primo il file di dispositivo relativo
allarray su cui si opera mentre i successivi devono fare riferimento ai dischi che ne fanno parte;
`e possibile infatti eseguire pi`
u operazioni su una sola riga di comando.29 Se allora nellesempio
di RAID 1 mostrato in precedenza fallisce il secondo disco IDE, si potr`a provvedere alla sua
sostituzione dopo averlo rimosso con il comando:
mdadm /dev/md0 --remove /dev/hdc1
ed una volta sostituito si potr`
a inserire il nuovo disco nellarray, (supponendo di non aver
cambiato canale IDE), con:
mdadm /dev/md0 --add /dev/hdc1
Delle ulteriori funzionalit`
a avanzate di gestione degli array sono state introdotte nello sviluppo del kernel 2.6 con la modalit`
a Grow che consente di modificare le dimensioni degli array.
Fino allora infatti tutto quello che si poteva fare era aggiungere dischi spare, operazione che
aumenta la ridondanza, ma non lo spazio disponibile. In modalit`a Grow diventa invece possibile
far crescere lo spazio disponibile; ovviamente il funzionamento dipende dal tipo di RAID che si
sta utilizzando.
Esistono due modi per aumentare le dimensioni di un array; nel caso di RAID nei livelli
4, 5 o 6 si pu`
o aggiungere un disco a quelli presenti, richiedendo che le informazioni vengano
distribuite anche su di esso, cos` da aumentare lo spazio disponibile, come sarebbe stato se si
fosse creato larray fin dallinizio inserendovi anche il disco aggiuntivo. La seconda modalit`
a
prevede invece la sostituzione dei dischi componenti un array con dischi di dimensioni maggiori,
e pu`o essere utilizzata anche con RAID di livello 1. Si tenga presente che in entrambi i casi quello
che cambier`
a al termine delle operazioni di crescita sar`a la dimensione del dispositivo RAID,
non del filesystem in esso contenuto, che andr`a opportunamente ridimensionato con i comandi
che vedremo in sez. 6.3.2.
Nel primo caso la procedura prevede che prima si effettui laggiunta del disco e poi si richieda
laccrescimento dellarray specificandone il nuovo numero di dischi; in sostanza per aggiungere
un nuovo disco ad un RAID 5 gi`
a composto da tre dischi, in modo da estenderne le dimensioni,
si dovr`a prima aggiungere il disco allarray con un comando analogo al seguente:30
mdadm --add /dev/md1 /dev/sdd1
e poi utilizzare mdadm in modalit`
a Grow per accrescere larray indicandogli il nuovo numero di
componenti, con qualcosa come:
mdadm --grow /dev/md1 --raid-devices=4
Si tenga presente che questo tipo di operazione richiede che i dati vengano redistribuiti fra i
vecchi ed il nuovo disco; questo procedimento `e molto oneroso e pu`o durare parecchie ore (fino
al limite delle intere giornate). Inoltre allinizio della procedura c`e un periodo critico in cui
le informazioni trasferite non possono essere salvate in maniera sicura sullarray stesso. Per
questo motivo, onde evitare che in caso di spegnimento accidentale larray si trovi in uno stato
29
30

anche se poco consigliabile vista la scarsa leggibilit`


a del comando che si ottiene in tal modo.
facendo ovviamente riferimento agli opportuni file di dispositivo relativi al proprio array.

366

CAPITOLO 6. AMMINISTRAZIONE AVANZATA DEL SISTEMA

inconsistente (e probabilmente irrecuperabile), `e sempre opportuno usare lopzione -backupfile per indicare un file su cui salvare dette informazioni, che ovviamente deve stare su un
dispositivo diverso dallarray stesso.
Qualora invece di voglia operare un accrescimento dellarray attraverso il rimpiazzo dei suoi
componenti con dischi di dimensione maggiore il primo passo `e effettuare la sostituzione successiva di ciascuno di essi; per far questo prima occorre marcare un disco come difettoso con un
comando analogo al seguente:31
mdadm /dev/md0 --fail /dev/hda1
e poi rimuoverlo dal RAID con:
mdadm /dev/md0 --remove /dev/hda1
a questo punto si potr`
a sostituire il disco come nel precedente caso di rottura, utilizzandone un
altro di dimensioni maggiori (che si sar`
a opportunamente partizionato), per poi riaggiungerlo al
RAID con:
mdadm /dev/md0 --add /dev/hda1
Si dovr`a poi ripetere loperazione per tutti i dischi che compongono larray, aspettando dopo
ogni sostituzione che larray si risincronizzi. Una volta fatto questo si avr`a un array identico a
quello di partenza, in cui per`
o viene usata solo una parte dello spazio disponibile sui dispositivi
componenti, il passo finale `e quello di usare mdadm in modalit`a Grow per eseguire laccrescimento
dellarray usando lopzione -z (o --size) per indicare la nuova dimensione con qualcosa del tipo:
mdadm --grow /dev/md0 --size=max
dove max `e una parola riservata che richiede che la dimensione dellintero array venga portata al
massimo dello spazio utilizzabile nei dischi che ne fan parte.
Si ricordi comunque che laccrescimento di un array non comporta il ridimensionamento del
filesystem da esso contenuto. Inoltre si tenga presente che le operazioni di accrescimento degli
array non aggiornano automaticamente il contenuto di mdadm.conf, che deve essere modificato
manualmente.32
In questo possono essere di ausilio alcune delle funzionalit`a fornite da mdadm in modalit`a Misc,
in particolare si pu`
o combinare lopzione -D (o --examine) che usualmente richiede lindicazione
del dispositivo di un array per stamparne caratteristiche e componenti, con lopzione --scan,
cos` da ottenere un risultato del tipo:
gethen:~# mdadm --examine --scan
ARRAY /dev/md0 level=raid1 num-devices=2 UUID=79448936:36120176:1eaacd19:dfef9fa6

che fornisce uno scheletro del contenuto di mdadm.conf a partire dal contenuto degli array stessi.
Lo stesso risultato si ottiene anche con lopzione -E (o --query) che invece, prendendo
sempre come argomento un file di dispositivo, permette di vedere se questo a seconda dei casi `e
un array o fa parte di un array. Se ad essa si aggiungono le ulteriori opzioni --detail e --scan
si riotterr`a il risultato precedente.
Altre opzioni significative della modalit`a Misc sono -S (o --stop) che disattiva un array, che
ovviamente non deve essere in uso, -o (o --readonly) che porta larray in sola lettura, e -w (o
31
32

al solito si usino i file di dispositivo relativi alla propria configurazione.


questo in realt`
a deve essere fatto soltanto nel primo dei due casi trattati, cambiando il numero dei componenti.

6.2. IL SISTEMA DEL LOGICAL VOLUME MANAGER

367

--readwrite) che lo porta in lettura e scrittura. Di nuovo per i dettagli si consulti la pagina di
manuale di mdadm.
Esistono infine una serie di opzioni generiche che si applicano a qualunque modalit`
a di
operazione; a parte --scan e --homehost che abbiamo gi`a visto, la principale di queste `e -c (o
--config) che consente di indicare un file di configurazione alternativo rispetto a mdadm.conf;
inoltre passando a -c il valore partitions si indica a mdadm di ignorare un eventuale contenuto
del file di configurazione.33 Altre due opzioni generiche sono -v che aumenta la prolissit`
a del
comando e -q che la riduce.

6.2

Il sistema del Logical Volume Manager

Tratteremo in questa sezione il sistema del Logical Volume Manager, uno speciale supporto nel
kernel che permette di organizzare in maniera flessibile lo spazio disco per superare le difficolt`a di modificare le dimensioni di una partizione qualora il filesystem in essa contenuto non
abbia pi`
u spazio sufficiente. Luso del Logical Volume Manager permette cio`e di evitare alla
radice tutta le problematiche, evidenziate in sez. 5.1.2, relative alle diverse possibili strategie di
partizionamento.

6.2.1

Introduzione

Uno dei problemi che la struttura di un filesystem unix-like presenta `e che quando si riempie
un dispositivo montato su una directory non se ne pu`o aumentare la dimensione direttamente
semplicemente aggiungendo un altro disco perche questo andrebbe montato altrove. Pertanto
in casi come questi si `e spesso costretti a complesse operazioni di backup per sostituire il disco
riempitosi o a creare link simbolici spostando su altri dischi il contenuto di alcune delle directory
un disco riempitosi.
Per superare alla radice questo problema `e stato creato il sistema del Logical Volume Manager, grazie al quale `e possibile creare un filesystem invece che su un disco singolo o su una
partizione, allinterno di un volume logico. Questultimo poi non `e altro che un dispositivo
virtuale creato a partire da un insieme di volumi fisici, che vengono opportunamente riuniti dal
kernel in modo da presentarsi come un unico disco.
Il vantaggio `e che i volumi logici possono essere ridimensionati a piacere senza necessit`
a
di toccare le partizioni o i dischi che stanno al di sotto, per cui usando i programmi per il
ridimensionamento dei filesystem si possono allargare o restringere questi ultimi in maniera
molto comoda (e con certi filesystem alcune operazioni possono essere eseguite a caldo, con
il filesystem montato). In questo modo se lo spazio disco su un volume logico si esaurisce
baster`a allargarlo, e se lo spazio disco sottostante non `e sufficiente baster`a comprare un nuovo
disco ed agganciarlo al volume logico, per espanderne le dimensioni senza doversi preoccupare
di ripartizionare, montare, fare link e spostare contenuti da un disco ad un altro.
Lo schema del funzionamento del Logical Volume Manager (da qui in breve LVM) `e riportato
in fig. 6.1, il sistema consiste nellintrodurre un livello intermedio, quello del gruppo di volumi
(indicato in figura con la notazione VG, da volume group), che viene a costituire linterfaccia fra
i volumi logici (indicati con LV da logical volume), che da esso si estraggono, ed i volumi fisici
(indicati con PV, da physical volume), che lo vanno a costituire. In sostanza il kernel si cura di
suddividere un disco fisico in tante piccole sezioni (dette physical extent, e indicate in figura con
PE) che poi vengono rimappate34 nei corrispondenti logical extent (indicati con LE) che vanno a
costituire un volume logico.
33

con un comportamento equivalente a quello di avere la sola riga DEVICE partitions in mdadm.conf.
da cui il nome di device mapper che il sistema ha assunto a partire dal kernel 2.6.x, dove `e stato riscritto da
zero per migliorare stabilit`
a e prestazioni.
34

368

CAPITOLO 6. AMMINISTRAZIONE AVANZATA DEL SISTEMA

Figura 6.1: Strutturazione del Logical Volume Manager.

Una delle funzionalit`


a pi`
u interessanti di LVM `e quella di poter utilizzare il sistema per
poter creare degli snapshot, cio`e poter creare una copia dello stato di un volume logico ad un
certo istante utilizzando lo spazio libero nel gruppo di volumi di cui questo fa parte. Tutto ci`o
viene realizzato allocando dello spazio libero per contenere tutte le modifiche eseguite al volume
originario. La versione corrente del filesystem sul volume logico originale registrer`a tutte le
modifiche nel nuovo spazio allocato, mentre il volume creato come snapshot conterr`a i dati cos`
come erano al momento della creazione.
Questo `e molto comodo per poter eseguire dei backup per volumi di grosse dimensioni senza
doversi preoccupare del fatto che durante lesecuzione del backup i dati vengano modificati;
basta assicurarsi che nel breve tempo necessario a creare lo snapshot non ci siano attivit`a, dopo
di che si potr`a eseguire il backup con tutta calma su di esso mentre le operazioni continuano
regolarmente sul volume originale. Una volta completato il backup si potr`a rimuovere il volume
logico usato per lo snapshot ed il volume logico originario manterr`a in maniera trasparente tutte
le modifiche eseguite nel frattempo; lunico aspetto critico `e quello di assicurarsi di avere allocato
per lo snapshot spazio sufficiente a contenere tutte le modifiche, se infatti questo dovesse esaurirsi
il volume logico originale diverrebbe inusabile.
Per poter utilizzare LVM occorre abilitare il relativo supporto nel kernel (vedi sez. 5.2.3), ed
avere installato gli opportuni programmi in user-space. Nel passaggio dal kernel 2.4.x al 2.6.x il
sistema `e stato completamente riscritto, pertanto si potranno avere delle differenze a seconda che
si usi la prima versione (detta anche LVM1) o la seconda (detta LVM2). In ogni caso la nuova
versione `e in grado di riconoscere la presenza di volumi logici creati con la versione precedente
e di riutilizzarli senza problemi, ed ha in genere prestazioni nettamente superiori.

6.2. IL SISTEMA DEL LOGICAL VOLUME MANAGER

6.2.2

369

La gestione dei volumi fisici

Il primo passo nelluso di LVM `e quello della inizializzazione dei volumi fisici; per questi pu`
o
35
essere usato un qualunque dispositivo a blocchi, ma il caso pi`
u comune `e quello delluso di una
partizione di un disco, che `e opportuno marcare (vedi sez. 5.1.2) con il codice 0x8E per indicare
che verr`a utilizzata come volume fisico per LVM. Una scelta altrettanto comune `e quella di usare
un dispositivo RAID software (nel qual caso non serve nessun altro accorgimento).
Ogni dispositivo che si intende usare come volume fisico deve essere inizializzato con il comando pvcreate cos` come si farebbe per un filesystem; il comando prende come argomento
il file di dispositivo che identifica il volume fisico sul quale creare linfrastruttura per mantenere le informazioni relative a LVM, e se ne possono specificare anche pi`
u di uno per una
inizializzazione multipla. A meno di non impostare una dimensione inferiore con lopzione
--setphysicalvolumesize il volume occuper`a lintero spazio disponibile su dispositivo.
Oltre che ad una partizione comando pvcreate pu`o essere applicato anche ad un intero
disco, nel qual caso per`
o occorre prima cancellare la tabella delle partizioni, perche se questa
viene rilevata il comando segnala un errore. Questo si pu`o fare facilmente con un comando di
cancellazione come:
dd if=/dev/zero of=/dev/hdX bs=512 count=1
Il comando prende come opzioni specifiche -u, che permette di specificare uno UUID a mano
invece di farlo generare automaticamente, e -f che forza la creazione del volume senza richiedere
conferma, distruggendo allinstante eventuali dati presenti. Le altre opzioni riguardano aspetti
specifici della gestione interna ed al solito rimandiamo alla pagina di manuale, ma in genere
non c`e bisogno di usare niente altro che il comando applicato al dispositivo, ad esempio con un
comando del tipo:
monk:/home/piccardi/Truelite/documentazione/corso# pvcreate /dev/sdb1
Physical volume "/dev/sdb1" successfully created

si inizializzer`
a la prima partizione del secondo disco SCSI come volume fisico per LVM.
Con il comando pvscan, si pu`
o eseguire una scansione dei dischi presenti per rilevare al loro
interno la presenza di volumi fisici usati da LVM, il comando si invoca senza argomenti, e si avr`
a
un risultato del tipo:
anarres:/home/piccardi/Truelite/documentazione/corso# pvscan
PV /dev/sda3
VG vg
lvm2 [132.23 GB / 85.73 GB free]
PV /dev/md0
VG vg
lvm2 [931.00 GB / 737.57 GB free]
Total: 2 [1.04 TB] / in use: 2 [1.04 TB] / in no VG: 0 [0

che mostra la presenza di due volumi fisici associati ad un gruppo di volumi e parzialmente
utilizzati.
Le opzioni del comando controllano sostanzialmente linformazione che viene stampata a
video, con -s si riduce la stessa al minimo, con -u si fanno stampare gli UUID presenti, con -n
si stampano solo i volumi fisici che non appartengono ad un volume logico, per le altre opzioni
si faccia riferimento alla pagina di manuale.
Un secondo comando diagnostico `e pvdisplay che stampa a video le caratteristiche di uno
pi`
u volumi fisici, specificati come argomenti. Se non si specifica nulla il comando stampa i dati
relativi a tutti i volumi fisici presenti, altrimenti se ne pu`o indicare uno (o pi`
u) passando come
argomenti i relativi file di dispositivo; nel nostro caso visto che abbiamo appena creato un volume
fisico su /dav/sdb1 potremo controllarne le caratteristiche con:
35

lelenco dei dispositivi accettati `e impostabile con la direttiva filter nel file di configurazione
/etc/lvm/lvm.conf.

370

CAPITOLO 6. AMMINISTRAZIONE AVANZATA DEL SISTEMA


monk:/home/piccardi/Truelite/documentazione/corso# pvdisplay /dev/sdb1
"/dev/sdb1" is a new physical volume of "1,91 GiB"
--- NEW Physical volume --PV Name
/dev/sdb1
VG Name
PV Size
1,91 GiB
Allocatable
NO
PE Size
0
Total PE
0
Free PE
0
Allocated PE
0
PV UUID
DqBTm8-F9Tk-Eczy-4Slb-RTwl-8Vs0-54j61P

mentre nel caso lo si usi su una macchina in cui `e presente un volume fisico in uso, avremo invece
qualcosa del tipo:
hain:/home/piccardi/Truelite/documentazione/corso# pvdisplay
--- Physical volume --PV Name
/dev/md2
VG Name
vg
PV Size
462,96 GB / not usable 2,31 MB
Allocatable
yes
PE Size (KByte)
4096
Total PE
118518
Free PE
10763
Allocated PE
107755
PV UUID
VO7DXX-4hMk-CDuE-PykW-y8bF-q7h0-pWCtHo

Anche per questo comando le opzioni servono a controllare linformazione riportata; le principali sono -s, che fa stampare solo la dimensione totale del volume e -c che produce un output
compatto in cui i vari dati relativi al volume sono separati da un carattere : cos` da poterlo
usare facilmente per fare scansioni sullo loro propriet`a allinterno di script. A queste si aggiunge
lopzione -m che consente di ottenere una mappa completa delle corrispondenze nelle allocazioni
fra physical extent e logical extent. Al solito per tutti i dettagli si pu`o fare riferimento alla pagina
di manuale.
Un comando alternativo a pvdisplay, disponibile a partire dalla versione 2 di LVM, `e pvs,
che consente un controllo molto pi`
u dettagliato della stampa in colonne dei dati. Se invocato
senza argomenti il comando stampa un riassunto in forma tabellare dei dati dei dischi, ad
esempio:
anarres:/home/piccardi/Truelite/documentazione/corso# pvs
PV
VG
Fmt Attr PSize
PFree
/dev/md0
vg
lvm2 a931.00G 737.57G
/dev/sda3 vg
lvm2 a132.23G 85.73G

Il comando al solito supporta lindicazione dei dispositivi da analizzare, da passare come


argomenti. Ma la vera potenza del comando `e la possibilit`a di adattare la stampa delle informazioni sulla base dei parametri passati allopzione -o, che consentono di ottenere i dettagli
sulle allocazioni dei physical extent ed i volumi logici cui questi sono associati; per i dettagli si
rimanda di nuovo alla pagina di manuale.
Qualora si cambino le dimensioni di una partizione o di un dispositivo (ad esempio un RAID)
che contiene un volume fisico, possibile modificare anche le dimensioni di questultimo con il
comando pvresize, che prende come argomenti una lista di dispositivi su cui si sono installati
dei volumi fisici. Il comando pu`
o operare su volumi fisici che sono gi`a parte di un gruppo di
volumi e che ospitano dati relativi a volumi logici; se dato senza opzioni i volumi fisici vengono
ridimensionati automaticamente alla dimensione corrente del dispositivo sottostante. Qualora
sia necessario ridurre la dimensione di un volume fisico (ad esempio se `e necessario restringere

6.2. IL SISTEMA DEL LOGICAL VOLUME MANAGER

371

una partizione) si deve invece usare la speciale opzione --setphysicalvolumesize che richiede
come parametro lindicazione della dimensione da dare al volume fisico.36
Infine un comando estremamente utile `e pvmove che permette di spostare tutti i dati mantenuti su un certo volume fisico su di un altro (cos` da poterlo rimuovere dal gruppo di volumi
di cui fa parte). Il comando prende come argomenti il volume fisico sorgente da cui rimuovere i
dati e quello di destinazione su cui inviarli; ovviamente la destinazione deve avere spazio libero
sufficiente a contenerli. Si pu`
o anche evitare di specificare un volume fisico di destinazione,
nel qual caso lo spazio sar`
a redistribuito automaticamente sui volumi appartenenti allo stesso
gruppo.
Il comando ha tre opzioni principali, la prima `e -i che fa stampare una percentuale di
completamento delle operazioni tutte le volte che `e trascorso il numero di secondi passato come
parametro; con -n invece si pu`
o restringere lo spostamento ai dati relativi al solo volume logico il
cui nome si `e passato come parametro. Infine con --abort si pu`o abortire un precedente tentativo
di spostamento non completato; se infatti il comando viene interrotto durante lesecuzione non
c`e nessun problema, e baster`
a reinvocarlo senza parametri per fare ripartire lo spostamento dal
punto un cui era stato interrotto, a meno appunto di invocare pvmove --abort.

6.2.3

La gestione dei gruppi di volumi

Una volta inizializzati tutti i volumi fisici necessari il secondo passo `e combinarli in un gruppo
di volumi, per questo si deve usare il comando vgcreate che crea un nuovo gruppo di volumi
assegnandogli il nome specificato come primo argomento, ed inserendoci tutti i volumi fisici
specificati negli argomenti successivi; perche il comando abbia successo tutti i volumi fisici
devono essere stati preventivamente inizializzati con pvcreate. Una volta creato un gruppo
di volumi con nome vgname si avr`
a a disposizione una corrispondente directory /dev/vgname/
in cui si troveranno tutti i file (in particolare i file relativi ai volumi logici, che tratteremo in
sez. 6.2.4).
Lopzione -s permette di definire le dimensioni dei physical extent in cui saranno divisi i
volumi fisici, da passare come argomento numerico seguito dalle estensioni standard per indicare
kilo, mega e gigabyte. La dimensione standard `e di 4Mb, ed i valori possono spaziare da 4kb
a 16Gb in potenze di due, si tenga presente che con la vecchia versione di LVM1 un volume
logico pu`
o mantenere un massimo di 64k physical extent che comporta una dimensione massima
di 256Gb, la nuova versione non ha un limite, ma un numero eccessivo di physical extent tende
a peggiorare notevolmente le prestazioni, pertanto se si ha a disposizione molto spazio disco
conviene usare delle dimensioni pi`
u ampie per i physical extent.
Lopzione -l permette di definire un numero massimo di volumi logici che possono essere
estratti dal gruppo;37 con -p invece si imposta il numero massimo di volumi fisici che possono
essere inclusi,38 con -u si pu`
o impostare manualmente un UUID. Per le ulteriori opzioni si
pu`o fare riferimento alla pagina di manuale, un elenco di opzioni comuni a buona parte dei
comandi che operano con i gruppi ed i volumi logici si trova in tab. 6.3, lelenco completo invece
`e riportato nella pagina di manuale dedicata a LVM, accessibile con man lvm, ma normalmente
sar`a sufficiente un comando come:
monk:/home/piccardi/Truelite/documentazione/corso# vgcreate vg /dev/hda3
Volume group "vg" successfully created

che crea il nuovo gruppo di volumi vg con il volume fisico /dev/hda3 precedentemente inizializzato.
36

ovviamente qualora si debba ridurre la dimensione di una partizione `e necessario eseguire prima questa
operazione.
37
il valore massimo assoluto era di 255 con LVM1, con LVM2 questa restrizione non sussiste pi`
u ed il default `e
0 che indica che non c`e nessun limite.
38
ed anche in questo caso si aveva massimo di 255 per LVM1 e nessun limite per LVM2.

372

CAPITOLO 6. AMMINISTRAZIONE AVANZATA DEL SISTEMA


Opzione
-v
-d
-t
-h
-M

-A

Significato
imposta il livello di prolissit`
a, pu`
o essere ripetuto fino a
tre volte per aumentare le informazioni stampate a video.
importa il livello di debug, pu`
o essere ripetuto fino a sei
volte per aumentare le informazioni stampate a video.
esegue il comando in modalit`
a di test, i dati non vengono
modificati.
stampa un messaggio di aiuto.
imposta il formato dei meta-dati, prende come valore
lvm1 o lvm2 (o semplicemente il numero), questa opzione
`e disponibile solo su LVM2.
esegue automaticamente il backup dei meta-dati quando essi vengono cambiati, prende come valore y o n, (il
default `e il primo e non `e il caso di cambiarlo).

Tabella 6.3: Principali opzioni comuni dei comandi di gestione di LVM.

Una volta creato un gruppo di volumi questo pu`o essere espanso aggiungendovi altri volumi
fisici con vgextend, che di nuovo prende come primo argomento il nome del gruppo, che stavolta
deve esistere, seguito dai volumi fisici che si vogliono aggiungere, al solito specificati tramite
il relativo file di dispositivo. Per i dettagli sulle opzioni (alcune delle quali sono riportate in
tab. 6.3) si pu`o fare riferimento alla pagina di manuale.
Il lavoro opposto, quello di rimuovere un volume da un gruppo, viene invece eseguito da
vgreduce che al solito prende come primo argomento il nome del gruppo, seguito dai volumi
che si vogliono rimuovere. Ovviamente perche il comando abbia successo tutti i volumi che si
vogliono rimuovere dal gruppo non devono essere utilizzati; con lopzione -a non `e necessario
specificare quali volumi rimuovere, dato che in tal caso si rimuoveranno tutti quelli non utilizzati.
Al solito per i dettagli sul comando e le altre opzioni supportate si faccia riferimento alla pagina
di manuale.
La creazione di un gruppo di volumi `e comunque solo un primo passo, prima di poterlo
utilizzare infatti questo deve essere attivato in modo da poter essere utilizzato. Per questo si
usa in genere il comando vgchange il cui scopo `e quello di modificare le propriet`a di un gruppo
di volumi. Il comando al solito prende come argomento il nome del gruppo di volumi, ma se non
se ne specifica uno si applica a tutti quelli presenti.
Lopzione principale `e -a che `e quella che permette di attivare o disattivare il gruppo, rispettivamente con i parametri y e n; in genere gli script di avvio di LVM eseguono sempre
un comando del tipo vgchange -a y. Le altre opzioni sono utilizzate principalmente per cambiare le caratteristiche del gruppo di volumi rispetto ai valori impostati in fase di creazione: -l
modifica il numero massimo di volumi logici, passato come parametro (deve essere eseguita su
un gruppo inattivo), -x attiva o disattiva (sempre con i parametri y e n) la possibilit`a di
estendere o ridurre il gruppo togliendo o aggiungendo volumi fisici, -u consente di modificare
lUUID ad associato al gruppo di volumi.
Un secondo comando usato allavvio del sistema (ma solo per LVM1, in LVM2 la cosa `e
automatica) `e vgscan che esegue una scansione dei dischi presenti per rilevare la presenza di
gruppi di volumi (analogo a quanto fa pvscan per i volumi fisici), in genere lo si lancia prima
di vgchange, e lunica opzione significativa (per le altre si consulti la pagina di manuale) `e -mknodes che crea in /dev i file speciali necessari alluso di dei dispositivi. Un esempio di questo
comando `e:
monk:~# vgscan
Reading all physical volumes. This may take a while...
Found volume group "vg" using metadata type lvm2

Esiste poi un comando analogo di pvdisplay da usare per i gruppi di volumi; con vgdisplay
si possono elencare le caratteristiche del gruppo passato come argomento, o di tutti quelli presenti

6.2. IL SISTEMA DEL LOGICAL VOLUME MANAGER

373

nel sistema se non si specifica nulla. Le opzioni sono le stesse gi`a viste in sez. 6.2.2 per pvdisplay;
un esempio di questo comando `e:
monk:~# vgdisplay
--- Volume group --VG Name
System ID
Format
Metadata Areas
Metadata Sequence No
VG Access
VG Status
MAX LV
Cur LV
Open LV
Max PV
Cur PV
Act PV
VG Size
PE Size
Total PE
Alloc PE / Size
Free PE / Size
VG UUID

vg
lvm2
1
1
read/write
resizable
0
0
0
0
1
1
185,38 GB
4,00 MB
47457
0 / 0
47457 / 185,38 GB
njlk5d-xvsQ-pXcI-sEnK-zqII-YzzN-pNoI0Y

Quando si vogliono riunire in uno solo due gruppi di volumi si pu`o utilizzare il comando
vgmerge, questo prende come primo argomento il gruppo di destinazione, che diventer`a lunione
dei due, e come secondo il gruppo da inglobare nel primo, che deve essere disattivo. Il comando
funziona soltanto se i due volumi sono stati creati con parametri compatibili (stessa versione dei
meta-dati e stessa dimensione dei physical extent) e se lunione dei due rispetta i limiti presenti
sul gruppo di destinazione. Per le opzioni (che sono sostanzialmente quelle comuni di tab. 6.3)
e per gli altri dettagli si faccia riferimento alla pagina di manuale.
Se invece si vuole spezzare in due un gruppo di volumi si pu`o usare il comando vgsplit,
questo prende come primo argomento il nome del gruppo da cui si parte e come secondo quello del
nuovo gruppo che si vuole creare, seguito dalla lista dei volumi fisici da inserire in questultimo.
Dato che i volumi logici non possono essere suddivisi fra gruppi diversi occorrer`a che ciascun
volume logico esistente sia compreso interamente nei volumi fisici che restano in uno dei due
gruppi. Al solito per le opzioni (sono solo quelle comuni) ed i dettagli si pu`o fare riferimento
alla pagina di manuale.

6.2.4

La gestione dei volumi logici

Una volta creato un gruppo di volumi sar`a possibile estrarre da esso lo spazio necessario a
creare un volume logico. Il comando principale per eseguire questo compito `e lvcreate che crea
il volume logico allocando i logical extent necessari dalla riserva di physical extent disponibili.
Il comando richiede come argomento obbligatorio il nome del gruppo di volumi da utilizzare,
inoltre deve essere sempre specificata la dimensione del volume fisico che si va a creare; questo pu`
o
essere fatto in due modi, o con lopzione -l, seguita dal numero di logical extent da utilizzare,39
o con lopzione -L seguita dalla dimensione in byte; lopzione supporta anche la specificazione
di altre unit`
a di misura come kilobyte, megabyte, gigabyte o terabyte se si aggiunge al numero
passato come parametro liniziale (va bene sia maiuscola che minuscola) della misura utilizzata.
Se non si specifica altro il comando crea un volume logico con un nome assegnato automaticamente al valore lvolN dove N `e il numero progressivo usato internamente dal sistema; si pu`
o
per`o specificare un nome qualunque con lopzione -n lvname; in questo caso si potr`a accedere al
39

le dimensioni sono le stesse dei physical extent sottostanti, definite in fase di creazione del gruppo.

374

CAPITOLO 6. AMMINISTRAZIONE AVANZATA DEL SISTEMA

nuovo volume logico usando come file di dispositivo /dev/vgname/lvname. Nei kernel della serie
2.6, dato che LVM `e stato riscritto appoggiandosi direttamente al sistema del device mapper, si
potranno trovare i volumi logici anche direttamente sotto la directory /dev/mapper, accessibili
direttamente con un nome del tipo vgname-lvname. Un esempio delluso pi`
u comune di questo
comando `e il seguente:
monk:~# lvcreate -L 50G -n data vg
Logical volume "data" created

Una delle funzionalit`


a di LVM `e che permette di suddividere i dati su pi`
u volumi fisici in
maniera analoga al RAID-0, definendo con lopzione -i un numero di stripes su cui distribuire
i dati. Valgono in questo caso le stesse considerazioni viste in sez. 6.1.1 per il RAID-0.40 Se si
utilizza questa funzionalit`
a si pu`
o anche specificare la dimensione delle stripes con lopzione -I.
Se invece di un normale volume logico si vuole creare uno snapshot occorre usare modalit`a
completamente diversa di invocazione del comando. In tal caso occorre usare lopzione -s e
specificare un nome con lopzione -n; inoltre gli argomenti obbligatori diventano due: il nome
del volume logico da usare come snapshot e quello del volume logico cui fare da snapshot. Un
elenco delle opzioni principali del comando lvcreate `e riportato in tab. 6.4, il comando utilizza
anche molte delle opzioni generali accennate in tab. 6.3; per i dettagli al solito si pu`o fare
riferimento alla pagina di manuale.
Opzione
-i

-I

-l
-L
-n
-p

-s

Significato
indica di utilizzare il numero di stripe passato come parametro per distribuire i dati sui volumi fisici
sottostanti.
imposta la dimensione di una stripe nella distribuzione
dei dati su pi`
u volumi fisici (da specificare con un numero
n da 2 a 9 per indicare 2n kilobyte).
imposta la dimensione di un volume fisico per numero
(passato come parametro) di logical extent.
imposta la dimensione di un volume fisico specificata in
byte, kilobyte, megabyte, gigabyte o terabyte.
imposta il nome del volume logico, passato come
parametro.
importa i permessi sul volume logico, prende il valore
r per indicare sola lettura o rw per indicare lettura e
scrittura.
indica la richiesta di creazione di un volume di snapshot.

Tabella 6.4: Principali opzioni del comando lvcreate.

Come per i volumi fisici ed i gruppi di volumi sono presenti due comandi, lvscan e lvdisplay,
che possono essere usati rispettivamente per eseguire una scansione dei volumi logici presenti e
per ottenere un sommario delle relative propriet`a. Anche le opzioni sono analoghe e non staremo
a ripeterle.
La comodit`
a di LVM consiste nel fatto che una volta che si `e creato un volume logico si potr`a
accedere a questultimo con il relativo file di dispositivo e trattarlo come un qualunque disco;
il vantaggio `e che qualora si avesse la necessit`a di ampliarne le dimensioni si potr`a ricorrere al
comando lvextend, dopo di che non rester`a che ridimensionare il filesystem presente sul volume
logico (vedi sez. 6.3.2) per avere a disposizione lo spazio aggiunto.
Il comando richiede obbligatoriamente come argomento il volume da estendere e la dimensione finale dello stesso che deve essere specificata o con lopzione -l in numero di logical extent o
direttamente con lopzione -L (con la stessa convenzione di lvcreate). Si possono per`o usare le
40

in particolare si avr`
a un enorme degrado di prestazioni qualora si usassero partizioni diverse dello stesso disco
come volumi fisici su cui distribuire le stripes.

6.3. GESTIONE AVANZATA DI DISCHI E FILESYSTEM

375

stesse opzioni per specificare la dimensione dellestensione al posto di quella totale, apponendo
al valore specificato il carattere +.
Il comando supporta anche luso delle stripe (con le stesse opzioni di tab. 6.4) ed inoltre
si pu`o specificare come argomenti ulteriori una lista di volumi fisici sui quali si vuole che sia
compiuta lestensione del volume logico. Il comando permette anche di estendere le dimensioni
dei volumi di snapshot.
Se invece di aumentare le dimensioni di un volume logico le si vogliono ridurre si deve usare
lvreduce. Il comando prende gli stessi argomenti ed opzioni di lvextend (esclusi quelli relativi
alle stripe), solo che in questo caso la dimensione pu`o specificata apponendovi un segno - per
richiedere una riduzione. Si tenga presente che i dati presenti nella parte tolta con la riduzione
vengono persi, pertanto `e fondamentale ridurre le dimensioni di un eventuale filesystem presente
sul volume logico prima di eseguirne una riduzione.
Per completare i comandi di ridimensionamento si deve citare il generico lvresize che
unisce le funzionalit`
a dei precedenti lvreduce e lvextend permettendo ridimensionamenti in
qualunque direzione (sia crescenti che decrescenti). Di nuovo le opzioni sono le stesse, e stavolta
sono permessi per le dimensioni sia il segno + che quello -.
Qualora un volume logico non sia pi`
u utilizzato lo si pu`o eliminare usando lvremove, il
comando prende come argomento uno o pi`
u volumi da rimuovere, lunica opzione specifica supportata `e -f che permette di sopprimere la richiesta di conferma della rimozione dallo standard
input.

6.3

Gestione avanzata di dischi e filesystem

Si sono raccolti in questa sezione una serie di argomenti avanzati riguardo la gestione dei dischi
e dei filesystem, come limpostazione dei parametri di basso livello dei dischi, luso di partizioni
cifrate, il ridimensionamento di filesystem e partizioni.

6.3.1

La gestione dei parametri dei dischi

Finora abbiamo sempre trattato la gestione dei dischi facendo riferimento alle operazioni da
eseguire sui dati in essi contenuti allinterno di filesystem e partizioni; non abbiamo trattato
affatto le operazioni di basso livello con cui il sistema pu`o andare a modificare le caratteristiche e
le modalit`
a con si accede ai dischi, effettuate direttamente attraverso linterfaccia con lhardware
degli stessi.
Tradizionalmente il programma per eseguire operazioni di basso livello sui dischi `e hdparm,
nato per impostare le propriet`
a dellaccesso ai dischi e le loro modalit`a di funzionamento attraverso linterfaccia IDE/ATA, che a lungo `e stata linterfaccia predominante per luso dei dischi
su Linux, quando i dischi SCSI, per costo e complessit`a, erano usati soltanto da una piccola
percentuale di utenti. Il comando comunque `e in grado di funzionare con le nuove interfacce
serial ATA supportate tramite il sistema di libata del kernel e sui dischi USB che supportano la
traduzione dei comandi ATA su SCSI (il cosiddetto SAT, SCSI-ATA Command Translation).
Il comando prende come argomento il file di dispositivo del disco (o altro dispositivo IDE) su
cui si vuole operare, e se non si specifica altro stampa i valori di una serie di parametri relativi
al dispositivo stesso,41 pi`
u o meno completa a seconda della presenza o meno degli stessi o della
capacit`a di accedere alla relativa informazione. Il comando prevede una lunga serie di opzioni
di varia natura che consentono di effettuare impostazioni sulle funzionalit`a dei dischi o del bus
o di ottenere informazioni dettagliate sugli stessi.
Un sottoinsieme di queste opzioni possono essere utilizzate sia per ottenere che per modificare
le impostazioni correnti, a seconda che si specifichi soltanto lopzione, nel qual caso il valore
41

lesecuzione senza opzioni `e equivalente allesecuzione con le opzioni -acdgkmur.

376

CAPITOLO 6. AMMINISTRAZIONE AVANZATA DEL SISTEMA

corrente sar`a letto e stampato, o ad essa si faccia seguire un valore numerico, il cui valore
dipendente dalla singola funzionalit`
a, che verr`a usato come nuova impostazione.
Parametro
look-ahead

Opzione
-A

readahead
busstate

-a
-b

APM level

-B

IO support

-c

using dma

-d

keepsettings

-k

multcount

-m

acoustic

-M

max sectors

-N

readonly

-r

unmaskirq

-u

write-caching

-W

Significato
legge e imposta la modalit`
a di read-ahead hardware, normalmente
abilitata in modo automatico, (1 abilitata, 0 disabilitata).
legge e imposta il numero di settori in read-ahead.
legge e imposta lo stato del bus; il valore 1 indica un bus attivo, 0 un
bus disattivo.
legge e imposta le modalit`
a di risparmio energetico con un valore da 1
a 255; un valore pi`
u basso implica maggiore risparmio energetico, fino
a 127 il disco pu`
o essere anche spento, con 255 si disabilita il risparmio
energetico.
legge e imposta la modalit`
a di I/O a 32 bit; il valore 0 la disattiva, il
valore 1 la attiva in modalit`
a standard, il valore 3 la attiva con una
funzione di sincronizzazione richiesta da alcuni chipset.
legge e imposta luso del DMA per le operazioni di I/O su disco; il
valore 0 la disattiva, il valore 1 la attiva.
legge ed imposta il flag di mantenimento delle impostazioni del disco
effettuate con le opzioni -d, -m, -u, un valore 0 le scarta in caso di reset
o spegnimento, un valore 1 le mantiene.
legge ed imposta il numero di settori trasferiti nella singola operazione
di I/O; il valore 0 disabilita il trasferimento multiplo, prende valori
potenze di due fino ad un massimo che dipende dal supporto del disco.
legge ed imposta il livello di rumorosit`
a, secondo le funzionalit`
a AAM
(Automatic Acoustic Management) presenti nei dischi recenti, prende
un valore intero da 0 a 254, con un valore pi`
u basso che richiede una
minore rumorosit`
a, ottenuta diminuendo la velocit`
a di rotazione dei
dischi a scapito delle prestazioni.42
legge ed imposta il numero massimo di settori visibili, una funzionalit`
a,
chiamata Host Protected Area, che consente di mascherare una parte
del disco al sistema operativo, di solito usata dai costruttori per mantenervi software diagnostico o di ripristino; i cambiamenti, a meno di non
anteporre la lettera p al valore specificato, sono temporanei e vengono
persi con un riavvio o un reset del disco.
legge ed imposta il flag di sola lettura per il disco, il valore 0 disattiva
la sola lettura, il valore 1 la attiva.
legge ed imposta il flag di blocco degli interrupt durante le operazioni
di I/O; il valore 0 mantiene il blocco, il valore 1 lo disattiva.
legge ed imposta luso della cache di scrittura dei dischi; il valore 0 la
disattiva, il valore 1 la attiva.

Tabella 6.5: Principali parametri accessibili con hdparm in lettura e scrittura e relative opzioni.

Ad esempio con lopzione -a `e possibile modificare il numero di settori in read ahead, cio`e letti
in anticipo dal filesystem rispetto a quelli indicati da una operazione di lettura; in questo modo
`e possibile migliorare le prestazioni per la lettura di file di grandi dimensioni, eseguendo una
lettura preventiva del contenuto successivo. Si tenga comunque presente che molti dischi hanno
una funzione simile implementata a livello hardware, questa `e realizzata a livello di sistema
operativo e va eventualmente ad aggiungersi alla precedente.
Una seconda opzione importante `e -d che consente di attivare o disattivare laccesso in DMA
al disco, che permette di aumentare notevolmente le prestazioni; un valore 1 abilita il DMA, ed un
valore 0 lo disabilita. In genere questa funzionalit`a viene attivata automaticamente dal modulo
del kernel che gestisce il bus ATA, insieme alla modalit`a di trasferimento dati controllabile con
42
la gran parte dei dischi supporta solo un numero di stati ridotto, spesso soltanto due fast (massime prestazioni) e quiet (bassa rumorosit`
a) oltre eventualmente uno stato di spegnimento; per questi sono stati riservati
rispettivamente i valori 254, 128 e 0; ma essendo prevista la possibilit`
a di estensioni lopzione permette luso di
un valore intero generico.

6.3. GESTIONE AVANZATA DI DISCHI E FILESYSTEM

377

lopzione -X. Pu`


o capitare comunque che per alcuni dischi ed alcuni chipset questa funzionalit`
a
possa causare problemi o non sia impostata correttamente al valore migliore, nel qual caso si
pu`o disabilitare laccesso in DMA con questa opzione, ed impostare esplicitamente una modalit`
a
di trasferimento dati con -X.
Unaltra opzione importante per le prestazioni `e -m che imposta il numero di settori ottenibili
in un singolo trasferimento di dati in DMA, una funzionalit`a presente in molti dischi moderni,
che consente di ottenere una maggiore velocit`a di trasferimento dati, con un numero inferiore di
interrupt di I/O. A seconda dei casi si possono ottenere miglioramenti fra il 5 ed il 50%, anche se
con alcuni dischi si sono riscontrati peggioramenti. I valori che si possono specificare per questa
opzione dipendono dal tipo di disco, ed in genere variano in potenza di 2 da 2 ad un massimo
che pu`o essere ottenuto dalle caratteristiche del disco usando lopzione -i.43 In genere valori di
16 o 32, se supportati, sono ottimali.
Unaltra opzione significativa rispetto alle prestazione `e -u, con cui si pu`o eliminare il mascheramento degli interrupt durante lI/O su disco; il default (con il valore 0) prevede infatti
il blocco di altri interrupt, cosa che pu`o causare delle latenze nella risposta del sistema; eliminandolo (col valore 1) si migliora la reattivit`a del sistema al costo di una minore velocit`
a di
trasferimento. Questa opzione `e per`o potenzialmente pericolosa dato che alcuni chipset possono non tollerare laumento delle latenze nellI/O su disco, dando luogo a perdita di dati con
conseguente corruzione del filesystem.
Si tenga presente per`
o che i cambiamenti effettuati con hdparm non sono permanenti, ed
eventuali impostazioni vengono perse oltre che con lo spegnimento anche in caso di reset del
disco; questo come salvaguardia in caso di impostazioni sbagliate; `e possibile per`o richiedere ai
dischi, usando lopzione -k, di preservare le impostazioni effettuate con le opzioni -d, -m, -u cos`
da non doverle rieffettuare; ovviamente si deve evitare di attivare questa funzionalit`a fintanto
che non si `e certi della validit`
a delle impostazioni correnti.44
Un elenco degli altri principali parametri modificabili con specifiche opzioni di hdparm nelle modalit`
a appena descritte, con una breve spiegazione del relativo significato `e illustrato in
tab. 6.5; in prima colonna si `e riportato il nome utilizzato dal comando nella stampa dei valori
del parametro ed in seconda colonna la opzione corrispondente.
Opzione
-g
-i
-I
-t
-T
-X

-z

Significato
mostra la geometria del disco, se applicato ad una
partizione il numero di settori ed il settore di inizio.
stampa le informazioni sul dispositivo come viste dal
kernel.
stampa le informazioni sul dispositivo interrogando
direttamente lo stesso sul bus.
esegue una stima delle prestazioni di lettura del disco.
esegue una stima delle prestazioni di trasferimento dati
con il bus.
imposta la modalit`
a di trasferimento dati per i dischi,
utilizzando come argomento uno dei valori ottenuti con
luso di -i.45
forza il kernel ad eseguire una rilettura della tabella delle
partizioni.

Tabella 6.6: Principali opzioni generiche del comando hdparm.


43

viene riportato nelloutput del comando alla voce MaxMultSect.


`e inoltre possibile, su distribuzioni come Debian, utilizzare il file di configurazione hdparm.conf per mantenere
le impostazioni che dovranno essere eseguite al riavvio della macchina, per il formato si consulti la relativa pagina
di manuale.
45
in particolare nelle righe PIO mode, DMA mode e UDMA mode, si tenga presente comunque che tutti i
dischi moderni riconoscono ed utilizzano automaticamente la migliore modalit`
a di trasferimento disponibile, e che
modificare queste impostazioni pu`
o essere molto pericoloso portare ad una massiccia corruzione dei dati.
44

378

CAPITOLO 6. AMMINISTRAZIONE AVANZATA DEL SISTEMA

Oltre alle modifiche dei parametri appena illustrate, hdparm supporta una serie di ulteriori
comandi diagnostici e di controllo. In particolare con lopzione -i si possono ottenere una
serie di informazioni relative al dispositivo, comprensive di nome del modello, numero di serie,
geometria, modalit`
a del trasferimento data, ecc. cos` come viste dal kernel; se invece si usa
lopzione -I le informazioni vengono richieste direttamente al dispositivo stesso tramite il bus,
e stampate.46
Altre opzioni interessanti sono -t e -T che permettono di eseguire delle stime sulle prestazioni
dei dischi; si tenga presente che per una minima attendibilit`a occorre eseguire pi`
u volte questi
test su un sistema inattivo. Con -t si ha una stima della massima velocit`a di lettura dal disco,
mentre con -T si stima la massima velocit`a di trasferimento fra processore, memoria e bus della
macchina.
Si sono riassunte le pi`
u comuni fra queste altre opzioni generiche in tab. 6.6, oltre a queste
hdparm prevede molte altre opzioni che consentono di intervenire a basso livello sulle diverse
funzionalit`a dellinterfaccia IDE/ATA; in quasi tutti i casi per`o limpostazione di valori sbagliati
pu`o condurre a conseguenze disastrose con il rischio di una corruzione massiccia del filesystem
ospitato sul disco, pertanto si lascia la trattazione di tutte le opzioni specialistiche alla pagina
di manuale.
Benche alcune funzionalit`
a siano accessibili anche attraverso hdparm,47 il protocollo SCSI
prevede dei meccanismi generici per inviare comandi di controllo ai dispositivi, che questi siano
dischi, CD, nastri; per questo motivo `e disponibile un apposito comando sdparm che, se usato
con i dischi,48 consente laccesso ai parametri e linvio di comandi di basso livello in maniera
analoga hdparm, usando direttamente il protocollo SCSI.
La comprensione del funzionamento di sdparm richiede per`o un minimo di conoscenza dei
meccanismi previsti dal protocollo SCSI per mantenere le informazioni e modificarle, il che
rende luso del comando piuttosto complesso. Le informazioni relative ad un dispositivo sono
infatti disponibili in due modalit`
a diverse; il primo `e quello delle cosiddette pagine VPD (Vital
Product Data), che contengono soltanto informazioni descrittive non modificabili. Il secondo
meccanismo `e quello delle cosiddette mode pages che contengono informazioni e parametri che
si possono modificare per effettuare le impostazioni volute.
In entrambi i casi la quantit`
a di informazione `e estremamente ampia e non `e possibile documentare in questa sede i dettagli disponibili per linfinita serie di parametri accessibili al comando.49 Per questo motivo lo stesso sdparm supporta una opzione generica -e (o --enumerate)
che consente di elencare tutte le pagine presenti nelle sue tabelle interne, associandole a degli opportuni identificativi alfanumerici, che poi potranno essere usati per farvi riferimento; in questo
caso il comando ignora un eventuale file di dispositivo passato come argomento.
Se invocato solo con -e il comando stampa soltanto la lista delle cosiddette mode pages generiche, cio`e quelle attinenti funzionalit`
a generali indipendenti dal tipo di hardware utilizzato.
Oltre a queste infatti esistono sia delle mode pages specifiche attinenti il singolo dispositivo SCSI,
create dal produttore, che delle mode pages associate alle varie tecnologie di interconnessione
dei dispositivi.50 Un esempio del risultato di questo comando `e il seguente:
anarres:~# sdparm --enumerate
Mode pages:
bc
0x1c,0x01 Background control (SBC)
ca
0x08
Caching (SBC)
46

questa opzione, nella forma --Istdin, consente di stampare le stesse informazioni leggendole dallo standard
input, nel formato prodotto dal comando stesso con lopzione --Istdout, o da sdparm con lopzione -HHH.
47
in maniera abbastanza completa per i dischi SATA, ma molto limitata nel caso di dischi SCSI o chiavette
USB che non supportano le modalit`
a di compatibilit`
a.
48
da questo deriva il nome, che usa il suffisso dei dischi SCSI invece di quello dei dischi IDE.
49
che sono oltre 500, distribuiti fra le pagine VPD e mode pages.
50
come lo SCSI classico, il Fiber Channel, il Serial Attached SCSI, il Serial ATA, ecc.

6.3. GESTIONE AVANZATA DI DISCHI E FILESYSTEM


cms
co
coe
...

0x2a
0x0a
0x0a,0x01

379

CD/DVD (MM) capabilities and mechanical status (MMC)


Control
Control extension

in cui, sotto una riga di intestazione che descrive a quale gruppo di pagine si fa riferimento,
viene stampato lelenco delle pagine presenti su tre colonne che riportano rispettivamente un
identificativo alfanumerico (in genere lacronimo del nome esteso), il codice numerico ed un nome
esteso della pagina, usualmente quello con cui questa viene descritta nei standard di riferimento.
Per ottenere invece la lista delle pagine VPD occorre aggiungere a -e lopzione -i (o -inquiry). Se invece a -e si aggiunge lopzione -l (o --long) si otterr`a la lista completa di
tutte le mode pages presenti, ed anche la lista dei produttori e dei meccanismi di trasporto
riconosciuti dal comando a loro volta associati a degli identificativi alfanumerici. Si possono poi
usare in combinazione con -e le opzioni -M (o --vendor) e -t (o --transport) per restringere
la selezione rispettivamente alle mode pages relative ad un produttore o a una tecnologia di
trasporto, indicati con i relativi identificativi alfanumerici.51 Infine luso dellopzione -a (o -all) fa stampare invece degli identificativi delle pagine quelli associati ai singoli parametri in
essa contenuti.
Una volta che si siano identificate le pagine che interessano, si potranno ottenere le informazioni ed i valori dei parametri in esse contenuti utilizzando lopzione -p (o --page); questa
prende come argomento o lidentificativo alfanumerico o il codice numerico ottenuti con -e e
stampa tutti i parametri ed i relativi valori presenti nella pagina stessa. Si `e riportato in tab. 6.7
un elenco delle pagine pi`
u rilevanti; si tenga presente infine che quando si richiedono i dati di
una pagina `e necessario passare al comando il dispositivo di cui si vogliono ottenere i parametri
come argomento.
Pagina
di

sv
rw
ca
co
po

Significato
Device identification, la pagina VPD che contiene le informazioni con i dati identificativi del dispositivo, stampata
di default con lopzione -i.
Supported VPD pages, la pagina che contiene la lista delle
pagine VPD supportate.
Read write error recovery, la mode page che contiene i
parametri relativi alla gestione degli errori di accesso.
Caching, la mode page che contiene i parametri relativi
alla gestione della cache dei dati.
Control, la mode page che contiene i parametri di
controllo del dispositivo.
Power condition, la mode page che contiene i parametri
di controllo del risparmio energetico.

Tabella 6.7: Le mode pages e le pagine VPD pi`


u rilevanti.

Data la complessit`
a con cui le informazioni sono distribuite nelle varie pagine sdparm, se
usato senza nessuna opzione e passando soltanto largomento del file di dispositivo, stampa una
selezione dei parametri pi`
u significativi relativi alle mode pages pi`
u rilevanti; ad esempio per un
disco Serial ATA si otterr`
a qualcosa del tipo:
anarres:~# sdparm /dev/sda
/dev/sda: ATA
ST3250310AS
Read write error recovery mode page:
AWRE
1
ARRE
0
PER
0
Caching (SBC) mode page:
51

quelli che si ottengono con sdparm -e -l.

3.AA

380

CAPITOLO 6. AMMINISTRAZIONE AVANZATA DEL SISTEMA


WCE
1
RCD
0
Control mode page:
SWP
0

in cui nella prima riga vengono riportati i dati di base del dispositivo, ed a seguire i nomi
estesi delle mode pages ed al di sotto su due colonne gli identificativi alfanumerici ed i valori dei
parametri.
In genere nella lettura si fa uso anche dellopzione -l che consente di ottenere una terza
colonna con i nomi estesi dei parametri (di cui generalmente gli identificativi costituiscono un
acronimo), se poi si vogliono ottenere tutte le mode pages e tutti i parametri disponibili per il
dispositivo, si pu`
o usare lopzione -a (o --all). Per accedere alle informazioni mantenute nelle
pagine VPD si deve invece usare lopzione -i; che da sola stampa dati di identificazione del
dispositivo,52 mentre unita a -a stampa lelenco delle pagine VPD disponibili.53
In genere si usano le informazioni delle pagine VPD per ottenere i dati relativi ai vari dispositivi: in sostanza lopzione -i di sdparm `e lequivalente delle opzioni -i e -I di hdparm. Non
esistono invece delle opzioni specifiche relative alle impostazioni dei dispositivi in quanto, come
accennato, queste vengono effettuate modificando gli opportuni parametri nelle mode pages; a
questi, oltre ad un valore corrente, `e associato un un flag che indica la possibilit`a o meno di
modificarlo,54 un valore di default stabilito dal produttore ed un valore salvato, che `e quello che
verr`a usato al successivo reset del dispositivo stesso. Le operazioni di impostazione avvengono
indicando a sdparm quale parametro modificare usando il relativo identificativo alfanumerico
(quello che si pu`
o ottenere con le opzioni viste finora).
Le opzioni che consentono di operare sul singolo parametro sono tre: con -g (o --get),
seguita dallidentificativo del parametro, se ne ottiene il valore, con -s (o --set) se ne imposta
il valore, da specificare in forma di assegnazione allidentificativo del parametro,55 ed infine se
a questa si abbina -S (o --save) il valore specificato verr`a impostato oltre che come valore
corrente anche come valore salvato. Si possono poi ripristinare tutti i parametri di una mode
page (da indicare con -p) ai rispettivi valori di default usando lopzione -D (o --defaults).
Parametro
AWRE

ARRE

WCE
DRA

Significato
Automatic Write Reallocation Enabled controlla la riallocazione automatica dei settori danneggiati in caso di errori di scrittura (1 abilita, 0
disabilita, con default 1).
Automatic Read Reallocation Enabled controlla la riallocazione automatica dei settori danneggiati in caso di errori di lettura (1 abilita, 0
disabilita, con default 1).
Write Cache Enable controlla la cache di scrittura, (1 abilita, 0
disabilita, con default 1), `e equivalente allopzione -W di hdparm.
Disable Read Ahead, controlla il read-ahead del disco, (1 disabilita, 0
abilita, con default 0), `e equivalente allopzione -A di hdparm.

Tabella 6.8: I parametri pi`


u rilevanti per le impostazioni con sdparm.

Cos` se si vuole impostare il write caching del disco (equivalente dellopzione -W di hdparm)
si potr`a usare il comando
sdparm --set WCE=1 /dev/sda
52

cio`e il contenuto della pagina di.


vale a dire il contenuto della pagina sv.
54
alcuni parametri sono determinati dallo stato del dispositivo e non sono modificabili dallutente.
55
i valori sono sempre numerici, ed espressi in forma decimale, a meno di non apporvi il prefisso 0x per usare
la notazione esadecimale.
53

6.3. GESTIONE AVANZATA DI DISCHI E FILESYSTEM

381

e per effettuare un test delle impostazioni (in cui si esegue un controllo della validit`a dei valori
richiesti) senza eseguirle effettivamente si pu`o aggiungere lopzione -d (o --dummy). Come per le
mode pages e le pagine VPD anche solo fare elenco di tutti i possibili parametri di configurazione
e del loro significato va al di l`
a delle possibilit`a di questo testo; si sono riportati in tab. 6.8 alcuni
fra i pi`
u rilevanti.
Infine sdparm permette di inviare ai dispositivi, attraverso il protocollo SCSI, una serie di
comandi specifici usando lopzione -C (o --command); a questa deve seguire come parametro il nome del comando. I comandi definiti, che non `e detto siano applicabili a qualunque dispositivo,56
sono riportati in tab. 6.9 insieme alla spiegazione del relativo significato.
Comando
capacity
eject
load
ready
sense

start
stop
sync
unlock

Significato
richiede la capacit`
a del supporto, riportando il numero di blocchi, la
loro dimensione e la dimensione totale in Mb.
ferma il supporto (se in rotazione) e lo espelle.
carica il supporto e lo mette in rotazione.
esegue una interrogazione per verificare se il dispositivo `e pronto ad una
risposta (cosa che non avviene se ad esempio si `e fermato un disco).
richiede alcune informazioni relative al dispositivo,57 come le informazioni sullalimentazione o lo stato di progresso di un comando lento
(come una formattazione).
avvia il supporto, mettendolo in rotazione.
ferma il supporto, bloccandone la rotazione, equivalente a hdparm -y.
esegue lo scarico dei buffer interni del dispositivo con la immediata
scrittura dei dati sul supporto, equivalente a hdparm -f.
indica al dispositivo di consentire la rimozione del supporto (da usare
come ultima risorsa su un dispositivo bloccato), equivalente a hdparm
-L0.
Tabella 6.9: I nomi dei comandi per lopzione -C di sdparm.

6.3.2

Il ridimensionamento di filesystem e partizioni

Abbiamo gi`
a incontrato in sez. 6.1.3, con laccrescimento di un RAID software, ed in sez. 6.2.4,
con la possibilit`
a di modificare le dimensioni di un volume fisico di LVM, due casi in cui un
dispositivo contenente un filesystem pu`o cambiare dimensioni. In entrambi i casi si `e sottolineato come questo cambiamento non comporti anche ladattamento del filesystem alle nuove
dimensioni; questo infatti quando viene creato organizza le sue strutture interne assumendo che
il dispositivo su cui si trova abbia una certa dimensione, che `e quella rilevata a quel momento.
Per questo motivo le operazioni di modifica delle dimensioni di un dispositivo, che sia questo
un RAID software, un volume logico di LVM, o semplicemente una partizione di cui si sia
spostata la fine con i comandi di sez. 5.1.2, devono essere sempre accompagnate dalle conseguenti
operazioni di modifica del filesystem sottostante. Ed in particolare si deve tener conto che se
aumentare le dimensioni di un dispositivo non ha nessun effetto sul filesystem in esso contenuto,
il ridurle senza prima aver ridotto anche quelle del filesystem comporta che questo non sia pi`
u
in grado di accedere a parte delle sue strutture (quelle poste nella parte tolta) con conseguente
immediata corruzione dello stesso e probabile perdita di dati.
Pertanto quando si vanno ad effettuare operazioni di ridimensionamento `e assolutamente
necessario ricordarsi che la corretta sequenza di operazioni non `e la stessa se si compie un
allargamento o una riduzione. Nel primo caso infatti occorre prima allargare il dispositivo e poi
il filesystem, mentre nel secondo occorre prima ridurre il filesystem e poi il dispositivo.
56

alcuni infatti sono specifici dei masterizzatori.


si tratta in questo caso di uno specifico comando del protocollo, denominato REQUEST SENSE SCSI, che
richiede alcuni dati relativi al dispositivo detti appunto sense data.
57

382

CAPITOLO 6. AMMINISTRAZIONE AVANZATA DEL SISTEMA

La possibilit`
a di ridimensionare un filesystem dipende dalla presenza di un opportuno programma, specifico per ciascun tipo di filesystem, in grado di svolgere questo compito. Correntemente la gran parte dei filesystem presenti su Linux (ext2/ext3, reiserfs, XFS, JFS) `e
dotata di questa funzionalit`
a. In generale questa operazione pu`o essere eseguita solo a filesystem inattivo, cio`e senza che questo sia montato, il che comporta degli ovvi problemi se si vuole
ridimensionare quello contenente la directory radice. Alcuni filesystem per`o supportano anche il
ridimensionamento a caldo (cio`e senza smontare il filesystem) se questo avviene in accrescimento.
Come accennato ogni filesystem ha normalmente un suo programma per il ridimensionamento, fa eccezione JFS, che utilizza una specifica opzione di montaggio; per ridimensionare un
filesystem JFS infatti baster`
a rimontarlo con un comando del tipo:
mount -t jfs -o remount,resize=10G /dev/vg/home /home
dove se non si specifica nessun parametro per lopzione resize il ridimensionamento viene fatto
alla dimensione totale del dispositivo sottostante. Il ridimensionamento pu`o essere eseguito a
caldo come nellesempio, ma si tenga presente che JFS, come XFS, non supporta il restringimento
del filesystem, le dimensioni possono soltanto essere aumentate.
Nel caso di XFS il comando che consente il ridimensionamento del filesystem `e xfs_growfs, il
comando richiede che si passi come argomento il mount-point del filesystem, e funziona soltanto a
caldo, vale a dire richiede che il filesystem sia montato. Come per JFS non `e possibile restringere
un filesystem XFS. Se non si specifica nulla il ridimensionamento avviene al totale della nuova
dimensione del dispositivo, per le opzioni si consulti al solito la pagina di manuale.
Per ridimensionare un filesystem reiser si deve invece usare il comando resize_reiserfs,
passando come argomento il dispositivo contenente il filesystem da ridimensionare. La nuova
dimensione si specifica con lopzione -s seguita dal valore, con la solita convenzione delliniziale
per le unit`a di misura per indicare kilobyte, megabyte e gigabyte. Lopzione supporta anche
luso dei segni + e - per indicare dei ridimensionamenti relativi (accrescimenti o riduzioni);
se non si specifica nulla il comando user`
a la dimensione del dispositivo sottostante.
Il comando permette anche di specificare un dispositivo alternativo su cui mantenere il giornale con lopzione -j, e di forzare le operazioni senza eseguire controlli con -f; per avere pi`
u
informazioni nel corso delle operazioni si deve invece usare -v. In caso di accrescimento il il
comando pu`o essere usato a caldo, mentre in caso di riduzione `e necessario smontare il filesystem.
Infine il comando che permette di ridimensionare un filesystem ext2, ext3 o ext4, `e resize2fs; a seconda delle versioni del filesystem il programma richiede che il filesystem sia smontato
anche in caso di accrescimento.58 Il comando prende come primo argomento il dispositivo su cui
si trova il filesystem da ridimensionare. Se non viene specificato un secondo argomento indicante
la dimensione da usare il ridimensionamento avviene alla dimensione corrente del dispositivo.59
La dimensione pu`
o essere indicata con la convenzione sulle unit`a di misura gi`a illustrata in
precedenza che prevede che queste siano specificate posponendo al numero la relativa iniziale.
Il comando prevede lopzione -d per abilitare il debug, che prende come parametro una
bitmask indicante quali informazioni stampare, -p che stampa una percentuale di completamento
durante le operazioni, -f che forza le operazioni escludendo alcuni controlli di sicurezza e -F che
scarica i dati in cache prima di iniziare.
Si tenga presente che anche se i comandi citati sono in genere in grado di determinare da soli
la dimensione di un dispositivo, qualora se ne specifichi manualmente una eccessiva, si andr`a
incontro a problemi. Inoltre una volta che sia ridotto un filesystem e si proceda al restringimento
del dispositivo sottostante, occorre stare molto attenti a non farlo al di sotto delle dimensioni
date al filesystem.
58

il filesystem deve essere montato come ext3 e deve esserci la presenza della estensione resize_inode, vedi
tab. 5.6.
59
questo significa che largomento non `e necessario in caso di espansione e lo `e in caso di riduzione.

6.3. GESTIONE AVANZATA DI DISCHI E FILESYSTEM

383

Infine quando si ridimensiona una partizione per poi ridimensionare il filesystem occorre
anche avere cura che essa continui ad avere lo stesso punto di inizio, altrimenti i comandi non
potranno pi`
u trovare i dati del filesystem. Se questo avviene automaticamente per il RAID
e LVM, non altrettanto accade quando si usa fdisk come abbiamo visto in sez. 5.1.2 per la
manipolazione del contenuto della tabella delle partizioni.
Quando su un disco sono gi`
a presenti dei dati questo in genere significa che al pi`
u si potranno
cancellare alcune delle partizioni per poi riutilizzare lo spazio ottenuto o al pi`
u allargare o
stringere una partizione esistente, posto che nel primo caso si sia opportunamente ristretto il
filesystem in esso contenuto, e che nel secondo sia disponibile dello spazio libero in coda alla
partizione e si allarghi poi il filesystem.
Per questo motivo quando si opera direttamente sulle partizioni `e pi`
u opportuno usare un
comando come parted che unisce le funzionalit`a dei comandi per il partizionamento e di quelli
per il ridimensionamento dei file60 e consente non solo la creazione e la cancellazione delle
partizioni, ma anche il loro ridimensionamento e spostamento senza perderne il contenuto. Una
caratteristica interessante del programma `e che ne `e disponibile una versione su disco di avvio
che consente di ripartizionare un sistema prima di avviarlo, cosa che permette di operare anche
sulla partizione che contiene il filesystem della radice.
Il programma opera normalmente in modalit`a interattiva, e lo si pu`o lanciare direttamente
ottenendo un prompt da cui invocare i comandi interni; se non si specifica nessun argomento esso
andr`a ad operare sul primo disco, altrimenti il primo argomento deve essere il file di dispositivo
su cui si vuole operare, a questo pu`o seguire, per una invocazione non interattiva, la riga di
comandi che si darebbe dal prompt, ma in questo caso il file di dispositivo deve sempre essere
indicato.
La gran parte dei comandi interni richiedono il passaggio di opportuni argomenti, il pi`
u
comune `e il numero della partizione su cui operare, che `e quello che abbiamo illustrato in
sez. 5.1.2, quando `e richiesta lindicazione di un disco questa deve essere effettuata specificando
il relativo file di dispositivo, mentre lindicazione di un tipo di filesystem utilizza gli stessi valori
usati per lopzione -t di mount.61
Infine qualora sia richiesta la specificazione di una dimensione, che questa sia un punto di
inizio, di fine o lestensione di una partizione, il default del programma prevede che un valore
numerico sia interpretato come numero di megabyte; si possono per`o usare anche altre unit`
a di
misura apponendo al numero i relativi suffissi (ad esempio kB per kilobyte e GB per gigabyte), si
possono inoltre specificare le dimensioni in percentuale con il suffisso % ed usare numeri negativi
per indicare una dimensione a partire dal fondo del disco. Tutte le indicazioni relative alle
dimensioni vengono considerate come approssimate, e vengono automaticamente aggiustate in
un intervallo di 500Mb per rispettare la geometria del disco, a meno di non specificare un valore
esatto in numero di settori, usando il suffisso s.
Il comando principale di parted `e resize, che consente di ridimensionare e spostare una
partizione; il comando prevede che si specifichi la partizione su cui operare seguita dal punto di
inizio e da quello di fine. Il comando non modifica mai il numero della partizione, ma posto che
ci sia lo spazio disponibile sposta i dati e ridimensiona il filesystem per far si che la partizione
indicata inizi e termini nei punti specificati. Si tenga presente che la combinazione di uno
spostamento ed di un ridimensionamento non `e supportata per tutti i filesystem, nel qual caso
sar`a necessario, prima eseguire il ridimensionamento senza cambiare il punto di inizio e poi
eseguire lo spostamento della partizione con move.
Un altro comando interessante di parted `e rescue che consente di recuperare una partizione
cancellata per errore, il comando richiede una indicazione approssimata dei punti di inizio e
60
61

ed anche di quelli di controllo e riparazione.


si tenga presente che le operazioni sui filesystem sono supportate solo per alcuni di essi.

384

CAPITOLO 6. AMMINISTRAZIONE AVANZATA DEL SISTEMA

fine della stessa, ed esegue una ricerca, una volta identificati i limiti esatti chiede il numero da
assegnare alla partizione recuperata.
Comando
rm
print
cp

rescue

resize

select
move

unit

Significato
cancella una partizione, se si cancella una partizione logica tutte quelle
di numero superiore verranno rinominate per coprire il buco.
stampa la tabella delle partizioni ed alcuni dati riassuntivi sul disco.
copia una partizione, prende come primo argomento opzionale il dispositivo sorgente (da specificare con il rispettivo file di dispositivo),
i due argomenti successivi indicano la partizione sorgente e quella di
destinazione (che fa sempre riferimento al disco corrente).
recupera una partizione cancellata accidentalmente, richiede che si specifichi approssimativamente il punto di inizio e di fine della stessa, e se
identificata chieder`
a il numero da assegnargli.
ridimensiona una partizione, richiede il numero della partizione, il punto
di inizio e di fine; in caso di estensione lo spazio ulteriore deve essere
libero.
consente di selezionare un altro disco; usato in modalit`
a interattiva.
sposta una partizione, richiede il numero della stessa seguito dal nuovo
punto di inizio e di fine; lo spazio dove la partizione viene spostata deve
essere libero.
cambia lunit`
a di misura delle dimensioni, usata in modalit`
a interattiva.
Tabella 6.10: I principali comandi di parted.

Si sono riportati in tab. 6.10 i comandi di parted pi`


u significativi, insieme ad una breve
descrizione del significato e degli argomenti necessari; si tenga presente che quando un comando
`e invocato in modalit`
a interattiva eventuali argomenti mancanti verranno chiesti sul terminale.
Oltre a quelli citati il parted supporta anche altri comandi per eseguire il partizionamento
o la creazione dei filesystem che duplicano le funzionalit`a dei comandi standard gi`a visti in
sez. 5.1 e che perci`
o non tratteremo. Lelenco pu`o comunque essere ottenuto dalla pagina di
manuale, anche se documentazione completa del comando `e fornita soltanto nelle pagine info
(vedi sez. 2.4.2), accessibile con info parted.

6.4

Le quote disco

Una delle caratteristiche avanzate della gestione dei dischi presenti fin dal kernel 2.0 `e quella
delle quote disco, un meccanismo che consente di limitare la quantit`a delle risorse su disco che i
singoli utenti (o gruppi) possono usare. Tratteremo in questa sezione il loro utilizzo e le relative
modalit`a di gestione.

6.4.1

Visione generale

Una delle risorse principali che gli amministratori di sistema devono gestire `e quella dello spazio
disco; uno dei problemi pi`
u comuni `e infatti quello del riempimento del disco, e questo avviene
sovente perche alcuni utenti non si curano di controllare le risorse che usano, e finiscono per
riempire tutto lo spazio disponibile, a scapito pure degli altri utenti.
Per questo motivo una delle caratteristiche presenti da sempre in sistemi multiutente `e quella
di poter imporre delle restrizioni allo spazio disco utilizzato dai singoli utenti. Nel caso specifico
di un sistema unix-like questo `e sempre stato realizzato attraverso le cosiddette quote disco, un
meccanismo, realizzato nel kernel, che pone delle restrizioni alle risorse che un singolo utente
pu`o utilizzare.
Lidea `e che in questo modo esiste un limite di occupazione delle risorse oltre il quale ogni
utente non pu`o andare. La struttura del meccanismo di controllo opera sia sulla quantit`a di
spazio disco (cio`e sul numero di blocchi) che sul numero di file (cio`e sul numero di inode)

6.4. LE QUOTE DISCO

385

da mettere a disposizione; le due risorse sono completamente indipendenti per cui `e possibile
superare il limite sul numero di file occupati pur avendo ancora spazio disco disponibile.
Le quote sono sempre calcolate per ogni singolo filesystem (che deve supportare il meccanismo62 ), pertanto `e usuale attivarle sul filesystem su cui si sono piazzate le home degli utenti. Si
tenga presente comunque che se gli utenti possono scrivere su pi`
u filesystem le quote opereranno
in maniera indipendente su ciascuno di essi, e dovranno perci`o essere impostate separatamente.
Unultima caratteristica generale delle quote disco `e che il controllo sulla occupazione delle
risorse pu`
o avvenire sia a livello di un singolo utente (cio`e in base alluser ID), che di un gruppo
(cio`e in base al group ID), che di entrambi. In pratica, si avr`a la possibilit`a di utilizzare il disco
per aggiungere un certo file se questo `e consentito dalla quota dellutente cui apparterr`a il file
in questione o se `e consentito dalla quota di gruppo (sempre per il gruppo di appartenenza del
file).

6.4.2

Configurazione del sistema delle quote

Per poter utilizzare le quote disco occorre anzitutto abilitare il relativo supporto nel kernel
nella sezione File systems della configurazione. Del sistema esistono due versioni, entrambe
supportate per compatibilit`
a, anche se nei nuovi sistemi `e preferibile usare la pi`
u recente. Si
tenga presente che se si vogliono usare le quote con NFS occorre che sia stato opportunamente
avviato il relativo demone per la gestione (vedi sez. 8.4.1).
Se si vuole utilizzare il controllo delle quote il secondo passo `e segnalarne la presenza in fase
di montaggio del filesystem perche il kernel sia successivamente in grado di mantenere i dati
relativi alluso del disco ed applicare le restrizioni, questo viene fatto utilizzando due opzioni
specifiche per /etc/fstab: per le quote degli utenti si usa usrquota mentre per quelle dei gruppi
grpquota, un esempio di utilizzo di queste opzioni `e il seguente:
/dev/vg/home

/home

ext3

defaults,usrquota,grpquota

Una volta abilitato il supporto nel kernel e montato opportunamente il filesystem il passo
successivo `e quello di avere presenti63 nella radice del relativo filesystem (la directory corrispondente al mount point) i file quota.user e quota.group se si usa la versione 1 del supporto o
` in questa coppia di file che sono
i file aquota.user e aquota.group se si usa la versione 2. E
mantenuti i dati relativi alluso del disco da parte di utenti e gruppi usati dal sistema delle quote.
In generale non `e necessario creare questi file a mano,64 se sono assenti infatti la prima volta
che si usa il comando quotacheck verranno creati automaticamente. Questo comando deve
essere sempre eseguito su un filesystem montato con le opzioni per le quote prima di abilitare le
stesse (con un successivo quotaon) in modo da ricostruire lo stato delloccupazione delle risorse
sul disco; se infatti le informazioni di aquota.user e aquota.group non sono aggiornate il
meccanismo delle quote non funziona in maniera corretta.
Il comando prende come argomento il file di dispositivo su cui `e posto il filesystem da controllare o il rispettivo mount point presente in /etc/fstab, ma questo argomento pu`o essere
tralasciato con luso dellopzione -a che controlla tutti i filesystem montati (tranne quelli montati
via NFS).
Il comando costruisce una tabella con luso corrente del disco e la confronta, a meno di
non usare lopzione -c (nel qual caso detti file non vengono letti) con i dati memorizzati su
aquota.user e aquota.group; se trova delle incoerenze aggiorna le informazioni. In genere il
comando necessita di montare il filesystem in sola lettura, onde evitare delle variazioni dello
62

con gli ultimi kernel il supporto `e presente per ext2, ext3, e reiserfs, mentre per XFS la caratteristica deve
essere esplicitamente abilitata dato che `e gestita in modo diverso.
63
questo non `e vero per le quote su XFS, in detto filesystem infatti le quote sono mantenute nei meta-dati e
non su file visibili.
64
alcuni HOWTO indicano di crearli vuoti con il comando touch se non sono presenti.

386

CAPITOLO 6. AMMINISTRAZIONE AVANZATA DEL SISTEMA


Opzione
-a
-R
-F

-u
-g
-c
-v
-m
-M

Significato
controlla tutti i filesystem montati.
se specificata con -a non controlla la radice.
controlla le quote nel formato specificato, prende i valori:
vfsold (per la versione 1), vfsv0 (per la versione 2), rpc
(per le quote su NFS) e xfs (per le quote su XFS).
richiede lesecuzione del controllo per le sole quote degli
utenti.
richiede lesecuzione del controllo per le sole quote dei
gruppi.
non legge i file con i dati delle quote esistenti.
riporta lo stato di avanzamento delle operazioni.
forza il controllo delle quote senza rimontare il filesystem
in sola lettura.
esegue il controllo anche con il filesystem montato in
scrittura se il tentativo di rimontarlo in sola lettura
fallisce.

Tabella 6.11: Principali opzioni del comando quotacheck.

spazio occupato durante il calcolo; si pu`


o forzare lesecuzione se il filesystem non `e montabile in
sola lettura usando lopzione -m.
Di default il comando controlla solo le quote utente, se si vogliono controllare solo le quote gruppo occorre specificarlo esplicitamente usando lopzione -g, se le si vogliono controllare
entrambe va specificata esplicitamente anche lopzione -u. Le altre opzioni principali sono riportate in tab. 6.11, per lelenco completo ed i dettagli al solito si faccia riferimento alla pagina
di manuale.
Una volta che si `e montata una partizione con il controllo delle quote perche questo sia
applicato `e necessaria una attivazione esplicita con il comando quotaon; come per quotacheck
il comando richiede come argomento uno (o pi`
u) file di dispositivo su cui `e situato il filesystem
con le quote o lopzione -a per attivarli tutti. Il comando prende le opzioni -u e -g con lo
stesso significato di quotacheck per attivare le quote su utenti e gruppi; al solito di default sono
attivate soltanto quelle sugli utenti. Lopzione -v aumenta la prolissit`a del comando stampando
ogni filesystem per il quali si sono attivate le quote, mentre con -p si stampa solo lo stato delle
stesse invece di attivarle. Per le altre opzioni ed i dettagli di funzionamento al solito si pu`o fare
riferimento alla pagina di manuale.
In sostanza per poter utilizzare le quote, una volta modificato /etc/fstab per indicare i
filesystem su cui usarle, si dovr`
a provvedere a lanciare negli script di avvio (subito dopo il
montaggio dei filesystem) un opportuno script che invochi prima quotacheck e poi quotaon; gran
parte delle distribuzioni installano automaticamente uno script di questo tipo con linstallazione
dei programmi di controllo delle quote.65
Il sistema del controllo delle quote pu`o anche essere disabilitato utilizzando quotaoff. Il
comando (che `e equivalente a chiamare quotaon con lopzione -f) notifica al kernel la richiesta
di non effettuare pi`
u controlli sul superamento delle quote. Il comando prende gli stessi argomenti
di quotaon (in realt`
a si tratta dello stesso eseguibile, solo invocato con un nome diverso), e le
due opzioni -v e -p hanno lo stesso effetto descritto in precedenza.

6.4.3

Gestione delle quote di utenti e gruppi

Una volta configurato il supporto delle quote, e attivato lo stesso con quanto illustrato nella
sezione precedente, il passo successivo `e quello di impostare quali restrizioni (sia in termini di
spazio disco che di inode disponibili) si vogliono imporre ai vari utenti (o ai gruppi).
65

nel caso di Debian lo script `e /etc/init.d/quota e fa parte del pacchetto omonimo.

6.4. LE QUOTE DISCO

387

Come accennato in sez. 6.4.1 le quote si applicano in maniera indipendente per ciascun
filesystem, inoltre se si ricorda quanto illustrato in sez. 5.1.4, un filesystem unix-like ha due tipi
di risorse, i blocchi e gli inode, i primi sono relativi allo spazio disco utilizzabile, i secondi al
numero di file, e su entrambi possono essere applicate delle restrizioni in maniera indipendente.
La struttura del meccanismo delle quote disco prevede la presenza di due limiti, uno morbido
(detto appunto soft limit) che pu`
o essere superato per brevi periodi di tempo, ed uno duro (detto
hard limit) che non pu`
o mai venir superato. Il breve periodo di tempo durante il quale `e possibile
superare il primo limite `e detto periodo di grazia (grace period ), durante detto periodo `e ancora
possibile creare nuovi file o usare spazio disco superando il limite morbido, ma comunque mai
al di l`a del limite duro.
Opzione
-f
-u
-g
-t
-p

Significato
limita le impostazioni al filesystem specificato.
richiede limpostazione delle quote per un utente.
richiede limpostazione delle quote per un gruppo.
imposta il periodo di grazia.
specifica un utente di riferimento.

Tabella 6.12: Principali opzioni del comando edquota.

Il programma che permette di impostare le quote (ovviamente solo allamministratore) `e


edquota, e nella sua forma pi`
u semplice prende come argomento lutente di cui si vogliono
modificare le quote, il comando infatti per default agisce sulle quote utente, se si vuole operare
su un gruppo occorre specificare lopzione -g. Il comando crea un file di testo temporaneo con la
rappresentazione delle quote correnti per lutente o il gruppo scelto, e lancia leditor di default
(in genere vi o quello stabilito dalla variabile di ambiente EDITOR), allinterno del quale apparir`
a
un contenuto del tipo:
Quotas for user piccardi:
/dev/hda3: blocks in use: 2594, limits (soft = 5000, hard = 6500)
inodes in use: 356, limits (soft = 1000, hard = 1500)

le informazioni riguardo luso corrente sono riportate solo per riferimento, e una loro modifica
verr`a ignorata, modificando invece i valori dei limiti fra parentesi, salvando il file ed uscendo
dalleditor questi verranno utilizzati come nuovi limiti; un limite pu`o essere annullato usando il
valore 0.
In realt`
a `e possibile specificare come argomenti pi`
u utenti (o gruppi) ed utilizzare lopzione -p
per specificare un utente (o gruppo) di riferimento le cui impostazioni dovranno essere utilizzate
per tutti gli altri; in questo modo `e possibile effettuare una impostazione generale per un singolo
utente senza doverla poi ripetere a mano per tutti gli altri.
Se non si specifica nulla il comando imposta le quote per tutti i filesystem che le supportano; si
pu`o delimitare lazione del programma ad un solo filesystem specificando questultimo (indicato
per file di dispositivo) con lopzione -f.
Infine con lopzione -t si pu`
o impostare il valore del periodo di grazia. Si tenga presente che
questa `e una propriet`
a globale che pu`o essere impostata solo a livello di tutti gli utenti (o tutti i
gruppi) di un singolo filesystem. Usando questa opzione di nuovo sar`a aperto un file temporaneo
allinterno delleditor di default, il cui contenuto sar`a qualcosa del tipo:
Time units may be: days, hours, minutes, or seconds
Grace period before enforcing soft limits for users:
/dev/hda2: block grace period: 0 days, file grace period: 0 days

Con la prima versione della gestione delle quote specificare un valore nullo per il periodo
di grazia significava utilizzare il valore di default del periodo (pari ad una settimana); con le
nuove versioni `e sempre necessario impostare esplicitamente un limite. Un elenco delle principali

388

CAPITOLO 6. AMMINISTRAZIONE AVANZATA DEL SISTEMA

opzioni del comando edquota `e riportato in tab. 6.12, per i dettagli e lelenco completo si faccia
al solito riferimento alla pagina di manuale.
Una volta attivate le quote ci sono due comandi che permettono di verificarne lo stato,
il primo `e quota che permette ad un utente di verificare le condizioni delle sue quote disco. Il
comando con lopzione -u (il default, pu`
o essere omessa) stampa un resoconto delle quote utente,
se si vuole controllare le quote di gruppo occorre usare lopzione -g.
Lamministratore (e solo lui) pu`
o anche richiedere il resoconto delle quote di un altro utente (o
di un gruppo, nel qual caso occorre -g) specificando questultimo come argomento del comando.
Le altre opzioni principali di quota sono riportate in tab. 6.13, per i dettagli e lelenco completo
si faccia al solito riferimento alla pagina di manuale.
Opzione
-f
-u
-g
-l
-q

Significato
limita le impostazioni al filesystem specificato.
richiede i dati delle quote utente.
richiede i dati delle quote gruppo.
riporta solo le quote su filesystem locali.
stampa le informazioni in modalit`
a succinta.

Tabella 6.13: Principali opzioni del comando quota.

Un secondo comando per il controllo dello stato delle quote `e repquota che per`o `e ad uso
esclusivo dellamministratore, in quanto serve a fornire dei rapporti globali sullo stato delle quote
nel sistema riportando i totali per tutti gli utenti. Un esempio del suo risultato potrebbe essere
il seguente:
root@monk# repquota -a
User
root
bin
uucp
man
user1
user2

-------

used
175419
18000
729
57
13046
2838

Block limits
soft
hard
0
0
0
0
0
0
0
0
15360
19200
5120
6400

grace

File limits
used soft hard
14679
0
0
735
0
0
23
0
0
10
0
0
806 1500 2250
377 1000 1500

grace

Il comando repquota prevede come argomento il filesystem di cui si vogliono controllare le


quote specificato sia tramite mount-point che per dispositivo; questo pu`o essere omesso se si
usa lopzione -a che controlla tutti i filesystem per cui sono abilitate le quote. Le altre opzioni
servono per lo pi`
u a controllare le informazioni che vengono stampate; in particolare al solito
-u e -g consentono di richiedere il rapporto rispettivamente per quote utenti e quote gruppo.
Un sommario delle principali opzioni `e riportato in tab. 6.14, al solito per lelenco completo ed
i dettagli di funzionamento del comando si pu`o fare riferimento alla pagina di manuale.
Opzione
-a
-u
-g
-n
-q
-s
-v

Significato
elenca i dati per tutti i filesystem in cui /etc/mtab riporta
luso di quote.
elenca i dati delle quote utente.
elenca i dati delle quote gruppo.
non risolve i nomi di utenti e gruppi.
stampa le informazioni in modalit`
a succinta.
adatta le unit`
a di misura per spazio disco e inode.
riporta maggiori informazioni e stampa i dati delle quote
anche quando non sono usate.

Tabella 6.14: Principali opzioni del comando repquota.

6.4. LE QUOTE DISCO

389

Dato che la gestione delle quote attraverso edquota `e abbastanza scomoda, dovendo passare
attraverso luso di un editor,66 sono stati creati degli altri programmi che consentono di eseguire
limpostazione delle quote direttamente sulla riga di comando.
Il primo di questi `e setquota. Usato nella sua forma elementare il comando prende come
argomenti un nome (il default `e il nome utente, ma si pu`o usare un gruppo se si specifica lopzione
-g) seguito dai limiti soft e hard per i blocchi e poi da quelli per gli inode; lultimo argomento `e il
filesystem a cui applicare le quote, che pu`o essere omesso se si usa lopzione -a. Con lopzione -b
i limiti delle quote possono essere forniti sullo standard input invece che sulla riga di comando.
Un sommario delle principali opzioni `e riportato in tab. 6.15, al solito per lelenco completo ed
i dettagli di funzionamento del comando si pu`o fare riferimento alla pagina di manuale.
Opzione
-a
-u
-g
-b
-t

Significato
applica il comando a tutti i filesystem in cui /etc/mtab
riporta luso di quote.
richiede limpostazione delle quote utente (indicato per
nome o user ID).
richiede limpostazione delle quote gruppo (indicato per
nome o group ID).
legge i dati delle quote dallo standard input invece che
dagli argomenti della riga di comando.
imposta il periodo di grazia (in secondi), richiede che
si specifichino come argomenti il tempo in secondi per
blocchi e inode.

Tabella 6.15: Principali opzioni del comando setquota.

Un secondo comando di gestione delle quote, che oltre alle impostazioni pu`o anche eseguire
la visualizzazione delle stesse, `e quotatool. Lunico argomento preso dal comando `e il filesystem
su cui si vuole operare, che pu`
o essere indicato sia per dispositivo che per mount-point. Occorre
inoltre indicare esplicitamente utente o gruppo su cui si vuole operare con le opzioni -u o -g,
cui deve seguire come parametro il nome utente o il rispettivo user ID (a meno che non si sia
usata anche -t per impostare il tempo di grazia a livello globale). Le opzioni -i e -b servono
per indicare se si vogliono impostare le quote dei blocchi o degli inode, mentre i valori devono
essere specificati come parametri per le opzioni -q (per il soft-limit) e -l (per lhard-limit). Le
principali opzioni sono riportate in tab. 6.16, per lelenco completo ed i dettagli di funzionamento
al solito si pu`
o fare riferimento alla pagina di manuale.
Opzione
-u
-g
-d
-t

-i
-b
-l
-q

Significato
imposta le quote utente.
imposta le quote gruppo.
stampa le quote correnti per lutente o il gruppo.
imposta il periodo di grazia, pu`
o essere usato un valore
numerico con i prefissi + e - per aumentarlo o diminuirlo
ed un suffisso che specifichi le unit`
a di misura (seconds,
minutes, ecc.)
indica di modificare le quote per gli inode.
indica di modificare le quote per i blocchi.
imposta un hard-limit.
imposta un soft-limit.

Tabella 6.16: Principali opzioni del comando quotatool.

66

il che ad esempio rende inutilizzabile il comando allinterno di script.

390

CAPITOLO 6. AMMINISTRAZIONE AVANZATA DEL SISTEMA

Capitolo 7

Lamministrazione di base delle reti


7.1

Unintroduzione ai concetti fondamentali delle reti.

Il campo della comunicazione via rete `e uno dei pi`


u vasti e complessi di tutta linformatica. Nel
corso degli anni sono stati sviluppati molti mezzi (cavo, fibra, radio), e molti protocolli (TCP/IP,
AppleTalk, IPX, ecc.) che permettessero di far comunicare fra loro computer diversi.
In generale con il termine di rete si identifica quella serie di meccanismi e metodi di collegamento tramite i quali tanti singoli computer, chiamati nodi o stazioni (in inglese host) vengono
messi in comunicazione fra di loro in modo da potersi scambiare dati.
In questa sezione introduttiva esamineremo in breve alcuni concetti di base relativi alle
reti, a partire dai diversi criteri che vengono usati come base per le loro classificazione, quale
lestensione, la topologia con cui sono realizzate ed i protocolli di comunicazione usati.

7.1.1

Lestensione

Una delle forme di classificazione di una rete pi`


u elementari, ed una delle meno precise, `e quella
per estensione o area. In origine, quando le reti erano disponibili solo nei grandi centri di ricerca
o nelle grandi imprese, la classificazione era molto semplice e prevedeva soltanto le due tipologie:
LAN

Local Area Network, che indica le reti locali, realizzate su brevi distanze, allinterno di
uno stesso edificio o gruppo limitrofo di edifici (in genere una universit`a o la sede di
una grande impresa) che di norma sono possedute e gestite da una sola organizzazione.

WAN

Wide Area Network, che indica in generale una rete di grande estensione, e a cui
in genere si fa riferimento per indicare la struttura che connette varie reti locali,
estendendosi potenzialmente su tutto il mondo (Internet `e un esempio di WAN). In
questo caso la rete non `e propriet`a di una entit`a singola, ma viene gestita in comune
da pi`
u enti o organizzazioni.

Con il diffondersi dei computer e delle tecnologie di comunicazione, anche questa classificazione delle reti si `e evoluta, e la suddivisione per area di estensione si `e diversificata notevolmente,
tanto che attualmente oltre alle due precedenti sono state introdotte una lunga serie di altre
tipologie, come ad esempio:
MAN

Metropolitan Area Network, che indica in genere una rete cittadina, di dimensione
intermedia fra LAN e WAN, in cui varie reti locali vengono integrate preliminarmente
fra di loro a livello di area metropolitana, grazie a delle infrastrutture dedicate. Viene
di norma gestita da entit`
a legate al governo della citt`a.
391

392

CAPITOLO 7. LAMMINISTRAZIONE DI BASE DELLE RETI

SAN

Storage Area Network, che fa riferimento alle reti dedicate a fornire un sistema di
stoccaggio dati comune ad un insieme di computer. In generale sono usate allinterno di singole organizzazioni e non sono da considerarsi propriamente delle reti di
comunicazione.

PAN

Personal Area Network, che indica in genere quelle reti di comunicazione usate per connettere computer e dispositivi di uso personale (ad esempio il telefonino), su distanze
di pochi metri, come il bluetooth.

DAN

Desktop Area Network, che in genere fa riferimento alle reti di comunicazione usate
per connettere vari dispositivi periferici ad un computer a brevissima distanza (la
scrivania appunto) come le reti ad infrarossi IRDA.

In generale comunque, la sola classificazione rilevante `e la prima, le altre si sovrappongono


spesso fra di loro (come per DAN e PAN) o non hanno a che fare, come la SAN (e le tecnologie
di comunicazione usate per i cluster, o allinterno dei computer per le varie CPU) con quello che
tratteremo in queste dispense.

7.1.2

La topologia

Una classificazione generale applicabile a qualunque rete `e quella basata sulla sua topologia. La
topologia (dal greco topos) `e una branca della geometria che studia le propriet`a delle connessioni
fra oggetti geometrici, e si applica pertanto anche alla struttura delle reti.
La classificazione riportata prevede solo alcune topologie di base, in genere poi le reti sono
costruite con linterconnessione di reti diverse e possono assumere delle topologie ibride rispetto
a quelle qui elencate. Le topologie fondamentali sono:
` la forma di connessione pi`
point-to-point E
u semplice, ed in realt`a in questo caso non si pu`o
neanche propriamente parlare di una rete; in quanto si realizza semplicemente
una connessione diretta fra due macchine, che si vedono appunto come i due
capi di una connessione punto-punto.
` la topologia classica delle connessioni via modem,1 ma vale anche per altri
E
tipi di collegamento fisico che consentono soltanto una trasmissione da un capo
ad un altro;2 in questo caso semplicemente si inviano i dati da una macchina
verso laltra e viceversa.
bus

` una rete che utilizza un canale centrale (detto backbone) per connettere fra
E
loro tutti i dispositivi. Il canale funziona come collettore cui ogni stazione
si collega con un connettore inviandovi tutti i messaggi. Ogni stazione pu`o
osservare tutto il traffico del canale, estraendone i messaggi a lei indirizzati.
` la topologia classica delle vecchie reti Ethernet su BNC,3 ma si ritrova ad
E
esempio nel caso delle connessioni tramite USB. In genere questo tipo di rete
ha il vantaggio della facilit`a di installazione e di bassi costi per gli apparati, che
non devono gestire politiche di distribuzione dei dati, ma `e efficace solo per un
numero limitato di stazioni, in quanto il canale deve distribuire ad ogni nodo
tutto il traffico, compreso quello destinato agli altri, e pu`o essere facilmente
saturato. Inoltre in caso di rottura del canale centrale tutto il traffico di rete `e
totalmente bloccato e lintera rete non `e usabile.

con modem si intende fare riferimento appunto ad un apparato che consente di collegare, appoggiandosi ad
una tecnologia di connessione qualunque, due macchine; il caso pi`
u comune, da cui deriva il nome (abbreviazione
di modulatore-demodulatore) `e quello classico dei modem analogici che usano le linee telefoniche.
2
come quello tramite seriale o tramite porta parallela.
3
fortunatamente ormai totalmente scomparse.

7.1. UNINTRODUZIONE AI CONCETTI FONDAMENTALI DELLE RETI.


ring

393

` una rete in cui ogni stazione ha due stazioni vicine, a loro volta collegate ad
E
unaltra stazione, fino a formare un anello. Ciascuna stazione comunica con
le stazioni limitrofe, ed i messaggi vengono inoltrati lungo lanello per essere
` potenzialmente pi`
ricevuti dalla stazione di destinazione. E
u efficiente della
struttura a bus in quanto non `e necessario che il messaggio attraversi tutto lanello, ma solo la parte necessaria a raggiungere la destinazione. Anche in questo caso per`
o la rottura di un cavo o di una stazione comporta linutilizzabilit`
a
dellintera rete.
Questa topologia di rete, un tempo diffusa anche nella realizzazione di reti locali grazie alla tecnologia denominata token-ring (sviluppata a promossa
dalla IBM), in questo ambito `e oggi sostituita in maniera quasi completa dalle
reti ethernet, ma viene invece utilizzata in maniera abbastanza estesa per i
collegamenti in fibra ottica.

star

` una rete in cui esiste uno snodo centrale, un hub o uno switch,4 cui vengono
E
connesse le varie stazioni. Richiede normalmente una maggiore estensione della
cablatura, ma la rottura di un cavo non interrompe tutta la rete. Inoltre usando
uno switch i pacchetti vengono smistati direttamente dalla stazione di origine
alla destinazione, e non si soffre del problema del collo di bottiglia dovuto alla
necessit`
a di trasmettere tutti i dati ad ogni stazione collegata.
Questa `e la topologia utilizzata dalle versioni recenti delle reti ethernet, ed `e
probabilmente quella pi`
u comune nella realizzazione di reti locali.

tree

` una rete che integra in forma gerarchica pi`


E
u reti a stella. Viene in genere
realizzata connettendo su una backbone o su uno switch centrale diversi hub
o switch periferici. In questo modo si possono aumentare le stazioni collegate
superando i limiti sul numero di dispositivi collegati ad un singolo switch e
limitare la quantit`
a di traffico che deve passare per la backbone.

mesh

` una rete che comporta la presenza di diversi percorsi possibili per la coE
` in genere la modalit`a in cui vengono create le reti WAN, o i
municazione. E
cosiddetti fabric switch, in cui, per ottimizzare la velocit`a di trasmissione, si
effettuano connessioni incrociate fra pi`
u switch, cos` da avere strade diverse per
il flusso dei dati, con un traffico pi`
u distribuito, che permette di comunicare
con latenze inferiori.

7.1.3

I protocolli

Come abbiamo accennato parlare di reti significa parlare di un insieme molto vasto ed eterogeneo
di mezzi di comunicazione che vanno dal cavo telefonico, alla fibra ottica, alle comunicazioni via
satellite o via radio; per rendere possibile la comunicazione attraverso un cos` variegato insieme
di mezzi sono stati adottati una serie di protocolli, il pi`
u famoso dei quali, quello alla base del
funzionamento di Internet, `e il protocollo TCP/IP.
Una caratteristica comune dei protocolli di rete `e il loro essere strutturati in livelli sovrapposti; in questo modo ogni protocollo di un certo livello realizza le sue funzionalit`a basandosi su
un protocollo del livello sottostante. Questo modello di funzionamento `e stato standardizzato
dalla International Standards Organization (ISO) che ha preparato fin dal 1984 il Modello di
Riferimento Open Systems Interconnection (OSI), strutturato in sette livelli, secondo quanto
riportato in tab. 7.1.
4

in realt`
a un hub appartiene a questa topologia solo dal punto di vista delle connessioni fisiche, dato che poi
tutto il traffico viene comunque reinviato a tutte le stazioni connesse.

394

CAPITOLO 7. LAMMINISTRAZIONE DI BASE DELLE RETI


Livello
Livello 7
Livello 6
Livello 5
Livello 4
Livello 3
Livello 2
Livello 1

Nome
Application
Applicazione
Presentation
Presentazione
Session
Sessione
Transport
Trasporto
Network
Rete
DataLink
Collegamento Dati
Physical
Connessione Fisica

Tabella 7.1: I sette livelli del protocollo ISO/OSI.

La definizione di ciascuno di questi livelli `e la seguente:


Applicazione
Il livello di applicazione indica il livello finale in cui un utente interagisce con lapplicazione. Si indicano come esempi di questo livello le applicazioni per luso di telnet e
FTP.
Presentazione
Il livello di presentazione fornisce le funzionalit`a di codifica e conversione dei dati usate
dal successivo livello di applicazione, come la rappresentazione dei caratteri, i formati
dei dati (audio, video, immagini), gli schemi di compressione, la cifratura.
Sessione
Il livello di sessione gestisce, crea e termina sessioni di comunicazione; `e a questo livello
che sono impostati, definiti e sincronizzati gli scambi di dati. Di norma `e qui che sono
definiti i protocolli di funzionamento dei singoli servizi (telnet, FTP, e-mail) che vengono
offerti sulla rete.
Trasporto
Il livello di trasporto fornisce la comunicazione tra le applicazioni che girano sulle
due stazioni terminali; `e sostanzialmente equivalente allomonimo livello del modello
TCP/IP illustrato pi`
u avanti.
Rete

Il livello di rete si occupa dello smistamento dei singoli pacchetti su una rete interconnessa, ed `e a questo livello che si definiscono gli indirizzi di rete che identificano macchine
non in diretto collegamento fisico; `e sostanzialmente equivalente allomonimo livello del
modello TCP/IP illustrato pi`
u avanti.

Collegamento Dati
Il livello di collegamento dati `e quello che fornisce una trasmissione affidabile dei dati
su una connessione fisica. A questo livello si definiscono caratteristiche come lindirizzamento dei dispositivi, la topologia della rete, la sequenza dei pacchetti, il controllo
del flusso e la notifica degli errori sul livello di connessione fisica (cio`e delle singole stazioni collegate direttamente fra loro da una connessione fisica, e non attraverso i livelli
superiori del protocollo).
La IEEE ha diviso questo livello in due ulteriori parti, il Logical Link Control (LLC), definito nello standard IEEE 802.2, che gestisce le comunicazioni fra dispositivi allinterno
di un singolo collegamento in una rete, ed il Media Access Control (MAC) che gestisce
laccesso al mezzo fisico, e consente a dispositivi diversi di identificarsi univocamente in
una rete: a questo livello sono definiti gli indirizzi fisici, detti appunto MAC address,
delle schede di rete che fanno riferimento alla famiglia di protocolli IEEE 802.x.
Connessione fisica
Il livello di connessione fisica si occupa delle caratteristiche materiali (elettriche, fisiche,
meccaniche) e funzionali per attivare, disattivare e mantenere il collegamento fisico

7.1. UNINTRODUZIONE AI CONCETTI FONDAMENTALI DELLE RETI.

395

fra diverse reti di comunicazione. Sono definiti a questo livello caratteristiche come
lampiezza e la temporizzazione dei segnali, il tipo dei connettori, la massima capacit`
a
di trasmissione, le distanze raggiungibili.
Il modello ISO/OSI `e stato sviluppato in corrispondenza alla definizione della serie di protocolli X.25 per la commutazione di pacchetto. Nel frattempo per`o era stato sviluppato un altro
protocollo di comunicazione, il TCP/IP (su cui si basa Internet) che `e diventato uno standard
de facto. Il modello di questultimo, pi`
u semplice, viene chiamato anche modello DoD (sigla che
sta per Department of Defense), dato che fu sviluppato dallagenzia ARPA per il Dipartimento
della Difesa Americano.

Figura 7.1: Confronto fra il modello OSI ed il modello TCP/IP nella loro relazione con il sistema.

Cos` come ISO/OSI anche il modello del TCP/IP `e stato strutturato in livelli (riassunti in
tab. 7.2); un confronto fra i due modelli `e riportato in fig. 7.1, dove viene evidenziata anche la
corrispondenza fra i rispettivi livelli (che comunque `e approssimativa). Si `e indicato in figura
anche fra quali livelli, nel sistema operativo, viene inserita linterfaccia di programmazione (i
cosiddetti socket) per laccesso alla rete.
Livello
Livello 4
Livello 3
Livello 2
Livello 1

Nome
Application
Applicazione
Transport
Trasporto
Network
Rete
Link
Collegamento

Esempi
Telnet, FTP, etc.
TCP, UDP
IP, (ICMP, IGMP)
ethernet, PPP, Wi-Fi

Tabella 7.2: I quattro livelli del protocollo TCP/IP.

Il nome del modello deriva dai due principali protocolli su cui `e basata Internet, il TCP
(Trasmission Control Protocol ) che copre il livello 3, e lIP (Internet Protocol ) che copre il
livello 2. Le funzioni dei vari livelli sono le seguenti:
` relativo ai programmi di interfaccia con la rete, in genere questi vengono reaApplicazione E
lizzati secondo il modello client-server,5 realizzando una comunicazione secondo
un protocollo che `e specifico di ciascuna applicazione.
Trasporto
5

Fornisce la comunicazione tra applicazioni che girano sulle stazioni terminali


su cui girano gli applicativi, regola il flusso delle informazioni, pu`o fornire un

si intende con questo una modalit`


a di comunicazione in cui un programma di richiesta, detto client, interroga
opportunamente un programma di servizio, detto server.

396

CAPITOLO 7. LAMMINISTRAZIONE DI BASE DELLE RETI


trasporto affidabile, cio`e con recupero degli errori o inaffidabile. I protocolli
principali di questo livello sono il TCP e lUDP.

Rete

Si occupa dello smistamento dei singoli pacchetti su una rete complessa e interconnessa, a questo stesso livello operano i protocolli per il reperimento delle
informazioni necessarie allo smistamento, per lo scambio di messaggi di controllo
e per il monitoraggio della rete. Il protocollo su cui si basa questo livello `e IP
(sia nella attuale versione, IPv4, che nella nuova versione, IPv6).

Collegamento
` responsabile per linterfacciamento al dispositivo elettronico che effettua la
E
comunicazione fisica, gestendo linvio e la ricezione dei pacchetti da e verso
lhardware.
Quale dei due modelli usare `e spesso una questione di gusti; il modello ISO/OSI `e pi`
u
teorico e generale, il modello TCP/IP `e pi`
u legato alla struttura con cui la gestione della rete `e
implementata in un sistema GNU/Linux. Per questo motivo, e data la sua maggiore semplicit`a,
nel resto delle dispense faremo riferimento solo a questultimo.

Figura 7.2: Strutturazione del flusso dei dati nella comunicazione fra due applicazioni attraverso i protocolli
della suite TCP/IP.

Per cercare di capire meglio le ragioni di tutta questa suddivisione in livelli consideriamo
unanalogia con quanto avviene nella spedizione di una lettera per posta aerea in America. Voi
scrivete la vostra bella lettera su un foglio, che mettete in una busta con lindirizzo che poi
imbucate. Il postino la raccoglier`
a dalla buca delle lettere per portarla al centro di smistamento,

7.2. IL TCP/IP.

397

dove in base alla sua destinazione sar`a impacchettata insieme a tutte quelle che devono essere
inviate per posta aerea, e mandata al successivo centro di raccolta. Qui sar`a reimpacchettata
insieme a quelle provenienti dagli altri centri di smistamento ed imbarcata sullaereo. Una volta
scaricate in America le varie lettere saranno spacchettate e reimpacchettate per lo smistamento
verso la destinazione finale. Qui un altro postino prender`a la vostra e la metter`a nella cassetta
della posta del vostro destinatario, il quale la aprir`a e legger`a quello che gli avete scritto.
Questo `e molto simile a quello che succede quando volete spedire dei dati via rete, secondo il
procedimento che `e illustrato in fig. 7.2. Ad ogni passaggio attraverso un livello del protocollo al
nostro pacchetto di dati viene aggiunta una intestazione relativa al protocollo utilizzato in quel
livello, si dice cio`e che un pacchetto di un protocollo viene imbustato nel protocollo successivo.
A differenza della posta in questo caso i pacchetti con i dati non vengono disfatti ad ogni livello
per passare in un pacchetto diverso, ma vengono reimbustati pari pari al livello successivo, i vari
pacchetti vengono disfatti (e la relativa intestazione rimossa) solo quando si torna indietro ad
un livello superiore.
Questo meccanismo fa si che il pacchetto ricevuto ad un livello n dalla stazione di destinazione
sia esattamente lo stesso spedito dal livello n dalla stazione sorgente. Tutto ci`o rende facile il
progettare il software in maniera modulare facendo riferimento unicamente a quanto necessario
ad un singolo livello, con la confidenza che questo poi sar`a trattato uniformemente da tutti i
nodi della rete.

7.2

Il TCP/IP.

Come accennato in sez. 7.1.3 negli anni sono stati creati molti tipi diversi di protocolli per la
comunicazione via rete, in queste dispense per`o prenderemo in esame soltanto il caso di reti
basate su TCP/IP, il protocollo6 pi`
u diffuso, quello su cui si basa Internet, e che ormai `e diventato uno standard universale e disponibile su qualunque sistema operativo. In questa sezione
ci limiteremo ad introdurre i concetti fondamentali delle reti IP, la notazione e le terminologie
principali.

7.2.1

Introduzione.

Dato che il protocollo `e nato su macchine Unix, il TCP/IP `e la modalit`a di comunicazione nativa
di GNU/Linux, e benche per compatibilit`a siano stati implementati nel kernel anche parecchi
altri protocolli di comunicazione (come DECnet, AppleTalk, IPX), questo resta il principale ed
il pi`
u usato.
Come illustrato in sez. 7.1.3 linsieme di protocolli che costituisce il TCP/IP `e strutturato,
secondo lomonimo modello, su 4 livelli; a ciascuno di essi corrisponde un particolare compito,
svolto da uno (o pi`
u) protocolli specifici. In fig. 7.3 si `e riportata una panoramica dei principali
protocolli che costituiscono il TCP/IP e come questi vengono suddivisi nei quattro livelli illustrati
in precedenza.
Linterfaccia fondamentale usata dal sistema operativo per la comunicazione in rete `e quella
dei cosiddetti socket, nata nel 1983 a Berkeley e resa pubblica con il rilascio di BSD 4.2. La flessibilit`a e la genericit`
a dellinterfaccia consente di utilizzare i socket con i pi`
u disparati meccanismi
di comunicazione, e non solo con linsieme dei protocolli TCP/IP.
Con i socket infatti si pu`
o creare un canale di comunicazione fra due stazioni remote, sul quale
inviare i dati direttamente, senza doversi preoccupare di tutto il procedimento di passaggio da
un livello allaltro che viene eseguito dal kernel. Tutte le applicazioni che forniscono i principali
servizi su Internet (pagine WEB, posta elettronica, connessione remota) sono realizzati a livello
6

in realt`
a non si tratta di un solo protocollo, ma di una suite in cui sono inseriti vari protocolli, in modo da
coprire in maniera sostanzialmente completa le pi`
u varie esigenze di comunicazione.

398

CAPITOLO 7. LAMMINISTRAZIONE DI BASE DELLE RETI

Figura 7.3: Panoramica sui vari protocolli che compongono la suite TCP/IP.

di applicazione usando questa interfaccia. Solo per applicazioni specialistiche per il controllo
della rete il kernel mette a disposizione delle ulteriori interfacce che permettono di accedere
direttamente ai livelli inferiori del protocollo.
Come mostrato in fig. 7.2 i socket fanno da ponte fra il livello di applicazione e quello
di trasporto; una volta inviati su un socket i dati vengono passati (dal kernel) ad uno dei
protocolli del livello di trasporto, che sono quelli che si curano di trasmettere i dati dallorigine
alla destinazione, secondo le modalit`
a specificate dal tipo di socket scelto. Cos` se si `e usato uno
stream socket basato sul TCP questultimo si curer`a di stabilire la connessione con la macchina
remota e garantire laffidabilit`
a della comunicazione controllando eventuali errori, ritrasmettendo
i pacchetti persi e scartando quelli duplicati.7
Al livello successivo sar`
a poi IP che curer`a linvio dei singoli pacchetti sulla rete, ed `e su questo
livello che operano i vari dispositivi che su Internet consentono lo smistamento dei pacchetti fino
` a questo livello che sono definiti gli indirizzi IP che identificano
alla loro destinazione finale. E
ogni macchina sulla rete.
Il livello finale `e quello dellinterfaccia di rete usata per trasmettere i pacchetti verso lesterno,
che a seconda dei casi pu`
o essere una scheda ethernet o linterfaccia associata al modem; questo si
incaricher`a di trasmettere i dati sulla rete fisica che connette la macchina allesterno (sia questa
una rete locale o Internet) utilizzando anche qui gli opportuni protocolli di comunicazione.
In fig. 7.3 si sono riportati i protocolli principali che costituiscono il TCP/IP. In queste
dispense copriremo solo quelli di utilit`
a pi`
u comune; una breve descrizione di quelli riportati in
figura `e comunque la seguente:
IPv4
7

` quello che comunemente si chiama IP. Ha origine negli


Internet Protocol version 4. E
anni 80 e da allora `e la base su cui `e costruita Internet. Usa indirizzi a 32 bit, e

in questo caso dal punto di vista dellutente la trasmissione dei dati `e pi`
u simile ad un collegamento telefonico
che ad un invio di lettere. Useremo questa ed altre analogie nel seguito, ma si deve essere consapevoli che nessuna
di esse `e mai perfettamente congruente con il comportamento effettivo della rete.

7.2. IL TCP/IP.

399

mantiene tutte le informazioni di instradamento e controllo per la trasmissione dei


pacchetti sulla rete; tutti gli altri protocolli della suite (eccetto ARP e RARP, e quelli
specifici di IPv6) vengono trasmessi attraverso di esso.
IPv6

` stato progettato a met`a degli anni 90 per rimpiazzare


Internet Protocol version 6. E
IPv4. Ha uno spazio di indirizzi ampliato a 128 bit che consente pi`
u gerarchie di
indirizzi, lautoconfigurazione, ed un nuovo tipo di indirizzi, gli anycast, che consentono di inviare un pacchetto ad una stazione su un certo gruppo. Effettua lo stesso
servizio di trasmissione dei pacchetti di IPv4 di cui vuole essere un sostituto.

TCP

` un protocollo di trasporto orientato alla connessioTrasmission Control Protocol. E


ne che provvede un trasporto affidabile per un flusso di dati bidirezionale fra due
stazioni remote. Il protocollo ha cura di tutti gli aspetti del trasporto, come lack` usato dalla maggior parte delle
noweledgment, i timeout, la ritrasmissione, ecc. E
applicazioni.

UDP

` un protocollo di trasporto senza connessione, per linvio


User Datagram Protocol. E
di dati a pacchetti. Contrariamente al TCP il protocollo non `e affidabile e non
c`e garanzia che i pacchetti raggiungano la loro destinazione, si perdano, vengano
duplicati, o abbiano un particolare ordine di arrivo.

ICMP

` il protocollo usato a livello di rete per gestire


Internet Control Message Protocol. E
gli errori e trasportare le informazioni di controllo fra stazioni remote e instradatori
(cio`e fra host e router ). I messaggi sono normalmente generati dal software del kernel
che gestisce la comunicazione TCP/IP, anche se ICMP pu`o venire usato direttamente
da alcuni programmi come ping. A volte ci si riferisce ad esso come ICPMv4 per
distinguerlo da ICMPv6.

IGMP

` un protocollo di livello di rete usato per


Internet Group Management Protocol. E
il multicasting. Permette alle stazioni remote di notificare ai router che supportano questa comunicazione a quale gruppo esse appartengono. Come ICMP viene
implementato direttamente sopra IP.

DHCP

` un protocollo (vedi sez. 8.2.1) che permette


Dinamic Host Configuration Protocol. E
di inviare informazioni di inizializzazione alle stazioni presenti in una LAN, come
indirizzo IP, indirizzi di gateway e server DNS, file per il boot via rete, ecc.

ARP

` il protocollo che mappa un indirizzo IP in un indirizzo


Address Resolution Protocol. E
fisico sulla rete locale. Viene usato per le reti di tipo broadcast (come Ethernet, Token
Ring o FDDI) in cui pi`
u stazioni si affacciano sulla stessa rete, e a ciascuna interfaccia
di rete viene associato un indirizzo fisico (il cosiddetto MAC address) che permette
di identificarla per fargli arrivare i dati; torneremo su di esso in sez. 7.6.4. Non serve
in connessioni punto-punto.

RARP

` il protocollo che esegue loperazione inversa


Reverse Address Resolution Protocol. E
rispetto ad ARP (da cui il nome) mappando un indirizzo hardware in un indirizzo
IP. Veniva usato per assegnare un indirizzo IP ad una macchina al suo avvio.8

ICMPv6 Internet Control Message Protocol, version 6. Combina per IPv6 le funzionalit`
a di
ICMPv4, IGMP e ARP.
8

`e stato sostituito da altri protocolli specifici dedicati a questo, vedi sez. 8.2.1.

400

CAPITOLO 7. LAMMINISTRAZIONE DI BASE DELLE RETI

EGP

` un protocollo di instradamento usato per comunicare lo


Exterior Gateway Protocol. E
stato fra gateway vicini a livello di sistemi autonomi 9 , con meccanismi che permettono
di identificare i vicini, controllarne la raggiungibilit`a e scambiare informazioni sullo
stato della rete. Viene implementato direttamente sopra IP.

OSPF

` in protocollo di instradamento per router su reti interne,


Open Shortest Path First. E
che permette a questi ultimi di scambiarsi informazioni sullo stato delle connessioni
e dei legami che ciascuno ha con gli altri. Viene implementato direttamente sopra
IP.

GRE

` un protocollo generico di incapsulamento che


Generic Routing Encapsulation. E
permette di incapsulare un qualunque altro protocollo allinterno di IP.

AH

Authentication Header. Fornisce lautenticazione dellintegrit`a e dellorigine di un


` una opzione nativa in IPv6 e viene implementato come protocollo
pacchetto IP. E
a se su IPv4. Fa parte della suite di IPSEC che provvede la trasmissione cifrata ed
autenticata a livello IP.

ESP

Encapsulating Security Payload. Provvede la cifratura insieme allautenticazione dellintegrit`


a e dellorigine di un pacchetto IP. Come per AH `e opzione nativa in IPv6 e
viene implementato come protocollo a se su IPv4. Anchesso fa parte di IPSEC.

PPP

` un protocollo di livello di collegamento progettato per


Point-to-Point Protocol. E
lo scambio di pacchetti su connessioni punto-punto. Viene usato per configurare i
`
collegamenti, definire i protocolli di rete usati ed incapsulare i pacchetti di dati. E
un protocollo complesso con varie componenti.

SLIP

` un protocollo di livello di collegamento che permette di


Serial Line over IP. E
trasmettere un pacchetto IP attraverso una linea seriale.

7.2.2

Gli indirizzi IP

Per poter comunicare fra loro due computer in rete devono potersi in qualche modo riconoscere.
Gli indirizzi IP, definiti dallInternet Protocol visto in sez. 7.1.3, svolgono esattamente questo
ruolo, che `e analogo a quello del numero di telefono o dellindirizzo di una casa. Essi devono
identificare univocamente un nodo della rete.
Lanalogia pi`
u diretta `e quella con il telefono; per poter telefonare occorre avere un numero
di telefono e conoscere quello di chi si vuole chiamare. Lindirizzo IP `e lequivalente del numero
di telefono, solo che invece che di un numero decimale composto di un numero variabile di cifre
`e un numero binario (quindi espresso con soli 0 e 1) ed ha una dimensione fissa di quattro byte.
Come per i telefoni ad un numero pu`
o corrispondere solo un telefono, ma normalmente ad un
telefono non possono essere associati pi`
u numeri, vedremo pi`
u avanti invece come ad uno stesso
computer (o a una stessa interfaccia di rete) possono essere assegnati pi`
u indirizzi IP.
Di solito, visto che scrivere i numeri in formato binario `e poco comprensibile, si `e soliti
esprimere il numero che costituisce lindirizzo IP usando una apposita notazione che viene chiamata dotted decimal, usando un numero decimale per ciascuno dei quattro byte che compongono
lindirizzo, separati da un punto; un esempio di questa notazione potrebbe essere qualcosa del
` attraverso questo numero il vostro computer viene identificato
tipo di 192.168.111.11. E
univocamente su Internet.
Come per il telefono di casa ogni computer connesso ad Internet viene sempre considerato
come facente parte di una rete; la cosa `e vera anche per le reti private non connesse direttamente
9

vengono chiamati autonomous systems i raggruppamenti al livello pi`


u alto della rete.

7.2. IL TCP/IP.

401

ad Internet (come quelle che collegano i computer di un ufficio). Per proseguire nellanalogia si
pensi alle linee telefoniche interne di una ditta, usate per parlare allinterno degli uffici.
Dato che Internet, come dice il nome, `e un insieme di reti, anche queste devono venire identificate. Questo `e fatto attraverso altrettanti indirizzi IP, che corrispondono alla parte comune
di tutti gli indirizzi delle macchine sulla stessa rete. Per proseguire nellanalogia con il telefono
si pu`o pensare allindirizzo di rete come al prefisso che serve per parlare con un altra citt`a o un
altro stato, e che `e lo stesso per tutti i telefoni di quellarea.
La differenza con i prefissi `e che un indirizzo di rete IP, quando lo si scrive, deve essere
completato da tanti zeri quanti sono necessari a raggiungere la dimensione di 32 bit degli indirizzi
normali; per riprendere il precedente esempio di indirizzo IP, un possibile indirizzo di rete ad
esso relativo potrebbe essere 192.168.111.0.
Questo meccanismo significa in realt`a che ogni indirizzo su Internet, pur essendo espresso
sempre come un singolo numero, nei fatti `e composto da due parti, lindirizzo di rete, che prende
la parte superiore dellindirizzo e identifica la particolare sezione di Internet su cui si trova
la vostra rete e lindirizzo della stazione (il cosiddetto host), che prende la parte inferiore del
numero e che identifica la macchina allinterno della vostra rete.
La situazione dunque `e ancora analoga a quella di un numero di telefono che `e diviso in
prefisso e numero locale. Un prefisso `e lequivalente dellindirizzo di rete, lindirizzo IP completo
`e quello che identifica il singolo telefono, solo che in questo caso il numero di cifre (binarie) che
si usano per il prefisso non `e fisso, e pu`o anche essere cambiato a seconda dei casi.
Per questo motivo, quando si configura una macchina, ad ogni indirizzo IP si associa sempre
anche quella che viene chiamata una netmask : una maschera binaria che permette di dire quali
bit dellindirizzo sono usati per identificare la rete e quali per il nodo. Questa viene espressa con
la solita notazione dotted decimal, usando il numero binario costruito mettendo un 1 ad ogni bit
dellindirizzo corrispondente alla rete e uno zero a quello corrispondente alla stazione: nel caso
dellindirizzo in esempio si avrebbe allora una netmask uguale a 255.255.255.0.
Lassegnazione degli indirizzi IP `e gestita a livello internazionale dalla IANA (Internet Assigned Number Authority), che ha delegato la gestione di parte delle assegnazioni ad altre organizzazioni regionali (come INTERNIC, RIPE NCC e APNIC). Originariamente, per venire incontro
alle diverse esigenze, gli indirizzi di rete erano stati organizzati in classi, (riportate tab. 7.3), per
consentire dispiegamenti di reti di dimensioni diverse.
Classe
A
B
C
D
E

0.0.0.0
128.0.0.0
192.0.0.0
224.0.0.0
240.0.0.0

Intervallo
127.255.255.255
191.255.255.255
223.255.255.255
239.255.255.255
247.255.255.255

Netmask
255.0.0.0
255.255.0.0
255.255.255.0
240.0.0.0

Tabella 7.3: Le classi di indirizzi IP.

Le classi usate per il dispiegamento delle reti di cui `e attualmente composta Internet sono le
prime tre; la classe D `e destinata allancora non molto usato multicast,10 , mentre la classe E `e
riservata per usi sperimentali e non viene impiegata. Oggigiorno questa divisione in classi non `e
pi`
u molto usata (perche come vedremo fra poco `e inefficiente), ma la si trova riportata spesso,
ed alcuni programmi cercano di calcolare automaticamente la netmask a seconda dellIP che gli
date, seguendo queste tabelle.11
10

il multicast `e una modalit`


a di comunicazione per consentire la spedizione simultanea di uno stesso pacchetto
IP da una stazione singola, che lo emette una volta sola, verso pi`
u stazioni riceventi; ottimizzando quindi la
trasmissione dati da uno verso molti; per utilizzare questa comunicazione occorre operare su uno di questi indirizzi.
11
e questo alle volte pu`
o creare problemi, dato che non `e detto che la rete in questione sia ancora classificabile
in questo modo.

402

CAPITOLO 7. LAMMINISTRAZIONE DI BASE DELLE RETI

Una rete di classe A `e una rete che comprende 16777216 (cio`e 224 ) indirizzi di singoli computer
ed ha una netmask pari a 255.0.0.0, una rete di classe B comprende 65536 (cio`e 216 ) indirizzi
ed ha una netmask pari a 255.255.0.0 e una rete di classe C comprende 256 (cio`e 28 ) indirizzi
ed ha una netmask pari a 255.255.255.0.

CIDR

n bit

32 n bit

net Id

host Id

Tabella 7.4: Uno esempio di indirizzamento CIDR.

La suddivisione riportata in tab. 7.3 `e largamente inefficiente in quanto se un utente necessita


di anche solo un indirizzo in pi`
u dei 256 disponibili12 con una classe C occorre passare a una
classe B, con un conseguente enorme spreco di numeri (si passerebbe da 256 a 65536).
Per questo nel 1992 `e stato introdotto un indirizzamento senza classi (detto CIDR) in cui il
limite fra i bit destinati a indicare lindirizzo di rete e quelli destinati a indicare lhost finale pu`o
essere piazzato in qualunque punto dei 32 bit totali (vedi tab. 7.4), permettendo cos` di accorpare
` stata cos` introdotta anche una nuova
pi`
u classi C su ununica rete o suddividere una classe B. E
notazione, che permette di indicare la parte di rete appendendo allindirizzo lindicazione del
numero di bit riservati alla rete; nel caso in esempio si avrebbe allora 192.168.111.11/24.
Oltre alla comunicazione fra due singoli nodi della rete, quella descritta finora con lanalogia
telefonica, su Internet `e possibile unaltra modalit`a di comunicazione, detta broadcast. In questo
caso `e un singolo nodo che pu`
o inviare pacchetti che saranno ricevuti da tutti gli altri nodi
presenti nella sua stessa rete; questa modalit`a di comunicazione `e analoga alla trasmissione via
radio, da cui deriva il nome (in inglese).
Per permettere questo tipo di comunicazione su ogni rete, oltre agli indirizzi dei singoli nodi
ed a quello della rete stessa, `e necessario disporre di un indirizzo riservato, che viene chiamato
appunto indirizzo di broadcast. Questo per convenzione `e sempre ottenuto mettendo ad 1 tutti i
` questo indirizzo che deve essere utilizzato
bit della porzione dellindirizzo IP riservata allhost. E
da una singola stazione quando vuole inviare un messaggio contemporaneamente a tutti gli altri
nodi presenti su quella rete.13
La presenza di un indirizzo di broadcast permette il funzionamento di una serie di protocolli
ausiliari del TCP/IP che devono poter scambiare e ricevere informazione con tutti i computer
presenti (ad esempio quelli che permettono di scoprire quali sono gli indirizzi realmente attivi),
senza doversi indirizzare a ciascuno di essi individualmente.
Indirizzo
Indirizzo completo
Maschera di rete
Porzione di rete
Porzione del nodo
Indirizzo di rete
Indirizzo broadcast

Esempio
192.168.111.11
255.255.255.0
192.168.111.
.11
192.168.111.0
192.168.111.255

Tabella 7.5: Specchietto riassuntivo della struttura degli indirizzi IP.

In tab. 7.5 si `e riassunta la struttura generica di un indirizzo IP allinterno di una rete,


con tutte le tipologie di indirizzi, ed i vari valori numerici che possono essere richiesti nella
configurazione di una interfaccia di rete per luso di un indirizzo IP.
12

in realt`
a gli indirizzi disponibili con una classe C sono 254, questo perche lindirizzo .0 `e riservato per indicare
la rete, mentre lindirizzo .255, come vedremo fra poco, `e quello di broadcast; questi indirizzi sono riservati per
ogni rete e non possono essere usati per un singolo host.
13
questo permette di usare direttamente le capacit`
a di alcune interfacce di rete che supportano questa modalit`
a
di comunicazione.

7.2. IL TCP/IP.

403

Nella assegnazione di un indirizzo IP occorre tenere conto che alcuni indirizzi sono riservati
e non possono essere utilizzati su Internet. Ad esempio dalla classe A `e stata rimossa lintera
rete 127.0.0.0 che viene associata alla speciale interfaccia di rete detta loopback.14 Si tratta di
una interfaccia assolutamente virtuale che effettua la comunicazione localmente facendo passare
i pacchetti attraverso il kernel per farli comparire sulla stessa interfaccia (da cui il suo nome);
`e convenzione seguita universalmente associare a questa interfaccia lindirizzo 127.0.0.1, il
localhost, che viene utilizzato per comunicare, senza usare fisicamente la rete, quando un programma che usa i socket TCP/IP deve fare riferimento ad un altro programma che gira sulla
stessa macchina.
Un altro indirizzo speciale `e lindirizzo nullo, 0.0.0.0, che viene usato per indicare un indirizzo generico non specificato. Lo si usa anche per indicare linsieme di tutti gli indirizzi possibili,15
e per questo viene anche usato per indicare la cosiddetta default route, cio`e la destinazione verso
cui inviare tutti i pacchetti con una destinazione al di fuori della rete locale.
Classe
A
B
C

Intervallo
10.0.0.0 10.255.255.255
172.16.0.0 172.31.255.255
192.168.0.0 192.168.255.255

Tabella 7.6: Le classi di indirizzi IP riservate per le reti private.

Infine lRFC 1918 riserva una serie di indirizzi per le cosiddette reti private, cio`e per le reti
interne ad una organizzazione che non devono mai essere connesse direttamente ad Internet;16
si tratta di una rete di classe A, 16 reti di classe B e 256 reti di classe C; i loro indirizzi sono
riportati in tab. 7.6.

7.2.3

Linstradamento o routing

Lidentificazione di un nodo sulla rete effettuata tramite lindirizzo IP `e solo il primo passo per
poter stabilire effettivamente una comunicazione. Una volta che si sappia la destinazione finale
infatti, occorre sapere anche come poterci arrivare. Il lavoro di smistamento e reindirizzamento
verso la loro destinazione finale dei pacchetti di dati che vengono trasmessi via rete `e quello che
in termini tecnici viene chiamato instradamento, in inglese routing.
Il routing `e uno degli argomenti pi`
u complessi delle tecnologie di rete, ma qui lo tratteremo
soltanto nei suoi aspetti pi`
u elementari. In generale il problema si pu`o dividere in due: nella
parte relativa alla propria rete locale, ed in quello che succede una volta usciti da essa.
Il funzionamento del routing per la trasmissione dei pacchetti su Internet comporta una serie
di problematiche estremamente complesse, per cui ci limiteremo ad una semplice descrizione
funzionale, ma dal punto di vista di una rete locale tutto si riduce al problema di come fare
arrivare allesterno i pacchetti che escono dai singoli computer in essa presenti.
In questo caso si pu`
o ancora fare riferimento allanalogia telefonica: si pu`o pensare alla
propria rete locale come alla rete telefonica interna di una ditta; per poter uscire e telefonare
allesterno occorre in qualche modo passare dal centralino. Su Internet le macchine che fanno
da centralino e permettono il collegamento di reti diverse smistando fra di esse i pacchetti loro
destinati sono dette router.
In una rete locale il ruolo del centralino `e svolto dal cosiddetto default gateway, questa `e
la macchina che nella vostra rete fa da ponte verso lesterno. Tutte le telefonate dirette fuori
14

`e quella indicata dalla sigla lo, interna al singolo nodo, che serve per spedire pacchetti a se stessi.
ed in effetti se lo si prende come indirizzo di rete corrisponde appunto alla rete che ha come host tutti i
possibili indirizzi, e cio`e Internet.
16
per connesse direttamente si intende rese direttamente parte di Internet assegnando alle macchine ivi presenti
degli IP pubblici, esse possono essere connesse, attraverso luso del cosiddetto NAT Network Address Translation,
ma solo per consentire un accesso verso Internet, e non viceversa.
15

404

CAPITOLO 7. LAMMINISTRAZIONE DI BASE DELLE RETI

(cio`e tutti i pacchetti di dati che devono uscire dalla rete locale per andare su Internet) devono
passare da questa macchina; per questo quando installate una macchina in una rete locale dovete
sempre sapere lindirizzo del default gateway.
La differenza coi numeri telefonici sta per`o nel fatto che lindicazione di usare un centralino
non si pu`o inserire allinterno del numero che si compone (ad esempio mettendo un 0 o un 1
allinizio dello stesso), ma in questo caso deve essere proprio specificato il numero completo della
macchina che fa da ponte, che anchessa avr`a un suo indirizzo IP. Unaltra differenza `e che con
il TCP/IP quando si deve far arrivare un pacchetto da una rete ad un altra, anche se non si
dovesse uscire su Internet (ad esempio due reti interne diverse), deve essere sempre utilizzato un
gateway, cio`e una macchina che possa fare da cancello di ingresso per i pacchetti destinati a
quella rete.
Una volta usciti dalla rete locale la situazione si complica molto, ed in questo caso lanalogia
telefonica non ci aiuta, perche il collegamento telefonico nasce a commutazione di linea, cio`e per
realizzarlo si mettevano effettivamente in collegamento elettrico i due telefoni con una serie di
selettori, mentre Internet `e progettata per funzionare a commutazione di pacchetto, cio`e non
esiste mai una connessione diretta fra due nodi, anche se poi i programmi usano delle funzionalit`a
che permettono di lavorare come se le cose fossero effettivamente cos`. In questo caso infatti i
dati inviati vengono spezzati in pacchetti e passati da un nodo della rete allaltro fino ad arrivare
alla loro destinazione finale, dove vengono riassemblati.
Per questo, come dice poi lo stesso nome di instradamento, unanalogia che illustra pi`
u
chiaramente i concetti del routing `e quella delle reti stradali. Ad esempio quando lavoravo per
lINFN mi capitava spesso di dover andare al CERN. Per farlo prendevo lautostrada a Firenze
Sud, a Firenze Nord cambiavo sulla Firenze Mare, uscendo a Lucca per fare il raccordo per
prendere lautostrada per Genova, da Genova proseguivo per Alessandria, cambiavo di nuovo
per Torino, dove fatta la circonvallazione prendevo lautostrada per il traforo del Monte Bianco.
Da l` il raccordo porta sullautostrada per Ginevra, nella cui periferia sono i laboratori del CERN.
Come vedete si tratta di un bel percorso complicato, che comporta il passaggio da diversi
caselli; ora quando inviate un pacchetto su Internet succede qualcosa di simile, e anche lui
deve passare attraverso dei caselli. Quello che succede ad esempio quando vi collegate con
un modem e iniziate a chattare con qualcunaltro, o spedite un pacchetto fuori dal gateway
della vostra rete locale, `e che i pacchetti che escono dal vostro computer vengono inviati al router
(lequivalente del casello) del vostro provider; da li prenderanno la strada opportuna per arrivare
al router del provider a cui `e collegato il computer del vostro interlocutore, che li mander`a a lui.
In tutto questo percorso i pacchetti passeranno per una serie di altri router che sanno che
strada devono prendere i pacchetti per poter arrivare alla destinazione finale. La differenza fra i
caselli ed i router `e che questi ultimi sanno indicare da soli ai pacchetti la strada su cui devono
andare per arrivare a destinazione. In realt`a sono ancora pi`
u intelligenti, e sono in grado di
far prendere ai pacchetti la strada pi`
u veloce, tenendo conto di eventuali ingorghi, incidenti,
interruzioni del traffico ecc. Cos` se il tunnel del Monte Bianco viene chiuso, quando arrivate a
Torino il router vi far`
a dirottare per il Frejus.

7.2.4

I servizi e le porte.

Finora abbiamo parlato quasi esclusivamente di indirizzi IP; come accennato nellintroduzione (si
ricordi quanto detto in sez. 7.1.3) Internet Protocol `e solo uno dei protocolli di Internet, e copre
soltanto il livello di rete. Abbiamo gi`
a visto che per poter effettuare delle comunicazioni fra loro
i programmi devono poter creare delle connessioni, e per far questo si deve usare linterfaccia
dei socket, che sono basati sui protocolli del livello di trasporto, come TCP ed UDP.
Occorre perci`
o introdurre unaltra delle caratteristiche del protocollo TCP/IP, relativa stavolta al livello di trasporto, senza comprendere la quale mancherebbero le basi per poter spiegare
il funzionamento di questultimo: quella delle porte. Anche in questo caso lanalogia telefonica ci

7.2. IL TCP/IP.

405

viene, sia pure in maniera molto parziale, in aiuto. Finora infatti abbiamo parlato degli indirizzi
IP come se fossero dei numeri di telefono, ma questo riguarda solo la parte del protocollo che
viene usato per effettuare la trasmissione fra due computer, e cio`e il protocollo IP.
Allora come su un numero di telefono pu`o rispondere una persona (se solleva la cornetta), una
segreteria telefonica, un fax, o un altro computer (se c`e attaccato un modem), lo stesso accade
anche per Internet; su un indirizzo IP possono in realt`a rispondere diversi servizi, corrispondenti
a forme di comunicazione diversa.
Lanalogia usata `e molto debole perche di solito per fare ognuno di questi compiti ci vogliono
apparecchi diversi (anche se talvolta si trovano oggetti che assommano pi`
u di uno di essi). Per
questo in realt`
a si potrebbe pensare alle porte come ai canali della filodiffusione,17 cio`e a delle
specie di frequenze diverse su cui sintonizzate il vostro telefono, sulle quali trovate i contenuti
pi`
u diversi.
In realt`
a non `e neanche cos`, perche nel caso della filodiffusione il segnale non viene da
un altro telefono, ma dal fornitore del servizio telefonico, potete solo ascoltare, ed un canale
alla volta, mentre con Internet potete sia ascoltare che trasmettere, da e verso qualunque altro
telefono e su quanti canali volete18 in contemporanea.
Questo avviene perche, come spiegato, TCP/IP `e un insieme di protocolli, ed IP (quello
degli indirizzi) serve solo a gestire la trasmissione dei pacchetti attraverso una rete. Per poter
effettuare uno scambio di dati fra due programmi che comunicano via rete, occorre una modalit`
a
per stabilire un canale di comunicazione che permetta di andare pi`
u in l`a di quanto si fa con
IP, che serve solo ad inviare pacchetti da un computer allaltro, e non da una applicazione ad
unaltra.
` per questo motivo che nei protocolli del livello di trasporto, come UDP e TCP, `e stato
E
introdotto il concetto delle porte, cio`e un numero ulteriore (oltre a quello dellindirizzo) che
permetta di identificare le due applicazioni che stanno usando il protocollo. In questo modo
diventa possibile gestire pi`
u connessioni19 contemporanee tra le stesse macchine (destinate a
servizi diversi o provenienti da applicazione diverse) e tenere separati i pacchetti ad esse relative.
Cos` quando si vuole inviare della posta elettronica si comunicher`a con il servizio di spedizione
utilizzando una di queste porte, mentre quando si vuole leggere una pagina web se ne user`
a
unaltra, effettuando con il programma che si contatta uno scambio di dati specifico che va a
costituire lultimo livello della struttura mostrata in fig. 7.1, quello di applicazione.
Si tenga conto per`
o che il concetto di porta `e spesso fuorviante, in quanto con porta si intende
una qualche forma di accesso permanente che pu`o essere aperto o chiuso. In realt`a non esiste
nessuna forma di accesso permanente e lo scambio di dati avviene solo se si hanno da ambo le
parti (il server ed il client) gli strumenti per effettuarlo;20 per questo sarebbe pi`
u chiaro parlare
di frequenza, su cui si pu`
o trasmettere o ascoltare, ed in cui ciascuno pu`o essere la trasmittente
(il server) o il ricevente (il client) o anche entrambi allo stesso tempo (ad esempio nei sistemi
peer to peer ).
Bussando ad una porta (o sintonizzandosi su quella frequenza a seconda dellanalogia che
si preferisce) si potranno scambiare, attraverso lopportuno protocollo di applicazione, i dati
relativi al servizio associato. Dal punto di vista del TCP/IP si potrebbe usare un numero di
porta qualsiasi, ma la standardizzazione ha portato ad associare alcuni numeri a dei servizi
specifici (la porta 25 alla posta elettronica, la porta 80 al web, ecc.).
17
per chi non ha idea di che cosa sia, si tratta di una specie di radio via telefono, usata per trasmettere musica
quando le radio avevano una pessima qualit`
a, ma che oggi non esiste praticamente pi`
u.
18
in realt`
a teoricamente lo si pu`
o fare fino ad un numero massimo di 65535 porte, pari a 216 1 connessioni per
singolo indirizzo IP.
19
per UDP `e pi`
u corretto parlare di canali di comunicazione, in quanto non c`e una connessione come nel caso
del TCP, il quale, oltre allinvio dei pacchetti, permette anche di assicurare una comunicazione affidabile.
20
per questo non sar`
a mai possibile sfondare una porta sul vostro computer, se su di essa non c`e un server a
ricevere i dati, cos` come non possono spaccarvi i timpani urlando alla radio, se `e spenta.

406

CAPITOLO 7. LAMMINISTRAZIONE DI BASE DELLE RETI

In un sistema Unix le prime 1024 porte sono dette riservate in quanto solo lamministratore
pu`o mettervi in ascolto dei servizi; la corrispondenza fra queste porte ed i servizi che ci devono
essere installati `e regolata a livello internazionale: nessuno vi obbliga a rispettare la convenzione,
ma se mettete la posta elettronica sulla porta 80 e il web sulla 25 avrete certamente delle grosse
difficolt`a a comunicare con gli altri, dato che in genere i browser cercano i siti sulla porta 80, la
posta viene inviata usando la porta 25.
Al di sopra della porta 1024 qualunque utente pu`o mettere un suo servizio, avviando un
demone che si metta in ascolto su una porta qualunque. Alcune di queste per`o sono state usate
tradizionalmente da servizi molto diffusi, per cui in certi casi si potrebbero avere dei conflitti;
come vedremo in sez. 7.4.4 c`e un elenco che associa i numeri di porta ai servizi che li utilizzano,
che viene mantenuto nel file /etc/services.
Inoltre si ricordi che come c`e una porta per contattare il server sulla macchina di destinazione, si deve avere anche una porta che identifichi il programma client che ha eseguito la
connessione sulla macchina sorgente. Questo perche se si lanciasse due volte un browser per
leggere lo stesso sito si avrebbe una situazione in cui si contatta un server web a partire dallo
stesso IP sorgente e verso lo stesso IP e la stessa porta di destinazione; ma il kernel deve essere
in grado di poter separare i pacchetti di risposta alle due istanze del browser (che potranno leggere pagine diverse) e per questo dovranno essere usate da ciascuna istanza delle porte sorgenti
diverse.
Questo significa che nella comunicazione sul livello di trasporto (sia con TCP che con UDP)
ogni client invier`
a i suoi pacchetti di richiesta e ricever`a i pacchetti di risposta dal server utilizzando una porta specifica, che viene appunto chiamata porta sorgente. La differenza fra questa
porta e quelle usate per i servizi noti su cui ascoltano i server (che nella comunicazione sono
identificate come porta destinazione) `e che in genere una porta sorgente viene assegnata automaticamente dal kernel quando il client crea la connessione; per questo motivo viene chiamata
anche porta effimera (o ephemeral port) proprio in quanto non necessita di avere un valore
predeterminato, ed il suo utilizzo `e limitato alla durata di una connessione.

7.3

La configurazione di base

La configurazione della rete `e una materia alquanto complessa e di una vastit`a impressionante.
In particolare essendo numerosissimi, e spesso molto complessi, i servizi di rete, sono altrettanto
numerose e complesse le configurazioni che si possono affrontare. In questa sezione per`o affronteremo solo la configurazione di base della rete, e non dei vari servizi che possono essere realizzati
su di essa.
In particolare vedremo come effettuare le varie impostazioni relative alluso e alla gestione
dei tre livelli pi`
u bassi del protocollo TCP/IP, che sono la base su cui `e costruito tutto il resto, ed
esamineremo sia i comandi tradizionali21 con i quali si effettua la configurazione manuale della
rete, che i file di configurazione usati nel procedimento di avvio per la configurazione automatica
delle interfacce.

7.3.1

Lassegnazione degli indirizzi ed il comando ifconfig

Il primo passo per poter utilizzare la rete `e quello di assegnare ad una interfaccia di rete il suo
indirizzo IP. Il comando che consente di fare questo `e ifconfig, che permette anche di impostare
le varie caratteristiche delle interfacce di rete. Quello che serve nella maggior parte dei casi sono
soltanto le opzioni che permettono di attivare e disattivare una interfaccia.
21

i comandi ifconfig, route, arp infatti sono da anni considerati deprecati, in favore del comando generico ip
(vedi sez. ??) che consente sia di sostituirli che di effettuare le configurazioni delle funzionalit`
a pi`
u avanzate del
kernel; nonostante questo il loro utilizzo per le operazioni di base resta il pi`
u comune.

7.3. LA CONFIGURAZIONE DI BASE

407

Se usato senza opzioni e senza specificare una interfaccia il comando mostra lo stato di tutte
le interfacce attive. Questo `e il primo passo da fare sempre prima di qualunque configurazione
per vedere lo stato del sistema (ed anche dopo per controllare che sia tutto a posto). Un risultato
possibile `e il seguente:
[root@havnor root]# ifconfig
eth0
Link encap:Ethernet HWaddr 00:01:02:2F:BC:40
inet addr:192.168.0.234 Bcast:192.168.0.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:82075264 errors:0 dropped:0 overruns:0 frame:0
TX packets:51585638 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:100
RX bytes:2858378779 (2.6 GiB) TX bytes:2524425895 (2.3 GiB)
Interrupt:10 Base address:0x8800
eth0:0

Link encap:Ethernet HWaddr 00:01:02:2F:BC:40


inet addr:192.168.1.1 Bcast:192.168.1.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
Interrupt:10 Base address:0x8800

eth1

Link encap:Ethernet HWaddr 00:E0:7D:81:9C:08


inet addr:192.168.168.1 Bcast:192.168.168.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:100
RX bytes:0 (0.0 b) TX bytes:0 (0.0 b)
Interrupt:9 Base address:0x6000

lo

Link encap:Local Loopback


inet addr:127.0.0.1 Mask:255.0.0.0
UP LOOPBACK RUNNING MTU:16436 Metric:1
RX packets:10226970 errors:0 dropped:0 overruns:0 frame:0
TX packets:10226970 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:1385547296 (1.2 GiB) TX bytes:1385547296 (1.2 GiB)

Se si specifica come argomento il nome di una interfaccia il comando mostra solo lo stato
dellinterfaccia specificata, se invece si vuole lo stato di tutte le interfacce esistenti, comprese
quelle non attive, occorre usare lopzione -a.
Nellesempio precedente si `e illustrata la situazione si una macchina su cui sono presenti 3
interfacce di rete; due di esse (eth0 e eth1) corrispondono a due schede di rete ethernet, la
terza (lo) `e una interfaccia logica, la cosiddetta interfaccia di loopback che viene usata per le
comunicazioni locali, e che deve essere sempre attivata anche per i computer non connessi in rete.
In questo caso tutte le interfacce fisiche sono di tipo broadcast, manca nellesempio un caso, che
troveremo pi`
u avanti in sez. 7.5, di una interfaccia impostata per una connessione punto-punto.
Valore
UP
NOARP
RUNNING
MULTICAST
BROADCAST
POINTOPOINT
LOOPBACK
MTU

Tipo indirizzo
linterfaccia `e attiva.
il protocollo ARP (vedi sez. 7.6.4) non `e attivo sullinterfaccia.
linterfaccia sta funzionando.
sullinterfaccia `e attivato il multicast.
sullinterfaccia `e attivato il broadcast.
linterfaccia `e in modalit`
a punto-punto.
linterfaccia `e in modalit`
a loopback.
Maximum Transfer Unit dellinterfaccia.22

Tabella 7.7: Stati riportati nella terza riga del comando ifconfig e relativo significato.

408

CAPITOLO 7. LAMMINISTRAZIONE DI BASE DELLE RETI

Si pu`o notare come il comando riporti le varie caratteristiche delle singole interfacce: nella
prima riga viene scritto il tipo di collegamento fisico, e, se presente per quel tipo di interfaccia,
anche lindirizzo fisico. Nella seconda riga viene riportato il tipo ed il valore dellindirizzo
associato allinterfaccia, quindi segue una riga che indica lo stato corrente della stessa, in cui
sono elencate una serie di valori il cui elenco e relativo significato `e riportato in tab. 7.7. Infine
sulle righe seguenti vengono stampate una serie di altre informazioni statistiche relative al traffico
sostenuto dallinterfaccia.
Valore
inet
inet6
ax25
ddp
ipx

Tipo indirizzo
Indirizzo IPv4.
Indirizzo IPv6.
Indirizzo AX25.
Indirizzo AppleTalk.
Indirizzo Novell IPX.

Tabella 7.8: Valori del parametro opzionale per indicare il tipo di indirizzo con ifconfig.

A parte il caso in cui si legge la configurazione generica, il comando richiede sempre come
primo argomento il nome dellinterfaccia su cui operare; quando si intende impostare un indirizzo
sulla stessa `e possibile specificarne il tipo con un argomento opzionale da specificare prima del
relativo valore. I valori possibili per questo argomento sono riportati in tab. 7.8 ed il valore
di default, sottinteso quando non si specifica nulla, `e inet, che indica il protocollo TCP/IP.
Normalmente questo argomento non viene mai specificato in quanto il caso pi`
u comune di utilizzo
del comando ifconfig `e quello dellimpostazione di un indirizzo IP.
Il risultato del comando riportato a pag. 407 ci mostra anche che linterfaccia eth0 `e multihomed ; su di essa cio`e sono presenti due indirizzi diversi, riportati nelle due sezioni separate
introdotte dalle stringhe eth0 ed eth0:0. Con ifconfig lassegnazione di ulteriori indirizzi su
una qualunque interfaccia di rete si deve fare utilizzando delle interfacce virtuali nella forma
eth0:N dove N `e un numero intero.23 Si noti comunque come le statistiche siano riportate solo
per la prima istanza, in quanto esse non possono che essere uniche per ciascuna interfaccia.
Prima di configurare una interfaccia `e opportuno verificare che essa non sia gi`a attiva, perche
quando si assegna un indirizzo IP un valore precedente sar`a sovrascritto. Il comando ifconfig
iface (dove iface `e il nome della singola interfaccia che si vuole controllare, ad esempio eth0) ci
mostrer`a lo stato dellinterfaccia, dando un errore nel caso il supporto nel kernel non sia attivato
o linterfaccia non esista. Qualora invece voglia disattivare una interfaccia attiva si potr`a usare
il comando:
ifconfig eth0 down
specificando lopzione down, mentre per riattivarla, mantenendo le impostazioni che cerano in
precedenza, si potr`
a utilizzare il comando:
ifconfig eth0 up
Quando invece si deve assegnare un indirizzo la sintassi dipende dal tipo di collegamento,
nellesempio precedente abbiamo tutte interfacce relative a reti di tipo broadcast che si affacciano
su una rete locale ed in questo caso si potr`a assegnare un indirizzo ad una interfaccia ed allo
stesso tempo attivarla con il comando:
22

la Maximum Transfer Unit di una interfaccia di rete `e la massima dimensione che un pacchetto pu`
o avere
per poter essere trasmesso sulla rete su cui si affaccia la suddetta interfaccia, questa dipende dalla tecnologia
sottostante, ed in genere per una interfaccia ethernet vale 1500 byte; torneremo su questo in sez. 7.6.2.
23
si tenga presente che con luso del nuovo comando ip addr `e possibile assegnare indirizzi multipli alla stessa
interfaccia senza dover specificare una interfaccia virtuale nella forma appena vista; in tal caso per`
o non se ne
trover`
a traccia nelloutput di ifconfig.

7.3. LA CONFIGURAZIONE DI BASE

409

ifconfig eth0 192.168.1.100


in cui `e sottintesa lopzione up poiche si d`a per scontato che assegnare un indirizzo IP ad una
interfaccia implichi anche la volont`
a di utilizzarla.
Si ricordi per`
o che in questo caso ad ogni indirizzo IP `e sempre associata una rete IP, che nel
comando precedente sembra non comparire; questo `e dovuto al fatto che se non viene specificato
esplicitamente il comando ifconfig assegna automaticamente allinterfaccia la maschera di rete
corrispondente alla classe a cui appartiene lindirizzo IP, secondo la suddivisione tradizionale di
tab. 7.3 (nel caso sarebbe pari a 255.255.255.0, dato che lindirizzo `e di classe C).
Quando questa scelta non `e corretta si pu`o specificare la rete su cui si affaccia linterfaccia
indicando esplicitamente la maschera di rete da utilizzare con un comando del tipo:
ifconfig eth0 192.168.1.100 netmask 255.255.0.0
Gli esempi precedenti fanno tutti riferimento al caso pi`
u comune, quello di una interfaccia
per una rete di tipo broadcast che viene usata per mettere in comunicazione pi`
u macchine su
una rete locale. Ma come accennato esistono anche modalit`a di comunicazione diverse, ed in
particolare la sintassi `e diversa in caso di collegamenti punto-punto, in cui non esiste una rete
locale e due macchine si parlano direttamente. In questo caso non si potr`a utilizzare la direttiva
netmask, non essendoci una rete locale, mentre occorrer`a specificare lindirizzo dellaltro capo
della connessione; si avr`
a cio`e un comando analogo al seguente:24
ifconfig slip0 192.168.0.1 point-to-point 192.168.0.2
In questultimo caso luso esplicito di ifconfig `e per`o molto meno diffuso, in quanto la
configurazione di una interfaccia punto-punto nella maggioranza dei casi `e associato alluso delle
le connessioni via modem, e queste normalmente vengono gestite direttamente ad un livello pi`
u
alto attraverso luso di appositi programmi, come vedremo in sez. 7.5.
Gli esempi precedenti ci mostrano la sintassi generica dellinvocazione del comando ifconfig;
esso prevede la specificazione nei primi due argomenti dellinterfaccia di rete e di un indirizzo,
mentre negli argomenti successivi possono essere indicati una serie di ulteriori direttive e relativi
parametri che consentono di impostare le varie caratteristiche dellinterfaccia.
In tab. 7.9 si sono elencate le principali direttive di configurazione disponibili per ifconfig,
con il formato e la presenza di un eventuale parametro. Per un elenco completo di tutte le
direttive, che normalmente vengono lasciate al valore di default, si rimanda alla lettura della
pagina di manuale, accessibile al solito con man ifconfig.

7.3.2

Limpostazione dellinstradamento ed il comando route

Avere attivato una interfaccia di rete ed averle assegnato un indirizzo IP `e solo il primo passo;
perche sia possibile utilizzare la rete occorre anche impostare linstradamento dei pacchetti. Per
questo si usa il comando route, che si chiama cos` proprio perche serve a specificare le strade
che essi possono prendere per arrivare a destinazione.
Il comando permette di manipolare la tabella di instradamento (o routing table) del protocollo
IP: questa `e una tabella usata e mantenuta dal kernel per decidere come smistare i pacchetti in
uscita e in transito. In sostanza la tabella contiene le associazioni fra le possibili destinazioni di
un pacchetto e linterfaccia che deve essere usata perche questo possa raggiungerle.
24

lesempio fa riferimento ad un collegamento realizzato con un cavo seriale.


si chiama cos` una modalit`
a di funzionamento di una interfaccia di rete su una rete broadcast per cui essa
riceve tutti i pacchetti che vede passare e non soltanto quelli diretti agli indirizzi ad essa assegnati.
25

410

CAPITOLO 7. LAMMINISTRAZIONE DI BASE DELLE RETI


Direttiva
[-]arp
media type

multicast
[-]promisc
netmask mask
broadcast addr
up
down
pointopoint addr
hw class addr

Significato
attiva e disattiva (con -) luso del protocollo ARP (vedi sez. 7.6.4) per
linterfaccia. Se non specificato il default `e arp.
seleziona il tipo di mezzo (in genere il cavo), tramite il parametro type
(che pu`
o assumere ad esempio valori come 10base2, 10baseT, ecc.); di
solito viene impostato automaticamente usando il default che `e auto.
abilita il multicast sullinterfaccia, normalmente viene selezionato
automaticamente quando si attiva linterfaccia.
attiva e disattiva (con -) il modo promiscuo25 per linterfaccia.
imposta la maschera di rete che deve essere specificata in notazione
dotted decimal (si ricordi quanto illustrato in sez. 7.2.2).
imposta lindirizzo di broadcast che deve essere specificato in notazione
dotted decimal.
attiva linterfaccia.
disattiva linterfaccia.
imposta linterfaccia in modalit`
a punto-punto impostando al contempo
lindirizzo assegnato allaltro estremo.
imposta il MAC address associato allinterfaccia, il parametro class
indica il tipo di interfaccia, e normalmente `e ether.

Tabella 7.9: Principali direttive del comando ifconfig.

Il comando prende come argomenti delle direttive che ne specificano le operazioni; le direttive
fondamentali sono due: add, che permette di aggiungere una voce alla tabella, e del che ne
permette la cancellazione. Se non si specifica nessuna direttiva il comando viene usato per
mostrare lo stato corrente della tabella, e le opzioni utilizzabili sono riportate in tab. 7.10.
Opzione
-e
-n
-A

-v

Descrizione
usa il formato di netstat (vedi sez. 7.6.3), ripetuto due
volte stampa pi`
u informazioni.
non effettua la risoluzione degli indirizzi.
usa gli indirizzi della famiglia passata come parametro. Il
default `e inet per gli indirizzi IP; prende gli stessi valori
usati da ifconfig riportati in tab. 7.8.
esegue le operazioni in maniera prolissa.

Tabella 7.10: Principali opzioni a riga di comando per luso di route.

Il concetto fondamentale del routing `e che ciascun nodo sulla rete deve sapere a quale nodo
limitrofo deve rivolgersi per inviare un pacchetto verso una certa destinazione. In sostanza dovete
avere una segnaletica stradale che vi dice da quale parte svoltare per arrivare a destinazione. In
realt`a quando si ha a che fare con una rete locale le cose sono molto pi`
u semplici, e, tornando
allanalogia telefonica, tutto quello che dovete fare `e specificare qual`e il numero del centralino
e quali sono i numeri diretti.
Supponiamo di avere la rete schematizzata in fig. 7.4, che prenderemo come riferimento per
i nostri esempi, e vediamo come deve essere configurata la tabella di instradamento per le varie
macchine di cui la rete `e composta. In questo caso si vede che un ruolo particolare `e rivestito
dalla macchina havnor, che `e posta a cavallo fra due reti diverse; nel nostro esempio questa
dovr`a fare da ponte26 fra le due reti, passando i pacchetti da una interfaccia ad unaltra.
Perche questo funzioni per`
o deve essere stato abilitato il kernel ad eseguire il cosiddetto IP
forwarding, che di default `e disabilitato; questo si pu`o fare attraverso linterfaccia del sysctl,
26

tecnicamente si parla di un bridge quando si ha a che fare con un apparato che fa da ponte fra due sotto-reti
fisiche passando i pacchetti dalluna allaltra a livello di datalink (in genere sui protocolli della famiglia IEEE
802.x), in maniera completamente trasparente ai livelli superiori. Linux pu`
o essere utilizzato anche in questo
modo, abilitando lopportuno supporto nel kernel, qui per`
o stiamo parlando semplicemente del passaggio di un
pacchetto da una interfaccia ad un altro a livello di rete, che invece `e il lavoro svolto dai router.

7.3. LA CONFIGURAZIONE DI BASE

411

Figura 7.4: Schema di una rete di prova.

o usando direttamente i file con cui questa viene rappresentata nel filesystem /proc; per cui
abilitare lIP forwarding baster`
a eseguire il comando:
echo 1 > /proc/sys/net/ipv4/ip_forward
Vediamo allora come configurare le rotte della rete in fig. 7.4 usando route. Il primo passo
`e sempre quello di controllare la situazione corrente. Quando `e invocato senza parametri il
comando vi mostra il contenuto corrente della tabella di instradamento. Ad esempio, nel caso
illustrato in fig. 7.4, andando su havnor avremo:
[root@havnor root]# route -n
Kernel IP routing table
Destination
Gateway
192.168.0.0
0.0.0.0
192.168.1.0
0.0.0.0
192.168.168.0
0.0.0.0
0.0.0.0
192.168.0.1

Genmask
255.255.255.0
255.255.255.0
255.255.255.0
0.0.0.0

Flags
U
U
U
UG

Metric
0
0
0
0

Ref
0
0
0
0

Use
0
0
0
0

Iface
eth0
eth0
eth1
eth0

dove si `e usata lopzione -n per avere una stampa con i valori numerici per gli indirizzi.
Luscita del comando mostra le voci presenti nella tabella di instradamento, che usualmente
vengono chiamate anche rotte; in generale le rotte impostate con route vengono dette rotte
statiche (in quanto una volta impostate non vengono pi`
u cambiate), in contrapposizione alle
rotte dinamiche che vengono impostate dai cosiddetti demoni di routing,27 che modificano continuamente le rotte presenti nella tabella di instradamento per tenere conto delle condizioni della
rete.
Se non specificato altrimenti il comando tenta anche di risolvere (vedi sez. 7.4) i nomi delle
macchine e delle reti. Loutput usa la formattazione appena mostrata in cui la prima colonna
identifica la destinazione, la seconda il gateway (nella nostra analogia il centralino per quella
destinazione), la terza la sottorete coperta dalla destinazione, la quarta lo stato della rotta e
lultima linterfaccia usata per linvio dei pacchetti; il significato delle altre colonne `e associato
27

abbiamo accennato in sez. 7.1.3 alla presenza di protocolli usati dai router per scambio delle informazioni, i
demoni di routing sono programmi che implementano questi protocolli e aggiornano automaticamente la tabella
di instradamento con le informazioni ottenute.

412

CAPITOLO 7. LAMMINISTRAZIONE DI BASE DELLE RETI


Nome
Destination
Gateway
Genmask
Flags
Metric
Ref
Use
Iface
MSS
Window
irtt
HH
Arp

Descrizione
rete o nodo di destinazione.
indirizzo del gateway (0.0.0.0 se non impostato).
netmask della rete di destinazione
flag associati alla rotta (vedi tab. 7.12).
metrica della rotta (distanza dalla destinazione in numero
di salti).
numero di riferimenti nella tabella di instradamento (non
usato nel kernel).
numero di verifiche sulla rotta.
interfaccia verso cui sono inviati i pacchetti.
default per lMMS (Maximum Segment Size) delle
connessioni TCP su questa rotta.
default per la window size delle connessioni TCP su
questa rotta.
valore iniziale dellRTT (Round Trip Time) per il
protocollo TCP.
numero di voci ARP e rotte in cache che fanno riferimento
allo stessa intestazione hardware.
flag che indica se lindirizzo hardware per la rotta in cache
`e aggiornato.

Tabella 7.11: Nomi della colonna e relativo significato per le varie informazioni riportate nelluscita del comando
route.

agli aspetti pi`


u sofisticati del routing, gestiti di norma da opportuni programmi; uno specchietto
delle informazioni mostrate dal comando `e in tab. 7.11, maggiori dettagli sono nella pagina di
manuale.
Nellesempio mostrato in precedenza si pu`o notare come ci siano tre diverse destinazioni
associate a tre diverse sotto-reti, due delle quali fanno capo alla stessa interfaccia (quella che in
sez. 7.3.1 abbiamo visto essere multihomed ). Per tutte queste sotto-reti, essendo esse accessibili
direttamente da una interfaccia locale, non esiste un gateway (`e come per le telefonate allinterno
dellufficio, non c`e bisogno di usare il centralino) e questo `e indicato dalluso dellindirizzo
generico in seconda colonna.
Lultima riga indica invece la rotta di default ed il cosiddetto default gateway. Questa rotta
serve ad indicare lindirizzo della macchina (che deve essere raggiungibile con le rotte precedenti)
a cui devono essere inviati i pacchetti che hanno una destinazione generica; come abbiamo gi`a
accennato in sez. 7.2.2 lindirizzo di rete nullo con netmask nulla corrisponde ad una rete in cui
tutti e 32 i bit disponibili sono utilizzati come indirizzi delle macchine al suo interno, per cui
questa diventa la rotta per tutta Internet.
In realt`a se `e disponibile un sola interfaccia, e non si esce dalla rete locale (per cui non serve
una rotta di default), non c`e bisogno di eseguire esplicitamente route; infatti tutte le volte che si
assegna un indirizzo ad una interfaccia, la rotta per la rete a cui detto indirizzo `e associato viene
inserita automaticamente.28 Il problema si pone quando la struttura della rete `e pi`
u complicata,
e la rete `e suddivisa in parti diverse.
Nel caso di un computer con una sola interfaccia di rete inserito in una LAN, una volta
assegnato lindirizzo con ifconfig nel caso pi`
u comune tutto quello che resta da fare `e specificare
qual`e il default gateway, cio`e lindirizzo della macchina (di solito un router ) che si usa per uscire
su Internet; questo si fa con il comando:
route add default gw 192.168.0.1
28

la cosa vale anche in caso di collegamento punto-punto, solo che in tal caso viene inserita una rotta per
la singola macchina che si trova allaltro capo della connessione, usando lIP specificato come parametro per la
direttiva point-to-point di ifconfig.

7.3. LA CONFIGURAZIONE DI BASE


Simbolo
U
H
G
R
D
M
A
C
!

413

Significato
la rotta `e attiva.
la destinazione `e una macchina singola.
usa un gateway.
rotta reintegrata da un instradamento dinamico.
installata dinamicamente da un demone o da una
redirezione.
modificata da un demone o una redirezione.
installata da addrconf.
voce nella cache.
rotta bloccata (impedisce linstradamento per la destinazione specificata).

Tabella 7.12: Significato dei simboli utilizzati nella colonna Status del comando route.

che ovviamente deve essere eseguito dallamministratore, in quanto cambiare i contenuti della
tabella di instradamento `e una operazione privilegiata. Il comando dovr`a essere ripetuto per
tutte le macchine mostrate in fig. 7.4.29 Leffetto di questo comando `e quello di creare la
cosiddetta rotta di default, che nel caso corrisponde allultima riga riportata nellesempio di
tabella di instradamento di pag.411.30
Per le macchine sulla rete 192.168.168.0 c`e per`o il problema che esse non possono vedere
direttamente il router, che `e posto sulla rete 192.168.0.0; lo stesso vale per le macchine di
quella rete, che non possono accedere direttamente alla rete 192.168.168.0. In questo caso
infatti i pacchetti, per passare da una rete allaltra, devono attraversare havnor, che, con le sue
due interfacce di rete, fa da router fra i due tratti.
In tutti i casi in cui laccesso ad una rete `e condizionato al passaggio da una macchina
specifica che fa da router, si deve specificare una rotta statica che indichi anche questultima
come gateway per quella rete. Cos` se lorbaner vuole accedere a gont, si dovr`a impostare una
rotta statica con:
[root@lorbaner root]# route add -net 192.168.168.0 netmask 255.255.255.0 \
gw 192.168.0.234

che dice ai pacchetti destinati alla rete 192.168.168.0 di usare come gateway la macchina
192.168.0.234. Allo stesso modo perche oppish possa accedere ad hogen (e ad Internet
attraverso il router roke) si dovr`
a impostare una rotta statica con:
[root@oppish root]# route add -net 192.168.0.0 netmask 255.255.255.0 \
gw 192.168.168.1

Il kernel ordina le rotte nella tabella di instradamento in ordine di dimensione della rete di
destinazione a partire da quella pi`
u specifica per arrivare alla pi`
u generica, che se presente `e
quella associata al default gateway che ha per destinazione tutta Internet, ed invia un pacchetto
in uscita sulla prima rotta che comprende nella sua destinazione lindirizzo cui esso `e destinato.
Cos` nella rete di esempio un pacchetto destinato ad oppish verr`a instradato (correttamente)
su havnor e non su roke, perche la rotta per la rete 192.168.168.0 `e pi`
u specifica di quella di
default.
Il comando route, quando si aggiunge una nuova rotta alla tabella di instradamento, permette di impostare oltre alla destinazione e alleventuale gateway, anche una serie di altre caratteristiche. In generale la direttiva add prevede sempre una fra le opzioni -net, per indicare una
29
30

vedremo in sez. 8.2 come questo pu`


o essere automatizzato usando il servizio DHCP.
questo semplicemente perche default non `e altro che labbreviazione di -net 0.0.0.0 netmask 0.0.0.0.

414

CAPITOLO 7. LAMMINISTRAZIONE DI BASE DELLE RETI


Direttiva
netmask
gw
reject
metric
mss

Parametro
Nm
Gw

M
M

window

irtt
mod,dyn,reinstate
dev

I
If

Descrizione
imposta la maschera per la rete.
imposta lindirizzo del gateway.
installa una rotta bloccata.
imposta il valore del campo Metric.
imposta la Maximum Segment Size per i pacchetti TCP
che usano la rotta.
imposta la dimensione della advertizing window del TCP
per la rotta.
imposta il Round Trip Time iniziale per la rotta.
flag diagnostici usati dai demoni di routing.
imposta linterfaccia usata per raggiungere la destinazione.

Tabella 7.13: Direttive del comando route.

voce riferita ad una rete, e -host per una stazione singola. A queste deve seguire lindirizzo, di
rete o di nodo, della destinazione, indicato in forma o numerica o simbolica.31
Nel caso si sia indicata una rete si deve inoltre specificare sempre anche la relativa netmask
con la direttiva netmask ed eventualmente linterfaccia da utilizzare con la direttiva dev. Le
altre principali direttive del comando sono riportate in tab. 7.13; in genere queste sono opzionali
o inutilizzate per le rotte statiche, e vengono impostate automaticamente agli opportuni default
corrispondenti allinterfaccia cui la rotta fa riferimento; fa eccezione la direttiva reject che viene
utilizzata per impostare una cosiddetta blocking route, cio`e una rotta che fa si che il tentativo
di inviare inviati su quella rete fallisca con un errore di instradamento.32
Le opzioni di base -net e -host valgono anche per la direttiva di cancellazione del, la
differenza fra `e che mentre con add devono essere specificate interamente le caratteristiche della
rotta, in questo caso basta identificare univocamente la voce che si vuole cancellare perche il
comando abbia effetto.

7.3.3

La configurazione della rete allavvio del sistema.

Nelle sezioni precedenti abbiamo esaminato i comandi che consentono di eseguire manualmente
la configurazione della rete su una macchina Linux, nelle operazioni ordinarie essi per`o non
vengono usati direttamente quasi mai, in quanto la configurazione viene effettuata quasi sempre
in maniera automatica. In realt`
a i casi pi`
u comuni che si presentano sono sostanzialmente due:
Un collegamento diretto ad Internet con una connessione attraverso un modem analogico,
ISDN o ADSL connesso alla macchina stessa.33 In questo caso il collegamento pu`o anche non essere permanente, nel qual caso lo si potr`a o dovr`a attivare a richiesta con un
opportuno programma.
Un collegamento allinterno di una rete locale, usualmente effettuate tramite una scheda di
rete ethernet. In questo caso il collegamento, almeno quello alla rete locale, `e permanente,
e viene generalmente attivato dagli script di avvio.
In entrambi i casi sono comunque richiesti alcuni dati necessari a configurare la rete. Nel
primo caso questi devono essere stati forniti dal provider; ad esempio nel caso di un modem
analogico serve il numero telefonico da contattare, ed in genere `e anche prevista una qualche
31

questultima per`
o richiede che sia disponibile una risoluzione dello stesso (tratteremo largomento in sez. 7.4)
cosa che non sempre `e vera, pertanto `e preferibile usare sempre la forma numerica.
32
la si pu`
o usare per bloccare laccesso a certe reti prima delluso della rotta di default.
33
si tenga presente che si sta parlando di modem, anche nel caso di ADSL, nel caso si abbia invece un router
ADSL, come avviene ormai sempre pi`
u spesso, si ricade nel caso successivo.

7.3. LA CONFIGURAZIONE DI BASE

415

modalit`a di autenticazione che richiede username e password del proprio account. A questi dati
si possono eventualmente aggiungere quelli relativi alla inizializzazione del modem utilizzato,
anche se ormai tutte le distribuzioni sono in grado di eseguire un riconoscimento automatico
nella maggior parte dei casi.
In questo caso non `e necessario preoccuparsi di conoscere in anticipo lindirizzo IP assegnato
alla propria macchina in quanto sar`a il programma di connessione (in genere utilizzando il
comando pppd che tratteremo in sez. 7.5.2) ad utilizzare le informazioni che gli vengono fornite
dal provider per eseguire la configurazione della rete. Al pi`
u ci potr`a essere da configurare a
mano, per quei pochi provider che non forniscono linformazione, gli indirizzi dei DNS (torneremo
su questo in sez. 7.4.2).
Nel secondo caso invece sono necessarie le informazioni relative alla rete allinterno di cui ci
si trova,34 ed in particolare lindirizzo IP da assegnare alla macchina, la netmask, e lindirizzo
del gateway. In realt`
a se sulla rete `e disponibile un server DHCP (torneremo sullargomento in
sez. 8.2) lindirizzo non dovr`
a essere specificato a mano, ma potr`a impostato automaticamente
grazie ad esso. Tutti i programmi di configurazione prevedono questa possibilit`a, nel qual caso
non `e necessario fornire nessuna informazione specifica, se non quella di usare il DHCP.
Si tenga presente inoltre che nel caso si debba creare una propria rete locale, di cui poi si
sar`a gli amministratori, si dovr`
a anche effettuare la scelta degli indirizzi che si vogliono utilizzare al suo interno prima di assegnarli alle varie macchine; in questo caso `e sempre opportuno
usare una delle reti appartenenti alle classi riservate elencate in tab. 7.6, che la IANA ha destinato appositamente a questo scopo, e che non vengono mai assegnati a macchine pubbliche su
Internet.35
Distribuzione
Debian
RedHat

Script di avvio
/etc/init.d/networking
/etc/init.d/network

Altre distribuzioni
Ubuntu
Mandrake, Suse, CentOS

Tabella 7.14: Gli script di inizializzazione della rete per varie distribuzioni.

A parte il caso di connessioni non permanenti da attivare a richiesta, in generale la rete viene
configurata nelle fasi iniziali della procedura di avvio del sistema tramite gli opportuni script
(vedi sez. 5.3.5) in modo da garantirne laccesso al successivo avvio dei servizi che la usano.36
Ogni distribuzione utilizza una sua versione di questi script ed in tab. 7.14 si sono riportati quelli
usati dalle distribuzioni pi`
u diffuse.
A loro volta gli script leggono da opportuni file di configurazione tutte le informazioni necessarie, come le interfacce da configurare, gli IP ad esse assegnati e le netmask delle relative reti,
lindirizzo del default gateway, la presenza di eventuali ulteriori rotte statiche, ecc. Pertanto per
modificare in maniera permanente le impostazioni della rete si devono modificare i file in cui
sono memorizzate le informazioni usate dagli script di avvio.37
Anche file di configurazione della rete variano da distribuzione a distribuzione, cos` come pu`
o
essere diverso il loro formato; prenderemo in esame due dei casi pi`
u comuni, Debian e RedHat
le cui scelte, cos` come per gli script di avvio, sono riprese anche da altre distribuzioni, sempre
secondo lo schema di tab. 7.14. In genere i programmi di configurazione automatica (o i vari
34

che potrebbe anche essere semplicemente quella fornita dallinterfaccia ethernet del proprio router ADSL.
questa `e una regola da seguire sempre anche per una rete di cui non `e previsto alcun accesso ad Internet, per
la quale in teoria si potrebbe pensare di usare indirizzi qualunque; questo `e comunque sbagliato perche la volta
che si dovesse fare accedere ad Internet una delle macchine di questa rete gli indirizzi pubblici presenti su Internet
corrispondenti ad essa non sarebbero pi`
u raggiungibili.
36
questo non `e sempre vero nel caso di sistemi desktop in cui in genere la configurazione viene eseguita al
rilevamento di una possibile connessione da opportuni programmi di gestione integrati nellambiente desktop
stesso; non tratteremo qui questa casistica che dipende dal programma utilizzato per eseguire questo compito.
37
eventuali modifiche provvisorie si possono effettuare con i singoli comandi illustrati nelle sezioni precedenti,
ma ovviamente al successivo riavvio tutti i cambiamenti saranno perduti.
35

416

CAPITOLO 7. LAMMINISTRAZIONE DI BASE DELLE RETI

programmi grafici per la configurazione) non fanno altro che leggere e modificare i valori che
stanno su questi file con una qualche interfaccia semplificata; dato che si tratta come sempre di
file di testo, `e comunque sufficiente saper usare un editor qualunque.
Debian

Il file di configurazione delle interfacce `e /etc/network/interfaces, il cui formato


`e descritto in dettaglio dalla omonima pagina di manuale accessibile con man interfaces. Il file consente di controllare con grande flessibilit`a la configurazione delle
interfacce, ed `e in genere suddiviso in sezioni introdotte da opportune parole chiave,
le principali delle quali sono riportate in tab. 7.15. Ciascuna sezione pu`o richiedere
eventuali ulteriori direttive di configurazione che in genere si specificano scrivendole
con una indentazione sulle righe successive alla parola chiave che definisce la relativa
sezione.
Direttiva
auto
allow-hotplug

mapping

iface

Significato
dichiara una lista di interfacce che deve essere avviata
automaticamente allavvio (dal comando ifup -a).
dichiara una lista di interfacce che devono essere configurate automaticamente tramite hotplug (vedi
sez. 5.4.5)
definisce le modalit`
a per creare una corrispondenza fra
un nome logico assegnato ad una interfaccia di rete ed
una specifica interfaccia fisica.
dichiara la configurazione di una interfaccia.

Tabella 7.15: Principali direttive che identificano le diverse sezioni di /etc/network/interfaces.

Un esempio del contenuto di questo file, nel caso di una macchina con una sola interfaccia di rete a cui si vuole assegnare un indirizzo fisso, configurandone al contempo
i parametri per laccesso ad Internet, potrebbe essere il seguente:
auto lo eth0
iface lo inet loopback
iface eth0 inet static
address 172.16.1.12
netmask 255.255.255.0
gateway 172.16.1.1

La prima riga, introdotta dalla parola chiave auto, dice quali sono le interfacce da
attivare automaticamente allavvio del sistema, che possono essere specificate sia
insieme, come nellesempio, che in altrettante righe distinte.
Le due righe seguenti, introdotte dalla parola chiave iface, servono a impostare i
parametri di ciascuna interfaccia. Per ciascuna interfaccia deve essere fornita una riga
in cui specificarne il nome, ed a seguire la famiglia di protocolli usata e le modalit`a
di configurazione da indicare con opportune parole chiave separate da spazi.
Nel caso dellesempio la famiglia di protocolli utilizzata per entrambe le interfacce
(lo e eth0) `e sempre inet, che indica lusuale TCP/IP, ma sarebbe stato possibile
usare anche ipx per indirizzi IPX,38 o inet6 per IPv6.
La configurazione delle due interfacce differisce invece nelle modalit`a con cui questa viene effettuata, ed a seconda di quale si `e scelta potr`a essere necessario indicare ulteriori parametri di configurazione; le principali modalit`a disponibili sono
sostanzialmente le seguenti:
loopback configurazione per il localhost, si usa soltanto per linterfaccia di loopback
e non `e necessario indicare altro.
38

il protocollo Netware usato da Novell, ormai sostanzialmente abbandonato.

7.3. LA CONFIGURAZIONE DI BASE

417

dhcp

si richiedono i dati di configurazione ad un server DHCP con una opportuna richiesta tramite questo protocollo (torneremo sullargomento in
sez. 8.2).

manual

linterfaccia non deve essere configurata di default, la si usa ad esempio


per interfacce che fanno parte di un bridge.

static

si assegnano i valori in maniera statica secondo i parametri specificati


nelle righe seguenti.

per le prime due modalit`a non occorre specificare altro,39 , mentre se si sceglie una
assegnazione statica dellindirizzo IP con static si dovranno impostare gli opportuni
parametri nelle righe seguenti, che di solito si indentano per maggiore chiarezza, come
nellesempio.
Nel caso in esempio si sono indicati lindirizzo, la maschera di rete e lindirizzo del
default gateway utilizzando rispettivamente le parole chiave address, netmask e gateway. Questultimo deve essere specificato una volta sola, per linterfaccia da cui `e
raggiungibile.
Per ciascuna interfaccia, indipendentemente dal tipo di indirizzi o dalla modalit`
a
di configurazione, possono inoltre essere specificati dei comandi da chiamare contestualmente allattivazione e alla disattivazione dellinterfaccia, questo si fa in maniera
analoga alla precedente indicazione di parametri, usando le parole chiave up, preup, down, post-down seguite dal comando, che verr`a eseguito rispettivamente dopo
e prima dellattivazione e prima e dopo la disattivazione.
Si tenga presente poi che le interfacce associate alle connessioni punto-punto effettuate tramite modem non vengono normalmente menzionate in questo file, trattandosi
in genere di connessioni non permanenti attivate a richiesta. Con la diffusione dei
modem ADSL per`
o nelle versioni pi`
u recenti `e possibile attivare una connessione
punto-punto permanente usando la nuova modalit`a ppp. In questo caso viene comunque utilizzata una configurazione esistente di pppd (tratteremo largomento in
sez. 7.5.2), ed occorrer`
a specificare sulla riga seguente la direttiva provider con
argomento il nome del file di direttive sotto /etc/ppp/peers che deve essere usato.
RedHat i file per la configurazione allavvio delle interfacce di rete sono mantenuti nella
directory /etc/sysconfig/network-scripts, e ce n`e uno per interfaccia con un
nome del tipo ifcfg-iface, dove iface `e il nome dellinterfaccia da configurare.
Ciascuno di questi contiene poi i relativi parametri, indicati sempre nella forma di
assegnazione di un valore ad una variabile di shell40 il cui significato `e espresso in
maniera evidente dal relativo nome per gran parte di esse.
Il contenuto del file dipende in genere dal tipo di interfaccia, a seconda dei parametri
necessari alla configurazione delle interfacce di quel tipo. Il caso pi`
u comune `e quello
delle interfacce di tipo Ethernet (ma i parametri sono identici per altre tecnologie
simili); in questo caso una variabile sempre presente deve essere DEVICE che definisce
il nome dellinterfaccia e deve corrispondere a quello del nome del file. Una seconda
variabile fondamentale `e BOOTPROTO che indica se deve essere usato un protocollo di
auto-configurazione, coi valori bootp o dhcp dai nomi dei rispettivi protocolli, (vedi
sez. 8.2.1) oppure una configurazione statica, con il valore none. Unaltra variabile
39
in realt`
a con dhcp si possono passare delle richieste specifiche al server (vedi sez. 8.2.2) utilizzando alcuni
parametri, ma in genere questi non vengono mai utilizzati, essendo sufficienti i valori di default.
40
in effetti si tratta proprio di questo, il file viene letto dagli script di avvio che usano queste variabili di shell
per effettuare la configurazione.

418

CAPITOLO 7. LAMMINISTRAZIONE DI BASE DELLE RETI


importante `e ONBOOT che segnale, con il valore yes, che linterfaccia deve essere
configurata allavvio.
Pertanto nel caso si debba usare lautoconfigurazione allavvio con il protocollo DHCP
un esempio del contenuto del file ifcfg-eth0, relativo alla prima interfaccia ethernet,
potrebbe essere il seguente:
DEVICE=eth0
BOOTPROTO=dhcp
ONBOOT=yes

Se viceversa si volesse effettuare una configurazione statica si dovrebbero specificare


in altrettante variabili lindirizzo IP, la netmask, e lindirizzo di broadcast (rispettivamente IPADRR, NETMASK e BROADCAST), inoltre si dovrebbe indicare un eventuale default gateway con la variabile GATEWAY; in tal caso un possibile esempio del contenuto
del file ifcfg-eth0 potrebbe essere il seguente:
DEVICE=eth0
BOOTPROTO=none
ONBOOT=yes
IPADDR=172.16.1.12
NETMASK=255.255.255.0
GATEWAY=172.16.1.1
BROADCAST=172.16.1.255
USERCTL=no

dove `e definita anche la variabile USERCTL che serve a marcare (se assegnato al valore
yes) le interfacce che anche agli utenti normali possono attivare e disattivare con il
comando ifup; un elenco delle principali variabili di controllo `e riportato in tab. 7.16.
Variabile
DEVICE
BOOTPROTO
ONBOOT
IPADDR
BROADCAST
NETMASK
NETWORK
USERCTL
HWADDR

GATEWAY

Significato
nome dellinterfaccia.
protocollo di auto-configurazione (bootp, DHCP.
attivazione (yes) o meno (no) allavvio.
indirizzo IP da assegnare alla macchina.
indirizzo di broadcast.
netmask per la rete locale.
indirizzo della rete (opzionale).
attivazione (yes) o meno (no) da parte di un utente non
privilegiato.
indica il MAC address della scheda (da usare su macchine con pi`
u schede per essere sicuri dellassegnazione
allinterfaccia corretta).
indirizzo IP del default gateway.

Tabella 7.16: Principali variabili di controllo per i file ifcfg-ethN.

Anche se gli script di avvio ed i file di configurazione variano da distribuzione a distribuzione


sono in genere disponibili due comandi standardizzati,41 ifup e ifdown, che consentono rispettivamente di attivare o disattivare uninterfaccia, eseguendo al contempo la sua configurazione
secondo quanto previsto nei file di configurazione della rete appena trattati. Nella loro forma
generica questi comandi prendono come unico argomento il nome dellinterfaccia da attivare o
disattivare, le varie distribuzioni poi hanno realizzato versioni di questi comandi che possono
prevedere altri parametri o opzioni, per i quali si consiglia di consultare la relativa pagina di
manuale.
41

in realt`
a su Debian si tratta di un vero e proprio comando, mentre su RedHat e Suse si tratta di uno script
di shell.

7.4. IL SISTEMA DELLA RISOLUZIONE DEI NOMI

7.4

419

Il sistema della risoluzione dei nomi

Nella sezione precedente abbiamo trattato la configurazione di basso livello della rete, relativa alla
parte di protocolli gestita direttamente dal kernel. Una delle funzionalit`a di base di Internet per`
o
`e quella che consente di individuare un nodo sulla base di un nome simbolico invece che tramite
il suo indirizzo IP. Esamineremo in questa sezione la configurazione del servizio di risoluzione dei
nomi, che `e quello che consente di fare tutto ci`o. Vedremo come questa funzionalit`a sia fornita
direttamente dalle librerie del sistema e quali sono i file di configurazione che ne controllano il
comportamento.

7.4.1

Introduzione al resolver

Quando si intende utilizzare un servizio su Internet `e piuttosto raro che si debba fornire il valore
numerico di un indirizzo IP, questo perche uno dei servizi di base per il funzionamento di Internet
`e quello della risoluzione dei nomi, grazie al quale `e possibile identificare un sito o una macchina
sulla rete attraverso un nome simbolico che poi sar`a risolto nel relativo indirizzo IP.
I nomi delle macchine su Internet, i cosiddetti nomi a dominio, vengono indicati con una
forma specifica, come ad esempio nome.dominio.it, che prevede la possibilit`a di raggruppare le
macchine che fanno capo ad una stessa organizzazione sotto un suffisso comune, detto appunto
dominio; tratteremo i dettagli di tutto questo in sez. 9.1.1. Le singole macchine hanno comunque
un loro nome proprio, il cosiddetto hostname, che le identifica e che si pu`o definire in maniera
generica indipendentemente dal fatto che queste siano parte di una rete o di un dominio.
Su Internet la risoluzione dei nomi viene realizzata attraverso un apposito servizio, il cosiddetto Domain Name Service (da qui in avanti DNS) che tratteremo in cap. 9. Questo servizio `e
in sostanza un enorme database distribuito, interrogabile via rete, che associa un nome simbolico
(nella forma di un nome a dominio) al corrispondente indirizzo IP.42 Qualora sia necessaria una
risoluzione si pu`
o interrogare il DNS; ogni programma che vuole accedere ad un nodo attraverso
il suo nome invece che con il numero IP `e quindi un client per questo servizio.
Dato che la risoluzione dei nomi `e un servizio usato da un gran numero di programmi diversi,
in un sistema unix-like questo viene effettuato tramite una serie di funzioni, inserite direttamente nelle librerie standard del C, che vanno a costituire quellinsieme di funzionalit`a che viene
chiamato resolver, e che permette di ottenere le associazioni fra nodi della rete ed i nomi identificativi associati agli stessi. Si tenga presente che tutto ci`o non riguarda soltanto lassociazione
fra nome a dominio e numero IP, ma anche quella fra numero di porta e nome del corrispondente
servizio ed altro ancora.

Figura 7.5: Schema di funzionamento delle funzioni del resolver.


42

in realt`
a il servizio DNS fornisce anche molte altre informazioni, ma torneremo su questo in sez. 9.

420

CAPITOLO 7. LAMMINISTRAZIONE DI BASE DELLE RETI

Per questo prima di trattare del DNS in quanto servizio fornito sulla rete, dovremo prendere
in considerazione i file di configurazione usati dalle funzioni di libreria del resolver, che sono
quelle che svolgono in maniera generica il servizio di risoluzione dei nomi, e che non necessariamente eseguono questo compito rivolgendosi ad un server DNS. Le librerie infatti consentono di
mantenere le informazioni relative alla risoluzione su diversi supporti, definendo una interfaccia
astratta che viene usata dai programmi, secondo larchitettura illustrata in fig. 7.5.
Se restiamo nella nostra analogia telefonica, il sistema del resolver `e in sostanza il meccanismo
che ci porta dal conoscere il nome del destinatario allavere il suo numero di telefono. Come
per il telefono questo pu`
o avvenire in pi`
u modi, si pu`o andare a cercare sulla rubrica, che nel
caso `e realizzata dal file /etc/hosts (vedi sez. 7.4.3), si pu`o cercare nellelenco del telefono,
oppure ci si pu`
o rivolgere ad un server DNS, che `e pi`
u simile al servizio 12 cui si chiedevano i
43
numeri degli abbonati. Luso del DNS ha anche il vantaggio (come il servizio 12 rispetto ad
una rubrica) che qualora una associazione fra nome e indirizzo IP dovesse cambiare questa viene
aggiornata automaticamente.
Per questo motivo una delle informazioni che di norma vengono richieste nella configurazione
manuale della rete44 `e lindirizzo IP del server DNS (ogni provider ne mette a disposizione almeno
uno) che dovr`a essere usato per ottenere la risoluzione dei nomi consentendo cos` la normale
navigazione su Internet in cui si contattano i server con il loro nome a dominio.

7.4.2

I file di configurazione del resolver

Abbiamo gi`a visto come in un sistema unix-like, oltre alla risoluzione dei nomi a dominio, esista
la necessit`a di poter effettuare molte altre associazioni fra valori simbolici e numerici, come quelle
fra numero di porta e nome del servizio, fra user-id e nome di login dellutente, ecc. Siccome
questo tipo di corrispondenze possono essere mantenute in diversi modi, le librerie del C GNU
prevedono una modularizzazione di questi servizi, attraverso il sistema del Name Service Switch,
trattato in sez. 4.3.6.
Come avevamo accennato allora questo sistema si applica anche ai nomi relativi alla rete,
per i quali sono state previste una opportuna serie di classi; un estratto della sezione del file
/etc/nsswitch.conf che concerne queste configurazioni `e il seguente:
...
hosts:
networks:
protocols:
services:
ethers:
rpc:
...

files dns
files
db files
db files
db files
db files

Nel caso di risoluzione dei nomi a dominio la riga che interessa `e quella relativa a hosts.45
Limpostazione riportata nel precedente esempio ci dice che prima si dovr`a andare a risolvere
i nomi usando i file locali standard (cio`e /etc/hosts) e poi il DNS. Se si volessero mettere le
corrispondenze fra macchine locali e nomi su un server LDAP si potrebbe modificare questa
linea come:
hosts:
43

files ldap dns

anche se oggi non esiste pi`


u, continueremo a fare riferimento al vecchio numero, cos` da evitare pubblicit`
a ad
uno specifico fornitore di servizio.
44
ogni distribuzione prevede un suo sistema, e molte volte queste informazioni sono richieste anche in fase di
installazione.
45
torneremo sulle altre in sez. 7.4.4.

7.4. IL SISTEMA DELLA RISOLUZIONE DEI NOMI

421

nel qual caso, prima di interrogare il DNS, il Name Service Switch provvederebbe ad effettuare
una ricerca su LDAP. A meno di non avere una esigenza specifica di questo tipo, in genere non
ci sono motivi per modificare il contenuto di questo file.
Il sistema del resolver per`
o `e antecedente allintroduzione del Name Service Switch ed a lungo
`e stato controllato da una sua specifica serie di file di configurazione che consentivano, come
vedremo, anche di scegliere lordine in cui viene effettuata la ricerca dei dati sui vari supporti
per effettuare la risoluzione. Dato che la configurazione classica consentiva solo la scelta fra i
file locali ed il DNS questo aspetto oggi viene gestito dal Name Service Switch, che consente
una scelta su un numero arbitrario di supporti diversi; gli altri file vengono comunque utilizzati
e sono quelli che permettono di controllare le modalit`a con cui si effettuano le interrogazioni al
servizio DNS.
Il principale file di configurazione del resolver `e /etc/resolv.conf, su cui vengono mantenute le informazioni di base necessarie al funzionamento dello stesso. Il file contiene la lista degli
indirizzi IP dei server DNS a cui ci si rivolge quando si vuole effettuare una risoluzione e lindicazione del dominio locale. Il formato del file `e molto semplice, una serie di righe nella forma di
una direttiva seguita da valore (separate da spazi) con le righe vuote e quelle che iniziano per
# che vengono ignorate. Un possibile esempio del suo contenuto `e il seguente:
search truelite.it
nameserver 127.0.0.1
nameserver 62.48.34.25

La direttiva nameserver serve ad indicare lindirizzo IP di un server DNS a cui rivolgersi


per la risoluzione dei nomi a dominio; se ne possono specificare pi`
u di uno e la risoluzione di un
nome verr`
a eseguita interrogandoli in sequenza, nellordine in cui essi sono stati specificati. Si
possono indicare fino ad un massimo di 3 diversi server e lindirizzo deve sempre essere fornito
in forma numerica.46
La direttiva search specifica una lista (separata da spazi) di domini in cui cercare i nomi
delle macchine quando sono indicati in forma non qualificata;47 di norma si specifica come
argomento solo il dominio locale, cos` quando si effettua la ricerca su un nome, gli viene aggiunto
automaticamente quel dominio come suffisso. In questo modo si pu`o specificare solo lhostname
di un computer sulla rete locale, e la ricerca verr`a eseguita automaticamente come se lo si fosse
scritto con il nome completo. Il tutto, se se ne `e indicato pi`
u duno, verr`a ripetuto per ciascuno
dei domini presenti nella lista.
Il proprio dominio locale pu`
o comunque anche essere indicato direttamente con la direttiva
domain, che per`
o `e alternativa alla precedente.48 In tal caso tutte le volte che si richiede una
risoluzione di un nome
Un elenco delle principali direttive usate nel file `e riportato in tab. 7.17; una descrizione pi`
u
dettagliata e completa si pu`
o trovare nella pagina di manuale, ottenibile con man resolv.conf.
Direttiva
nameserver
search
domain

Significato
definisce lIP di un server DNS da utilizzare per la successiva risoluzione
dei nomi.
lista dei domini su cui effettuare una ricerca preventiva.
nome del dominio locale, se assente viene determinato sulla base di
quanto specificato con /etc/hostname.
Tabella 7.17: Direttive del file resolv.conf.

46

anche qualora si disponesse di una risoluzione statica su /etc/hosts, dato che il resolver non pu`
o risolvere
un nome senza aver prima interpretato correttamente il contenuto di questo file.
47
per forma qualificata di un nome a dominio si intende un nome completo del tipo freedom.softwarelibero.it,
usare una forma non qualificata allinterno del dominio softwarelibero.it sarebbe usare semplicemente freedom.
48
se vengono indicate entrambe prevale quella usata per ultima.

422

CAPITOLO 7. LAMMINISTRAZIONE DI BASE DELLE RETI

In genere le informazioni mantenute su /etc/resolv.conf, come il dominio locale e lIP dei


server DNS, vengono fornite in fase di installazione o di configurazione iniziale della rete. In
sostanza `e in questo file che che viene indicato qual`e il numero di telefono del servizio 12 a
cui ci si rivolge; ogni provider ne mette a disposizione almeno uno, e come vedremo in sez. 9 `e
possibile anche installarsi un server DNS locale.
Per una macchina posta in una rete locale questi valori di norma devono essere impostati
manualmente.49 In genere questo viene fatto dal programma di configurazione della rete, che,
quando vi chiede dominio e DNS, va a creare automaticamente questo file, inserendovi le direttive
search e nameserver con i valori da voi forniti.
Se invece si sta usando un collegamento punto-punto con un modem o una ADSL sono i
programmi che lanciano la connessione (cio`e pppd o leventuale interfaccia a questultimo, vedi
sez. 7.5.2) che usano le informazioni ottenute dal provider durante la fase di negoziazione del
collegamento, e riscrivono al volo questo file; in questo caso pu`o servire aggiungere al volo in
un secondo tempo qualche altro DNS (ce ne sono di pubblici) qualora quello del provider avesse
problemi.
Il secondo file di configurazione principale del resolver `e /etc/host.conf, che controlla le
modalit`a di funzionamento delle funzioni che eseguono la risoluzione dei nomi. Al solito le righe
vuote od inizianti per # vengono ignorate, le altre devono contenere una parola chiave che
esprime una direttiva, che pu`
o essere seguita o meno da un valore. Un esempio comune del
contenuto di questo file `e il seguente:
order hosts,bind
multi on

La direttiva order controlla la sequenza in cui viene effettuata la risoluzione dei nomi,
nellesempio si dice che deve prima essere usato il file /etc/hosts (vedi sez. 7.4.3), e poi possono
essere eseguite eventuali interrogazioni ai DNS esterni; ad oggi questa parte viene gestita, come
accennato, dal Name Service Switch, ma si abbia cura, per evitare ambiguit`a, di usare una
configurazione coerente. La direttiva multi permette di ottenere come risposta tutti gli indirizzi
validi di una stazione che compare pi`
u volte in /etc/hosts, invece di avere solo il primo.
Direttiva
nospoof
spoofalert
reorder

Significato
attiva il controllo antispoofing,50 chiedendo la risoluzione inversa dellIP
ricevuto e fallendo in caso di mancata corrispondenza.
se nospoof `e attivo inserisce un avviso degli errori rilevati nei log di
sistema.
riordina gli indirizzi in modo da restituire per primi quelli locali.
Tabella 7.18: Principali direttive del file host.conf.

Oltre a queste due le altri principali direttive (ed il relativo significato) sono riportate in
tab. 7.18. Tutte prendono come argomenti i valori on ed off, che attivano e disattivano il
comportamento richiesto. Quando non vengono esplicitamente utilizzate, il comportamento di
default `e equivalente ad off. Per lelenco completo ed i dettagli su tutte le direttive si pu`o al
solito consultare la pagina di manuale con man host.conf.

7.4.3

La gestione locale dei nomi

Normalmente il primo metodo utilizzato dal resolver per effettuare una corrispondenza fra nomi
simbolici e indirizzi IP `e utilizzare il contenuto di /etc/hosts. Questo file contiene un elenco di
nomi di macchine, associati al relativo indirizzo IP. Lo si usa quindi come unagenda del telefono
49

a meno di non usare il servizio DHCP, vedi sez. 8.2.2.


con spoofing si intende in genere quella tecnica che prevede la creazione di pacchetti IP con indirizzo sorgente
falsificato, per cercare di impersonare una macchina diversa.
50

7.4. IL SISTEMA DELLA RISOLUZIONE DEI NOMI

423

per specificare gli indirizzi delle macchine per le quali si ha una mappa statica degli indirizzi, ad
esempio le macchine di una rete privata che non vanno su Internet, ma che volete risolvere col
nome che gli avete assegnato.
Il formato del file `e molto semplice, al solito le righe vuote od inizianti per # sono ignorate
mentre le altre righe devono contenere, separati da spazi o caratteri di tabulazione, lindirizzo
IP, il nome completo (in termini di dominio, quello che viene detto FQDN, Fully Qualified
Domain Name) ed una eventuale lista di nomi alternativi. Un possibile esempio di questo file `e
il seguente:
# private nets
192.168.168.10
192.168.168.11

gont.gnulinux.it
oppish.gnulinux.it

gont
oppish

che associa agli IP delle macchine che in fig. 7.4 sono sulla rete secondaria di havnor i relativi
nomi.
Ovviamente usare questo file `e la maniera pi`
u semplice per identificare una macchina su una
rete locale, lo svantaggio `e che deve essere presente su ogni macchina, e quando il numero di nodi
coinvolti aumenta, diventa sempre pi`
u complicato il lavoro di tenerli tutti aggiornati e coerenti
fra loro. Per questo vedremo in sez. 9.2.4 come fare lo stesso lavoro attraverso un server DNS
locale.
Benche il file faccia riferimento a delle caratteristiche tipiche delluso della rete, esso deve
essere presente anche quando la macchina non `e fisicamente in rete in quanto linterfaccia di
loopback viene comunque utilizzata da molti programmi, che fanno riferimento a questo file per
la risoluzione del nome localhost, ad essa associato, sullindirizzo 127.0.0.1.
Un caso particolare di gestione dei nomi `e quello che riguarda il nome che contraddistingue la
macchina stessa, comunemente detto hostname. Benche lhostname abbia di solito pi`
u significato
quando si `e collegati in rete, come accennato il nome di una macchina `e una propriet`a del tutto
indipendente dalla presenza in rete della stessa, e viene riportato anche da vari comandi di
sistema non attinenti alla rete, come uname, nel prompt della shell o nelle schermate di avvio.
Di norma buona parte delle distribuzioni chiedono il nome della macchina in fase di installazione e lo memorizzano in un opportuno file di configurazione.51 Questo file viene usato negli
script di avvio per leggere il nome della macchina quando questo viene impostato con il comando
hostname. Perci`
o si deve essere consapevoli che cambiare il contenuto di questo file non cambia
il nome della macchina fintanto che non si chiama direttamente anche hostname o si rieseguono
gli script di avvio.
Se invocato direttamente il comando hostname si limita a stampare il nome della macchina,
mentre pu`
o impostare un nome diverso se questultimo viene passato come argomento, se invece
si usa lopzione -F il comando legge il nome da un file.52 Si pu`o richiedere anche la stampa
del nome a dominio completo con lopzione --fqdn, questo per`o dipende dal fatto che si sia
configurato il resolver per effettuare la risoluzione dei nomi, e non pu`o essere modificato dal
comando stesso.53
Il comando pu`
o essere invocato anche come dnsdomainname che invece permette di ottenere
il nome del dominio di cui si fa parte. Anche in questo caso non `e possibile modificarne il
valore con il comando, in quanto di nuovo questo valore viene sempre determinato tramite il
resolver sulla base della configurazione di questultimo. Per le altre opzioni del comando ed
51

nel caso di Debian il nome viene semplicemente scritto nel file /etc/hostname, RedHat usa la variabile
HOSTNAME nel file /etc/sysconfig/network, altre distribuzioni possono fare scelte diverse.
52
`e con questa opzione che gli script di avvio di Debian usano il contenuto di /etc/hostname.
53
quello che succede `e che il comando esegue la risoluzione del nome della macchina (ottenuto con hostname)
sul resolver e riporta il risultato ottenuto; in genere detta risoluzione viene inserita in fase di installazione in
/etc/hosts insieme allIP della stessa, per cui di fatto in tal caso detto file contiene anche la configurazione del
proprio dominio locale.

424

CAPITOLO 7. LAMMINISTRAZIONE DI BASE DELLE RETI

per una descrizione completa si pu`


o fare riferimento alla pagina di manuale, accessibile con man
hostname.

7.4.4

La gestione degli altri nomi di rete

Come accennato in sez. 7.4.2 oltre alle associazioni fra indirizzo IP e nome simbolico di una
macchina, esistono una serie di altre informazioni (si faccia riferimento a quanto riportato in
tab. 4.28) relative a protocolli e servizi di rete, di norma identificate da valori numerici, ai quali
poi viene assegnato un corrispondente nome simbolico come facilitazione mnemonica.
Queste corrispondenze oggi sono gestite tutte tramite il Name Service Switch, ma quasi
sempre, come risulta dallestratto di configurazione citato in sez. 7.4.2, vengono utilizzati i file
statici su cui tradizionalmente54 esse venivano mantenute, per questo motivo nel resto della
sezione tratteremo soltanto del formato di questi file.
In sez. 7.2.4 abbiamo gi`
a accennato come la corrispondenza fra i servizi di rete ed i numeri
di porta loro assegnati venga mantenuta nel file /etc/services; `e al contenuto di questo file
che fanno riferimento tutti i programmi che vogliono utilizzare il nome simbolico di un servizio
al posto del valore numerico della porta ad esso associato.
Di norma questo non `e un file che sia necessario modificare, ma `e utile conoscerne il contenuto.
Il formato del file `e molto semplice, un elenco di numeri di porta a ciascuno dei quali `e associato
un nome simbolico che individua il servizio ad esso associato dalle convenzioni internazionali o
dalluso comune. Un estratto di questo file, preso da una Debian Sarge, `e il seguente:
...
ftp-data
20/tcp
ftp
21/tcp
fsp
21/udp
ssh
22/tcp
ssh
22/udp
telnet
23/tcp
# 24 - private
smtp
25/tcp
# 26 - unassigned
time
37/tcp
time
37/udp
whois
43/tcp
re-mail-ck
50/tcp
re-mail-ck
50/udp
domain
53/tcp
domain
53/udp
mtp
57/tcp
bootps
67/tcp
bootps
67/udp
bootpc
68/tcp
bootpc
68/udp
tftp
69/udp
gopher
70/tcp
gopher
70/udp
rje
77/tcp
finger
79/tcp
www
80/tcp
www
80/udp
...

fspd
# SSH Remote Login Protocol
# SSH Remote Login Protocol

mail
timserver
timserver
nicname

nameserver
nameserver

# Remote Mail Checking Protocol


# Remote Mail Checking Protocol
# name-domain server
# deprecated
# BOOTP server
# BOOTP client

# Internet Gopher
netrjs
http

# WorldWideWeb HTTP
# HyperText Transfer Protocol

Come per buona parte dei file di configurazione, righe vuote e tutto quello che segue il
carattere # viene considerato un commento ed ignorato; ogni riga ha il formato:
54

cio`e prima che si passasse alluso del Name Service Switch, quando le informazioni erano appunto ricavate
direttamente dalla scansione di questi file.

7.4. IL SISTEMA DELLA RISOLUZIONE DEI NOMI


nome

numero/protocollo

425

alias

dove nome e lidentificativo simbolico del servizio, numero `e il numero di porta ad esso assegnato,
protocollo indica se il servizio usa UDP o TCP, mentre alias `e una lista (separata da spazi)
di eventuali altri nomi associati allo stesso servizio.
Un secondo file che mantiene corrispondenze fra valori numerici e nomi `e /etc/networks, che
`e lanalogo di /etc/hosts per quanto riguarda le reti. Anche queste, come le singole stazioni,
possono essere identificate da un nome, e di nuovo le corrispondenze statiche fra nome e indirizzo
IP della rete vengono mantenute in questo file, il cui formato, come descritto dalla pagina di
manuale accessibile con man networks, `e composto da tre campi separati da spazi.
Il primo campo indica il nome simbolico della rete, il secondo campo il suo indirizzo, nella
notazione dotted decimal (tralasciando opzionalmente gli eventuali .0 finali), ed il terzo campo
un eventuale alias (questo campo `e opzionale). Al solito le righe vuote e tutto quello che segue
un # viene ignorato. Un esempio del contenuto di questo file potrebbe essere:
localnet 192.168.1.0
il contenuto di questo file viene utilizzato da comandi come netstat o route per mostrare i nomi
simbolici al posto dei valori numerici; si tenga conto per`o che con questo file viene supportata
solo la corrispondenza con reti espresse nella notazione tradizionale per classi di tipo A, B o C,
e che la notazione in formato CIDR non funziona.
Un altro file contenente corrispondenze fra valori numerici e nomi simbolici `e /etc/protocols,
che associa il numero usato per indicare allinterno dei pacchetti IP il protocollo di trasporto
usato nello strato successivo (si ricordi quanto detto in sez. 7.1.3) ad un nome identificativo del
protocollo stesso (come TCP e UDP).
Il formato di questo file `e identico a quello di /etc/networks; sono supportati tre campi
divisi da spazi, in cui il primo identifica il nome simbolico, il secondo il valore numerico che
identifica il protocollo ed il terzo un alias. Un esempio di questo file `e il seguente (lestratto `e
preso da una Debian):
ip
0
icmp
1
igmp
2
ggp
3
ipencap 4
st
5
tcp
6
egp
8
pup
12
udp
17
hmp
20
xns-idp 22
rdp
27
iso-tp4 29
xtp
36
ddp
37
idpr-cmtp 38
ipv6
41
ipv6-route 43
ipv6-frag 44
idrp
45
rsvp
46
gre
47
esp
50
ah
51
skip
57
...

IP
ICMP
IGMP
GGP
IP-ENCAP
ST
TCP
EGP
PUP
UDP
HMP
XNS-IDP
RDP
ISO-TP4
XTP
DDP
IDPR-CMTP
IPv6
IPv6-Route
IPv6-Frag
IDRP
RSVP
GRE
IPSEC-ESP
IPSEC-AH
SKIP

#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#

Internet protocol, pseudo protocol number


Internet control message protocol
Internet Group Management
gateway-gateway protocol
IP encapsulated in IP (officially IP)
ST datagram mode
transmission control protocol
exterior gateway protocol
PARC universal packet protocol
user datagram protocol
host monitoring protocol
Xerox NS IDP
"reliable datagram" protocol
ISO Transport Protocol class 4
Xpress Transfer Protocol
Datagram Delivery Protocol
IDPR Control Message Transport
Internet Protocol, version 6
Routing Header for IPv6
Fragment Header for IPv6
Inter-Domain Routing Protocol
Reservation Protocol
General Routing Encapsulation
Encap Security Payload
Authentication Header
SKIP

426

CAPITOLO 7. LAMMINISTRAZIONE DI BASE DELLE RETI

Al solito le righe vuote e tutto quello che segue un carattere # viene ignorato; come per
tutti gli altri file analoghi la descrizione completa del formato `e riportata nella rispettiva pagina
di manuale, accessibile con man protocols.

7.5

Altre tipologie di connessioni di rete

Finora abbiamo trattato delle configurazioni di rete facendo riferimento alla casistica tipica di
una rete locale basata sulle ordinarie schede ethernet; in questa sezione esamineremo invece la
configurazione della rete per altre tecnologie di connessione, come le interfacce punto-punto che
si usano per collegarsi tramite un modem o le interfacce wireless che si usano per collegarsi con
un access-point.

7.5.1

Cenni sul protocollo PPP

Per le configurazioni di base illustrate in sez. 7.3 abbiamo sempre fatto riferimento al caso di
una macchina inserita allinterno di una rete locale, con il caso pi`
u comune delluso di schede
ethernet, per cui ad una interfaccia non viene associato solo un indirizzo IP, ma anche una
maschera di rete.
In generale per`
o questo non `e vero, ed `e infatti `e pratica comune collegarsi ad Internet
attraverso un modem, analogico o ADSL che sia. In tal caso la comunicazione verso lesterno
non avviene attraverso il passaggio per una rete locale, ma direttamente con una macchina posta
allaltro capo della connessione, con quello che si chiama un collegamento punto-punto.
In sez. 7.2.1 abbiamo visto che esiste un apposito protocollo del livello di collegamento, il
Point to Point Protocol (comunemente detto PPP) su cui `e possibile innestare tutti i protocolli
dei livelli successivi. Nel caso specifico PPP `e un protocollo generico che permette di inviare
dati su diverse tipologie di collegamenti fisici, mantenendo una stessa struttura generale, che
consente di creare, inviare e gestire connessioni punto-punto.
Il protocollo si compone di tre parti, un metodo generico per incapsulare dati su un collegamento fisico, un protocollo estensibile per il controllo del collegamento fisico (il Link Control
Protocol o LCP) ed una famiglia di protocolli (il Network Control Protocols o NCP) per stabilire
e configurare le connessioni coi protocolli di livello superiore.
In generale PPP fa riferimento ad un qualche meccanismo sottostante di trasmissione (che
sia un modem analogico, ISDN o ADSL) sopra il quale costruisce uno strato ulteriore che gli
permette di incapsulare i protocolli di livello superiore. Luso pi`
u tipico di questo protocollo `e
comunque quello che viene fatto con i modem analogici o ADSL, per i quali permette di gestire
la creazione della connessione verso il fornitore del servizio di connessione e la configurazione
della relativa interfaccia.

7.5.2

Il demone pppd

Delle tre parti illustrate in sez. 7.5.1 di cui `e composto il protocollo PPP, lincapsulazione dei
dati `e gestita direttamente dal kernel; il relativo supporto `e abilitato di default in tutte le
distribuzioni, ed in genere da questo punto di vista non c`e da fare niente, se non assicurarsi,
qualora si sia ricompilato il proprio kernel (vedi sez. 5.2.3) di aver incluso quanto necessario nella
sezione Network device support. Tutto il resto `e affidato ad un apposito demone, pppd, che si
cura di fornire il controllo del collegamento, lautenticazione, e la parte dellNCP che riguarda la
configurazione e la gestione del protocollo IP su PPP, compresa limpostazione di una interfaccia
di rete e delle eventuali rotte ad essa associate.
Il programma pu`
o essere lanciato direttamente dalla riga di comando passandogli come argomenti le varie direttive che ne controllano il comportamento, ma in genere linvocazione avviene

7.5. ALTRE TIPOLOGIE DI CONNESSIONI DI RETE

427

attraverso un opportuna interfaccia che consente di passargli le opzioni di configurazione.55


Di default infatti, se invocato senza nessun argomento, le direttive vengono lette allavvio del
demone dal file /etc/ppp/options.56
Alternativamente si pu`
o specificare un singolo argomento che indichi il dispositivo da usare
per la connessione. Questo deve essere indicato con il relativo file di dispositivo (in genere la
seriale a cui `e agganciato il modem) sia in forma di pathname assoluto che relativo a /dev ed in
questo caso le ulteriori direttive saranno lette dal file /etc/ppp/options.ttyname;57 ad esempio
se si usa il comando:
pppd /dev/ttyS0
le direttive saranno lette dal file options.ttyS0.
Inoltre pu`
o risultare utile consentire anche gli utenti normali di attivare una connessione;58
per questo motivo `e prevista una forma diversa di avvio del demone eseguita attraverso utilizzando lopzione call a cui far seguire un nome che indichi il fornitore di servizi (il provider ) che si
vuole utilizzare. In questo caso infatti luso del comando `e consentito anche ad un utente normale59 e le direttive saranno lette da un file con quel nome posto nella directory /etc/ppp/peers.60
Cos` se ad esempio /etc/ppp/peers/adsl contiene le opzioni per chiamare il provider con un
modem ADSL, potremo attivare la connessione con:
pppd call adsl
Una volta lanciato pppd esegue le operazioni necessarie a stabilire una connessione. Le
modalit`a con cui questo avviene dipendono per`o dal tipo di linea che si usa, ad esempio se si
ha un modem analogico agganciato al telefono occorrer`a effettuare una chiamata telefonica ed
ottenere la linea prima che pppd possa entrare in azione. Essendo possibili diverse modalit`
a la
eventuale preparazione della linea viene sempre delegata ad un programma esterno con luso
della direttiva connect; questa richiede come argomento una riga di comando che verr`a eseguita
in una shell, fintanto che il comando non sar`a eseguito con successo, pppd non far`a alcun accesso
alla linea.
Nel caso di collegamenti telefonici tramite modem analogico per la preparazione della linea si
fa normalmente ricorso alluso del comando chat, ed un esempio possibile della sua invocazione
potrebbe essere tramite una direttiva del tipo:
connect "/usr/sbin/chat -v -f /etc/chatscripts/provider"

In questo caso chat viene usato per dare le istruzioni al modem e verificare la riuscita della
chiamata. Le opzioni pi`
u importanti del comando sono -f che permette di indicare un file che
contiene le istruzioni da eseguire, e -v che permette di registrare i risultati della comunicazione
a scopo di controllo. Il comando opera leggendo dal file indicato (il cosiddetto chat script) le
istruzioni con le quali gestire la comunicazione iniziale con il modem.
Uno script di chat `e usualmente composto da una serie di coppie di valori, in cui il primo
valore indica quello che ci si attende di sentire dal dispositivo ed il secondo quanto si deve
55

abbiamo ad esempio accennato in sez. 7.3.3 come con Debian questo possa essere fatto direttamente da
/etc/network/interfaces.
56
le direttive, nella documentazione del programma, vengono chiamate opzioni, per evitare confusione con le
normali opzioni dei comandi ordinari.
57
cos` `e possibile scegliere automaticamente configurazioni diverse per i diversi dispositivi.
58
in genere pppd `e suid per root ed eseguibile per gli utenti che fanno parte di un opportuno gruppo (dip nel
caso di Debian).
59
in realt`
a un utente pu`
o eseguire comunque il comando, nel qual caso esso far`
a riferimento alle direttive presenti
nel file .ppprc della sua home, ma questo file non pu`
o contenere direttive privilegiate ed `e pertanto sottoposto a
restrizioni che lo rendono poco pratico (per i dettagli si consulti la pagina di manuale).
60
ed `e questo appunto il metodo usato da Debian in /etc/network/interfaces.

428

CAPITOLO 7. LAMMINISTRAZIONE DI BASE DELLE RETI

scrivere in risposta. Le coppie si scrivono usualmente una per riga in due campi separati da
spazi per maggiore leggibilit`
a ma si possono scrivere anche spezzate su pi`
u righe (nel qual caso il
61
ritorno a capo vale come separatore) o su una sola riga. Alla ricezione del valore specificato nel
primo campo viene inviata la stringa indicata nel secondo,62 in questo modo si pu`o controllare
il modem ed inviare comandi e dati sulla linea in una specifica sequenza.
In realt`a oltre alle normali coppie di valori di attesa/risposta, il comando supporta anche
alcune istruzioni chiave; ad esempio con ABORT usato come valore di attesa si definiscono le
condizioni in cui viene abortita la connessione, specificate nel valore di risposta con altrettante
parole chiave,63 che valgono indipendentemente dal momento in cui la condizione si va a verificare
nella sequenza delle istruzioni. Esistono inoltre delle sequenze di controllo, introdotte dalla solita
barra rovescia \, che consentono di inserire caratteri speciali come il ritorno a capo, o, con
lespressione \T, un valore arbitrario (in genere usato per indicare il numero di telefono),
passato al comando chat con lopzione -T. Al solito per i dettagli sulle opzioni e sulle altre
istruzioni di controllo si consulti la pagina di manuale.
Un esempio elementare di chat script, estratto dal file /etc/chatscripts/pap che viene
distribuito con Debian Lenny, `e il seguente:64
ABORT
ABORT
ABORT
ABORT
ABORT
""
OK
CONNECT

BUSY
VOICE
"NO CARRIER"
"NO DIALTONE"
"NO DIAL TONE"
ATZ
ATDT\T
""

Si noti come dopo aver definito le varie condizioni di interruzione, si inizia lo script non
aspettandosi niente (questo il significato della stringa vuota "") a cui si risponde con il comando
ATZ del modem.65 Alla risposta OK si esegue il comando ATDT, che esegue la telefonata al
numero telefonico indicato con lopzione -T di chat.66 Alla risposta CONNECT lo script finisce e
il controllo passa direttamente a pppd che a questo punto si suppone sia in grado di parlare con
il corrispettivo dallaltra parte.
Si tenga presente che uno script siffatto non `e detto sia sempre corretto, ad esempio alcuni
provider richiedevano una procedura di login prima di attivare il proprio demone pppd sullaltro
capo della connessione, questo poteva comportare la necessit`a di ulteriori linee come:
ogin: username
ssword: password

in cui alla richiesta di login: viene inviato un username, ed alla successiva richiesta di password: viene inviata la password. Si noti come in questultimo esempio a chat basti una
corrispondenza parziale nella richiesta per inviare una risposta; la ragione di tutto ci`o origina
nei difetti presenti ai tempi delle prime connessioni via modem che talvolta provocavano la perdita dei primi caratteri inviati; usando una corrispondenza parziale la procedura poteva proseguire
senza errori.
61

questo comporta che se si vuole aspettare o inviare un valore che contiene spazi occorrer`
a esprimerlo scritto
fra virgolette.
62
il default `e inviare la stringa seguita da un ritorno a capo, si pu`
o disabilitare questo comportamento
aggiungendo il carattere di controllo \c.
63
i valori possibili (si consulti la pagina di manuale) sono BUSY, VOICE, NO DIALTONE, ecc.
64
si sono omesse le righe di commento, introdotte al solito dal carattere #.
65
non tratteremo qui i cosiddetti Comandi Hayes (o comandi AT) usati dai modem per gestire le linee telefoniche,
per un riferimento si consulti http://en.wikipedia.org/wiki/Hayes_command_set.
66
luso di -T `e del tutto opzionale, si sarebbe potuto scrivere esplicitamente il numero di telefono allinterno
dello script di chat.

7.5. ALTRE TIPOLOGIE DI CONNESSIONI DI RETE

429

Oggi le connessioni via modem analogico sono sempre meno comuni, ma la precedente trattazione resta valida per tutte le connessioni eseguite tramite linee seriali, come quelle associate a
varie schede di comunicazione GSM o GPRS, o alle connessioni effettuate tramite collegamento
bluetooth al proprio cellulare.
La situazione `e invece del tutto diversa se invece si ha a che fare con un modem ADSL, in
tal caso infatti non si dovr`
a affatto effettuare una telefonata o la preparazione della linea, per
cui non sar`
a pi`
u necessario invocare chat. In questo caso la configurazione varia a seconda del
tipo di modem utilizzato e dal tipo di protocollo (principalmente PPPoA, pi`
u raro PPPoE) ed
i dettagli eccedono quanto sia possibile trattare qui.
Se la connessione viene stabilita regolarmente, il demone pppd si incaricher`a di creare una
nuova interfaccia di comunicazione (il default `e luso di ppp0) associata alla connessione ed
opportunamente configurata in modalit`a punto-punto; si avr`a cio`e qualcosa del tipo:
anarres:/home/piccardi# ifconfig
lo
Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:16436 Metric:1
RX packets:8890912 errors:0 dropped:0 overruns:0 frame:0
TX packets:8890912 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:3729080730 (3.4 GiB) TX bytes:3729080730 (3.4 GiB)
ppp0

Link encap:Point-to-Point Protocol


inet addr:151.49.5.174 P-t-P:151.6.144.72 Mask:255.255.255.255
UP POINTOPOINT RUNNING NOARP MULTICAST MTU:9178 Metric:1
RX packets:73874097 errors:0 dropped:0 overruns:0 frame:0
TX packets:72996070 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:3
RX bytes:1180778093 (1.0 GiB) TX bytes:3882710341 (3.6 GiB)

Se poi si `e utilizzata la direttiva defaultroute il programma si incaricher`a anche di impostare


automaticamente una rotta di default per far passare dalla interfaccia il traffico diretto verso
Internet,67 mentre con la direttiva usepeerdns si richiede limpostazione automatica dei DNS
forniti dal provider con la creazione automatica di un opportuno resolv.conf allattivazione
del collegamento ed il ripristino del precedente alla sua conclusione.
Inoltre tutte le volte che lattivazione di un collegamento ha successo viene lanciato lo script
/etc/ppp/ip-up che si cura eseguire una serie di azioni programmate relative alla presenza
di una nuova connessione (ad esempio far scaricare la posta e le news). In generale questo
script si limita ad eseguire tutti gli script posti in /etc/ppp/ip-up.d con il comando run-parts
(che abbiamo visto in sez. 3.2.1). Allo stesso modo, quando la connessione viene chiusa viene
lanciato lo script /etc/ppp/ip-down che esegue quelli presenti in /etc/ppp/ip-down.d, dopo
di che linterfaccia di rete viene disattivata.
In tab. 7.19 si sono riportate le direttive di configurazione pi`
u significative di pppd, insieme
ad una loro breve descrizione. Lelenco completo, ed i dettagli relativi a ciascuna di esse sono al
solito disponibili nella pagina di manuale del comando, accessibile con man pppd.

7.5.3

I meccanismi di autenticazione

Al di l`a della possibile necessit`


a di autenticarsi per laccesso direttamente sulla linea seriale
(come mostrato nellesempio riguardante chat) il demone pppd prevede una sua procedura di
autenticazione diretta, disponibile quando stabilisce la comunicazione con il suo corrispettivo
allaltro lato della connessione. Questa autenticazione pu`o avvenire secondo due protocolli, il
67

la creazione di una rotta per laltro capo della connessione punto-punto avviene automaticamente alla
configurazione dellinterfaccia.

430

CAPITOLO 7. LAMMINISTRAZIONE DI BASE DELLE RETI


Direttiva
call name
connect script
crtscts
defaultroute
lock
demand
usepeerdns

debug

Significato
usa le opzioni contenute nel file name in /etc/ppp/peers.
usa lo script script (di norma chat) per preimpostare la linea.
attiva il controllo di flusso hardware sulle porte seriali.
aggiunge una rotta di default alla tabella di instradamento usando
lindirizzo IP ricevuto sulla connessione.
crea un file di lock per la seriale.
crea la connessione a richiesta quando vede del traffico.
chiede alla connessione gli indirizzi di due server DNS, che vengono
passati allo script /etc/ppp/ip-up nelle variabili di ambiente DNS1 e
DNS2 ed usati per la creazione di un file resolv.conf che li usi come
server DNS.
abilita il debugging, `e utile per avere pi`
u informazioni quando la
connessione non funziona.
Tabella 7.19: Principali opzioni per il demone pppd.

Password Authentication Protocol (noto come PAP) ed il Challenge Handshake Authentication


Protocol (noto come CHAP).
Il PAP `e un protocollo pi`
u elementare e prevede che il client invii un username ed una
password in chiaro sulla linea; si `e cos` esposti ad una eventuale intercettazione telefonica. Il
CHAP invece prevede linvio da parte del server di una sfida nella forma di un pacchetto che
contiene il nome del server, cos` che il client pu`o rispondere con un pacchetto che contenga un
hash crittografico del pacchetto di sfida cui si `e aggiunto il valore di un segreto condiviso (la
password) cos` da comprovare la conoscenza del segreto senza inviarlo sulla linea.
Le informazioni di autenticazione usate dal demone pppd per i due protocolli vengono mantenute in due file, /etc/ppp/pap-secrets e /etc/ppp/chap-secrets, che hanno lo stesso
formato. Un esempio del contenuto di uno questi file `e il seguente:
# INBOUND connections
# UserIDs that cannot use PPP at all. Check your /etc/passwd and add any
# other accounts that should not be able to use pppd!
guest
frijole "*"
master frijole "*"
root
frijole "*"
support frijole "*"
stats
frijole "*"
# OUTBOUND connections
piccardi *
password

Il file prevede quattro campi separati da spazi; il primo campo indica lusername usato dal
client, il secondo il nome del server, il terzo il segreto condiviso, il quarto, opzionale, una lista
degli IP da cui `e possibile effettuare il collegamento (un - indica nessun IP), si possono indicare
delle sotto-reti in notazione CIDR ed usare un ! iniziale per negare la selezione.
I nomi di client e server possono contenere caratteri qualunque, ma gli spazi e gli asterischi
devono essere protetti scrivendoli fra virgolette; il valore * indica un nome qualsiasi e fa da
wildcard. Se il campo della password inizia con il carattere @ si indica che questultima deve
essere letta dal file il cui nome `e specificato dal resto della stringa.
Dato che il collegamento `e punto-punto il procedimento di autenticazione `e simmetrico: ogni
demone pu`o chiedere allaltro di autenticarsi; per questo i file contengono sia le informazioni per
essere autenticati presso gli altri che per autenticarli. Di norma per`o, a meno di non gestire un
provider, si deve solo essere autenticati, per questo il default `e che pppd non esegue richieste di
autenticazione, ma si limita a rispondere a quelle che gli vengono fatte.

7.5. ALTRE TIPOLOGIE DI CONNESSIONI DI RETE

7.5.4

431

La connettivit`
a Wi-Fi

Una delle tecnologie di rete che nei tempi recenti sta vedendo una grande diffusione, dati i
vantaggi che comporta non richiedendo la presenza di una infrastruttura cablata per realizzare
la comunicazione, `e quella legata alle tecnologie basate sulla trasmissione dati via radio, che
viene indicata in maniera generica come wireless. In realt`a le tecnologie senza fili sono molte
ma quella che tratteremo in questa sezione e nelle successive `e quella che viene pi`
u propriamente
indicata come Wi-Fi (dal nome adottato dal relativo consorzio di produttori) e che fa riferimento
allo standard di comunicazione IEEE 802.11 nelle sue numerose varianti.
A differenza di quanto visto per PPP in questo caso si tratta, come si pu`o capire dalluso di
uno standard della stessa famiglia di quello delle classiche reti ethernet cablate, di una tecnologia
pensata per la realizzazione di reti locali; pertanto molti dei concetti gi`a visti per quel protocollo
di collegamento fisico (come il MAC address) si applicano anche a queste tecnologie.
La maggiore differenza con ethernet in questo caso, a parte lassenza di connessioni via cavo,
`e che il protocollo prevede a livello di collegamento fisico dei meccanismi di autenticazione e
di cifratura dei dati, onde impedire che chiunque possa collegarsi ad una rete wireless altrui o
leggerne i dati. Inoltre fa sempre parte del protocollo il supporto per creare e gestire una rete
locale senza fili (quella che si suole chiamare una Wireless LAN o WLAN) in cui le macchine
comunicano fra loro utilizzando un opportuno punto di accesso.
Nelluso effettivo una rete Wi-Fi presenta poi anche delle altre differenze pi`
u sottili rispetto
ad una ethernet ordinaria, come ad esempio il fatto che, non essendovi una connessione diretta
fra tutte le macchine che ne fanno parte, si possono avere situazioni in cui una macchina ne vede
altre due, ma queste non si vedono fra di loro. Inoltre la tecnologia supporta diverse modalit`
a
operative, compresa la possibilit`
a di connessioni dirette fra macchine senza dover creare una
vera rete locale.
Per tutti questi motivi quando si ha a disposizione una scheda di rete Wi-Fi la semplice
assegnazione di un indirizzo, come si farebbe per una scheda ethernet non `e sufficiente. In
genere infatti una rete WLAN `e gestita grazie alluso di uno o pi`
u dispositivi che ne curano
lassemblaggio, detti access point (o in breve AP) dato che appunto svolgono il ruolo di punti di
accesso alla rete stessa.
In questo caso si tratta di apparati specifici, spesso dotati anche di connessione ethernet, il cui
ruolo pu`o essere sia quello di fare da ponte fra la rete Wi-Fi e quella ethernet,68 sia quello fornire
il supporto per la creazione di una WLAN estesa in cui le singole macchine possono collegarsi
per poi comunicare fra loro (anche quando le loro interfacce non siano in grado di vedersi
direttamente) con la capacit`
a ulteriore di gestire il cosiddetto roaming (in cui una macchina
opera sulla stessa WLAN passando da un access point allaltro) per poter coprire una area pi`
u
vasta.
Per poter entrare nella rete (e comunicare poi con le altre macchine che ne fanno parte)
`e in genere necessario prima collegarsi (o meglio, per usare il gergo utilizzato dal protocollo,
associarsi). Vedremo che questo comporta una serie di passi, fra cui `e prevista sia la scelta della
rete (trattandosi di onde radio possono sussistere reti diverse nello stesso spazio) che le modalit`
a
di collegamento e le eventuali restrizioni di accesso.
Dato che per la natura stessa delle trasmissioni radio pi`
u access point possono essere raggiungibili da una stessa interfaccia, ciascuna rete Wi-Fi viene identificata da un opportuno
identificativo denominato ESSID (Extended Service Set ID), una stringa alfanumerica che la
distingue dalle altre presenti nello stesso spazio e che in genere viene impostata sullaccess point
(o sugli access point, se si costruisce una rete con pi`
u celle) che la gestiscono. Uno dei passi che
consente luso di una rete Wi-Fi `e proprio quello relativo alla impostazione su una interfaccia
68

proprio nel senso di un bridge analogo a quello con cui si possono unire due tratti di rete ethernet.

432

CAPITOLO 7. LAMMINISTRAZIONE DI BASE DELLE RETI

di questo valore, che consente di scegliere a quale, fra le eventuali reti disponibili, ci si vuole
associare.
In questo caso una interfaccia di rete Wi-Fi deve essere configurata per operare nel cosiddetto
infrastructure mode, cio`e in una modalit`
a operativa in cui essa diventa parte di una WLAN. In
realt`a questa modalit`
a pu`
o essere usata in due modi diversi, come macchina client che fa parte
della rete (il cosiddetto station infrastructure mode o managed mode, che `e il caso pi`
u comune,
quello in cui ci si vuole collegare alla rete) o come server che fornisce il punto di accesso (il
cosiddetto AP infrastructure mode o manager mode).69
Oltre a questa, che `e la pi`
u comune, esistono altre modalit`a di uso di una rete Wi-Fi ; ad
esempio si pu`o utilizzare lad-hoc mode per creare una connessione fra diverse schede quando
non sia disponibile un access-point; in questo caso ciascuna macchina diventa responsabile di
gestire la propria rete, e non esiste un access point che la governa. Una ulteriore modalit`a di
utilizzo di una scheda Wi-Fi `e il cosiddetto monitor mode, usato per leggere in maniera passiva
(cio`e senza trasmettere nulla) i pacchetti che vengono ricevuti, e che in genere viene utilizzato
per analizzare il traffico.

7.5.5

I wireless tool di Linux

Uno dei problemi maggiori nella gestione delle interfacce wireless `e quello della loro estrema
variet`a e della complessit`
a dei meccanismi necessari al loro funzionamento. Sono state infatti
realizzate diverse varianti dello stesso standard IEEE 802.11, anche incompatibili fra di loro per
frequenze radio o modalit`
a operative, e diversi meccanismi di autenticazione e cifratura.70
Questo ha comportato anche una discreta confusione anche nelle diverse realizzazioni del supporto fornito dal kernel per queste tecnologie, con implementazioni concorrenti delle varie parti
dei protocolli a seconda del tipo di scheda ed un proliferare di programmi ad hoc.71 Da alcuni
anni `e comunque in corso una ristrutturazione completa,72 con la creazione di una infrastruttura
univoca per tutto quello che non riguarda la gestione fisica del dispositivo.
Benche nella ristrutturazione del supporto per le reti Wi-Fi sia in corso una anche transizione
verso nuovi strumenti di amministrazione,73 questa non copre ancora tutte le schede e tutte le
funzionalit`a, per cui tratteremo solo linterfaccia classica delle cosiddette Wireless Extension e
dei relativi wireless-tools, che resta tuttora supportata da tutte le schede anche se non viene pi`
u
ulteriormente sviluppata.
Il primo comando fornito dai wireless-tools `e iwconfig, che consente di effettuare le impostazione di una interfaccia di rete per quanto riguarda i parametri specifici di una rete wireless.
Il comando ha una sintassi simile a quella ifconfig e richiede come primo argomento il nome
di una interfaccia di rete. Se invocato senza altri argomenti stampa le caratteristiche di quella
interfaccia o la stringa no wireless extension se questa non `e una interfaccia di rete wireless. Si
pu`o invocare il comando anche senza nessun argomento nel qual caso stamper`a le caratteristiche
di tutte le interfacce di rete presenti. Un esempio tipico di questo comando `e:
69

vale a dire se si vuole fare da access point, questo, se la propria interfaccia di rete lo supporta, `e sempre
possibile ma occorrer`
a usare del software aggiuntivo, hostapd, che fornisca i servizi necessari alla gestione di una
WLAN.
70
anche perche questi per lungo tempo si sono dimostrati del tutto inefficaci e completamente vulnerabili.
71
a cui si aggiunge le problematiche dovute al fatto che non tutte le schede sono in grado di supportare tutte
le modalit`
a operative in maniera nativa.
72
levoluzione del supporto del kernel per le tecnologie Wi-Fi `e molto complesso e non staremo a percorrerlo,
basti sapere che al momento queste sono state suddivise in tre sezioni distinte, la nuova interfaccia di configurazione
delle schede interna al kernel, denominata cfg80211, la nuova interfaccia di configurazione verso le applicazioni in
user-space, denominata nl80211, e linterfaccia per la delegazione di alcune funzionalit`
a di gestione a programmi
in user-space, denominata mac80211.
73
questi sono realizzati attraverso un nuovo comando generico iw, che consente di configurare i vari aspetti
tramiti altrettanti sotto-comandi, questo per`
o `e ancora in sviluppo.

7.5. ALTRE TIPOLOGIE DI CONNESSIONI DI RETE

433

anarres:~# iwconfig
lo
no wireless extensions.
eth0

no wireless extensions.

eth1

IEEE 802.11b ESSID:"Laneed"


Mode:Managed Frequency:2.412 GHz Access Point: 00:90:FE:72:4D:87
Bit Rate:11 Mb/s
Sensitivity:1/0
Retry limit:8
RTS thr:off
Fragment thr:off
Encryption key:off
Power Management:off
Link Quality=40/70 Signal level=-62 dBm Noise level=-98 dBm
Rx invalid nwid:0 Rx invalid crypt:0 Rx invalid frag:239715
Tx excessive retries:202 Invalid misc:0
Missed beacon:0

in cui si pu`
o notare come le prime due interfacce di rete (il loopback ed una scheda ethernet
ordinaria) non hanno supporto wireless, mentre la seconda scheda ha il supporto per la versione
IEEE 802.11b del protocollo.
Il comando, oltre alla versione del protocollo stampa il valore dellESSID a cui la scheda
`e associata, a questo seguono altre informazioni, come il modo (nel caso specifico Managed,
si ricordi quanto appena detto in sez. 7.5.4) la frequenza del canale usato ed il MAC Address
dellaccess point e tutta una serie di ulteriori informazioni, fra cui `e sempre opportuno tenere
sotto controllo quelle relative alla qualit`a del segnale, riportate sulla sesta riga.74
Oltre alla stampa dello stato di una interfaccia, il comando consente anche di impostarne i vari
parametri funzionali della stessa, in questo caso deve essere specificato come primo argomento il
nome dellinterfaccia seguito nome del parametro e dal relativo valore come ultimo argomento.
Ad esempio col parametro essid si imposta lESSID della rete a cui si vuole che la scheda si
associ, mentre con mode si imposta la sua modalit`a operativa. Si sono riportati in tab. 7.20 i
parametri pi`
u rilevanti, per una trattazione completa si consulti la pagina di manuale.
Parametro
essid

mode

rate

key

freq
channel

Significato
imposta il valore dellESSID, prende una stringa o il valore speciale
any che su alcune schede consente di utilizzare qualunque ESSID (il
cosiddetto ESSID promiscuo).
imposta la modalit`
a operativa dellinterfaccia, i valori possibili sono:
Managed, nodo connesso ad una rete di access point; Ad-Hoc, rete senza
access point e con una sola cella; Master nodo che agisce come access
point; Repeater, nodo che agisce come ripetitore di pacchetti; Secondary, nodo che agisce come ripetitore o access point di backup; Monitor,
nodo non associato a nessuna rete che ascolta passivamente.
per le schede che supportano diverse velocit`
a di trasmissione imposta
quella da usare (espressa in forma bit al secondo o in automatico con
auto).
imposta le chiavi di cifratura, espresse in forma esadecimale: indicando
solo la chiave questa diventer`
a quella attiva, altrimenti si pu`
o appendervi un indice numerico fra parentesi quadre ([N]) per memorizzarla;
indicando solo lindice si rende la relativa chiave attiva, indicando open
si consente luso di sessioni non cifrate, mentre aggiungendo restricted
si richiede luso di sole sessioni cifrate.
imposta la frequenza di trasmissione fra quelle disponibili (alternativa
a channel).
imposta il canale di trasmissione fra quelli disponibili (alternativa a
freq).

Tabella 7.20: Principali parametri operativi impostabili con iwconfig.


74

se questa cala eccessivamente si potr`


a perdere la connessione, o avere grossi problemi di traffico.

434

CAPITOLO 7. LAMMINISTRAZIONE DI BASE DELLE RETI

Oltre a iwconfig i wireless-tools forniscono un secondo comando, iwlist, che viene utilizzato
per ottenere informazioni relative allinterfaccia ed alla rete. Il comando richiede in genere
come primo argomento linterfaccia da usare (ma se non specificato le prova tutte) seguita
dalla operazione da eseguire. Ad esempio con scanning si pu`o ottenere la lista degli access
point e delle celle ad-hoc raggiungibili dallinterfaccia, con le relative informazioni (come ESSID,
frequenze/canali utilizzati, qualit`
a del segnale ecc.).
Argomento
scan
freq
chan
key

Significato
esegue una scansione per la ricerca delle reti Wi-Fi raggiungibili e
riporta le relative informazioni.
stampa la lista delle frequenze di trasmissione disponibili e dei relativi
canali associati.
come freq.
elenca le chiavi di cifratura impostate sul dispositivo.
Tabella 7.21: Principali argomenti di iwlist.

Si `e riportato in tab. 7.21 un elenco delle principali richieste eseguibili con iwlist, al solito
per tutti i dettagli e lelenco completo si consulti la relativa pagina di manuale

7.6

I comandi diagnostici

Una volta eseguita la configurazione di base della rete in genere `e opportuno controllarne il funzionamento, cosa che pu`
o essere fatta utilizzando un qualunque programma che usa un servizio
di rete (il modo pi`
u comune `e lanciare un browser). In caso di malfunzionamento, o comunque
per eseguire controlli pi`
u approfonditi, sono disponibili i comandi che tratteremo in questa sezione, che possono essere utilizzati per verificare il buon funzionamento della rete nei suoi vari
aspetti.

7.6.1

Il comando ping

Una volta configurate le interfacce di rete in genere il primo controllo che si va ad effettuare
per vedere se la rete funziona `e quello di pingare75 unaltra macchina. Nella nostra analogia
telefonica questo equivale a telefonare ad un numero per sentire se d`a la linea.
Il comando ping permette di inviare un pacchetto ICMP (abbiamo accennato a questo
protocollo in sez. 7.2.1) di tipo echo request; il protocollo prevede che la macchina che riceve un
pacchetto di questo tipo debba rispondere con lemissione di un altro pacchetto ICMP, di tipo
echo reply che ping si incaricher`
a di ricevere, mostrando anche il tempo intercorso fra linvio e
la risposta.
Il comando si invoca in genere passando come argomento lindirizzo IP della macchina bersaglio; si pu`o usare anche il nome simbolico, ma in tal caso oltre al collegamento verso la macchina
bersaglio deve funzionare anche la risoluzione dei nomi, cosa che in genere richiede la raggiungibilit`a del server DNS,76 e se per un qualche motivo questo non fosse raggiungibile (o fosse lui
a non funzionare) non si otterrebbe nessuna risposta anche con il resto della rete a posto. Un
esempio delluso di ping `e il seguente:
[piccardi@havnor corso]$ ping 192.168.168.10
PING 192.168.168.20 (192.168.168.20): 56 data bytes
64 bytes from 192.168.168.20: icmp_seq=0 ttl=255 time=0.7 ms
64 bytes from 192.168.168.20: icmp_seq=1 ttl=255 time=0.3 ms
64 bytes from 192.168.168.20: icmp_seq=2 ttl=255 time=0.3 ms
75

il nome e la terminologia derivano dallanalogia con gli impulsi sonori usati dai sonar.
in realt`
a si pu`
o usare anche il nome pure in assenza di DNS, ma esso deve essere scritto in /etc/hosts (vedi
sez. 7.4.3).
76

7.6. I COMANDI DIAGNOSTICI

435

--- 192.168.168.20 ping statistics --3 packets transmitted, 3 packets received, 0% packet loss
round-trip min/avg/max = 0.3/0.4/0.7 ms

Il comando invia un pacchetto al secondo; nellesempio riceve sempre risposta, e riporta quindi il tempo che intercorso fra linvio e la ricezione. Quando viene fermato (nel caso dellesempio
con C-c) stampa anche una statistica riassuntiva. Lesempio ci mostra che la macchina con IP
192.168.168.10 `e attiva ed `e raggiungibile. Il comando prende una serie di opzioni, le principali
delle quali, insieme al loro significato, sono riportate in tab. 7.22, per un elenco completo si pu`
o
fare riferimento alla pagina di manuale.
Opzione
-c count
-f

-i wait
-n
-p pattern

-q
-s size

Significato
invia solo count pacchetti e poi esce stampando la
statistica senza bisogno di interruzione esplicita.
invia i pacchetti alla velocit`
a con cui tornano indietro,
o 100 al secondo, stampando un . per ogni pacchetto
inviato ed un backspace per ogni pacchetto ricevuto, cos` da visualizzare le perdite. Solo lamministratore pu`
o
usare questa opzione che carica pesantemente la rete.
aspetta wait secondi invece di uno fra linvio di un
pacchetto ed il successivo.
non effettua la risoluzione di nomi e indirizzi.
si possono specificare fino a 16 byte con cui riempire il
carico del pacchetto. Il valore pattern deve essere specificato come numero esadecimale. Si usa questa opzione per
diagnosticare eventuali problemi di corruzione dei dati.
sopprime tutte le stampe eccetto le statistiche finali.
invia pacchetti di dimensione size invece dei 56 byte
usati per default.

Tabella 7.22: Principali opzioni del comando ping.

Si tenga presente comunque che quello che si pu`o effettuare con ping `e solo un controllo
preliminare; se non si riceve risposta il motivo pu`o dipendere da moltissimi fattori: da un errore
di configurazione, dallaver usato un indirizzo IP sbagliato, dalla non risposta della macchina
che volete controllare (che potrebbe essere spenta), da una mancanza di connessione sulla rete,
dal fatto che uno dei router che devono inoltrare i pacchetti per raggiungere la destinazione pu`
o
avere un malfunzionamento. Se per`o va tutto bene se non altro si pu`o concludere che la rete `e
attiva e funzionante ed evitare di mettersi a controllare il cavo `e attaccato.

7.6.2

I comandi traceroute, tracepath e mtr

Un secondo comando molto utile per controllare il funzionamento di un collegamento sulla rete `e
traceroute, che serve, come dice il nome, a tracciare la strada che fanno i pacchetti per arrivare
ad una destinazione su Internet.
Il comando sfrutta una caratteristica del protocollo IP che prevede nelle informazioni associate a ciascun pacchetto un campo chiamato TTL, che viene decrementato ogni volta che il
pacchetto attraversa un router, in quello che in gergo viene chiamato un hop. Quando il valore
si annulla il protocollo richiede77 che il router scarti il pacchetto ed invii un messaggio ICMP
(di tipo time exceeded ) al mittente.
Di default traceroute invia una serie di pacchetti UDP con TTL crescente a partire da 1,
cos` da ricevere un ICMP time exceeded da ogni router attraversato per giungere a destinazione.
77

questo viene fatto per evitare che i pacchetti persi nei cosiddetti routing loop continuino a circolare sulla rete,
con spreco di banda.

436

CAPITOLO 7. LAMMINISTRAZIONE DI BASE DELLE RETI

In questo modo si pu`


o tracciare tutta la strada fatta da un pacchetto guardando gli indirizzi
da cui arrivano queste risposte. Il default del comando `e di inviare tre pacchetti sonda per
ogni valore progressivo del TTL ed aspettare una risposta fino a 5 secondi. Un esempio del suo
utilizzo `e il seguente:
gil:~# traceroute www.debian.it
traceroute to www.debian.it (213.254.12.146), 30 hops max, 40 byte packets
1 vl12.core1.net.playnet.it (62.48.34.7) 0.908 ms 0.852 ms 1.065 ms
2 vl26.mix.net.playnet.it (62.48.45.255) 7.808 ms 7.800 ms 7.788 ms
3 g-2-5.gw-border.uli.it (62.212.3.113) 7.723 ms 7.745 ms 7.734 ms
4 f0-1.gw-mix.uli.it (62.212.3.126) 11.920 ms 11.923 ms 11.912 ms
5 itgate.mix-it.net (217.29.66.65) 7.672 ms 7.663 ms 7.650 ms
6 213.254.31.245 (213.254.31.245) 16.320 ms 15.637 ms 15.605 ms
7 213.254.0.13 (213.254.0.13) 13.045 ms 12.159 ms 12.145 ms
8 picard.linux.it (213.254.12.146) 16.342 ms 16.342 ms 16.335 ms

Il comando stampa la strada fatta dai pacchetti per arrivare a destinazione, riportando in
ordine progressivo per numero di hop lindirizzo IP (ed il nome, se risolto) di ciascun router
attraversato, seguito dai i tempi di risposta per i tre pacchetti inviati. Si tenga presente che `e
normale avere rotte diverse, specie in caso di linee ridondate, per cui per un certo hop si possono
ricevere risposte da router diversi, che verranno elencati sulla stessa linea.
Il comando risulta particolarmente utile quando si `e appurato che la propria rete funziona
almeno a livello di collegamento locale, ma non si riesce a raggiungere un qualche indirizzo su
Internet; esso infatti consente di verificare se il problema pu`o essere imputato al fatto che la
strada che prendono i pacchetti in uscita `e interrotta o se si sono formati dei routing loop, cio`e
situazioni in cui, per un qualche errore di configurazione, i pacchetti vengono reinviati in cerchio
attraverso una serie di router senza poter mai arrivare a destinazione.78
Si tenga presente per`
o che il fatto che non si riceva risposta dalla destinazione finale non
comporta necessariamente che questa sia irraggiungibile, `e infatti un caso comune quello della
presenza di firewall lungo il percorso che possono bloccare o scartare i pacchetti UDP inviati
dal comando. In tal caso, quando per un certo hop non viene ricevuta una risposta, il comando
stampa una serie di asterischi. Il comando inoltre si ferma soltanto quando riceve una risposta
dalla destinazione finale,79 se anche questa non dovesse rispondere prosegue a cercare la strada
fino ad un certo numero massimo di hop.80
Per cercare di superare questo tipo di difficolt`a `e possibile richiedere a traceroute luso
di pacchetti di tipo diverso, ad esempio con lopzione -I si pu`o richiedere luso di pacchetti
ICMP (come quelli di ping) mentre per le versioni pi`
u recenti si pu`o invocare il comando come
tcptraceroute o con lopzione -T per fargli eseguire le richieste con pacchetti TCP.
Il comando richiede sempre come argomento lindirizzo (numerico o simbolico) di cui si vuole
tracciare la rotta, ed opzionalmente la dimensione dei pacchetti da usare; oltre a quelle citate
supporta altre numerose opzioni, che permettono di impostare varie caratteristiche dei pacchetti
sonda inviati e delle modalit`
a di risposta. Al solito si sono riportate le pi`
u significative in
tab. 7.23; per le restanti si faccia riferimento alla pagina di manuale.
Una alternativa a traceroute `e tracepath, che effettua lo stesso tipo di controllo, anche
se con un numero molto inferiore di opzioni. Il comando di nuovo richiede come argomento
lindirizzo IP (o il nome) della macchina di destinazione e traccia la strada dei pacchetti. Si
78

in tal caso si osserver`


a il ripetersi della presenza di questi router nelloutput di traceroute.
il codice dellICMP di tipo time exceeded in tal caso `e diverso, proprio per distinguerlo dalla scadenza durante
il percorso.
80
il default `e 30, ma pu`
o essere cambiato con lopzione -m.
81
il valore viene usato come numero di porta di destinazione solo per TCP ed UDP mentre per ICMP indica il
numero di sequenza; per UDP (il default) viene usata normalmente la porta 33434 per il primo hop ed il numero
viene incrementato di uno per ogni hop successivo, mentre per il TCP viene usata la porta 80, i dettagli sulle
modalit`
a di controllo avanzate dei pacchetti sonda inviati si trovano sulla pagina di manuale.
79

7.6. I COMANDI DIAGNOSTICI


Opzione
-l
-i iface
-n
-I
-T
-s
-m
-p
-w

source
N
port
time

437

Significato
stampa anche il TTL dei pacchetti ricevuti come risposta, utile per
verificare la presenza di un routing asimmetrico.
invia i pacchetti con lindirizzo dellinterfaccia iface; ha senso solo
quando ci sono pi`
u indirizzi sulla stessa macchina.
non effettua la risoluzioni di nomi e indirizzi.
invia pacchetti ICMP invece che UDP.
invia pacchetti TCP invece che UDP.
usa lindirizzo source come indirizzo sorgente dei pacchetti inviati.
imposta a N il valore massimo del TTL usato (il default `e di 30 hop).
specifica una diversa porta iniziale (al posto del default di 33434).81
imposta il numero di secondi time da attendere per ricevere una
risposta.
Tabella 7.23: Opzioni principali del comando traceroute.

pu`o usare lopzione -n per impedire la risoluzione inversa degli indirizzi IP e si pu`o specificare
come secondo argomento la porta da utilizzare per i pacchetti sonda; per tutti i dettagli sul
funzionamento si consulti al solito la pagina di manuale.
A differenza di traceroute, tracepath consente solo di utilizzare soltanto pacchetti sonda
UDP, ma oltre allindirizzo dei router attraversati ed ai tempi di risposta, stampa anche le
eventuali variazioni di MTU (Maximum Transfer Unit) trovate sulla rotta. La conoscenza di
questo valore pu`
o essere molto utile per diagnosticare problemi sulla rete, infatti come accennato
in sez. 7.3.1 ogni tecnologia di rete supporta una dimensione massima dei pacchetti che possono
attraversarla, e la sua conoscenza `e di fondamentale importanza nel routing dei pacchetti perche
questi non possono essere trasmessi se eccedono questa dimensione.82
Se per un qualche problema limpostazione dei valori della MTU da usare per arrivare a
destinazione (la cosiddetta Path MTU ) non viene rilevata correttamente, ci si pu`o trovare di
fronte ad malfunzionamenti della rete difficilmente comprensibili in cui questa pare funzionare a
tratti (cio`e fintanto che non si inviano o richiedono pacchetti di dimensione superiore alla Path
MTU ) per poi bloccarsi in maniera apparentemente casuale.
Esiste infine un terzo programma, mtr, analogo si traceroute e tracepath ma disponibile
anche in versione con interfaccia grafica, che consente di mostrare dinamicamente lo stato della
strada percorsa dai pacchetti, fornendo allo stesso tempo una serie di statistiche relative al loro
inoltro ed unificando in sostanza le funzionalit`a dei due comandi e di ping.
Il comando prende come argomento lindirizzo numerico o simbolico della macchina da tracciare, ed invia una serie continua di pacchetti ICMP di tipo echo request con TTL crescente, cos`
pu`o misurare sia il tempo di percorrenza che la strada seguita. Inoltre il comando, a meno di
non averne preimpostato un numero specifico con lopzione -c, esegue indefinitamente la ripetizione dellinvio dei pacchetti, raccogliendo e stampando in tempo reale una serie di statistiche
relative alla rotta da esso tracciata. In questo caso si potr`a terminare il programma con la solita
interruzione (con C-c) o premendo il tasto q.
Un esempio delluscita del programma, invocato in modalit`a testo con lopzione -t, `e riportato in fig. 7.6, le colonne mostrano le macchine attraversate (la cui risoluzione avviene in
tempo reale), la percentuale di perdita dei pacchetti su ciascun tratto, e le statistiche sui tempi
di trasmissione rilevati. Le opzioni principali di mtr sono riportate in tab. 7.24, per lelenco
completo si consulti la pagina di manuale.
82

per questo motivo il protocollo TCP/IP prevede opportune contromisure e meccanismi per determinare automaticamente il valore della Path MTU di una connessione, per maggiori dettagli si consultino le sezioni 3.2.3 e
3.4.4 di [SGL] e 14.3.5 di [GaPiL].
83
si tenga conto che usando questa opzione senza chiamare anche -r la schermata con i risultati viene visualizzata
solo durante lesecuzione del comando, e cancellata alla sua terminazione.

438

CAPITOLO 7. LAMMINISTRAZIONE DI BASE DELLE RETI

Figura 7.6: Schermata dei risultati del comando mtr.


Opzione
-a addr
-c count
-r
-n
-u
-t
-i time

Significato
usa lindirizzo addr per forzare linvio dei pacchetti in uscita sulla
relativa interfaccia.
ripete count cicli di invio e poi termina automaticamente.83
abbinato a -c stampa la statistica finale dei risultati ottenuti alla fine
dei cicli.
non effettua la risoluzioni di nomi e indirizzi.
invia pacchetti UDP invece che ICMP.
usa linterfaccia testuale.
imposta un numero di secondi time da far passare fra un invio ed il
successivo (il default `e 1).
Tabella 7.24: Opzioni principali del comando mtr.

Il grande vantaggio di mtr `e che fornisce un monitoraggio continuo dello stato della linea, e
consente cos`, in particolar modo grazie alla presenza dellordinamento dei tempi di attraversamento dei vari router e alla statistica dei pacchetti perduti, di identificare quali sono i tratti pi`
u
problematici del traffico verso una certa macchina.

7.6.3

Il comando netstat

Un altro utile comando diagnostico, che permette di visualizzare una grande quantit`a di informazioni relative alla rete, `e netstat. Il comando `e piuttosto complesso dato che permette di
ottenere informazioni riguardo a tutte le funzionalit`a del sistema concernenti la rete, anche se
lo scopo per cui viene usato pi`
u spesso `e quello di visualizzare tutte le connessioni attive su una
macchina.
Il comando prevede che la prima opzione indichi il tipo di informazione da mostrare, lelenco
di quelle disponibili `e riportato in tab. 7.25, ma se non se ne indica nessuna viene assunto il
comportamento di default che `e quello di mostrare la lista di tutti i socket aperti nel sistema.
84

per poter utilizzare una comunicazione in multicast una macchina deve registrarsi presso il router per segnalare
appunto a quale gruppo di multicast intende aderire; in questo modo il router potr`
a reinviarle i pacchetti di
multicast ricevuti per esso.

7.6. I COMANDI DIAGNOSTICI


Opzione
-r
-g
-i
-M
-s

439

Significato
mostra le informazioni relative alla tabella di instradamento
(equivalente alluso di route senza argomenti).
mostra le informazioni relative ai gruppi di multicast di cui si fa parte.84
mostra le informazioni relative alle interfacce di rete (equivalente alluso
di ifconfig senza argomenti).
mostra le informazioni relative alle connessioni mascherate dal firewall
(funziona solo con i kernel della serie 2.2.x).
mostra delle statistiche sommarie sulluso dei vari protocolli di rete.

Tabella 7.25: Opzioni del comando netstat per il controllo del tipo di informazioni da visualizzare.

Quando viene usato con le opzioni di default il comando mostra le informazioni riguardo a
tutti i socket aperti. La lista comprende anche i socket locali, che sono usati da vari programmi
come meccanismo di intercomunicazione, e che non hanno nulla a che fare con la rete. Per questo
motivo `e opportuno specificare le opzioni -t per richiedere di visualizzare solo i socket TCP o
-u per vedere quelli UDP, che sono quelli che riguardano le connessioni con la rete esterna. Un
possibile esempio del risultato di netstat `e allora il seguente:
[piccardi@gont piccardi]$ netstat -t
tcp
0
0 ppp-42-241-98-62.:32798 serverone.firenze:imaps ESTABLISHED

che mostra una connessione attiva verso un server di posta.


Invocato in questa maniera il comando riporta solo i dati relativi ai socket attivi, in realt`
a
oltre a questi saranno presenti anche i socket per i quali non ci sono connessioni in corso, ma
che sono in ascolto, in attesa di riceverne. Questi vengono mostrati soltanto se si usa lopzione
-a; nel qual caso il precedente risultato sarebbe stato:
[piccardi@gont piccardi]$ netstat -at
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address
Foreign Address
tcp
0
0 *:printer
*:*
tcp
0
0 *:5865
*:*
tcp
0
0 *:webcache
*:*
tcp
0
0 *:tproxy
*:*
tcp
0
0 gont.earthsea.ea:domain *:*
tcp
0
0 localhost:domain
*:*
tcp
0
0 *:ssh
*:*
tcp
0
0 *:ipp
*:*
tcp
0
0 *:nntp
*:*
tcp
0
0 *:smtp
*:*
tcp
0
0 ppp-42-241-98-62.:32798 serverone.firenze:imaps

State
LISTEN
LISTEN
LISTEN
LISTEN
LISTEN
LISTEN
LISTEN
LISTEN
LISTEN
LISTEN
ESTABLISHED

Infine usando lopzione -n i risultati verranno stampati con tutti gli indirizzi ed i numeri
delle porte espressi in forma numerica, senza che ne sia effettuata la risoluzione (vedi sez. 7.4)
nei rispettivi nomi simbolici. Le altre principali opzioni di controllo, non rientranti in quelle gi`
a
illustrate in tab. 7.25, sono riportate in tab. 7.26.
Quando si usa netstat per verificare lo stato delle connessioni di rete, il comando genera
una tabella con una voce per ciascuna di esse, come illustrato negli esempi precedenti. Il campo
Proto riporta il protocollo della connessione. I campi Local Address e Foreign Address indicano
gli indirizzi locale e remoto della stessa, che nel caso di socket su Internet sono nella forma:
indirizzo:porta
dove un asterisco indica un indirizzo o una porta qualunque. Il campo State indica lo stato
della connessione. Una spiegazione dettagliata del significato dei valori di questo campo va di
nuovo al di l`
a delle finalit`
a di questo testo, e richiede una trattazione approfondita del protocollo
TCP/IP,85 per cui ci limiteremo ad alcune note panoramiche.
85

una trattazione completa `e in [TCPIll1], una sintesi si pu`


o trovare nelle appendici di [GaPiL].

440

CAPITOLO 7. LAMMINISTRAZIONE DI BASE DELLE RETI


Opzione
-t
-u
-n
-c
-e
-l
-a

Significato
mostra i dati relativi ai socket TCP.
mostra i dati relativi ai socket UDP.
non esegue la risoluzione di indirizzi e porte.
ripete continuamente il comando ogni secondo.
stampa informazioni addizionali, pu`
o essere ripetuto due volte per avere
ancora pi`
u informazioni.
mostra i dati relativi ai socket in ascolto (di default non vengono
mostrati).
mostra i dati relativi sia ai socket attivi che a quelli in ascolto.
Tabella 7.26: Opzioni principali del comando netstat.

Delle varie righe quelle che meritano attenzione sono quelle relative agli stati LISTEN ed
ESTABLISHED. Lo stato LISTEN indica la presenza di un programma in ascolto sulla vostra macchina in attesa di connessione, nellesempio precedente ce ne sono vari, corrispondenti a servizi
come la posta, le news, il DNS, la stampa via rete. Gli indirizzi di norma non sono specificati
in quanto la connessione pu`
o essere effettuata su uno qualunque degli indirizzi disponibili sulle
interfacce locali, e a partire da un qualunque indirizzo esterno. Lo stato ESTABLISHED indica
le connessioni stabilite ed attive, e riporta nei campi degli indirizzi i numeri di IP e porta dei
due capi della connessione. Altri stati che possono essere riportati dal comando sono FIN_WAIT,
TIME_WAIT, che si riferiscono a connessioni che si stanno chiudendo.
Si noti anche che quando si esegue netstat con lopzione -u per rilevare lo stato dei socket
UDP, nella tabella risultante il campo State `e vuoto anche quando ci sono servizi in ascolto, in
quanto lo stato `e definito soltanto per i socket TCP.

7.6.4

Il protocollo ARP ed il comando arp

Come accennato in sez. 7.2.1 il protocollo ARP viene usato (dal kernel) per associare ad un
indirizzo fisico presente sulla rete locale, quello che per gran parte delle reti `e il cosiddetto MAC
address, al corrispondente indirizzo IP, cosicche il kernel possa sapere a quale scheda (ethernet
nel caso pi`
u comune) mandare i pacchetti.
In realt`a il protocollo viene utilizzato tutte le volte che il kernel deve inviare un pacchetto
IP verso lesterno su una rete di tipo ethernet (o con funzionalit`a equivalenti, come il token ring
o lFDDI). Le possibilit`
a sono sempre due, o si deve comunicare con un indirizzo IP nella stessa
sottorete, nel qual caso si invier`
a il pacchetto direttamente al destinatario tramite lindirizzo
fisico della sua scheda di rete, o si deve inviare il pacchetto altrove passando attraverso un
gateway, nel qual caso dalla tabella di routing si otterr`a lindirizzo IP di questultimo che sar`a
usato per ricavare il MAC address della scheda a cui inviare il pacchetto.
Il protocollo viene usato per mandare delle richieste in broadcast, cio`e richieste che vengono
ricevute da tutte le schede su una stessa LAN; queste hanno la tipica forma devi dire chi `e
X.X.X.X a Y.Y.Y.Y dove X.X.X.X `e lindirizzo IP che si vuole risolvere, ed Y.Y.Y.Y `e quello
del richiedente. Questultimo viene automaticamente identificato dato che il suo MAC address
`e riportato come indirizzo sorgente nel pacchetto di richiesta, cos` che la macchina la cui interfaccia ha lIP X.X.X.X pu`
o rispondere direttamente con un messaggio del tipo X.X.X.X `e
NN:NN:NN:NN:NN:NN trasmettendo il suo MAC address direttamente al richiedente.
In questo modo una macchina pu`
o interrogare le sue vicine sulla stessa LAN e costruire un
elenco di corrispondenze. Per evitare di oberare la rete di richieste le corrispondenze trovate
vengono mantenute per un certo tempo in quella che viene chiamata la ARP cache del kernel,
e rinnovate solo dopo che sono scadute. In generale non `e necessario nessun intervento di

7.6. I COMANDI DIAGNOSTICI

441

configurazione diretto per la gestione di questo protocollo, ma esistono comune esigenze per cui
pu`o risultare utile esaminare ed eventualmente modificare manualmente la ARP cache.86
Ad esempio una tecnica che impiega questo protocollo `e quella del cosiddetto proxy ARP,
usata quando si divide in due reti separate una rete che prima era unica, introducendo un
router a separare i due nuovi rami. Dato che un router non trasmette i pacchetti a livello di
collegamento fisico, impostando su di esso un proxy ARP si fa s` che alle richieste ARP per gli
IP posti sul nuovo tratto di rete al di l`a del router venga comunque risposto, fornendo lindirizzo
fisico della scheda del router. In questo modo, anche se non si `e impostato su tutte le macchine
una opportuna rotta statica per la nuova configurazione della rete, il router ricever`a i pacchetti
destinati al nuovo tratto, e potr`
a inoltrarli.
Il comando che permette di esaminare e modificare la ARP cache del kernel `e arp. Se chiamato senza opzioni il comando mostra il contenuto corrente della cache effettuando la risoluzione
inversa degli indirizzi IP, un esempio del suo risultato potrebbe essere il seguente:
[root@gont corso]# arp
Address
oppish.earthsea.ea
havnor.earthsea.ea
roke.earthsea.ea

HWtype
ether
ether

HWaddress
00:48:54:3A:9A:20
00:48:54:6A:4E:FB
(incomplete)

Flags Mask
C
C

Iface
eth0
eth0
eth0

in cui per ciascuna riga `e riportata la corrispondenza fra lindirizzo IP di una macchina (o il
nome, se risolto) e lindirizzo fisico, con ulteriori informazioni come linterfaccia di rete da cui
essa `e raggiungibile, oppure, in caso di richiesta senza risposta come per la terza voce, la dicitura
incomplete.
Le due operazioni fondamentali del comando sono la cancellazione (con lopzione -d) e linserimento (con lopzione -s) di una voce nella ARP cache, nel caso della cancellazione occorre
specificare lindirizzo IP (o il nome) della macchina da rimuovere, con qualcosa come:
arp -d oppish
mentre si si vuole inserire una voce in pi`
u si dovranno specificare almeno indirizzo e MAC
address, ad esempio con un comando come:
arp -s lorbaner 00:48:54:AA:9A:20
Si tenga presente per`
o che una voce inserita in questo modo nella ARP cache, a meno che non
si specifichi al comando un ulteriore argomento temp, diventa statica e non scade pi`
u.Questo
significa che per quella voce il protocollo ARP non verr`a pi`
u usato e sar`a sempre utilizzata
lassociazione statica che si `e impostata; la conseguenza `e che la macchina su cui si `e effettuata
tale operazione non sar`
a pi`
u in grado di accorgersi di eventuali variazioni del MAC address di
altre macchine (ad esempio dovute ad un cambio di scheda di rete) che a quel punto diventeranno
completamente irraggiungibili.87
A parte le due gi`
a citate, lopzione pi`
u comune per il comando arp `e -n, che disabilita la
risoluzione degli indirizzi; le altre opzioni principali sono riportate in tab. 7.27, al solito per
lelenco completo ed i dettagli di funzionamento si pu`o fare ricorso alla pagina di manuale del
comando, accessibile con man arp.
86

in particolare `e ben noto un attacco, detto ARP poisoning, che consiste di inserire corrispondenze arbitrarie
ARP cache con pacchetti ARP falsi, la tecnica si chiama ARP poisoning ed `e trattata con maggiori dettagli
nella sezione 5.4 di [SGL], se si sospetta questo tipo di attacco esaminare la ARP cache pu`
o risultare utile.
87
indipendentemente dalle impostazioni che si potranno effettuare su questultime al riguardo di interfacce ed
indirizzi; dato che questo tipo di problemi sono assai difficili da diagnosticare, `e in genere sconsigliato effettuare
una impostazione di voci statiche.

442

CAPITOLO 7. LAMMINISTRAZIONE DI BASE DELLE RETI


Opzione
-f file
-n
-s host MAC
-d host
-i iface

Significato
legge i valori da immettere nella cache dal file file.
non effettua la risoluzioni di nomi e indirizzi.
inserisce una voce nella cache, associando al nodo host lindirizzo
hardware MAC.
cancella la voce relativa al nodo host.
stampa le voci corrispondenti alla sola interfaccia iface.
Tabella 7.27: Principali opzioni del comando arp.

Si tenga presente infine che come per la risoluzione dei nomi in indirizzi IP (vedi sez. 7.4.4)
`e possibile impostare delle voci statiche per la ARP cache tramite un opportuno file di configurazione. Il file `e /etc/ethers, che contiene delle corrispondenze nella forma:
MAC-address indirizzo-IP
ed al posto dellindirizzo IP si pu`
o anche specificare un nome simbolico, posto che questo sia
risolvibile. Il formato dei MAC address `e quello solito di sei byte esadecimali separati dal
carattere :, un possibile contenuto di /etc/ethers sar`a cio`e qualcosa del tipo:
08:00:20:00:61:CA

7.6.5

129.168.1.245

I servizi RPC

In sez. 7.2.4 abbiamo visto come normalmente i servizi di rete vengano forniti utilizzando una
porta, il cui valore li identifica univocamente. Con il crescere del numero di servizi che potevano
essere resi disponibili questa assegnazione statica ha iniziato ad essere percepita come problematica, in quanto le porte possibili sono solo 65535, numero che si potrebbe esaurire con una
certa facilit`a se se ne dovesse assegnarne una ad ogni servizio possibile.
A prima vista il problema pu`
o sembrare poco realistico, visto il numero non poi cos` ampio dei
servizi di rete classici, ma quando si inizi`
o a pensare ad una modalit`a per rendere accessibile via
rete funzioni generiche attraverso opportuni servizi (i cosiddetti Remote Procedure Call o servizi
RPC), il problema dellassegnare una porta statica ad ogni funzione che ci si poteva inventare
divenne significativo, per cui si dovette progettare anche un meccanismo che ne consentisse
lallocazione dinamica.
Il concetto che sta dietro le Remote Procedure Call `e quello di un meccanismo di intercomunicazione generico basato sui protocolli di trasporto (sia TCP che UDP), che permetta ad
un processo che gira su una certa macchina di accedere a dei servizi (nella forma di chiamate a
funzioni esterne) in maniera trasparente rispetto alla rete. In sostanza una sorta di libreria eseguita via rete, in cui si demanda lelaborazione dei dati ad una macchina remota, che restituir`a
i risultati attraverso la rete.
Ciascun servizio RPC `e fornito da un apposito demone, in ascolto su una porta non definita
a priori, in modo da poterne definire quanti se ne vuole, ma di impiegare delle porte solo per
quelli effettivamente utilizzati. Un programma che voglia utilizzare un servizio RPC deve prima
rivolgersi al un servizio speciale, il portmapper, che registra i servizi attivi ed `e in grado di
indicare la porta su cui sono forniti.
Il servizio del portmapper `e lunico a cui viene assegnata una porta fissa, la 111, che corrisponde al nome sunrpc.88 Tutti gli altri servizi RPC (in sez. 8.4.1 vedremo che NFS utilizza
questa infrastruttura) quando si avviano si registrano presso il portmapper utilizzando un numero
identificativo, ed indicano la porta su cui sono in ascolto.
88

i servizi RPC sono stati introdotti per la prima volta da Sun per i suoi sistemi Unix, da cui questo nome per
il servizio associato al portmapper.

7.6. I COMANDI DIAGNOSTICI

443

In sostanza nel caso di servizi RPC si fa effettuare al portmapper una risoluzione dinamica
fra un servizio che `e stato registrato dal rispettivo server ed il numero di porta che questo sta
utilizzando. In questo modo `e possibile richiedere il servizio usando il numero identificativo, che
`e completamente indipendente dal numero di porta e non soggetto ai limiti di questultimo.
La lista dei servizi RPC viene mantenuta in un apposito file89 /etc/rpc che `e lanalogo di
/etc/services. Il formato del file prevede tre campi separati da spazi; il primo indica il nome
ufficiale del servizio RPC, il secondo il numero identificativo ad esso associato, il terzo la lista,
separata da spazi, degli alias del nome ufficiale. Un esempio di questo file, preso da una Debian
Lenny, `e:
# This file contains user readable names that can be used in place of rpc
# program numbers.
portmapper
rstatd
rusersd
nfs
ypserv
mountd
ypbind
walld
yppasswdd
etherstatd
rquotad
...

100000
100001
100002
100003
100004
100005
100007
100008
100009
100010
100011

portmap sunrpc
rstat rstat_svc rup perfmeter
rusers
nfsprog
ypprog
mount showmount
rwall shutdown
yppasswd
etherstat
rquotaprog quota rquota

Per poter usufruire dei servizi RPC `e pertanto necessario attivare il portmapper ; questo viene
usualmente fatto direttamente dagli script di avvio, attraverso luso dal demone portmap. Dato
che questo demone viene `e essenziale al funzionamento dei servizi RPC, esso viene installato di
default da quasi tutte le distribuzioni.
Per una maggiore sicurezza, se viene usato solo per servizi utilizzati localmente, sarebbe
opportuno lanciarlo con lopzione -i che permette di indicare un indirizzo specifico su cui porsi
in ascolto, facendogli utilizzare esclusivamente il localhost.90 Per le altre opzioni si faccia
riferimento come al solito alla pagina di manuale.
Se il portmapper `e attivo si pu`
o verificare il funzionamento dei servizi RPC con il comando
rpcinfo; questo, se invocato con lopzione -p, prende come argomento lindirizzo di un nodo
(se non si indica nulla usa la macchina locale) e stampa una lista di tutti i servizi registrati; un
esempio potrebbe essere:
piccardi@hain:~/truedoc/corso$ rpcinfo -p
program vers proto
port
100000
2
tcp
111 portmapper
100000
2
udp
111 portmapper
100024
1
udp
787 status
100024
1
tcp
790 status

Il comando consente anche, con lopzione -u di interrogare un nodo per la presenza di uno
specifico servizio (passato come secondo argomento) e di inviare richieste in broadcast sulla rete
per rilevare la presenza di altre macchine che forniscono servizi RPC (nel qual caso occorrer`
a
passare come argomenti il numero del servizio e quello di versione). Per maggiori dettagli e
lelenco completo delle opzioni si faccia riferimento alla pagina di manuale.
89
90

in realt`
a anche in questo caso si usa il Name Service Switch.
questo `e il default di Debian.

444

7.7

CAPITOLO 7. LAMMINISTRAZIONE DI BASE DELLE RETI

I client dei servizi di base

Una volta che se ne sia completata la configurazione e verificato il funzionamento, lutilizzo della
rete avviene attraverso laccesso ai servizi che su di essa vengono forniti. In generale i servizi di
base sono forniti tutti secondo unarchitettura client-server in cui c`e un programma che serve a
fornire il servizio ed uno che serve ad utilizzarlo. Affronteremo pi`
u avanti la configurazione lato
server di alcuni di questi servizi, qui ci limiteremo a trattare alcuni fra i client.

7.7.1

I comandi telnet e netcat

Uno dei servizi di base un tempo pi`


u utilizzato sulla rete `e quello del telnet, nato per eseguire delle
connessioni con cui poter operare via rete su un terminale su una macchina remota. Dato che
tutti i dati vengono trasmessi in chiaro sulla rete, password comprese, questo uso `e assolutamente
da evitare, ed oggi `e essenzialmente sostituito dal comando ssh che tratteremo in sez. 8.3.2.
In ogni caso il comando telnet continua ad esistere, e pu`o essere usato su una rete locale
sicura o quando non esiste una versione di SSH per la macchina in questione, come accade per
molti apparati di rete.91 Un suo uso pi`
u interessante per`o `e quello diagnostico, per verificare la
accessibilit`a e la funzionalit`
a dei servizi.
Il comando prende come argomento la macchina cui collegarsi ed opzionalmente la porta,
specificata per numero o per nome del servizio; non specificando nessuna porta il comando si
collega sulla porta 23, che corrisponde al servizio standard telnet, mostrando, qualora sia attivo
il relativo server, una schermata di login.
Il comando supporta varie opzioni, per lo pi`
u relative alle modalit`a di gestione della sessione
di terminale remota. Dato che questo uso `e assolutamente sconsigliabile non le riportiamo
neanche, i pi`
u curiosi possono consultare la pagina di manuale accessibile con man telnet. Di
norma si usa il comando indicando semplicemente un indirizzo ed una porta, con qualcosa del
tipo di:
piccardi@oppish:~$ telnet localhost 25
Trying ::1...
Trying 127.0.0.1...
Connected to localhost.
Escape character is ^].
220 oppish.earthsea.ea ESMTP Postfix (Debian/GNU)

in questo caso lo si `e usato per connettersi alla porta 25 della propria macchina, per verificare
che il relativo servizio SMTP (cio`e il server per la ricezione e la trasmissione della porta) sia
attivo: si noti che si `e poi anche ottenuta la risposta del server che nel caso in questione `e Postfix.
Con la stessa sintassi si pu`
o usare il comando per verificare la presenza e lattivit`a dei servizi
sulle relative porte. Anche se non si riceve nessuna risposta (ad esempio perche il servizio
interrogato necessita di una richiesta prima di rispondere), la presenza della riga Connected
indicher`a che la connessione `e riuscita ed `e attiva.
Se invece tentiamo di collegarci ad un servizio su cui non `e attivo nessun server otterremo
qualcosa del tipo:
piccardi@oppish:~$ telnet localhost 80
Trying 127.0.0.1...
telnet: Unable to connect to remote host: Connection refused

con un ritorno pressoche immediato alla riga di comando. Questo `e il comportamento normale, ma quando la macchina contattata viene protetta da un firewall, `e configurazione comune
bloccare direttamente tutti i pacchetti in ingresso se non sui servizi consentiti; questo comporta
91

molti router ADSL o altri apparati di rete forniscono un accesso alla console di amministrazione in questo
modo.

7.7. I CLIENT DEI SERVIZI DI BASE

445

anche che il tentativo di connessione su una porta senza servizi venga completamente ignorato.
In questa evenienza, non ricevendo nessuna risposta92 il comando telnet resterebbe bloccato in
attesa di una risposta fino alla scadenza del timeout (il default `e circa 30 secondi), riportando
poi un errore diverso.
Un secondo comando che si pu`
o utilizzare per effettuare una verifica sui servizi `e netcat, che
pu`o essere invocato anche in forma pi`
u compatta con nc. Il grande vantaggio rispetto a telnet
`e che mentre questultimo funziona soltanto su TCP, netcat pu`o essere anche usato su UDP, e
permette quindi di controllare anche i servizi che usano questo protocollo.
Inoltre netcat, come suggerisce il nome stesso, si limita a leggere e scrivere i dati su delle
connessioni di rete associando standard input e standard output alla connessione su cui lavora,
supporta quindi la redirezione ed il pipelining, ed `e particolarmente adatto ad essere utilizzato
anche allinterno di script. Questo non `e possibile con telnet, che associa alla connessione
un terminale, ed `e quindi soggetto alla disciplina di linea93 di questultimo. Inoltre telnet
interpreta alcuni caratteri come caratteri di controllo (eliminandoli dal flusso dei dati) e scrive
alcuni dei suoi messaggi interni sullo standard output.
Al contrario nc preserva rigorosamente il flusso dei dati, e se da una parte questo lo rende
meno adatto allamministrazione via rete (ma lo sarebbe comunque, non essendo prevista la
cifratura della connessione), dallaltra lo rende uno strumento molto flessibile94 per inviare e
ricevere dati dalla rete, e manipolarli usando la riga di comando.
La forma pi`
u elementare di invocazione del comando `e identica a quella di telnet, in cui
si specifica il nome di una macchina (o il suo indirizzo) e la porta che si desidera contattare.
Ripetendo lesempio precedente avremo:
piccardi@hain:~$ nc localhost 25
220 hain.truelite.it ESMTP Postfix (Debian/GNU)

e come si pu`
o notare in questo caso non viene scritto niente che non sia quanto stato ricevuto
dalla rete, se si vogliono avere i messaggi diagnostici occorre utilizzare lopzione -v, che li stamper`a rigorosamente sullo standard error (ripetendo due volte lopzione il comando diventer`
a pi`
u
prolisso). Se il servizio che si vuole contattare `e su UDP baster`a utilizzare lopzione -u.
Unaltra caratteristica interessante del programma `e che si possono specificare pi`
u porte
di destinazione, ed i dati verranno inviati e letti su tutte quante. Questo permette anche di
eseguire una scansione elementare per la presenza di servizi attivi, che potrebbe essere realizzata
con qualcosa del tipo:
echo QUIT | nc -w 1 localhost 25 1-1024 6000-7000
dove si `e usata lopzione -w che consente di specificare un tempo massimo di durata, per chiudere
le connessioni che altrimenti resterebbero aperte.
Unaltra caratteristica interessante di netcat `e che pu`o essere utilizzato in listen mode,
cio`e anche come server, usando lopzione -l, che mette il programma in ascolto sulla porta
specificata con lopzione -p. In tal caso sar`a possibile collegarsi da remoto al programma, che
stamper`a quanto ricevuto sulla connessione. In questo modo ad esempio `e possibile trasferire un
file via rete redirigendo lo standard output su un file locale, utilizzando nc sullaltro capo della
connessione per inviarlo. Infine usando anche lopzione -e `e possibile associare standard input
e standard output di questo alla connessione e trasformare nc (se ad esempio si fa eseguire la
shell) in un server analogo al servizio telnet.
92

in caso di un tentativo di connessione su una porta su cui non ci sono servizi, il protocollo TCP prevede, per
notificare lerrore, linvio di un pacchetto di risposta al client che ha effettuato il tentativo; alla ricezione di questo
pacchetto telnet riporta lerrore di connessione rifiutata, come mostrato nellesempio precedente.
93
si chiama cos` le modalit`
a con cui il dispositivo di terminale gestisce lI/O, ad esempio il fatto che linput `e
bufferizzato linea per linea.
94
tanto che la pagina di manuale lo classifica come coltellino svizzero del TCP/IP.

446

CAPITOLO 7. LAMMINISTRAZIONE DI BASE DELLE RETI


Opzione
-e cmd
-l
-p port
-q secs
-s addr
-u
-v
-w secs

Significato
esegue il file specificato, collegando il relativo standard input e standard
output alla connessione.
si pone in ascolto sulla porta specificata con -p.
indica la porta (o le porte) su cui mettersi in ascolto, da usare insieme
a -p.
attende secs secondi dopo la chiusura dello standard input.
specifica lindirizzo sorgente locale.
esegue le connessioni su UDP.
modalit`
a prolissa, stampa informazioni sullo standard error.
aspetta secs per il timeout.
Tabella 7.28: Principali opzioni del comando netcat.

In tab. 7.28 si sono riportate le principali opzioni del comando, al solito per lelenco completo
si pu`o fare riferimento alla pagina di manuale.

7.7.2

Il comando ftp

Il protocollo FTP `e uno dei pi`


u vecchi protocolli che consentono lo scambio di file su Internet.
Il protocollo permette di prelevare od immettere file su un server FTP, previa autenticazione
analoga a quella del login o dellaccesso con telnet. Una sua forma particolare `e il cosiddetto
FTP anonimo in cui il servizio viene utilizzato per distribuire i file posti in un server (in questo
caso il servizio non richiede autenticazione, e di norma consente solo il prelievo dei file).
Dato che il protocollo, come telnet, non prevede alcuna cifratura dei dati, `e meglio non
usarlo in quanto lautenticazione verrebbe eseguita in chiaro; unica eccezione `e la modalit`a
anonima in cui non c`e autenticazione che `e tuttoggi una delle modalit`a pi`
u usate per distribuire
95
pubblicamente file. Qualora si necessiti di un meccanismo per lo scambio di file via rete fra i
vari utenti sono disponibili alternative come luso di scp o sftp96 che tratteremo in sez. 8.3.
Oggi esistono molti client per il protocollo FTP, sia grafici che testuali; ma il comando
originale usato per lanciare il client testuale `e semplicemente ftp. Un esempio di uso generico
del comando `e:
piccardi@anarres:~$ ftp ftp.linux.it
Connected to vlad-tepes.bofh.it.
220 (vsFTPd 2.0.7)
Name (ftp.linux.it:piccardi): anonymous
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp>

eventuali opzioni, ed anche la stessa risposta, dipendono in genere dalla versione del comando
che si `e installata,97 e vanno verificate facendo riferimento alla relativa pagina di manuale.
Si noti come nelluso generico sia sufficiente indicare la macchina cui ci si vuole collegare.
Nel caso ci viene notificato lhostname effettivo del server e ci viene richiesto un nome di login
95
anche questo utilizzo `e ampiamente discutibile, in quanto sarebbe comunque pi`
u efficiente distribuire i suddetti
dati via web usando HTTP, che sovraccarica meno la rete e non presenta tutte le problematiche di funzionamento
(in particolare quando si devono attraversare dei firewall) che ha FTP.
96
sftp `e un programma che ha esattamente la stessa sintassi di ftp, ma consente luso di una connessione
cifrata attraverso il protocollo SSH.
97
questa `e la risposta data dal comando ftp che si trova su Debian Etch, derivato dalloriginale programma nato
con BSD, alternative possono essere client pi`
u evoluti come lftp o ncftp che supportano la storia dei comandi,
il completamento dei nomi, e capacit`
a aggiuntive.

7.7. I CLIENT DEI SERVIZI DI BASE


Comando
ls
cd
lcd
pwd
ascii
binary
pasv
get file
put file
mget files*
mput files*
open host
quit
rmdir
mkdir
chmod

447

Significato
stampa la lista dei file (sul server).
cambia directory (sul server).
cambia directory (sul client).
stampa la directory corrente (sul server).
modalit`
a di trasferimento di file ascii.
modalit`
a di trasferimento di file binari.
abilita i trasferimenti in modo passivo.
scarica il file file dal server.
invia il file file sul server.
scarica i file che corrispondono alla wildcard files*.
invia i file che corrispondono alla wildcard files*.
apre una connessione verso il server host.
chiude la sessione.
cancella directory (deve essere vuota).
crea directory.
modifica i permessi del file.
Tabella 7.29: Comandi del protocollo FTP.

che di default corrisponde al nostro username. Avendo contattato un FTP anonimo lutente da
usare `e anonymous specificato il quale ci viene richiesta una password, che nel caso `e ininfluente
(qualunque cosa si scriva ci sar`
a garantito laccesso).
Fatto questo ci si ritrova con un prompt ftp> dal quale sar`a possibile inviare i vari comandi
del protocollo; i pi`
u importanti di questi si sono riportati in tab. 7.29. La lista completa `e al
solito disponibile nella pagina di manuale.
Si tenga inoltre presente che non tutti i comandi possono essere supportati dal server. Ad
esempio il comando pasv, che abilita il modo passivo,98 `e eseguibile solo se il server supporta
questa modalit`
a di operazione, mentre i comandi ascii e binary non hanno nessun significato
su sistemi unix-like, ma possono averlo per altri sistemi come il VMS o il DOS che introducono
una distinzione fra questi tipi di file.

7.7.3

I comandi finger e whois

Il comando finger viene usato fin dalle origini di Unix, dove agiva solo sulla macchina locale,
per riportare informazioni relative agli utenti di un sistema. In questo modo si poteva consentire
agli altri utenti di sapere chi era collegato alla macchina. Il servizio `e stato trasferito sulla rete,
ed il client funziona sia in locale che in remoto (nel qual caso si eseguir`a una richiesta con un
parametro del tipo nomehost).
Un possibile esempio di uso del comando, fatto in locale, `e il seguente:
[piccardi@gont piccardi]$ finger franci
Login: franci
Name: Francesco Piccardi
Directory: /home/franci
Shell: /bin/bash
Home Phone: 0XX-XX000XX
Last login Tue Jun 17 21:22 (CEST) on :0
No mail.
No Plan.

e come si vede il programma mostra una serie di informazioni riguardo lutente franci; questi
pu`o aggiungervi ulteriori informazioni creando un file .plan nella sua home directory, che verr`
a
mostrato allesecuzione del comando.
98

il protocollo FTP prevede luso di due porte, la connessione avviene sempre da parte del client sulla porta 21
del server, ma su di essa vengono solo inviati i comandi, quando si richiede linvio di file questo viene effettuato
dal server con una seconda connessione che contatta il client sulla porta 20. Dato che normalmente i firewall
bloccano le connessioni entranti, il modo passivo fa s` che sia sempre il client a creare la nuova connessione anche
per i dati.

448

CAPITOLO 7. LAMMINISTRAZIONE DI BASE DELLE RETI

Il comando prende come argomento un nome utente che viene confrontato sia con lo username
che con il nome reale dello stesso memorizzato su /etc/passwd; qualora si voglia eliminare
questultimo confronto si pu`
o usare lopzione -m. Se invocato senza argomenti mostra lelenco
degli utenti collegati e relativo terminale come:
[piccardi@gont corso]$ finger
Login
Name
Tty
piccardi Simone Piccardi *:0

Idle

Login Time
Office
Jul 21 21:55

Office Phone

altre due opzioni utili sono -s che mostra una lista semplice come questa e -l che mostra una
lista lunga come la precedente, per i dettagli si pu`o fare riferimento alla pagina di manuale.
Dato che il comando fornisce delle informazioni che potrebbero essere utili per attivit`a non
troppo benevole o per violare la privacy degli utenti (ad esempio luso dellindirizzo di posta
elettronica per inviare dello spam), oggi si tende sempre di pi`
u a non attivare questo servizio
sulla rete. Talvolta per`
o esso viene utilizzato per pubblicare delle informazioni, non legate
alla presenza di specifici utenti sulla macchina, come eventuali recapiti e contatti, oppure per
distribuire le chiavi GPG degli utenti (usando un file .pgpkey nella home directory degli stessi).
Il comando whois viene usato per contattare i server che forniscono il servizio whois. Questo
servizio permette di accedere alle informazioni presenti nel database dei titolari dei domini su
Internet, che vengono mantenute dagli enti che sono responsabili della registrazione degli stessi
(in Italia il NIC). In genere lo si utilizza quando si cercano informazioni di natura amministrativa
relativa ai domini, ad esempio per avere un indirizzo di contatto dei relativi proprietari.
Il comando prende come argomento una stringa di ricerca, normalmente un nome a dominio,
e cerca di determinare automaticamente qual`e il server pi`
u opportuno a cui rivolgersi.99 , il quale
restituisce le informazioni che verranno stampate a video, un esempio di uso del comando `e:
[piccardi@gont piccardi]$ whois truelite.it
*********************************************************************
* Please note that the following result could be a subgroup of
*
* the data contained in the database.
*
*
*
* Additional information can be visualized at:
*
* http://www.nic.it/cgi-bin/Whois/whois.cgi
*
*********************************************************************
Domain:
Status:
Created:
Last Update:
Expire Date:
Registrant
Name:
Organization:
ContactID:
Address:

Created:
Last Update:

truelite.it
ACTIVE
2002-08-19 00:00:00
2009-04-09 00:03:35
2010-03-24

TRUELITE SRL
TRUELITE SRL
TRUE12-ITNIC
VIA MONFERRATO, 6
Firenze
50142
FI
IT
2007-03-01 10:50:20
2007-03-01 10:50:20

...
99

nel caso non riesca a determinarne uno pi`


u specifico, viene contattato il server di riferimento internazionale
che `e whois.networksolutions.com.

7.7. I CLIENT DEI SERVIZI DI BASE

449

e come si pu`
o notare si ottengono tutta una serie di informazioni relative a chi gestisce (come il
titolare) un nome a dominio.
Si pu`
o richiedere al comando di contattare un server specifico, usando lopzione -h, mentre
con -H si indica al comando di non mostrare le note legali che molti server inviano. Per i dettagli
sulle altre opzioni si consulti la pagina di manuale o si invochi il comando senza argomenti.

450

CAPITOLO 7. LAMMINISTRAZIONE DI BASE DELLE RETI

Capitolo 8

La gestione dei servizi di base


8.1

I programmi di ausilio alla gestione dei servizi di base

Tratteremo in questa sezione alcuni programmi di ausilio per la gestione dei servizi di rete
pi`
u semplici, ed in particolare luso di un cosiddetto super-demone per gestire servizi usati
occasionalmente, e luso dei TCP wrappers per fornire un meccanismo elementare di controllo
degli accessi anche a quei programmi che non ne hanno uno al loro interno.

8.1.1

I servizi elementari e i super-demoni

Talvolta su una macchina in rete si trovano installati una serie di piccoli servizi elementari,1
usati normalmente a scopo uso di test, come echo o discard, o una serie di servizi utilizzati in
maniera occasionale.
Nelle prime versioni di Unix mantenere perennemente in esecuzione dei singoli demoni per
fornire dei servizi utilizzati solo in maniera occasionale (come potevano essere telnet o ftp)
veniva a costituire uno spreco di risorse non accettabile. Per questo motivo venne introdotto il
concetto di super-demone, un demone speciale che facesse da intermediario,2 mettendosi in ascolto sulle varie porte interessate, ed in grado di smistare le richieste ai demoni che implementano
il servizio richiesto.
In sostanza un super-demone svolge quello che `e il lavoro di un centralinista, che riceve le
telefonate sul centralino e poi passa ciascuna di esse allufficio competente; nel caso specifico
il programma riceve le connessioni su una certa porta e poi lancia automaticamente il relativo
programma di risposta. In questo modo non c`e bisogno di mantenere sempre in esecuzione tanti
programmi diversi, ma li si possono lanciare solo quando servono.
Inoltre (come avviene per il centralinista che ti pu`o dire direttamente lorario degli uffici)
un super-demone `e in genere in grado di rispondere direttamente per alcuni servizi elementari
(come echo o discard), per i quali non necessita di invocare nessun programma esterno.
Infine una caratteristica comune dei super-demoni `e che sono in grado di associare alla con` possibile cio`e, in occasione di
nessione ad una porta lesecuzione di un programma qualunque. E
una connessione ad una porta, lanciare un programma collegando il socket della connessione allo
standard input e allo standard output del programma stesso. Cos` ad esempio si potr`a attivare
il servizio di rete netstat sulla porta 15, usando lomonimo programma visto in sez. 7.6.3.
Di norma i servizi pi`
u importanti, come il web, la posta, il DNS, o SSH non vengono utilizzati
in questo modo, perche questa interposizione di un altro programma avrebbe effetti negativi sulle
prestazioni, anche se in molti casi limportanza del servizio (ad esempio quella di un server web
1

oggi `e sempre meno comune trovare questi servizi attivi, in quanto una buona norma di sicurezza prevede che
`e meglio non attivare un servizio fino a che questo non venga utilizzato.
2
cio`e con super inteso come qualcosa che sta sopra.

451

452

CAPITOLO 8. LA GESTIONE DEI SERVIZI DI BASE

o di posta elettronica) va commisurata con luso che se ne fa: per una macchina client tenere
sempre attivo Apache per fornire delle pagine locali consultate ogni tanto pu`o effettivamente
essere eccessivo.
Tradizionalmente il programma utilizzato per svolgere questo compito `e inetd, che fino a
qualche anno fa veniva installato di default da tutte le distribuzioni; inetd per`o presenta numerosi limiti, ed oggi tende ad essere sostituito con il pi`
u recente xinetd, se non ad essere eliminato
del tutto. In generale infatti lutilit`
a di un super-demone sta venendo meno, considerato che il
costo sempre minore delle risorse ne rende meno vantaggioso lutilizzo.

8.1.2

Il super-demone inetd

Come appena accennato la gestione dei servizi di base veniva effettuata tramite il programma
inetd, che ancor oggi viene usato da alcune distribuzioni. Il programma viene lanciato dagli
script di avvio, ma solito si pu`
o avviare e fermare il demone manualmente con il relativo script,
che di norma `e /etc/init.d/inetd.
In caso di necessit`
a si pu`
o eseguire inetd anche direttamente a riga di comando, nel qual
caso si pu`o usare lopzione -d per farlo partire in modalit`a di debug (in cui non si distacca dal
terminale). Il comando prende come argomento un file di configurazione alternativo, altrimenti
utilizza il default che `e /etc/inetd.conf. Per le altre opzioni ed i dettagli del funzionamento
si faccia riferimento come al solito alla pagina di manuale.
Il file di configurazione di default di inetd `e /etc/inetd.conf, ed `e qui che si specifica su
quali porte il demone deve porsi in attesa e quali programmi lanciare. Un esempio di questo file
`e il seguente:
# /etc/inetd.conf: see inetd(8) for further informations.
#
# Internet server configuration database
#
# <service_name> <sock_type> <proto> <flags> <user> <server_path> <args>
#
#:INTERNAL: Internal services
#echo
stream tcp
nowait root
internal
#echo
dgram
udp
wait
root
internal
#chargen
stream tcp
nowait root
internal
#chargen
dgram
udp
wait
root
internal
#discard
stream tcp
nowait root
internal
#discard
dgram
udp
wait
root
internal
#daytime
stream tcp
nowait root
internal
#daytime
dgram
udp
wait
root
internal
#time
stream tcp
nowait root
internal
#time
dgram
udp
wait
root
internal
#:MAIL: Mail, news and uucp services.
nntp
stream tcp
nowait news
/usr/sbin/tcpd /usr/sbin/leafnode
#:INFO: Info services
ident
stream tcp
wait
identd /usr/sbin/identd
identd

come si vede il formato `e relativamente semplice: una tabella in cui ogni riga `e relativa ad un
servizio da lanciare, ed i cui campi sono separati da spazi o tabulatori. Al solito righe vuote e
inizianti con # sono ignorate.
Il servizio da fornire, o meglio la porta su cui porsi in ascolto, `e identificato dal primo campo
tramite il nome simbolico di /etc/services. Il successivo campo indica il tipo di socket: i due
tipi pi`
u comuni sono stream o dgram, ma si possono usare tutti i tipi di socket supportati con

8.1. I PROGRAMMI DI AUSILIO ALLA GESTIONE DEI SERVIZI DI BASE

453

Linux, (come raw, rdm, o seqpacket). Il terzo campo indica il protocollo usato: di norma si
tratta di tcp o udp,3 che corrispondono rispettivamente ai tipi stream e dgram.
Il quarto campo indica se inetd deve attendere o meno la terminazione del server prima
di rimettersi in ascolto sulla porta, in genere per i socket di tipo dgram si deve usare wait in
quanto non essendoci una connessione normalmente i programmi hanno necessit`a di trattare
tutti i pacchetti che arrivano sulla stessa porta, per cui si dovr`a aspettare la fine del processo
corrente, che indica la fine del flusso di dati, prima di rilanciare unaltra istanza del programma.
Se questo non `e necessario (cosa che vale in genere per tutti i socket di tipo stream, in cui al
programma viene fornito il socket della connessione) deve essere usato il valore nowait.
Il quinto campo indica lutente per conto del quale viene eseguito il programma; se si vuole
specificare anche un gruppo diverso dal gruppo principale dellutente, lo si pu`o fare scrivendo il
campo nella forma user.group.
Il sesto campo deve indicare il pathname completo del comando che verr`a eseguito in caso di
connessione, o la parola chiave internal se quel servizio `e fornito direttamente da inetd.4 Eventuali argomenti dovranno essere specificati di seguito; dato per`o che inetd usa direttamente il
resto della linea per invocare la funzione exec, questi non potranno essere specificati normalmente riprendendo quanto si scriverebbe sulla shell, ma dovranno essere preceduti dallargomento
iniziale che indica il nome del programma lanciato.5
Come si pu`
o notare nellesempio sono abilitati solo due servizi, il primo `e un server news
gestito tramite il programma leafnode, il secondo `e il servizio ident, definito dallRFC 1413, che
permette di identificare lutente proprietario del processo che ha creato una certa connessione.
Si noti anche come nel caso di leafnode questo non sia stato lanciato direttamente ma invocato
attraverso tcpd, un utile programma di sicurezza che permette di controllare gli accessi ai servizi
di rete, come vedremo in sez. 8.1.5. Se vogliamo provare ad abilitare un nuovo servizio netstat
possiamo aggiungere al file una riga del tipo:
netstat

stream

tcp

nowait

nobody

/bin/netstat netstat -ant

e si noti come si sia ripetuto, prima dei parametri -ant, il nome del programma netstat;
senza questa ripetizione il risultato sarebbe stato che allesecuzione di /bin/netstat il nome
del processo sarebbe risultato -ant,6 mentre le opzioni sarebbero state perse.
A questo punto, dopo aver riavviato inetd per fargli prendere le modifiche effettuate alla configurazione, si pu`
o verificare il funzionamento del nostro nuovo servizio usando telnet;
avremo allora che:
[piccardi@gont corso]$ telnet localhost netstat
Trying 127.0.0.1...
Connected to localhost.
Escape character is ^].
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address
Foreign Address
tcp
0
0 0.0.0.0:15
0.0.0.0:*
tcp
0
0 0.0.0.0:111
0.0.0.0:*
tcp
0
0 192.168.1.1:53
0.0.0.0:*
tcp
0
0 127.0.0.1:53
0.0.0.0:*
tcp
0
0 0.0.0.0:22
0.0.0.0:*
3

State
LISTEN
LISTEN
LISTEN
LISTEN
LISTEN

in realt`
a si pu`
o specificare un qualunque altro protocollo col nome riportato in /etc/protocols, ma benche
sia possibile usare il demone con qualunque tipo di socket e protocollo di rete, in pratica sono questi due gli unici
che vengono utilizzati.
4
come accennato inetd `e in grado di fornire direttamente alcuni servizi elementari come echo, discard o
daytime, per i quali non `e necessario lanciare nessun programma a parte.
5
si ricordi come la shell costruisca automaticamente questo argomento, che negli script `e $0, usando
direttamente il nome del comando.
6
come potreste osservare anche direttamente eseguendo ps, posto che siate cos` veloci (e fortunati) da riuscire
a lanciarlo mentre netstat sta girando.

454

CAPITOLO 8. LA GESTIONE DEI SERVIZI DI BASE


tcp
tcp
tcp
tcp
tcp
tcp
tcp
Connection

0
0
0
0
0
0
0
closed

0 0.0.0.0:631
0 0.0.0.0:25
0 192.168.1.1:32777
0 127.0.0.1:32944
0 192.168.1.1:32778
0 192.168.1.1:32772
0 127.0.0.1:15
by foreign host.

0.0.0.0:*
0.0.0.0:*
195.110.124.18:993
127.0.0.1:15
62.177.1.107:5223
192.168.1.168:5901
127.0.0.1:32944

LISTEN
LISTEN
ESTABLISHED
ESTABLISHED
ESTABLISHED
ESTABLISHED
ESTABLISHED

e come si pu`o notare si ottiene il risultato del comando netstat, eseguito come se fossimo su
una macchina remota, in cui compare, nellultima riga, anche la connessione su cui lo stiamo
leggendo.
Il precedente esempio funziona perche quando lancia un programma inetd fa s` che standard
input, standard output e standard error siano associati al socket su cui `e stata aperta la connessione. Si pu`o cos` eseguire un programma qualsiasi, e questo accetter`a linput dal socket e su
di esso scriver`a il suo output, ed in generale sar`a compito del programma messo in esecuzione
gestire opportunamente la connessione di rete, fornendo il servizio richiesto.
Nellesempio appena mostrato quello che `e successo `e che il programma netstat `e stato
eseguito sul server remoto,7 e ha prodotto la lista dei socket attivi scrivendola sullo standard
output, per poi terminare. Questo ha fatto s` che noi la ricevessimo allaltro capo del socket creato
dalla connessione effettuata con telnet, che `e stato automaticamente chiuso alla terminazione
del processo. La stessa procedura `e applicabile in generale a qualunque comando di shell, per
cui potremmo definire un servizio di rete ps (assegnandogli una porta in /etc/services) che ci
fornisca lelenco dei processi, ed in generale potremmo anche crearci un servizio ad hoc usando
degli script.

8.1.3

Il super-demone xinetd

Il programma xinetd nasce come riscrittura di inetd per eseguire lo stesso compito: far partire
i server appropriati in caso di connessione al relativo servizio, evitando di lanciare e tenere in
memoria dei programmi che resterebbero dormienti per la gran parte del tempo.
Rispetto ad inetd esso supporta nativamente il controllo di accesso con i TCP wrappers (vedi
sez. 8.1.5), ma oltre a questo ha una serie di funzionalit`a ulteriori come la possibilit`a di mettere
a disposizione i servizi in orari determinati, dei meccanismi di redirezione delle connessione,
delle capacit`a di registrazione degli eventi pi`
u estese, dei meccanismi di protezione nei confronti
delle scansioni delle porte, e la capacit`
a di limitare il numero di istanze del server lanciate, per
resistere ad attacchi di denial of service.
Le maggiori funzionalit`
a comportano ovviamente il prezzo di una maggiore complessit`a di
configurazione, comunque il comando supporta una opzione -inetd_compat che gli permette
di operare in modalit`
a di compatibilit`
a con inetd. In tal caso infatti il programma prima
legge i suoi file di configurazione, e poi /etc/inetd.conf facendo partire i servizi definiti in
questultimo (questa `e la configurazione standard di Debian).
Il file principale di configurazione di xinetd `e /etc/xinetd.conf; un esempio del suo
contenuto, che illustra le principali direttive generiche, `e il seguente:
# Simple configuration file for xinetd
defaults
{
# The maximum number of requests a particular service may handle
# at once.
instances
= 25
# The type of logging.
7

This logs to a file that is specified.

il fatto che si sia usato localhost `e stato solo per comodit`


a.

8.1. I PROGRAMMI DI AUSILIO ALLA GESTIONE DEI SERVIZI DI BASE

455

# Another option is: FILE /var/log/servicelog


log_type
= SYSLOG auth
# What to log when the connection succeeds.
# PID logs the pid of the server processing the request.
# HOST logs the remote hosts ip address.
# USERID logs the remote user (using RFC 1413)
# EXIT logs the exit status of the server.
# DURATION logs the duration of the session.
log_on_success = HOST PID
# What to log when the connection fails.
log_on_failure = HOST RECORD

Same options as above

# The maximum number of connections a specific IP address can


# have to a specific service.
per_source = 5
}
includedir /etc/xinetd.d

in questo caso nel file `e presente soltanto la sezione speciale defaults, che contiene i valori di
default delle opzioni, da applicare per tutti i servizi per i quali essi non sono stati esplicitamente
specificati.
La riga finale con la riga includedir richiede poi di includere automaticamente nella configurazione il contenuto di tutti i file contenuti nella directory specificata (di norma, come nel
caso, si usa /etc/xinetd.d), cosa che permette di attivare in maniera indipendente un servizio
con la semplice installazione di un file in tale directory.
Al solito le righe vuote e il cui primo carattere `e # vengono ignorate; per il resto per ciascun
servizio che si vuole attivare `e necessario specificare una voce (nel caso baster`a scrivere un file
che la contenga in /etc/xinetd.d) che inizia con la direttiva service; la sintassi generica di
tale voce `e del tipo:
service <nome_servizio>
{
<attributo> <operatore> <valore> <valore> ...
...
}
dove <nome_servizio> indica il servizio che si vuole fornire, e gli attributi permettono di specificarne le caratteristiche, con un operatore di assegnazione che nella gran parte dei casi `e =,
con significato ovvio, ma che pu`
o essere anche += o -= rispettivamente per aggiungere o togliere
valori (solo alcuni attributi lo supportano).
Come mostrato nellesempio precedente, anche la direttiva default prende degli attributi;
in genere questi sono attributi generali che possono a loro volta essere rispecificati in maniera
diversa per i singoli servizi. Nel nostro caso il primo attributo `e instances che permette di porre
un limite massimo al numero di istanze di uno stesso server che il programma pu`o lanciare.
Il secondo attributo `e log_type, che permette di specificare le modalit`a con cui viene effettuato la registrazione dei dati delle connessioni; queste possono essere FILE per specificare a
seguire un file su cui salvare direttamente i dati, o SYSLOG per specificare luso del syslog (vedi
sez. 3.2.3), indicando poi con lulteriore parametro (nel caso auth) quale facility utilizzare; `e
possibile anche specificare di seguito una priority, se diversa dal default che `e info.
I due attributi successivi, log_on_success e log_on_failure, permettono di specificare
cosa scrivere nei log in caso rispettivamente di successo e fallimento di una connessione. Le
indicazioni HOST e USERID sono comuni ad entrambi e permettono di registrare rispettivamente
lIP e lutente (se `e disponibile il servizio identd secondo lRFC 1413) relativi alla connessione

456

CAPITOLO 8. LA GESTIONE DEI SERVIZI DI BASE

da remoto; log_on_success permette anche di registrare lo stato di uscita del server (con EXIT),
la durata della connessione (con DURATION) ed il numero identificativo del processo (con PID).
Infine lultimo attributo, per_source, permette di stabilire un numero massimo per le connessioni da un singolo IP (una forma per limitare eventuali denial of service). Un elenco dei
principali attributi che possono essere specificati nella sezione defaults, con la relativa descrizione, `e riportato in tab. 8.1, lelenco completo pu`o essere trovato nelle pagine di manuale,
accessibili con man xinetd.conf.
Attributo
instances

Descrizione
numero massimo di processi lanciati per ogni servizio;
prende un valore intero.
metodologia di registrazione dei log, su file o tramite syslog; prende i valori FILE (seguito dal nome del file su vengono aggiunti i messaggi) o SYSLOG seguito dalla facility
da usare ed opzionalmente dalla priorit`
a.
cosa registrare per le connessioni riuscite; prende uno o
pi`
u fra PID, HOST, USERID, EXIT, DURATION.
cosa registrare per le connessioni fallite, prende uno o pi`
u
fra HOST, USERID, ATTEMPT.
numero massimo di connessioni per singolo IP sorgente;
prende un valore intero.
lista delle macchine da cui `e possibile accedere; prende
indirizzi IP in forma dotted decimal, CIDR o simbolica.
lista delle macchine da cui `e impossibile accedere; prende
indirizzi IP in forma dotted decimal, CIDR o simbolica.
orario giornaliero nel quale `e possibile accedere ai servizi, prende un intervallo temporale specificato nella forma
HH:MM-HH:MM.
rate massimo di accesso; prende un valore decimale per
indicare il limite sulle connessioni al secondo, ed un valore
intero per specificare il numero di secondi da aspettare
prima di accettare nuove connessioni una volta superato
il limite.
valore di nice (vedi sez. 1.3.4) da applicare ai demoni
lanciati; prende un valore intero.
carico massimo oltre il quale la macchina smette di
accettare connessioni; prende un valore decimale.

log_type

log_on_success
log_on_failure
per_source
only_from
no_access
access_times

cps

nice
max_load

Tabella 8.1: Attributi specificabili in generale per tutti i servizi gestiti attraverso il super-demone xinetd.

Come accennato il programma `e in grado sia di implementare direttamente dei controlli


di accesso, che di utilizzare quelli eventualmente specificati tramite i file di controllo dei TCP
wrappers 8 (vedi sez. 8.1.5). I due attributi only_from e no_access sono in grado di specificare
direttamente le stesse condizioni allinterno del file di configurazione di xinetd. In questo caso
le sintassi supportate sono sia le forme dotted decimal (interpretando gli zeri finali come indirizzi
di rete), che quelle CIDR, sia quelle espresse con indirizzi simbolici.
Come gi`a accennato ciascun servizio che si vuol lanciare con xinetd deve essere specificato
con la direttiva service seguita dal nome dello stesso; un esempio possibile `e il seguente:
service time
{
disable = yes
type
id
socket_type
protocol
8

=
=
=
=

INTERNAL
time-stream
stream
tcp

si tenga presente che luso dei TCP wrappers ha di norma la precedenza sul controllo interno, per cui se si
abilita laccesso con queste direttive, ma esso `e negato dai TCP wrappers, questi ultimi avranno la meglio.

8.1. I PROGRAMMI DI AUSILIO ALLA GESTIONE DEI SERVIZI DI BASE


user
wait

457

= root
= no

}
service time
{
disable
= yes
type
= INTERNAL
id
= time-dgram
socket_type
= dgram
protocol
= udp
user
= root
wait
= yes
}
service nntp
{
socket_type = stream
wait
= no
user
= news
server
= /usr/sbin/leafnode
server_args = -v
only_from
= 192.168.0.0/24
access_times = 08:00-17:00
}

In questo caso si sono definiti due servizi gestiti direttamente da xinetd, e cio`e il servizio
time su TCP e UDP, entrambi sono disabilitati, avendo disable impostato su yes. Si noti come
siano stati differenziati attraverso la presenza di un argomento id. Inoltre con socket_type si
`e specificato il tipo di socket da usare, e con protocol il relativo protocollo. Il campo type dice
che il servizio `e fornito internamente, mentre user indica che verr`a eseguito per conto dellutente
root. Infine il campo wait indica se il servizio pu`o essere fornito in maniera concorrente (con
molte connessioni contemporanee) senza attendere la conclusione di una connessione, o no.
Oltre ai due servizi interni si `e abilitato anche il servizio di news; in questo caso restano
specificati con lo stesso significato precedente gli argomenti wait, socket_type e user (anche
se per questultimo si `e usato lutente news), mentre non esistendo il servizio news su UDP
non `e stato necessario importare protocol. Si `e invece specificato il programma da usare come
server con server, passando i relativi argomenti con server_args. Inoltre nel caso si `e ristretto
laccesso al servizio alle macchine della sottorete 192.168.0.0/24 con only_from e negli orari
di ufficio usando access_times.
Oltre a quelli appena illustrati, si sono riportati i principali attributi utilizzabili in tab. 8.2.
Si ricordi che anche i precedenti attributi di tab. 8.1 possono essere utilizzati, e saranno applicati
solo al servizio in questione. Al solito nella pagina di manuale di xinetd.conf `e riportato un
elenco completo di tutti gli argomenti presenti e la descrizione dettagliata di ciascuno di essi.
Anche con xinetd `e possibile creare un proprio servizio usando i comandi di shell; ripeteremo
allora quanto visto con inetd definendo un nuovo servizio netstat. Dato che il servizio `e previsto
in /etc/services solo per TCP possiamo attivarlo creando in /etc/xinetd.d un nuovo file con
un contenuto del tipo di:
service netstat
{
socket_type
wait
user
server
server_args
}

=
=
=
=
=

stream
no
root
/bin/netstat
-ant

458

CAPITOLO 8. LA GESTIONE DEI SERVIZI DI BASE


Attributo
socket_type
user

server
wait

protocol
port

type

server_args

disable
id
bind
redirect

umask

Descrizione
tipo di socket; prende gli stessi valori (stream, dgram,
ecc.) dellanalogo parametro in inetd.conf.
utente per conto del quale `e lanciato il servizio; deve
essere presente in /etc/passwd, si pu`
o specificare un
eventuale gruppo con lattributo group.
pathname del programma server da lanciare; va sempre
specificato se il servizio non `e gestito internamente.
indica se si deve attendere o meno la conclusione del
server per lanciare unaltra istanza; analogo dello stesso
parametro in inetd.conf; prende i valori yes e no.
protocollo usato (analogo di tcp ed udp per inetd.conf);
deve essere un nome valido in /etc/protocols.
porta su cui ascoltare le connessioni; deve essere specificata se si `e specificato un servizio non riportato in
/etc/services.
tipo di servizio; pu`
o assumere i valori INTERNAL (per servizi gestiti internamente), RPC per indicare che si user`
a
un servizio RPC (vedi sez. 7.6.5), UNLISTED per servizi
non presenti in /etc/services o /etc/rpc.
eventuali argomenti da passare al programma server
quando viene lanciato; non necessita di specificare
largomento iniziale come per inetd.
indica se attivare il servizio, il default `e disattivo; pu`
o
assumere i valori yes e no.
identificatore aggiuntivo qualora si tratti di servizi diversi
con lo stesso nome.
consente di specificare linterfaccia su cui fornire il
servizio; prende lindirizzo IP ad essa associato.
consente di redirigere il servizio ad unaltra macchina;
prende lindirizzo IP e la porta verso quale redirigere
tutto il traffico.
imposta la umask ereditata dal processo mandato in
esecuzione.

Tabella 8.2: Attributi specificabili per un servizio gestito attraverso il super-demone xinetd.

e, una volta riavviato xinetd, potremo verificarne come prima il funzionamento, con un telnet
sulla porta 15.

8.1.4

Il servizio NTP

Abbiamo gi`a accennato in sez. 2.4.3 come sia possibile usare il comando ntpdate per rimettere
lorologio di una macchina andando ad interrogare un server esterno che fornisce il servizio di
ora esatta attraverso il protocollo NTP.9
Il servizio NTP usa la porta 123 UDP, e prevede una organizzazione gerarchica dei server
in strati con precisione decrescente dei tempi. La gerarchia parte dai dispositivi di strato 0,
che sono quelli collegati direttamente ad una fonte primaria della misura esatta del tempo (e
possono essere orologi atomici, orologi GPS o radio). In genere server pubblici di questo tipo
non sono disponibili direttamente allutente finale, e vengono invece utilizzati passando da dei
9

il Network Time Protocol `e uno dei pi`


u complessi disponibili su Internet e consente una sincronizzazione
dei tempi estremamente precisa (dellordine dei 10 ms) nonostante tutte le incertezze che si possono avere nella
trasmissione dei pacchetti; lRFC 1305 che descrive la versione 3 del protocollo supera le 200 pagine, la versione
quattro, che `e pienamente supportata da ntpd, non `e ancora formalizzata in un RFC, anche se `e stato pubblicato
lRFC 2030 che descrive la versione semplificata del protocollo, SNTP, utilizzata quando non `e necessaria la
precisione del protocollo completo.

8.1. I PROGRAMMI DI AUSILIO ALLA GESTIONE DEI SERVIZI DI BASE

459

server di strato 1,10 che formano quelli che pi`


u comunemente si chiamano Time Server. Un
gruppo di questi server `e fornito allindirizzo pool.ntp.org,11 mentre un server italiano, sincronizzato sullorologio atomico dellIstituto Galileo Ferraris di Torino, `e raggiungibile allindirizzo
tempo.ien.it.
In genere quando si installa un server NTP su una rete si crea un server di strato 2, che
fa riferimento ad uno o pi`
u server di strato 1 per ottenere la una fonte di misura dei tempi;
si pu`o poi anche installare il servizio sulle singole workstation, nel qual caso `e opportuno che
queste facciano riferimento al precedente server di strato 2,12 e si avrebbero a quel punto server
di strato 3.13
Lutilizzo di un server NTP rispetto allinvocazione periodica di ntpdate ha il vantaggio che
il demone `e in grado di raccogliere informazioni riguardo alla deriva dellorologio di sistema, e
fornire allo stesso le necessarie informazioni per mantenere corretta lora in maniera costante (facendolo accelerare o rallentare per compensare le differenze rilevate), senza che diventi necessaria
un sincronizzazione periodica.
Il server ntpd14 fornisce una implementazione completa della versione 4 del protocollo, pur
mantenendo la compatibilit`
a con la versione 3. Benche si possano effettuare alcune impostazioni
di base direttamente con le opzioni a riga di comando, in genere il comando viene lanciato dagli
script di avvio,15 e legge la sua configurazione da /etc/ntp.conf (o dal file specificato con
lopzione -c). Qualora si avessero problemi si pu`o lanciare direttamente il server in modalit`
a di
16
debug con lopzione -d; in tal caso il programma non si distaccher`a dal terminale e stamper`
a
tutti i messaggi.
Il formato del file prevede la solita convenzione di ignorare righe vuote o inizianti per #,
ogni riga `e costituita da una direttiva seguita da uno o pi`
u argomenti, separati da spazi, e non
si pu`o proseguire sulla riga successiva. La direttiva pi`
u importante, ed in genere lunica che
serve modificare `e server, per indicare a quali server di strato superiore rivolgersi per ottenere
la sincronizzazione.
Una seconda direttiva, da utilizzare quando si intende impostare un server NTP locale ad uso
di altre macchine, `e restrict, che consente di indicare a quali IP il server pu`o rispondere per
le richieste di sincronizzazione. Le altre principali direttive di configurazione di /etc/ntp.conf
sono riportate in tab. 8.3, insieme alle opzioni che permettono di impostare il valore di alcune
di esse se si lancia il demone a riga di comando.
Un estratto del file di configurazione installato su una Debian Sarge per un server di strato
2 `e il seguente, dove si `e indicato un server di strato 1 da usare come riferimento e si `e abilitato
laccesso dalla propria rete locale:
driftfile /var/lib/ntp/ntp.drift
statsdir /var/log/ntpstats/
statistics loopstats peerstats clockstats
filegen loopstats file loopstats type day enable
filegen peerstats file peerstats type day enable
10

ogni volta che un server NTP viene sincronizzato su un altro server NTP, il suo numero di strato viene
aumentato di 1, per questo lo strato 0 indica la connessione diretta ad una fonte di tempo.
11
lindirizzo viene risolto dal DNS in una serie diversa di server di strato 1, per cui si possono avere diverse
fonti.
12
a parte il fatto di non generare inutilmente traffico di rete verso lesterno per rivolgersi in pi`
u macchine ad un
server di strato 1, in questo caso `e prevalente linteresse di avere una migliore coerenza fra i tempi degli orologi
delle macchine (cosa ottenibile rivolgendosi ad un server sulla propria rete), piuttosto che una maggiore esattezza
media delle ore dei vari orologi.
13
loperazione si potrebbe ripetere creando eventuali server di strato 4 e cos` via fino ad un massimo di 16 strati,
ma con scarsa utilit`
a pratica.
14
installabile su Debian con il pacchetto ntp.
15
nel caso di Debian /etc/init.d/ntp.
16
sempre che il relativo supporto sia stato abilitato nella creazione del comando, nel qual caso si pu`
o ripetere
lopzione pi`
u volte per avere messaggi di debug pi`
u dettagliati.

460

CAPITOLO 8. LA GESTIONE DEI SERVIZI DI BASE


Direttiva
driftfile

Opzione
-f

statsdir

-s

server

restrict

Significato
prende come parametro il file dove verranno scritte le
informazioni relative alla deriva dellorologio di sistema,
usate per le relative correzioni.
indica la directory su cui vengono salvate le informazioni
statistiche.
indica un server di riferimento da cui ottenere la sincronizzazione, passato come argomento per nome a dominio
o indirizzo IP, la direttiva pu`
o essere ripetuta pi`
u volte
per indicare pi`
u server.
imposta le regole di accesso al server, prende come primo
parametro un indirizzo IP di una macchina o di una rete
(nel qual caso deve essere seguita dalla sottodirettiva mask e dalla relativa netmask ) cui seguono le restrizioni da
applicare. Deve essere specificata almeno una volta per
indicare una regola di default (in tal caso si pu`
o usare la
parola chiave default al posto dellindirizzo).

Tabella 8.3: Le principali direttive di configurazione di ntp.conf ed eventuali corrispondenti opzioni di ntpd.

filegen clockstats file clockstats type day enable


server pool.ntp.org
restrict default kod notrap nomodify nopeer noquery
restrict 127.0.0.1 nomodify
restrict 192.168.1.0 mask 255.255.255.0 nomodify notrap

La documentazione delle varie opzioni e delle principali direttive di configurazione del server `e
disponibile nella pagina di manuale, accessibile con man ntpd, ma per la documentazione completa occorre fare riferimento al sito del progetto, su http://www.ntp.org/documentation.html.

8.1.5

I TCP wrappers

Per molto tempo gran parte dei demoni di rete, nati in un periodo in cui Internet era una rete
costituita principalmente da istituzioni ed enti di ricerca, ed in cui il numero delle persone che
potevano utilizzarla era molto limitato e facilmente controllabile, non sono stati forniti di nessun
tipo di controllo degli accessi, permettendo a chiunque di collegarsi ad essi, qualunque fosse la
sua macchina o il suo indirizzo IP.
Con lespandersi della rete e la possibilit`a di accessi non voluti o maliziosi, `e diventato
sempre pi`
u importante poter effettuare un controllo degli accessi. Per questo Wietse Wenema,
un esperto di sicurezza, ha creato un insieme di librerie e programmi, chiamati TCP wrappers,
che consentono di realizzare un controllo degli accessi permettendo il collegamento ai servizi da
essi protetti solo da parte di certi indirizzi o reti.17
Le modalit`a con cui si possono utilizzare le capacit`a di filtraggio dei TCP wrappers sono
sostanzialmente due. La prima `e quella pi`
u semplice che vede luso del programma tcpd, che fa
da involucro (in inglese wrapper, da cui il nome) allesecuzione di altri programmi. Esso viene
di norma utilizzato attraverso il demone inetd come illustrato in sez. 8.1.2 per lanciare altri
programmi. Il comando infatti effettua un controllo sul socket associato alla connessione e se
laccesso `e consentito lancia il demone specificato come argomento; in questo modo `e possibile
realizzare un controllo di accesso anche per programmi che non hanno alcun supporto per questa
funzionalit`a.
La seconda modalit`
a `e quella che prevede luso, direttamente allinterno del demone che
fornisce il servizio, delle librerie di controllo dei TCP wrappers, in questo modo `e il programma
stesso che diventa in grado di usarne le funzionalit`a senza dover ricorrere ad un programma
17

in sostanza questi programmi leggono dal socket associato ad una connessione lindirizzo sorgente da cui essa
`e stata effettuata, ed applicano delle restrizioni sui possibili valori di questultimo.

8.1. I PROGRAMMI DI AUSILIO ALLA GESTIONE DEI SERVIZI DI BASE

461

esterno. Alcuni demoni che fanno uso di questa modalit`a sono quelli relativi a servizi come SSH,
LDAP o NFS.
In entrambi i casi le connessioni ai servizi controllati con i TCP wrappers vengono registrate
sul sistema del syslog, in modo da lasciare traccia di eventuali tentativi di accesso non autorizzati,
dopo di che vengono eseguiti i vari controlli che sono stati richiesti.
Il controllo di accesso dei TCP wrappers `e gestito attraverso due file, /etc/hosts.allow ed
/etc/hosts.deny, che contengono le regole di accesso. Il primo file, come suggerisce il nome,
elenca le regole che consentono laccesso, il secondo quelle che lo negano.
Si tenga presente che il funzionamento dei TCP wrappers `e tale che prima viene controllato
hosts.allow, e se una regola corrisponde laccesso `e garantito e la procedura di controllo finisce
immediatamente; altrimenti viene controllato hosts.deny e se una regola corrisponde laccesso
`e negato. Se non si trova nessuna corrispondenza (o entrambi i file sono vuoti o non esistono),
laccesso `e consentito.
Dato che `e buona norma in una politica di sicurezza bloccare tutto per default per poi
consentire soltanto quanto necessario, in genere quello che si fa `e negare tutti gli accessi in
hosts.deny e garantire poi solo quelli effettivamente voluti in hosts.allow. Per questo un
esempio tipico del contenuto di hosts.deny `e il seguente:
# /etc/hosts.deny: list of hosts that are _not_ allowed to access the system.
#
See the manual pages hosts_access(5), hosts_options(5)
#
and /usr/doc/netbase/portmapper.txt.gz
#
ALL: ALL

in cui si blocca laccesso a tutti i servizi da qualunque provenienza.


La sintassi delle regole da utilizzare in questi file gi`a si intravede da questo primo esempio;
al solito righe vuote e tutto quello che segue un # viene ignorato, mentre ogni riga non vuota
deve avere la forma generica:
lista dei server: lista dei client : comando shell
con tre campi di configurazione separati dal carattere :, di questi il terzo `e opzionale e pu`
o
essere omesso (ed in effetti `e scarsamente utilizzato). I primi due campi , come riportato,
consentono luso di una lista di valori, da specificare separati da spazi.
Per capire meglio la sintassi prendiamo un secondo esempio, pi`
u significativo del precedente,
per un possibile contenuto di hosts.allow che, una volta bloccato tutto con il precedente
hosts.deny, consenta comunque di accedere ad alcuni servizi:
# /etc/hosts.allow:
#
#
#
sshd:
ALL
leafnode: 127.0.0.1
portmap: 127.0.0.1
mountd:
127.0.0.1
statd:
127.0.0.1
lockd:
127.0.0.1
rquotad: 127.0.0.1

list of hosts that are allowed to access the system.


See the manual pages hosts_access(5), hosts_options(5)
and /usr/doc/netbase/portmapper.txt.gz

192.168.1.
192.168.1.
192.168.1.
192.168.1.
192.168.1.

Lesempio riporta alcuni criteri di accesso per diversi servizi, il primo concerne luso di SSH
(che tratteremo in sez. 8.3) per laccesso da remoto alla riga di comando, che viene gestito dal
programma sshd; il secondo `e il servizio che permette di tenere un server di news in locale, gli
altri sono i vari server necessari al funzionamento di NFS (si veda sez. 8.4.1). Lesempio consente
laccesso generico ad SSH da qualunque indirizzo IP, laccesso a NFS solo dalla rete locale, e
luso del server di news solo tramite dalla macchina stessa.

462

CAPITOLO 8. LA GESTIONE DEI SERVIZI DI BASE

In generale per il primo campo `e necessario indicare il nome (o i nomi, se sono pi`
u di uno)
del programma che gestisce il servizio sui cui si vuole applicare il controllo di accesso. Occorre
fare attenzione, perche nelle versioni meno recenti dei TCP wrapper il nome da indicare nella
prima colonna `e proprio quello del programma che fornisce il servizio, e non quello della porta
che si usa invece in inetd.conf; le versioni pi`
u recenti consentono anche di utilizzare il nome
del servizio (o il relativo numero di porta).
Nella secondo campo si indicano invece gli indirizzi IP o le reti a cui si vuole consentire
laccesso. Per le reti in genere si pu`
o usare sia la notazione numerica che quella dei nomi a
dominio, e si pu`
o usare il carattere * per raggruppare indirizzi; si pu`o anche specificare una
maschera di rete con un indirizzo del tipo:
131.155.72.0/255.255.254.0
e specificare la lista degli indirizzi usando un file dando il pathname assoluto dello stesso.
Il formato e la lista completa delle funzionalit`a che sono controllabili tramite questi due
file `e riportato nella pagina di manuale ad essi associata, accessibile con man 5 hosts_access.
Si tenga comunque conto che alcuni servizi supportano solo un sottoinsieme delle funzionalit`a
definite in generale.18
Per una migliore gestione dei TCP wrapper col relativo pacchetto vengono forniti anche dei
programmi di utilit`
a che permettono di verificare la configurazione ed effettuare dei controlli di
accesso. Il primo programma `e tcpdchk che esegue un controllo delle regole di accesso impostate
con hosts.allow e hosts.deny, confrontandole anche con i servizi attivati in inetd.conf. Il
comando riporta tutti gli eventuali problemi rilevati, a partire da un uso scorretto di wildcard e
indirizzi, servizi che non sono riconosciuti, argomenti o opzioni non validi, ecc. Cos` ad esempio
potremo avere:
[root@gont corso]# tcpdchk
warning: /etc/hosts.allow, line 15: apt-proxy: no such process name in /etc/inetd.conf

in corrispondenza ad una regola di accesso rimasta aperta per un servizio che in seguito `e stato
rimosso.
Il comando permette di controllare i file hosts.allow e hosts.deny nella directory corrente invece che sotto /etc usando lopzione -d, mentre si pu`o specificare un diverso file
per inetd.conf con lopzione -i, la documentazione completa `e al solito disponibile con man
tcpdchk.
Il secondo comando di controllo `e tcpdmatch che permette di verificare il comportamento dei
TCP wrapper per una specifica richiesta da un servizio. Il comando richiede due parametri, il
primo che specifichi il servizio che si vuole controllare ed il secondo la stazione da cui si intende
effettuare laccesso. Il comando eseguir`
a una scansione delle regole e riporter`a i risultati. Ad
esempio potremo richiedere:
[root@gont corso]# tcpdmatch sshd oppish
warning: sshd: no such process name in /etc/inetd.conf
warning: oppish: hostname alias
warning: (official name: oppish.earthsea.ea)
client:
hostname oppish.earthsea.ea
client:
address 192.168.1.168
server:
process sshd
matched: /etc/hosts.allow line 14
access:
granted
18

questo accade ad esempio per il server NFS del kernel, ci sono infatti casi in cui questi file vengono utilizzati
direttamente, in maniera indipendente dalle librerie dei TCP wrapper, con un sottoinsieme delle capacit`
a di queste
ultime.

8.2. LASSEGNAZIONE DINAMICA DEGLI INDIRIZZI IP

463

che controlla laccesso al servizio SSH (si noti che si deve specificare il nome del programma che
esegue il servizio) da parte della macchina oppish, trovando che questo `e consentito dalla riga
14 del file hosts.allow. Il comando rileva anche che il servizio non `e lanciato attraverso inetd
e quale `e lIP effettivo della macchina.

8.2

Lassegnazione dinamica degli indirizzi IP

In questa sezione tratteremo vari protocolli (ed i relativi programmi di utilizzo) che vengono
usati per lassegnazione automatica dei numeri IP allinterno di una rete locale. Il primo, il
RARP `e stato il primo protocollo usato a questo scopo, ed `e sostanzialmente in disuso essendo
sostituito dagli altri due. Il secondo, il BOOTP, nasce per distribuire via rete immagini di avvio,
mentre lultimo, il DHCP, ricomprende tutte queste esigenze allinterno di un unico servizio, e
lo tratteremo con maggiori dettagli.

8.2.1

I protocolli RARP, BOOTP e DHCP

Il protocollo RARP (sigla che sta per Reverse Address Resolution Protocol ), `e un protocollo
elementare, definito nellRFC 903 che, come il nome stesso indica, esegue il compito inverso
rispetto al protocollo ARP gi`
a visto in sez. 7.6.4. Il protocollo `e implementato direttamente a
livello di collegamento fisico (cio`e nella maggior parte dei casi su ethernet) e serve ad ottenere,
dato un MAC address sulla rete, lindirizzo IP ad esso associato.
Lo scopo del protocollo era principalmente quello di fornire un meccanismo automatico per
lassegnazione di un numero IP ad una macchina in fase di avvio; questa esegue (posto che
il kernel disponga del relativo supporto, che su Linux deve essere opportunamente abilitato)
una richiesta RARP su ethernet ed utilizza il numero IP fornito come risposta per configurare
linterfaccia di rete da cui ha eseguito la richiesta; la cosa presuppone ovviamente la presenza
nel suddetto tratto di rete di un server che fornisca la risposta.
Tutto ci`
o oggi, in presenza di altri protocolli pi`
u sofisticati in grado di eseguire sia questo che
altri compiti, ha solo interesse storico (considerato anche che sono assai pochi ormai i sistemi
operativi che lo supportano). Per chi si trovasse in situazioni in cui per compatibilit`a con vecchi
sistemi viene ancora usato questo metodo per lassegnazione degli indirizzi, ci limitiamo a citare
la possibilit`
a compilare il kernel per utilizzare questo supporto.
Il protocollo BOOTP (il nome sta per Bootstrap Protocol ), `e definito nellRFC 951 e nasce
come protocollo per gestire lavvio automatico delle macchine. Rispetto al precedente RARP `e
basato su IP e UDP (e non direttamente sul collegamento fisico) ed non si limita alla ricerca di
un numero IP da assegnare automaticamente ad una scheda di rete, ma prevede anche linvio
delle informazioni necessarie ad ottenere un file da usare come sistema operativo per lavvio e
lindirizzo di una macchina a cui richiedere questultimo.
Il protocollo BOOTP nasce principalmente per fornire un meccanismo con cui macchine
senza disco possano eseguire un avvio del sistema operativo via rete, ottenendo questultimo19
da un opportuno server; in genere il trasferimento dei dati avviene tramite il protocollo TFTP,20
ma in teoria possono essere utilizzati anche altri protocolli. In questo caso `e compito del BIOS
della macchina implementare la parte client del protocollo,21 in modo da ottenere poi limmagine
del sistema che verr`
a caricata in memoria ed eseguita.
Come sottoinsieme delle funzionalit`a del protocollo BOOTP c`e ovviamente anche quella della assegnazione automatica di un numero IP; il trasferimento dellimmagine del sistema avviene
19

cio`e i vari file contenenti i dati necessari, nel caso di Linux limmagine del kernel ed un eventuale ramdisk.
il Trivial File Transfer Protocol `e un protocollo elementare per il trasferimento di file basato su UDP, che `e
utilizzabile in programmi estremamente semplificati come quelli che sono contenuti nel BIOS di una macchina.
21
sia di BOOTP che di TFTP, se poi viene usato questultimo.
20

464

CAPITOLO 8. LA GESTIONE DEI SERVIZI DI BASE

sempre con un altro protocollo che necessita di IP; per questo motivo il protocollo pu`o essere
usato per distribuire gli indirizzi su una rete. Di nuovo qualora questa funzionalit`a fosse necessaria per lavvio, ad esempio per lavvio di un sistema con la directory radice su NFS, occorrer`a
compilare il kernel con il relativo supporto, analogamente a quanto si farebbe per luso di RARP.
Il supporto per la parte server del protocollo `e disponibile con il programma bootpd (su
Debian il pacchetto `e bootp) che implementa tutte le funzionalit`a definite nellRFC 951 e pure
le estensioni dei successivi RFC 1532 e RFC 1533. In genere il servizio viene avviato tramite
inetd, ma pu`o essere eseguito anche in modalit`a standalone.
Il comando prevede come argomento il file da cui leggere le impostazioni, che pu`o essere
omesso, nel qual caso verr`
a utilizzato il default che `e /etc/bootptab; questultimo contiene
tutte le definizione dei vari parametri da usare per ciascun client nella forma:
hostname:tg=value... :tg=value... :tg=value. ...
dove hostname indica il nome associato ad un client cui seguono le assegnazioni dei parametri
che sono identificati da una etichetta di due caratteri, separata con luso del carattere :.
Tag
bf
dn
ds
gw
ha
hd
hn
ip
rp
sa
sm
td

Descrizione
file di avvio.
nome del dominio.
lista dei server DNS.
lista dei gateway.
indirizzo fisico (MAC address) della macchina.
home directory per il file di avvio.
hostname da inviare al client.
indirizzo IP da assegnare.
pathname della directory da montare come radice.
indirizzo del server TFTP da usare.
maschera di rete della macchina.
directory radice per il server TFTP.

Tabella 8.4: Etichette dei parametri assegnabili in bootptab.

Un elenco delle etichette dei principali parametri usati da bootptab `e riportato in tab. 8.4,
al solito lelenco completo e tutti i dettagli sono nella relativa pagina di manuale, accessibile con
man bootptab.
Il protocollo pi`
u utilizzato per la configurazione automatica della rete `e il DHCP, sigla che sta
per Dynamic Host Configuration Protocol, che al giorno doggi ha soppiantato in maniera praticamente completa sia RARP che BOOTP. Oltre ai servizi previsti dal precedente BOOTP, del
quale implementa, in maniera compatibile allindietro, tutte le funzionalit`a, il protocollo supporta lassegnazione dinamica degli indirizzi. La descrizione completa `e disponibile nellRFC 2131
che ne definisce tutte le caratteristiche.
A differenza di BOOTP lo scopo principale di DHCP, come espresso dal nome stesso, `e
quello della configurazione dinamica delle macchine in una rete locale, uno dei vantaggi di questo
protocollo `e che `e in grado di fornire parecchie informazioni in pi`
u rispetto a quelle elementari
fornite da BOOTP, rendendo possibile la configurazione automatica di tutte le funzionalit`a della
rete per le macchine di una LAN.
La peculiarit`
a di DHCP `e comunque il supporto per la gestione dinamica degli indirizzi.
Con BOOTP infatti lassegnazione di un indirizzo IP `e fatta staticamente sul server, per ogni
client deve essere configurato un indirizzo; il client si limita a fare una richiesta e configurare
la rete in base alla risposta (o fallisce se il server non risponde). Non viene gestito il caso di
una assegnazione temporanea allinterno di un pool di indirizzi, cio`e il caso tipico di quando al
computer di un ospite deve essere assegnato un indirizzo temporaneo allinterno della propria
rete.

8.2. LASSEGNAZIONE DINAMICA DEGLI INDIRIZZI IP

465

Una assegnazione di questo tipo comporta ovviamente una serie di problemi in pi`
u rispetto
allassegnazione statica, ed in particolare lassegnazione degli indirizzi si scontra con le problematiche relative alla presenza discontinua od occasionale di macchine allinterno della rete, alla
necessit`a di dover gestire la riassegnazione di indirizzi usati in precedenza, di accorgersi quando
un indirizzo non `e pi`
u in uso, e di evitare di assegnare due volte lo stesso indirizzo a macchine
diverse.
Per risolvere questo tipo di problematiche DHCP prevede una comunicazione non occasionale
fra il client, che resta attivo anche dopo la configurazione dellindirizzo, ed il server e tre diverse
modalit`a di assegnazione degli indirizzi, dette rispettivamente statica, automatica e dinamica.
La configurazione statica `e sostanzialmente la stessa di BOOTP, in cui si associa staticamente un indirizzo ad una specifica macchina sulla base del MAC address della stessa. Con la
configurazione automatica invece viene assegnato in maniera permanente un indirizzo IP ad ogni
macchina che ne fa richiesta, ma non `e necessario che lamministratore imposti la corrispondenza
come nel caso precedente. Questo pu`o andare bene nel caso di macchine sempre presenti sulla
rete, ma non `e ovviamente adatto al caso di presenze occasionali.
Per questo la modalit`
a che alla fine viene utilizzata di pi`
u `e quella della configurazione dinamica, in cui ad ogni assegnazione `e associato anche un tempo di permanenza, il cosiddetto lease,
passato il quale, se il client non ha chiesto un prolungamento, lassegnazione viene cancellata. In
questo modo diventa possibile gestire la presenza occasionale di macchine sulla rete, assegnando
un indirizzo libero che torner`
a automaticamente disponibile dopo un certo periodo di inutilizzo,
o che potr`
a essere rilasciato esplicitamente quando segnalato dal client stesso.
Il protocollo DHCP prevede che sia sempre il client a contattare il server; allavvio il client
invia dei pacchetti in broadcast su UDP,22 e alla ricezione di una richiesta il server invia un pacchetto di risposta contenente le varie informazioni di configurazione,23 che prevedono lindirizzo
IP da assumere, quello del default gateway, lindirizzo di eventuali server DNS ed altre informazioni relative alla rete, ma soprattutto, qualora si usi la configurazione dinamica, il periodo di
lease per il quale lassegnazione dellindirizzo sar`a considerata valida.

8.2.2

Uso del servizio DHCP dal lato client

Per poter usufruire dei servizi di un server DHCP esistono vari programmi; i pi`
u comuni e diffusi
sono pump e dhclient, di questultimo esistono poi due versioni, a seconda che si usi la versione
2 o la versione 3 del protocollo.
Il programma pump `e un client sia per DHCP che per BOOTP; il suo uso `e immediato, basta
invocarlo specificando linterfaccia che si vuole configurare in maniera automatica con lopzione
-i, con qualcosa del tipo:
pump -i eth0
anche se esso pu`
o essere fatto partire automaticamente allavvio del sistema, quando si configura
la rete per eseguire la configurazione tramite DHCP. Il comando prende una serie di altre opzioni
che consentono di scartare le informazioni ottenute dal server (come i DNS o il default gateway)
22

ci si pu`
o chiedere come possa essere utilizzato UDP, che presuppone IP, prima che la macchina abbia un
indirizzo IP con il quale contattarla; quello che accade `e che i pacchetti vengono inviati con IP sorgente nullo
(indirizzo 0.0.0.0 e porta 68), ed in broadcast come IP di destinazione (indirizzo 255.255.255.255 e porta 67)
con al loro interno il MAC address del richiedente, che cos` pu`
o essere raggiunto dal server.
23
in realt`
a il meccanismo `e pi`
u complesso, il protocollo prevede che il client invii un pacchetto di tipo dhcp
discovery, che in sostanza chiede se esiste un server DHCP disponibile; a questo i server presenti risponderanno
con dei pacchetti di offerta (di tipo dhcp offer ) con una proposta di indirizzo IP e di lease, ed il client potr`
a
scegliere quello che preferisce (in genere in base alla maggior durata del lease) rispondendo con un pacchetto di
tipo dhcp request; la negoziazione si chiude alla risposta del server con un pacchetto dhcp ack, senza il quale il
procedimento ricomincia da capo.

466

CAPITOLO 8. LA GESTIONE DEI SERVIZI DI BASE

o controllare lo stato del servizio, al solito si pu`o fare riferimento alla pagina di manuale. Il
programma pu`
o anche essere controllato tramite un file di configurazione (/etc/pump.conf il
cui formato `e sempre descritto nella pagina di manuale, accessibile con man pump.
Allinvocazione del comando, una volta ricevuta risposta da un server, il comando provvede
utilizzare le informazioni ricevute per configurare la rete; queste in genere comprendono, oltre
lindirizzo IP da assegnare, anche il dominio locale, gli indirizzi dei server DNS e quello del
default gateway, pertanto il comando non si limiter`a ad assegnare un indirizzo allinterfaccia
specificata, ma creer`
a anche un opportuno resolv.conf ed inserir`a la default route nella tabella
di routing. Qualora il server non dia nessuna risposta invece il comando fallir`a, cos` come la
configurazione automatica della rete.
Il secondo programma che viene utilizzato come client per la configurazione automatica della
rete `e dhclient. Questo `e parte della implementazione di riferimento del protocollo DHCP fatta
dallInternet Software Consortium, ed in genere viene utilizzato nella versione 3, anche se alcune
distribuzioni (Debian ad esempio) utilizzano anche la versione 2 del programma.
Linvocazione manuale del programma `e analoga a quella di pump, ma `e necessario specificare
nessuna opzione per indicare una interfaccia. Se non si passano argomenti il programma esamina
le interfacce presente, scarta quelle che non supportano il broadcast, e poi cerca di configurarle
tutte; altrimenti si pu`
o specificare la lista delle interfacce da configurare con qualcosa del tipo:
dhclient eth1 eth2
il comando supporta tre opzioni, -p consente di specificare luso di una porta diversa da quella
standard, -d che esegue il programma in modalit`a di debug mantenendolo agganciato al terminale,24 e -e che causa luscita del programma se questo non riesce a configurare linterfaccia
entro un certo tempo.
Il comportamento di dhclient `e controllato dal file /etc/dhclient.conf (o, se si `e installato
la versione 3, /etc/dhcp3/dhclient.conf) riguardo ad aspetti come le temporizzazioni, le
informazioni richieste al server, la presenza di valori che devono sovrascrivere o essere aggiunti
a quelli presenti in eventuali risposte o utilizzati come default qualora questo non risponda.
Il formato del file prevede al solito che le righe vuote e tutto quanto segue il carattere#venga
ignorato. Le direttive sono di due tipi, quelle elementari, che specificano delle caratteristiche
singole, hanno la forma di una parola chiave seguita da uno o pi`
u valori e sono terminate dal
carattere ;. Quelle complesse possono specificare pi`
u caratteristiche e prevedono una parola
chiave seguita da un eventuale parametro e da di un blocco di ulteriori direttive semplici (nella
forma precedente) che viene delimitato da parentesi graffe. In generale spaziature e ritorni a
capo che vengono ignorati, ed i nomi delle direttive sono case insensitive.
Come esempio di dhclient.conf, preso dalla versione installata su una Debian Sarge (nella
versione 3 del client) `e il seguente estratto, dove come si pu`o notare la maggior parte delle
direttive sono commentate:
# Configuration file for /sbin/dhclient, which is included in Debians
#
dhcp3-client package.
#
# This is a sample configuration file for dhclient. See dhclient.confs
#
man page for more information about the syntax of this file
#
and a more comprehensive list of the parameters understood by
#
dhclient.
#
# Normally, if the DHCP server provides reasonable information and does
#
not leave anything out (like the domain name, for example), then
#
few changes must be made to this file, if any.
#
24

si ricordi che anche il client DHCP lavora come demone, dovendo gestire la scadenza dei lease.

8.2. LASSEGNAZIONE DINAMICA DEGLI INDIRIZZI IP

467

#send host-name "andare.fugue.com";


#send dhcp-client-identifier 1:0:a0:24:ab:fb:9c;
#send dhcp-lease-time 3600;
#supersede domain-name "fugue.com home.vix.com";
#prepend domain-name-servers 127.0.0.1;
request subnet-mask, broadcast-address, time-offset, routers,
domain-name, domain-name-servers, host-name,
netbios-name-servers, netbios-scope;
#require subnet-mask, domain-name-servers;
#timeout 60;
#retry 60;
#reboot 10;
#select-timeout 5;
#initial-interval 2;
#script "/etc/dhcp3/dhclient-script";
#media "-link0 -link1 -link2", "link0 link1";
#reject 192.33.137.209;
...

In genere non `e necessario modificare questo file, che pu`o anche essere lasciato vuoto. Nellesempio precedente la sola direttiva utilizzata `e request che serve ad indicare quale informazioni
si richiedono al server DHCP. Unaltra direttiva che pu`o essere utilizzata `e send che consente
di inviare informazioni al server, come ad esempio lhostname (vedi sez. 7.4.3) che pu`o essere
utilizzato da questultimo per aggiornare la lista delle macchine presenti sulla rete. Un elenco
delle principali direttive `e riportato in tab. 8.5, lelenco completo `e al solito disponibile sulla
pagina di manuale.
Direttiva
request
timeout
send
script

reject
interface

Significato
elenca la lista delle opzioni DHCP (vedi tab. 8.8) che il
client richiede al server.
indica il tempo massimo oltre il quale il client stabilisce
che non ci sono server raggiungibili.
indica una opzione DHCP (vedi tab. 8.8) ed il relativo
valore che il client invia al server.
specifica lo script di usato dal client per configurare linterfaccia, di default viene usato /etc/dhcp3/dhclientscript.
specifica lindirizzo IP di un server da cui non devono
essere accettate risposte.
permette di impostare direttive di configurazione specifiche per una interfaccia; richiede come argomento il nome
della interfaccia in questione ed a seguire il blocco delle
direttive da applicare.

Tabella 8.5: Principali direttive del file dhclient.conf.

Si tenga presente che le operazioni di dhclient non sono limitate alla configurazione iniziale
della rete; il protocollo infatti prevede che il client debba ricontattare periodicamente il server
per prolungare un lease che sta scadendo (mantenendo lassociazione con il relativo numero IP)
o per riacquisire le informazioni, o per notificare la cessazione delluso di un indirizzo IP in caso
di uscita.
Per la gestione della assegnazione dinamica degli indirizzi dhclient mantiene una lista dei
lease ottenuti nel file dhclient.leases (in genere questo file si trova sotto /var/lib/dhcp/),
in modo da tenerne traccia anche se si sono effettuati riavvii del sistema o se il server ha avuto
un crash.25 Anche questo file viene letto allavvio ed i suoi dati vengono utilizzati qualora un
25

il formato del file `e descritto nella relativa pagina di manuale, accessibile con man dhclient.lease.

468

CAPITOLO 8. LA GESTIONE DEI SERVIZI DI BASE

server DHCP sia irraggiungibile.


Se questo poi tornasse disponibile i vecchi lease che non sono scaduti vengono ricontrollati
presso il server e se sono trovati validi vengono riutilizzati. Il client si cura inoltre di aggiornare
dhclient.leases tutte le volte che ottiene una nuova associazione con un nuovo lease, e per evitare che il file cresca indefinitamente crea periodicamente una nuova versione del file contenente
solo i lease attivi al momento, salvando la vecchia come dhclient.leases~.

8.2.3

La configurazione di un server DHCP

Sul lato server il protocollo DHCP viene realizzato tramite un apposito demone, dhcpd, che si
incarica di ricevere le richieste e fornire le risposte. Il server viene lanciato dal relativo script di
avvio (su Debian `e /etc/init.d/dhcp3-server o /etc/init.d/dhcpd a seconda della versione),
ma pu`o anche essere avviato a mano. In quel caso si pu`o usare lopzione -d per eseguire il server
interattivamente in modalit`
a di debug. Unaltra opzione `e -p che permette di usare una porta
diversa da quella di default (la 67 su UDP); per le altre opzioni si pu`o fare riferimento alla pagina
di manuale).
Come per il client il server mantiene una lista delle assegnazioni effettuate e dei relativi lease
in un apposito file, dhcpd.leases (sempre sotto /var/lib/dhcp/), cos` da poter tenere traccia
dello stato del sistema anche in caso di riavvio.26 Il server scrive in questo file ogni nuovo lease
assegnato e ne cura la rotazione periodica come fa dhclient per dhclient.leases.
Il funzionamento del server `e controllato da un file di configurazione che `e /etc/dhcpd.conf
(anche se per la versione 3 su Debian viene usato /etc/dhcp3/dhcpd.conf); un esempio del
contenuto di questo file `e il seguente:
#
# Sample configuration file for ISC dhcpd for Debian
#
# option definitions common to all supported networks...
option domain-name "earthsea.ea";
option domain-name-servers gont.earthsea.ea;
option subnet-mask 255.255.255.0;
default-lease-time 600;
max-lease-time 7200;
subnet 192.168.1.0 netmask 255.255.255.0 {
range 192.168.1.32 192.168.1.63;
option broadcast-address 192.168.1.255;
option routers gont.earthsea.ea;
}
host oppish {
hardware ethernet 08:00:07:26:c0:a5;
fixed-address oppish.earthsea.ea;
}

Il formato del file `e identico a quello di dhclient.conf e come per questo il contenuto `e
divisibile sommariamente in due categorie di direttive, quelle che prevedono la specificazione di
semplici parametri e quelle pi`
u complesse, dette dichiarazioni, che contengono blocchi di altre
direttive. In generale il file prevede una serie di direttive iniziali, che servono ad impostare i valori
che vengono utilizzati come default. Questi stessi valori possono essere impostati allinterno di
dichiarazioni pi`
u specifiche a valori diversi.
26

per chi fosse interessato il formato di questo file `e descritto nella pagina di manuale accessibile con man
dhcpd.leases.

8.2. LASSEGNAZIONE DINAMICA DEGLI INDIRIZZI IP

469

Un esempio di direttive semplici sono le righe iniziali del precedente esempio che nel caso sono
utilizzate per impostare alcune opzioni DHCP a livello generale, come il dominio di riferimento
o il server DNS, o la maschera di rete. In questo caso si usa la direttiva option, seguito dal
nome dellopzione DHCP che si intende impostare (le principali sono riportate in tab. 8.8)
ed dal relativo valore. Altre due direttive semplici sono default-lease-time, che imposta il
valore di default (nel caso 600 secondi) del lease delle risposte, e max-lease-time che imposta
valore massimo che pu`
o essere assegnato ad un lease. Un elenco delle principali direttive per la
dichiarazione di parametri `e illustrato in tab. 8.6.
Direttiva
option

default-lease-time
max-lease-time

range
fixed-address

hardware address
include
filename

next-server

Significato
imposta il valore di una opzione DHCP prende come argomento il nome dellopzione (vedi tab. 8.8), seguito dagli
eventuali valori.
imposta il valore di default del tempo di lease inviato a
un client se questo non ha fatto una richiesta specifica.
imposta il valore massimo del tempo di lease che pu`
o
essere inviato ad un client, indipendentemente da quanto
esso possa avere richiesto.
imposta un intervallo di indirizzi da assegnare dinamicamente.
imposta un indirizzo (o pi`
u) da assegnare staticamente,
viene in genere utilizzato allinterno di una dichiarazione
host insieme a hardware address.
indica lindirizzo hardware (in genere un MAC address)
cui assegnare un indirizzo statico.
legge il contenuto di un altro file come se questo fosse
stato incluso nella configurazione.
specifica il nome del file da caricare come sistema
operativo (deve essere riconosciuto come nome valido
dal protocollo, in genere TFTP, usato dal client per
caricarlo).
specifica il server da cui scaricare il file per il boot del
sistema (indicato dalla precedente filename).

Tabella 8.6: Principali direttive del file dhcpd.conf.

In generale DHCP consente di suddividere gli IP restituiti alle stazioni in sotto-reti, nel
nostro esempio ne viene usata una soltanto. Questo `e fatto tramite la direttiva subnet, che
serve a dichiarare una sottorete; essa `e seguita dallindirizzo della rete e dalla specificazione
della relativa netmask (preceduta dalla parola chiave netmask). Allinterno della dichiarazione
si potr`a poi indicare luso di una assegnazione dinamica specificando lintervallo di indirizzi con
la direttiva range, oltre ai tempi di lease e alle altre opzioni DHCP da usare per quella sottorete.
Unaltra dichiarazione utile `e quella che consente di configurare una stazione singola (analoga
dellassegnazione statica di BOOTP), anchessa mostrata nellesempio in sez. 8.2.3. Questo viene
fatto tramite la direttiva host seguita dal nome della macchina, questultima sar`a identificata
dal MAC address specificato dalla direttiva hardware ethernet, mentre lindirizzo fisso da
assegnare verr`
a specificato dalla direttiva fixed-address.
Si noti come in entrambi questi esempi di dichiarazioni si sono dovute poi specificare i valori
dei parametri da applicare con una serie di altre direttive semplici poste allinterno di un blocco
delimitato da parentesi graffe. Un elenco delle principali direttive di dichiarazione `e illustrato
in tab. 8.7. Per una lista completa dei parametri si pu`o fare riferimento alla pagina di manuale
del file di configurazione accessibile con man dhcpd.conf.
Una parte essenziale della configurazione del server `e quella relativa alle opzioni DHCP,
` attraverso queste
che costituiscono il contenuto delle risposte che il server fornisce ai client. E
opzioni che si inviano ai client le varie informazioni sulla rete che ne permettono la configurazione
automatica. Come gi`
a visto esse possono essere inserite sia direttamente nel corpo principale di

470

CAPITOLO 8. LA GESTIONE DEI SERVIZI DI BASE


Direttiva
subnet

host

group

Significato
dichiara una sottorete, ad essa deve seguire lindirizzo IP
della sottorete e la relativa maschera introdotta dalla parola chiave netmask; il corpo della dichiarazione conterr`
a
i parametri da applicare alla suddetta sottorete.
dichiara una macchina singola, ad essa deve seguire il
nome della stessa; il corpo della dichiarazione conterr`
ai
parametri da applicare alla suddetta macchina.
dichiara un gruppo di macchine, ad essa deve seguire
il nome del gruppo; il corpo della dichiarazione conterr`
a i parametri da applicare alle macchine del gruppo
identificate attraverso ulteriori dichiarazioni di tipo host.

Tabella 8.7: Principali direttive di dichiarazione del file dhcpd.conf.

dhcpd.conf, dove assumeranno il ruolo di valore di default, che allinterno di singole dichiarazioni
per sotto-reti o macchine singole.
Opzione
domain-name
domain-name-servers

subnet-mask
broadcast-address
routers
host-name
netbios-name-servers

Significato
specifica il nome di dominio in cui ci si trova (ad uso
dellimpostazione automatica di resolv.conf).
specifica una lista di server DNS (anche questo
per limpostazione automatica dei relativi campi in
resolv.conf).
specifica la netmask per la rete associata allindirizzo
assegnato.
specifica lindirizzo di broadcast per la rete associata
allindirizzo assegnato.
specifica il default gateway per la rete associata
allindirizzo assegnato.
specifica il nome della macchina.
specifica lindirizzo di un server WINS (usato dalle
macchine Windows).

Tabella 8.8: Principali opzioni del protocollo DHCP.

Le opzioni vengono sempre impostate da una direttiva nella forma option nome-opzione
valore-opzione; ed una lista dei nomi delle principali opzioni utilizzate `e riportata in tab. 8.8;
al solito lelenco completo `e disponibile sulla relativa pagina di manuale, accessibile con man
dhcp-options.

8.3

Amministrazione remota con SSH

Un tempo parlare di amministrazione remota di un computer significava parlare del comando


telnet; come accennato in sez. 7.7.1 per`
o questo comando esegue tutte le sue comunicazioni in
chiaro, password comprese, che cos` sono estremamente facili da intercettare. Per questo oggi
parlare di amministrazione remota significa parlare di SSH, sigla che sta per Secure SHell,27
ed identifica un protocollo di comunicazione che permette di creare un canale cifrato con una
macchina remota. Benche sia possibile utilizzare il canale in maniera generica, luso principale
di SSH `e quello di fornire una shell consentendo cos` lamministrazione remota; da questo origina
il nome del servizio.
27

il nome origina in realt`


a da un altro programma, rsh, parte dei cosiddetti r-command di Sun, che consentiva
di eseguire una shell remota; gli r-command, in cui la r sta per remote, erano un insieme di duplicati dei comandi
unix (rsh, rcp, rlogin) che eseguivano lo stesso compito degli analoghi senza la r su una macchina remota; il
problema `e che questo veniva fatto senza nessuna cifratura della comunicazione e consentendo lesecuzione sulla
base dellindirizzo IP da cui i comandi venivano lanciati, in maniera cio`e totalmente insicura.

8.3. AMMINISTRAZIONE REMOTA CON SSH

8.3.1

471

La configurazione del server SSH

Come buona parte dei protocolli di rete, SSH `e realizzato con una architettura client-server.
Quando si vuole poter effettuare lamministrazione da remoto di una macchina occorre installare
` questo demone
su di essa la parte server del protocollo che viene fornita dal demone sshd. E
che si incarica di rispondere alle richieste dei client, di realizzare tutte le fasi necessarie alla
creazione di una canale cifrato su cui sia possibile inviare in maniera sicure le informazioni, per
poi eseguire sulla macchina i vari comandi richiesti, restituendone i risultati.
Nel nostro caso faremo riferimento alla implementazione del protocollo realizzata dal progetto OpenSSH, il programma originale infatti, dopo essere stato rilasciato per un certo tempo con
licenza libera, `e diventato proprietario, ma un gruppo di programmatori indipendente28 `e riuscito, partendo dalla ultima versione libera disponibile, a ricreare una implementazione completa
del protocollo, che nel frattempo `e stato anche standardizzato.
Il demone pu`
o essere lanciato direttamente dalla linea di comando ed andr`a automaticamente
in background sganciandosi dal terminale. Il servizio ascolta di default sulla porta 22, ma pu`
o
essere impostato su una porta diversa usando lopzione -p. Con lopzione -D lo si pu`o eseguire
in modalit`
a di debug, mantenendolo agganciato al terminale, luso dellopzione -d, ripetuta fino
ad un massimo di tre volte, fa s` che esso generi messaggi di controllo sempre pi`
u dettagliati.
Nelle normali operazioni per`
o, come gli altri demoni, anche sshd viene di norma lanciato
automaticamente dagli script di avvio.29 Il comportamento del demone (ad esempio anche la
porta da utilizzare) `e comunque controllato dal rispettivo file di configurazione; tutti i file di
configurazione attinenti a SSH vengono normalmente mantenuti nella directory /etc/ssh/; di
default la configurazione del server `e posta nel file sshd_config, ma se ne pu`o specificare un
altro con lopzione -f. Per un elenco completo delle opzioni di sshd si pu`o fare riferimento alla
pagina di manuale.
Come consuetudine il file di configurazione `e in formato testo con una direttiva per linea,
questa viene identificata da una parola chiave e seguita da uno o pi`
u argomenti separati da
spazi o tabulazioni; righe vuote e tutto ci`o che segue il carattere # al solito viene ignorato. Le
principali direttive ed il relativo significato sono riportate in tab. 8.9; si sono descritte solo quelle
che `e pi`
u probabile che un amministratore si trovi a dover modificare. I valori delle altre sono
di norma preimpostati a quanto specificato dal file di configurazione installato con il pacchetto.
Al solito per una descrizione completa delle varie direttive si pu`o fare riferimento alla pagina
di manuale, accessibile con man sshd_config. Un estratto del file di configurazione di sshd
installato su una Debian Sarge `e riportato di seguito:
# What ports, IPs and protocols we listen for
Port 22
Protocol 2
# HostKeys for protocol version 2
HostKey /etc/ssh/ssh_host_rsa_key
HostKey /etc/ssh/ssh_host_dsa_key
# Lifetime and size of ephemeral version 1 server key
KeyRegenerationInterval 3600
ServerKeyBits 768
# Logging
SyslogFacility AUTH
LogLevel INFO
28

il progetto OpenSSH `e portato avanti dagli stessi sviluppatori del sistema operativo OpenBSD, una versione
di BSD il cui sviluppo `e centrato sulla massima attenzione alle problematiche di sicurezza.
29
su Debian lo script `e /etc/init.d/ssh, altre distribuzioni usano sshd; si tenga presente che alcune distribuzioni recenti installano di default soltanto il client, il server viene fornito a parte (ad esempio su Debian a partire
da etch deve essere installato il pacchetto openssh-server).
30
che `e il motivo per cui non descriveremo il formato di questa direttiva; chi vuole esporsi al rischio si legga
attentamente le pagine di manuale.

472

CAPITOLO 8. LA GESTIONE DEI SERVIZI DI BASE


Direttiva
Protocol

PermitRootLogin
X11Forwarding
X11DisplayOffset
Subsystem
AllowGroups

AllowUsers
Banner

DenyGroups

DenyUsers
Port
ListenAddress

HostKey

Significato
indica la versione del protocollo, deve essere impostato a
2, in quanto le precedenti versioni sono insicure; `e possibile abilitare versioni inferiori solo a fine di compatibilit`
a,
ma si consiglia energicamente di aggiornare i client.30
permette il login diretto allamministratore; per default
`e disabilitato.
abilita linoltro delle sessioni X11 (vedi sez. 8.3.4).
assegna un valore di partenza per il numero di display
usato dalle sessioni X Window inoltrate sul canale cifrato.
permette di abilitare laccesso alla macchina con una
sintassi simile a FTP, tramite il programma sftp.
abilita laccesso solo agli utenti che fanno parte della lista di gruppi (specificata dai rispettivi nomi separati da
spazi) passata come parametro; accetta anche i caratteri
? e * come wildcard per i nomi dei gruppi.
abilita laccesso solo agli utenti che fanno parte della lista
passata come parametro; accetta ? e * come wildcard.
invia al client il contenuto del file passato come parametro
in modo che questo lo possa stampare come avviso prima
di passare alla procedura di autenticazione.
disabilita laccesso agli utenti che fanno parte della lista di gruppi passata come parametro, accetta i soliti
caratteri jolly.
disabilita laccesso agli utenti che fanno parte della lista
passata come parametro, accetta i soliti caratteri jolly.
specifica la porta su cui mettersi in ascolto (di default `e
la 22).
permette di indicare un indirizzo specifico su cui mettersi
in ascolto (nella forma indirizzo:porta); il default `e
ascoltare su tutti gli indirizzi locali.
indica quali sono i file contenenti le chiavi crittografiche
usate dal server.

Tabella 8.9: Principali direttive di configurazione per il demone sshd usate nel file sshd_config.

# Authentication:
LoginGraceTime 600
PermitRootLogin yes
StrictModes yes
RSAAuthentication yes
PubkeyAuthentication yes
# rhosts authentication should not be used
RhostsAuthentication no
# Dont read the users ~/.rhosts and ~/.shosts files
IgnoreRhosts yes
# For this to work you will also need host keys in /etc/ssh_known_hosts
RhostsRSAAuthentication no
# similar for protocol version 2
HostbasedAuthentication no
# To enable empty passwords, change to yes (NOT RECOMMENDED)
PermitEmptyPasswords no
# To disable tunneled clear text passwords, change to no here!
PasswordAuthentication yes
# Use PAM authentication via keyboard-interactive so PAM modules can
# properly interface with the user
PAMAuthenticationViaKbdInt yes
X11Forwarding yes
X11DisplayOffset 10
PrintMotd no
KeepAlive yes

8.3. AMMINISTRAZIONE REMOTA CON SSH

Subsystem

sftp

473

/usr/lib/sftp-server

Data la delicatezza delle operazioni svolte dal demone, tramite il quale diventa possibile
eseguire un qualunque comando su una macchina remota, `e stata posta la massima attenzione
ai requisiti di sicurezza. Ad esempio di default laccesso remoto allutente di amministrazione
`e disabilitato, e pu`
o essere abilitato solo con la direttiva PermitRootLogin impostata al valore
yes; senza di essa occorre prima collegarsi come un utente normale e poi usare su.
Si tenga presente che sshd onora sia la presenza del file /etc/nologin non consentendo,
quando esso esiste, la connessione ad utenti che non siano lamministratore, che lutilizzo dei TCP
wrappers, obbedendo alle restrizioni poste nei file hosts.allow e hosts.deny (vedi sez. 8.1.5).
Inoltre con le direttive AllowGroups, AllowUsers, DenyGroups, DenyUsers si pu`o restringere
laccesso ad utenti e gruppi specificati.
Inoltre per poter eseguire un comando, `e necessario prima autenticarsi presso il server, questo
normalmente viene fatto utilizzando gli utenti presenti sulla macchina (per i quali verr`a richiesta
la password) per conto dei quali verranno eseguiti i comandi. Esistono comunque altre modalit`
a
di accesso (ne vedremo una in sez. 8.3.3) che permettono di appoggiarsi ad altri meccanismi di
autenticazione.
Un server SSH consente anche (vedi sez. 8.3.4) di eseguire linoltro di una sessione grafica,31
facendo passare tutti i dati della stessa attraverso il canale cifrato, rendendo cos` possibile
eseguire compiti di amministrazione remota anche attraverso programmi ad interfaccia grafica.
Infine una serie di direttive (per le quali si rimanda alla pagina di manuale) consentono di
controllare tutti i dettagli della cifratura del canale ed i file in cui vengono mantenute le chiavi
crittografiche necessarie a realizzare una comunicazione sicura; SSH infatti usa la crittografia a
chiave asimmetrica (per una introduzione a questi argomenti si veda la sezione 1.2 di [SGL]) per
creare i canali di comunicazione cifrata ed identificare il server presso il client.
Per questo motivo nella directory /etc/ssh/ oltre ai file di configurazione si troveranno
anche una serie di file (normalmente ssh_host_*_key e ssh_host_*_key.pub dove lasterisco
sta ad indicare il tipo di chiave, che pu`o essere dsa o rsa) contenenti le chiavi usate dal server
per identificarsi presso i client e per per generare le chiavi di sessione con cui sono cifrati i
canali.32 Questi file vengono generati automaticamente allinstallazione del pacchetto (anche se
`e possibile generarli a mano, vedi sez. 8.3.3) ed in particolare quelli contenenti le chiavi private
devono essere conservati con la massima cura in quanto costituiscono le credenziali che lidentit`
a
del server.

8.3.2

Lutilizzo di SSH come client

Prima di entrare nei dettagli dei vari comandi che utilizzano SSH dal lato client occorre precisare
che anche questi sono controllati da un file di configurazione generale, /etc/ssh/ssh_config,
un estratto del quale `e riportato di seguito:
# Host *
#
ForwardAgent no
#
ForwardX11 no
#
RhostsAuthentication no
#
RhostsRSAAuthentication no
#
RSAAuthentication yes
#
PasswordAuthentication yes
#
HostbasedAuthentication no
#
BatchMode no
31

cio`e di lanciare sul server programmi che usano linterfaccia grafica di X11 ed ottenerne le finestre sul client.
il protocollo prevede che ogni connessione sia cifrata in maniera indipendente con una chiave di sessione
(rinnovata periodicamente secondo quanto specificato dalla direttiva KeyRegenerationInterval) che viene creata
alla connessione tramite queste chiavi.
32

474

CAPITOLO 8. LA GESTIONE DEI SERVIZI DI BASE


#
#
#
#
#
#
#
#
#
#

CheckHostIP yes
StrictHostKeyChecking ask
IdentityFile ~/.ssh/identity
IdentityFile ~/.ssh/id_rsa
IdentityFile ~/.ssh/id_dsa
Port 22
Protocol 2,1
Cipher 3des
Ciphers aes128-cbc,3des-cbc,blowfish-cbc,cast128-cbc,arcfour,aes192-cbc,aes256-cbc
EscapeChar ~

Di norma, come nellesempio precedente dove tutte le direttive sono commentate, non `e
necessario impostare niente di diverso dai default. La struttura del file `e analoga a quella di
sshd_config, con una direttiva per linea. In questo caso per`o la direttiva Host ha un ruolo
speciale, essa infatti permette di indicare un insieme di macchine (identificate per indirizzo IP
o nome a dominio) cui si applicano tutte direttive seguenti fino ad una eventuale successiva
direttiva Host.
In sostanza una direttiva Host definisce una sezione del file contente le configurazioni da
usare con tutte le macchine da essa definite. Lamministratore pu`o cos` imporre delle restrizioni nellaccesso a certe macchine, in particolare questa capacit`a viene usata per disabilitare la
possibilit`a del forwarding delle sessioni X (vedi sez. 8.3.4).
Direttiva
Host

Port
Protocol
ForwardX11
CheckHostIP

StrictHostKeyChecking

Compression
CompressionLevel

Significato
restringe lapplicazione delle direttive seguenti ai collegamenti effettuati verso le macchine specificate; prende
come argomento sia nomi a dominio che indirizzi IP, e
supporta luso dei caratteri jolly * e ?; luso del solo
* permette di definire i valori di default da applicare a
qualunque macchina remota..
specifica la porta di destinazione da usare come default;
`e preimpostato a 22.
indica quali versioni del protocollo utilizzare, deve essere
sempre impostato a 2.
consente linoltro della sessione X (vedi sez. 8.3.4); prende
come argomento i valori yes o no.
controlla se la macchina verso cui ci si collega `e conosciuta
(se cio`e `e presente nel file known_hosts) verificando se
le chiavi pubbliche sono cambiate in modo da prevenire
attacchi di tipo Man in the middle; di default `e impostata
a yes.
definisce il livello di accuratezza con cui vengono controllate le macchine note di known_hosts, se impostata
a yes non viene fatto nessun aggiornamento automatico
e le connessioni verso macchine le cui chiavi pubbliche
sono cambiate sono bloccate; con il valore di default di
ask gli aggiornamenti di known_hosts con nuove macchine verranno effettuati previa esplicita conferma, da dare
alla prima connessione.
specifica se comprimere il traffico, il valore pu`
o essere yes
o no, e questultimo `e il default.
se si `e abilitata la compressione permette di specificarne
il livello,33 prende un valore numerico, ed il default `e 6.

Tabella 8.10: Principali direttive di configurazione del file ssh_config per i client SSH.

33
la compressione `e effettuata tramite il programma gzip, ed il livello di compressione impostato da questa
direttiva `e quello usato da detto programma, che prevede la possibilit`
a di scegliere una maggiore compressione a
scapito di maggiore tempo per eseguirla, o viceversa; i valori vanno da 1 (veloce) a 9 (lenta); la scelta del valore
ottimale dipende in maniera essenziale dalle caratteristiche della macchina e della rete, su una macchina lenta con

8.3. AMMINISTRAZIONE REMOTA CON SSH

475

Le principali direttive ed il relativo significato sono illustrate in tab. 8.10; al solito lelenco
completo, la spiegazione dettagliata delle stesse e i loro possibili valori sono riportati nella pagina
di manuale accessibile con man ssh_config. Gli utenti possono poi creare una versione personale
di questo file nella directory .ssh della propria home directory (dove vengono mantenuti i file
di configurazione personali), sotto ~/.ssh/config per avere delle configurazioni personalizzate
rispetto ai default di sistema.
Si tenga presente che nelluso dei comandi client le configurazioni applicate vengono determinate esaminando prima le opzioni date sulla riga di comando, poi (se presente) il file di
configurazione personale in ~/.ssh/config ed infine il file di configurazione generale. Il primo
valore ottenuto `e quello che viene usato, questo vuol dire che le opzioni a riga di comando hanno
la precedenza sulle impostazioni personali, che a loro volta hanno la precedenza su quelle di
/etc/ssh/ssh_config.
Inoltre se ci sono pi`
u corrispondenze per diverse sezioni Host verr`a ovviamente utilizzata la
prima, questo significa che `e opportuno mettere le configurazioni pi`
u specifiche in testa al file, e
che qualunque altra sezione venga messa dopo una sezione Host * non avr`a nessun effetto.
I due comandi principali di utilizzo di SSH dal lato client sono ssh e scp utilizzati rispettivamente per lamministrazione remota e per la copia dei file. Il comando principale per luso di
SSH sul lato client `e comunque ssh; buona parte di quello che diremo nella trattazione seguente
(in particolare quanto riguarda la creazione del canale cifrato e lautenticazione) resta valido
anche per tutti gli altri comandi.
Se lanciato senza argomenti, ssh stampa un messaggio di aiuto, il comando infatti richiede che
si specifichi almeno un argomento, quello che indica la macchina a cui collegarsi. Se presente, un
secondo argomento opzionale indicher`a invece il programma da eseguire sulla macchina remota
nella sessione di collegamento, in questo caso la connessione sar`a automaticamente chiusa una
volta conclusa lesecuzione del comando indicato; utilizzando un solo argomento sar`a invece
eseguita una shell.
Se non si specifica niente il collegamento con la macchina remota viene sempre eseguito per
conto dellutente che lancia ssh; se si desidera utilizzare un utente diverso se ne pu`o specificare
lusername con lopzione -l od usare una indicazione del tipo utente@macchina per specificare
il server a cui ci si vuole connettere; alla fine la forma pi`
u semplice di invocazione del comando
`e:
ssh [-l nome_login] nome_macchina | nome_login@nome_macchina [comando]
Una volta messo in esecuzione per prima cosa ssh si collega al server per creare il canale
cifrato. Il protocollo prevede che il server invii la sua chiave pubblica che verr`a confrontata con
quella presente nellelenco dei server noti. Questo che viene mantenuto in known_host, uno dei
file di configurazione presenti nella directory .ssh;34 se il server a cui ci si rivolge `e gi`a presente
in known_host viene verificato che la chiave pubblica sia uguale a quella ivi registrata,35 e se
questo avviene si passa alla fase di autenticazione; altrimenti la connessione viene rifiutata con
un avviso in cui viene riportata la riga di known_host che contiene il valore diverso.
Se invece la macchina a cui ci si collega non `e presente nellelenco di known_host verr`
a
stampata la fingerprint della sua chiave pubblica, cos` che la si possa verificare in maniera
indipendente, e verr`
a chiesto se aggiungerla allelenco. Solo una volta che si sia data conferma
dellaggiunta il procedimento passer`a alla fase di autenticazione. Questa procedura `e essenziale
connessione veloce una compressione alta pu`
o ridurre le prestazioni per il tempo perso ad eseguirla.
34
questa directory contiene i dati e le configurazioni di SSH per ciascun utente, viene mantenuta nella home
directory dello stesso ed in genere `e presente sia nella macchina locale (`e quella a cui si fa riferimento in questo
caso) che sulla macchina remota.
35
questo `e il comportamento che si ottiene dalla configurazione di default dalle direttive CheckHostIP e
StrictHostKeyChecking.

476

CAPITOLO 8. LA GESTIONE DEI SERVIZI DI BASE

per accorgersi di eventuali attacchi di interposizione in cui un malintenzionato si spaccia per il


server a cui ci si vuole collegare, in modo da ottenere le nostre credenziali di autenticazione.
Una volta riconosciuta opportunamente la macchina remota, viene eseguita la fase di autenticazione,36 questa prevede diversi meccanismi (ne vedremo una particolarmente utile in sez. 8.3.3)
ma normalmente consiste semplicemente nella richiesta della password dellutente con cui ci si
`e collegati, che verr`
a confrontata con quella presente sul server.37
Una volta completata lautenticazione il server provveder`a a collegare il canale cifrato ad
un terminale virtuale sul quale saranno eseguiti i comandi (con i privilegi dellutente con cui
ci se `e connessi), connettendolo al terminale su cui `e eseguito ssh, cos` che da esso si possano
inviare dati ed ottenere risposte.38 Nella modalit`a standard in cui si usa ssh per invocare una
shell remota il server eseguir`
a anche delle inizializzazioni specifiche,39 ed in particolare prima di
lanciare la shell verranno eseguite le istruzioni presenti nel file /etc/ssh/sshrc e nelleventuale
.ssh/rc dellutente,40 con le quali `e possibile effettuare delle impostazioni specifiche (ad esempio
attivare dei limiti) per le sessioni SSH.
Una delle opzioni principali di ssh `e -X, che, se il server lo consente, attiva linoltro della
sessione X11 (vedi sez. 8.3.4); questo pu`
o essere disabilitato (qualora abilitato per default in
ssh_config) con lopzione -x. Nel caso il server sia stato posto in ascolto su una porta diversa
da quella standard si ne pu`
o specificare esplicitamente una con lopzione -p. Le altre opzioni pi`
u
comuni sono illustrate in tab. 8.11, per un elenco completo e tutti i dettagli rimanda al solito
alla pagina di manuale del comando che `e accessibile con man ssh.
Opzione
-X
-x
-p
-l
-L
-R
-i
-v

-t

Significato
attiva linoltro della sessione X11 (vedi sez. 8.3.4).
disattiva linoltro della sessione X11 (vedi sez. 8.3.4).
specifica la porta a cui collegarsi sul server.
specifica lutente con cui collegarsi al server.
abilita il port forwarding locale (vedi sez. 8.3.4).
abilita il port forwarding remoto (vedi sez. 8.3.4).
specifica la chiave da usare per lautenticazione (vedi
sez. 8.3.3).
attiva la modalit`
a di controllo in cui vengono stampati
avvisi progressivi nella fase di connessione, pu`
o essere
invocata fino a tre volte per aumentare la prolissit`
a.
forza lallocazione di un terminale virtuale, cos` da consentire anche lesecuzione di comandi che ne richiedono
la presenza.

Tabella 8.11: Principali opzioni del comando ssh.

Un complemento molto utile a ssh `e il comando scp che permette di copiare file attraverso la
rete, usando sempre il canale cifrato. La sintassi `e analoga a quella del comando cp, solo che un
file o una directory possono essere indicati, che siano la sorgente o la destinazione delloperazione
di copia,41 con un indicativo nella forma generica:
36
anche se prima il server pu`
o inviare al client il contenuto del file specificato dalla direttiva Banner vista in
tab. 8.9.
37
lautenticazione di default usa cio`e PAM (vedi sez. 4.3.7) e sar`
a compito di sshd quello di autenticare lutente
sul server (secondo la modalit`
a configurata su di esso tramite PAM) usando lusername avuto dal client.
38
questo avviene soltanto quando non si specifica lesecuzione di un comando, e deve essere allocato un terminale
ad uso della shell; se si richiede un comando questo viene semplicemente eseguito con lo standard input e lo
standard output collegati al canale cifrato, per forzare lallocazione di un terminale occorre usare lopzione -t.
39
per la descrizione completa delle operazioni compiute dal server prima di arrivare al prompt della riga di
comando remota si legga la pagina di manuale di sshd.
40
attenzione, di quello della macchina remota, non quello da cui si usa ssh.
41
si tenga presente per`
o che scp pu`
o avere una destinazione remota, o una sorgente remota, non supporta la
copia da una macchina remota ad unaltra.

8.3. AMMINISTRAZIONE REMOTA CON SSH

477

utente@macchina:/path/name
dove macchina indica lindirizzo, numerico o simbolico, della macchina su cui si trova il file,
utente `e lusername con il quale ci si vuole collegare alla macchina remota (lo si pu`o omettere
se corrisponde a quello con cui si sta lavorando), e /path/name il pathname del file sulla macchina
remota; se questultimo viene specificato in forma relativa `e considerato a partire dalla home
dellutente che si sta usando. Un esempio di uso del comando potrebbe essere il seguente:
scp [email protected]:gapil.pdf .
che copia il file gapil.pdf dalla home su un server alla directory corrente, mentre per effettuare
un trasferimento in direzione opposta di una intera directory si potr`a usare il comando:
scp -r gapil [email protected]:public_html/
che copia ricorsivamente il contenuto della directory gapil nella directory public_html della
home del server.
Il comando richiede la stessa procedura di autenticazione usata da ssh, che normalmente
comporta limmissione da terminale delle password relative agli utenti delle macchine a cui ci
si collega. Lopzione -p permette di preservare i tempi ed i permessi del file originale, mentre
lopzione -r esegue una copia ricorsiva di intere directory. Le altre principali opzioni sono in
tab. 8.12, al solito per i dettagli su tutte le altre opzioni si pu`o fare riferimento alla pagina di
manuale accessibile con man scp.
Opzione
-P
-p
-C
-r
-l
-i
-v

Significato
specifica la porta a cui collegarsi sul server.
preserva tempi e permessi dei file che si copiano.
abilita la compressione della connessione.
esegue una copia ricorsiva delle directory.
imposta una limitazione nelluso della banda, da
esprimersi in Kbit/s.
specifica la chiave da usare per lautenticazione (vedi
sez. 8.3.3).
attiva la modalit`
a di controllo in cui vengono stampati
avvisi progressivi nella fase di connessione, pu`
o essere
invocata fino a tre volte per aumentare la prolissit`
a.

Tabella 8.12: Principali opzioni del comando scp.

Infine per effettuare trasferimenti di file `e disponibile come alternativa a scp anche una interfaccia che riproduce quella FTP, utilizzabile attraverso il comando sftp. Nelluso pi`
u comune
questo comando prende come argomento lindirizzo di una macchina remota a cui collegarsi e
crea una sessione di lavoro da cui si possono dare comandi come quelli di tab. 7.29,42 con sintassi
del tutto analoga a quella di un client FTP; resta comunque possibile trasferire i file in maniera
immediata usando la sintassi di scp. Inoltre si pu`o specificare con lopzione -b un batch file da
cui prendere i comandi per una esecuzione non interattiva.
Un primo vantaggio di sftp `e che tutto quello che occorre sul lato server `e una installazione di
sshd che abbia abilitato il supporto relativo (questo viene fatto di default in tutte le installazioni
standard), e non `e necessario installare un demone a parte. Inoltre tutti i vantaggi di SSH restano
a disposizione, dalla cifratura dei dati alla possibilit`a di avere metodi di autenticazione avanzata
come quello che vedremo in sez. 8.3.3.
Se a questo si aggiunge il fatto che questa interfaccia `e stata standardizzata con il nome
di SFTP, ed `e disponibile come estensione per molti client FTP e programmi che girano anche
42

in tal caso sono disponibili anche operazioni pi`


u complesse del trasferimento di file.

478

CAPITOLO 8. LA GESTIONE DEI SERVIZI DI BASE

sotto Windows,43 si pu`


o tranquillamente affermare che al giorno doggi non esistono pi`
u ragioni
valide per installare un server FTP.

8.3.3

Autenticazione a chiavi

Una delle caratteristiche del protocollo SSH `e quella di avere, rispetto alla classica autenticazione
con username e password, la possibilit`
a di utilizzare diverse modalit`a di autenticazione; la pi`
u
interessante fra queste `e quella basata sulle chiavi crittografiche. Questa modalit`a di autenticazione permette una serie di semplificazioni nelluso dei comandi, come la possibilit`a di creare
delle sessioni di lavoro in cui, data una password di accesso iniziale, si pu`o evitare di fornirla di
nuovo tutte le volte che si utilizza uno dei comandi ssh o scp.
La tecnica utilizzata `e sempre quella delle chiavi asimmetriche, che possono essere sia di tipo
RSA che DSA (per la spiegazione di questa nomenclatura si faccia riferimento alla sez. 1.2.3
di [SGL]). Luso di chiavi asimmetriche permette il riconoscimento univoco di un utente, una
volta che questo dimostri di essere in possesso della chiave privata associata alla chiave pubblica
che il server utilizza come identificatore dello stesso.44
Nel caso di autenticazione a chiave, invece di mandare la password dellutente sul canale
cifrato, viene usata una procedura di challenge and response: il server invia al client un segreto
(la sfida) cifrato con la chiave pubblica dellutente a cui si vuole garantire laccesso, solo il reinvio
del segreto decifrato (la risposta) `e garanzia che il client conosce la chiave privata, che `e ci`o che
garantisce lautenticit`
a dellidentit`
a dellutente.45
Per poter utilizzare questa modalit`
a di autenticazione occorre anzitutto generare una coppia
di chiavi; il pacchetto OpenSSH mette a disposizione un apposito programma per la creazione
e la gestione delle chiavi, ssh-keygen. Se invocato senza nessuna opzione ssh-keygen stampa
un messaggio di aiuto; per eseguire la creazione di una nuova coppia di chiavi occorre infatti
specificare almeno il tipo di chiave con lopzione -t; i possibili tipi di chiavi sono tre: rsa per
chiavi RSA, dsa per chiavi DSA e rsa1 per il formato di chiavi RSA usato dal vecchio protocollo.
Se non si specifica nientaltro il comando chiede il file in cui salvare la chiave, che di default `e
nella solita directory .ssh nella home directory dellutente, con un nome che pu`o essere id_dsa
o id_rsa a seconda del tipo della chiave.46 Infine richiede una passphrase che serve a proteggere
laccesso alla chiave privata, che non pu`
o essere letta senza di essa.
Una volta completato il processo di generazione, che con macchine lente e per chiavi di
grandi dimensioni pu`
o essere anche molto lungo, il comando salva la chiave privata cifrata con
la passphrase fornita, e la corrispondente chiave pubblica; questultima andr`a in un file con lo
stesso nome usato per quella privata, seguito da un .pub terminale. Si pu`o specificare un nome
diverso anche da riga di comando, usando lopzione -f, seguita dal nome del file.
Se si vuole cambiare la passphrase in un secondo tempo si pu`o usare lopzione -p, verr`a
richiesta la vecchia passphrase per accedere alla chiave privata, e poi la nuova, che andr`a ripetuta
due volte, per conferma. Alle chiavi `e pure associato un commento, che non ha nessun uso nel
protocollo, ma serve da identificativo della chiave; esso viene di solito inizializzato alla stringa
utente@hostname e pu`
o essere cambiato con lopzione -c.
43

un programma per Windows che consente di usare questo protocollo in maniera immediata con una interfaccia
grafica molto semplice `e WinSCP, disponibile su http://www.winscp.net.
44
per una trattazione pi`
u dettagliata della crittografia a chiave asimmetrica si veda al solito la sezione 1.2
di [SGL].
45
questa modalit`
a di autenticazione `e molto pi`
u sicura di quella basata su username e password; anzitutto il
server non ricever`
a mai le nostre credenziali (nellaltro caso riceverebbe la password, qui la chiave privata resta
sempre sul client), in secondo luogo un attacco in cui si prova ad effettuare una serie di collegamenti tentando
tante password diverse diventa impossibile.
46
era identity per le chiavi del vecchio protocollo, ma queste sono comunque da evitare per linsicurezza dello
stesso.

8.3. AMMINISTRAZIONE REMOTA CON SSH

479

Con lopzione -l invece si pu`


o stampare limpronta digitale (la cosiddetta fingerprint) della
chiave a scopo di verifica; infine lopzione -b permette di specificare la lunghezza della chiave (in
bit); il valore di default, 1024, `e in genere adeguato, lunghezze maggiori aumentano la sicurezza,
ma richiedono molto pi`
u tempo per la generazione. I dettagli sul funzionamento del comando e
le restanti opzioni sono accessibili nella pagina di manuale con man ssh-keygen.
Una volta creata la coppia di chiavi diventa possibile utilizzarla per lautenticazione. Il
meccanismo prevede che quando un utente invoca ssh, se c`e una chiave nella directory .ssh47 la
parte pubblica venga inviata al server; quando sshd riceve una richiesta di connessione in questa
modalit`a va a verificare la presenza del file .ssh/authorized_keys nella home dellutente per
conto del quale si vuole accedere48 e se in esso `e presente la chiave pubblica ricevuta viene eseguita
la procedura di challenge and response illustrata in precedenza; questo punto ssh richieder`
a la
passphrase per sbloccare la chiave privata e rispondere alla sfida.
Per quanto appena detto quello che si deve fare per abilitare laccesso con lautenticazione
a chiavi `e inserire sulla macchina remota la chiave pubblica della persona a cui si vuole dare
laccesso. Questa deve essere aggiunta al file authorized_keys nella directory .ssh dellutente
per conto del quale si vuole dare accesso. Se si `e trasferita la chiave pubblica sul server baster`
a
un comando del tipo:
cat id_dsa.pub >> .ssh/authorized_keys
dove id_dsa `e la chiave dellutente che deve poter accedere; si noti luso della redirezione
in append, il file authorized_keys infatti pu`o contenere pi`
u chiavi pubbliche,49 se si fosse
semplicemente sovrascritto il file si sarebbero cancellate quelle di eventuali altri utenti.
Si noti che non `e necessario che chi accede con lautenticazione a chiavi conosca la password
dellutente sulla macchina remota; in questo modo diventa possibile dare accesso anche a pi`
u
persone senza che queste debbano condividere la conoscenza di una unica password di accesso,
cosa che ne aumenterebbe il rischio di scoperta o perdita. In questo caso infatti lautenticazione
viene fatta solo sulla base della corrispondenza fra una chiave pubblica ed una chiave privata e
tutto quello che serve `e la presenza della coppia di chiavi.
Dato che il procedimento manuale di inserimento della chiave pu`o essere macchinoso (richiede la copia del file della chiave pubblica, e poi il collegamento sulla macchina per inserirla) con il
pacchetto di SSH viene fornito un apposito comando, ssh-copy-id, che permette di automatizzare loperazione aggiungendo la chiave pubblica dellutente che lo invoca allauthorized_keys
di una macchina di destinazione; un esempio di uso del comando `e il seguente:
ssh-copy-id [email protected]
dato il quale si dovr`
a immettere la password dellutente remoto; le vecchie versioni del comando
richiedono luso esplicito dellopzione -i per indicare quale `e il file da usare, si tenga conto che
in questo caso va indicato il file della chiave privata (a trovare quello della chiave pubblica ci
pensa il comando).
Ovviamente quando si usa questo metodo di autenticazione la protezione della chiave privata
`e fondamentale, chiunque ne venga in possesso e possa utilizzarla ottiene immediatamente tutti
gli accessi a cui essa `e abilitata, e questo `e il motivo per cui essa viene protetta con una passphrase,50 che deve essere fornita tutte le volte che la si deve usare. Essa comunque deve essere
47

quella nella home dellutente che effettua il collegamento, quindi dalla parte del client.
e cio`e dalla parte del server, dove lutente pu`
o essere anche completamente diverso.
49
le chiavi sono mantenute una per riga, in formato codificato ASCII, per cui le singole righe sono di norma
molto lunghe.
50
la passphrase viene a sostituire il ruolo della password, ed `e bene sceglierla con molta cura, in quanto `e lunica
protezione contro labuso della nostra chiave privata; per questo motivo si parla di passphrase e non di password;
`e quindi il caso di usare una frase lunga e complicata, e non una singola parola.
48

480

CAPITOLO 8. LA GESTIONE DEI SERVIZI DI BASE

protetta sia da lettura che da scrittura da parte di estranei. Questo `e imposto dal comando ssh
stesso, che si rifiuta di usare (stampando un clamoroso avvertimento) una chiave privata che sia
leggibile da altri oltre al proprietario.
A questo punto per`
o ci si potrebbe chiedere lutilit`a di tutto questo armamentario, dato che
invece di una password per il login bisogna comunque inserire una passphrase per sbloccare la
chiave pubblica; lutilit`
a sta nel fatto che `e possibile usare un altro programma, ssh-agent,
che permette di sbloccare la chiave una sola volta, allinizio di una sessione di lavoro, e poi
mantiene la chiave privata sbloccata in memoria, permettendone il successivo riutilizzo senza
che sia necessario fornire di nuovo la passphrase.
Lidea `e che ssh-agent dovrebbe essere lanciato allinizio di una sessione, dopo di che tutti i
comandi verranno lanciati come client di esso cosicche questi possano interrogarlo tutte le volte
che `e necessario compiere una operazione con la chiave privata. Sar`a comunque ssh-agent ad
eseguire le operazioni necessarie, fornendo ai richiedenti i risultati ottenuti, in modo da non
dover mai comunicare verso lesterno la chiave privata.
Di norma ssh-agent viene lanciato automaticamente allavvio delle sessioni grafiche; mentre
lo si deve lanciare esplicitamente nel caso di login da terminale. Si tenga presente che allavvio il
programma non ha nessuna chiave privata. Per poterlo usare occorre aggiungere una chiave privata con il comando ssh-add, questo chieder`a la passphrase della chiave privata e la sbloccher`a,
inviandola allagent che da quel momento in poi potr`a utilizzarla.
Per poter comunicare con ssh-agent i vari programmi che ne hanno bisogno usano la variabile di ambiente SSH_AUTH_SOCK che identifica il socket locale su cui esso `e in ascolto; se questa
non `e definita anche se il programma `e attivo lautenticazione a chiavi non funzioner`a (e si
passer`a direttamente allautenticazione normale). La variabile `e definita dallo stesso ssh-agent
quando viene lanciato, che la stampa anche sullo standard output. Si ricordi per`o che le variabili
di ambiente definite da un processo vengono viste soltanto nei processi figli (per questo la shell
prevede il comando export), pertanto quando si lancia ssh-agent in console, questo rester`a
attivo in background, ma fintanto che non si inserir`a manualmente la variabile SSH_AUTH_SOCK
nellambiente, non potr`
a essere utilizzato.

8.3.4

Le funzionalit`
a di reinoltro del traffico

Una delle caratteristiche pi`


u interessanti di SSH, cui abbiamo accennato in precedenza, `e la
capacit`a di utilizzare la presenza di un canale cifrato per mettere a disposizione delle funzionalit`a
di comunicazione che vanno ben al di l`
a della semplice realizzazione di una sessione di shell
remota.
La prima di queste funzionalit`
a `e quella dellinoltro delle sessioni X Window, che consente
di eseguire da remoto anche applicazioni con interfaccia grafica. La trasparenza sulla rete del
protocollo di X Window gi`
a consentiva questo anche con una sessione fatta con telnet, infatti
basta definire sulla macchina remota la variabile dambiente DISPLAY con lindirizzo IP della
macchina su cui si vogliono ricevere le finestre (ed abilitare su di essa laccesso al server X con
il comando xhost) per avere anche la trasmissione via rete delle finestre.
Il problema resta quello che X Window non prevede nessuna cifratura dei dati, ne lautenticazione della connessione; una volta che si sia consentito un accesso da remoto al server X, a
questo si pu`o far fare di tutto, ed ovviamente questo `e un grosso problema per la sicurezza.51
Con SSH invece si pu`
o ottenere linoltro della sessione X in maniera sicura, facendo transitare
51
ad esempio `e relativamente semplice (ed `e stato fatto) scrivere un programma che crea una finestra trasparente
a tutto schermo messa in primo piano il cui solo scopo `e quello di intercettare tutti i tasti premuti, ottenendo
cos` un perfetto keylogger in grado di leggere tutte le password che immettete, anche al di fuori della sessione X
remota.

8.3. AMMINISTRAZIONE REMOTA CON SSH

481

tutto il traffico sul canale cifrato, e senza la necessit`a di consentire laccesso remoto al server
X.52
Dal lato server si pu`
o attivare linoltro della sessione X11 attraverso luso delle direttive
X11Forwarding e X11DisplayOffset di sshd_config. La prima direttiva abilita linoltro della sessione X11; di default questo `e disabilitato (anche se molte distribuzioni installano un
sshd_config che lo riabilita), in quanto si tratta di una funzionalit`a aggiuntiva che `e il caso di
usare solo se necessario: se ad esempio la macchina remota `e un server sul quale non devono
girare programmi con interfaccia grafica `e assolutamente inutile (e quindi dannoso dal punto di
vista della sicurezza) attivare questa funzionalit`a. Nellesempio di configurazione mostrato in
precedenza si `e attivata esplicitamente questa opzione. La seconda direttiva, X11DisplayOffset,
consente di impostare il valore minimo del display53 usato come destinazione per la sessione X11.
Questo in genere viene impostato al valore di 10, cos` da non creare conflitti con altri display
eventualmente presenti in locale.
Quando si eseguono queste impostazioni quello che accade `e che per ogni sessione SSH sulla
macchina remota viene automaticamente definita la variabile DISPLAY al valore localhost:NN
(con NN a partire da 10), cos` che le applicazioni lanciate nella sessione inviino i dati del protocollo
X11 su un socket54 su cui si pone automaticamente in ascolto sshd. A questo punto il server
trasferir`a questi dati attraverso il canale cifrato al client, e questultimo si incaricher`a di inviarli
al server X locale che disegner`
a le finestre dellapplicazione remota.
Unaltra funzionalit`
a avanzata messa a disposizione da ssh `e quella del cosiddetto port forwarding, in cui si pu`
o far passare sul canale cifrato delle connessioni TCP generiche. Questa
modalit`a pu`
o essere utilizzata in due modi; ma di questi quello di gran lunga pi`
u utilizzato `e
quello in cui si inoltra tutto il traffico diretto ad una porta locale verso una qualunque porta
posta su una qualunque macchina raggiungibile dallaltro capo del canale cifrato, cio`e dalla parte
del server.
Questa prima modalit`
a viene attivata lanciando il comando ssh con lopzione -L, ad essa deve
seguire una terna indicante rispettivamente la porta locale su cui porsi in ascolto,55 lindirizzo
IP della macchina remota e la porta remota cui verr`a inoltrato il traffico ricevuto sulla porta
locale. Queste informazioni devono essere separate dal carattere :, e si possono usare sia valori
numerici che simbolici; un esempio potrebbe essere il seguente:
ssh -L 6631:localhost:631 [email protected]
Nellesempio quello che si `e fatto `e collegare la porta 631 del localhost della macchina remota
(localhost `e risolto sulla macchina remota) alla porta 6631 del localhost della macchina locale.
Questo consentir`
a di accedere sulla macchina locale allinterfaccia di configurazione di CUPS
della macchina remota,56 nonostante questa sia posta in ascolto soltanto su localhost. Si noti
che come si `e raggiunto localhost si potr`a raggiungere qualunque altro indirizzo visibile dalla
macchina remota (ad esempio quello di una rete privata su cui essa si affaccia).
La seconda modalit`
a, che si attiva con lopzione -R, `e quella che permette di inoltrare tutto il
traffico diretto ad una porta della macchina remota, ad una porta su una macchina raggiungibile
dalla macchina locale. In questo caso allopzione deve seguire una terna analoga alla precedente
52

cosa che tra laltro sulle distribuzioni pi`


u attente alle questioni di sicurezza, come Debian, `e disabilitata di
default, per cui anche volendo non sarebbe possibile farlo, a meno di non cambiare la configurazione del server X
e riavviarlo.
53
si ricordi quanto detto in sez. 3.3.3.
54
viene usato un socket in ascolto su localhost sulla porta 6000+NN; infatti le porte standard usate dalle sessioni
di rete del protocollo X11 sono date da 6000 pi`
u il numero di display.
55
in questa forma la porta locale sar`
a messa in ascolto soltanto su localhost, se si vuole utilizzare un altro
indirizzo locale, lo si pu`
o specificare aggiungendolo prima della porta locale (seguito dal carattere di separazione
: e dagli altri tre valori).
56
sulla macchina locale baster`
a puntare un browser sulla porta 6631 del localhost.

482

CAPITOLO 8. LA GESTIONE DEI SERVIZI DI BASE

in cui si indicano nellordine: la porta remota su cui porsi in ascolto sulla macchina remota,
lindirizzo IP e la porta della macchina raggiungibile localmente a cui inoltrare il traffico inviato
alla porta remota. Un esempio di questa modalit`a potrebbe essere il seguente:
ssh -R 80:davis.truelite.it:80 [email protected]
In questo caso diventa possibile far connettere delle macchine che stanno nella rete della
macchina remota a servizi raggiungibili soltanto dalla macchina locale da cui si esegue il comando
ssh. Si tenga presente che in entrambe le modalit`a quando ci si vuole mettere in ascolto su una
porta privilegiata, occorre che lutente che esegue il comando (nel caso di -L) o quello per conto
del quale ci si collega (nel caso di -R) abbia i privilegi di amministratore.

8.4

La condivisione dei file sulla rete

Tratteremo in questa sezione i protocolli per la condivisione dei file via rete, concentrandoci in
particolare sul protocollo pi`
u usato nei sistemi unix-like, cio`e NFS. Tratteremo comunque, anche
se in maniera estremamente superficiale, anche la condivisione dei file con i protocolli utilizzati
in ambiente Windows attraverso lutilizzo di Samba.

8.4.1

Il protocollo ed il server NFS

Il protocollo NFS, sigla che sta a significare Network File System, `e stato creato da Sun per
permettere montare il contenuto di dischi che stanno su stazioni remote come se fossero presenti
sulla macchina locale. In questo modo si pu`o assicurare un accesso trasparente ai file, e si pu`o
utilizzare un filesystem anche su una macchina senza dischi,57 passando solo attraverso la rete.
In genere tutte le distribuzioni prevedono i pacchetti per linstallazione di un server NFS. La
sola scelta che si pu`
o dover fare `e fra luso del supporto del protocollo direttamente a livello del
kernel o luso di una implementazione realizzata completamente in user-space. Date le peggiori
prestazioni, questultima soluzione in genere viene evitata.
Per questo in genere si deve utilizzare un kernel che per cui sia stato abilitato il supporto
per NFS, questo viene fatto per i kernel standard installati da qualunque distribuzione; qualora
si ricompili un kernel da soli (si ricordi quanto illustrato in sez. 5.2.3) occorrer`a invece verificare
che siano abilitate in .config le seguenti opzioni:
CONFIG_NFS_FS=m
CONFIG_NFS_V3=y
CONFIG_NFSD=m
CONFIG_NFSD_V3=y
queste opzioni sono accessibili con make menuconfig sotto la voce File system, nella sotto voce
Network File System.
Il protocollo NFS `e piuttosto complesso, ed `e basato sul sistema delle RPC (vedi sez. 7.6.5);
pertanto al funzionamento di NFS, oltre a portmap, concorrono ben altri cinque demoni:
rpc.nfsd

`e il demone che svolge la gran parte del lavoro, realizzando le funzioni di accesso
al contenuto dei file. Deve essere lanciato dopo che `e stato attivato portmap.

rpc.statd

`e il demone che gestisce le caratteristiche dei file come tempi di accesso, permessi,
ecc. Deve essere lanciato dopo che `e stato attivato portmap.

57

in questo caso la configurazione `e pi`


u complessa, in quanto occorre abilitare il kernel stesso a montare la
directory radice su NFS.

8.4. LA CONDIVISIONE DEI FILE SULLA RETE


rpc.lockd

483

`e il demone che gestisce, quando questo `e abilitato, il file locking.58 Di norma


viene lanciato da rpc.nfsd in caso di necessit`a.

rpc.mountd `e il demone che gestisce le richieste di montaggio del filesystem. Deve essere
lanciato dopo che sono stati attivati rpc.nfsd e rpc.statd.
rpc.rquotad `e il demone che permette, quando sono attivate, di gestire le quote sul filesystem
di rete. Deve essere lanciato dopo che sono stati attivati rpc.nfsd e rpc.statd.
Benche complicato da descrivere dal punto di vista funzionale un server NFS `e in genere
molto semplice da configurare. Infatti di norma il servizio viene avviato automaticamente dagli
script di avvio installati dai pacchetti, e tutto quello che c`e da configurare `e il file /etc/exports
che definisce su ciascuna macchina quali sono le directory da esportare verso lesterno e quali
sono le altre macchine che hanno la facolt`a di utilizzarle; un esempio di questo file `e il seguente:
# /etc/exports: the access control list for filesystems which may be exported
#
to NFS clients. See exports(5).
/home/piccardi/share
192.168.1.0/255.255.255.0(rw)

Il file prevede una serie di campi separati da spazi o tabulazioni; il primo campo specifica la
directory sul server che verr`
a condivisa, i campi successivi definiscono chi e come pu`o utilizzarla.
Si pu`o specificare sia una singola stazione che una rete; qualora si indichi una rete occorre
specificarne il numero di bit (in notazione CIDR) o la maschera (in notazionedotted decimal )
dopo il carattere /. Bisogna per`
o stare attenti perche non tutti i server supportano luso della
notazione CIDR. Si possono usare anche indirizzi simbolici (che devono poter essere risolti) nel
qual caso si possono usare i caratteri wildcard * e ? per esprimere i nomi.
Per ciascuna riga di exports si possono indicare pi`
u macchine o reti separandoli con degli
spazi; per ciascuna macchina e rete poi si potranno specificare delle modalit`a di accesso e delle
opzioni di funzionamento del protocollo indicandole fra parentesi tonde,59 se si usano pi`
u opzioni
queste devono essere separate da virgole; il formato generico di una riga del file exports sar`
a
pertanto qualcosa del tipo:
/path/to/directory net1/mask1(option11,option12) machine2(option21,option22)
Le opzioni sono suddivise in due gruppi: quelle generali, relative al funzionamento del server
e quelle di mappatura degli utenti. Le opzioni principali riguardanti il comportamento del
server sono quelle che permettono di impostare le modalit`a di accesso ai file: rw e ro, che
indicano rispettivamente lettura/scritture e sola lettura, e quelle che ne governano la risposta
in reazione a richieste di scrittura, come sync che richiede che la scrittura dei dati su disco sia
completata prima di concludere una risposta, ed async che permette una risposta immediata con
una scrittura dei dati asincrona.60 Le principali opzioni ed il relativo significato sono riportati
in tab. 8.13, lelenco completo delle opzioni `e riportato nella pagina di manuale accessibile con
man exports.
Uno dei problemi principali che si deve affrontare quando si esporta una directory con NFS
`e quello della titolarit`
a dei file. Infatti il protocollo associa i file agli utenti ed ai gruppi cos`
come sono definiti sul server, utilizzando i relativi UID e GID; un utente sul client potr`a avere
accesso ai suoi file condivisi solo se questi identificativi (questa volta come definiti sul client)
58
il file locking `e la capacit`
a di bloccare ad altri processi laccesso ad un file, per una descrizione dettagliata si
veda il capitolo 11 di [GaPiL].
59
si faccia attenzione a non specificare le opzioni inserendo uno spazio fra il nome della macchina e le parentesi
che le delimitano (`e un errore comune); in tal caso infatti le opzioni verrebbero prese come lindirizzo di una nuova
macchina, con effetti fra limprevedibile ed il rischioso.
60
questa opzione `e disabilitata di default, in quanto in caso di crash del server le modifiche andrebbero perse;
il comando exportfs notifica se nessuna di queste due opzioni `e stata impostata, avvisando che sar`
a usata sync
di default.

484

CAPITOLO 8. LA GESTIONE DEI SERVIZI DI BASE


Opzione
rw
ro
async
sync
root_squash
no_root_squash
all_squash
anonuid
anongid

Significato
accesso in lettura e scrittura.
accesso in sola lettura.
abilita la scrittura asincrona sul server.
esegue le scritture in maniera sincrona.
rimappa lUID ed il GID 0.
non rimappa lUID ed il GID 0.
mappa tutti gli UID e i GID.
imposta lUID usato per laccesso anonimo.
imposta il GID usato per laccesso anonimo.

Tabella 8.13: Possibili opzioni per le directory esportate tramite NFS nel file /etc/exports.

corrispondono; `e necessario perci`


o tenere sincronizzati UID e GID in modo che sia sui client che
sul server essi corrispondano agli stessi utenti e gruppi.61
In alcuni casi per`
o occorrono delle eccezioni, ad esempio non `e desiderabile che lamministratore di un client sia trattato come root anche nellaccesso ai file del server. Per questo motivo di
default `e attiva lopzione root_squash che rimappa gli UID e GID 0 usati dallamministratore
sul valore 65534 (2), corrispondente rispettivamente a nobody e nogroup.62
La presenza di una riga in /etc/exports non significa che la directory ivi indicata sia resa
disponibile automaticamente; per controllare i filesystem che sono esportati `e infatti necessario
un apposito comando exportfs. Di norma lo si utilizza negli script di avvio per esportare tutti
i filesystem elencati in /etc/exports con exportfs -a. Qualora si modifichi /etc/exports si
pu`o usare il comando exportfs -r per sincronizzare la tabella dei filesystem esportati con i
contenuti del file. Infine con lopzione -u si pu`o rimuovere uno dei filesystem esportati, mentre
con -o si possono cambiare le opzioni. I dettagli si trovano al solito nella pagina di manuale,
accessibile con man exportfs.
Si tenga conto infine che i vari demoni che forniscono il servizio hanno il supporto per
` buona norma, vista
i TCP wrapper, quindi onorano le restrizioni descritte in sez. 8.1.5. E
la delicatezza del servizio fornito (che permette di accedere ai file degli utenti nelle directory
condivise), impostare sempre una politica di accesso negato di default per tutti i demoni, per
abilitare in /etc/hosts.allow gli accessi alle stesse macchine riportate in /etc/exports.

8.4.2

NFS sul lato client

Per poter utilizzare NFS sul lato client occorrer`a avere il supporto nel kernel, ed oltre a portmap
dovranno essere attivi i due demoni rpc.statd e rpc.lockd. Inoltre si deve avere una versione
sufficientemente recente del comando mount che sia in grado di montare un filesystem NFS.63
Come per il lato server di norma lutilizzo `e molto semplice e si esaurisce nel montare il
filesystem remoto sulla directory prescelta, in quanto con linstallazione dei relativi pacchetti
tutte le distribuzioni si curano che siano avviati tutti i servizi necessari.
Montare un filesystem NFS `e comunque estremamente semplice, invece di indicare un dispositivo baster`a indicare lindirizzo (simbolico o numerico) del server seguito da : e dalla directory
che si vuole montare (che dovr`
a essere presente e accessibile nel file /etc/exports del server).
Se si vuole eseguire il comando a mano baster`a eseguire mount con una sintassi del tipo:
61

per fare questo si pu`


o ricorrere alluso di LDAP per la centralizzazione degli utenti (largomento `e trattato
in [IS-LDAP]) o utilizzare il servizio NIS.
62
quello del controllo sullaccesso ai file in base al solo valore dellUID `e un grosso problema di sicurezza di
NFS; basta infatti collegarsi ad una rete con un IP consentito per far essere in grado, una volta che ci si sia dati
lUID corrispondente, di leggere i file di un qualunque utente; per questo motivo dalla versione 4 del protocollo `e
possibile appoggiarsi ad un server Kerberos per autenticare in maniera forte sia i client che gli utenti.
63
al giorno doggi qualunque versione lo `e.

8.4. LA CONDIVISIONE DEI FILE SULLA RETE

485

mount -t nfs havnor:/home/piccardi/share /mnt/nfs


e si pu`o poi definire un mount point permanente in /etc/fstab aggiungendo una riga del tipo:
192.168.1.1:/home/piccardi/temp /mnt/nfs nfs user,exec,noauto 0 0
dove la differenza con un filesystem su disco `e luso di nfs come filesystem type e lindirizzo della
directory da montare al posto del file di dispositivo. Nellesempio si sono usate soltanto delle
opzioni di montaggio generiche, in realt`a NFS supporta una serie di opzioni specifiche che ne
controllano il funzionamento. Buona parte delle opzioni di NFS devono essere specificate nella
forma opzione=valore, fanno eccezione le opzioni che prendono valori logici, che si specificano
direttamente per attivarle, o con il prefisso no per disattivarle.
Due opzioni, hard e soft controllano il comportamento del client in assenza di connessione
al server o di crollo di questultimo; in questo caso infatti si pone il problema di cosa fare per i
processi che stanno usando o cerchino di usare i file condivisi su una directory che `e stata montata
via NFS. Quello che succede normalmente `e che in questo caso il processo viene posto in stato D
(uninterruptible sleep, vedi tab. 1.10) ed il client continua ad interrogare il server fino a quando
questo non ritorna disponibile e lesecuzione riprende (dal punto di vista del processo) come se
niente fosse accaduto. Si tenga presente che essendo in stato D non sar`a possibile terminare i
processi rimasti bloccati; se si vuole poter uccidere i processi con kill occorrer`a usare lopzione
intr.
Con una directory montata con il valore di default, hard, il client prosegue nel tentativo di
riconnessione al server senza limiti di tempo ed i processi restano bloccati indefinitamente, se
invece si `e usato soft dopo un certo periodo di tempo64 di tentativi di riconnessione falliti, verr`
a
notificato al processo che ha eseguito laccesso un errore di I/O su disco.
Opzione
rsize
wsize
hard
soft

intr
nolock

sec

Significato
imposta le dimensioni del buffer di lettura, il default `e
4096.
identica a rsize ma per il buffer di scrittura.
in caso di crollo del server continua indefinitamente i
tentativi di riconnessione.
in caso di crollo del server i tentativi di riconnessione vengono effettuati per un periodo limitato di tempo fissato
con lopzione timeo.
permette di inviare segnali ai processi bloccati per un
crollo del server.
disabilita il file locking su NFS; viene usato per
compatibilit`
a con alcuni vecchi server che non lo
supportano.
specifica le modalit`
a di autenticazione presso il server,
con sys (il default) vengono usati i valori locali di UID e
GID, con krb5 viene usato Kerberos per lautenticazione.

Tabella 8.14: Opzioni del comando mount specifiche per NFS.

Altre due opzioni importanti per le prestazioni sono rsize e wsize che indicano le dimensioni
(in byte) dei buffer di lettura e scrittura. Il valore di default `e di 4096 per entrambe, ma
ovviamente pi`
u ampio `e il valore migliori saranno le prestazioni. Le altre opzioni principali sono
illustrate in tab. 8.14. Per ulteriori dettagli e lelenco completo delle opzioni si pu`o consultare
la apposita pagina di manuale, accessibile con man nfs.
64

dopo quello che viene detto un major timeout, il cui valore dipende dalle altre impostazioni di NFS, ed in
particolare dalle opzioni timeo e retrans.

486

CAPITOLO 8. LA GESTIONE DEI SERVIZI DI BASE

Si ricordi infine, come accennato in sez. 8.4.1, che i proprietari dei file sulle directory montate
via NFS sono riconosciuti in base ai valori di UID e GID definiti sul server. Pertanto se sul client
lutente relativo non esiste o ha un UID diverso (cosa possibile, se non si sono creati gli utenti
nella stessa sequenza) la titolarit`
a dei file non corrisponder`a, e si avranno problemi. Con la
versione 4 di NFS `e possibile appoggiarsi ad un server Kerberos,65 sia per quanto riguarda
lidentificazione e lautenticazione di utenti e macchine, che per la verifica e anche la cifratura
del traffico NFS.66

8.4.3

La configurazione di base di Samba

La suite Samba `e un insieme di programmi che permette ad una macchina Unix di utilizzare il
protocollo CIFS (Common Internet File System) usato dai server Windows per la condivisione
dei file. In realt`
a il Samba permette di fare molto di pi`
u,67 ma qui noi ne tratteremo solo le
caratteristiche di base relative alla condivisione dei file.
Il nome Samba deriva dalla precedente denominazione di CIFS che veniva chiamato in maniera non ufficiale SMB (Service Message Block ),68 nelle sue prime versioni il servizio veniva fornito
attraverso il protocollo proprietario NetBIOS usato da Windows come protocollo di trasporto;
a questo livello il protocollo ormai `e in disuso, ed attualmente `e implementato direttamente su
TCP/IP.
Limplementazione dei servizi SMB `e realizzata da Samba attraverso due demoni, smbd che
implementa la condivisione dei file e delle stampanti e nmbd che implementa i servizi NetBIOS
(cio`e il riconoscimento della presenza di server sulla rete, la risoluzione dei nomi, ecc.). Lavvio
del servizio `e generalmente curato dagli opportuni script; nel caso di Debian ad esempio questa
viene gestito da /etc/init.d/samba.
Entrambi i demoni vengono controllati tramite un unico file di configurazione, smb.conf. La
sintassi `e quella dei file .ini di Windows, in cui viene supportata pure la sintassi dei commenti
inizianti per # tipica di Unix. Un estratto di questo file, preso dalla installazione di una Debian
Sarge, `e il seguente:
[global]
# Do something sensible when Samba crashes: mail the admin a backtrace
panic action = /usr/share/samba/panic-action %d
printing = bsd
printcap name = /etc/printcap
load printers = yes
guest account = nobody
invalid users = root
security = user
workgroup = WORKGROUP
server string = %h server (Samba %v)
socket options = IPTOS_LOWDELAY TCP_NODELAY SO_SNDBUF=4096 SO_RCVBUF=4096
encrypt passwords = true
passdb backend = tdbsam unixsam
dns proxy = no
unix password sync = false
[homes]
comment = Home Directories
browseable = no
read only = yes
create mask = 0700
65

la trattazione di Kerberos va al di l`
a dello scopo di questo testo, un buon libro sullargomento `e [Kerberos].
si tenga presente infatti che di default il traffico dati di NFS non `e ne cifrato ne autenticato, ed `e quindi
poco sicuro; con NFS4 e Kerberos questi problemi possono essere risolti, al prezzo di una maggiore complessit`
a
di configurazione e prestazioni ovviamente inferiori.
67
pu`
o infatti sostituire un PDC (Primary Domain Controller ) Windows.
68
si narra che il nome sia stato scelto con un grep s.m.b. sul file del dizionario.
66

8.4. LA CONDIVISIONE DEI FILE SULLA RETE

487

directory mask = 0700


[printers]
comment = All Printers
browseable = no
path = /tmp
printable = yes
public = no
writable = no
create mode = 0700

Il file `e diviso in sezioni distinte introdotte da un nome in parentesi quadra, ciascuna delle
quali descrive una risorsa condivisa attraverso SMB (quello che viene chiamato uno share). Sono
per`o previste tre sezioni speciali, [global], [homes], e [printers] che non corrispondono a
degli share, ma servono ad impostare alcune funzionalit`a generiche. Allinterno di una sezione i
vari parametri sono impostati con direttive del tipo parola chiave = valore.
La sezione [global] permette di impostare i parametri che si applicano al server nel suo
insieme. Le opzioni fondamentali sono workgroup, che definisce il nome del dominio NT in cui
figurer`a la macchina e security, che definisce le modalit`a di accesso al server (e pu`o assumere i
valori user, share, server e domain). Di norma (a meno di non avere un accesso anonimo, nel
qual caso si pu`
o usare share) si utilizza come valore user che richiede che esista un utente Unix
per ciascun utente che si collega al server. Gli altri due valori servono quando si vuole dirottare
la richiesta di autenticazione.
In tab. 8.15 sono riportati le altre opzioni principali. Lelenco completo di tutti i parametri
`e descritto in dettaglio nella sezione PARAMETERS della pagina di manuale di smb.conf, di norma
nel file fornito dai pacchetti di installazione, vengono impostati valori ragionevoli adatti agli usi
pi`
u comuni.
La sezione [homes] quando dichiarata permette di creare al volo degli share corrispondenti
alle home degli utenti. In caso di connessione prima vengono controllate le altre sezioni definite, e
qualora non sia stata trovata nessuna corrispondenza la sezione richiesta viene trattata se fatta
verso una condivisione di rete il cui nome corrisponde allo username dellutente. Se lutente
esiste ed `e stata data una password corretta viene reso accessibile al volo il corrispondente share
con le caratteristiche impostate in questa sezione.
La sezione [printers] ha lo stesso scopo della sezione [homes], ma vale per le stampanti, se
non viene trovata una sezione esplicita corrispondente alla stampante cercata, viene esaminato
il file /etc/printcap per verificare se contiene una stampante con il nome richiesto, ed in caso
positivo viene creato al volo il relativo share.
Per aggiungere uno share `e sufficiente definire una nuova sezione; ad esempio si potr`a inserire
in coda al file mostrato in precedenza una ulteriore sezione del tipo:
[foo]
path = /home/bar
browseable = yes
read only = no
in questo modo gli utenti potranno accedere ad uno share denominato foo corrispondente alla
directory /home/bar.
Con la configurazione indicata laccesso richieder`a un username ed una password, a meno
che non si sia indicata una ulteriore riga del tipo guest ok = yes, nel qual caso sar`a consentito
laccesso senza password, con lutente specificato da guest user. Luso della direttiva browseable = yes permette di far apparire il nuovo share nella lista pubblica mostrata dal Network
Neighborhood di Windows, cio`e di far funzionare il cosiddetto sfoglia la rete.
In ogni caso gli effettivi permessi disponibili su /home/bar saranno quelli previsti dal sistema
per lutente con cui ci si `e connessi, il server non pu`o in nessun caso garantire maggiori permessi
di quelli forniti dal sistema, pu`
o invece ridurli, ad esempio impostando read only = yes.

488

CAPITOLO 8. LA GESTIONE DEI SERVIZI DI BASE


Parametro
security

workgroup

encrypt passwords

guest account

invalid users
socket options
passdb backend

dns proxy
unix password sync
wins support
wins server
host allow

Significato
stabilisce le modalit`
a di accesso al server, il valore di default `e user che richiede un username ed una password
per garantire laccesso; `e necessaria la presenza di un
corrispondente utente sulla macchina.
definisce il gruppo di lavoro di cui il server far`
a parte (quello che `e il nome di dominio NT, detto anche
workgroup name).
utilizza una autenticazione basata su password cifrate,
limpostazione di default `e true in quanto corrispondente al rispettivo default di Windows 98 e NT; se attivato necessita la presenza dei dati di autenticazione in un
opportuno supporto, in genere tramite smbpasswd.
specifica lutente utilizzato per laccesso ospite (cio`e senza autenticazione); di norma si usa nobody che non ha
nessun privilegio (in certi casi questo non consente luso
delle stampanti).
una lista di utenti che per conto dei quali non si pu`
o
utilizzare il servizio; di norma si specifica sempre root.
specifica delle opzioni relative al comportamento del
sistema nei confronti della rete.
specifica la lista dei supporti vengono mantenute le
password, il default `e tdbsam, che indica un database
binario.
quando il server `e usato per la risoluzione dei nomi, passa
le richieste non risolte al DNS.
se specificato il server tenta di sincronizzare le password
UNIX quando si `e cambiata quella su Windows.
indica se supportare la risoluzione dei nomi NetBIOS di
NT.
indica un server per la risoluzione dei nomi NetBIOS
usati dal protocollo.
indica la lista delle stazioni da cui `e possibile connettersi
al server.

Tabella 8.15: Significato dei parametri globali per Samba, come impostati nella sezione [global] di
/etc/smb.conf.

Per maggiori informazioni si pu`


o consultare il Samba-HOWTO, tutti i dettagli della configurazione sono documentati nella pagina di manuale di smb.conf. Il pacchetto Samba mette
comunque a disposizione alcuni programmi di controllo come testparms, che esegue una rapida
analisi del file di configurazione per rilevarne eventuali errori. Il comando smbstatus inoltre
permette di controllare lo stato delle connessioni.
In generale per laccesso ai servizi di condivisione forniti da Samba, che siano definiti esplicitamente come appena visto, o implicitamente con la sezione [homes], `e necessaria lautenticazione.
Il problema `e che Windows usa un meccanismo di autenticazione completamente diverso e non
compatibile con quello nativo di Linux. I client infatti (come semplici client Windows) non sono
in grado di inviare password in formato UNIX, ed `e pertanto impossibile eseguire un confronto
diretto con il contenuto di /etc/passwd.69
Questo comporta che Samba deve essere in grado di effettuare autonomamente lautenticazione utilizzando lo stesso protocollo usato da Windows, da cui segue automaticamente la necessit`a
di mantenere un elenco di utenti e password (queste ultime cifrate alla maniera di Windows) in
maniera indipendente da quelle usate per gli utenti ordinari del sistema ospite.
69
la cosa `e possibile solo se la password viene inviata in chiaro, nel qual caso il server potrebbe operare il
confronto; questo `e quello che avviene quando si forza il server a lavorare con le password trasmessi in chiaro
pendendo il parametro encrypt password a false, ma questa modalit`
a consente un uso limitato ed `e comunque
da evitare per gli ovvi problemi di sicurezza.

8.4. LA CONDIVISIONE DEI FILE SULLA RETE

489

I supporti usati da Samba per mantenere i dati di autenticazione sono vari, il pi`
u semplice `e
luso di un file di testo che viene abilitato specificando come valore del parametro di configurazione passdb backend il valore smbpasswd.70 Questo file contiene gli hash in formato Windows
delle password di ciascun utente; il formato del file `e analogo a quello di passwd, una riga per
ogni utente con campi separati dal carattere :, il primo campo specifica il nome utente ed
il secondo il suo UID, che devono corrispondere agli analoghi in passwd,71 seguono due hash
crittografici nel formato usato da Windows, poi dei flag per laccount, identificati da lettere fra
parentesi quadra e infine la data di ultima modifica della password. Il formato del file `e descritto
in dettaglio nella pagina di manuale accessibile con man 5 smbpasswd.
Un secondo supporto, usato di default nelle versioni recenti di Samba, `e quello di un piccolo
database binario, che permette di velocizzare notevolmente le operazioni di scansione. In tal
caso si dovr`
a indicare per passdb backend il valore tdbsam e i dati verranno memorizzati nel
` infine possibile usare come supporto un server LDAP,
file /var/lib/samba/passdb.tdb.72 E
nel qual caso il valore da usare `e ldapsam seguito dalla URL che indica il server da contattare.
Di norma la creazione dei dati per lautenticazione degli utenti deve essere eseguita esplicitamente dallamministratore, ed i singoli utenti devono essere aggiunti al sistema. Non essendo
infatti possibile ricavare la password in chiaro degli stessi hash mantenuti in /etc/passwd non
esiste una modalit`
a di replicazione automatica dei contenuti di questultimo per generare gli
hash nel formato compatibile con Windows usato da Samba.
Per questo insieme al server viene fornito anche il comando smbpasswd che permette linserimento dei dati di autenticazione allinterno del sistema utilizzato da Samba,73 e lamministratore
dovr`a aggiungere i singoli utenti a mano con qualcosa del tipo:
smbpasswd -a utente
in questo caso verr`
a chiesta la password (due volte per evitare errori di battitura) e lutente, che
deve essere gi`
a presente nel sistema come utente Unix, verr`a aggiunto allinterno dellopportuno
supporto usato da Samba.
Un utente normale pu`
o usare lo stesso comando sul suo username per modificare la sua
password, nel qual caso dovr`
a comunque fornire quella precedente. Solo lamministratore pu`
o
operare per conto di altri utenti; lopzione -a vista nellesempio `e quella che permette di aggiungere un utente, mentre lopzione -x permette di cancellarlo. Con le opzioni -e e -d `e invece
possibile abilitare e disabilitare temporaneamente un utente, mentre con -n si pu`o impostare una
password vuota. Al solito lelenco completo delle opzioni `e disponibile nella pagina di manuale
del comando, accessibile con man smbpasswd.
Luso principale di Samba `e quello che permette la condivisione di file e stampanti presenti
su una macchina Unix da parte di un client Windows. Da questo punto di vista Samba `e
completamente trasparente allutente, che dovr`a semplicemente cercare fra le risorse di rete i
servizi messi a disposizione dal server Samba. In realt`a Samba consente di effettuare compiti
molto pi`
u sofisticati, come quello di controllore di dominio, ma la trattazione di questi aspetti
va al di l`
a dello scopo di queste dispense.
Oltre al server per fornire a client Windows i servizi di condivisione di una macchina Unix,
la suite di applicativi realizzata dal progetto Samba comprende anche alcuni programmi che
permettono di utilizzare lato client da un sistema di tipo Unix i servizi presenti su un server
Windows (o su un altro server Samba, anche se in questo caso sarebbe pi`
u opportuno utilizzare
le applicazioni native Unix).
70

il file pu`
o essere specificato di seguito con il relativo pathname; il default `e /var/lib/samba/smbpasswd.
Samba rimappa sempre gli utenti Windows su utenti del sistema, per conto dei quali accede poi ai file.
72
a meno di non aver specificato in pathname diverso come parametro opzionale di tdbsam.
73
il comando user`
a quanto specificato con la direttiva passdb backend.
71

490

CAPITOLO 8. LA GESTIONE DEI SERVIZI DI BASE

Il primo di questi programmi `e smbclient, che permette di connettersi ad uno share di un


server Windows con una interfaccia simile a quella di FTP. Il comando prende come argomento
il nome di un servizio Windows a cui collegarsi nella forma generica:
//nome_server/nome_servizio
dove nome_server `e il nome della macchina secondo il protocollo CIFS (quello che viene chiamato
NetBIOS name) e nome_servizio il nome della condivisione (o della stampante) su quella
macchina. Si noti come il nome sia analogo a quello che viene usato da Windows, usando per`o
il carattere di separazione / al posto di \.
Lopzione principale `e -U che permette di specificare il nome utente (relativo al server) con
il quale ci si vuole connettere al servizio, se non lo si specifica viene usato il proprio username.
La password pu`
o essere scritta direttamente sulla riga di comando come secondo argomento
(o specificando lusername nella forma utente%password, altrimenti verr`a chiesta dal comando
stesso sul terminale senza mostrarla. Se il servizio a cui si accede non richiede una password se
ne pu`o eliminare la richiesta con lopzione -N.74
Una forma alternativa del comando `e quella in cui si usa soltanto lopzione -L per richiedere
una lista dei servizi visibili presenti su un server, il cui nome deve essere passato come parametro
dellopzione. Conviene in genere abbinarla a -N (per loperazione non `e richiesta una password),
cos` da ottenere un risultato del tipo:
piccardi@hain:~/truedoc/corso$ smbclient -L 192.168.1.37 -N
Domain=[TRUELITE] OS=[Unix] Server=[Samba 3.0.14a-Debian]
Sharename
Type
Comment
-----------------print$
Disk
Printer Drivers
direzione
Disk
direzione
commerciale
Disk
commerciale
IPC$
IPC
IPC Service (sarge server (Samba 3.0.14a-Debian))
ADMIN$
IPC
IPC Service (sarge server (Samba 3.0.14a-Debian))
Domain=[TRUELITE] OS=[Unix] Server=[Samba 3.0.14a-Debian]
Server
--------SARGE

Comment
------sarge server (Samba 3.0.14a-Debian)

Workgroup
--------TRUELITE

Master
-------

Se invece si usa smbclient per accedere ad un servizio una volta completata lautenticazione
si verr`a portati su una riga di comando che supporta una sintassi simile a quella di FTP, con
gli stessi comandi di tab. 7.29. Per gli altri i dettagli relativi alluso del comando e per lelenco
completo delle altre opzioni si pu`
o fare riferimento alla rispettiva pagina di manuale, accessibile
con man smbclient, che riporta anche vari esempi di utilizzo.
Un secondo comando importante `e smbmount, che permette di montare uno share di Windows allinterno del filesystem di Linux. Richiede il supporto nel kernel del filesystem SMB (di
solito presente in tutte le distribuzioni standard, e comunque attivabile nella sezione Network
filesystem dei menu di configurazione). La sintassi del comando `e:
smbmount service mount-point [ -o options ]
ma lo si pu`o invocare indirettamente attraverso mount specificando lopzione -t smbfs. Un
analogo comando smbumount permette di smontare un filesystem smbfs.
74

senza -N il comando chiede comunque una password, anche quando questa non `e richiesta.

8.4. LA CONDIVISIONE DEI FILE SULLA RETE

491

La sintassi `e molto semplice, service si specifica nella stessa forma usata per smbclient,
mentre il mount point `e una qualunque directory locale. Le opzioni sono sempre nella forma
keyword=valore, lopzione pi`
u importante `e username che permette di specificare, nella forma
user/work-group%password, utente, workgroup e relativa password con la quale accedere allo
share di Windows. Per i dettagli si pu`o consultare la pagina di manuale accessibile con man
smbmount.

492

CAPITOLO 8. LA GESTIONE DEI SERVIZI DI BASE

Capitolo 9

Il servizio DNS
9.1

Il funzionamento del servizio DNS

In questa prima sezione ci occuperemo di illustrare i principali concetti ed introdurre i meccanismi di funzionamento del servizio DNS, descrivendone le caratteristiche generali ed una serie
di programmi diagnostici usati appunto per eseguire interrogazioni su questo servizio.

9.1.1

Introduzione

Il DNS `e uno dei protocolli fondamentali per il funzionamento di Internet, consentendo di associare dei nomi simbolici agli indirizzi IP, e come gi`a accennato in sez. 7.4 si tratta in sostanza
di un meccanismo che consente di realizzare enorme database distribuito, i cui dati sono gestiti
da un gran numero di nameserver (si chiamano cos` i server che rispondono alle richieste del
protocollo).
Alle origini, quando Internet era piccola e le macchine erano poche, la risoluzione dei nomi era
fatta scaricando su ogni macchina un singolo file (in sostanza /etc/hosts) che conteneva tutte
le corrispondenze fra indirizzi IP e nomi. Col crescere della rete questo approccio `e rapidamente
divenuto insostenibile, non tanto e non solo per le dimensioni crescenti del file che doveva essere
riscaricato ad ogni aggiornamento, quanto per la quasi impossibilit`a di mantenere aggiornate
in maniera puntuale le corrispondenze stesse. Per questo `e stato creato il protocollo del DNS,
il cui scopo principale era sia quello di poter distribuire il compito di mantenere aggiornata
lassociazione fra nomi simbolici e indirizzi IP, che di poter eseguire la risoluzione in maniera
veloce ed efficiente tramite un apposito servizio.
Il funzionamento del DNS `e basato su una suddivisione gerarchica dello spazio dei nomi nei
cosiddetti domini, che vengono organizzati in livelli in una struttura ad albero ed indicati in
maniera generica da stringhe separate da punti costituenti quello che viene chiamato un nome
a dominio completo, o FQDN (Fully Qualified Domain Name), di cui abbiamo gi`a parlato in
sez. 7.4.3. Si hanno cos` i domini di primo livello (i vari .com, .org, .it, ecc.) quelli di
secondo livello (ad esempio debian.org, gnulinux.it, truelite.it) e cos` via, come illustrato
in fig. 9.1.
Per decentralizzare laggiornamento delle informazioni si sfrutta un meccanismo chiamato
delegazione. In generale il protocollo prevede che per ciascun dominio di un certo livello ci
debba essere un server DNS responsabile della risoluzione di tutti i nomi del ramo di albero ad
esso sottostante, che per questo viene detto autoritativo. Grazie alla struttura gerarchica dei
nomi `e per`
o possibile che il server responsabile per un dominio di un certo livello possa delegare
altri server per la risoluzione dei domini dei livelli successivi, che a quel punto diventeranno
autoritativi per tali sotto-domini.
493

494

CAPITOLO 9. IL SERVIZIO DNS

Figura 9.1: Schema dellorganizzazione gerarchica dei nomi a dominio.

In questo modo le richieste di risoluzione possano essere passate attraverso una gerarchia di
server, in cui, in corrispondenza a ciascun livello su cui si pu`o dividere un nome a dominio, ci
deve un server DNS che se anche non `e in grado di rispondere direttamente alla richiesta, sa
per`o qual`e il server del livello successivo a cui inoltrarla, cos` da poter proseguire fino a che non
si incontra il server DNS autoritativo che conosce la risposta finale.
Perche il sistema possa funzionare occorre per`o anche poter distribuire il carico delle richieste
di risoluzione; se ciascuna macchina che si affaccia su Internet dovesse effettuare le richieste
direttamente ai server autoritativi si genererebbe infatti una enorme quantit`a di traffico. Per
questo motivo come visto in sez. 7.4.1, il sistema del resolver consente di passare le richieste di
risoluzione ad un server DNS esterno che si incaricher`a di eseguire le ricerche necessarie, fornendo
poi solo la risposta finale.
Perche questo funzioni entra in gioco un secondo meccanismo, denominato ricorsione, che
`e in genere quello che viene utilizzato dai server DNS a cui si rivolge il resolver (come quelli
del proprio provider, che per questo sono detti ricorsivi).1 La ricerca di una risoluzione infatti
avviene ricorsivamente, con una scansione dellalbero dei domini come illustrato in fig. 9.2.

Figura 9.2: Schema della risoluzione ricorsiva di un nome a dominio.

Se allora per esempio viene richiesta la risoluzione del nome www.truelite.it ad un DNS
ricorsivo, questi allinizio contatter`
a un root DNS per sapere chi `e il server autoritativo per il
1

si tenga presente che, essendo questo un procedimento oneroso, si possono anche configurare server non
ricorsivi, che forniscono solo risposte alle richieste per i quali sono autoritativi o che hanno in cache.

9.1. IL FUNZIONAMENTO DEL SERVIZIO DNS

495

dominio di primo livello .it. La lista degli indirizzi IP di questi DNS radice ovviamente deve
essere nota a priori,2 altrimenti non sarebbe possibile iniziare la ricerca, ed `e proprio per questo
che vengono chiamati root DNS .
I domini di primo livello sono definiti a livello internazionale dalla cosiddetta naming authority,3 e la lista dei relativi DNS autoritativi `e mantenuta direttamente nei root DNS che hanno
effettuato la relativa delegazione; una volta che questi avranno indicato chi `e il server responsabile per i .it la scansione proseguir`a ripetendo la richiesta per .truelite.it al DNS (uno di
quelli del NIC italiano) appena trovato;4 essendo compito di questo server conoscere (e delegare)
tutti i domini di secondo livello, sar`
a in grado di indicarvi qual`e il server DNS responsabile per
.truelite.it a cui chiedere la risoluzione di www.truelite.it.
Un altro tassello del meccanismo `e che in tutti questi passaggi il DNS ricorsivo che esegue la
ricerca memorizzer`
a le varie informazioni ottenute nella sua cache per poterle riutilizzare immediatamente, in modo da evitare una ulteriore richiesta ai root DNS se ad esempio volete risolvere
.gnulinux.it, o unaltra richiesta ai server del NIC se volete risolvere labs.truelite.it, o di
ripetere qualunque ricerca ad una successiva richiesta di www.truelite.it. Questo introduce
per`o anche una distinzione fra le risposte, che sono dette autoritative o meno a seconda che
provengano direttamente dal nameserver che ha lautorit`a per quella richiesta o dalla cache di
un altro server.
Con queste modalit`
a di funzionamento il DNS permette di distribuire in maniera efficace il
compito di fornire le risposte e di mantenere aggiornata la corrispondenza fra nomi ed indirizzi
IP, in quanto alla fine `e il responsabile di ciascun dominio finale a dover mantenere un DNS
che contenga le informazioni relative alle sue macchine. Inoltre il meccanismo del caching dei
risultati permette di aumentare lefficienza della ricerca, evitando di ripetere pi`
u volte le stesse
operazioni, riducendo il traffico sulla rete ed il carico sui server autoritativi.
Ovviamente la memorizzazione dei risultati ha anche un costo, in quanto se viene eseguito
un cambiamento in una associazione fra nome a dominio e indirizzo IP questo non verr`a visto da
un server DNS fintanto che questi ha altra associazione valida nella propria cache. Per questo
motivo tutte le informazioni del DNS sono corredate da un tempo di scadenza, da scegliere
opportunamente a seconda delle frequenze con cui esso pu`o cambiare, che permettono, con
tempi pi`
u o meno rapidi a seconda di quanto impostato,5 di propagare i cambiamenti su tutta
la rete.
Si tenga presente infine che il protocollo DNS permette di gestire vari tipi di informazione,
finora infatti abbiamo parlato di risoluzione dei nomi a dominio in indirizzi IP, ma questi sono
soltanto uno dei diversi tipi di dato che sono associabili ad un nome a dominio, e come vedremo
pi`
u avanti il sistema consente di mantenerne diversi altri, come indirizzi IPv6, sinonimi, server
di posta elettronica da contattare, dati relativi alla delegazione di un sottodominio, ecc.

9.1.2

I Resorce Record e le zone di autorit`


a

Come accennato un server DNS `e in grado di mantenere diversi tipi di informazione associati ad
un dominio, che vengono chiamanti, nel gergo del protocollo, Resource Record (spesso abbreviato
2

la lista viene pubblicata ed aggiornata, ed ogni server DNS ricorsivo deve conoscerla allinterno della propria
configurazione.
3
la ICANN Internet Corporation for Assigned Names and Numbers, che gestisce i root DNS e delega i domini
nazionali alle varie autorit`
a locali.
4
in realt`
a qui si `e semplificato, a tutti i livelli i server autoritativi sono sempre pi`
u di uno e nelle risposte
si ottiene una lista e non un singolo server, ma le richieste possono essere fatte ad uno qualunque ottenendo
(configurazioni errate a parte) gli stessi dati.
5
e sempre che i server DNS siano configurati correttamente per onorarle, cosa che non avviene sempre, dato
che alcuni provider preferiscono risparmiare sulla banda e mantenere il pi`
u a lungo possibile le informazioni in
cache ed i loro server DNS ignorano le indicazioni di scadenza fornite.

496

CAPITOLO 9. IL SERVIZIO DNS

nella documentazione in RR). Un resource record costituisce lelemento di base dellinformazione


mantenuta dal DNS, in sostanza una voce del database distribuito.
I resource record vengono classificati secondo la classe di dati a cui il loro contenuto fa
riferimento,6 e per il tipo dei dati stessi. A ciascuna classe e a ciascun tipo viene in genere
associata una stringa identificativa, ma oggi praticamente la sola classe in uso `e quella degli
indirizzi internet, identificata dal nome IN.
Esistono invece molti tipi diversi di resource record, alcuni dei quali hanno un significato
specifico rilevante per il funzionamento di alcuni protocolli;7 un elenco dei principali tipi `e
riportato in tab. 9.1, lelenco completo viene mantenuto dalla IANA nella lista dei parametri del
DNS, che `e pubblicata sulla pagina web http://www.iana.org/assignments/dns-parameters.
Tipo
A
NS
CNAME
SOA
PTR
MX
TXT
AAAA
SRV
HINFO
KEY
SIG

Descrizione
corrispondenza fra nome a dominio e indirizzo IP.
nameserver autoritativo per la il dominio.
nome alternativo (un alias ad un altro nome nel dominio).
dati dellinizio della zona di autorit`
a.
corrispondenza fra indirizzo IP e nome a dominio.
server di posta per il dominio.
un commento o altro testo associato al nome a dominio.
corrispondenza fra nome a dominio e indirizzo IPv6.
locazione di un servizio sul dominio.
informazione su una stazione.
chiave crittografica (vedi sez. 9.4).
firma digitale (vedi sez. 9.4).

Tabella 9.1: Identificativo e relativa descrizione dei principali tipi di Resource Record.

I vari dati relativi ad un certo dominio vengono raccolti in quella che nel protocollo viene
chiamata una zone di autorit`
a; questa rappresenta in sostanza quella parte dello spazio dei
nomi di dominio per i quali un singolo nameserver `e responsabile di gestire le informazioni, sia
fornendo direttamente le risposte, che delegando eventualmente ad un altro server la risoluzione
di un dominio di livello inferiore (che a quel punto ricever`a il compito di gestire la zona di
autorit`a ad esso relativa).
In ogni caso il server al quale sia stata delegata una zona di autorit`a deve fornire le risposte
(che in questo caso saranno quelle autoritative) per qualunque nome allinterno di quel dominio;
non si pu`o cio`e delegare la risoluzione dei nomi relativi al dominio sul proprio livello, ma solo
quelli di un dominio del livello successivo.8
Il contenuto di una zona di autorit`
a viene normalmente descritto tramite file di testo chiamati
file di zona (su cui torneremo in sez. 9.2.4) in cui vengono raccolte le varie informazioni associate
ai nomi in essa definiti, e le richieste di informazioni effettuate presso un server DNS sono in
genere nella forma in cui si richiede il valore di un qualche resource record associato alla sua
zona (vale a dire per un nome del relativo dominio.

9.1.3

I comandi host e dig

Per eseguire effettuare una richiesta di risoluzione di un indirizzo IP non `e necessario in genere
nessun programma specifico, basta un qualunque programma che usi il resolver, come potrebbe
6

in genere si parla di classe di indirizzi, in quanto i dati del DNS fanno comunque riferimento alla risoluzione
di nomi.
7
ad esempio i record MX vengono usati dai server di posta come previsto nel protocollo SMTP, mentre i record
NS vengono usato dal DNS stesso per gestire la delegazione.
8
la delegazione `e comunque facoltativa, si possono risolvere anche tutti gli eventuali sottodomini (o solo alcuni
di essi) allinterno di ununica zona di autorit`
a, inserendo direttamente nella stessa anche i record per i nomi dei
livelli successivi che non si vogliono delegare.

9.1. IL FUNZIONAMENTO DEL SERVIZIO DNS

497

essere ad esempio ping invocato con un nome a dominio (di cui tra laltro, come visto in sez. 7.6.1
stampa la risoluzione), ma dato che come appena detto un server DNS pu`o fornire diverse
informazioni, sono stati realizzati vari programmi in grado di eseguire interrogazioni dirette ad
un server DNS, in sostanza dei client per questo servizio.
Si tenga presente per`
o che i suddetti programmi non usano il resolver ma parlano direttamente con un server DNS anche per effettuare la normale risoluzione dei nomi a dominio in
indirizzi IP; per questo motivo non `e detto che i risultati di una richiesta siano gli stessi che si
potrebbero ottenere con gli ordinari client di rete (come ping) per i quali la risoluzione del nome
potrebbe anche essere stata ottenuta da fonti alternative come /etc/hosts (si ricordi quanto
detto in sez. 7.4) che in questo caso non sarebbero prese in considerazione.
Questo tipo di programmi pu`
o essere usato per verificare che limpostazione della configurazione del resolver per luso dei DNS esterni funzioni correttamente, pu`o accadere infatti che la
rete sia configurata correttamente, ma non si riesca a fare nulla perche gli indirizzi simbolici non
vengono risolti, ad esempio perche si `e sbagliato ad indicare lindirizzo del DNS in resolv.conf.
Luso pi`
u comune per`
o `e quello di controllare il funzionamento effettivo del proprio server DNS,
e verificarne le informazioni.
Il primo comando che prenderemo in considerazione `e host. Se invocato senza argomenti
il comando stampa la sua sintassi, ma in genere lo si usa passandogli come come argomento il
nome a dominio che si vuole risolvere, di cui stampa le informazioni ottenute dal server DNS;
un esempio del suo utilizzo `e:
piccardi@hain:~$ host www.penciclopedia.it
www.penciclopedia.it is an alias for gordon.penciclopedia.it.
gordon.penciclopedia.it has address 78.46.114.60

Il comando ci riporta in forma discorsiva che lindirizzo www.penciclopedia.it `e stato


risolto come corrispondente allIP 78.46.114.60, ma la risposta ci mostra anche che in questo
caso la corrispondenza del nome indicata `e stata effettuata inizialmente con un alias ad un altro
nome (cio`e con un record di tipo CNAME, vedi tab. 9.1) che ci reinvia al nome principale della
macchina gordon.penciclopedia.it, che `e quello per cui si ha invece la corrispondenza diretta
con un indirizzo IP (cio`e un record di tipo A).
Il comando funziona anche alla rovescia, si pu`o cio`e trovare lindirizzo simbolico a partire da
quello numerico con:
piccardi@hain:~$ host 78.46.114.60
60.114.46.78.in-addr.arpa domain name pointer gordon.truelite.it.

ma si noti come in questo caso la risoluzione non corrisponda al nome associato in precedenza
infatti possibile che ci siano pi`
allindirizzo IP. E
u nomi a dominio che corrispondono allo stesso
indirizzo IP, ad esempio:
piccardi@hain:~$ host piccardi.gnulinux.it
piccardi.gnulinux.it has address 78.46.114.60

si ha un altro nome a dominio associato allo stesso indirizzo, ma nella risoluzione inversa (che
si effettua con la richiesta di un record PTR) solo un nome potr`a essere associato allindirizzo IP.
Il comando host permette di richiedere esplicitamente anche gli altri tipi di record usando
lopzione -t che prende come parametro il tipo di record voluto, indicato secondo i valori riportati
in tab. 9.1. Ad esempio se vogliamo trovare il server incaricato della ricezione della posta per il
dominio truelite.it possiamo usare:
piccardi@hain:~$
truelite.it mail
truelite.it mail
truelite.it mail

host -t MX
is handled
is handled
is handled

truelite.it
by 30 mail3.truelite.it.
by 10 mail.truelite.it.
by 20 mail2.truelite.it.

498

CAPITOLO 9. IL SERVIZIO DNS

che ci risponde restituendo i record MX. Lopzione supporta anche luso del valore speciale ANY,
che richiede linvio di tutti i record associati al nome.
Il comando effettua le sue richieste interrogando i server DNS elencati in /etc/resolv.conf,
ma gli si pu`o indicare una lista di server alternativi da utilizzare passando gli stessi come argomenti successivi al primo.9 Per le altre opzioni e tutti i dettagli si consulti la pagina di
manuale.
Il secondo comando utilizzato per le interrogazioni ai DNS `e dig; le sue funzionalit`a sono
sostanzialmente le stesse di host, ma a differenza di questo `e pensato come strumento di analisi
delle risposte dei server DNS, e riporta i risultati in un formato meno discorsivo ma molto pi`
u
preciso, indicando tutti i dettagli relativi alle richieste fatte ed ai dati ottenuti, usando per i
risultati lo stesso formato dei file di zona che vedremo in maggiore dettaglio in sez. 9.2.3.
Il comando richiede che si passi come argomento il nome a dominio di cui si vuole la risoluzione, ma in questo caso se non si indica nulla, il comando chiede la risoluzione per la radice
dellalbero dei domini (cio`e per il nome .) stampando in sostanza lelenco degli indirizzi dei
root server.
Benche la lettura delloutput del comando sia pi`
u complessa, le informazioni sono molto pi`
u
dettagliate e consentono di effettuare richieste in maniera molto pi`
u sofisticata, un esempio di
risultato del comando `e il seguente:
piccardi@hain:~$ dig piccardi.gnulinux.it
; <<>> DiG 9.7.0-P1 <<>> piccardi.gnulinux.it
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 38026
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 2, ADDITIONAL: 2
;; QUESTION SECTION:
;piccardi.gnulinux.it.
;; ANSWER SECTION:
piccardi.gnulinux.it.
;; AUTHORITY SECTION:
gnulinux.it.
gnulinux.it.
;; ADDITIONAL SECTION:
ns.gnulinux.it.
ns2.gnulinux.it.
;;
;;
;;
;;

IN

84656

IN

84657
84657

IN
IN

84657
84657

NS
NS

IN
IN

78.46.114.60

ns.gnulinux.it.
ns2.gnulinux.it.

A
A

62.48.34.25
217.133.96.194

Query time: 6 msec


SERVER: 192.168.0.1#53(192.168.0.1)
WHEN: Fri Mar 18 01:46:49 2011
MSG SIZE rcvd: 121

Loutput prevede una stampa iniziale dei dettagli della richiesta effettuata, e riporta (nella
sezione etichettata QUESTION) i dettagli della domanda di risoluzione effettuata, a cui seguono
una serie di sezioni che oltre alla risposta alla richiesta stessa (nella sezione ANSWER) riporta
ulteriori dati relativi a chi `e responsabile per la risoluzione (i record NS della sezione AUTHORITY)
e eventuali dati addizionali (gli indirizzi dei suddetti DNS nella sezione ADDITIONAL). Infine si
noti come in coda al comando siano riportate informazioni aggiuntive sul server contattato e
sulla tempistica delle risposte.
Il comando consente di indicare come host la richiesta di tipi di record diversi con lopzione
-t, ma in generale questi (ed una eventuale classe diversa dal default di IN) possono essere
9

li si possono indicare anche per nome a dominio, ed in questo caso la risoluzione verr`
a effettuata dal resolver.

9.2. LA GESTIONE DI UN SERVER DNS

499

indicati dagli argomenti successivi della riga di comando. Un esempio di invocazione di questo
tipo `e la seguente, che consente di ottenere la versione del server DNS che si sta usando:
piccardi@hain:~$ dig version.bind CH TXT
; <<>> DiG 9.7.0-P1 <<>> version.bind CH TXT
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 46522
;; flags: qr aa rd; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 0
;; WARNING: recursion requested but not available
;; QUESTION SECTION:
;version.bind.

CH

TXT

;; ANSWER SECTION:
version.bind.

CH

TXT

;; AUTHORITY SECTION:
version.bind.

CH

NS

;;
;;
;;
;;

"9.7.3"

version.bind.

Query time: 4 msec


SERVER: 192.168.0.1#53(192.168.0.1)
WHEN: Fri Mar 18 02:10:11 2011
MSG SIZE rcvd: 63

Come per host il programma di default interroga i server DNS elencati in /etc/resolv.conf,
ma si pu`o indicare esplicitamente a quale server rivolgersi passandogli un argomento nella forma
@server. Inoltre dig pu`
o essere usato in modalit`a non interattiva con lopzione -f, che permette
di effettuare le ricerche leggendo i comandi da un file, passato come argomento dellopzione.
Occorre inoltre una accortezza quando si vuole effettuare una risoluzione inversa, il comando
infatti, a differenza di host, tratta sempre il suo primo argomento come un nome a dominio,
anche se si scrive un indirizzo IP, se si vuole che venga chiesto il record PTR per quellindirizzo
occorre dirlo esplicitamente specificando lopzione -x.

9.2

La gestione di un server DNS

In questa sezione prenderemo in esame la gestione di un server DNS, concentrandoci in particolare su una implementazione particolare, quella di bind, che detiene comunque la quasi totalit`
a
delle installazioni dei server DNS su tutta Internet.

9.2.1

Il server named

Essendo un protocollo implementato a livello di applicazione, il servizio del DNS viene fornito
attraverso un opportuno demone. A livello internazionale (si ricordi quanto detto in sez. 7.2.4) `e
stato assegnato al protocollo la porta 53 (sia UDP che TCP) per rispondere a delle interrogazioni.
Il server DNS pi`
u diffuso `e dato dal programma named. Il programma `e parte del pacchetto
bind, scritto originariamente da Paul Vixie, e mantenuto dallInternet Software Consortium,
che attualmente `e giunto alla versione 9.
Linstallazione del programma da pacchetto `e prevista da tutte le maggiori distribuzioni,10 e
una volta installato viene lanciato direttamente negli script di avvio. Inoltre in genere si prevede
che al programma venga dedicato un utente apposito, in modo da poterlo far eseguire con
privilegi ridotti. Inoltre con la versione 9 `e fornito anche un apposito programma di controllo,
rndc, che consente di eseguire, oltre alle classiche azioni di avvio, ripartenza e rilettura delle
configurazioni, anche operazioni pi`
u avanzate, come il controllo delle zone gestite dal server.
10

nel caso di Debian il pacchetto `e bind9, nel caso di RedHat/CentOS `e semplicemente bind.

500

CAPITOLO 9. IL SERVIZIO DNS


Tipo
reload
retransfer
reconfig
stats
stop
status
addzone
delzone

Descrizione
.
.
.
.
.
.
.
.

Tabella 9.2: I comandi utilizzabili con rndc.

Nei casi in cui, per effettuare delle prove, si vuole lanciare a mano il programma, la sintassi,
come riportata dalla pagina di manuale, `e la seguente:
named [-d debuglevel] [-p port#] [-(b|c) config_file] [-f -q -r -v]
[-u user_name] [-g group_name] [-t directory] [-w directory]
[config_file]
per una descrizione delle opzioni si pu`
o consultare la stessa pagina di manuale, di norma `e
sufficiente lanciare il programma senza opzioni, nel qual caso saranno usate le configurazioni
standard, se si vuole lasciare il programma attivo, si pu`o usare lopzione -f che evita che vada
in background, mentre con -d si pu`
o impostare il livello di debug; usandole entrambe si avr`a
tutta la diagnostica a schermo invece che in un file di log.
Di norma il programma viene lanciato usando lopzione -u, che permette di usare un utente
dedicato, senza privilegi speciale, dopo aver effettuato linizializzazione dello server11 per le
normali operazioni del DNS. Lutente dipende dalla distribuzione e dallinstallazione che si `e
effettuata.

9.2.2

Il file named.conf

Il file di configurazione di named `e named.conf, di solito si trova questo file in /etc/named o


in /etc/bind/ (se non direttamente sotto /etc) a seconda delle distribuzioni. Il file ha una
sintassi abbastanza complessa e simile a quella dei programmi in C, il file contiene una serie
di comandi, che a loro volta possono contenere blocchi di ulteriori sotto-comandi racchiusi fra
parentesi graffe; ogni comando `e terminato da un ; che ne indica la conclusione. Anche i
commenti possono essere introdotti dalla usuale #, ma viene utilizzata anche la sintassi del C e
del C++ con blocchi delimitati da /* */ o inizianti per //.
Una lista dei principali comandi che si possono utilizzare allinterno di named.conf e del loro
significato generico `e la seguente:
include

include il contenuto di un altro file di configurazione, come se questo fosse stato


scritto direttamente dentro named.conf. In questo modo diventa possibile dividere
le varie configurazioni (ad esempio le zone per diversi domini, o altre configurazioni)
e mantenere separatamente le varie parti.

options

permette di impostare alcune propriet`a generali del server ed i default per le altre
direttive. Conviene inserirla in un file a parte (ad esempio in Debian `e mantenuta in
/etc/bind/named.conf.options) da includere con include.

logging

definisce le modalit`
a con cui le varie informazioni vengono inviate sui file di log o al
sistema del syslog.

11

dovendo porsi in ascolto sulla porta 53, che `e una delle porte riservate, `e necessario avere i privilegi di
amministratore, che nel corso delle ulteriori operazioni non sono pi`
u necessari.

9.2. LA GESTIONE DI UN SERVER DNS

501

viene usata per definire una zona del DNS e le modalit`a con cui vengono utilizzate
le relative informazioni. Una zona serve ad identificare una parte di nomi di dominio
per il quale il server deve eseguire delle azioni specifiche.

zone

la lista completa e i vari dettagli relativi a ciascuna direttiva possono essere trovati nella pagina
di manuale accessibile con man named.conf; si tenga presente che le due direttive logging e
options possono comparire soltanto una volta.
Un esempio dellinizio del file named.conf, ripreso dal file installato dal pacchetto bind su
una distribuzione Debian Sid, `e riportato di seguito:
//
//
//
//
//
//

This is the primary configuration file for the BIND DNS server named.
Please read /usr/share/doc/bind/README.Debian for information on the
structure of BIND configuration files in Debian for BIND versions 8.2.1
and later, *BEFORE* you customize this configuration file.

include "/etc/bind/named.conf.options";
// reduce log verbosity on issues outside our control
logging {
category lame-servers { null; };
category cname { null; };
};
...

si noti come in questo caso viene incluso un file a parte che contiene limpostazione delle opzioni
con il comando options, e poi viene usato il comando logging per bloccare la scrittura nei log di
alcuni tipi di messaggi. Vedremo il resto del file in seguito, in relazione a diverse configurazioni.

9.2.3

La configurazione base

Le modalit`
a di utilizzo di un server DNS possono essere le pi`
u svariate, affronteremo qui solo
quelle relative al suo uso allinterno di una rete locale. La modalit`a pi`
u semplice `e quella di un
caching DNS, cio`e di usare il server come un proxy per evitare di ripetere ogni volta le richieste
di risoluzione dei nomi su Internet.
Anzitutto andranno impostate le opzioni generali per il server, questo viene fatto dal comando
options, si avr`
a pertanto una sezione del tipo di:
options {
directory "/var/cache/bind";
...
};
che specifica la directory rispetto nella quale il server cerca i vari file; anche questa pu`o variare
a seconda della distribuzione.
Il primo passo da fare `e quello di far sapere al server dove pu`o trovare i root DNS ; questo
viene fatto inserendo in named.conf una zona apposita, usando una sezione del tipo di:
zone "." {
type hint;
file "/etc/bind/db.root";
};
in questo caso il comando definisce una zona per la radice (che nel sistema dei nomi di dominio
`e indicata da un "."). I file preimpostati nellinstallazione standard gi`a prevedono una sezione
di questo tipo.

502

CAPITOLO 9. IL SERVIZIO DNS

Le zone possono essere di vari tipi, come specificato dal sotto comando type, in questo caso
si ha una zona di tipo hint che dice semplicemente a chi richiedere le informazioni relative a
quella zona. La direttiva file specifica il file da cui prendere le informazioni, questo pu`o essere
indicato in forma assoluta, come nellesempio, o in forma relativa rispetto alla directory definita
dalla direttiva directory del comando options. In questo caso il file `e /etc/bind/db.root che
contiene lelenco dei root DNS, questo pu`
o essere ottenuto con il comando dig (vedi sez. 9.1.3)
o scaricato direttamente allindirizzo ftp://ftp.internic.net/domain/named.root.
La sintassi generale del comando zone prevede che esso sia seguito, fra ", dal nome della
zona a cui si fa riferimento e da un ulteriore blocco di direttive che specificano le caratteristiche
della zona. In generale, oltre alla zona per i root DNS, quando si installa il pacchetto di bind, i
file di configurazione sono preimpostati per la risoluzione del localhost. Vedremo i dettagli al
riguardo in sez. 9.2.4, quando tratteremo la configurazione del nameserver per la risoluzione di
un dominio locale.
Di norma linstallazione standard prevede da sola tutto quello che serve per un caching DNS.
A questo punto si pu`
o provare a verificarne il funzionamento, se da un terminale si esegue una
richiesta ad un indirizzo fino ad allora non usato, avremo che:
[piccardi@gont piccardi]$ dig www.consumattori.org
; <<>> DiG 9.2.2 <<>> www.consumattori.org
;; global options: printcmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 32914
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 2, ADDITIONAL: 0
;; QUESTION SECTION:
;www.consumattori.org.

IN

;; ANSWER SECTION:
www.consumattori.org.

3600

IN

80.241.162.128

;; AUTHORITY SECTION:
consumattori.org.
consumattori.org.

900
900

IN
IN

NS
NS

ns7.gandi.net.
custom2.gandi.net.

;;
;;
;;
;;

Query time: 698 msec


SERVER: 192.168.1.1#53(192.168.1.1)
WHEN: Tue Mar 25 21:42:25 2003
MSG SIZE rcvd: 103

e come si vede la richiesta viene soddisfatta in 698 msec, ma se subito dopo si ripete la richiesta
otterremo:
[piccardi@gont piccardi]$ dig www.consumattori.org
; <<>> DiG 9.2.2 <<>> www.consumattori.org
;; global options: printcmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 56592
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 2, ADDITIONAL: 0
;; QUESTION SECTION:
;www.consumattori.org.

IN

;; ANSWER SECTION:
www.consumattori.org.

3595

IN

80.241.162.128

;; AUTHORITY SECTION:
consumattori.org.

895

IN

NS

ns7.gandi.net.

9.2. LA GESTIONE DI UN SERVER DNS


consumattori.org.
;;
;;
;;
;;

895

IN

503
NS

custom2.gandi.net.

Query time: 3 msec


SERVER: 192.168.1.1#53(192.168.1.1)
WHEN: Tue Mar 25 21:42:30 2003
MSG SIZE rcvd: 103

con i tempi che si riducono drasticamente a 3 msec.


Questo ci mostra che il nostro caching nameserver sta funzionando. Con questa impostazione
per`o `e il nostro nameserver che si incarica di effettuare il procedimento di scansione ricorsiva
che abbiamo illustrato in sez. 9.1.1, possiamo limitare ulteriormente le richieste che escono dalla
nostra rete usando il nameserver del provider per effettuare la scansione per conto nostro, questo
si fa aggiungendo alla sezione options le specifiche per luso di altri server come forwarders,
aggiungendo una sezione del tipo:
options {
...
forwarders {
213.234.128.211;
213.234.132.130;
};
};
ed in questo modo uscir`
a solo una richiesta verso i server che sono dichiarati nella direttiva
forwarders.

9.2.4

La configurazione di un dominio locale.

Vediamo ora come configurare un dominio locale, per la risoluzione dei nomi delle macchine interne di una LAN; per semplicit`
a prenderemo un dominio completamente astratto, earthsea.ea.
Per far questo dovremo definire la relativa zona, dovremo aggiungere quindi al file di configurazione le due sezioni:
//
// Add local zone definitions here.
zone "earthsea.ea" {
type master;
file "/etc/bind/db.earthsea";
};
zone "1.168.192.in-addr.arpa" {
type master;
file "/etc/bind/db.192.168.1";
};

che per una migliore organizzazione pu`o essere sensato mantenere in un file a parte, da includere
dal file principale con il solito comando include. Si noti come sempre si debbano definire due
zone, entrambe di tipo master, una per la risoluzione diretta, relativa al nostro dominio, ed una
per la risoluzione inversa degli indirizzi privati che stiamo usando (nel nostro caso si suppone di
aver usato la rete 192.168.1.0).
Per la risoluzione inversa si usa sempre il nome di dominio speciale in-addr.arpa, riservato
a questo scopo, seguito dal numero IP del quale si vuole effettuare la risoluzione, espresso in
forma dotted decimal in ordine rovesciato. Esso infatti viene interpretato comunque come un
nome di dominio separato da punti, per cui il livello pi`
u generale di risoluzione `e dato dalla parte
pi`
u significativa del numero.
Inoltre nella installazione standard `e prevista la configurazione per la risoluzione in locale
del localhost, il che di norma comporta la presenza dentro il named.conf di default di due
zone del tipo:

504

CAPITOLO 9. IL SERVIZIO DNS


zone "localhost" {
type master;
file "/etc/bind/db.local";
};
zone "127.in-addr.arpa" {
type master;
file "/etc/bind/db.127";
};

anche in questo caso il tipo di zona `e di tipo master in quanto `e sempre il nostro server ad essere
il responsabile della risoluzione di questo nome.
Vediamo allora quale `e il formato dei file di configurazione delle singole zone, che contengono
i dati, detti resource record (in breve RR) che il server deve fornire quando interrogato. Cominciamo col mostrare quello usato per il localhost, che illustra il contenuto generico di uno di
questi file:
$TTL
@

604800
IN

SOA

localhost. root.localhost. (
1
; Serial
604800
; Refresh
86400
; Retry
2419200
; Expire
604800 )
; Negative Cache TTL

;
@
@

IN
IN

NS
A

localhost.
127.0.0.1

I file possono contenere alcune direttive generali, scritte allinizio, che impostano dei valori
di default. Normalmente viene usata solo $TTL, che permette di impostare, per tutti i record
seguenti, il cosiddetto time to live, cio`e il tempo massimo di validit`a del record nella cache di
un nameserver (si ricordi quanto detto al proposito in sez. 9.1.1); nel nostro esempio il tempo `e
stato specificato in secondi, e corrisponde ad una settimana; formati alternativi prevedono luso
dei suffissi H, D, W per indicare rispettivamente ore, giorni e settimane.
Alle direttive seguono poi i vari record, in genere uno per riga, formati da campi separati da
spazi o tabulazioni. Il primo campo deve iniziare dal primo carattere della riga, altrimenti viene
considerato blank. Se necessario si possono specificare i campi su pi`
u righe, racchiudendoli fra
parentesi tonde. Infine si possono inserire commenti ovunque precedendoli con il carattere ";".
Il formato dei vari record `e simile, la sintassi generale `e la seguente:
{<domain>|@|<blank>} [<ttl>] [<class>] <type> <rdata> [<comment>]
Il primo campo indica il nome di dominio che viene ricercato; esso pu`o essere immesso
esplicitamente, ma se il campo `e vuoto (cio`e blank) viene usato lultimo nome immesso; infine
si pu`o usare il carattere speciale "@", che viene automaticamente espanso nel nome della zona
indicato dal comando zone che fa riferimento al file, che viene detta origine. Il campo ttl viene
di norma omesso, in quanto di solito si usa la direttiva $TTL per specificarlo una volta per tutte.
Il campo class indica la classe dei dati del record; nel nostro caso usando indirizzi internet sar`a
sempre IN per tutti i vari tipi di record, esistono altre classi ma non sono usate. Segue il campo
type che deve essere sempre specificato e definisce il tipo di record, infine segue il campo (o i
campi) rdata che contiene i dati da inviare in risposta alle richieste relative al record.
Lordine in cui di dichiarano i record non `e essenziale, ma `e convenzione specificare sempre
per primo un SOA che dichiara che il nostro server `e autoritativo per quel dominio (di nuovo si
ricordi quanto detto in sez. 9.1.1), dato che non ce ne pu`o essere pi`
u di uno per file. Questo
significa anche la necessit`
a di un file separato per ogni dominio che si vuole definire. Si prosegue
poi con la dichiarazione dei record di tipo NS che definiscono i nameserver per il dominio in
questione, a cui fanno seguito gli altri tipi di record.

9.2. LA GESTIONE DI UN SERVER DNS

505

La prima colonna di un record SOA `e il nome del dominio per il quale si dichiara di avere
autorit`a, nel caso in esempio si `e usato il carattere speciale @, altrimenti si sarebbe dovuto
specificare il nome del dominio completo nella forma localhost., con il "." finale in quanto
i nomi vanno dichiarati in forma assoluta (facendo riferimento alla radice che `e appunto ".")
segue la classe IN ed il tipo SOA. Nel caso di un record SOA i dati prevedono il server che far`
a da
nameserver principale per il dominio, la e-mail del responsabile, nella forma solita ma con un
"." al posto della "@" (nel caso la posta andr`a a root@localhost).
Le restanti informazioni, inserite fra parentesi per poterle dividere su pi`
u righe, sono usate
nella replicazione dei dati fra nameserver primari e secondari: una funzionalit`a avanzata del
protocollo che consente di mantenere delle repliche automatizzate dei dati di un nameserver,
aggiornate secondo quanto stabilito da questi parametri, su un server di riserva (detto appunto
secondario) che entra in azione solo quando il primario fallisce. Di questa lunica da modificare
`e quella identificata come serial che indica un numero seriale (crescente) da aggiornare tutte
le volte che si effettua una modifica alla zona.
Tornando allesempio, i due record successivi dichiarano rispettivamente (il record NS) la
macchina nel dominio che fa da nameserver (nel caso quella identificata dal nome del dominio
stesso) e lindirizzo del dominio (il record A).
Vista la particolarit`
a del dominio localhost vediamo un esempio pi`
u significativo, su come
impostare un nostro dominio locale per risolvere i nomi della macchine di una rete locale. Nel caso
lesempio `e tratto dalla mia configurazione della rete di casa. Si `e scelto il dominio earthsea.ea,
i cui dati sono mantenuti nel file db.earthsea il cui contenuto `e:
$TTL 100000
@ IN SOA gont.earthsea.ea. piccardi.gont.earthsea.ea. (
2
; serial
10800
; refresh after 3 hour
3600
; retry after 1 hour
604800 ; expire after 1 week
86400 ) ; minimum TTL 1 day
;
; Name server
;
@
IN
NS
gont.earthsea.ea.
;
; Mail server
;
MX
10 gont
MX
20 oppish
;
; Indirizzi
;
gont
IN
A
192.168.1.1
ns
IN
CNAME
gont
www
IN
CNAME
gont
hogen
IN
A
192.168.1.2
lorbaner
IN
A
192.168.1.17
karegoat
IN
A
192.168.1.19
oppish
IN
A
192.168.1.168
localhost
IN
A
127.0.0.1

Di nuovo si `e cominciato con un record di tipo SOA che dichiara lautorit`a per earthsea.ea,
in questo caso il nameserver `e la macchina gont.earhsea.ea., anchessa identificata dal suo
nome di dominio assoluto. Si tenga conto che se non si usa il nome assoluto al nome viene
sempre aggiunta lorigine della zona, per cui o si usa questa notazione o si specifica il nameserver
semplicemente con gont. Lamministratore della macchina sono io per cui la posta sar`a inviata
a me con lindirizzo [email protected].

506

CAPITOLO 9. IL SERVIZIO DNS

Il secondo record definisce il nameserver, cio`e gont.earthsea.ea.: si noti che di nuovo,


come per il precedente, non lo si `e definito con lindirizzo IP ad esso corrispondente; tutto
quello che occorre infatti `e usare un nome che corrisponda ad un record di tipo A. Nel caso si `e
specificato un solo nameserver, ma se ne possono definire pi`
u di uno; linformazione sar`a passata
nelle richieste di risoluzione, che potranno essere rivolte ad uno qualunque dei server della lista.
Il record successivo, di tipo MX, serve a definire a quale macchina viene inviata la posta per il
dominio earthsea.ea, di nuovo si `e specificato gont, ma stavolta, per dare un esempio di come
si possono scrivere le cose in maniera pi`
u compatta, non si `e dichiarato il dominio (che essendo
blank corrisponde a quello precedente, e cio`e sempre earthsea.ea, si `e tralasciata la classe IN
che essendo quella di default pu`
o non essere specificata esplicitamente, e si `e indicato gont senza
usare il nome assoluto. Il valore inserito 10 inserito prima del nome indica la priorit`a del server
di posta, `e possibile infatti specificare pi`
u di un server di posta, con valori diversi, in modo che
verr`a sempre contattato per primo quello con il valore pi`
u basso, passando ai successivi solo in
caso di fallimento dei precedenti. Si tenga presente che anche questi record `e opportuno facciano
riferimento a nomi associati a record di tipo A.
Infine si sono inseriti i vari record di tipo A contenenti gli indirizzi, ed i record di tipo CNAME
che definiscono dei nomi alternativi per le stesse macchine. Per quanto visto finora il formato di
questi record `e evidente.
Una volta definito il nostro dominio occorre anche definire la risoluzione inversa, questo `e
fatto tramite il file db.192.168.1, il cui contenuto `e il seguente:
$TTL 100000
@ IN SOA gont.earthsea.ea. piccardi.gont.earthsea.ea. (
2
; serial
10800
; refresh after 3 hour
3600
; retry after 1 hour
604800 ; expire after 1 week
86400 ) ; minimum TTL 1 day
;
; Name server
;
@
IN
NS
gont.earthsea.ea.
;
; Indirizzi
;
1
IN
PTR
gont.earthsea.ea.
2
IN
PTR
hogen.earthsea.ea.
17
IN
PTR
karegoat.earthsea.ea.
19
IN
PTR
lorbaner.earthsea.ea.
168
IN
PTR
oppish.earthsea.ea.

Di nuovo si comincia con un record di tipo SOA, sostanzialmente identico al precedente dato
che nameserver e amministratore sono gli stessi. Si deve definire anche il nameserver per questo
dominio inverso, che ovviamente `e sempre gont.earthsea.ea. (qui specificare gont non avrebbe
funzionato, lindirizzo assoluto invece funziona in quanto il dominio `e stato gi`a definito prima).
Seguono infine i record di tipo PTR che contengono il nome delle singole macchine, in questo
caso per`o gli indirizzi devono corrispondere ad un solo nome, quello canonico e contrariamente
a prima non si possono associare pi`
u nomi allo stesso indirizzo. Anche se `e possibile associare
due nomi allo stesso IP molti sistemi non sono preparati a questa evenienza, che `e bene pertanto
escludere onde evitare comportamenti inattesi.
Completati i nostri file possiamo riavviare il servizio, e controllare i risultati. Al solito usiamo
dig per interrogare il nostro server:
[piccardi@gont piccardi]$ dig any earthsea.ea
; <<>> DiG 9.2.2 <<>> any earthsea.ea

9.2. LA GESTIONE DI UN SERVER DNS


;;
;;
;;
;;

507

global options: printcmd


Got answer:
->>HEADER<<- opcode: QUERY, status: NOERROR, id: 56071
flags: qr aa rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 1, ADDITIONAL: 1

;; QUESTION SECTION:
;earthsea.ea.

IN

ANY

;; ANSWER SECTION:
earthsea.ea.
100000 IN
NS
earthsea.ea.
100000 IN
SOA
.earthsea.ea. 2 10800 3600 604800 86400

gont.earthsea.ea.
gont.earthsea.ea. piccardi.gont

;; AUTHORITY SECTION:
earthsea.ea.

100000

IN

NS

gont.earthsea.ea.

;; ADDITIONAL SECTION:
gont.earthsea.ea.

100000

IN

192.168.1.1

;;
;;
;;
;;

Query time: 16 msec


SERVER: 192.168.1.1#53(192.168.1.1)
WHEN: Wed Mar 26 21:41:06 2003
MSG SIZE rcvd: 123

ed otteniamo il risultato voluto, adesso possiamo provare a risolvere unaltra macchina:


[piccardi@gont piccardi]$ dig lorbaner.earthsea.ea
; <<>> DiG 9.2.2 <<>> lorbaner.earthsea.ea
;; global options: printcmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 24592
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 1
;; QUESTION SECTION:
;lorbaner.earthsea.ea.

IN

;; ANSWER SECTION:
lorbaner.earthsea.ea.

100000

IN

192.168.1.17

;; AUTHORITY SECTION:
earthsea.ea.

100000

IN

NS

gont.earthsea.ea.

;; ADDITIONAL SECTION:
gont.earthsea.ea.

100000

IN

192.168.1.1

;;
;;
;;
;;

Query time: 2 msec


SERVER: 192.168.1.1#53(192.168.1.1)
WHEN: Wed Mar 26 21:42:36 2003
MSG SIZE rcvd: 89

ed infine proviamo con la risoluzione inversa, ricordiamoci che in questo caso dig vuole lopzione
-x, ed otterremo:
[piccardi@gont anime]$ dig -x 192.168.1.17
; <<>> DiG 9.2.2 <<>> -x 192.168.1.17
;; global options: printcmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 30928
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 1
;; QUESTION SECTION:

508

CAPITOLO 9. IL SERVIZIO DNS


;17.1.168.192.in-addr.arpa.

IN

PTR

;; ANSWER SECTION:
17.1.168.192.in-addr.arpa. 100000 IN

PTR

karegoat.earthsea.ea.

;; AUTHORITY SECTION:
1.168.192.in-addr.arpa. 100000

IN

NS

gont.earthsea.ea.

;; ADDITIONAL SECTION:
gont.earthsea.ea.

IN

192.168.1.1

;;
;;
;;
;;

100000

Query time: 2 msec


SERVER: 192.168.1.1#53(192.168.1.1)
WHEN: Wed Mar 26 21:52:09 2003
MSG SIZE rcvd: 112

e di nuovo `e tutto a posto.

9.3

Configurazioni avanzate

Tratteremo in questa sezione le configurazioni pi`


u avanzate di BIND, come limpostazione di
eventuali secondari, la gestione delle delegazioni, e le varie tipologie di controllo degli accessi
disponibili nel programma. Chiuderemo la sezione con un breve accenno alla configurazione
della versione precedente (bind 4) del demone.

9.3.1

La delegazione di una zona

Come accennato una delle caratteristiche fondamentali del funzionamento del DNS `e la capacit`a
di delegare la risoluzione di parti dellalbero dei nomi ad altri server, in modo da distribuire sia
il carico di rete che quello amministrativo.
Il problema deve ovviamente essere affrontato da due lati, quello del server DNS che esegue la
delega, e quello del server che viene delegato. Per questultimo la configurazione `e semplicemente
quella gi`a illustrata in sez. 9.2.4, in cui invece di usare un dominio interno per la propria zona
locale senza curarsi di cosa pu`
o stare al di sopra, se ne usa uno che ci viene delegato da un altro
server DNS; se per esempio si tratta di truelite.it, si avr`a in named.conf una voce del tipo:
zone "truelite.it" {
type master;
file "/etc/bind/db.truelite.it";
allow-transfer { 62.94.0.2; 62.48.33.131; 62.48.33.132; };
};

dove si `e utilizzata la direttiva allow-transfer per indicare gli indirizzi IP dei server DNS
secondari autorizzati (vedi sez. 9.3.2).
In questo caso si manterranno i dati della zona nel file /etc/bind/db.truelite.it nello
stesso formato usato per la zona locale vista in sez. 9.2.4, con lunica differenza che in questo
caso i nomi faranno riferimento ad un dominio pubblico anziche ad uno privato,12 il cui utilizzo
`e possibile in quanto il server DNS di livello superiore, cio`e quello che gestisce i domini .it, ha
delegato a noi la gestione della zona truelite.it.
La configurazione effettiva della delega di una zona `e pertanto da eseguire nel DNS che
gestisce il dominio di livello superiore rispetto a quello che si intende delegare. Supponiamo
allora di avere il controllo del dominio .trl e voler delegare le zone fi.trl e bz.trl; in questo
caso il file di zona relativo a .trl sar`
a qualcosa del tipo:
12

cosa che dal punto di vista del funzionamento di BIND `e del tutto insignificante

9.4. LE ESTENSIONI DNSSEC


$TTL
@

604800
IN

SOA

;
ns
@
ns-fi
fi
ns-bz
bz

IN
IN
IN
IN
IN
IN

A
NS
A
NS
A
NS

509

ns.trl. sistemi.truelite.it. (
2006061601
; Serial
604800
; Refresh
86400
; Retry
2419200
; Expire
604800 )
; Negative Cache TTL
192.168.1.2
ns
192.168.1.2
ns-fi
192.168.10.2
ns-bz

Si noti allora come qui si siano anzitutto definiti i record A per i nomi ns-fi e ns-bz allinterno
della zona .trl, relativi agli indirizzi dei due server a cui si vuole delegare rispettivamente la
gestione dei domini fi.trl e bz.trl.13 Questo perche la delega si esegue semplicemente usando
un record di tipo NS (quello che appunto fornisce lindicazione di qual`e il DNS di una certa
zona) che vuole come dato il nome della macchina, che ovviamente deve poter essere risolto in un
indirizzo IP allinterno della zona stessa. Una eseguita questa impostazione baster`a configurare
le due zone fi.trl e bz.trl sui server DNS indicati dai, ed il gioco `e fatto.

9.3.2

La gestione di un secondario

Una delle caratteristiche del DNS `e quella di consentire in maniera naturale la distribuzione
di carico e la ridondanza attraverso la possibilit`a di gestire dei DNS secondari cui trasferire in
maniera automatica tutte le informazioni di una certa zona.
La configurazione di server DNS per fare da secondario `e anchessa molto semplice, si tratta
semplicemente di dichiarare una zona di tipo slave, inserendo in named.conf una voce analoga
alla seguente:
zone "truelite.it" {
type slave;
file "db.truelite.it";
masters {
62.48.34.25;
};
};

dove la direttiva file indica il file su cui verranno scritti i dati della zona (direttamente da
BIND, che li otterr`
a dal primario) e la direttiva masters consente di indicare una lista di server
DNS da cui ottenere i dati della relativa zona.
Ovviamente perche questo funzioni occorre che il server che opera come DNS primario consenta il trasferimento dei file di zona. Questo viene consentito di default verso tutti, ma lo si
pu`o restringere ad un elenco di server, come illustrato nellesempio di sez. 9.3.1.

9.4

Le estensioni DNSSEC

Tratteremo in questa sezione le estensioni di sicurezza del protocollo DNS, che sono state adottate
per risolvere alcuni dei problemi emersi negli anni. Dopo una introduzione generale prenderemo
in esame modalit`
a di gestione e configurazioni necessarie per implementarle in un server DNS.
13

il fatto che la delega per fi.trl resti sulla stessa macchina `e del tutto irrilevante, ci vorr`
a comunque una
zona separata da configurare come visto in precedenza.

510

9.4.1

CAPITOLO 9. IL SERVIZIO DNS

Introduzione al DNSSEC

Il protocollo DNS, nonostante il suo ruolo essenziale per il funzionamento di Internet, `e da


sempre soggetto ad alcuni problemi di sicurezza sostanzialmente originati dal fatto che tutta
linformazione fornita dal servizio non `e in alcun modo autenticata.

9.4.2

La gestione delle chiavi

Per creazione

Appendice A

Sinossi dei comandi principali


A.1

Comandi per la gestione dei file

Comando
ls
mv

cp

rm
ln

Significato e sintassi
Mostra il contenuto di una directory.
ls [OPTION]...[FILE]...
Sposta e rinomina i file.
mv [OPTION]... SOURCE DEST
mv [OPTION]... SOURCE... DIRECTORY
Copia i file.
cp [OPTION]... SOURCE DEST
cp [OPTION]... SOURCE... DIRECTORY
Cancella file e directory.
rm [OPTION]...[FILE]...
Crea un link.
ln [OPTION]... TARGET [LINK_NAME]
ln [OPTION]... TARGET... DIRECTORY

Tabella A.1: Principali comandi di base per i file.

Comando
cat
less
tail
head

Significato e sintassi
Concatena i file stampandoli sullo standard output.
cat [OPTION] [FILE]...
Visualizza i file stampandoli sullo standard output.
less [FILE]...
Visualizza lultima parte di un file.
tail [OPTION] [FILE]...
Visualizza la prima parte di un file.
head [OPTION] [FILE]...

Tabella A.2: Principali comandi per il contenuto dei file.

511

512

A.2

APPENDICE A. SINOSSI DEI COMANDI PRINCIPALI

Comandi per la gestione dei processi


Comando
ps
top
kill
killall
nice
renice

Significato e sintassi
Riporta lelenco dei processi in esecuzione.
ps [OPTIONS]
Mostra continuamente processi in esecuzione.
top [OPTIONS]...
Manda un segnale ad un processo.
kill [ -signal | -s signal ] pid ...
Manda un segnale ad un processo per nome.
killall [OPTIONS] process
Lancia un programma con priorit`
a modificata.
nice [OPTION] [COMMAND [ARG]...
Cambia la priorit`
a di un processo.
renice PRIO [process]

Tabella A.3: Principali comandi per la gestione dei processi.

A.3

I permessi dei file


Nome
u
g
o
r
w
x

Significato e sintassi
Privilegi dellutente.
u sta per user
Privilegi del gruppo.
g sta per group
Privilegi di tutti gli altri.
o sta per other
Permessi di lettura.
r sta per read
Permessi di scrittura.
w sta per write
Permessi di esecuzione.
x sta per execute

Tabella A.4: I permessi dei file.

Comando
chmod
chown
chgrp

Significato e sintassi
Cambia i permessi di accesso ai file.
chmod [OPTIONS] PERM [FILE]...
Cambia proprietari e gruppi ai file.
chown [OPTIONS] USER [FILE]...
Cambia il gruppo proprietario ai file.
chgrp [OPTIONS] GROUP [FILE]...

Tabella A.5: Principali comandi per la gestione dei permessi dei file.

A.4

Comandi per la localizzazione dei file

A.5. COMANDI PER LA DOCUMENTAZIONE


Comando
locate

Significato e sintassi
Elenca i file del database che si adattano col nome cercato.
locate [OPTIONS] file
Cerca i file di tipo binario, sorgente e pagina di manuale per un comando.
whereis [OPTIONS] file
Individua la posizione di un comando.
which [OPTION] file
Cerca file in una gerarchia di directory.
find [PATH] espressione
Aggiorna il database con lelenco dei file presenti sul sistema.
updatedb [OPTIONS]

whereis
which
find
updatedb

Tabella A.6: Principali comandi per la localizzazione dei file.

A.5

Comandi per la documentazione


Comando
man
whatis
apropos
comando -help

Significato e sintassi
` uninterfaccia ai manuali di riferimento in linea.
E
man [OPTIONS] file
Mostra le descrizioni delle pagine di manuale.
whatis [OPTIONS] nome
Ricerca nei nomi e nelle descrizioni delle pagine di manuale.
apropos [OPTION] parola chiave
Mostra le opzioni di un comando.
comando -help

Tabella A.7: Principali comandi per la documentazione.

A.6

Comandi per la gestione dei tempi


Comando
date
hwclock

Significato e sintassi
Mostra o configura data e orario.
date [OPTION]... [FORMAT]
Mostra e configura lorologio hardware.
hwclock [OPTIONS]

Tabella A.8: Principali comandi per la gestione dei tempi.

A.7

Comandi di archiviazione e compressione


Comando
tar
gzip
bzip2

Significato e sintassi
Programma di archiviazione.
tar [OPTION] file1 file2 ..
Comprime e decomprime file.
gzip [OPTIONS] file
Programma di archiviazione.
bzip2 [OPTION] file1 file2 ..

Tabella A.9: Principali comandi per di archiviazione.

513

514

A.8

APPENDICE A. SINOSSI DEI COMANDI PRINCIPALI

Gestione dei pacchetti


Comando
dpkg
apt-get
aptitute
rpm
yum

Significato e sintassi
Gestore pacchetti di Debian.
dpkg [OPTIONS] action
Gestore sistema pacchetti di Debian.
apt-get [OPTIONS]
Gestore sistema pacchetti di Debian.
apt-get [OPTIONS]
Gestore pacchetti di RedHat.
rpm [OPTIONS]
Gestore sistema pacchetti di RedHat.
yum [OPTIONS]

Tabella A.10: Principali comandi per di archiviazione.

A.9

I comandi diagnostici
Comando
ping
traceroute
netstat

Significato e sintassi
Invia ICMP ECHO REQUEST agli host sulla rete .
ping [OPTIONS] host
Mostra i passaggi da un host ad un altro.
traceroute [OPTIONS] host
Mostra le connessioni sulla rete.
netstat [OPTIONS]

Tabella A.11: Principali comandi diagnostici.

A.10

I client dei servizi base


Comando
telnet
ftp
finger
whois

Significato e sintassi
Interfaccia utente al protocollo Telnet.
telnet [OPTION] host porta
Client del protocollo File Transfer Protocol.
ftp [OPTIONS] host porta
Client per il controllo delle informazioni degli utenti.
finger [OPTION] user
Client per il servizio di whois.
whois [OPTIONS] keyword

Tabella A.12: Principali client dei servizi base.

Appendice B

Indice degli argomenti per LPI


B.1

Argomenti Esame LPI 101

Questo `e il primo dei due esami necessari al conseguimento della certificazione LPI livello 1 (LPIC
1). Nella tabella seguente sono riportati i titoli degli obiettivi coperti dal suddetto esame, ed i
relativi riferimenti sul testo.
Topic
101.1
101.2
101.3
102.1
102.2
102.3
102.4
102.5
103.1
103.2
103.3
103.4
103.5
103.6
103.7
103.8
104.1
104.2
104.3
104.4
104.5
104.6
104.7

Titolo
Determine and configure hardware settings
Boot the system
Change runlevels and shutdown or reboot
system
Design hard disk layout
Install a boot manager
Manage shared libraries
Use Debian package management
Use RPM and YUM package management
Work on the command line
Process text streams using filters
Perform basic file management
Use streams, pipes and redirects
Create, monitor and kill processes
Modify process execution priorities
Search text files using regular expressions
Perform basic file editing operations using
vi
Create partitions and filesystems
Maintain the integrity of filesystems
Control mounting and unmounting of
filesystems
Manage disk quotas
Manage file permissions and ownership
Create and change hard and symbolic
links
Find system files and place files in the
correct location

515

Riferimento
sez. 5.1.1, 5.1.3, 5.2.5 e 5.4
sez. 1.1.2, 1.3.1 e 5.3.1
sez. 5.3.5 e 5.3.6
sez.
sez.
sez.
sez.
sez.
sez.
sez.
sez.
sez.
sez.
sez.
sez.
sez.

1.2.3 e 5.1.2
5.3.3 e 5.3.4
3.1.2
4.2.3
4.2.2
2.1.1, 2.1.3, 2.2.1
2.2.3, 2.2.4, 2.2.5
1.2.2, 2.1.3, 2.2.2
2.1.4 e 2.4.1
1.3 e 2.1.2
1.3.4
2.2.5
2.3.3

sez. 5.1.2, 5.1.4 e 5.1.7


sez. 5.1.3 e 5.1.5
sez. 5.1.3
sez. 6.4
sez. 1.4
sez. 1.2.2
sez. 1.2.3, 2.1.3 e 2.2.2.

516

B.2

APPENDICE B. INDICE DEGLI ARGOMENTI PER LPI

Argomenti Esame LPI 102

Questo `e il secondo dei due esami necessari al conseguimento della certificazione LPI livello 1
(LPIC 1). Nella tabella seguente sono riportati i titoli degli obiettivi coperti dal suddetto esame,
ed i relativi riferimenti sul testo.
Topic
105.1
105.2
105.3
106.1
106.2
106.3
107.1

107.3
108.1
108.2
108.3

Titolo
Customize and use the shell environment
Customize or write simple scripts
SQL data management
Install and configure X11
Setup a display manager
Accessibility
Manage user and group accounts and
related system files
Automate system administration tasks by
scheduling jobs
Localisation and internationalisation
Maintain system time
System logging
Mail Tranfer Agent (MTA) basics

108.4
109.1
109.2
109.3
109.4
110.1
110.2
110.3

Manage printers and printing


Fundamentals of internet protocols
Basic network configuration
Basic network troubleshooting
Configure client side DNS
Perform security administration tasks
Setup host security
Securing data with encryption

107.2

B.3

Riferimento
sez. 2.1.3 e 2.1.6
sez. 2.1.3 e 2.1.5
sez. 4.4.4
sez. 3.3.1, 3.3.2
sez. 3.3.3
sez.? DA FARE !
sez. 4.3.1, 4.3.2, 4.3.3
sez. 3.2.1
sez. 3.1.4 e 2.1.3
sez. 2.4.3 e 8.1.4
sez. 3.2.3 e 3.2.4
sez.? DA FARE ! o capire
che metterci ...
sez. 3.4
sez. 7.1 e 7.2
sez. 7.3
sez. 7.6
sez. 7.4
sez. 7.6.3, 4.3.5
sez. 8.1.5
sez. 8.3, DA FARE gpg

Argomenti Esame LPI 201

Questo `e il primo dei due esami necessari al conseguimento della certificazione LPI livello 2 (LPIC
2). Nella tabella seguente sono riportati i titoli degli obiettivi coperti dal suddetto esame, ed i
relativi riferimenti sul testo.
Topic
201.1
201.2
201.3
201.4
201.5
202.1
202.2
203.1
203.2

Titolo
Kernel Components
Compiling a kernel
Patching a kernel
Customise, build and install a custom
kernel and kernel modules
Manage/Query kernel and kernel modules
at runtime
Customising system startup and boot
processes
System recovery
Operating the Linux filesystem
Maintaining a Linux filesystem

Riferimento
sez. 5.2.1
sez. 5.2.3 e 5.2.4
sez. 5.2.2
sez. 5.2.3
sez. 5.2.5
sez. 5.3.5 e 5.3.6
sez. 5.1.5, 5.3.4 e 5.3.6
sez. 5.1.3 e 5.1.7
sez. 5.1.4 e 5.1.5

B.4. ARGOMENTI ESAME LPI 202


203.3
203.4
204.1
204.2
204.3
205.1

B.4

Creating and configuring filesystem options


udev Device Management
Configuring RAID
Adjusting Storage Device Access
Logical Volume Manager
Basic networking configuration

205.2

Advanced Network Configuration and


Troubleshooting

205.3

Troubleshooting network issues

205.4
206.1
206.2
207.1
207.2
207.3

Notify users on system-related issues


Make and install programs from source
Backup operations
Basic DNS server configuration
Create and maintain DNS zones
Securing a DNS server

517
sez. 5.1.6 e 5.1.7
sez. 5.4.5
sez. 6.1
sez. 6.3
sez. 6.2
sez. 7.3, sez. 7.6, sez. 7.5.4,
sez. 7.5.5
sez. 7.3, sez. 7.6, sez. 7.7,
(altro su La gestione della
sicurezza con GNU/Linux)
sez. 7.3, sez. 7.4, sez. 7.6,
sez. 8.1.5, sez. 9.1.3
sez. 5.3.6 e 4.3.5
sez. 4.2.1
sez. 4.1
sez. 9.2
sez. 9.2.4, sez. 9.3
sez. 9.4

Argomenti Esame LPI 202

Questo `e il secondo dei due esami necessari al conseguimento della certificazione LPI livello 2
(LPIC 2). Nella tabella seguente sono riportati i titoli degli obiettivi coperti dal suddetto esame,
ed i relativi riferimenti sul testo.
Topic
208.1
208.2
208.3
209.1
209.2
210.1
210.2
210.3
211.1
211.2
211.3
212.1
212.2
212.3
212.4
212.5
213.1
213.2
213.3
213.4

Titolo
Implementing a web server
Maintaining a web server
Implementing a proxy server
SAMBA Server Configuration
NFS Server Configuration
DHCP configuration
PAM authentication
LDAP client usage
Using e-mail servers
Managing Local E-Mail Delivery
Managing Remote E-Mail Delivery
Configuring a router
Securing FTP servers
Secure shell (SSH)
TCP Wrapper
Security tasks
Identifying boot stages and troubleshooting bootloaders
General troubleshooting
Troubleshooting system resources
Troubleshooting environment configurations

Riferimento
sez.
sez.
sez.
sez.
sez.
sez.
sez.
sez.
sez.
sez.
sez.
sez.
sez.
sez.
sez.
sez.
sez.
sez.
sez.
sez.

518

APPENDICE B. INDICE DEGLI ARGOMENTI PER LPI

Appendice C

Percorsi di studio per gli esami LPI


C.1

Percorso di studio LPI 101

Il percorso di studio consigliato per gli argomenti relativi allesame LPI 101 `e il seguente. Si
tenga conto che il percorso non segue lordine degli argomenti elencati nelle pagine di descrizione
degli obiettivi riportati negli indici di sez. B.1.
Capitolo 1, tutto, tralasciare eventualmente la panoramica di sez. 1.1.
Capitolo 2:

da sez. 2.1.1 a sez. 2.1.4,


sez. 2.2 tutta,
sez. 2.3.3,
sez. 2.4.1;

Capitolo 3:
sez. 3.1.2, si legga eventualmente lintroduzione di sez. 3.1.1.
Capitolo 4:
sez. 4.1.2,
sez. 4.2 tutta;
Capitolo 5:
sez. 5.1 tutta,
sez. 5.3 tutta, sorvolare su sez 5.3.3,
sez. 5.4 tutta, tralasciare eventualmente i dettagli su 5.4.2, 5.4.3 e 5.4.4.

C.2

Percorso di studio LPI 102

Il percorso di studio consigliato per gli argomenti relativi allesame LPI 102 `e il seguente. Si
tenga conto che il percorso non segue lordine degli argomenti elencati nelle pagine di descrizione
degli obiettivi riportati negli indici di sez. B.2.
Capitolo 2:
ripassare sez. 2.1.3, ed eventualmente sez. 2.1.4,
approfondire su sez. 2.1.5 e sez. 2.1.6,
519

520

APPENDICE C. PERCORSI DI STUDIO PER GLI ESAMI LPI


per la gestione dellorario di sistema sez. 2.4.3;

Capitolo 3:
tutto a partire da sez. 3.1.4, si legga eventualmente lintroduzione di sez. 3.1.1;
Capitolo 4:
tutta sez. 4.3,
sez. 4.4.4;
Capitolo 7:
tutto tranne, sez. 7.6.4, sez. 7.6.5, sez. 7.7.3 e sez. 7.5,
se pratici di reti e protocolli si pu`o sorvolare su sez. 7.1 e sez. 7.2;
Capitolo 8:
sez. 8.1,
sez. 8.3, eccetto sez. 8.3.4.
Non sono ancora trattati direttamente in questo testo gli argomenti 105.3 (SQL data management), 106.3 (Accessibility), 108.3 (Mail Tranfer Agent (MTA) basics) e la parte dellargomento
110.3 (Securing data with encryption) riguardante GnuPG.

C.3

Percorso di studio LPI 201

Il percorso di studio consigliato per gli argomenti relativi allesame LPI 201 `e il seguente. Si
tenga conto che il percorso non segue lordine degli argomenti elencati nelle pagine di descrizione
degli obiettivi riportati negli indici di sez. B.3.
(da fare)

C.4

Percorso di studio LPI 202

Il percorso di studio consigliato per gli argomenti relativi allesame LPI 202 `e il seguente. Si
tenga conto che il percorso non segue lordine degli argomenti elencati nelle pagine di descrizione
degli obiettivi riportati negli indici di sez. B.4.
(da fare)

Appendice D

Ringraziamenti
Si ringraziano coloro che han permesso la realizzazione di queste dispense contribuendo al
finanziamento della loro scrittura:
la Scuola per la Formazione Professionale Luigi Einaudi di Bolzano
il Fondo Sociale Europeo nella realizzazione di corsi finanziati
LiCI (http://www.lici.it) per il supporto e ladozione come libro di testo.
Si ringraziano inoltre per laiuto nella stesura e nella revisione del testo:
gli studenti del master Free Software Upgrade per il grande lavoro di revisione effettuato

521

522

APPENDICE D. RINGRAZIAMENTI

Appendice E

GNU Free Documentation License


Version 1.1, March 2000
c 2000 Free Software Foundation, Inc.
Copyright
59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
Everyone is permitted to copy and distribute verbatim copies of this license document, but
changing it is not allowed.

Preamble
The purpose of this License is to make a manual, textbook, or other written document free
in the sense of freedom: to assure everyone the effective freedom to copy and redistribute it,
with or without modifying it, either commercially or noncommercially. Secondarily, this License
preserves for the author and publisher a way to get credit for their work, while not being
considered responsible for modifications made by others.
This License is a kind of copyleft, which means that derivative works of the document must
themselves be free in the same sense. It complements the GNU General Public License, which
is a copyleft license designed for free software.
We have designed this License in order to use it for manuals for free software, because free
software needs free documentation: a free program should come with manuals providing the
same freedoms that the software does. But this License is not limited to software manuals; it
can be used for any textual work, regardless of subject matter or whether it is published as a
printed book. We recommend this License principally for works whose purpose is instruction or
reference.

E.1

Applicability and Definitions

This License applies to any manual or other work that contains a notice placed by the copyright
holder saying it can be distributed under the terms of this License. The Document, below,
refers to any such manual or work. Any member of the public is a licensee, and is addressed as
you.
A Modified Version of the Document means any work containing the Document or a portion
of it, either copied verbatim, or with modifications and/or translated into another language.
A Secondary Section is a named appendix or a front-matter section of the Document
that deals exclusively with the relationship of the publishers or authors of the Document to
the Documents overall subject (or to related matters) and contains nothing that could fall
directly within that overall subject. (For example, if the Document is in part a textbook of
mathematics, a Secondary Section may not explain any mathematics.) The relationship could be
523

524

APPENDICE E. GNU FREE DOCUMENTATION LICENSE

a matter of historical connection with the subject or with related matters, or of legal, commercial,
philosophical, ethical or political position regarding them.
The Invariant Sections are certain Secondary Sections whose titles are designated, as being
those of Invariant Sections, in the notice that says that the Document is released under this
License.
The Cover Texts are certain short passages of text that are listed, as Front-Cover Texts or
Back-Cover Texts, in the notice that says that the Document is released under this License.
A Transparent copy of the Document means a machine-readable copy, represented in a
format whose specification is available to the general public, whose contents can be viewed
and edited directly and straightforwardly with generic text editors or (for images composed
of pixels) generic paint programs or (for drawings) some widely available drawing editor, and
that is suitable for input to text formatters or for automatic translation to a variety of formats
suitable for input to text formatters. A copy made in an otherwise Transparent file format whose
markup has been designed to thwart or discourage subsequent modification by readers is not
Transparent. A copy that is not Transparent is called Opaque.
Examples of suitable formats for Transparent copies include plain ASCII without markup,
Texinfo input format, LATEX input format, SGML or XML using a publicly available DTD,
and standard-conforming simple HTML designed for human modification. Opaque formats
include PostScript, PDF, proprietary formats that can be read and edited only by proprietary
word processors, SGML or XML for which the DTD and/or processing tools are not generally
available, and the machine-generated HTML produced by some word processors for output
purposes only.
The Title Page means, for a printed book, the title page itself, plus such following pages
as are needed to hold, legibly, the material this License requires to appear in the title page. For
works in formats which do not have any title page as such, Title Page means the text near the
most prominent appearance of the works title, preceding the beginning of the body of the text.

E.2

Verbatim Copying

You may copy and distribute the Document in any medium, either commercially or noncommercially, provided that this License, the copyright notices, and the license notice saying this
License applies to the Document are reproduced in all copies, and that you add no other conditions whatsoever to those of this License. You may not use technical measures to obstruct or
control the reading or further copying of the copies you make or distribute. However, you may
accept compensation in exchange for copies. If you distribute a large enough number of copies
you must also follow the conditions in section 3.
You may also lend copies, under the same conditions stated above, and you may publicly
display copies.

E.3

Copying in Quantity

If you publish printed copies of the Document numbering more than 100, and the Documents
license notice requires Cover Texts, you must enclose the copies in covers that carry, clearly and
legibly, all these Cover Texts: Front-Cover Texts on the front cover, and Back-Cover Texts on
the back cover. Both covers must also clearly and legibly identify you as the publisher of these
copies. The front cover must present the full title with all words of the title equally prominent
and visible. You may add other material on the covers in addition. Copying with changes limited
to the covers, as long as they preserve the title of the Document and satisfy these conditions,
can be treated as verbatim copying in other respects.

E.4. MODIFICATIONS

525

If the required texts for either cover are too voluminous to fit legibly, you should put the first
ones listed (as many as fit reasonably) on the actual cover, and continue the rest onto adjacent
pages.
If you publish or distribute Opaque copies of the Document numbering more than 100, you
must either include a machine-readable Transparent copy along with each Opaque copy, or
state in or with each Opaque copy a publicly-accessible computer-network location containing a
complete Transparent copy of the Document, free of added material, which the general networkusing public has access to download anonymously at no charge using public-standard network
protocols. If you use the latter option, you must take reasonably prudent steps, when you begin
distribution of Opaque copies in quantity, to ensure that this Transparent copy will remain thus
accessible at the stated location until at least one year after the last time you distribute an
Opaque copy (directly or through your agents or retailers) of that edition to the public.
It is requested, but not required, that you contact the authors of the Document well before
redistributing any large number of copies, to give them a chance to provide you with an updated
version of the Document.

E.4

Modifications

You may copy and distribute a Modified Version of the Document under the conditions of
sections 2 and 3 above, provided that you release the Modified Version under precisely this
License, with the Modified Version filling the role of the Document, thus licensing distribution
and modification of the Modified Version to whoever possesses a copy of it. In addition, you
must do these things in the Modified Version:
Use in the Title Page (and on the covers, if any) a title distinct from that of the Document,
and from those of previous versions (which should, if there were any, be listed in the History
section of the Document). You may use the same title as a previous version if the original
publisher of that version gives permission.
List on the Title Page, as authors, one or more persons or entities responsible for authorship
of the modifications in the Modified Version, together with at least five of the principal
authors of the Document (all of its principal authors, if it has less than five).
State on the Title page the name of the publisher of the Modified Version, as the publisher.
Preserve all the copyright notices of the Document.
Add an appropriate copyright notice for your modifications adjacent to the other copyright
notices.
Include, immediately after the copyright notices, a license notice giving the public permission to use the Modified Version under the terms of this License, in the form shown in the
Addendum below.
Preserve in that license notice the full lists of Invariant Sections and required Cover Texts
given in the Documents license notice.
Include an unaltered copy of this License.
Preserve the section entitled History, and its title, and add to it an item stating at least
the title, year, new authors, and publisher of the Modified Version as given on the Title
Page. If there is no section entitled History in the Document, create one stating the title,
year, authors, and publisher of the Document as given on its Title Page, then add an item
describing the Modified Version as stated in the previous sentence.

526

APPENDICE E. GNU FREE DOCUMENTATION LICENSE

Preserve the network location, if any, given in the Document for public access to a Transparent copy of the Document, and likewise the network locations given in the Document
for previous versions it was based on. These may be placed in the History section. You
may omit a network location for a work that was published at least four years before the
Document itself, or if the original publisher of the version it refers to gives permission.
In any section entitled Acknowledgements or Dedications, preserve the sections title, and preserve in the section all the substance and tone of each of the contributor
acknowledgements and/or dedications given therein.
Preserve all the Invariant Sections of the Document, unaltered in their text and in their
titles. Section numbers or the equivalent are not considered part of the section titles.
Delete any section entitled Endorsements. Such a section may not be included in the
Modified Version.
Do not retitle any existing section as Endorsements or to conflict in title with any
Invariant Section.
If the Modified Version includes new front-matter sections or appendices that qualify as
Secondary Sections and contain no material copied from the Document, you may at your option
designate some or all of these sections as invariant. To do this, add their titles to the list of
Invariant Sections in the Modified Versions license notice. These titles must be distinct from
any other section titles.
You may add a section entitled Endorsements, provided it contains nothing but endorsements of your Modified Version by various parties for example, statements of peer review or
that the text has been approved by an organization as the authoritative definition of a standard.
You may add a passage of up to five words as a Front-Cover Text, and a passage of up to
25 words as a Back-Cover Text, to the end of the list of Cover Texts in the Modified Version.
Only one passage of Front-Cover Text and one of Back-Cover Text may be added by (or through
arrangements made by) any one entity. If the Document already includes a cover text for the
same cover, previously added by you or by arrangement made by the same entity you are acting
on behalf of, you may not add another; but you may replace the old one, on explicit permission
from the previous publisher that added the old one.
The author(s) and publisher(s) of the Document do not by this License give permission to
use their names for publicity for or to assert or imply endorsement of any Modified Version.

E.5

Combining Documents

You may combine the Document with other documents released under this License, under the
terms defined in section 4 above for modified versions, provided that you include in the combination all of the Invariant Sections of all of the original documents, unmodified, and list them
all as Invariant Sections of your combined work in its license notice.
The combined work need only contain one copy of this License, and multiple identical Invariant Sections may be replaced with a single copy. If there are multiple Invariant Sections
with the same name but different contents, make the title of each such section unique by adding
at the end of it, in parentheses, the name of the original author or publisher of that section if
known, or else a unique number. Make the same adjustment to the section titles in the list of
Invariant Sections in the license notice of the combined work.
In the combination, you must combine any sections entitled History in the various original
documents, forming one section entitled History; likewise combine any sections entitled Acknowledgements, and any sections entitled Dedications. You must delete all sections entitled
Endorsements.

E.6. COLLECTIONS OF DOCUMENTS

E.6

527

Collections of Documents

You may make a collection consisting of the Document and other documents released under this
License, and replace the individual copies of this License in the various documents with a single
copy that is included in the collection, provided that you follow the rules of this License for
verbatim copying of each of the documents in all other respects.
You may extract a single document from such a collection, and distribute it individually
under this License, provided you insert a copy of this License into the extracted document, and
follow this License in all other respects regarding verbatim copying of that document.

E.7

Aggregation With Independent Works

A compilation of the Document or its derivatives with other separate and independent documents
or works, in or on a volume of a storage or distribution medium, does not as a whole count as
a Modified Version of the Document, provided no compilation copyright is claimed for the
compilation. Such a compilation is called an aggregate, and this License does not apply to
the other self-contained works thus compiled with the Document, on account of their being thus
compiled, if they are not themselves derivative works of the Document.
If the Cover Text requirement of section 3 is applicable to these copies of the Document, then
if the Document is less than one quarter of the entire aggregate, the Documents Cover Texts
may be placed on covers that surround only the Document within the aggregate. Otherwise
they must appear on covers around the whole aggregate.

E.8

Translation

Translation is considered a kind of modification, so you may distribute translations of the Document under the terms of section 4. Replacing Invariant Sections with translations requires
special permission from their copyright holders, but you may include translations of some or
all Invariant Sections in addition to the original versions of these Invariant Sections. You may
include a translation of this License provided that you also include the original English version of
this License. In case of a disagreement between the translation and the original English version
of this License, the original English version will prevail.

E.9

Termination

You may not copy, modify, sublicense, or distribute the Document except as expressly provided
for under this License. Any other attempt to copy, modify, sublicense or distribute the Document
is void, and will automatically terminate your rights under this License. However, parties who
have received copies, or rights, from you under this License will not have their licenses terminated
so long as such parties remain in full compliance.

E.10

Future Revisions of This License

The Free Software Foundation may publish new, revised versions of the GNU Free Documentation License from time to time. Such new versions will be similar in spirit to the present version,
but may differ in detail to address new problems or concerns. See http://www.gnu.org/copyleft/.
Each version of the License is given a distinguishing version number. If the Document
specifies that a particular numbered version of this License or any later version applies to it, you
have the option of following the terms and conditions either of that specified version or of any

528

APPENDICE E. GNU FREE DOCUMENTATION LICENSE

later version that has been published (not as a draft) by the Free Software Foundation. If the
Document does not specify a version number of this License, you may choose any version ever
published (not as a draft) by the Free Software Foundation.

Indice analitico
arithmetic expansion, 66, 70, 98
autofs, 277279
backup, 181185
bootloader , 3, 17, 18, 250, 298, 300, 302, 311,
312, 315321
broadcast, 173, 399, 402, 407410, 440, 443,
465, 466, 470
canale DMA, 330
CIDR, 175, 402, 425, 430, 456, 483
comando
XF86Setup, 155
genisoimage, 281
localegen, 141
logname, 130
rpm2cpio, 197
shred, 12
update-initramfs, 301
wall, 328
xfs, 157
addgroup, 217
adduser, 217
apropos, 123
apt-cache, 208
apt-cdrom, 204
apt-get, 205
aptitude, 207
arp, 441
atq, 147
atrm, 147
at, 146
badblocks, 268
batch, 147
blkid, 259
bzip2, 103
cancel, 177
cat, 73
cfdisk, 253
chage, 218
chattr, 47
chat, 427
chfn, 218
529

chgpasswd, 219
chgrp, 45
chkconfig, 326
chmod, 44
chown, 45
chpasswd, 219
chroot, 30
chsh, 219
cksum, 97
cpio, 188
cp, 14
createdb, 243
createuser, 243
crontab, 145
cut, 98
date, 127
dd, 192
debugfs, 273
delgroup, 217
deluser, 217
depmod, 307
df, 264
dhclient, 466
diff, 284
dig, 498
dmesg, 131
dpkg-reconfigure, 209
dpkg, 203
dump, 189
du, 265
e2fsck, 272
e2image, 271
echo, 63
edquota, 387
env, 65
expand, 102
exportfs, 484
false, 84
fdformat, 266
fdisk, 251
findfs, 258
find, 92

530

INDICE ANALITICO
finger, 447
fmt, 103
fold, 103
free, 32
fsck.xfs, 275
fsck, 272
ftp, 446
getent, 231
getty, 54
gpasswd, 219
grep, 104
groupadd, 217
groupmod, 217
groups, 129
grpconv, 215
grpunconv, 215
grub-install, 319
grub, 319
gunzip, 103
gzip, 103
halt, 327
hdparm, 375
head, 98
hexdump, 96
history, 71
hostname, 423
host, 497
hwclock, 127
iconv, 142
id, 129
ifconfig, 406
ifdown, 418
ifup, 418
info, 124
init, 321
insmod, 303
isapnp, 333
iwconfig, 432
iwlist, 434
join, 100
killall, 34
kill, 33
lastb, 131
last, 130
ldconfig, 137
ldd, 136
less, 95
lilo, 315
ln, 10
locale, 140

locate, 90
logger, 150
login, 55
logrotate, 150
losetup, 261
lpadmin, 175
lpc, 180
lpinfo, 177
lpq, 179
lprm, 179
lpr, 178
lpstat, 178
lp, 177
lsattr, 47
lsmod, 309
lsof, 132
lspci, 335
lsusb, 347
ls, 8
lvcreate, 373
lvdisplay, 374
lvextend, 374
lvreduce, 375
lvremove, 375
lvresize, 375
lvscan, 374
make, 196
mandb, 123
manpath, 123
man, 121
md5sum, 97
mdadm, 358
mkdir, 15
mke2fs, 266
mkfifo, 47
mkfontdir, 158
mkfs.vfat, 266
mkfs, 266
mkinitramfs, 301
mkinitrd, 301
mkisofs, 281
mknod, 46
mkreiserfs, 266
mkswap, 279
modinfo, 308
modprobe, 304
more, 95
mount, 256
mtr, 437
mv, 13

INDICE ANALITICO
mysqladmin, 244
mysqldump, 244
mysql, 244
nc, 445
netcat, 445
netstat, 438
newgrp, 220
nice, 36
nl, 104
nohup, 58
nologin, 228
ntpdate, 128
od, 96
parted, 383
passwd, 217
paste, 99
patch, 285
pg_dump, 243
pidof, 32
ping, 434
pnpdump, 333
poweroff, 327
pr, 103
psql, 242
pstree, 22
ps, 23
pump, 465
pvcreate, 369
pvdisplay, 369
pvmove, 371
pvresize, 370
pvscan, 369
pwconv, 214
pwd, 15
pwunconv, 215
quotacheck, 385
quotaoff, 386
quotaon, 386
quotatool, 389
quota, 388
reboot, 327
reiserfsck, 274
reiserfstune, 275
renice, 36
repquota, 388
resize2fs, 382
resize_reiserfs, 382
restore, 191
rmdir, 15
rmmod, 309

531
rm, 12
rndc, 499
route, 409
rpcinfo, 443
rpm, 197
rsync, 193
run-parts, 145
scp, 476
scsiinfo, 341
sdparm, 378
sed, 107
seq, 83
setquota, 389
setserial, 342
sfdisk, 253
sg, 221
shutdown, 328
slocate, 91
smbclient, 490
smbmount, 490
smbpasswd, 489
sort, 100
split, 98
ssh-add, 480
ssh-copy-id, 479
ssh-keygen, 478
ssh, 475
startx, 163
strace, 133
strings, 134
sudoedit, 221
sudo, 221
su, 220
swapoff, 281
swapon, 280
sync, 264
sysctl, 138
syslinux, 314
tac, 96
tail, 98
tar, 185
tcpdchk, 462
tcpdmatch, 462
tcpd, 460
tee, 120
telinit, 327
telnet, 444
test, 84
time, 126
top, 30

532

INDICE ANALITICO
touch, 9
tracepath, 436
traceroute, 435
tree, 16
true, 84
tr, 101
ttmkfontdir, 158
tune2fs, 269
tzselect, 143
udevadm, 351
udevinfo, 351
udevmonitor, 351
umount, 264
uname, 131
unexpand, 102
uniq, 101
update-grub, 320
update-rc.d, 325
updatedb, 90
uptime, 131
useradd, 215
usermod, 216
users, 130
vgchange, 372
vgcreate, 371
vgdisplay, 372
vgextend, 372
vgmerge, 373
vgreduce, 372
vgscan, 372
vgsplit, 373
visudo, 225
vol_id, 258
wc, 97
whatis, 122
whereis, 89
which, 68
whoami, 129
whois, 448
who, 130
w, 130
xargs, 119
xauth, 168
xf86cfg, 155
xf86config, 155
xfs_admin, 276
xfs_check, 276
xfs_growfs, 382
xfs_info, 276
xfs_repair, 276

xhost, 168
xinit, 162
xorgcfg, 155
xorgconfig, 155
xrdb, 169
xterm, 162
xvidtune, 160
yaird, 302
yes, 121
yum, 200
zcat, 103
built-in
typeset, 65
alias, 68
bg, 57
cd, 15
declare, 65
disown, 58
exec, 83
exit, 58
export, 65
fg, 57
jobs, 57
set, 63
source, 83
type, 68
ulimit, 237
umask, 44
unalias, 68
unset, 63
wait, 58
command expansion, 66, 70, 71, 81, 82
configurazione
/etc/apt/sources.list.d/, 204
/etc/hdparm.conf, 377
/etc/modutils/, 306
.Xresources, 169
.bash_login, 86
.bash_logout, 86
.bash_profile, 86
.bashrc, 86
.fonts.conf, 158
.profile, 86
.xinitrc, 162
.xsession, 165
/etc/X11/XF86Config-4, 155
/etc/X11/Xsession, 165
/etc/X11/xdm/xdm-config, 164
/etc/X11/xdm/xdm.options, 164
/etc/X11/xinit/xinitrc, 163

INDICE ANALITICO

533

/etc/networks, 425
/etc/X11/xorg.conf, 155
/etc/nsswitch.conf, 230
/etc/apt/sources.list, 204
/etc/ntp.conf, 459
/etc/auto.master, 277
/etc/pam.conf, 233
/etc/bash.bashrc, 87
/etc/pam.d, 232
/etc/bash_completion, 73
/etc/passwd, 211
/etc/bootptab, 464
/etc/ppp/options, 427
/etc/cron.allow, 146
/etc/ppp/peers, 427
/etc/cron.deny, 146
/etc/profile, 85
/etc/crontab, 144
/etc/protocols, 425
/etc/cups/cupsd.conf, 173
/etc/rc.local, 326
/etc/default/autofs, 278
/etc/resolv.conf, 421
/etc/dhclient.conf, 466
/etc/rpc, 443
/etc/dhcpd.conf, 468
/etc/samba/smb.conf, 486
/etc/ethers, 442
/etc/securetty, 226
/etc/exports, 483
/etc/security/limits.conf, 237
/etc/fonts/fonts.conf, 158
/etc/services, 424
/etc/fonts/local.conf, 158
/etc/shadow, 213
/etc/fstab, 261
/etc/shells, 228
/etc/gdm/gdm.conf, 165
/etc/skel, 229
/etc/group, 211
/etc/ssh/ssh_config, 473
/etc/gshadow, 214
/etc/ssh/sshd_config, 471
/etc/host.conf, 422
/etc/ssh/sshrc, 476
/etc/hosts.allow, 461
/etc/sudoers, 222
/etc/hosts.deny, 461
/etc/sysctl.conf, 139
/etc/hosts, 422
/etc/syslog.conf, 148
/etc/inetd.conf, 452
/etc/udev/udev.conf, 349
/etc/initramfs-tools/initramfs.conf,
/etc/updatedb.conf, 90
301
/etc/xinetd.conf, 454
/etc/inittab, 322
/etc/yum.conf, 201
/etc/isapnp.conf, 333
/etc/yum.repo.d, 202
/etc/issue.net, 226
menu.lst, 319
/etc/issue, 226
named.conf, 500
/etc/kde4/kdm/kdmrc, 167
/etc/ld.so.cache, 137
default gateway, 403, 404, 412, 413, 415, 417,
/etc/ld.so.conf, 137
465, 466, 470
/etc/lilo.conf, 315
demone
/etc/localtime, 143
anacron, 145
/etc/login.defs, 227
atd, 146
/etc/logrotate.conf, 152
bootpd, 464
/etc/manpath.config, 123
cron, 144
/etc/mdadm/mdadm.conf, 359
cupsd, 172
/etc/mke2fs.conf, 268
dhcpd, 468
/etc/modprobe.conf, 305
gdm, 165
/etc/modprobe.d/, 306
inetd, 452
/etc/modules.conf, 305
kdm, 166
/etc/modules, 309
kerneld, 302
/etc/motd, 226
mysqld, 243
/etc/mtab, 263
named, 499
/etc/mysql/my.cnf, 243
nmbd, 486
ntpd, 459
/etc/network/interfaces, 416

534
portmap, 443
postmaster, 241
pppd, 426
smbd, 486
ssh-agent, 480
sshd, 471
syslogd, 148
udevd, 349
xdm, 163
xinetd, 454
device mapper , 261, 367, 374
directory di lavoro, 1415, 30, 33, 264
directory radice, 3, 14, 1621, 30, 263, 272, 288,
313, 321, 322
disciplina di linea, 445

INDICE ANALITICO
file di dispositivo, 6, 7, 17, 18, 40, 42, 46, 84,
122, 132, 149, 159, 171, 186, 191, 192,
227, 248, 249, 251, 253, 256, 258266,
268, 270273, 279, 281, 303, 312, 316,
319, 320, 338, 340342, 347, 348, 351,
357, 360, 363
Fully Qualified Domain Name, 423, 493
hard link , 812, 14, 60, 93, 103, 194, 274
hash, 97, 212, 265, 430, 489
history, 7172
history expansion, 71, 72
hostname, 149, 226, 421, 423, 446, 464, 467
hotplug, 258, 303, 306, 307, 345348
inode, 714, 40, 41, 43, 4648, 85, 104, 152,
263265, 267, 274, 384, 386389
interrupt, 330

editor
emacs, 110
Joliet, 281
jed, 117
joe, 116
kernel panic, 269, 273, 288, 300
nano, 118
kmod , 302
pico, 118
vi, 113
link-loader , 78, 136138
El Torito, 281
Logical Volume Manager , 253, 256, 295, 367
espressioni regolari, 95, 96, 104109, 114116,
375
120
login manager , 163, 164
fifo, 7, 46, 47
filename globbing, 64, 66, 6870, 82, 90, 105,
106, 140, 141, 179, 189, 194, 201, 202,
223, 360
filesystem /proc
/proc/bus/pci, 334
/proc/bus/usb, 346
/proc/cmdline, 313
/proc/dma, 330
/proc/filesystems, 257
/proc/interrupts, 330
/proc/ioports, 331
/proc/mdstat, 362
/proc/modules, 309
/proc/mounts, 263
/proc/partitions, 258
/proc/scsi, 340
/proc/swaps, 280
/proc/sys/kernel/hotplug, 347
/proc/sys/kernel/modprobe, 302
/proc/sys/net/ipv4/ip_forward, 411
Filesystem Hierarchy Standard , 1721, 77, 125,
136, 137, 143, 196, 250, 325, 348

MAC address, 231, 258, 394, 399, 410, 418, 440,


442, 463465, 469
major number , 46, 132
Master Boot Record , 192, 250, 251, 311, 312,
315, 316, 318, 319
memoria virtuale, 2, 31, 33, 279
minor number , 46, 132
modo promiscuo, 410
mount point, 19, 133, 190, 257, 262264, 272,
385, 485, 491
multicast, 399, 401, 407, 410, 438, 439
Name Service Switch, 37, 210, 211, 229232,
420422, 424, 443
nice, 29, 31, 3536, 456
nome a dominio, 419421
pager , 95
page fault, 279
path search, 67
pipe, 76, 77, 98, 107, 119
Pluggable Authentication Modules, 211, 226
228, 232
Point to Point Protocol , 400, 426

INDICE ANALITICO

535

porte, 404406
destinazione, 406
effimere, 406
riservate, 406
sorgente, 406
prompt, 61

standard error , 54, 55, 73, 74, 77, 133, 134, 445,
454
standard input, 54, 55, 57, 7377, 86, 89, 97, 98,
101, 104, 107, 119, 121, 186, 188190,
192, 222, 445, 451, 454
standard output, 54, 55, 7377, 83, 86, 89, 98,
99, 101, 103, 104, 107, 119, 121, 126,
127, 133, 186, 188, 190, 192, 445, 451,
ramdisk , 18, 291, 294, 300302, 312, 313, 315,
454
317, 321, 348, 463
sticky, 4143, 45
Remote Procedure Call , 442443
suid , 38, 41, 42, 45, 138, 220, 260
resolver , 419423
swap, 3, 31, 32, 42, 253, 257, 262, 279281, 291
Resource Record , 495496, 499
sysfs, 348349
Rock Ridge, 281
syslog, 132, 147153, 173, 298, 364, 455, 456,
router , 399, 403404, 410413
461, 500
routing, 400, 403404, 409414
system
call
, 24, 7, 8, 14, 15, 23, 26, 27, 30, 36,
runlevel , 129, 322329
44, 47, 122, 126, 133, 139, 300
sessione di lavoro, 25, 5357, 83
sgid , 38, 41, 42, 45, 138, 260
shadow password , 211219, 227, 231
shell
subshell, 83, 87
ash, 53
bash, 53
csh, 53
ksh, 53
sh, 52
tcsh, 53
zsh, 53
di login, 85, 86, 210, 211, 215, 219, 220,
228, 229
interattiva, 86
istruzione
break, 82
case, 81
continue, 82
done, 81
do, 81
elif, 81
else, 81
esac, 82
fi, 81
for, 82
function, 82
if, 80
then, 81
until, 81
while, 81
restricted, 87, 220, 228, 229
socket, 7, 397398, 451454, 457, 480

tabella di instradamento, 409413, 439


terminale di controllo, 25, 53, 54, 56
timezone, 142143
udev , 18, 258, 303, 306308, 329, 341, 345, 347
351
umask, 4445, 86, 458
Universal Unique Identifier , 258259, 262, 265,
270, 358, 360, 363, 364, 369, 371, 372
variabili
di ambiente, 6466
XAUTHORITY, 168
DISPLAY, 168
EDITOR, 66, 95
HOME, 66
LANG, 6667
LD_LIBRARY_PATH, 138
LD_PRELOAD, 138
MANPATH, 123
PAGER, 95
PATH, 6768
PRINTER, 179
SSH_AUTH_SOCK, 480
TAPE, 186
TERM, 66
TZ, 143
USER, 64
di shell, 6166
BASH, 86
HISTFILESIZE, 71
HISTFILE, 71
PS2, 61

536
HISTSIZE, 71
IFS, 66
PS1, 61
speciali, 79
variable expansion, 6263, 66, 68, 71, 81, 82,
145
wildcard , 201
window manager , 170
XML, 158
zombie, 2627, 29, 34

INDICE ANALITICO

Bibliografia
[AdvBash] Mendel Cooper. Advanced Bash-Scripting Guide. http://www.tldp.org/LDP/abs/,
2000.
[DebSys] Martin F. Krafft. Debian system, concepts and tecniques. William Pollok, 2005.
[GaPiL] Simone Piccardi.
Guida
http://gapil.truelite.it, 2001.

alla

[IS-LDAP] Simone Piccardi.


Integrazione
http://labs.truelite.it, 2003.

Programmazione
sistemistica

in
con

Linux,

volume

1.

LDAP,

volume

1.

[Kerberos] Jason Garman. Kerberos: The Definitive Guide. OReilly, 2003.


[LinuxNutshell] Greg Kroah-Hartman. Linux kernel in a Nutshell. OReilly, 2006.
[Make]

Paul D. Smith Richard M. Stallman, Roland McGrath. GNU make. Free Software
Foundation, 2004.

[RegExp] Jeffrey E. F. Friedl. Mastering regular expression. OReilly, 1997.


[SGL]

Simone Piccardi. La sicurezza con GNU/Linux, volume 1. http://labs.truelite.it, 2003.

[TCPIll1] W. Richard Stevens. TCP/IP Illustrated, Volume 1, the protocols. Addison Wesley,
1994.

537

Potrebbero piacerti anche