Corso Linux

Scarica in formato pdf o txt
Scarica in formato pdf o txt
Sei sulla pagina 1di 365

Amministrare GNU/Linux

Simone Piccardi
[email protected]

Truelite Srl

http://www.truelite.it

[email protected]

ii Copyright c 2003-2004 Simone Piccardi & Truelite S.r.l. Permission is granted to copy, distribute 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 ` stata sviluppata allinterno delle attivit` formative e a eettuate da Truelite S.r.l. Il materiale ` stato nanziato nel corso della realizzazione e 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://sources.truelite.it/index.php?page=documentazione dove saranno pubblicate nuove versioni ed aggiornamenti.

Societ` italiana specializzata nella fornitura di servizi, consulenza e formazione esclua sivamente 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 speciche di Linux . . . . . . . . . 1.2 Larchitettura dei le . . . . . . . . . . . . . . . . . . . . . . . . . 1.2.1 Il Virtual File System e le caratteristiche dei le. . . . . . 1.2.2 Larchitettura di un lesystem e le propriet` dei le . . . a 1.2.3 Lorganizzazione delle directory ed il Filesystem Hierarchy 1.2.4 La gestione delluso di dischi e volumi . . . . . . . . . . . 1.3 Larchitettura dei processi . . . . . . . . . . . . . . . . . . . . . . 1.3.1 Le propriet` dei processi . . . . . . . . . . . . . . . . . . . a 1.3.2 I segnali . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.3.3 Priorit` . . . . . . . . . . . . . . . . . . . . . . . . . . . . a 1.3.4 Sessioni di lavoro e job control . . . . . . . . . . . . . . . 1.4 Il controllo degli accessi . . . . . . . . . . . . . . . . . . . . . . . 1.4.1 Utenti e gruppi . . . . . . . . . . . . . . . . . . . . . . . . 1.4.2 I permessi dei le . . . . . . . . . . . . . . . . . . . . . . . 1.4.3 I permessi speciali . . . . . . . . . . . . . . . . . . . . . . 1.4.4 La gestione dei permessi dei le . . . . . . . . . . . . . . . 1.4.5 Altre operazioni privilegiate . . . . . . . . . . . . . . . . . 2 La shell e i comandi 2.1 Linterfaccia a linea di comando. . . . . . . . . . . . . 2.1.1 La losoa progettuale . . . . . . . . . . . . . . 2.1.2 Le principali shell . . . . . . . . . . . . . . . . 2.1.3 Introduzione alla sintassi della riga di comando 2.1.4 Funzionalit` interne della shell . . . . . . . . . a 2.1.5 La redirezione dellI/O . . . . . . . . . . . . . . 2.1.6 Scripting elementare . . . . . . . . . . . . . . . 2.2 I comandi dei le . . . . . . . . . . . . . . . . . . . . . 2.2.1 Caratteristiche comuni . . . . . . . . . . . . . . 2.2.2 I comandi per le ricerche sui le . . . . . . . . 2.2.3 I comandi visualizzare il contenuto dei le . . . 2.2.4 I comandi per suddividere il contenuto dei le . 2.2.5 I comandi per ltrare il contenuto dei le . . . 2.2.6 Altri comandi dei le . . . . . . . . . . . . . . . 2.3 Altri comandi . . . . . . . . . . . . . . . . . . . . . . . 2.3.1 I comandi per la documentazione . . . . . . . . 2.3.2 I comandi per la gestione dei tempi . . . . . . . iii 1 1 1 3 4 5 6 9 14 19 24 25 34 36 38 40 40 42 43 45 46 51 51 51 52 53 55 63 67 74 75 75 82 83 85 88 89 89 92

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

iv 2.3.3 I comandi di ausilio per la redirezione Gli editor di testo . . . . . . . . . . . . . . . . 2.4.1 Introduzione . . . . . . . . . . . . . . 2.4.2 Un editor evoluto: emacs o xemacs . . 2.4.3 Un editor di base, vi . . . . . . . . . . 2.4.4 Gli altri editor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

INDICE . . . . . . . 94 . 95 . 95 . 96 . 99 . 101 105 105 105 106 108 110 111 113 113 113 114 114 115 116 117 120 122 122 123 129 130 132 132 133 135 139 147 147 147 149 152 153 155 155 157 158 159 160 161 163 167

2.4

3 La congurazione dei servizi di base 3.1 I le di congurazione . . . . . . . . . . . . . . . . . . . . . . 3.1.1 Una panoramica generale . . . . . . . . . . . . . . . . 3.1.2 La gestione delle librerie condivise . . . . . . . . . . . 3.1.3 Il Name Service Switch . . . . . . . . . . . . . . . . . 3.1.4 I le usati dalla procedura di login . . . . . . . . . . . 3.1.5 La congurazione del sistema delle pagine di manuale 3.2 Altri le . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.2.1 Il le rc.local e la directory rc.boot . . . . . . . . . 3.2.2 La directory /etc/skel ed il le /etc/shells . . . . 3.2.3 Il le /etc/updatedb.conf . . . . . . . . . . . . . . . 3.3 I servizi di base . . . . . . . . . . . . . . . . . . . . . . . . . . 3.3.1 Il servizio cron . . . . . . . . . . . . . . . . . . . . . . 3.3.2 Il servizio at . . . . . . . . . . . . . . . . . . . . . . . 3.3.3 Il servizio syslog . . . . . . . . . . . . . . . . . . . . . 3.3.4 Il sistema di rotazione dei le di log . . . . . . . . . . 3.4 LX Window System . . . . . . . . . . . . . . . . . . . . . . . 3.4.1 Introduzione a X Window System . . . . . . . . . . . 3.4.2 La congurazione del server X . . . . . . . . . . . . . 3.4.3 Lavvio del server . . . . . . . . . . . . . . . . . . . . . 3.4.4 Luso di X Window dal lato client . . . . . . . . . . . 3.5 Il sistema di stampa . . . . . . . . . . . . . . . . . . . . . . . 3.5.1 Introduzione generale . . . . . . . . . . . . . . . . . . 3.5.2 Il sistema di stampa in stile BSD . . . . . . . . . . . . 3.5.3 La congurazione della stampa con LPRng . . . . . . 3.5.4 Il Common Unix Printing System . . . . . . . . . . . 4 Amministrazione ordinaria del sistema 4.1 Archiviazione e backup . . . . . . . . . . . . . . . . 4.1.1 Criteri generali per il backup . . . . . . . . 4.1.2 Il comando tar . . . . . . . . . . . . . . . . 4.1.3 Il comando cpio . . . . . . . . . . . . . . . 4.1.4 I comandi dump e restore . . . . . . . . . . 4.2 La gestione dei pacchetti software . . . . . . . . . . 4.2.1 Linstallazione diretta . . . . . . . . . . . . 4.2.2 La gestione dei pacchetti con rpm . . . . . . 4.2.3 La gestione dei pacchetti di Debian . . . . . 4.3 La gestione di utenti e gruppi . . . . . . . . . . . . 4.3.1 Una visione generale . . . . . . . . . . . . . 4.3.2 I comandi per la gestione di utenti e gruppi 4.3.3 Il database di utenti e gruppi . . . . . . . . 4.3.4 Il Pluggable Authentication Method . . . . .

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

INDICE 5 Amministrazione straordinaria del sistema 5.1 La gestione di kernel e moduli . . . . . . . . . . 5.1.1 Le versioni del kernel . . . . . . . . . . . 5.1.2 Sorgenti e patch . . . . . . . . . . . . . 5.1.3 La ricompilazione del kernel . . . . . . . 5.1.4 La gestione dei moduli . . . . . . . . . . 5.2 La gestione dei dischi e dei lesystem . . . . . . 5.2.1 Alcune nozioni generali . . . . . . . . . 5.2.2 Il partizionamento . . . . . . . . . . . . 5.2.3 La creazione di un lesystem . . . . . . 5.2.4 Controllo e riparazione di un lesystem 5.2.5 La gestione della swap . . . . . . . . . . 5.3 La gestione dellavvio del sistema . . . . . . . . 5.3.1 Lavvio del kernel . . . . . . . . . . . . . 5.3.2 Luso di LILO . . . . . . . . . . . . . . 5.3.3 Luso di GRUB . . . . . . . . . . . . . . 5.3.4 Il sistema di inizializzazione alla SysV . 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 . . . . . . 6 Amministrazione avanzata del sistema 6.1 Lutilizzo del RAID . . . . . . . . . . . . . . . 6.1.1 Introduzione . . . . . . . . . . . . . . 6.1.2 Il RAID su Linux . . . . . . . . . . . . 6.1.3 Il RAID software . . . . . . . . . . . . 6.2 Il sistema del Logical Volume Manager . . . . 6.2.1 Introduzione . . . . . . . . . . . . . . 6.2.2 La gestione dei volumi sici . . . . . . 6.2.3 La gestione dei gruppi di volumi . . . 6.2.4 La gestione dei volumi logici . . . . . 6.2.5 Il ridimensionamento dei lesystem . . 6.3 Le quote disco . . . . . . . . . . . . . . . . . 6.3.1 Visione generale . . . . . . . . . . . . 6.3.2 Congurazione del sistema delle quote 6.3.3 Gestione delle quote di utenti e gruppi 7 Lamministrazione di base delle reti 7.1 Unintroduzione ai concetti fondamentali 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 Il routing . . . . . . . . . . . . . 7.2.4 I servizi e le porte. . . . . . . . . 7.3 La congurazione di base . . . . . . . . 7.3.1 Il supporto nel kernel . . . . . .

v 169 169 169 170 173 183 189 189 190 194 198 202 204 204 207 210 212 216 216 223 228 229 235 235 235 238 238 242 242 244 245 247 249 250 250 250 252 255 255 255 256 257 260 261 263 266 267 269 269

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

delle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

reti. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

vi 7.3.2 Il comando ifconfig . . . . . . . . . . . . . . 7.3.3 Il comando route . . . . . . . . . . . . . . . . 7.3.4 La congurazione automatica. . . . . . . . . . . 7.3.5 I le di congurazione delle interfacce statiche. I comandi diagnostici . . . . . . . . . . . . . . . . . . . 7.4.1 Il comando ping . . . . . . . . . . . . . . . . . 7.4.2 Il comando traceroute . . . . . . . . . . . . . 7.4.3 Il comando netstat . . . . . . . . . . . . . . . 7.4.4 Il protocollo ARP ed il comando arp . . . . . . I client dei servizi di base . . . . . . . . . . . . . . . . 7.5.1 Il comando telnet . . . . . . . . . . . . . . . . 7.5.2 Il comando ftp . . . . . . . . . . . . . . . . . . 7.5.3 Il comando finger . . . . . . . . . . . . . . . . 7.5.4 Il comando whois . . . . . . . . . . . . . . . . La risoluzione dei nomi . . . . . . . . . . . . . . . . . . 7.6.1 Introduzione . . . . . . . . . . . . . . . . . . . 7.6.2 I le /etc/hosts e /etc/hostname . . . . . . . 7.6.3 Gli altri le per i nomi di rete . . . . . . . . . . 7.6.4 Il le /etc/nsswitch.conf . . . . . . . . . . . 7.6.5 Il le /etc/resolv.conf . . . . . . . . . . . . 7.6.6 Il le /etc/host.conf . . . . . . . . . . . . . . Il protocollo PPP . . . . . . . . . . . . . . . . . . . . . 7.7.1 Il demone pppd . . . . . . . . . . . . . . . . . . 7.7.2 I meccanismi di autenticazione . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

INDICE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 270 273 277 278 280 280 281 283 284 286 286 286 288 288 289 289 290 291 293 294 295 295 295 297 299 299 299 301 305 308 308 308 309 311 311 311 313 314 316 316 318 319 319 321 322

7.4

7.5

7.6

7.7

8 La gestione dei servizi di base 8.1 La gestione dei servizi generici . . . . . . . . . . . 8.1.1 Il superdemone inetd . . . . . . . . . . . . 8.1.2 Il superdemone xinetd . . . . . . . . . . . 8.1.3 I TCP wrappers . . . . . . . . . . . . . . . 8.2 I protocolli RARP, BOOTP e DHCP . . . . . . . . 8.2.1 Il protocollo RARP . . . . . . . . . . . . . 8.2.2 Il protocollo BOOTP . . . . . . . . . . . . 8.2.3 Il protocollo e la congurazione di un server 8.2.4 Uso del servizio DHCP dal lato client . . . 8.3 Il servizio SSH . . . . . . . . . . . . . . . . . . . . 8.3.1 Il server sshd . . . . . . . . . . . . . . . . . 8.3.2 I comandi ssh ed scp . . . . . . . . . . . . 8.3.3 Autenticazione a chiavi . . . . . . . . . . . 8.4 Il protocollo NFS . . . . . . . . . . . . . . . . . . . 8.4.1 Il server NFS . . . . . . . . . . . . . . . . . 8.4.2 NFS sul lato client . . . . . . . . . . . . . . 8.5 La condivisione dei le con Samba . . . . . . . . . 8.5.1 La congurazione di Samba come server . . 8.5.2 Limpostazione degli utenti . . . . . . . . . 8.5.3 Luso di Samba dal lato client . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . DHCP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

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

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

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

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

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

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

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

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

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

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

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

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

INDICE 9 Il servizio DNS 9.1 Il funzionamento del servizio DNS . . . . . . . 9.1.1 Introduzione . . . . . . . . . . . . . . . 9.1.2 I comandi host e dig . . . . . . . . . . 9.2 La gestione di un server DNS . . . . . . . . . . 9.2.1 Il server named . . . . . . . . . . . . . . 9.2.2 Il le named.conf . . . . . . . . . . . . 9.2.3 La congurazione base . . . . . . . . . . 9.2.4 La congurazione di un dominio locale. 9.3 Congurazioni avanzate . . . . . . . . . . . . . 9.3.1 La delegazione di una zona . . . . . . . 9.3.2 La gestione di un secondario . . . . . . 9.3.3 La congurazione con bind4 . . . . . . . A Sinossi dei comandi principali A.1 Comandi per la gestione dei le . . . . . . A.2 Comandi per la gestione dei processi . . . A.3 I permessi dei le . . . . . . . . . . . . . . A.4 Comandi per la localizzazione dei le . . . 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 . . . . . . . . . . .

vii 325 325 325 326 328 328 329 330 332 337 337 337 337 339 339 340 340 340 341 341 341 342 342 342

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

B Indice degli argomenti per LPI 343 B.1 Argomenti LPI 101 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 343 B.2 Argomenti LPI 102 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 344 C GNU Free Documentation License C.1 Applicability and Denitions . . . . . C.2 Verbatim Copying . . . . . . . . . . . C.3 Copying in Quantity . . . . . . . . . . C.4 Modications . . . . . . . . . . . . . . C.5 Combining Documents . . . . . . . . . C.6 Collections of Documents . . . . . . . C.7 Aggregation With Independent Works C.8 Translation . . . . . . . . . . . . . . . C.9 Termination . . . . . . . . . . . . . . . C.10 Future Revisions of This License . . . 345 345 346 346 347 348 349 349 349 349 349

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

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 basa larchitettura di questo sistema, che ` basata su quella, consolidatasi in 30 anni di impiego, dei sistemi di tipo Unix. e Il fatto che questa architettura abbia una certa et` fa s` che spesso i detrattori di GNU/Linux a ne denuncino la presunta mancanza di innovativit`, ma anche le case hanno da secoli le stesse a basi architetturali (porte, muri e tetti), ma non per questo non esiste innovazione. Il vantaggio della architettura di Unix infatti ` quello di aver fornito una solida base per la costruzione di e sistemi adabili ed ecienti, consolidata e corretta in decenni di utilizzo, tanto che ormai ` e divenuto comune il detto che chi non usa larchitettura Unix ` destinato a reinventarla. e

1.1.1

Larchitettura di base.

Contrariamente ad altri sistemi operativi, GNU/Linux nasce, come tutti gli Unix, come sistema multitasking e multiutente. Questo signica che GNU/Linux ha una architettura di sistema che ` stata pensata n dallinizio per luso contemporaneo da parte di pi` utenti. Questo comporta e u conseguenze non del tutto intuitive nel caso in cui, come oggi sempre pi` spesso accade, esso u venga usato come stazione di lavoro da un utente singolo. Il concetto base dellarchitettura di ogni sistema Unix come GNU/Linux ` quello di una rigida e separazione fra il kernel (il nucleo del sistema), cui si demanda la gestione delle risorse hardware, come la CPU, la memoria, le periferiche e i processi, (le unit` di esecuzione dei programmi), che a nel caso vanno dai comandi base di sistema, agli applicativi, alle interfacce per linterazione con gli utenti. Lo scopo del kernel infatti ` solo quello di essere in grado di eseguire contemporaneamente e molti processi in maniera eciente, garantendo una corretta distribuzione fra gli stessi della memoria e del tempo di CPU, e quello di provvedere 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 ` lambiente a disposizione degli utenti, in e cui vengono eseguiti i processi, e il kernel space, che ` lambiente in cui viene eseguito il kernel. e I due ambienti comunicano attraverso un insieme di interfacce ben denite e standardizzate; secondo una struttura come quella mostrata in g. 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` privilegiata, ed a ` lunico a poter accedere direttamente alle risorse dellhardware. I normali programmi invece e verranno eseguiti in modalit` protetta, in un ambiente virtuale, luser space, in cui essi vedono a se stessi come se avessero piena disponibilit` della CPU e della memoria, ma in cui possono a accedere alle periferiche e alle altre funzionalit` messe a disposizione del kernel solo attraverso a una serie di funzioni di sistema standardizzate,1 le cosiddette system call, che vengono utilizzate attraverso linterfaccia fornita dalla libreria di sistema (la GNU C library di g. 1.1). In sostanza quello che succede ` che da un certo punto di vista lunico vero programma che e viene eseguito ` il kernel che si incarica di costruire questo ambiente virtuale in cui fare girare gli e altri programmi. Una parte del kernel, quella indicata in g. 1.1 come scheduler, si incaricher` a della gestione del tempo di processore e provveder` a decidere volta per volta qual` il processo a e che deve essere eseguito in un determinato momento (realizzando cos` il multitasking). Una seconda parte, quella indicata in g. 1.1 come VM, (sigla che sta per Virtual Memory) si occuper` invece di gestire luso della memoria disponibile. La memoria virtuale ` uno dei a e sottosistemi pi` importanti del kernel2 perch ` quella che fa in modo che ogni processo veda uno u ee spazio di indirizzi proprio che poi viene rimappato3 nella memoria sica eettivamente 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 spostamento delle pagine di memoria meno usate su uno opportuno spazio disco (lo swap, che tratteremo in sez. 5.2.5) evitando di fermare lesecuzione di un processo per una temporanea mancanza di memoria. Torneremo brevemente sullargomento in sez. 1.3.1. Inne c` unultima parte del kernel, indicata in g. 1.1 con lindicazione generica driver,4 che e
lo standard in questo caso si chiama POSIX.1, ma oltre quelle dello standard Linux supporta alcune system call ulteriori relative a sue estensioni speciche. 2 e oggetto di continui rifacimenti, in quanto critico per tutte le prestazioni del sistema. 3 questo viene in genere realizzato con lausilio delle MMU (Memory Management Unit) dei microprocessori, una descrizione pi` dettagliata del funzionamento della memoria virtuale pu` essere trovata nella sezione 2.2 di [1]. u o 4 questa in realt` non ` un unico sottosistema come le precedenti, ma un insieme di varie parti diverse, speciche a e
1

1.1. LARCHITETTURA DEL SISTEMA.

si incaricher` di accedere alle periferiche per conto dei programmi. Questa, come vedremo meglio a in sez. 1.2, permette di denire una interfaccia di accesso generica per qualunque dispositivo, cui spesso si fa riferimento dicendo che in un sistema unix-like tutto ` un le. e La conseguenza pi` importante di questa separazione fra user space e kernel space ` che in u e questo modo non ` possibile che un singolo programma possa disturbare lazione di un altro e programma o del kernel stesso, e questo ` il principale motivo della stabilit` di un sistema Unix e a 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 in esame brevemente in esame la procedura di avvio del sistema, su cui torneremo in dettaglio in sez. 5.3.4. Allaccensione del computer viene eseguito il programma che sta nel BIOS; questo dopo aver fatto i suoi controlli interni esegue la procedura di avvio del sistema. Nei PC tutto ci` viene eettuato caricando dal o dispositivo indicato nelle impostazioni del BIOS un apposito programma, il bootloader,5 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 ` passato al kernel questo, terminata la fase di inizializzazione (in e cui ad esempio si esegue una scansione delle periferiche disponibili, e si leggono le tabelle delle partizioni dei vari dischi) si incaricher` di montare (vedi sez. 1.2.2) il lesystem su cui ` situata a e la directory radice (vedi sez. 1.2.3), e far` partire il primo processo. Per convenzione questo a processo si chiama init, ed ` il programma di inizializzazione che a sua volta si cura di far e 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,6 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 grache disponibili (argomento che riprenderemo in sez. 3.4). ` E da rimarcare poi come anche tutti i programmi che un utente di un sistema GNU/Linux pu` utilizzare una volta che si ` collegato non hanno niente di diverso da quelli appena citati. o e 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 le non ha niente di diverso dalleseguire in ambiente graco un programma di scrittura o un programma di fotoritocco, o dal lanciare un server web che viene eseguito anche quando nessuno ` collegato e al sistema. Questo signica ad esempio che il kernel di per s non dispone di primitive per tutta una e serie di operazioni, come la copia di un le,7 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.
per il tipo di periferica in questione. 5 questo ` un programma speciale, il cui solo compito ` quello di far partire un sistema operativo, in genere e e 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. 6 in realt` se la cosa ` fatta da console i programmi sono due, il primo chiede lutente e poi chiama il secondo a e che chiede la password, torneremo su questo in sez. 3.1.4 e sez. 5.3.4. 7 questa infatti viene eseguita usando semplicemente le funzioni che permettono di leggere e scrivere il contenuto di un le, leggendo loriginale e scrivendo sulla copia.

CAPITOLO 1. LARCHITETTURA DI UN SISTEMA GNU/LINUX

Tutto ci` ci dice anche che bench costituisca il cuore del sistema, il kernel da solo sarebbe o e 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 le, 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 ` linsieme di questi e del kernel che e 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, Mandrake, RedHat, Slackware8 ), quelle che si trovano sui CD con i quali si installa quello che, con una semplicazione 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: ` su di essi che ogni e altro programma ` basato, ed ` per questo che ` pi` corretto riferirsi allintero sistema come e e e u a GNU/Linux, dato che Linux indica solo una parte, il kernel, che bench fondamentale non e costituisce da sola un sistema operativo. Si tenga presente inne che anche se il kernel tratta tutti i programmi allo modo, non tutti hanno la stessa importanza. Nellesempio appena fatto abbiamo accennato ad un programma particolare, init, che ha un ruolo privilegiato in quanto ` quello che si occupa dellinizializzazione e del sistema quando questo viene fatto partire. Anche init per` alla ne non ` che un programma o e che usa le system call e viene eseguito dal kernel come un qualunque altro processo; la sua unica peculiarit` infatti ` quella di essere lanciato per primo direttamente dal kernel. a e Questo ci porta ad unaltra caratteristica fondamentale dellarchitettura dei sistemi unix-like (ci torneremo in dettaglio in sez. 1.3) che ` quella per cui qualunque processo pu` a sua volta e o ` avviarne di nuovi.9 E questo che permette lavvio del sistema eseguendo un unico programma di inizializzazione come init, dato che questo potr` poi lanciare altri programmi, che a loro a volta ne potranno lanciare degli altri ancora, no a fornire tutte le funzionalit` richieste per il a funzionamento del sistema. Bench sia possibile per usi particolari (ad esempio in sistemi embedded 10 che devono svolgere e un solo compito) far partire un qualunque altro programma al posto di init,11 in pratica tutti i sistemi Unix usano questo specico programma per gestire lavvio del sistema, ed ` a seconda e degli ulteriori programmi che init mette in esecuzione (tratteremo largomento in sez. 5.3.4) che alla ne della procedura di avvio ci si trover` davanti ad un terminale a caratteri o ad una a interfaccia graca, e si avr`, a seconda di quanto deciso (ed installato) dallamministratore, un a server di posta, un server web, una workstation, ecc.

1.1.3

Alcune caratteristiche speciche di Linux

Bench Linux stia diventando il pi` diuso, esistono parecchi altri kernel unix-like, sia liberi e u 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` noti) che si innestano tutti in due rami principali, quelli u derivati dal sistema sviluppato dalla AT/T, detto SysV (da System V, lultima versione uciale) e quelli derivati dal codice sviluppato alluniversit` di Berkley, detto BSD (da Berkley Software a Distribution). La prima caratteristica distintiva di Linux ` che esso ` stato riscritto da zero, e e
in rigoroso ordine alfabetico! nel qual caso si dice che il primo processo ` il padre degli altri, che a loro volta sono chiamati gli. e 10 si chiamano cos` i sistemi destinati allesecuzione di compiti specici, come quelli dei telefonini, dei videoregistratori, ecc. 11 vedremo in sez. 5.3.4 come in casi di emergenza si pu` lanciare al suo posto una shell. o
9 8

1.2. LARCHITETTURA DEI FILE

per cui non ` classicabile in nessuno di questi due rami e prende invece, a seconda dei casi, le e migliori caratteristiche di ciascuno di essi. Unaltra delle caratteristiche peculiari di Linux rispetto agli altri kernel unix-like ` quella e di essere modulare; Linux cio` pu` essere esteso (torneremo su questo in sez. 5.1.4) inserendo e o a sistema attivo degli ulteriori pezzi, i moduli, che permettono di ampliare le capacit` del a sistema (ad esempio fargli riconoscere una nuova periferica). Questi possono poi essere tolti dal sistema in maniera automatica quando non sono pi` necessari: un caso tipico ` quello del modulo u e che permette di vedere il oppy, caricato solo quando c` necessit` di leggere un dischetto ed e a automaticamente rimosso una volta che non sia pi` in uso per un certo tempo. u In realt` ` sempre possibile costruire un kernel Linux comprensivo di tutti i moduli che a e 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 essibilit` nettamente inferiore in quanto si perde la capacit` di a a poter specicare eventuali opzioni al momento del caricamento, costringendo al riavvio in caso di necessit` di cambiamenti. a Per contro in certi casi luso dei moduli pu` degradare leggermente le prestazioni (quasi o sempre in maniera non avvertibile) e pu` dar luogo a conitti inaspettati (che con un kernel o monolitico avrebbero bloccato il sistema allavvio). Questi problemi oggi sono sempre pi` rari, u in ogni caso non ` possibile utilizzare i moduli nel caso in cui la funzionalit` da essi fornite siano e a necessarie ad avviare il sistema. Una seconda peculiarit` di Linux ` quella del Virtual File System (o VFS). Un concetto a e generale presente in tutti i sistemi Unix (e non solo) ` che lo spazio su disco su cui vengono tenuti i e le di dati ` organizzato in quello che viene chiamato un lesystem (tratteremo lamministrazione e dei lesystem in sez. 5.2). Lo spazio disco grezzo ` normalmente12 suddiviso in settori contigui e di dimensione ssa, 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 essere sparse qua e l` sul disco; si ha cos` quello che lutente vede come un singolo a le. Quello che contraddistingue Linux ` che linterfaccia per la lettura del contenuto del lesye stem ` stata completamente virtualizzata, per cui inserendo gli opportuni moduli nel sistema e diventa possibile accedere con la stessa interfaccia (e, salvo limitazioni della realizzazione, in maniera completamente trasparente allutente) ai pi` svariati tipi di lesystem, a partire da u 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 le (e di come possa essere usata anche per altro che i le di dati) in sez. 1.2; quello che ` e importante tenere presente da subito ` che la disponibilit` di una astrazione delle operazioni sui e a le rende Linux estremamente essibile, dato che attraverso di essa ` in grado di supportare con e relativa facilit`, ed in maniera nativa, una variet` di lesystem superiore a quella di qualunque a a altro sistema operativo.

1.2

Larchitettura dei le

Un aspetto fondamentale della architettura di GNU/Linux ` quello della gestione dei le, esso e deriva direttamente da uno dei criteri base della progettazione di tutti i sistemi Unix, quello espresso dalla frase everything is a le (cio` tutto ` un le), per cui laccesso ai le e alle e e periferiche ` gestito attraverso una interfaccia identica. e Inoltre, essendo in presenza di un sistema multiutente e multitasking, il kernel deve anche essere in grado di gestire laccesso contemporaneo allo stesso le da parte di pi` processi, e u
12

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

CAPITOLO 1. LARCHITETTURA DI UN SISTEMA GNU/LINUX

questo viene fatto usando un disegno specico nella struttura delle interfacce di accesso, che ` e uno dei punti di maggior forza della architettura di un sistema Unix.

1.2.1

Il Virtual File System e le caratteristiche dei le.

Come accennato in sez. 1.1.3 i le sono organizzati sui dischi allinterno di lesystem. Perch e i le diventino accessibili al sistema un lesystem deve essere montato (torneremo su questo in sez. 1.2.4). Questa ` una operazione privilegiata (che normalmente pu` fare solo lamminie o stratore) che provvede ad installare nel kernel le opportune interfacce (in genere attraverso il caricamento dei relativi moduli) che permettono laccesso ai le contenuti nel lesystem. Come esempio consideriamo il caso in cui si voglia leggere il contenuto di un CD. Il kernel dovr` poter disporre sia delle interfacce per poter parlare al dispositivo sico (ad esempio il a supporto SCSI, se il CDROM ` SCSI), che di quelle per la lettura dal dispositivo specico (il e modulo che si interfaccia ai CDROM, che ` lo stesso che questi siano su SCSI, IDE o USB), sia e di quelle che permettono di interpretare il lesystem ISO9660 (che ` quello che di solito viene e usato per i dati registrati su un CDROM) per estrarne il contenuto dei le. Allo stesso modo se si volessero leggere i dati su un dischetto occorrerebbe sia il supporto per laccesso al oppy, che quello per poter leggere il lesystem che c` sopra (ad esempio vfat e 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 ` quello per cui tutto ` un le e che altro non signica che si pu` e e o 13 con una interfaccia identica a quella con cui si accede al conaccedere a tutte le periferiche tenuto dei le. Questo comporta una serie di dierenze nella gestione dei le rispetto ad altri sistemi. Anzitutto in un sistema Unix tutti i le di dati sono uguali (non esiste la dierenza fra le di testo o binari che c` in Windows, n fra le sequenziali e ad accesso diretto che cera nel VMS). e e Inoltre le estensioni sono solo convenzioni, e non signicano nulla per il kernel, che legge tutti i le di dati alla stessa maniera, indipendentemente dal nome e dal contenuto. In realt` il sistema prevede tipi diversi di le, ma in un altro senso; ad esempio il sistema a pu` accedere alle periferiche, attraverso dei le speciali detti device le o le di dispositivo. Cos` o si pu` suonare una canzone scrivendo su /dev/dsp, leggere loutput di una seriale direttamente o da /dev/ttyS0, leggere direttamente dai settori sici del disco rigido accedendo a /dev/hda, o fare animazioni scrivendo su /dev/fb0 (questo ` molto pi` dicile da fare a mano). Un elenco e u dei vari tipi oggetti visti come le dal kernel ` riportato in tab. 1.1, ognuno di questi fornisce e una funzionalit` specica, sempre descritta in tabella. a Altri tipi di le speciali sono le fo ed i socket, che altro non sono che dei canali di comunicazione messi a disposizione dei processi perch questi possano parlare fra loro. Dato che i e processi sono completamente separati deve essere il kernel a fornire le funzionalit` che permettaa no la comunicazione. Questi le speciali sono due modalit` per realizzare questa comunicazione; a aprendo una fo un processo pu` scrivervi sopra ed un altro processo legger` dallaltro capo o a quanto il primo ha scritto, niente verr` salvato su disco, ma passer` tutto attraverso il kernel a a che consente questa comunicazione come attraverso un tubo. I socket fanno la stessa cosa ma consentono una comunicazione bidirezionale, in cui il secondo processo pu` scrivere indietro, ed o il primo leggere, quando invece per le fo il usso dei dati ` unidirezionale. e La possibilit` di avere tutti questi tipi di le speciali ` dovuta al fatto che, come accennavamo a e in sez. 1.1.3, in Linux laccesso ai le viene eseguito attraverso una interfaccia unicata, il Virtual File System, che denisce una serie di operazioni generiche che sono le stesse per tutti gli oggetti gestiti tramite essa; ` questo che implementa la losoa del tutto ` un le. e e
con la sola eccezione delle interfacce ai dispositivi di rete, che non rientrano bene nellastrazione e sono gestiti in maniera diversa.
13

1.2. LARCHITETTURA DEI FILE


Tipo di le regular le le regolare directory symbolic link char device block device fo socket cartella o direttorio collegamento simbolico dispositivo a caratteri dispositivo a blocchi coda presa Descrizione un le che contiene dei dati (laccezione normale di le). un le che contiene una lista di nomi associati a degli inode. un le che contiene un riferimento ad un altro le o directory. un le che identica una periferica ad accesso a caratteri. un le che identica una periferica ad accesso a blocchi. un le speciale che identica una linea di comunicazione unidirezionale. un le speciale che identica una linea di comunicazione bidirezionale.

d l c b p s

Tabella 1.1: I vari tipi di le riconosciuti da Linux

Le principali operazioni sono riportate in tab. 1.2; ogni oggetto del sistema visto attraverso il Virtual File System denisce la sua versione di queste operazioni. Come si pu` notare sono o denite sia operazioni generiche come la lettura e la scrittura, che pi` specialistiche come lo u spostamento allinterno di un le.14 Quando si utilizzano le system call per accedere ad un le sar` compito del kernel chiamare loperazione relativa ad esso associata (che sar` ovviamente a a diversa a seconda del tipo di le), o riportare un errore quando questultima non sia denita (ad esempio sul le di dispositivo associato alla seriale non si potr` mai utilizzare loperazione a di spostamento llseek ).
Funzione open read write llseek ioctl readdir Operazione apre il le. legge dal le. scrive sul le. si sposta allinterno del le. accede alle operazioni di controllo. legge il contenuto di una directory.

Tabella 1.2: Principali operazioni sui le denite nel VFS.

Il Virtual File System ` anche il meccanismo che permette al kernel di gestire tanti lesystem e diversi; quando uno di questi viene montato ` compito il kernel utilizzare per le varie system call e le opportune operazioni in grado di accedere al contenuto di quel particolare lesystem; questa ` la ragione principale della grande essibilit` di Linux nel supportare i lesystem pi` diversi, e a u basta denire queste operazioni per un lesystem per poterne permettere laccesso da parte delle varie system call secondo la stessa interfaccia. Uno dei comandi fondamentali per la gestione dei le ` ls (il cui nome deriva da LiSt le), e il comando mostra lelenco dei le nella directory corrente. Usando lopzione -l ` possibile e ottenere una lista estesa, in cui compaiono varie propriet` del le; ad esempio: a
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
14

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

ed altre ancora pi` complesse che non sono state riportate. u

CAPITOLO 1. LARCHITETTURA DI UN SISTEMA GNU/LINUX

ci mostra il contenuto di una directory dove si sono creati i vari tipi di le15 elencati in tab. 1.1, si noti come la prima lettera in ciascuna riga indichi il tipo di le, anche questo secondo la notazione riportata nella terza colonna della stessa tabella. Il comando ls ` dotato di innumerevoli opzioni, che gli consentono di visualizzare le varie e caratteristiche dei le, delle quali il tipo ` solo una. Altre caratteristiche sono i tempi di ultimo e accesso, modica e cambiamento (su cui torneremo fra poco), le informazioni relative a permessi di accesso e proprietari del le (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 parametro una lista di le o directory, senza opzioni viene mostrato solo il nome del le (se esiste) o il contenuto della directory specicata. Le opzioni sono moltissime, e le principali sono riportate in tab. 1.3; lelenco completo ` riportato nella pagina di e manuale accessibile con il comando man ls.
Opzione -l -a -i -R -c -u -d Signicato scrive la lista in formato esteso. mostra i le 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 le. usa il tempo di ultimo accesso al le. 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 le il cui nome inizia per un punto (.) non vengano riportati nelloutput di ls, a meno di non richiederlo esplicitamente con luso dellopzione -a; per questo tali le sono detti invisibili. Si tenga presente comunque che questa non ` una propriet` dei le e a e non ha nulla a che fare con le modalit` con cui il kernel li tratta (che sono sempre le stesse), a 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 le. Abbiamo visto in precedenza un esempio di questa lista, e come il primo carattere della prima colonna indichi tipo di le, mentre il resto della colonna indica i permessi del le, secondo una notazione su cui torneremo in sez. 1.4.2. Il secondo campo indica il numero di hard link al le (su questo torneremo in sez. 1.2.2), mentre il terzo ed il quarto campo indicano rispettivamente utente e gruppo proprietari del le (anche questo sar` trattato a in sez. 1.4.2). Il quinto campo indica la dimensione, usualmente riportata in byte. Il sesto campo ` il tempo di ultima modica del le e lultimo campo il nome del le. e In un sistema unix-like i tempi dei le (mantenuti automaticamente dal kernel quando opera si essi) sono tre ed hanno un signicato diverso rispetto a quanto si trova in altri sistemi operativi. Il tempo mostrato di default da ls ` il tempo di ultima modica (o modication time) che e corrisponde allultima volta che ` stato modicato il contenuto di un le. Si badi bene che questo e tempo riguarda solo il contenuto del le, se invece si operano delle modiche sulle propriet` a del le (ad esempio si cambiano i permessi) varia quello che viene chiamato tempo di ultimo cambiamento (il change time) che viene visualizzato con lopzione -c. Inne tutte le volte che si accede al contenuto del le viene cambiato il tempo di ultimo accesso (o access time) che pu` o essere visualizzato con lopzione -u. Si noti inne come in un sistema unix-like non esista un tempo di creazione del le.
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` comune ` X window), non esiste pertanto un comando u e che permetta di crearne uno in maniera esplicita.
15

1.2. LARCHITETTURA DEI FILE

1.2.2

Larchitettura di un lesystem e le propriet` dei le a

Come gi` accennato Linux (ed ogni sistema unix-like) organizza i dati che tiene su disco attraa verso luso di un lesystem. Una delle caratteristiche di Linux rispetto agli altri Unix ` quella di e poter supportare, grazie al VFS, una enorme quantit` di lesystem diversi, ognuno dei quali ha a una sua particolare struttura e funzionalit` proprie. Per questo non entreremo nei dettagli di un a lesystem specico, ma daremo una descrizione a grandi linee che si adatta alle caratteristiche comuni di qualunque lesystem usato su sistema unix-like.

Figura 1.2: Strutturazione dei dati allinterno di un lesystem.

Se si va ad esaminare con maggiore dettaglio come ` strutturate linformazione allinterno di e un singolo lesystem, possiamo esemplicare la situazione con uno schema come quello esposto in g. 1.2, da cui si evidenziano alcune delle caratteristiche di base di un lesystem, sulle quali ` e bene porre attenzione visto che sono fondamentali per capire il funzionamento dei comandi che manipolano i le e le directory. La struttura che identica univocamente un singolo le allinterno di un lesystem ` il coe siddetto inode: ciascun le ` associato ad un inode in cui sono mantenute tutte le informazioni e che lo riguardano, come il tipo (fra quelli di tab. 1.1), i permessi di accesso, utente e gruppo proprietario, le dimensioni, i tempi, ed anche tutti i riferimenti ai settori del disco (i blocchi sici) che contengono i dati; le informazioni che il comando ls fornisce provengono dallinode. Lunica informazione relativa al le non contenuta nellinode ` il suo nome; infatti il nome di e un le non ` una propriet` del le, ma semplicemente una etichetta associata ad un inode. Le e a directory infatti non contengono i le, ma sono dei le speciali (di tipo directory, cos` che il kernel pu` trattarle in maniera diversa) il cui contenuto ` semplicemente una lista di nomi a ciascuno o e dei quali viene associato un numero di inode che identica il le cui il nome fa riferimento. Come mostrato in g. 1.2 si possono avere pi` voci in directory diverse che puntano allo u

10

CAPITOLO 1. LARCHITETTURA DI UN SISTEMA GNU/LINUX

stesso inode. Questo introduce il concetto di hard link : due le che puntano allo stesso inode sono sicamente lo stesso le, nessuna propriet` specica, come permessi, tempi di accesso o a contenuto permette di distinguerli, in quanto laccesso avviene per entrambi attraverso lo stesso inode. Siccome uno stesso inode pu` essere referenziato in pi` directory, un le pu` avere pi` o u o 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, dal valore numerico riportato nel secondo campo, e ci permette di dire se un le ha degli hard link (anche se non indica dove sono). Il comando generico che permette di creare dei link ` ln che prende come argomenti il le e originale ed il nome del link. La dierenza rispetto a Windows o MacOs ` che in un sistema e 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` simili ai collegamenti di Windows o u agli alias del MacOS), come il le link mostrato in precedenza. Per creare un hard link basta usare direttamente il comando ln (da LiNk le), che di default crea questo tipo di link. Cos` potremo creare il le hardlink come hard link al le file visto in precedenza con il comando:
piccardi@oppish:~/filetypes$ ln file hardlink

e adesso potremo vericare 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 per file e hardlink un valore pari a due. Usando lopzione -i di ls possiamo anche stampare per ciascun le il 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 come si pu` notare file e hardlink hanno lo stesso numero di inode, pari a 2117. o Il problema con gli hard link ` che le directory contengono semplicemente il numero di inode, e per cui si pu` fare riferimento solo ad un inode nello stesso lesystem della directory, dato che o su un altro lesystem lo stesso numero identicher` un inode diverso. Questo limita luso degli a hard link solo a le residenti sul lesystem corrente, ed il comando ln dar` un errore se si cerca a di creare un hard link ad un le posto in un altro lesystem. Per superare questa limitazione sono stati introdotti i link simbolici, che vengono creati usando lopzione -s del comando ln; ad esempio si ` creato il link simbolico link dellesempio e precedente con il comando:

1.2. LARCHITETTURA DEI FILE

11

piccardi@oppish:~/filetypes$ ln -s file link

In questo caso viene creato un nuovo le, di tipo symbolic link, che avr` un suo diverso a inode, come mostrato nellesempio precedente, ed il cui contenuto ` il percorso (torneremo sulla e notazione che esprime i pathname dei le fra poco) per il le a cui esso fa riferimento, che a ` questo punto pu` essere in qualsiasi altro lesystem. E compito del kernel far s` che quando si o usa un link simbolico si vada poi ad usare il le che questo ci indica. 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 ` riportata nella pagina di manuale accessibile attraverso e il comando man ln.
Opzione -s -f -i -d -b Signicato crea un link simbolico. forza la sovrascrittura del nuovo le se esso esiste gi`. a richiede conferma in caso di sovrascrittura. crea un hard link ad una directory (in Linux questa non ` usabile). e esegue un backup della destinazione se questa esiste gi`. a Tabella 1.4: Principali opzioni del comando ln.

Una seconda caratteristica dei link simbolici ` la possibilit` di creare dei link anche per e a delle directory. Questa capacit` infatti, sebbene teoricamente possibile anche per gli hard link, a in Linux non ` supportata per la sua pericolosit`, ` possibile infatti creare dei link loop se e a e si commette lerrore di creare un link alla directory che contiene il link stesso; con un link simbolico questo errore pu` essere corretto in quanto la cancellazione del link simbolico rimuove o questultimo, e non il le referenziato, ma con un hard link non ` pi` possibile fare questa e u distinzione e la rimozione diventa impossibile. La possibilit` di creare dei link alle directory tuttavia ` estremamente utile, infatti qualora si a e voglia accedere ai le in una directory attraverso un percorso diverso, ad esempio a causa di un programma che cerca dei le di congurazione in una locazione diversa da quella usuale, piuttosto che dover spostare tutti i le baster` creare un link simbolico e si sar` risolto il problema. a a Oltre agli hard link la struttura di un lesystem 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` diversa nella cancellazione a dei le e nello spostamento degli stessi. Il comando per la cancellazione di un le ` rm (da ReMove le), ma la funzione usata dal e sistema per eettuare questo compito si chiama in realt` unlink ed essa, come ci dice il nome, a non cancella aatto i dati del le, 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 le vengono eettivamente rimossi dal disco dal kernel. In realt` oltre ai riferimenti mostrati da ls il kernel mantiene a anche unaltra lista di riferimenti per ciascun processo che sta accedendo al le, per cui anche se si cancella un le da una directory, ma resta attivo un processo che lo utilizza, lo spazio disco non viene rilasciato, e ntanto che il processo non avr` nito i dati resteranno, anche se solo per a lui, disponibili. Il comando rm prende come argomenti una lista di le 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 le non esistenti. Inne lopzione -R (o -r) permette la cancellazione ricorsiva di una directory e di tutto il suo contenuto, ed ` pertanto e

12

CAPITOLO 1. LARCHITETTURA DI UN SISTEMA GNU/LINUX

da usare con estrema attenzione, specie se abbinata con -f.16 La lista completa delle opzioni ` e riportata nella pagina di manuale, accessibile con il comando man rm. Come accennato la struttura di un lesystem unix-like comporta anche una diversa concezione delloperazione di spostamento dei le, che nel caso ` identica a quella di cambiamento del e nome. Il comando per compiere questa operazione infatti ` unico e si chiama mv, da MoVe le. e Infatti ntanto che si sposta un le da una directory ad un altra senza cambiare lesystem, non c` nessuna necessit` di spostare il contenuto del le e basta semplicemente che sia creata e a 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 eettuata allinterno della stessa directory). Qualora invece si debba eettuare lo spostamento ad un lesystem diverso diventa necessario prima copiare il contenuto e poi cancellare loriginale. Il comando mv ha due forme, e pu` prendere come argomenti o due nomi di le o una lista o di le seguita da una directory. Nel primo caso rinomina il primo le nel secondo, cancellando questultimo qualora esista gi`, nel secondo caso sposta tutti i le della lista nella directory, a sempre cancellando eventuali le con lo stesso nome presenti in essa. Le principali opzioni sono riportate in tab. 1.5, lelenco completo ` riportato nella pagina di manuale, accessibile con il e comando man mv.
Opzione -f -i -u -b Signicato forza la sovrascrittura del nuovo le se esso esiste gi`. a richiede conferma in caso di sovrascrittura. esegue lo spostamento solo se la destinazione ` pi` vecchia e u 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 di una voce associata ad un numero di inode allinterno di una directory, ntanto che lo spostamento avviene allinterno dello stesso lesystem, i tempi dei le non vengono modicati dalluso di mv. Quando per` lo spostamento avviene o fra lesystem diversi viene copiato il contenuto e cancellato il le originario, pertanto in teoria dovrebbero risultare modicati anche i tempi di ultimo accesso e modica. In realt` il comando a provvede ripristinare questi tempi (come le altre caratteristiche del le) al valore del le originario, ma non pu` fare nulla per ripristinare il tempo di ultimo cambiamento.17 Pertanto in o quel caso si potr` notare, usando ls -lc, che questo ` cambiato e corrisponde al momento dello a e spostamento. Qualora invece si voglia duplicare un le il comando da usare ` cp (da CoPy le). Come per e mv il comando pu` prendere come argomenti o due nomi di le o una lista di le seguita da una o directory; nel primo caso eettua una copia del primo le sul secondo, nel secondo copia tutti le della lista nella directory specicata. Dato che il comando funziona copiando il contenuto di un le su un nuovo le creato per loccasione, i tempi di ultima modica, accesso e cambiamento di questultimo corrisponderanno al momento in cui si ` eseguita loperazione. Inoltre il le sar` creato con i permessi standard e a
16 uno dei sistemi pi` ecaci per distruggere una installazione ` un rm -fR eseguito come amministratore nel u e posto sbagliato, e anche se come utente non si pu` danneggiare il sistema, ` comunque molto semplice spazzare o e via tutti i propri dati. 17 il kernel fornisce delle system call che permettono di cambiare i tempi di ultimo accesso e modica di un le, che il comando mv pu` usare per ripristinare i tempi precedenti, ma non ne esistono per cambiare il tempo o di ultimo cambiamento, che corrisponder` pertanto al momento in cui il nuovo le ` stato creato; questa ` una a e e misura di sicurezza che permette sempre di vericare se un le ` stato modicato, anche se si cerca di nascondere e le modiche.

1.2. LARCHITETTURA DEI FILE

13

dellutente che ha lanciato il comando, che risulter` anche il suo proprietario. Se si vogliono a preservare invece le caratteristiche del le originale occorrer` usare lopzione -p.18 a
Opzione -f -i -p -l -s -d -r -R -a -L -b -u Signicato forza la sovrascrittura della destinazione se essa esiste gi`. a richiede conferma in caso di sovrascrittura. preserva tempi, permessi e proprietari del le. crea degli hard link al posto delle copie. crea dei link simbolici al posto delle copie. copia il link simbolico invece del le 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 ` pi` vecchia della e u 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 le indicato tramite il link, se invece si vuole copiare il link stesso occorrer` usare lopzione -d. Il comando permette a 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 ` riportata in tab. 1.6, lelenco completo e ` riportato nella pagina di manuale, accessibile attraverso il comando man cp. e Fino ad ora nel descrivere gli argomenti da dare ai vari comandi che abbiamo trattato, si ` parlato dei nomi dei le o delle directory senza entrare troppo nei dettagli su quale fosse il e formato in cui questi vengono espressi. Negli esempi infatti si sono specicati dei semplici nomi, ma questo dava per scontati alcuni concetti che in realt` non lo sono aatto. a La convenzione usata in tutti i sistemi unix-like ` che nomi dei le sono indicati con un e pathname o percorso, che descrive il cammino che occorre fare nellalbero dei le per raggiungere il le passando attraverso le varie directory; i nomi delle directory sono separati da delle /. Il percorso pu` essere indicato (vedi tab. 1.7) in maniera assoluta, partendo dalla directory radice,19 o ed indicando tutte le directory che si devono attraversare, o in maniera relativa, partendo dalla cosiddetta directory di lavoro corrente. Nel primo caso il pathname inizier` con /, mentre nel a secondo no.
Esempio /home/piccardi/gapil/gapil.tex gapil/gapil.tex Formato assoluto relativo

Tabella 1.7: Formato dei pathname assoluti e relativi.

Finora, specicando solo dei nomi semplici, abbiamo sempre fatto lassunto di operare appunto nella directory di lavoro corrente. Questa directory ` una propriet` specica di ogni processo, e a che viene ereditata dal padre alla sua creazione (questo argomento ` trattato in sez. 1.3.1) ed e indica appunto la directory a partire dalla quale vengono risolti, per quel processo, i pathname relativi. Questo vuol dire che si possono indicare i le presenti in quella directory direttamente, senza doverne specicare il pathname completo a partire dalla radice. Quando si entra nel sistema la directory di lavoro corrisponde alla home 20 dellutente; essa pu` essere cambiata con il comando cd (da Change Directory) seguito dal pathname della dio
per poterlo fare per` occorre eseguire il comando come amministratore. o torneremo sulla struttura dellalbero e sul concetto di radice in sez. 1.2.1 20 ogni utente ha una sua directory personale nella quale pu` tenere i suoi le, che viene chiamata cos` tratteremo o , la questione pi` avanti in sez. 1.2.3. u
19 18

14

CAPITOLO 1. LARCHITETTURA DI UN SISTEMA GNU/LINUX

rectory in cui ci si vuole spostare, mentre la si pu` stampare a video con il comando pwd (da o Print Work Directory. Si tenga presente poi che ciascuna directory contiene sempre21 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 ` contenuta, e 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 le, risalendo lo stesso con luso della directory ... Si noti come entrambe queste due voci (dato che iniziano per .) siano invisibili. Inoltre, come vedremo in sez. 2.1.3, la shell quando deve passare dei pathname ai comandi che operano su le 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 poi riconosce il carattere - che indica il ritorna alla precedente directory di lavoro, torneremo su questo con qualche dettaglio in pi` in sez. 2.1.4. u Come accennato nella sezione precedente le directory sono dei le, anche se sono dei le speciali il cui compito ` solo contenere elenchi di nomi di altri le. Per questo per la creazione di e una directory ` previsto un comando apposito, mkdir, che crea la (o le) directory passate come e argomento. Queste saranno specicate con quello che sar` il loro pathname, in forma assoluta o a relativa. Perch il comando abbia successo ovviamente la parte di percorso che deve contenere e la directory che si vuole creare deve esistere, se non ` cos` si pu` forzare la creazione di tutte le e o directory indicate nel percorso con lopzione -p. Come per la creazione ` necessario un comando apposito, rmdir, anche per la rimozione di e una directory (rm, a meno di non usare lopzione -R che per` cancella tutto anche il contenuto, o rimuove solo i le). Di nuovo il comando prende il nome di una o pi` directory vuote da u cancellare. Se le directory non sono vuote il comando fallisce (vuote signica che non ci deve essere niente a parte le due directory . e ..). Anche in questo caso si pu` usare lopzione o -p che cancella tutto un percorso di directory (che comunque devono essere tutte vuote).

1.2.3

Lorganizzazione delle directory ed il Filesystem Hierarchy Standard

Una delle caratteristiche peculiari di un sistema unix-like ` che lalbero delle directory ` unico; e e non esistono cio` i vari dischi (o volumi) che si possono trovare in altri sistemi, come su Windows, e sul MacOS o sul VMS. Allavvio il kernel monta22 quella che si chiama la directory radice (o root directory) dellalbero, che viene indicata con /, tutti i restanti dischi, il CDROM, il oppy ed qualunque altro dispositivo contenente le, verranno poi montati (vedi sez. 1.2.4) successivamente in opportune sotto-directory della radice. Come per il processo init, che non ` glio di nessun altro processo e viene lanciato direte tamente dal kernel, anche la directory radice non ` contenuta in nessuna altra directory23 e, 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 lesystem 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` essere ottenuto con il comando tree. Se chiamato senza parametri o questo comando mostra lalbero completo a partire dalla directory corrente, scendendo in tutte le directory sottostanti; usando lopzione -L si pu` specicare il numero massimo di livelli a cui o scendere, per cui andando su / avremo qualcosa del tipo:
` compito del comando di creazione di una nuova directory far si che esse siano sempre presenti. e loperazione di rendere visibili ai processi i le contenuti allinterno di un lesystem facendoli compariere allinterno nellalbero delle directory viene detta appunto montare il lesystem. 23 nel suo caso infatti la directory .. ` identica a . ed indica sempre la radice stessa dato che al di sopra non e c` niente. e
22 21

1.2. LARCHITETTURA DEI FILE

15

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 | -- 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

16

CAPITOLO 1. LARCHITETTURA DI UN SISTEMA GNU/LINUX

e questo ci mostra il contenuto sommario primi due livelli dellalbero, con un esempio dei le e delle sottodirectory presenti in una distribuzione Debian. Lorganizzazione dellalbero delle directory ` standardizzata in maniera molto accurata da e un documento che si chiama Filesystem Hierarchy Standard (abbreviato in FHS), a cui tutte le distribuzioni si stanno adeguando.24 Lo standard descrive in dettaglio la struttura dellalbero delle directory e il relativo contenuto, prevedendo una divisione molto rigorosa che permette una notevole uniformit` anche fra distribuzioni diverse; si organizzano cos` in maniera meticolosa ed a ordinata dati, programmi, le di congurazione, documentazione, le degli utenti, ecc.
Directory /bin /boot /dev /etc /lib /mnt /opt /sbin /tmp /usr /var Contenuto comandi essenziali le statici necessari al bootloader le di dispositivo le di congurazione della macchina librerie essenziali e moduli del kernel mount point per lesystem temporanei pacchetti software addizionali comandi di sistema essenziali le 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 ` quello della possibilit` di contenere le il cui contenuto pu` essere modicato (nel qual caso e a o il lesystem che le contiene deve essere montato in lettura/scrittura) o meno (nel qual caso il lesystem pu` essere montato in sola lettura); il secondo ` quello della possibilit` di contenere le o e a (come i programmi di sistema) che possono essere condivisi (ad esempio utilizzando un lesystem di rete) fra pi` stazioni di lavoro o le che invece sono locali e specici alla macchina in questione, u il terzo criterio ` quello di contenere o meno comandi o le (congurazioni e le di dispositivo) e che sono necessari allavvio del sistema, e che pertanto devono essere situati sul lesystem usato per la directory radice, dato che essi non sarebbero disponibili se posti in lesystem diversi che possono essere montati solo dopo che il sistema ` partito. e Lo standard prevede che debbano essere necessariamente presenti le sottodirectory di / specicate 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 lesystem, diversi formati binari).25
Directory /lib<qual> /home /root /proc Contenuto librerie in formati alternativi home directory degli utenti home directory di root lesystem virtuale con le informazioni sul sistema

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

Un elenco delle speciche delle caratteristiche e del contenuto di ciascuna delle sottodirectory di / ` riportato di seguito; per alcune di esse, come /usr e /var, sono previste delle ulteriori e sottogerarchie che deniscono ulteriori dettagli dellorganizzazione dei le.
al momento della stesura di questo testo la versione corrente ` la 2.3, rilasciato come parte delle speciche e LSB (Linux Standard Base) 2.0 che sono in corso di rilascio; nella attuale versione 1.3 delle LSB ` utilizzata la e versione 2.2. 25 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).
24

1.2. LARCHITETTURA DEI FILE /bin

17

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

/boot Contiene tutti i le necessari al procedimento di boot (immagini del kernel, ramdisk, ecc.) eccetto i le di congurazione ed i programmi per limpostazione del procedimento stesso (che vanno in /sbin). Pu` stare su qualunque lesystem purch visibile dal bootloader o e (vedi sez. 5.3.2). /dev Contiene i le di dispositivo, che permettono laccesso alle periferiche. Deve stare sullo stesso lesystem della radice, a meno che non si sia installato nel kernel il supporto per il devfs, che permette di trasferire il contenuto di questa directory su un apposito lesystem virtuale. Contiene i le di congurazione del sistema e gli script26 di avvio. Non deve contenere programmi binari e non pu` stare su un lesystem diverso da quello della radice. I le o possono essere raggruppati a loro volta in directory; lo standard prevede solo che, qualora siano installati, siano presenti le directory /etc/opt (per i pacchetti opzionali), /etc/X11 (per la congurazione di X Window, vedi sez. 3.4) e /etc/sgml (per la congurazione di SGML e XML).

/etc

/home Contiene le home directory degli utenti, la sola parte del lesystem (eccetto /tmp) su cui gli utenti hanno diritto di scrittura. Pu` essere montata su qualunque lesystem. o /lib Contiene le librerie condivise essenziali, usate dai programmi di /bin e /sbin, e deve essere sullo stesso lesystem della radice. Qualora sia stato installato un kernel modulare (vedi sez. 5.1.4) i moduli devono essere installati in /lib/modules. Contiene i mount point (vedi sez. 1.2.4) per i lesystem temporanei ad uso dellamministratore di sistema (i lesystem di periferiche permanenti come i oppy o il CDROM possono essere tenuti sia in questa directory che direttamente sotto /). Normalmente ` e vuota e deve essere creata direttamente sotto la radice. Contiene eventuali pacchetti software aggiuntivi. Pu` essere su qualunque lesystem. o Un pacchetto deve installarsi nella directory /opt/package dove package ` il nome del e pacchetto. Allamministratore ` riservato luso di alcune directory opzionali: /opt/bin, e /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 le di congurazione in /etc/opt, nessun le attinente ai pacchetti deve essere installato al di fuori di queste directory.

/mnt

/opt

` /proc E il mount point standard del lesystem virtuale proc. Questo ` un lesystem spee ciale che permette di accedere a tutta una serie di variabili interne al kernel (relative a parametri e impostazioni di tutti tipi) con linterfaccia dei le. Cos` se si vogliono informazioni sugli interrupt ed i canali di DMA (vedi sez. 5.4.1) utilizzati dal sistema si potranno leggere i le /proc/interrupts e /proc/dma, mentre si potranno impostare varie caratteristiche del sistema scrivendo nei le sotto /proc/sys. ` /root E la home directory dellamministratore. Di norma la si mantiene nello stesso lesystem della radice.
gli script, su cui torneremo in sez. 2.1.6, sono un po gli equivalenti (come potrebbe esserlo una Ferrari in confronto ad una 500) in ambito Unix dei le .bat del DOS, una lista di comandi messi in un le (in realt` i a tratta di un vero di un linguaggio di programmazione) e fatti eseguire automaticamente.
26

18

CAPITOLO 1. LARCHITETTURA DI UN SISTEMA GNU/LINUX

/sbin Contiene i programmi essenziali per lamministrazione del sistema (come init). Deve stare sullo stesso lesystem della radice. Vanno messi in questa directory solo i programmi essenziali per lavvio del sistema, il recupero e la manutenzione dei lesystem. /tmp La directory viene usata per mantenere le temporanei. Viene cancellata ad ogni riavvio, ed i programmi non devono assumere che i le siano mantenuti fra due esecuzioni successive. ` E la directory principale che contiene tutti i le ed i dati non variabili che possono essere condivisi fra pi` stazioni. Di solito viene montata su un lesystem separato rispetto a / u e pu` essere montata in sola lettura. Prevede una ulteriore gerarchia di directory in cui o i vari le vengono organizzati; lo standard richiede obbligatoriamente le seguenti: bin Contiene i programmi usati dallutente installati direttamente dal sistema (o dalla distribuzione originale). Non pu` essere ulteriormente suddivisa. o Contiene le librerie relative ai programmi di bin e sbin. Contiene una replica della gerarchia di /usr dedicata ai le installati localmente dallamministratore. In genere qui vengono installati i programmi compilati dai sorgenti e tutto quello che non fa parte della distribuzione uciale. Contiene le utilit` di sistema non essenziali per lavvio, ad uso dellamminia stratore. Contiene una gerarchia in cui sono organizzati tutti i dati che non dipendono dalla architettura hardware: man per le pagine di manuale, dict per i dizionari, doc per la documentazione, games per i dati statici dei giochi, info per i le del relativo sistema di help, terminfo per il database con le informazioni sui terminali, misc per tutto quello che non viene classicato nelle altre.

/usr

include Contiene tutti gli header le usati dal compilatore e dai programmi C e C++. lib local

sbin share

mentre sono obbligatorie solo se i relativi pacchetti sono installati, le seguenti directory: X11R6 games src /var Contiene la gerarchia dei le relativi ad X Window (vedi sez. 3.4). Contiene i binari dei giochi. Contiene i sorgenti dei pacchetti.

Contiene i le variabili: le directory di spool, i le di log, i dati transienti e temporanei, ` in modo che /usr possa essere montata in sola lettura. E preferibile montarla in un lesystem separato; alcune directory non possono essere condivise. Anche in questo caso i le sono organizzati in una ulteriore gerarchia standardizzata che prevede le seguenti sottodirectory: cache lib local lock opt run spool tmp Dati di appoggio per le applicazioni. Informazioni variabili sullo stato del sistema. Dati variabili relativi ai pacchetti di /usr/local. File di lock. File variabili per i pacchetti di /opt. Dati relativi ai processi in esecuzione. Directory per i dati di spool di varie applicazioni (stampanti, posta elettronica, news, ecc.). File temporanei non cancellati al riavvio del sistema.

1.2. LARCHITETTURA DEI FILE

19

In g. 1.3 ` riportata una rappresentazione graca della struttura generale delle directoe ry prevista dal FHS, (si ` mostrata solo una parte delle directory previste). I dettagli come pleti sulla struttura (cos` come le speciche relative ad i contenuti delle varie directory, pos sono essere reperiti sul documento uciale di denizione 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 partizionamento dei dischi. In tal caso infatti occorrer` stabilire quali directory a dovranno andare sul lesystem usato come radice, e quali altre directory porre su altre partizioni. ` E evidente infatti che alcune directory (come /usr ed /opt) possono essere mantenute su ` partizioni e lesystem diversi rispetto alla directory radice. E pertanto utile separare queste due directory che, contenendo le comuni di norma identici per le diverse installazioni, possono essere montate in sola lettura e non inserite nei backup (in quanto ` possibile sempre ripristinarle e dallinstallazione), o addirittura montate via rete e condivise fra pi` macchine. u La situazione ` invece del tutto diversa per directory come /home e /var. Anche in questo e caso ` opportuno separarle dalle altre directory, ma in questo caso ` necessario laccesso in e e 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 le personali dellamministratore e /etc per le congurazioni) 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 lesystem virtuali. Non ha quindi alcun senso eettuare backup del contenuto di queste directory in quanto esse presentano solo una interfaccia di accesso (che permette per` luso dei normali comandi per o i le) a variabili interne del kernel create dinamicamente.

1.2.4

La gestione delluso di dischi e volumi

Una delle caratteristiche di GNU/Linux che disorientano maggiormente chi proviene da altri sistemi operativi ` la presenza di un unico albero delle directory, come illustrato in sez. 1.2.3. e Non esistendo il concetto di volume o disco come entit` separata, questo signica (come aca cennato in sez. 1.2.3) che i nuovi dischi devono essere inseriti in maniera opportuna allinterno dellalbero, in modo che il loro contenuto possa essere visto allinterno delle opportune directory, con quelloperazione che si chiama montaggio del disco. Allora, a parte la directory radice che viene montata dal kernel allavvio,27 tutti gli altri volumi, che siano lesystem contenuti in partizioni diverse dello stesso disco o in altri dischi,
e come vedremo in sez. 5.3 la denizione di quale sia il dispositivo su cui si trova il lesystem che contiene la radice ` una delle impostazioni fondamentali relative allavvio del sistema. e
27

20

CAPITOLO 1. LARCHITETTURA DI UN SISTEMA GNU/LINUX

CDROM, oppy o qualunque altra forma di supporto che contiene un lesystem, devono essere montati successivamente. Il comando che permette di montare un disco ` mount, che di norma si limita ad invocare e la omonima system call del kernel;28 nella modalit` standard esso viene sempre invocato nella a forma: mount -t filesystem_type /dev/device /path/to/dir dove lopzione -t serve ad indicare il tipo di lesystem contenuto nel device /dev/device (indicato tramite il suo le di dispositivo in /dev) e /path/to/dir indica la directory, detta mount point, in cui esso verr` montato, cio` allinterno della quale verr` reso accessibile il contenuto a e a del lesystem. Il comando richiede la conoscenza del tipo di lesystem presente nel dispositivo che si vuole montare; lelenco dei principali lesystem supportati ` riportato in tab. 1.10; ` possibile comune e que usare anche un meccanismo di ricerca automatico, che viene attivato usando auto come tipo di lesystem. In questo caso viene eettuato automaticamente un controllo se nel dispositivo ` e presente uno dei lesystem riportati nella prima parte (no alla riga orizzontale) di tab. 1.10. Se il riconoscimento non riesce viene eettuato un ulteriore controllo: prima viene letto /etc/filesystem e, se questo non esiste, /proc/filesystem per eseguire una prova con tutti quelli ivi elencati. In genere si usa /etc/filesystem se si vuole cambiare lordine in cui il controllo viene eettuato,29 si pu` poi indicare luso ulteriore di /proc/filesystem terminando o /etc/filesystem con un asterisco (*). Si tenga presente che per poter usare /proc/filesystem occorre che il lesystem virtuale /proc (che abbiamo gi` incontrato in sez. 1.2.3) sia stato preventivamente montato. Un esempio a del formato del le, ` il seguente: e
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 lesystem virtuali sono marcati dalla parola chiave nodev, e non vengono usati nel procedimento di ricerca automatica appena illustrato. Ciascun lesystem ` dotato di caratteristiche proprie, ed in generale ` possibile gestirle ate e traverso lopzione -o di mount, che permette di specicare dei valori delle opzioni che controllano alcune modalit` di funzionamento del lesystem che si va a montare. Alcune di queste opzioni, a riportate in tab. 1.11, sono disponibili in generale, altre sono invece speciche per ciascun tipo di lesystem, e ci torneremo pi` avanti. Inne alcune delle opzioni, in particolare auto, user, u users e defaults e relative negazioni, hanno signicato solo quando usate nel quarto campo di /etc/fstab (su cui torneremo fra breve). Pi` opzioni possono essere specicate simultaneamente u scrivendole tutte di seguito separate da virgole (senza spazi in mezzo).
si tenga inne presente che per alcuni lesystem (in particolare per quelli di rete come nfs e smbfs) per lesecuzione del comando non ` suciente la chiamata alla omonima system call, ma devono essere usati dei e programmi ausiliari, questi vengono lanciati con linvocazione automatica di un corrispondente programma /sbin/mount.TYPE. 29 questo resta utile per provare prima vfat di msdos, evitando che venga usato questultimo quando ` disponibile e il primo, perdendo la relativa informazione.
28

1.2. LARCHITETTURA DEI FILE


Tipo adfs cramfs ext2 ext3 hfs hpfs iso9660 jfs minix ntfs qnx4 reiserfs romfs ufs vxfs xfs befs msdos vfat proc shm devpts usbdevfs nfs coda Descrizione Acorn Disc Filing System, il lesystem del sistema operativo RiscOS. Compressed ROM File System, un lesystem su ROM per sistemi embedded. Second Extended File System, il lesystem standard di Linux. Second Extended File System (lesystem standard di Linux) in versione journalled. Hyerarchy File System, il lesystem del MacOS (non MacOS X). ? File System, il lesystem di OS/2. Il lesystem dei CD-ROM, secondo lo standard ISO 9660. Journalling File System, il lesystem journalled della IBM portato su Linux. Minix File System, il lesystem del sistema operativo Minix. NT File System, il lesystem di Windows NT. QNX4 File System, il lesystem usato da QNX4 e QNX6. Reiser File System un lesystem journalled per Linux. Il lesystem Unix File System, il lesystem usato da vari Unix derivati da BSD (SunOS, FreeBSD, NetBSD, OpenBSD e MacOS X). Veritas VxFS File System, lesystem standard di UnixWare disponibile anche su HP-UX e Solaris. ? File System, il lesystem di IRIX, portato dalla SGI su Linux. BeOS File System, il lesystem del sistema operativo BeOS. Il lesystem elementare usato dallMSDOS. Il lesystem FAT usato da Windows 95/98. Filesystem virtuale che fornisce informazioni sul sistema. Filesystem virtuale che fornisce laccesso ai segmenti di memoria condivisa. Filesystem virtuale per consentire un accesso eciente ai terminali virtuali. Filesystem virtuale contente le informazioni relative al bus USB. Network File System, lesystem per la condivisione di le attraverso la rete attraverso il protocollo NFS creato da Sun. Coda? File System, lesystem distribuito su rete che supporta funzionalit` evolute come autenticazione, replicazione e operazioni a disconesse. SMB File System, lesystem usato per montare le directory condivise di Windows.

21

smbfs

Tabella 1.10: Principali lesystem disponibili su Linux e relativi nomi per lopzione -t di mount.

Oltre a specicare delle modalit` di funzionamento coi valori riportati in tab. 1.11 lopzione a -o consente anche di eettuare alcune operazioni speciali; ad esempio usando lopzione remount diventa possibile rimontare al volo un lesystem gi` montato senza smontarlo, per cambiare a alcune delle opzioni precedenti. Uno degli usi pi` comuni per questa opzione ` quello di rimontare u e in lettura/scrittura un lesystem che si ` montato in sola lettura per poterci eettuare un e controllo. Unaltra opzione molto utile ` loop, che consente di montare il lesystem dal contenuto di e un le (ovviamente il le deve contenere un lesystem completo di un qualche tipo). Cos` ad esempio, se geomorphix.iso ` limmagine di un CD si potr` accedere al contenuto in maniera e a trasparente montandolo come se fosse su un CD con il comando: mount -t iso9660 -o loop geomorphix.iso /cdrom linterfaccia (detta loopback ) inoltre consente anche di montare un lesystem opportunamente cifrato, nel qual caso si dovr` specicare lopzione encryption per indicare lalgoritmo di cifraa tura usato e lopzione keybits per specicare la lunghezza (in bit) della chiave; la password di accesso verr` chiesta sul terminale. a

22
Valore async

CAPITOLO 1. LARCHITETTURA DI UN SISTEMA GNU/LINUX


Signicato tutto lI/O sul lesystem viene eseguito in maniera asincrona, cio` le funzioni di e scrittura ritornano ed ` il kernel che si incarica di eseguire la eettiva scrittura e dei dati nel momento pi` opportuno (` il valore di default). u e Aggiorna il valore del tempo di ultimo accesso ai le presenti sul lesystem (` e il valore di default). tutti i lesystem con questa opzione citati in fstab vengono montati dal comando mount -a (che in genere ` quello che viene eseguito allavvio del e sistema). usa le opzioni di default: rw, suid, dev, exec, auto, nouser, e async. consente luso di le di dispositivo presenti nel lesystem (` il valore di default). e consente lesecuzione di programmi presenti sul lesystem (` il valore di e default). non aggiorna il valore del tempo di ultimo accesso al le (utile quando si vogliono evitare ulteriori accessi al disco). il lesystem deve essere montato esplicitamente (viene ignorato dallopzione -a). non consente luso di le di dispositivo presenti sul lesystem. non consente lesecuzione di programmi presenti sul lesystem. non consente che i bit suid e sgid (vedi sez. 1.4.3) abbiano eetto. monta il lesystem in sola lettura. monta il lesystem in lettura e scrittura (` il valore di default). e consente che i bit suid e sgid abbiano eetto (` il valore di default). e tutto lI/O sul lesystem deve essere sincrono (vale a dire che le funzioni di scrittura prima di proseguire aspettano che i dati vengano scritti su disco). esegue in maniera sincrona le operazioni che comportano una scrittura sulle directory (creazione di link, creazione, spostamento e cancellazione di le, creazione e cancellazione di directory e le di dispositivo). consente anche ad un utente normale di montare il lesystem, il nome utente viene scritto su /etc/mtab e solo lui potr` smontarlo, comporta come restria zioni le opzioni noexec, nosuid, e nodev, se non soprassedute esplicitamente con exec, suid, e dev. solo lamministratore pu` montare il lesystem (` il valore di default). o e consente a qualunque utente di montare o smontare il lesystem, con le stesse restrizioni di user.

atime auto

default dev exec noatime noauto nodev noexec nosuid ro rw suid sync dirsync

user

nouser users

Tabella 1.11: Valori per lopzione -o di mount disponibili per qualunque tipo di lesystem.

Altre opzioni possibili per mount sono -L, che permette di specicare una partizione invece che attraverso il corrispondente le di dispositivo attraverso una etichetta (che deve essere stata impostata in fase di partizionamento, vedi sez. 5.2.2), -v che aumenta la prolissit` dei messaggi, a -w e -r che sono abbreviazioni per -o rw e -o ro. Lelenco completo ` riportato nella pagina e di manuale accessibile con man mount. Come accennato nel funzionamento di mount ` fondamentale il le /etc/fstab, il cui nome e sta per le system table. Questo pu` essere visto come una specie di le di congurazione del o comando. Il formato del le ` molto semplice: ogni linea denisce un lesystem da montare, ed e ` composta da sei campi. Linee vuote o che iniziano per # vengono ignorate, i campi di ogni e linea sono separati da spazi o tabulatori. La pagina di manuale man fstab ne spiega i dettagli; un esempio del suo contenuto `: e
# /etc/fstab: # # file system /dev/hdb5 /dev/hdb6 proc /dev/fd0 /dev/cdrom /dev/sr0 /dev/hdb1 static file system information. mount point / none /proc /floppy /cdrom /mnt/cdrom /boot type ext2 swap proc auto iso9660 iso9660 ext2 options defaults,errors=remount-ro sw defaults defaults,user,noauto defaults,ro,user,noauto defaults,ro,user,noauto rw dump 0 0 0 0 0 0 0 pass 1 0 0 0 0 0 2

1.2. LARCHITETTURA DEI FILE


/dev/hda1 /dev/hdc4 /mnt/win /mnt/zip vfat auto defaults,user,noauto defaults,user,noauto 0 0 0 0

23

Il primo campo descrive il dispositivo su cui sta il lesystem da montare: nel caso in questione si hanno due hard disk (/dev/hda e /dev/hdb con varie partizioni), un oppy (/dev/fd0), uno ZIP (/dev/hdc4), un CDROM ed un masterizzatore SCSI (/dev/cdrom e /dev/sr0, nel caso del CDROM si ` usato un link simbolico). e Avendo abilitato il supporto nel kernel ` stato possibile montare anche il lesystem /proc; e non avendo questo nessun dispositivo (` completamente virtuale) viene montato usando come e dispositivo la parola chiave proc. Se ci fossero stati dei le montati via NFS (cio` le condivisi e sulla rete) si sarebbero avuti anche righe del tipo: firenze.linux.it:/ /mnt/nfs nfs defaults,user,noauto 0 0

in cui si indica come dispositivo la directory remota da montare. Inne se si sono usate le etichette per le partizioni si possono usare queste ultime al posto dei nomi di dispositivo. Il secondo campo del le indica il mount point cio` la directory dove i le del nuovo dispositivo e saranno resi disponibili. Se il lesystem non deve essere montato, come nel caso della partizione di swap (vedi sez. 5.2.5), si usa la parola chiave none. Il terzo campo indica il tipo di lesystem che sta sul dispositivo che si vuole montare, i vari tipi si sono gi` riportati in tab. 1.10. Si noti poi come per /dev/hdb6 sia presente la parola a chiave swap ad indicare che in quel caso il dispositivo non contiene un lesystem, ma viene usato per la swap (vedi sez. 5.2.5). Il quarto campo indica le opzioni con cui si pu` montare il lesystem, riportate in tab. 1.11. o Nel caso si usi lopzione defaults la successiva specicazione di unaltra opzione soprassiede il valore di default. Pi` opzioni vanno specicate in la, separate da virgole e senza spazi interposti. u Gli ultimi due campi sono relativi alla manutenzione del lesystem, il quinto campo indica se eettuare il dump 30 del lesystem 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, uno zero indica che il controllo non deve essere eseguito. Luso principale di /etc/fstab ` il controllo del comportamento del comando mount -a, e che viene utilizzato nella procedura di avvio del sistema per montare automaticamente tutte le directory del sistema (ad esempio /var, /usr e /home) che sono state installate su lesystem separati rispetto alla radice. In questo caso ` necessario marcare la riga relativa con lopzione e auto; per i lesystem che non devono essere montati invece (ad esempio CD-ROM e oppy) si deve specicare lopzione noauto. Il le permette inoltre di semplicare luso di mount poich per i lesystem in esso elencati e il comando pu` essere invocato specicando solo il mount point. Inoltre con questa sintassi o consente luso di mount anche agli utenti normali,31 i quali potranno montare un dispositivo qualora si siano specicate le opzioni user o users nella riga relativa. In questo modo si pu` o permettere agli utenti di montare i propri CD e oppy, senza per` consentirgli di modicare il o mount point o le opzioni di montaggio. Dal punto di vista dellamministrazione base si ha a che fare con /etc/fstab tutte le volte che si aggiunge un disco, o un nuovo dispositivo, o si cambiano le partizioni. In questo caso occorre identicare qual` il le di dispositivo da usare e scegliere nel lesystem una directory e su cui montarlo. Deve poi essere specicato il lesystem da usare (o auto se si vuole tentare il riconoscimento automatico).
30 ` un valore utilizzabile solo per i lesystem (attualmente ext2 e ext3) che supportano il comando di backup e dump (vedi sez. 4.1.4); se attivato con un valore non nullo verranno salvate le informazioni che consentono a dump di eseguire i backup incrementali, per maggiori dettagli si faccia riferimento alla pagina di manuale del comando. 31 loperazione ` privilegiata e pu` essere eettuata in modo generico solo dallamministratore. e o

24

CAPITOLO 1. LARCHITETTURA DI UN SISTEMA GNU/LINUX

Nellesempio si noti come per ZIP e oppy si sia consentito agli utenti di montare il lesystem, ma si sia disabilitato il montaggio allavvio, e pure il controllo dello stato del lesystem, dato che non ` detto che il oppy o lo ZIP siamo sempre nel driver. Lo stesso vale per il CDROM e il e masterizzatore, per i quali si ` pure aggiunto lopzione di montaggio in read-only. Si noti inoltre e lopzione speciale per il lesystem di root, per il quale si ` indicato di rimontare il lesystem in e sola lettura nel caso di errori. Nel caso di disco sso andr` poi scelto se montarlo allavvio o a meno, e in questo caso usare il sesto campo per indicare in quale ordine rispetto agli altri dovr` a essere eettuato il controllo del lesystem (il primo deve essere il lesystem usato come radice). Un altro le collegato alluso di mount ` /etc/mtab, che contiene lelenco dei lesystem e montati. Viene usato da alcuni programmi per leggere questa informazione, ma viene generato automaticamente e non deve essere modicato; lo si pu` sostituire con un link a /proc/mounts o che mantiene le stesse informazioni. Si tenga presente che quando si monta un lesystem su una directory un eventuale contenuto di questultima viene oscurato dal contenuto del nuovo lesystem, e non sar` pi` possibile a u accedervi ntanto che questo non viene smontato. Se per` si sono aperti dei le in essa presenti o 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` operazioni di mount sulla stessa directory, che presenter` il contenuto dellultimo lesystem u a montato (valendo quanto detto prima per il contenuto dei precedenti). In maniera analoga a come lo si ` montato, quando non si ha pi` la necessit` di accedere ad e u a un lesystem, questo potr` essere smontato. In questo modo diventa possibile rimuovere (nel a caso di kernel modulare) le eventuali risorse aggiuntive, e liberare la directory utilizzata per il montaggio per il riutilizzo32 . Il comando in questo caso ` umount33 che prende come parametro sia il mount point che e il le di dispositivo e distacca il relativo lesystem dallalbero dei le. Si tenga presente che ntanto che il lesystem ` utilizzato questa operazione non viene permessa; questo signica e che se si hanno processi che hanno aperto dei le contenuti nel lesystem, o la cui directory di lavoro (vedi sez. 1.3.1) ` ivi contenuta non si potr` smontare il lesystem. Per ovviare a e a questo problema, nelle condizioni in cui ` comunque indispensabile smontare lesystem, si pu` e o usare lopzione -f che forza loperazione. Dal kernel 2.4.11 ` inoltre disponibile un lazy umount, e attivabile con lopzione -l, che distacca immediatamente il lesystem (impedendo ogni ulteriore accesso allo stesso) ma esegue le successive operazioni di pulizia solo quando tutte le risorse occupate vengono liberate. Una sintassi alternativa per il comando ` luso dellopzione -a, che smonta tutti i lesystem e elencati in /etc/mtab (tranne, a partire dalla versione 2.7, /proc), in questo caso ovviamente non ` necessario indicare quale dispositivo smontare, ma si pu` restringere le operazioni a tutti i e o lesystem di un determinato tipo, specicando questultimo con lopzione -t. Lelenco completo delle opzioni del comando ` disponibile nella pagina di manuale, accessibile con man umount. e

1.3

Larchitettura dei processi

In questa sezione prenderemo in esame larchitettura della gestione dei processi, che costituiscono lentit` fondamentale con cui il kernel permette lesecuzione dei vari programmi. Vedremo come i a processi sono organizzati in forma gerarchica, quali sono caratteristiche e propriet` che ciascuno a di essi porta con s, e come vengono gestiti allinterno del sistema. e
32 con le ultime versioni di kernel in realt` questo non ` pi` necessario, in quanto si possono impilare pi` a e u u montaggi sulla stessa directory; ` comunque necessario smontare un device rimovibile come il oppy o il CD, e prima di poterlo estrarre e sostituire. 33 si dice che la n si sia persa nei meandri delle prime implementazioni di Unix.

1.3. LARCHITETTURA DEI PROCESSI

25

1.3.1

Le propriet` dei processi a

Come accennato in sez. 1.1.2 una delle caratteristiche principali dellarchitettura dei processi in un sistema unix-like ` che qualunque processo questo pu` creare nuovi processi; in questo e o contesto il processo originale viene chiamato padre, mentre i processi da lui creati vengono detti gli. La caratteristica distintiva ` che tutti i processi presenti nel sistema possono essere creati e solo in questo modo, e pertanto tutti i processi avranno un padre; lunica eccezione ` quella di e init, il processo iniziale che, venendo lanciato direttamente dal kernel allavvio, non ` glio di e nessun altro processo. Questa caratteristica permette di classicare i processi in una gerarchia ad albero basata sulla relazione padre-glio; in questa gerarchia init viene a ricoprire nel sistema un ruolo speciale, come radice dellalbero. Questa classicazione pu` essere stampata con il comando pstree o che evidenzia in maniera graca lalbero genealogico dei processi presenti nel sistema, con un risultato del tipo:
init-+-atd |-bdflush |-bonobo-moniker|-cron |-evolution-addre |-evolution-alarm |-evolution-calen |-evolution-execu |-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 |-ksoftirqd_CPU0 |-kswapd |-kupdated |-lockd---rpciod |-master-+-cleanup | |-pickup | |-proxymap | |-qmgr | |-smtp

26

CAPITOLO 1. LARCHITETTURA DI UN SISTEMA GNU/LINUX


| |-smtpd | -trivial-rewrite |-oafd |-sshd |-syslogd |-wombat |-wwwoffled -xfs

dove si pu` notare che, come dicevamo allinizio, alla radice dellalbero c` init. o e Si tenga presenta che questa architettura, in cui qualunque processo pu` creare degli altri o processi, ` molto diversa da quella di altri sistemi operativi in cui spesso loperazione di lanciare e un nuovo processo ` privilegiata e non pu` essere eseguita da un programma qualsiasi. e o Una seconda dierenza rispetto ad altri sistemi multiutente come il VMS o NT, ` che in e Linux la creazione di un processo e lesecuzione di un programma sono due operazioni separate, gestite da due system call diverse, la prima delle quali crea un nuovo processo, identico al padre, il quale va ad usare la seconda per eseguire un altro programma.34 Il meccanismo per` permette anche, con una modalit` di funziozamento comune con i server o a di rete, di scrivere un programma unico che esegue pi` processi, in cui il padre esegue la parte u che si occupa di ricevere le richieste, e per ciascuna di esse fa eseguire35 ad un glio creato appositamente le operazioni necessarie a fornire le relative risposte. Il comando che permette di ottenere la lista dei processi attivi nel sistema ` ps; questo ` uno e e dei comandi fondamentali presenti n 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 derivata da SysV devono essere precedute da un -, 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 signicati 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 specicare pi` opzioni con lettere consecutive dopo il -, e ciascuna andr` ripetuta a parte. u a Il comando non richiede nessun argomento, e se eseguito su un terminale senza specicare nessuna opzione ps mostra lelenco dei processi appartenenti allutente che ha eseguito il comando attivi su quel terminale; avremo cio` qualcosa del tipo: e
piccardi@monk:~/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 stesso, pi` leditor ed il visualizzatore di PDF utilizzati per la realizzazione di queste u dispense. Tralasciamo per ora il signicato delle altre colonne, ci torneremo fra poco. Specicando lopzione a verranno visualizzati anche i processi lanciati da altri utenti, purch e facenti riferimento ad un terminale,36 mentre con lopzione x si visualizzano tutti i processi non
per i dettagli del meccanismo si pu` consultare la sezione 3.2 di [1]. o ovviamente usando una istruzione condizionale, essendovi la possibilit` di riconescere se si sta eseguendo il a padre o il glio. 36 prima dellintroduzione delle interfacce grache questa era la modalit` per vedere i processi interattivi lanciati a dagli utenti, in quanto questi potevano essere solo lanciati da un terminale.
35 34

1.3. LARCHITETTURA DEI PROCESSI

27

associati ad un terminale; inne lopzione f permette di mostrare la gerarchia dei processi. Cos` si pu` ottenere un elenco completo dei processi con un comando del tipo: o
[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 106 ? S 0:00 168 ? S 0:00 171 ? S 0:00 176 ? S 0:00 180 ? S 0:00 327 ? 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 ps axf COMMAND [kupdated] [bdflush] [kswapd] [ksoftirqd_CPU0] init [2] [keventd] [kjournald] [kjournald] /sbin/portmap /sbin/syslogd /sbin/klogd /usr/sbin/named /sbin/rpc.statd /usr/sbin/gpm -m /dev/psaux -t ps2 /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

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 eettiva (cio` nello stato R, che spiegheremo fra poco). e Come gi` questi primi esempi ci mostrano, in realt` lo scopo di ps non ` semplicemente a a e quello di fornire la lista dei processi in esecuzione, quanto quello di mostrare le loro caratteristiche; la descrizione del signicato di questultime andar` allora di pari passo con la spiegazione a delloutput del comando. Per ogni processo attivo infatti il kernel mantiene tutta una serie di caratteristiche ed identicatori usati per il controllo delle varie operazioni che esso pu` compiere, insieme ad una serie o di informazioni relative alle risorse da esso utilizzate. Gi` in questi due primi esempi il comando a ci mostra alcune informazioni di base sucienti ad introdurre alcune delle propriet` essenziali a dei processi. La prima colonna dei precedenti esempi, marcata PID, mostra il cosiddetto process id del processo. Questo ` il numero che il kernel utilizza per identicare univocamente ciascun processo; e questo numero viene assegnato alla creazione del processo, ed ` unico ntanto che il processo e ` questo il numero che si deve usare tutte le volte che si vuole fare riferimento ad resta attivo. E uno specico processo. La seconda colonna, marcata TTY, mostra il nome del terminale di controllo del processo. Ogni processo interattivo ` sempre associato ad un terminale di controllo, che corrisponde ape

28

CAPITOLO 1. LARCHITETTURA DI UN SISTEMA GNU/LINUX

punto 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). Se il processo non ` interattivo, o non lo ` attraverso e e linterfaccia a riga di terminale (come un programma che usa linterfaccia graca) non esiste un terminale di controllo e la colonna riporta come valore ?. La terza colonna, marcata STAT, riporta 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.12, torneremo su questo a breve, in quanto ci permette di spiegare varie caratteristiche dellarchitettura dei processi. Seguono inne la colonna TIME che indica il tempo di CPU usato nora dal processo e la colonna COMMAND che riporta la riga di comando usata per lanciare il programma. Per capire il signicato del campo STAT occorrono alcune spiegazioni generali sullarchitettura della gestione dei processi. Come sistema multitasking Linux ` in grado di eseguire pi` processi e u contemporaneamente, in genere per` un processo, pur essendo attivo, non ` assolutamente detto o e che sia anche in esecuzione. Il caso pi` comune infatti ` quello in cui il programma ` in attesa u e e 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 identicati invece dallo stato runnable).
Stato runnable sleep uninterrutible sleep stopped zombie STAT R S D T Z Descrizione Il processo ` in esecuzione o ` pronto ad essere eseguito (cio` ` in attesa e e ee che gli venga assegnata la CPU). Il processo ` in attesa di un risposta dal sistema, ma pu` essere e o interrotto da un segnale. Il processo ` in attesa di un risposta dal sistema (in genere per I/O), e e non pu` essere interrotto in nessuna circostanza. o Il processo ` stato fermato con un SIGSTOP, o ` tracciato. e e Il processo ` terminato ma il suo stato di terminazione non ` ancora e e stato letto dal padre.

Tabella 1.12: Elenco dei possibili stati di un processo in Linux, nella colonna STAT si ` riportata la corrispondente e 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 (caso classico ` la lettura dellinput da tastiera). e Come dettagliato in tab. 1.12 gli stati di sleep sono due, contraddistinti dalle lettere S e D. Il pi` comune ` il primo; lesecuzione della maggior parte delle system call infatti pu` essere u e o interrotta da un segnale (i segnali saranno trattati in sez. 1.3.2), per cui se un processo si blocca nellesecuzione di una di queste esso pu` essere comunque terminato, in alcuni casi (in genere o questo avviene quando la system call sta gestendo la risposta ad un interrupt hardware) questo non ` possibile ed allora si ha uno stato di ininterrutible sleep, in questo caso se il processo resta e bloccato37 nello stato D non pu` pi` essere terminato se non con il riavvio della macchina. Un o u processo in stato D comunque non avr` nessun eetto n sugli altri processi n sul sistema, che a e e continuer` a funzionare senza problemi, a parte quello di non poter liberare le risorse occupate a dal processo. Lo stato di stopped ` relativo ai processi la cui esecuzione ` stata fermata per una richiesta e e dellutente (per fare questo, come vedremo in sez. 1.3.2, si ha a disposizione un segnale apposito), nel qual caso semplicemente il processo non viene eseguito (ma resta in memoria e pu` riprendere o
in genere questo avviene 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.
37

1.3. LARCHITETTURA DEI PROCESSI

29

lesecuzione in qualunque momento) ntanto che non lo si fa ripartire (anche per questo ` previsto e un altro segnale). Inne c` lo stato di zombie, il cui signicato pu` essere compreso solo ritornando con maggiori e o dettagli sulla relazione fra processo padre e gli eventuali gli. La relazione padre/glio infatti ` ben denita nch entrambi i processi sono attivi nel sistema, ma se uno dei due termina e e cosa accade? Alla terminazione di un processo il kernel provvede ad una serie di compiti di pulizia; tutti i le aperti dal processo vengono chiusi, la memoria utilizzata viene liberata e con essa tutte le risorse occupate dal processo. Resta il problema di come noticare lavvenuta conclusione del processo, ad esempio se questa ` stata regolare o ` stata dovuta ad un qualche e e errore, ma soprattutto il problema ` a chi fare questa notica. e Dato che in un sistema Unix tutto viene fatto con i processi, la scelta ` stata quella per cui ` e e compito del padre ricevere lo stato di uscita del glio e controllare se tutto ` andato bene o c` e 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 ` il meccanismo con cui la shell riceve lo stato di uscita dei comandi che si e sono eseguiti. Se questo non viene fatto comunque il processo glio si conclude 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 ` quello che e in gergo viene chiamato uno zombie, cio` un processo che non esiste pi`, perch ` terminato, e u e e ma che mostra una voce con lo stato Z nella lista fornita da ps e che di nuovo non pu` essere o terminato, per il semplice fatto che lo ` gi`. E pertanto compito di chi scrive programmi che e a ` creano processi gli curarsi della ricezione del loro stato di uscita, ed infatti i programmi ben scritti non presentano mai questo problema. Di per s la presenza di uno zombie non ` un grave problema, in quanto esso non occupa e e (a dierenza di un processo bloccato in stato D) nessuna risorsa nel sistema, tranne la voce mantenuta nelloutput di ps. Per` uno zombie occupa comunque una voce nella tabella dei o processi e pertanto se il numero degli zombie cresce si pu` rischiare di saturare questultima, o rendendo inutilizzabile il sistema. Vedremo fra poco per` che, a dierenza dei processi in stato o D, per gli zombie ` possibile risolvere il problema e far si che essi siano terminati regolarmente e 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 ` il padre che termina per primo. Se accade questo e chi ` che ricever` lo stato di terminazione dei gli? Dato che i processi sono eseguiti in maniera e a del tutto indipendente un caso come questo ` assolutamente naturale, e si dice che il glio diventa e orfano. Per questo il sistema controlla, durante le operazioni di terminazione di un processo, se questo ha dei gli, e nel caso assegna a questi ultimi init come nuovo padre.38 Si dice allora che init adotta i gli dei processi che terminano, e sar` lui che gestir`, alla terminazione di questi a a ultimi, la ricezione del loro stato di uscita. Perci`, dato che init ` scritto bene e sa gestire la ricezione dello stato di uscita, tutto quello o e che serve fare per eliminare gli zombie dal sistema ` renderli orfani terminando il processo che e 39 In questo modo essi saranno adottati da init che si curer` immediatamente di li ha generati. a 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 eettivamente lanciati da init quanto dei processi interni al kernel (e da
38 si vedr` cio`, ad una successiva esecuzione di ps con opzioni che permettano di visualizzare il PID del padre, a e che questo ` diventato 1. e 39 per poterlo fare per` occorre avere un processo in grado di eseguire il comando, cosa non facile da ottenere o se si ` gi` esaurita la tabella dei processi. e a

30

CAPITOLO 1. LARCHITETTURA DI UN SISTEMA GNU/LINUX

esso utilizzati) per la gestione di alcuni compiti interni, come lo scarico su disco dei buer, la generazione di eventi dovuti allinserimento di periferiche (usato da USB e PCMCIA), ecc. Nel caso si usa la lettera W per indicare che i processi non usano memoria in user space, il che permette di identicarli. Le altre lettere associate al campo STAT sono >, N e L e indicano rispettivamente una priorit` maggiore o minore di quella standard (torneremo sulla priorit` in a a sez. 1.3.3) e la presenza di pagine di memoria bloccate.40 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` usate ` u che stampa una lista u e con le informazioni pi` rilevanti riguardo lutente, altre opzioni sono v che stampa informazioni u relative alluso della memoria virtuale, e s che stampa informazioni sui segnali. Inne lopzione o permette allutente di specicare un suo formato, con luso di una serie di direttive %X, dove X indica quale propriet` del processo si vuole far comparire nella lista (secondo una tabella di a valori riportata nella pagina di manuale). Se invece si usa la sintassi SysV le opzioni pi` usate sono -e, che permette di selezionare u tutti processi, e -f che permette di avere una lista con pi` informazioni; in tal caso infatti si u avr` come uscita del comando: a
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

E come si vede questa versione riporta una serie di dati in pi`. Anzitutto notiamo che la u 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
questultima ` una caratteristica avanzata che va al di l` di quanto arontabile in questa sede, per una e a trattazione si pu` fare riferimento alla sezione 2.2.7 del secondo capitolo di GaPiL [1]. o
40

1.3. LARCHITETTURA DEI PROCESSI

31

sono mantenute nella forma dei relativi UID (user id ) e GID (group id ).41 Ogni processo in realt` mantiene diverse versioni di questi identicatori,42 ma quelle che poi sono signicative a sono leective user id e leective 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 lreal group id, che identicano lutente che ha lanciato il processo,43 che invece vengono identicati 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 identicare il processo responsabile della produzione degli stessi. La quarta colonna, C, indica, in un sistema multiprocessore, lultima CPU usata dal processo. La quinta colonna, STIME, indica invece il momento in cui il comando ` stato lanciato. Le altre e colonne sono analoghe a quelle gi` viste in precedenza per la sintassi BSD. Un elenco delle a principali informazioni relative ai processi che vengono riportate da ps sono elencate in tab. 1.13, 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` fare riferimento o 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. PID (process ID) del padre del processo. eective user id del processo. eective group id del processo. linea di comando con cui ` stato lanciato il processo. e stato del processo. valore di nice (vedi sez. 1.3.3) del processo. terminale di riferimento del processo. SID o session id (vedi sez. 1.3.4) del processo. process group id (vedi sez. 1.3.4) del processo. percentuale del tempo di CPU usato rispetto al tempo reale di esecuzione. percentuale della memoria sica 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. eective user id del processo. real user id del processo. eective group id del processo. real group id del processo. riga di comando con la quale si ` avviato il processo. e

Tabella 1.13: Le principali propriet` dei processi e ed il nome della relativa colonna nella visualizzazione a eettuata da ps.

Inne ci sono alcune propriet` dei processi, non direttamente visualizzabili con ps, che coa munque sono importanti e vanno menzionate. Come accennato in sez. 1.2.2, ogni processo ha una directory di lavoro rispetto alla quale risolve i pathname relativi; anche questa ` una cae
come vedremo in sez. 1.4.1 il sistema identica ogni utente e gruppo nel sistema con un numero, detti appunto user id e group id. 42 Linux usa ben quattro gruppi di identicatori diversi per gestire il controllo di accesso, secondo uno schema che va al di l` di quanto ` possibile spiegare qui, gli interessati possono trovare una trattazione dellargomento a e nella sezione 3.3 di [1]. 43 di norma questi coincidono con gli identicatori del gruppo eective, ma vedremo in sez. 1.4.3 che esistono casi in cui questo non avviene.
41

32

CAPITOLO 1. LARCHITETTURA DI UN SISTEMA GNU/LINUX

ratteristica del processo, che viene ereditata nella creazione di un processo glio. Lo stesso vale per la directory radice, infatti bench di norma questa coincida con la radice del sistema, essa e pu` essere cambiata con il comando chroot, in modo da restringere un processo in una sezione o dellalbero dei le. Per questo motivo ogni processo porta con s, oltre alla directory di lavoe ro corrente, anche lindicazione della directory che considera come radice, e rispetto alla quale risolve i pathname assoluti. Come si pu` notare ps si limita a stampare la lista dei processi attivi al momento della sua o esecuzione. Se si vuole tenere sotto controllo lattivit` del sistema non ` pratico ripetere in a e 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` batch, consentendo la redirezione delloutput; in tal caso di a solito si usa anche lopzione -n per specicare 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. Inne lopzione -p permette di osservare una lista di processi scelta dallutente, che deve specicarli 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` interattiva il comando permette di inviare dei comandi da tastiera. a I pi` rilevanti sono h e ? che mostrano un help in linea dei comandi disponibili, e q che termina u il programma. Un esempio di output del comando ` il seguente: e
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 ora, uptime,44 numero di utenti e carico medio della macchina; 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 sica 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` mostrati i pi` attivi), evidenziando (con la stampa un grassetto) quelli trovati in stato e u runnable. Le informazioni riportate di default sono il PID del processo (colonna omonima),
44

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

1.3. LARCHITETTURA DEI PROCESSI

33

lutente cui esso appartiene (colonna USER); la priorit` ed il valore di nice (torneremo su questi a in sez. 1.3.3) rispettivamente nelle colonne PR e NI. Seguono i dati delluso della memoria nelle colonne VIRT, RES e SHR; per capire queste quantit` occorre dare qualche dettaglio in pi` sul sistema della memoria virtuale cui abbiamo gi` a u 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 sica eettivamente disponibile. La memoria usata da un processo ` sostanzialmente suddivisa in due parti,45 il e codice del programma e i dati usati dallo stesso. Il programma per essere eseguito dovr` avere il codice ed i relativi nella memoria sica, e a la quantit` di memoria attualmente usata a questo scopo ` quella che ` indicata dalla colonna a e e RES e viene detta residente, che sar` la somma della parte usata per i dati (indicata da DATA) a e della parte usata per il codice (indicata da CODE). Una parte di questultima (ad esempio il codice delle librerie) sar` condivisa con altri processi, e questa viene indicata dalla colonna SHR. a Ci sar` per` anche una parte di memoria che al momento non ` in uso, e che, per liberare della a o e memoria sica a favore di altri programmi che devono essere eseguiti, ` stata temporaneamente e parcheggiata su una area di disco a questo dedicata (detta swap) da cui pu` essere ripresa in o caso di necessit`. Allora il totale della memoria vista dal programma, che a questo punto ` a e virtuale, in quanto non corrisponde a della RAM direttamente accessibile, ` quello espresso e dalla colonna VIRT, che sar` la somma sia della parte residente (quella di RES) che di quella che a ` stata parcheggiata nellarea di swap. e 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 trascorso dallavvio del programma (colonna TIME+) ed il comando usato per lanciarlo (colonna COMMAND), il cui signicato ` analogo a quello gi` visto per ps. e a In generale le informazioni riportate nelle colonne stampate da top sono simili a quelle di ps, anche in alcuni casi esse vengono indicate diversamente. Le principali propriet` mostrate di top a sono riportate in tab. 1.14, per quelle comuni non presenti in detta tabella si faccia riferimento alle omonime di ps riportate in tab. 1.13.
Propriet` a SHR SWAP CODE DATA RES VIRT Descrizione ammontare della memoria condivisa, rappresenta la memoria potenzialmente condivisibile con altri processi. ammontare delle pagine della memoria virtuale di un processo. ammontare della memoria sica utilizzata dal processo per il suo codice eseguibile. ammontare della memoria sica utilizzata dal processo per i suoi dati. ammontare della memoria sica 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` le pagine che sono state u 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` no al centesimo di secondo). a

S TIME+

Tabella 1.14: Propriet` dei processi e nome della relativa colonna nella visualizzazione eettuata da top. a

Una delle caratteristiche di top ` che se viene usato in modalit` interattiva diventa possibile e a dare una serie di comandi da tastiera, ad esempio con k si pu` inviare un segnale (di default ` o e SIGTERM, vedi sez. 1.3.2) mentre con r si pu` cambiare la priorit` (vedi sez. 1.3.3) di un processo. o a Con il comando u si possono selezionare i processi di un utente, con c, si pu` alternare fra la o stampa del nome comando e della riga completa, con d cambiare il periodo di aggiornamento
si sta usando una descrizione brutalmente semplicata, per una trattazione dettagliata dellargomento si pu` o fare riferimento alla sezione 2.2 di [1].
45

34

CAPITOLO 1. LARCHITETTURA DI UN SISTEMA GNU/LINUX

dei risultati. Lelenco completo, oltre che nella pagina di manuale, pu` essere stampato a video o con h. Si noti che nelle righe iniziali top riporta anche delle statistiche complessive sulluso della memoria, queste possono essere ottenute separatamente tramite il comando free, che mostra un riassunto generale del tipo:
piccardi@monk:~/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 sica, mentre lultimo quello della swap (se questa ` attiva, torneremo sullargomento in sez. 5.2.5); la riga centrale ci dice quanto della memoria e viene utilizzata per i buer. Si noti che in genere la RAM libera ` sempre molto poca, questo e ` corretto, in quanto non ha senso lasciare inutilizzata la RAM, ed allora viene impiegata dai e buer del kernel (per gestire pi` ecacemente il trasferimento dei dati verso i dispositivi) e per u mantenere dati temporanei, come riportato nelle colonne buffer e cache.46 Il comando 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. I dettagli sono al solito nella pagina di manuale accessibile con man free.

1.3.2

I segnali

Bench i processi siano di norma entit` separate e completamente indipendenti fra di loro, esistoe a no molti casi in cui ` necessaria una qualche forma di comunicazione. La forma pi` elementare di e u comunicazione fra processi ` costituita dai segnali, che sono usati anche direttamente dal kernel e 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 ` una specie di avviso che viene inviato ad un processo; e non e contiene nessuna informazione oltre al fatto di essere stato inviato. In genere i segnali vengono utilizzati per noticare ai processi una serie di eventi (abbiamo accennato in sez. 1.3.1 che uno di essi viene utilizzato per noticare la terminazione di un processo glio), e possono essere anche inviati a mano attraverso luso del comando kill. Ciascun segnale ` identicato da un numero e ed un nome simbolico; la lista dei segnali disponibili pu` essere ottenuta semplicemente con: o
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
46

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

la colonna shared veniva usata per indicare la memoria condivisa fra pi` processi, adesso ` obsoleta e deve u e essere ignorata.

1.3. LARCHITETTURA DEI PROCESSI

35

I segnali eettivamente usati dal sistema sono i primi 31, gli altri sono chiamati real time signal ed hanno un uso specialistico che va al di l` di quello che possiamo arontare qui.47 In a generale ciascuno di essi ha un compito o un signicato specico, 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` un accesso illegale alla e memoria;48 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` eseguire una opportuna funzione al loro o arrivo. Ad esempio il segnale SIGTERM (che ` quello che il comando kill invia di default) serve e per richiedere la terminazione immediata di un processo, ma il segnale pu` essere intercettato o per eseguire delle operazioni di pulizia come ad esempio cancellare dei le temporanei prima delluscita. Se un segnale non viene intercettato viene eseguita una azione di default che ` specica di e ciascuno di essi. Nella maggior parte dei casi lazione consiste nella terminazione immediata del processo; questa pu` per` avvenire in due modi, o con una semplice uscita o con luscita eseuita o o insieme alla creazione, nella directory di lavoro corrente del processo, di un le core che contiene una copia dello spazio della memoria del processo (viene per questo detto un core dump) che pu` o essere usato con un programma di debug per vedere in che punto c` stata linterruzione. Inne e alcuni segnali (come SIGCHLD, che ` quello che viene usato per noticare al padre la terminazione e di un glio) di default vengono ignorati,49 il programma cio` continua ad essere eseguito senza e nessuna conseguenza. Tipici segnali che causano una semplice uscita sono SIGTERM, il default del comando kill, e SIGINT che ` associato al carattere di interruzione dato dalla tastiera (vedi sez. 1.3.4), un e segnale che invece produce un core dump ` SIGQUIT, cos` come tutti i segnali relativi ad errori e di programmazione come SIGSEGV, SIGFPE, ecc. Un elenco dettagliato dei segnali, del loro signicato e delle azioni di default si pu` trovare nella sezione 9.2 di [1]. o In generale il comando kill permette di inviare un segnale ad un processo qualunque, specicando come parametro il PID di questultimo. Come accennato il segnale inviato di default ` SIGTERM, ma si pu` inviare qualunque altro segnale specicandone numero o nome preceduto e o da un - come opzione; ad esempio: kill kill kill kill -9 1029 -SIGKILL 1029 -KILL 1029 -s SIGKILL 1029

sono modalit` equivalenti di inviare il segnale SIGKILL al processo con PID 1029. Oltre a -s a 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 specico, dato che SIGKILL non ` intercettabile e la sua azione di default ` la tere e minazione del processo, leetto di questo comando ` di terminare senza possibilit` di scampo e a il processo in questione. Se infatti SIGTERM viene intercettato pu` risultare inecace qualora il o
47 per una spiegazione pi` dettagliata al riguardo si pu` fare riferimento alla sezione 9.4.6 del nono capitolo di u o GaPiL. 48 questo ` unaltro dei vantaggi della memoria virtuale, se per un errore di programmazione un processo cerca e 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. 49 nel caso di SIGCHLD non ` proprio il caso di farlo, altrimenti, come spiegato in sez. 1.3.1, ci si ritrover` con e a degli zombie.

36

CAPITOLO 1. LARCHITETTURA DI UN SISTEMA GNU/LINUX

processo venga bloccato anche nellesecuzione della funzione di gestione; dato che non ` possie bile intercettare SIGKILL si ha a disposizione un mezzo infallibile50 per terminare un processo impazzito, e questo senza alcuna conseguenza per gli altri processi o per il sistema. Inne invece del PID si pu` inviare un segnale ad un intero process group (sui process group o torneremo pi` avanti in sez. 1.3.4) usando un valore negativo come parametro; il valore -1 inoltre u ha il signicato speciale di indicare tutti i processi correnti eccetto init ed il processo che esegue il comando. Un comando alternativo a kill, e pi` facile da usare, ` killall che invece di richiedere un u e numero di PID funziona indicando il nome del programma, ed invia il segnale (specicato con la stessa sintassi di kill) a tutti i processi attivi con quel nome. Le opzioni principali disponibili sono riportate in tab. 1.15. Al solito la documentazione completa ` nella pagina di manuale, e accessibile con man killall.
Opzione -g -e -i -l -w Signicato 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.15: Principali opzioni del comando killall.

I segnali sono un meccanismo di comunicazione elementari fra processi, ` cio` possibile utie e lizzarli per dare delle istruzioni (molto semplici, come quella di terminare lesecuzione) ad un processo. Uno dei segnali pi` usati ` ad esempio SIGHUP, che viene utilizzato per dire ai demoni 51 u e di sistema di rileggere il proprio le di congurazione. Alcuni segnali (come SIGSTOP e SIGTERM) sono associati al controllo del terminale e vengono inviati attraverso opportune combinazioni di tasti; torneremo su questo in sez. 1.3.4 quando aronteremo le questioni relative al controllo di sessione.

1.3.3

Priorit` a

Abbiamo visto in sez. 1.3.1 che una delle propriet` dei processi che si pu` modicare con top ` a o e la priorit`. In realt`, come accennato in tale occasione, quello che di norma si pu` modicare a a o non ` tanto la priorit` di un processo, quanto il suo valore di nice. e a La gestione delle priorit` in un sistema unix-like infatti ` abbastanza complessa dato che esia e stono due tipi di priorit`: statiche e dinamiche. Di norma le priorit` statiche vengono utilizzate a a solo per i cosiddetti processi real-time,52 i processi ordinari (tutti, luso di processi real-time ` e riservato a pochi usi specialistici) hanno priorit` statica nulla e il loro ordine di esecuzione viene a stabilito solo in base alle priorit` dinamiche. a Una priorit` statica pi` alta comporta che un processo verr` sempre eseguito prima di ogni a u a altro processo a priorit` pi` bassa. Il che vuol dire che se si lancia un processo a priorit` a u a statica alta che non fa I/O non si potr` fare pi` nulla nel sistema ntanto che questo non si a u
50 quasi infallibile, infatti come accennato in sez. 1.3.1 non ` possibile inviare segnali ad un processo in stato D e perch non pu` riceverli, ed ` inutile inviarli ad un processo in stato Z perch in realt` esso non esiste pi`. e o e e a u 51 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. 52 questo nome ` in realt` fuorviante, Linux, almeno nella sua versione standard, non ` un sistema operativo e a e real-time. Se si ha necessit` di usare un sistema eettivamente real-time occorre usare una versione del kernel a opportunamente modicata come RTAI o RT-Linux.

1.3. LARCHITETTURA DEI PROCESSI

37

sar` concluso (e se c` un errore e il programma si blocca in un ciclo si dovr` necessariamente a e a riavviare la macchina, non avendo modo di eseguire nientaltro). La cosa non vale quando il processo deve fare I/O perch in tal caso anche il processo real-time viene messo in stato di e sleep, ed in quel momento altri processi possono essere eseguiti, lasciando cos` la possibilit` di a interromperlo. Se pi` processi hanno la stessa priorit` statica lordine di esecuzione dipende u a dalla politica di scheduling scelta, che pu` essere di tipo Round Robin, in cui i processi girano o a turno per un tempo sso, 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` statiche (che come accena nato sono anche molto rischiose in caso di errori di programmazione), e ci si ada al normale procedimento di scheduling, basato su un sistema di priorit` dinamiche che permette di ottea nere quella che usualmente viene chiamata la fairness nella distribuzione del tempo di CPU. Tralasciando i dettagli possiamo dire che le priorit` dinamiche sono caratterizzate da un valore a iniziale, che ` quello che poi si chiama nice, che di default ` nullo; pi` un processo viene eseguito, e e u pi` il valore di priorit` dinamica aumenta, e lo scheduler 53 mette sempre in esecuzione, fra tutti u a quelli in stato runnable, il processo che ha una priorit` dinamica pi` bassa. a u Questo fa s` che anche i processi che partono da un valore di nice pi` alto (che viene chiamato u cos` appunto perch i processi che lo usano sono pi` gentili nei confronti degli altri) ottengano e u alla ne una possibilit` di essere eseguiti, secondo quello che appunto ` il meccanismo chiamato a e fairness. Il comando che permette di modicare il valore di nice di un processo ` appunto nice, che e deve essere usato quando si lancia un programma, nella forma: nice [OPTION] [COMMAND [ARG]...] in cui si fa seguire a nice la linea di comando di cui su vuole cambiare la priorit`. Lopzione a principale ` -n che permette di specicare un valore di nice da applicare al programma. Se non e si specica nulla viene applicato un valore di 10. Si ricordi che valori positivi corrispondono ad una diminuzione della priorit`. Lamministratore pu` anche usare valori negativi, aumentando a o cos` la priorit`. I valori possibili sono fra 19 e -20. a Il comando nice pu` essere usato solo quando si avvia un programma, se si vuole cambiare o la priorit` di un programma gi` in esecuzione si pu` usare il comando renice; questo ha una a a o sintassi diversa, del tipo: renice priority [[-p] pid ...] [[-g] pgrp ...] [[-u] user ...] In questo caso la priorit` si indica immediatamente come valore numerico e si pu` specicare a o il processo (o i processi) a cui applicare il cambiamento in tre modi diversi. Con lopzione -p si pu` specicare un processo singolo, indicandone il PID; con lopzione -u si possono selezionare o tutti i processi di un singolo utente; inne con -g si possono indicare tutti i processi di uno stesso gruppo (che come vedremo in sez. 1.3.4 corrispondono ai comandi eseguiti su una stessa riga di shell) specicandone il process group. Al solito si applica la restrizione che solo lamministratore pu` applicare valori negativi, ed o aumentare cos` la priorit` di un processo. Si tenga conto inoltre che, a dierenza di nice, i a valori di renice sono relativi al valore di nice attuale. Pertanto una volta che si ` diminuita e la priorit` di un processo aumentandone il valore di nice un utente normale non potr` tornare a a indietro.
si ricordi (vedi sez. 1.1.1) che lo scheduler ` la parte di kernel che decide quale processo deve essere posto in e esecuzione.
53

38

CAPITOLO 1. LARCHITETTURA DI UN SISTEMA GNU/LINUX

1.3.4

Sessioni di lavoro e job control

La gestione delle sessioni di lavoro ` uno dei punti pi` oscuri della interfaccia a linea di comando e u di un sistema unix-like. Essa origina dagli albori del sistema, quando ci si poteva collegare solo attraverso un terminale, che era lunica modalit` di interazione con il sistema. Questo allora ha a portato a tracciare una distinzione fra i processi interattivi (che quindi erano associati ad un terminale) e quelli non interattivi slegati da un terminale (che abbiamo gi` trovato nelloutput a di ps, nella colonna TTY). In genere questi ultimi sono tradizionalmente chiamati demoni, e sono programmi utilizzati dal sistema per compiere una serie di compiti di utilit`, (come spedire a la posta, eseguire lavori periodici, servire pagine web, ecc.) anche quando nessun utente ` e collegato ad un terminale. Per questo lavorano come suol dirsi in background e non hanno nessun terminale di riferimento. Avendo a disposizione un solo terminale, se questo fosse stato occupato da un solo processo alla volta, non si sarebbero potute sfruttare le capacit` di multitasking del sistema, per questo a venne introdotta uninterfaccia, quella delle sessioni di lavoro e del job control, che permettesse di lanciare ed usare pi` processi attraverso un solo terminale. Oggi, con la possibilit` di avere u a pi` console virtuali, e con linterfaccia graca che non fa riferimento ad un terminale, questo u problema non c` pi`, ma linterfaccia ` rimasta e mantiene comunque una sua utilit`, ad esempio e u e a in presenza di una connessione diretta via modem in cui si ha a disposizione un solo terminale, e si devono eseguire compiti diversi. Questo per` ha comportato che la distinzione fra processi interattivi e non non sia pi` cos` o u semplice, non potendosi pi` basare sulla semplice presenza o meno di un terminale di controllo u perch, con lintroduzione delle interfacce grache, si possono eseguire anche programmi con cui e ` possibile interagire, (attraverso di esse), senza che questi siano associati a nessun terminale. e Comunque ` sempre possibile identicare questi ultimi, in quanto discenderanno dal processo e che gestisce laccesso attraverso linterfaccia graca. Si tenga comunque presente che dal punto di vista del kernel non esiste nessuna dierenza fra processi interattivi e non, esso si limita a mettere a disposizione alcune risorse che possono essere utilizzate per realizzare il controllo di sessione, (in sostanza degli identicatori aggiuntivi come il session id ed il process group id e le funzioni per impostarne il valore, e linvio dei segnali relativi alla gestione), che poi viene realizzato completamente in user space, secondo la modalit` a classica ereditata dai primi Unix. Per capire meglio il signicato di tutto questo, e della dierenziazione fra processi interattivi e non, occorre illustrare una caratteristica fondamentale dellinterfaccia a riga di comando. La shell infatti, nel momento in cui lancia un programma, si cura sempre di automaticamente tre le, che sono immediatamente disponibili.54 Essi sono rispettivamente lo standard input, lo standard output e lo standard error. Dato che questi sono i primi tre le aperti e lo sono in questa sequenza, ad essi vengono assegnati rispettivamente i le descriptor 0, 1 e 2.55 Convenzionalmente56 un programma legge il suo input dal primo le descriptor, scrive loutput sul secondo, e gli eventuali errori sul terzo. Quando un processo ` interattivo (cio` ` stato e ee lanciato direttamente da una shell interattivamente) tutti e tre questi le sono associati al terminale su cui si stava operando, e linterfaccia dei terminali (cio` quella dei dispositivi di questo e tipo) fa s` che in lettura il terminale fornisca quanto scritto sulla tastiera e che quanto scritto sul terminale venga stampato sullo schermo. La gestione delle sessioni di lavoro deriva direttamente dalla procedura di login su terminale.
torneremo su questo in sez. 2.1.5. come accennato in sez. 1.2.2 il sistema mantiene anche una lista dei le aperti dai vari processi, ciascun processo a sua volta ha una lista dei le che ha aperto, il cui indice ` appunto un numero chiamato le descriptor, e per maggiori dettagli riguardo a questa problematica si pu` consultare la sezione 6.1 di [1]. o 56 si tenga presente che ` solo una convenzione, si pu` tranquillamente scrivere un programma che si comporta e o in modo diverso, scrivendo e leggendo da un le qualunque.
55 54

1.3. LARCHITETTURA DEI PROCESSI

39

Negli output di ps mostrati in sez. 1.3.1 si pu` notare come sia presente il processo getty o associato ai sei terminali virtuali (da tty1 a tty6) presenti sullo schermo. Questo ` il processo e che cura in generale la procedura di login, dando lavvio ad una sessione di lavoro. Esso stampa un messaggio di benvenuto preso dal le /etc/issue (vedi sez. 3.1.4). Poi stampa la linea login: ed attende limmissione sul terminale di un nome di login, che viene passato al programma login che si cura di chiedere la password ed eettuare lautenticazione. Se questa ha successo ` login che si incarica di impostare il valore del session id per il processo e in corso, cambiare il proprietario dello stesso allutente che si ` collegato, e lanciare una shell di e login.57 A questo punto si ha a disposizione una riga di comando (torneremo in dettaglio sullinterfaccia a riga di comando in sez. 2.1) e tutti processi lanciati tramite la shell saranno identicati dallo stesso session id ; le informazioni relative alla sessione possono essere visualizzate con lopzione -j di ps, lanciando il comando dal terminale in cui si sta scrivendo queste dispense otteniamo:
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 S S S S S S S S S S S S S S S S S R TIME COMMAND 0:02 init [2] 0:00 gnome-terminal 0:00 \_ gnome-pty-helper 0:00 \_ bash 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 si pu` notare come la shell sia stata ottenuta non da getty ma tramite una o ` sessione di rete fatta partire da sshd, sul terminale virtuale pts/2. E inoltre presente unaltra sessione, associata al terminale virtuale pts/1, creata da gnome-terminal allinterno di una sessione X. Tutti i programmi che si sono lanciati dalla nostra shell (xmms, xdvi, emacs e lo stesso ps) hanno lo stesso SID. La seconda caratteristica della gestione del job control ` che quando si lancia una linea di e comando inoltre 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 process group, e identicati pertanto dallo stesso valore della colonna PGID. Come si pu` notare tutti questi comandi fanno riferimento allo stesso terminale, e vengono o eseguiti insieme; essi infatti sono stati lanciati in background. Questa ` unaltra funzionalit` e a della shell, che fa s` quando si termina una linea di comando con il carattere &, che i processi ,
di nuovo il programma ` sempre lo stesso, e gran parte delle distribuzioni usa come shell di default la bash, ma e una shell pu` essere eseguita anche allinterno di uno script non interattivo, o lanciata come sub-shell allinterno o di una sessione, e per distinguere questo tipo di situazioni, che richiedono comportamenti diversi, il comando viene lanciato con le opportune opzioni, che contraddistinguono poi quella che viene appunto chiamata una shell di login e una shell interattiva.
57

40

CAPITOLO 1. LARCHITETTURA DI UN SISTEMA GNU/LINUX

vengano mandati in esecuzione sospendendo momentaneamente laccesso al terminale. Se, come accade per xmms, xdvi e emacs il processo non ha bisogno del terminale (nel caso perch sshd e esegue il forwarding la sessione X, per cui linterazione avviene attraverso linterfaccia graca) questi continuano ad essere eseguiti senza accedere pi` al terminale. Quando per` un processo u o in background dovesse tentare di eettuare una lettura o una scrittura sul terminale, verrebbe automaticamente inviato un segnale (rispettivamente SIGTTIN e SIGTTOU) a tutti i processi nello stesso process group, la cui azione di default ` quella di fermare i processi. Cos` se ad esempio e si fosse lanciato in background leditor jed (che opera solo tramite terminale) questo si sarebbe immediatamente fermato, e alla successiva operazione sulla shell, avremmo avuto un avviso, con un qualcosa del tipo:
piccardi@anarres:~/gapil$ jed prova & [3] 8657 piccardi@anarres:~/gapil$ [3]+ Stopped jed prova

Un altro modo di mandare un processo in background ` attraverso luso del segnale SIGSTOP, e che ` associato alla combinazione di tasti C-z,58 questo ferma il processo, che pu` essere fatto e o 59 Oltre a SIGSTOP, quando un processo ` associato ripartire in background con il comando bg. e ad un terminale di controllo, si possono mandare altri segnali con delle opportune combinazioni di tasti: C-c invia un SIGINT e C-\ invia un SIGQUIT. Lelenco dei processi in background pu` essere stampato con il comando jobs, che mostra o la lista ed il relativo stato di ciascuno di essi. Un processo pu` essere riassociato al terminale o (cio` messo in foreground ) con il comando fg, questo pu` prendere come parametro sia il PID e o del processo (indicato direttamente) che il numero di job stampato da jobs, che deve essere preceduto da un carattere %, sintassi che pu` essere usata anche per il comando kill, quando o questo ` realizzato anchesso come comando interno della shell (come avviene nel caso della e bash).

1.4

Il controllo degli accessi

Come gi` detto e ripetuto pi` volte, Linux ` nato come sistema multiutente e nella sua archia u e tettura ` nativa la possibilit` di avere utenti diversi che lavorano sulla stessa macchina. Questo e a ovviamente comporta la necessit` di un meccanismo di controllo degli accessi, che permetta di rea stringere le capacit` dei singoli in maniera che questi non possano recare danni (volontariamente a o involontariamente che sia) agli altri o al sistema.

1.4.1

Utenti e gruppi

Essendo nato come sistema multiutente, ogni kernel di tipo unix-like come Linux deve fornire dei meccanismi di identicazione dei vari utenti sulla base dei quali poi possa venire imposto un adeguato controllo degli accessi e delle operazioni che questi possono fare. La struttura di sicurezza tradizionale di un sistema unix-like ` estremamente semplice, tanto e da essere in certi casi considerata troppo primitiva60 e prevede una distinzione fondamentale fra
cio` luso del tasto control insieme alla lettera z, la notazione ` formalizzata in sez. 2.4.2. e e attenzione, questo, come i seguenti fg e jobs, ` un comando interno della shell, e non corrisponde a nessun e eseguibile su disco, vedremo la dierenza in sez. 2.1.3. 60 sono previste estensioni speciche, 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` di denire in maniera molto pi` a u dettagliata i privilegi di accesso, sottoponendo anche lamministratore ad ulteriori restrizioni; questo necessita ovviamente di un bel po di lavoro amministrativo in pi` per cui non ` detto che sia sempre utilizzata. u e
59 58

1.4. IL CONTROLLO DEGLI ACCESSI

41

lamministratore del sistema, tradizionalmente identicato dallusername root, per il quale non viene eettuato nessun controllo, e tutti gli altri utenti per i quali invece vengono eettuati vari controlli previsti per le operazioni che li richiedono. In genere ogni utente ` identicato con un numero, lo user-ID o uid. Questo ` nullo per e e lamministratore e diverso da zero per tutti gli altri utenti. I controlli vengono eettuati sulla base di questo numero, se ` diverso da zero si verica se corrisponde a quello per cui la richiesta e ` consentita, e nel caso si nega o concede laccesso. Si noti il se, qualora luid sia nullo il controllo e non viene neanche eettuato: ` per questo che root ` sempre in grado di compiere qualunque e e operazione.61 Per questo motivo 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` elementare u ` fatta dal programma login, che richiede allutente il nome che lo identica di fronte al sistema e (detto username) ed una password che ne permette di vericare lidentit` (torneremo sulla a gestione di questi aspetti in sez. 4.3). Gli utenti poi possono venire raggruppati in gruppi, ogni gruppo ha un nome (detto group name) ed un relativo identicatore numerico, il group-ID o gid. Inoltre ogni utente ` sempre e associato almeno un gruppo, detto gruppo di default; di norma si fa si che questo contenga solo lutente in questione e abbia nome uguale allusername. Un utente pu` comunque appartenere a o pi` gruppi, che possono cos` venire usati per permettere laccesso ad una serie di risorse comuni u agli utenti dello stesso gruppo. Ogni processo, quando viene lanciato, eredita dal padre linformazione relativa allutente che lo ha creato (e a tutti i gruppi cui questo appartiene). In questo modo una volta entrati nel sistema tutti i programmi verranno eseguiti per conto dellutente che ha eettuato il login. Il sistema pu` cos` provvedere al controllo degli accessi, e porre una serie di limitazioni a quello o che lutente pu` fare, impedendo lesecuzione di tutte le operazioni non consentite; si evita cos` o che utenti diversi possano danneggiarsi fra loro o danneggiare il sistema. Il comando che permette di vericare chi ` lutente che lo sta eseguendo (identicando cos` e le proprie credenziali) ` whoami, che stampa il nome di login (comunemente detto username) e con qualcosa del tipo:
piccardi@monk:~/truedoc/corso$ whoami piccardi

Per vericare invece di quali gruppi si fa parte si pu` usare il comando groups; questo, o invocato da un utente normale, non vuole parametri e stampa i gruppi cui questo appartiene, ad esempio:
piccardi@anarres:~/gapil$ groups piccardi cdrom audio

se invece il comando viene usato dallamministratore pu` prendere come parametro un username, o nel qual caso stampa i gruppi cui appartiene detto utente. Entrambi i comandi non hanno opzioni se non quelle standard GNU che vedremo in sez. 2.2.1. Inne il comando id permette di stampare in generale tutti i vari identicatori associati ad un processo, sia di gruppi che degli utenti, sia reali che eettivi ed in forma sia letterale che numerica. Il comando prende molte opzioni che permettono di specicare nei dettagli quali informazioni stampare, al solito si pu` fare riferimento alla pagina di manuale, accessibile con o man id, per la documentazione completa.
e per questo ` da evitare assolutamente luso di root per qualunque compito che non sia strettamente connesso e allamministrazione del sistema.
61

42

CAPITOLO 1. LARCHITETTURA DI UN SISTEMA GNU/LINUX

1.4.2

I permessi dei le

Anche la gestione dei permessi dei le ` tutto sommato piuttosto semplice; esistono estensioni62 e che permettono di renderla pi` sottile e essibile, ma nella maggior parte dei casi il controllo di u accesso standard ` pi` che suciente. In sostanza per il sistema esistono tre livelli di privilegi: e u 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 signicato ` abbastanza ovvio. e Ogni le ` associato ad un utente, che ` detto proprietario del le e ad un gruppo; per e e ciascuno dei tre livelli di privilegio (utente, gruppo e altri) ` possibile specicare uno dei tre e permessi; 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 3810 -rw-r--r-1 piccardi piccardi 4553 -rw-r--r-1 piccardi piccardi 3848 -rw-r--r-1 piccardi piccardi 3913 -rw-r--r-1 piccardi piccardi 4419 -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 Sep Sep Sep Sep Sep Oct Oct Jan Jan Sep Sep Sep Sep Jan Jan Jan Jan Jun 4 10 9 10 10 9 14 26 1 4 10 10 10 10 4 1 4 4 10 00:46 00:45 19:39 00:45 00:45 19:39 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 ElemDaytimeTCPClient.c ElemDaytimeTCPCuncServ.c ElemDaytimeTCPServer.c ElemEchoTCPClient.c ElemEchoTCPServer.c 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 g. 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 le di dati, e cio` e il permesso di scrittura solo per il proprietario, quello di lettura per tutti quanti (proprietario, gruppo e altri) e lassenza del permesso di esecuzione. Nel caso di un programma invece (come il getparam nellesempio) i permessi di default sono diversi, ed il permesso di esecuzione ` abilitato per tutti; lo stesso vale per le directory, dato che e in questo caso il permesso di esecuzione ha il signicato che ` possibile attraversare la directory e quando si scrive un pathname. In generale un utente pu` eettuare su un le solo le azioni per le quali ha i permessi, questo o comporta ad esempio che di default un utente pu` leggere i le di un altro ma non pu` modicarli o o o cancellarli; il proprietario di un le pu` sempre modicarne i permessi (con il comando chmod, o
62

come le ACL (Access Control List), introdotte ucialmente a partire dai kernel 2.5.x.

1.4. IL CONTROLLO DEGLI ACCESSI

43

Figura 1.4: Legenda dei permessi delloutput di ls.

vedi sez. 1.4.4) per allargarli o restringerli (ad esempio i le della posta elettronica normalmente non hanno il permesso di lettura). Al solito tutto questo vale per tutti gli utenti eccetto lamministratore che non ` soggetto a e nessun tipo di restrizione e pu` eseguire qualunque operazione. In genere poi ogni distribuzione o fa s` che tutti i le di congurazione ed i programmi installati nel sistema appartengano a root, cosicch diventa impossibile per un utente normale poter danneggiare (accidentalmente o meno) e gli stessi63 .

1.4.3

I permessi speciali

Quelli illustrati in sez. 1.4.2 sono i permessi standard applicati ai le, esistono per` altri tre o permessi speciali. Ciascun permesso in realt` corrisponde ad un bit in una apposita parola a mantenuta nellinode (vedi sez. 1.2.2) del le. I bit usati per i permessi sono in realt` 12, i primi a nove sono quelli gi` illustrati in g. 1.4, gli altri tre vengono rispettivamente chiamati, dal loro a nome suid bit, sgid bit e sticky bit. Per i le normali tutti questi permessi hanno signicato64 solo al caso di programmi eseguibili.65 I primi due servono per modicare il comportamento standard del sistema, che quando esegue un programma lo fa con i permessi dellutente che lo ha lanciato. Per consentire luso di privilegi maggiori impostando il suid bit o lo sgid bit si consente al programma di essere eseguito rispettivamente con i privilegi dellutente e del gruppo cui questo appartiene. In questo modo si pu` far eseguire anche ad un utente normale dei compiti che nel caso o generico sono riservati al solo amministratore. Questo ad esempio ` il modo in cui funziona il e comando passwd, che se usato da root non ha restrizioni, ma se usato da un utente normale consente si di modicare la password, ma solo la propria e fornendo prima quella corrente. Per poter fare questo occorre comunque laccesso in scrittura al le della password (propriet` di a root) che viene garantito con luso del suid bit.

Figura 1.5: Schema dei bit dei permessi mantenuti nellinode. questa ` una delle ragioni per cui i virus sono molto pi` dicili da fare con Linux: non essendo possibile ad e u un utente normale modicare i le di sistema, un virus potr` al pi` infettare i le di quellutente, cosa che rende a u molto pi` dicile la sua diusione. u 64 con leccezione del cosiddetto mandatory locking, una estensione ripresa da SysV, che viene attivato impostando lo sgid bit su un le non eseguibile. 65 nel caso si cerchi di attivarli per uno script essi vengono comunque, come misura di sicurezza, disattivati.
63

44

CAPITOLO 1. LARCHITETTURA DI UN SISTEMA GNU/LINUX

Lo sticky bit ` al giorno doggi sostanzialmente inutilizzato, serviva nelle prime versioni di e Unix, quando memoria e disco erano risorse molto scarse e gli algoritmi per la memoria virtuale poco ranati, a privilegiare luso della swap mantenendovi permanentemente i programmi usati pi` di frequente. Ha assunto per`, come vedremo a breve, un signicato speciale per le directory. u o La situazione completa dei bit associati ai permessi ` illustrata in g. 1.5. Data corrispone denza diretta con il contenuto dellinode, ed considerato il fatto che i gruppi di permessi sono raggruppati naturalmente a gruppi di tre bit, una notazione comune ` quella di indicarli direte tamente con il valore numerico di questa parola espressa in notazione ottale, cos` che ogni cifra corrisponde, a partire dalla meno signicativa, ai permessi per tutti gli altri, per il gruppo, e per il proprietario. Per cui i permessi di g. 1.5, corrispondenti ai valori gi` mostrati in g. 1.4, si a possono specicare direttamente con la cifra 640. Volendo specicare uno dei permessi speciali occorrer` ovviamente usare anche una quarta cifra, secondo lo specchietto di g. 1.5. a Al contrario di quanto avviene con i permessi normali, i permessi speciali non hanno a disposizione una posizione a parte 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` rispettivamente mostrata una s66 nel permesso di esecuzione per utente e gruppo. Lo a sticky bit invece modica la lettera che indica il permesso di esecuzione per tutti in una t.67 Finora abbiamo parlato di permessi applicati ai le normali, ma gli stessi permessi possono essere anche applicati ad una directory68 nel qual caso essi vengono ad assumere un signicato diverso. Se infatti ` immediato dare un senso al leggere una directory (per mostrare i le che e vi sono elencati), o allo scriverla (per aggiungere nuovi le e directory), non ` immediato capire e cosa possa signicare il permesso di esecuzione. Questo infatti viene ad assumere un ruolo particolare, ed indica che la directory pu` essere o attraversata nella risoluzione del nome di un le. Se cio` manca il permesso di esecuzione, si e potr` leggere il contenuto di una directory, ma non si potr` pi` accedere a quello delle eventuali a a u sottodirectory, mentre nel caso opposto, pur non potendone mostrare il contenuto, si potr` a accedere ai le che essa contiene (purch se ne conosca il nome, ovviamente). e Inoltre, come accennato in precedenza, lo sticky bit assume per le directory un signicato particolare: se esso viene attivato pur in presenza di un permesso di scrittura per tutti, solo gli utenti proprietari di un le potranno cancellarlo; questo ` ad esempio la modalit` in cui viene e a protetta la directory /tmp, in cui tutti possono scrivere ma in cui, per la presenza dello sticky bit, gli utenti non possono cancellare i le creati dagli altri. Inne per le directory luso dello sgid bit viene utilizzato per far s` che i nuovi le creati in una di esse abbiano come gruppo proprietario non quello del processo che li ha creati, ma quello che ` proprietario della directory stessa. Questo permette al gruppo proprietario della directory e di mantenere automaticamente la propriet` dei le in essa creati. a Si noti come a dierenza di altri sistemi operativi (ad esempio il VMS) non esista un permesso specico per cancellare un le. Questa ` unaltra caratteristica, derivata dallarchitettura dei e le illustrata in sez. 1.2.2, che spesso lascia perplesso chi si accosta le prime volte ad in sistema unix-like, dato che sarebbe intuitivo associare la cancellazione di un le al suo permesso di scrittura. Se per` ci si ricorda cosa signica in realt` la cancellazione di un le si capisce subito che in o a eetti i permessi di un le non contano niente, dato che questa consiste solo nella rimozione di un riferimento dalla directory. Il che comporta che per cancellare un le tutto quello che serve ` il permesso di scrittura sulla directory che lo contiene, dato che ` questa che viene modicata; e e i permessi del le sono completamente ignorati.
o una S qualora il corrispondente permesso di esecuzione non sia attivo. che come per i precedenti diventa una T qualora il corrispondente permesso di esecuzione non sia attivo. 68 ed in generale a tutti gli altri le speciali presenti sul lesystem: hanno un signicato speciale per` solo per o le directory; per fo e le di dispositivo contano solo i permessi di lettura e scrittura, mentre per i link simbolici essi vengono ignorati.
67 66

1.4. IL CONTROLLO DEGLI ACCESSI

45

1.4.4

La gestione dei permessi dei le

Inizieremo a trattare il problema della gestione dei permessi dei le, esaminando con qualche dettaglio in pi` sulle modalit` con cui nuovi le e directory vengono creati. Il comportamento u a di default dei programmi infatti sarebbe quello di creare i nuovi le con i permessi di lettura e scrittura attivati per tutti dove con tutti qui si vuole intende sia il proprietario, che il gruppo, che tutti gli altri, cio` un permesso numerico in forma ottale di 666. Per le directory invece e viene attivato anche il permesso di esecuzione, per cui il valore corrispondente sarebbe 777. Ovviamente lasciare aperti i permessi di scrittura a chiunque non ` cosa molto saggia dal e punto di vista della sicurezza. Per questo motivo il kernel mantiene anche, per ogni processo, una propriet` specica, chiamata umask, che viene ereditata nella creazione di un processo glio. a La umask specica una maschera di bit, nella stessa forma mostrata in g. 1.5, che serve, nella creazione di un nuovo le o directory, a cancellare dai permessi ad esso assegnati tutti i bit in essa specicati. 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 gli ` suciente farlo allinizio e perch quanto scelto sia mantenuto anche in seguito. Un utente pu` comunque modicare il e o valore di questo parametro invocando il comando umask specicando come argomento un nuovo valore69 con qualcosa del tipo: umask 027 Il valore dellargomento di umask pu` essere specicato sia in forma numerica, come nel caso o precedente, che in forma simbolica, nel qual caso si deve specicare quali permessi conservare. Se invocato senza parametri il comando permette di visualizzare il valore corrente, e con lopzione -S si stampa il valore in forma simbolica anzich numerica. Di norma un utente personalizza e questo valore negli script di avvio della shell (vedi sez. 2.1.6). Allora se un processo ha una umask di 022 (il valore di default) signica che il permesso di scrittura per il gruppo e tutti gli altri saranno automaticamente cancellati alla creazione di un nuovo le o directory. Questo vuol dire che i nuovi le saranno creati con permessi 644 (tutti i permessi per il proprietario e sola lettura per il gruppo e gli altri), mentre le nuove directory saranno create con permessi 755 (di nuovo tutti i permessi per il proprietario ma solo lettura e attraversamento per il gruppo e gli altri). Se ad esempio si fosse voluto cancellare tutti i permessi per gli altri, si sarebbe dovuta usare una umask di 027. Il comando che permette di modicare direttamente i permessi di le e directory ` chmod. e Nella sua forma pi` elementare esso prende come parametri il valore (espresso in forma numerica u ottale) dei permessi seguito dal nome (o dalla lista) del le. I permessi possono anche essere espressi in forma simbolica, usando le lettere elencate in sez. 1.4.2; in tal caso essi possono essere espressi nella forma: [gruppo][operatore][permesso] Il gruppo specica a quale gruppo di permessi si fa riferimento, esso pu` essere u per indicare o il proprietario (user ), g per indicare il gruppo (group) e o per indicare gli altri (others), pi` il u valore a che indica tutti quanti (da all ), si possono specicare pi` gruppi usando pi` lettere. u u Loperatore indica il tipo di modica che si vuole eettuare, e pu` essere + per aggiungere o un permesso, - per toglierlo, e = per impostarlo esattamente al valore fornito. Questultimo pu` o essere w per la scrittura (write), r per la lettura read e x per lesecuzione execute. Inoltre per gruppo e proprietario si pu` usare s per impostare i corrispondenti sgid e suid, mentre con t si o pu` impostare lo sticky. o
si tenga presente che questo ` un comando interno della shell (vedremo il signicato di ci` in sez. 2.1.3), dato e o che linvocazione di un altro programma non servirebbe a nulla, in quanto la system call che esegue loperazione opera solo sul processo corrente.
69

46

CAPITOLO 1. LARCHITETTURA DI UN SISTEMA GNU/LINUX

Cos` ad esempio a+x aggiunge il permesso di esecuzione per tutti (cosa di solito necessaria quando si scrive uno script), mentre o-r toglie il permesso di lettura per gli altri, g+w aggiunge il permesso di scrittura al gruppo e u+s attiva il suid bit. Si possono anche combinare pi` u espressioni scrivendole di la separate da virgole, cos` ad esempio con g+w,o-r si abilita la scrittura per il gruppo, e si disabilita la lettura per tutti gli altri. Si tenga presente che un utente pu` cambiare i permessi solo dei le che gli appartengono, o deve cio` esserne proprietario, il permesso di scrittura non basta. Inoltre quando si usa il e programma con un link simbolico verranno cambiati i permessi del programma referenziato dal link e varranno le credenziali (utente e gruppo) di questultimo. Il comando supporta anche luso dellopzione -R che, quando lo si applica ad una directory, esegue la modica dei permessi ricorsivamente per tutto il tratto di albero dei le contenuto nella stessa. La versione GNU/Linux del comando supporta anche lopzione --reference=FILE che permette di prendere i permessi di un altro le. 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` essere necessario anche cambiare proprietario e gruppo di un le (o o di una directory). Per questo si usano rispettivamente i due comandi chown e chgrp; il primo cambia il proprietario ed il secondo il gruppo. Entrambi prendono come primo argomento lutente (o il gruppo per chgrp) da assegnare, seguito dalla lista dei le su cui operare. Le opzioni sono simili a quelle di chmod, ed in particolare -R esegue dei cambiamenti ricorsivamente su tutto il contenuto di una directory e --reference usa i valori di un altro le. Inoltre chown supporta per il nome utente anche la sintassi username.group che permette di cambiare anche il gruppo. Ovviamente assegnare utente e gruppo ad un le ` una operazione privilegiata, si tenga e 70 un utente normale non pu` assegnare ad un altro utente i suoi le, presente che su Linux o e pu` soltanto cambiare solo il gruppo dei le che gli appartengono, ed assegnarli soltanto ad o altri gruppi cui egli stesso appartiene. Solo lamministratore ha la capacit` piena di cambiare a proprietario e gruppo di un le qualunque.

1.4.5

Altre operazioni privilegiate

Oltre allaccesso ai le esistono altre operazioni che devono sottostare al controllo di accesso. Una di queste ` la possibilit` di inviare segnali ad un processo, cosa che un utente pu` fare e a o solo con i processi che appartengono a lui, restrizione che non vale (come tutte le altre) per lamministratore che pu` inviare segnali a qualunque processo. o Altre operazioni privilegiate sono quelle che riguardano la rete (che tratteremo a partire da cap. 7). Solo lamministratore pu` attivare e disattivare interfacce, modicare la tabella di o instradamento dei pacchetti, applicare o rimuovere regole al sistema di rewall. Allamministratore inoltre ` riservato lallocazione delle prime 1024 porte usate dai protocolli UDP e TCP, per e cui di norma soltanto lui ` in grado di lanciare demoni che usano una di queste porte (dette per e questo riservate) come un server web, di posta o un DNS. Unaltra operazione riservata, come gi` visto in sez. 1.2.4, ` il montaggio dei lesystem, a e anche se ` possibile delegare in parte la possibilit` di eseguire questa operazione agli utenti. Ma e a lesecuzione generica del comando mount con parametri qualunque pu` essere eettuata soltanto o dallamministratore. Inne soltanto lamministratore ` in grado di creare i le speciali relativi ai dispositivi, e cio` solo root pu` usare il comando mknod per creare un le di dispositivo. Questo prende come e o parametri il nome del le seguito da una lettera, che indica il tipo di le speciale, e pu` essere p o per indicare una fo, b per indicare un dispositivo a blocchi e c per indicare un dispositivo
70

questa ` una caratteristica di sicurezza usata anche da BSD, ma che non ` detto sia presente su tutti gli Unix. e e

1.4. IL CONTROLLO DEGLI ACCESSI

47

a caratteri. Qualora si crei un le di dispositivo (che sia a blocchi o a caratteri ` lo stesso) e devono poi essere specicati di seguito il major number ed il minor number 71 che lo identicano univocamente.72 Si noti che creare un le di dispositivo ` una azione diversa dallaccedere al dispositivo e sottostante, cosa che invece ` regolata dai permessi di questultimo (come le). Pertanto se si ` e e stati poco accorti e si ` permesso agli utenti laccesso in scrittura a /dev/hda, anche se questi non e possono creare un le di dispositivo, potranno comunque scriverci sopra ed ad esempio saranno tranquillamente in grado di ripartizionare il disco. Si tenga presente per` che per un utente ` comunque possibile creare una fo usando il o e comando dedicato mkfifo, che prende come argomento il nome della stessa. Il comando supporta anche lopzione -m che permette di specicare la maschera dei permessi (con la stessa sintassi di chmod) da applicare alla stessa. Inne alcuni lesystem supportano delle operazioni speciali, che non rientrano nella normale gestione dei le, attraverso quelli che vengono chiamati gli attributi. Questi sono una serie di capacit` aggiuntive, fornite dai lesystem che le supportano, che possono essere attivata o meno a per ciascun le.73 Alcuni di questi attributi (in particolare quelli che permettono di imporre delle speciali restrizioni allaccesso) possono essere impostati soltanto dallamministratore, questo ` il e motivo per cui si ` scelto di trattare questo argomento in questa sezione. e Facendo riferimento ad estensioni che non ` detto siano presenti su tutti i lesystem74 gli e attributi dei le non possono essere visualizzati con il comando ls, per visualizzarli esiste un comando apposito, lsaddr. Il comando ` analogo a ls sia per luso degli argomenti, che per luso delle opzioni -R, -a e e -d che hanno lo stesso signicato visto in tab. 1.3. Il comando stampa a video lelenco dei le, preceduto dal relativo valore degli attributi speciali, pertanto se lo eseguiamo sui le di queste dispense otterremo qualcosa del tipo:
[piccardi@gont corso]$ lsattr *.tex ----------------- advadmin.tex ----------------- appendici.tex ----------------- config.tex ----------------- corso.tex ----------------- netadmin.tex ----------------- netbase.tex ----------------- netinter.tex ----------------- ordadmin.tex ----------------- ringraziamenti.tex ----------------- shell.tex ----------------- stradmin.tex ----------------- struttura.tex

che ci mostra come nessun attributo speciale sia stato impostato.75 Quando uno di essi ` attivo e questo viene indicato nellelenco dalla presenza della lettera che lo identica (vedi tab. 1.16) al posto del carattere -.
71 questi due numeri sono il meccanismo con cui storicamente vengono identicati i dispositivi allinterno del kernel (cosi come gli inode identicano un le); il nome sotto /dev ` solo una etichetta, potrebbe essere qualunque e (anche se poi molti script non funzionerebbero), quello che indica al kernel quale dispositivo usare quando si accede a quel le sono questi due numeri. 72 per una lista completa delle corrispondenze di questi numeri con i vari dispositivi si pu` fare riferimento al o le devices.txt distribuito con i sorgenti del kernel nella directory Documentation. 73 come per tutte le altre propriet` di un le, anche la lista degli attributi attivi viene mantenuta allinterno a dellinode. 74 queste estensioni sono state introdotte con ext2, ma sono supportate anche dagli altri i lesystem pi` comuni u usati con Linux, come ext3 e reiserfs. 75 questo ` il caso normale, gli attributi speciali infatti vannno impostati esplicitamente, i le vengono sempre e creati senza che nessuno di essi sia presente.

48

CAPITOLO 1. LARCHITETTURA DI UN SISTEMA GNU/LINUX

Il comando che permette di impostare gli attributi speciali ` chattr, questo prende come prie mo argomento una stringa che identica quali attributi attivare o disattivare, e come argomenti successivi una lista di le. Il comando supporta anche lopzione -R per eseguire ricorsivamente le operazioni quando nella lista dei le si ` inclusa una directory. e
Attributo A a Signicato blocca laggiornamento del tempo di ultimo accesso. attiva il cosiddetto append ag,76 che consente la scrittura solo in coda al le, il contenuto corrente non pu` essere modicato. Solo o lamministratore pu` attivare o disattivare questo attributo. o attiva la compressione trasparente del contenuto del le. richiede che il contenuto della directory sia salvato su disco in maniera sincrona. esclude il le dalla registrazione dei dati necessari ad eseguire il backup con dump (vedi sez. 4.1.4). segnala un errore nella compressione quando questa ` stata attivata; e lattributo pu` essere solo letto da lsattr. o segnala che una directory viene indicizzata con gli hash tree (una funzionalit` avanzata trattata in sez. 5.2.3); lattributo pu` essere solo letto a o da lsattr. attiva il cosiddetto immutable ag, il le non pu` essere cancellao to o rinominato, non si possono creare hard link n modicarne il e contenuto.77 richiede che tutti i contenuti del le siano prima scritti sul giornale (tratteremo il journalling dei lesystem in sez. 5.2.3). Solo lamministratore pu` attivare o disattivare questo attributo. o richiede che quando un le viene cancellato tutti i blocchi che contenevano i suoi dati siano riscritti su disco azzerandone il contenuto.78 richiede che il contenuto del le sia salvato su disco in maniera sincrona. richiede che alla cancellazione il contenuto del le sia salvato in modo da poterne consentire il recupero. permette di accedere direttamente al contenuto di un le compresso disabilitando la decompressione trasparente. indica che un le compresso ` in uno stato inconsistente (dirty); e lattributo pu` essere solo letto da lsattr. o Tabella 1.16: Gli attributi speciali dei le.

c D d E I

S u X Z

La stringa che permette di specicare quali attributi attivare o disattivare ` analoga a quella e usata con chmod per i permessi, ciascun attributo ` identicato da una lettera, riportata in e tab. 1.16,79 per attivare un attributo occorrer` farla precedere dal carattere +, mentre se si a vuole cancellare un attributo gi` impostato si dovr` usare il carattere -; come per chmod si a a possono specicare insieme anche pi` attributi. u Come accennato alcuni attributi, che solo lamministratore pu` impostare, permettono di o utilizzare delle speciali restrizioni di accesso, ad esempio con a si attiva lappend ag che consente soltanto di aggiungere dati ad un le mentre il contenuto corrente non pu` essere o modicato; questo pu` essere utilizzato per salvaguardare i le di log (vedi sez. 3.3.3) da eventuali o modiche accidentali o meno.80
` cio` possibile aprire un le in scrittura soltato se lo si fa nel cosiddetto append mode, per una trattazione di e e questo argomento si pu` consultare il cap. 6 di [1]. o 78 in sostanza, oltre ad impedirne la rimozione dalla directory in cui di trova ` impossibile modicare sia il e contenuto del le che dellinode, pertanto anche tutte le altre caratteristiche del le (permessi, proprietario, ecc.) non possono essere modicate. 78 di default infatti il kernel si limita a marcare i blocchi come liberi, ma non cancella il precedente contenuto, che potrebbe pertanto essere riletto. 79 non si sono menzionati nella tabella alcuni attributi sperimentali, per i quali si rimanda alla lettura della pagina di manuale di chattr. 80 in genere i le di log sono la prima cosa che un intruso cerca di modicare, con la presenza di questo attributo
78

1.4. IL CONTROLLO DEGLI ACCESSI

49

Un altro attributo che permette di attivare una protezione speciale ` iche abilita limmutable e ag che nch ` attivo impedisce qualunque tipo di modica al le. E si noti questo vale anche ee per le operazioni richieste dallamministratore stesso, un le immutabile potr` essere cancellato o a modicato soltanto se prima ne viene rimosso il relativo attributo. Di nuovo questa funzionalit` a permette di proteggere le essenziali in modo da impedirne ogni forma di modica. Potremo allora attivare alcuni di questi attributi (ad esempio lappend ag per un le di log, o limmutable ag per /etc/fstab), in questo caso baster` eseguire i comandi: a
[root@gont corso]# chattr +a /var/log/auth.log [root@gont corso]# 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` anche vericare che non ` pi` possibile modicare /etc/fstab: a e u
[root@gont corso]# touch /etc/fstab touch: cannot touch /etc/fstab: Permission denied

nonostante il comando sia stato eseguito con privilegi di amministratore.

questo gli viene impedito ntanto che lattributo non viene rimosso; bench nelle operazioni ordinarie questo sia e sempre possibile se si hanno i privilegi di amministratore, esistono delle modalit` operative (dette capabilities) in a cui ` possibile cedere questa capacit` e rendere pertanto impossibile una successiva rimozione dellattributo. e a

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 grache, 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 grache del tutto analoghe a quelle presenti in altri sistemi operativi nati in tempi pi` recenti, linterfaccia a riga u di comando resta di fondamentale importanza, dato che 30 anni di storia e migliaia di persone che ci han lavorato sopra per migliorarla, la hanno resa la pi` potente e essibile interfaccia u utente disponibile.

2.1.1

La losoa 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 losoa in un articolo riportato anche nella pagina info (vedi sez. 2.3.1) del pacchetto dei coreutils GNU. In sostanza la losoa progettuale della shell e dei comandi a riga di comando si pu` capire o 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` ` molto dicile vedere un professionista usare il coltellino svizzero per il suo lavoro. Un oe professionista ha bisogno di attrezzi professionali, e un carpentiere non costruisce una casa con un coltellino svizzero, ma con tanti attrezzi ciascuno dei quali ` specializzato nello svolgere un e compito specico. Le persone che han 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 nale, che deve conoscere solo quello, in pratica questo sarebbe stato dicile 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 (la Unix toolbox ), con in testa un criterio fondamentale: che ciascun programma facesse una sola cosa, nel miglior modo possibile. Questa ` la caratteristica fondamentale dei programmi base di un sistema unix-like come e GNU/Linux. Ogni comando1 ` progettato per eseguire un compito preciso: ls mostra la lista e dei le, ps la lista dei processi, cp copia un le, chmod cambia i permessi, man mostra le pagine di manuale, ecc. I comandi hanno uno scopo preciso e precise funzionalit`; le opzioni sono limitate a
ne abbiamo incontrati gi` diversi nel corso della trattazione delle caratteristiche del sistema in cap. 1, ne a faremo una trattazione sistematica fra breve.
1

51

52

CAPITOLO 2. LA SHELL E I COMANDI

e comunque speciche 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, cosicch divenisse possibile eseguire, con una opportuna combinazione, e 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` che serviva e che non era stata prevista u allinizio. Questo ` il ruolo della shell, cio` del programma che implementa linterfaccia a riga di e e comando; ` attraverso di essa che, concatenando vari comandi, si pu` costruire lequivalente di e o una catena di montaggio, in cui il risultato di un comando viene inviato al successivo, riuscendo a compiere compiti complessi con grande velocit` e essibilit`, e spesso fare anche cose che gli a a autori dei singoli programmi neanche si sarebbero immaginati.

2.1.2

Le principali shell

La modalit` tradizionale con cui si utilizza linterfaccia a riga di comando `, come accennato a e in sez. 1.3.4 quando un utente, una volta completata la procedura di autenticazione, inizia una sessione di lavoro su un terminale. Questo signica semplicemente che il programma login conclude il suo compito lanciando la shell assegnata allutente (che come vedremo in sez. 4.3.3 ` specicata dallultimo campo di /etc/passwd). Oggi con le interfacce grache si hanno molte e altre modalit` di accesso ad un terminale (ad esempio attraverso una nestra che contiene un a terminale virtuale), in ogni caso, una volta predisposta lopportuna interfaccia di accesso, verr` a comunque lanciata una shell. Si ricordi comunque che per il kernel, secondo la losoa fondamentale di Unix illustrata in sez. 1.1.1, la shell resta un programma come tutti gli altri; essa ha per` un compito fondamentale, o che ` quello di fornire linterfaccia che permette di lanciare altri programmi. Inoltre ` sempre la e e shell che permette di usufruire di tutta una serie di ulteriori funzionalit` messe a disposizione a dal kernel, come il controllo di sessione visto in sez. 1.3.4. Dato che la shell ` un programma come gli altri, essa pu` essere realizzata in diversi modi, e o ed in eetti nel tempo sono state realizzate diverse shell. Anche in questo caso ci sono stati due loni di sviluppo, il primo deriva dalla prima shell creata, la Bourne shell, chiamata cos` dal nome del suo creatore. La Bourne shell ` la shell pi` antica e le sue funzionalit` sono anche state e u a standardizzate dallo standard POSIX.2. Il secondo lone deriva da unaltra shell, realizzata con una sintassi alternativa, pi` simile a quella del linguaggio C, e chiamata per questo C shell. u Ciascuno di questi due loni ha dato vita a varie versioni con funzionalit` pi` o meno a u avanzate; un breve elenco delle varie shell disponibili anche su GNU/Linux ` il seguente: e Bourne shell e derivate. La Bourne shell. La prima shell di Unix, in genere utilizzata semplicemente con il comando sh. Non viene praticamente pi` usata. In GNU/Linux ` sostituita da bash2 u e o da ash. Sugli altri sistemi che rispettano lo standard POSIX, ` di norma sostituita e da ksh. La Bourne-Again SHell. La bash ` la shell di riferimento del progetto GNU. Il e suo nome ` un gioco di parole sul nome della Bourne shell, in sostanza una shell e rinata. Viene utilizzata con il comando bash. Incorpora molte funzionalit` avanzate, a come la storia dei comandi (detta history), lauto-completamento dellinput sulla linea di comando (per comandi, nomi di le e qualunque altra cosa, date le opportune
che quando viene invocata come sh fornisce esclusivamente le funzionalit` previste dallo standard POSIX.2, a disabilitando le varie estensioni di cui ` dotata. e
2

2.1. LINTERFACCIA A LINEA DI COMANDO.

53

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

2.1.3

Introduzione alla sintassi della riga di comando

Come accennato lo scopo della shell ` quello di implementare linterfaccia a riga di comando, e cio` mettere a disposizione dellutente un meccanismo con cui questi possa essere in grado di e mettere in esecuzione i vari programmi che vuole utilizzare. Pertanto il compito principale della shell ` quello di leggere una riga di comando dalla tastiera, riconoscere qual ` il programma che e e volete mettere in esecuzione, ricostruire i vari argomenti da passare al programma stesso, e poi eseguirlo. La forma generica di un qualunque comando ` nella forma: e comando
3

-o ption argomento1 --altra-opzione argomento2 --riopzione=valore

sul mio sistema conta la bellezza di 5266 righe, ed in eetti pi` che una pagina ` un manuale! u e

54

CAPITOLO 2. LA SHELL E I COMANDI

da scrivere sulla stessa riga4 e terminare con la pressione del tasto di invio. La sintassi prevede cio` che si scriva sempre allinizio della riga (eventuali spazi antistanti e verranno comunque ignorati) il nome del comando da eseguire, seguito da opzioni ed argomenti. Si tenga presente che la shell, per identicare 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` di uno (o pi`) spazi o tabulatori5 dice che si sta passando dal nome del comando ad un e u argomento o opzione, o da un argomento/opzione al successivo. Per questo il nome di un comando non pu` contenere spazi, inoltre ` la stragrande maggioo e ranza dei comandi usa nomi scritti esclusivamente in lettere minuscole (si ricordi che un sistema unix-like ` case-sensitive), i soli caratteri non alfabetici utilizzati (molto poco) sono il - o il _ e ed eventualmente i numeri, gli altri infatti, come vedremo fra breve, vengono interpretati dalla shell assumendo signicati speciali, e pertanto di nuovo non possono essere inseriti nel nome del comando. La dierenza fra opzioni e argomenti ` che le prime attivano funzionalit` o modalit` di e a a operazione speciche del comando, mentre i secondi indicano gli oggetti (solitamente dei le) su cui questo opera. In realt` il meccanismo ` un po pi` complesso, e pu` essere compreso a e u o nei dettagli solo con un po di nozioni di programmazione,6 quello che in eetti fa la shell ` e identicare il programma da usare sulla base del nome del comando, e 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` suddiviso a in una lista di stringhe, che poi programma dovr` utilizzare al suo interno. Si pu` inoltre dire a o alla shell di utilizzare come separatore caratteri diversi dagli spazi vuoti, indicando quelli da usare con la variabile (tratteremo le variabili di shell pi` avanti) IFS. u Gran parte dei programmi per gestire gli argomenti e le opzioni passate dalla linea di comando utilizzano una serie di funzioni fornite dalla libreria di fondamentale del sistema, la GNU C library di g. 1.1.7 Questo comporta, per i programmi che usano queste funzionalit`, la presenza a di un formato della riga di comando abbastanza uniforme, mostrato appunto nellesempio precedente, con la possibilit` di distinguere fra opzioni e argomenti, e di specicare questi in un ordine a qualunque. Si tenga presente per` che questo non ` sempre vero, dato che non tutti i programmi o e fanno ricorso a queste funzionalit`, per cui troveremo anche in seguito svariate eccezioni (ad a esempio in cui lordine conta, e le opzioni vanno specicate prima degli argomenti). Nel comportamento comune comunque le opzioni sono sempre costituite da un carattere - seguito da una lettera (in rari casi anche numeri o caratteri non alfabetici), cui pu` seguire (seo parato o meno da uno spazio) un eventuale valore passato come parametro (non tutte le opzioni lo prevedono, per alcune va specicata solo la lettera dellopzione). Una forma alternativa per le opzioni, in uso principalmente con i programmi del progetto GNU che utilizzano le funzionalit` citate e anchessa mostrata nellesempio precedente, ` quella in cui lopzione ` scritta in a e e forma estesa, e allora viene introdotta da un --, in questo caso, qualora essa necessiti di un
4 il terminale in genere va a capo da solo o fa scorrere la riga se lo spazio disponibile sullo schermo nisce, si pu` per` scrivere un comando su pi` righe utilizzando il carattere \ per proteggere la pressione del tasto di o o u invio (che altrimenti passerebbe la linea di comando alla shell) e andare su una nuova riga senza che la linea di comando venga ad essere interrotta. 5 qualora si vada a capo su una nuova riga con luso della \ illustrato nella nota precedente, anche il carattere di a capo viene considerato come uno spazio vuoto. 6 per i curiosi questo argomento ` trattato nei dettagli nella sezione 2.3 di [1]. e 7 la funzionalit` si chiama getopt, e permette luso di una sintassi standard per le opzioni, la scansione autoa matica delle stesse indipendentemente dallordine in cui le si specicano, la possibilit` di identicare opzioni con a parametri o senza, la capacit` di passare al programma, una volta terminata la scansione della lista di stringhe a ottenuta dalla shell, solo quelle contenenti gli argomenti restanti; per una trattazione pi` dettagliata si pu` fare u o riferimento alla sez. 2.3.2 di [1].

2.1. LINTERFACCIA A LINEA DI COMANDO.

55

parametro, il relativo valore deve essere assegnato con luso di un = (torneremo su questo in sez. 2.2.1). Cos` se per esempio scrivete sul vostro terminale una riga di comando contenente un qualcosa del tipo:
piccardi@anarres:~$ rm -f pippo pluto paperino

la shell capir` che volete invocare il comando rm ed individuer` il le che contiene il relativo proa a gramma su disco e lo lancer` passandogli lintera riga, spezzata nelle cinque stringhe delimitate a dagli spazi. La prima stringa contiene il nome del programma e di norma viene ignorata,8 le restanti invece verranno analizzate dal programma; cos` -f verr` identicata come opzione mentre, a non necessitando questa di nessun parametro, pippo, pluto e paperino verranno considerati come argomenti, che nel caso indicano i le da cancellare. Si tenga conto poi che bench la losoa di Unix sia quella di utilizzare un apposito comando e per eettuare ciascun compito specico, e che il caso pi` comune sia quello appena illustrato in u cui la shell interpreta la riga di comando per lanciare il programma che le avete chiesto, esistono alcune funzionalit` che essa vi fornisce direttamente tramite alcuni comandi interni (detti anche a built-in); in questo caso la shell si accorger` che non ` necessario eseguire nessun programma a e a parte ed operer` direttamente sulla base di quanto dite sulla linea di comando. Di norma i a comandi interni sono quelli che servono a eseguire impostazioni relative al funzionamento stesso della shell, o a impostare propriet` generali che essa deve trasmettere ai programmi che essa a lancia. Un esempio classico di questi comandi interni ` cd; questo comando, che serve a modicare e la directory di lavoro corrente della shell, non pu` essere eseguito con un programma esterno, o dato che nellesecuzione questultimo potrebbe solo cambiare la directory di lavoro corrente per s stesso, ma non quella della shell. Alcuni di questi comandi interni, ad esempio quelli relativi e al controllo di sessione, li abbiamo gi` incontrati in sez. 1.3.4, altri li vedremo pi` avanti. a u Inne occorre sottolineare che quanto appena detto illustra solo il caso pi` elementare della u sintassi usata dalla shell, quello in cui volete lanciare un comando scrivendo direttamente questultimo con le relative opzioni ed argomenti. Vedremo nel corso delle successive sezioni, in cui introdurremo le altre funzionalit` della shell, come in realt` sulla linea di comando si possano a a eettuare anche altre operazioni, e come il suo utilizzo possa essere modicato attraverso luso di opportuni caratteri di controllo.

2.1.4

Funzionalit` interne della shell a

Oltre a quello generico di lanciare programmi, gi` lesempio precedente con rm ci mostra come a la shell esegua di per s anche molti altri compiti. Il primo che prenderemo in esame ` quello e e della visualizzazione del prompt, cio` di quella scritta che compare sulla sinistra della linea di e comando, a anco della quale, quando non avete scritto nulla, lampeggia il cursore e che serve ad avvisarvi che la shell ` in attesa di ricevere dei comandi da eseguire. e Nel caso della bash il prompt ` completamente personalizzabile, e pu` contenere diverse e o informazioni. Quello che viene stampato come prompt ` stabilito da una variabile di shell PS1,9 e (tratteremo delle variabili di shell poco pi` avanti) nel cui contenuto, oltre ai normali caratteri che u saranno stampati inalterati, si possono inserire una serie di caratteri di controllo (i principali dei quali sono riportati in tab. 2.1) che verranno automaticamente espansi in un determinato valore
alcuni programmi invece usano questa stringa per modicare il loro comportamento, ad esempio gzip, un compressore di le, pu` essere invocato anche come gunzip (in genere entrambi i comandi sono presenti come o hard link allo stesso le eseguibile) nel qual caso decomprimer` invece di comprimere. a 9 in realt` in tutto le variabili che controllano laspetto del prompt sono 4, ed oltre PS1 ci sono anche PS2, PS3 a e PS4; dettagliare il loro scopo va oltre le possibilit` di questa introduzione, ma la loro descrizione si trova nella a pagina di manuale, nella sezione Shell Variables.
8

56

CAPITOLO 2. LA SHELL E I COMANDI

(come data, utente, stazione, ecc.). Lelenco completo ` disponibile nella pagina di manuale, alla e sezione PROMPTING.
Opzione \d \H \u \w \W \$ \! \t \T Signicato la data in formato tipo: Tue May 26. in nome della stazione. lo username dellutente. il path 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.1: 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:~/Truelite/documentazione/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 vi trovate a lavorare contemporaneamente con diversi utenti, su computer diversi, allora vi sar` utile sapere con quale utente state a operando in un certo terminale; altrimenti potete farne a meno e risparmiare spazio sulla linea di comando con un valore di PS1 come \$. Come ripetuto pi` volte la vera funzione della shell ` quella di semplicarvi la vita; per u e questo al di l` dellestetica del prompt, essa fornisce una lunga serie di funzionalit` generiche a a che permettono di rendere pi` ecace luso dei comandi. Una delle funzionalit` fondamentali u a ` quella delle variabili di shell. La shell vi permette cio` di denire e modicare delle variabili, e e in questo caso la sintassi della riga di comando cambia e potrete utilizzare una assegnazione del tipo: VARIABILE=valore e si noti per` che in questo caso non ci sono pi` spazi a separare il nome della variabile dal o u suo valore, qualora infatti si mettessero degli spazi la shell interpreterebbe VARIABILE come il nome di un comando, e probabilmente riporterebbe un errore non trovando un programma corrispondente. Per convenzione le variabili di shell si scrivono con lettere maiuscole, ma ` appunto solo e una convenzione, dovuta al fatto che cos` ` pi` dicile confonderle con i comandi, ma in realt` e u a ` possibile usare qualunque tipo di lettera ed, eccezion fatta per liniziale del nome, anche e qualunque numero ed il carattere _. Lelenco delle variabili di shell gi` denite (vedremo in sez. 2.1.6 come eettuarne limpoa stazione al login o quando si lancia un terminale) si pu` ottenere con il comando set,10 che o ne stampa a video la lista coi relativi valori, mentre per cancellarne una denita in precedenza si pu` usare il comando11 unset seguito dal nome della variabile. La modica si eettua o semplicemente assegnando alla variabile il nuovo valore.
in realt` oltre alle variabili set stampa anche tutte le funzioni denite nella shell stessa; questo comporta che a in certi casi loutput pu` essere molto lungo ed essendo le variabili stampate per prime si rischia di non riuscire o a vederle; si tenga inoltre presente che questo comando viene anche usato, quando invocato con le opportune opzioni, per impostare una lunga serie di altre propriet` della shell; per lelenco completo di questultime si pu` a o fare riferimento alla sua descrizione nella sezione SHELL BUILTIN COMMANDS della pagina di manuale. 11 anche questo, come il precedente ` un comando interno interno alla shell. e
10

2.1. LINTERFACCIA A LINEA DI COMANDO.

57

La caratteristica delle variabili di shell ` che una volta denite ` possibile recuperarne il e e valore precedendone il nome con il carattere $, cos` se nella variabile MAIL mettete la directory in cui si trova la vostra posta elettronica, potrete guardare il contenuto della directory con un comando del tipo:
[piccardi@gont piccardi]$ ls -l $MAIL -rw-rw---1 piccardi mail 4136 Aug 25 17:30 /var/mail/piccardi

in genere cio` potrete utilizzare qualunque variabile in una linea di comando referenziandola e anteponendo un $ al suo nome, in tal caso infatti la shell nelleseguire la scansione della linea sostituir` automaticamente alla variabile il suo contenuto, e passer` questo come argomento (o a a come opzione, a seconda del valore) al comando che viene eseguito. Si noti che mentre la shell provvede la sintassi e gli opportuni comandi interni per assegnare e cancellare la singola variabile, altrettanto non accade per la visualizzazione della stessa. Questo avviene perch questo compito pu` essere eseguito attraverso luso di uno dei tanti comandi e o specialistici della Unix toolbox. In particolare il comando da usare ` echo, il cui solo compito ` e e stampare in 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` usare echo per leggere il contenuto di una variabile con una riga del tipo: a
piccardi@anarres:~/Truelite/documentazione/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 video. a Il comando echo ` uno dei pi` elementari e prende due sole opzioni. La prima ` -n, che evita e u e la stampa del carattere di a capo alla ne della stringa passata come argomento. Questa ` utile e quando si vuole costruire una riga con pi` invocazioni e la si usa in genere allinterno di uno u script (accenneremo agli script in sez. 2.1.6), dato che sul terminale si avrebbe linterferenza da parte del prompt. La seconda opzione ` -e che attiva linterpretazione di una serie di caratteri e speciali, la cui espressione, insieme a tutti gli altri dettagli relativi al comando, si trova nella relativa pagina di manuale, accessibile con man echo. La bash denisce di suo (o utilizza qualora siano gi` denite) tutta una serie di variabili a (come IFS, cha abbiamo gi` incontrato), che permettono sia di controllarne il funzionamento a che di accedere ad una serie di informazioni. Un elenco delle principali ` riportato in tab. 2.2, e lelenco completo ` descritto nella sezione Shell Variables della pagina di manuale. e Una delle altre funzionalit` che la shell fornisce con luso delle variabili, ` quella dellambiente a e (in inglese environment), esso viene utilizzato per poter utilizzare il valore di alcune variabili di shell anche allinterno dei programmi che questa mette in esecuzione.12 Non tutte le variabili denite nella shell sono per` inserite nellambiente in quanto molte di esse (come PS1) sono o di interesse esclusivo della shell. Se si vuole inserire una variabile nellambiente lo si deve fare esplicitamente usando il comando interno export seguito dal nome della variabile, che deve essere gi` denita.13 Lo stesso risultato si pu` ottenere con luso del comando interno declare, a o
12 in sostanza quando un programma quando viene lanciato con la opportuna chiamata al sistema (largomento ` trattato nel capitolo due di [1]), deve ricevere una serie di informazioni da chi lo lancia; una parte di queste e informazioni sono gli argomenti, che vengono presi direttamente da quanto scritto nella riga di comando con il meccanismo illustrato in sez. 2.1.3, laltra parte sono appunto le variabili di ambiente, che vengono denite appunto nellenvironment. 13 la bash supporta anche la denizione della variabile nella stessa linea in cui viene esportata nellambiente, con una sintassi del tipo export VAR=val; questa per` ` una estensione che non ` supportata da altre shell per oe e cui quando si scrivono script ` il caso di evitare questa sintassi per mantenere la compatibilit`. e a

58
Variabile HOSTNAME OSTYPE PWD GLOBIGNORE HISTFILE HISTFILESIZE HISTSIZE HOME IFS PATH

CAPITOLO 2. LA SHELL E I COMANDI


Signicato Il nome della macchina. La descrizione del sistema operativo corrente. La directory di lavoro corrente. Una lista, separata da :, di nomi di le da ignorare nel lename globbing. Il le in cui viene memorizzata la storia dei comandi. Il massimo numero di linee da mantenere nel le della storia dei comandi. Il numero di comandi da mantenere nella storia dei comandi. La home directory dellutente. Il carattere che separa gli argomenti sulla linea di comando. La lista delle directory in cui si trovano i comandi. Tabella 2.2: Principali variabili di shell.

che serve in generale ad assegnare variabili e funzioni (tratteremo queste ultime in sez. 2.1.6) o impostarne gli attributi. Il comando prevede diverse opzioni, riportate in tab. 2.3, ma con luso dellopzione -x ` del tutto equivalente ad export. Per rimuovere una variabile di ambiente si e utilizza sempre unset.
Opzione -a -f -i -r -t -x -F -p Signicato dichiara una variabile vettoriale. stampa solo le funzioni. dichiara una variabile intera. rende variabile in sola lettura. attiva il tracing per la funzione. inserisce la variabile nellambiente. evita che sia stampata la denizione completa delle funzioni. stampa tutti gli attributi associati ad una variabile o una funzione. Tabella 2.3: Opzioni del comando interno declare.

Per visualizzare le variabili di shell presenti nellambiente si pu` usare lo stesso export o senza specicare nulla, e si otterr` la lista delle variabili presenti nellambiente precedute dalla a dichiarazione declare -x; la lista viene cio` stampata in un formato pronto per essere salvato e su un le ed eseguito come script (tratteremo gli script in sez. 2.1.6) per ricreare lambiente. Se si vuole solo una semplice lista di nomi con relativo valore si pu` usare il comando env, o questo in generale permette di eseguire un altro comando, da passare come argomento, con un ambiente modicato rispetto a quello della shell; con lopzione -i (o --ignore) infatti lambiente viene completamente svuotato,14 mentre con una serie di opzioni -u (o --unset) si possono cancellare altrettante variabili di ambiente (da specicare 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. Le variabili di ambiente sono di grande importanza perch sono usate in moltissimi casi per e controllare alcuni comportamenti predeniti dei programmi. Alcune impostazioni e valori di uso generale vengono allora memorizzati in una serie di variabili che di norma ogni shell deve denire, come USER, che indica il nome dellutente corrente, HOME che ne indica la home directory, TERM che specica il tipo di terminale su cui si sta operando, EDITOR che indica quale programma usare come editor predenito, PATH che specica la lista delle directory dove cercare i comandi, ecc.
dato che molti comandi rispondono ai valori delle variabili di ambiente, ` in genere una misura di sicurezza e provvedere un ambiente noto e ben denito cancellando preventivamente quanto gi` presente, onde evitare di a ottenere risposte non previste quando si esegue il comando in un ambiente che pu` essere stato manomesso. o
14

2.1. LINTERFACCIA A LINEA DI COMANDO.

59

La variabile PATH ` di importanza particolare perch ` direttamente connessa ad una delle e ee funzionalit` della shell su cui nora abbiamo sorvolato dandola per scontata: quella del cosida detto path search, cio` del fatto che essa vi permette di associare un nome scritto sulla linea di e comando ad un programma da lanciare. In genere15 questo nome deve corrispondere al nome del le che contiene il programma che la shell deve eseguire. In sostanza, come visto nellesempio iniziale di sez. 2.1.3, voi potete sempre scrivere solo il nome del le al posto del pathname completo: se cio` volete leggere una pagina di manuale, baster` scrivere man e non sar` necessario e a a specicare /usr/bin/man. Si pu` fare cos` perch la shell esegue automaticamente una ricerca nel cosiddetto PATH dei o e comandi; cio` dato un nome sulla linea di comando la shell cerca un le da eseguire con quel e nome nella lista di directory contenute nella variabile dambiente PATH. Se volete evitare questo comportamento, ad esempio perch il programma che volete lanciare non ` in una di quelle e e directory e non sarebbe trovato, ` necessario specicare, sia in forma assoluta che relativa, un e pathname per accedere al comando;16 per questo in genere per lanciare un comando (o uno script) nella directory corrente si usa la sintassi:
piccardi@monk:~/Truelite$ ./comando

La variabile PATH ha la forma di una lista di pathname di directory, separati fra loro da un carattere di due punti,17 . Un esempio del valore di questa variabile potrebbe essere il seguente: /usr/local/bin:/usr/bin:/bin:/usr/bin/X11:/usr/games come ` presa dalla denizione standard per un utente comune su Debian. Si noti come in e questo caso siano indicate solo le directory che, nella standardizzazione del lesystem illustrata in sez. 1.2.3, contengono i programmi di uso per lutente; sono pertanto assenti18 directory come /sbin, /usr/sbin, ecc. che usualmente vengono inserite dentro PATH soltanto per lamministratore. Si tenga conto che PATH ` comunque modicabile dallutente, che pu` personalizzarla a e o piacere, ed aggiungere unaltra directory, come ad esempio la directory corrente che di norma non vi ` mai inclusa.19 Il dubbio casomai pu` essere sul come farlo senza doversi riscrivere tutto e o da capo il contenuto precedente; per questo ci viene di nuovo in auto la sintassi della riga di comando per cui ` possibile ridenire una qualunque variabile con una espressione del tipo: e
piccardi@anarres:~/Truelite$ PATH=$PATH:./

dove di nuovo si ` usato la capacit` della shell di espandere il valore delle variabili, che funziona e a 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` interne a
15 vedremo a breve come si possono creare dei comandi personalizzati attraverso luso degli alias, nel qual caso il nome pu` essere del tutto arbitrario. o 16 la shell riconosce questo quando nel nome del comando compare il carattere / che indica una directory. 17 ` un formato comune usato nelle variabili di ambiente tutte le volte che si deve specicare una lista di directory e in cui eettuare ricerche, lo reincontreremo spesso, ad esempio in sez. 3.1.2 per le directory dove sono mantenute le librerie di sistema. 18 questo ` il motivo per cui alcuni comandi non funzionano quando chiamati da utente normale, in realt` e a non ` che non funzionano, solo non vengono trovati i relativi programmi, che potrebbero tuttavia essere eseguiti e ugualmente (con privilegi ridotti ovviamente) usando un pathname assoluto o inserendo le directory in cui si trovano allinterno di PATH. 19 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 modicata di un comando di sistema, che verrebbe eseguita al posto delloriginale, col rischio di guai seri qualora ci` avvenisse per lamministratore; ` o e vero che 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 ...

60

CAPITOLO 2. LA SHELL E I COMANDI

della shell. Una delle caratteristiche peculiari di bash ` quella di essere in grado di vedere e immediatamente i nuovi programmi non appena si ridenisce il valore di PATH, mentre con altre shell (ad esempio la csh) pu` essere necessario utilizzare un comando apposito come rehash. o 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@monk:~/Truelite$ which ls /bin/ls

in questo modo ` possibile anche capire quale sia eettivamente il programma che viene usato e qualora ne esistano pi` versioni in alcune delle directory contenute allinterno di PATH.20 Se non u viene trovato nessun programma corrispondente non sar` stampato nulla. a Si tenga presente per` che which funziona controllando se il nome passato come argomento o 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,21 si pu` usare un altro comando interno, o type, ottenendo qualcosa del tipo:
piccardi@monk:~/Truelite$ type export export is a shell builtin

Unulteriore funzionalit` che la shell mette a disposizione ` quella degli alias: prima ancora a e 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, denire abbreviazioni per quelli pi` usati, o ridenire lo stesso nome di un comando per u farlo comportare in maniera diversa. Un alias si crea con il comando interno alias associando un nome ad un altro comando (che pu` a sua volta essere stato denito in un altro alias) con o una sintassi del tipo: alias ll=ls --color=auto -l

ma si pu` anche denire una abbreviazione con: o alias l=ls -l o ridenire un comando esistente con: alias rm=rm -i In questo modo nel primo caso si denisce una versione colorata e prolissa di ls, nel secondo una abbreviazione per luso di ls -l e nel terzo si ridenisce rm in modo che di default sia richiesta conferma nella cancellazione dei le. Per cancellare un alias si pu` usare il comano do unalias seguito dal nome dello stesso. Qualora invece si esegua il comando alias senza specicare nulla questo mostrer` la lista degli alias gi` deniti. a a Unaltra funzionalit` di grande utilit` fornita della shell ` il cosiddetto lename globbing, si a a e pu` cio` operare su insiemi di le con nomi simili passando ai comandi che dovranno operare su o e di essi degli argomenti che li indicano in gruppo tramite i cosiddetti caratteri jolly (in inglese wildcard ). Se cio` allinterno di una riga di comando si usa come argomento un nome che contiene e uno di questi caratteri jolly, la shell nelleseguirne la scansione vericher` quali le ci sono nella a
la regola ` che viene usato sempre il primo programma che viene trovato nella scansione delle directory del e path search; questa avviene da sinistra a destra nellordine in cui le directory sono elencate allinterno di PATH. 21 o un alias.
20

2.1. LINTERFACCIA A LINEA DI COMANDO.

61

directory corrente, e se ne trover` di corrispondenti espander` il nome contenente il carattere a a jolly nella lista dei le.22 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` sosticate; cos` si possono indicare elenchi di possibili u 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 specicare degli intervalli (corrispondenti a tutti i caratteri compresi fa i due estremi) usando due caratteri separati da un -. Si pu` inoltre invertire la selezione dei caratteri specicati fra o parentesi quadre precedendo la lista o lintervallo con un carattere di ^. Inne come ultima modalit` di espansione si pu` utilizzare il carattere ~ per indicare la home directory dellutente a o corrente, mentre si pu` usare la notazione ~username per indicare la home directory di un altro o utente. Per capire meglio facciamo alcuni esempi di lename 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:~/Truelite/documentazione/corso$ ls *.pdf Struttura.pdf baseadm.pdf corso.pdf netadmin.pdf

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

se invece vogliamo vedere i le i cui nomi niscono in c o in g potremo usare:


piccardi@anarres:~/Truelite/documentazione/corso$ ls *[cg] Struttura.log baseadm.log corso.log netadmin.log ringraziamenti.log Struttura.toc baseadm.toc corso.toc netadmin.toc texput.log

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

inne se ci interessano i le Latex il cui nome non inizia per lettera maiuscola potremo usare:
piccardi@anarres:~/Truelite/documentazione/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 dellespansione ` quello descritto per cui il risultato della e stessa ` che viene passato al comando come argomento (o come argomenti, se sono pi` di uno) e u il nome (o i nomi) del le che corrisponde, per cui ad esempio se si fosse eseguita la riga di comando:
piccardi@anarres:~/Truelite/documentazione/corso$ ls ??? Entries Repository Root questo signica che al programma sar` passato, invece di un singolo argomento, la lista dei nomi dei le a corrispondenti allespansione dei caratteri jolly.
22

62

CAPITOLO 2. LA SHELL E I COMANDI

si sarebbe ottenuto un risultato forse inaspettato, dato che non riporta le di tre lettere. Il risultato ` questo perch lunico nome di le di tre lettere presente nel caso dellesempio ` quello e e e della directory CVS, per cui dallespansione del lename globbing otteniamo una riga di comando equivalente a ls CVS, quindi ci verr` stampato, secondo la sintassi di ls, il contenuto di tale a directory. Il lename globbing e luso delle variabili di ambiente sono funzionalit` molto utili, per` a o talvolta presentano degli inconvenienti; ad esempio se si volesse passare ad un comando come argomento un le 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 le 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` della shell di interpretare in maniera speciale altri caratteri. Uno di a questi ` la barra trasversa \ che anteposta ad un carattere ne disabilita linterpretazione, cos` e si pu` usare un asterisco in un argomento indicandolo con \* o si pu` utilizzare uno spazio o o proteggendolo con \ o specicare la stessa barra trasversa con \\. Una modalit` alternativa ` quella che permette di specicare degli argomenti che vanno a e considerati come una stringa letterale (risolvendo anche cos` il problema degli spazi) e per i quali non si vuole che la shell eettui delle espansioni. Questo pu` essere fatto in due modi, il o primo, che disabilita il lename globbing e linterpretazione degli spazi, ` quello di denire la e stringa racchiudendola fra virgolette ("), cos` che al suo interno si possano usare spazi, asterischi e punti interrogativi. In questo modo per` resta attiva lespansione di eventuali variabili di shell o tramite il carattere $, si pu` eliminare anche questa se al posto delle virgolette si usano gli o apici singoli (); in tal caso la stringa sar` interpretata in maniera assolutamente letterale. a Unaltra funzionalit` molto utile della shell che si attiva con una sintassi simile alla specia cazione delle stringhe, ` quella che viene chiamata command expansion; si pu` cio` usare come e o e argomento nella riga di comando il risultato di un altro comando, racchiudendo questultimo fra due apici inversi (), o usando la sintassi equivalente $(comando); ad esempio se nel le elenco si ` scritto una lista di le si potr` eettuarne la cancellazione con una linea di comando come: e a
piccardi@anarres:~/Truelite/documentazione/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 perch i le elencati non esistono. In questo caso quello che succede ` che la e e 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 ` la cosiddetta arithmetic expansion che permette di vae lutare delle semplici espressioni aritmetiche, per farlo si usa una sintassi del tipo di $(()) allinterno della quale si inserisce lespressione da calcolare; il risultato del calcolo sar` riportato a direttamente come argomento, e potremo avere un qualcosa del tipo:
piccardi@monk:~/Truelite/documentazione/corso$ echo $((5+7)) 12

e considerato che allinterno dellespressione si possono usare delle variabili di shell, si capisce anche come da questa espansione si possano trarre ulteriori potenzialit` di utilizzo. a Lultima funzionalit` generica della shell che prenderemo in esame ` quella della storia dei a e comandi, la cosiddetta history, che permette di accedere, usando i tasti di freccia in alto e in

2.1. LINTERFACCIA A LINEA DI COMANDO.

63

basso, alle linee di comando eseguite in precedenza. La bash infatti mantiene in memoria ogni linea di comando eseguita e poi quando esce salva lelenco in un apposito le, che di default ` e .bash_history (nella nella home dellutente), ma che pu` essere cambiato in qualunque altro o le specicato dalla variabile HISTFILE. Nel le vengono salvate no ad numero di righe massimo specicato attraverso la variabile HISTSIZE.23 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 ` anche possibile sia eettuare un e ricerca incrementale nella history utilizzando la combinazione C-r seguita dal testo della ricerca (che comparir` allinterno di un apposito prompt), o richiamare con luso del carattere ! una a specica voce, indicandola sia per numero che tramite le prime lettere. Con il comando history inoltre si pu` visualizzare lintero contenuto della history, in cui o ogni riga ` numerata progressivamente, con il valore che si pu` usare con ! per richiamarla. e o Cos` ad esempio per richiamare righe di comando precedenti si potr` fare qualcosa come: a
piccardi@anarres:~/Truelite/documentazione/corso$ which chown /bin/chown piccardi@anarres:~/Truelite/documentazione/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` vericarlo con: a


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

e richiamare un comando con:


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

si tenga inne 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` fare riferimento alla sezione HISTORY EXPANSION del manuale della o shell.

2.1.5

La redirezione dellI/O

Abbiamo voluto dedicare una sezione separata a questa funzionalit` fondamentale della shell a perch ` quella che ci fornisce la vera potenza dellinterfaccia a riga di comando, permettendoci ee di combinare fra loro i vari comandi. In sostanza il meccanismo che ci permette di costruire quella catena di montaggio cui accennavamo in sez. 2.1.1 ` appunto quello della redirezione e dellI/O. Come accennato in sez. 1.3.4 quando la shell lancia un comando uno dei suoi compiti ` aprire e preventivamente 3 le, lo standard input, lo standard output e lo standard error, associati ai primi
23

e si pu` anche indicare una dimensione massima del le con HISTFILESIZE. o

64

CAPITOLO 2. LA SHELL E I COMANDI

tre le descriptor (0, 1 e 2). Questi nel caso di shell interattiva sono associati al terminale su cui essa ` eseguita, e pertanto corrispondono alla tastiera per i dati in ingresso e allo schermo e per i dati in uscita. Seguendo una convenzione comune, tutti i comandi unix si aspettano di ricevere i loro dati in ingresso sullo standard input (e non da uno specico le o dispositivo, a meno che questo non sia previsto come argomento), e scrivono i loro dati in uscita sullo standard output.24 Prendiamo allora come esempio il comando cat, questo (il suo nome, non proprio intuitivo, origina da conCATenate le) ` un comando elementare serve a leggere uno o pi` le in ingresso e u passati come argomenti e a scriverne il contenuto sullo standard output. Se non si specica nessun le come argomento il comando legge di default dallo standard input, per cui se eseguiamo:
piccardi@anarres:~/Truelite/documentazione/corso$ cat

ci troveremo in una situazione in cui il comando ` bloccato in attesa che scriviamo qualcosa. Se e lo facciamo scrivendo prova seguito da invio otterremo qualcosa del tipo:
piccardi@anarres:~/Truelite/documentazione/corso$ cat prova prova

dove il comando reagisce allinvio ristampando sul terminale quanto appena scritto e attendendo nuovo input.25 Usato cos` il comando non ` di grande utilit`, in genere non serve a molto scrivere qualcosa e a sulla tastiera per vederselo ristampare sul terminale ad ogni riga; per` se vogliamo vedere il o contenuto di un le il modo pi` immediato per farlo ` con un comando del tipo: u e
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` il contenuto e lo riverser` sullo standard output, ed essendo quea a stultimo collegato al terminale, lo si vedr` sullo schermo. a Fin qui di nuovo, lutilit` del comando ` relativa, dato che programmi per visualizzare il a e contenuto del le ce ne sono altri, magari pi` sosticati come more e less, che permettono u anche di vedere il le un pezzo alla volta, e andare avanti e indietro, e non scrivono tutto di le in un colpo solo sul terminale dove poi linizio 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 ne di ogni riga. La descrizione completa si trova al solito nella pagine di manuale accessibile con man cat.
24 lo standard error non viene, in caso di operazioni regolari, mai usato; su di esso vengono scritti solo gli eventuali messaggi di errore. Nel caso di shell interattiva questi di nuovo vanno sul terminale e compaiono sullo schermo, insieme ai dati in uscita, ma questo solo perch si ` usato lo stesso le dello standard output, in generale, e e ad esempio quando si redirige lo standard output, non ` cos` essendo i due le distinti. e , 25 questo avviene in quanto sul terminale si quello che si chiama I/O bufferizzato, per cui i dati in ingresso vengono letti e scritti una riga alla volta, per cui alla conclusione della riga verr` letto quanto appena scritto, ed a il comando lo riscriver` sullo standard output; per uscire dal comando occorre nel caso indicare che la lettura ` a e conclusa, ad esempio inviando un end-of-le sullinput con C-d, o interrompere il programma con un segnale.

2.1. LINTERFACCIA A LINEA DI COMANDO.

65

La vera utilit` del comando, il cui scopo come dice il nome stesso non ` quello di mostrare a e un le, emerge solo quando esso viene unito alla capacit` della shell di modicare i le associati a a standard input, standard output e standard error, cio` con la redirezione dellI/O. La shell e infatti riconosce sulla riga di comando vari operatori, detti appunto di redirezione. I due pi` u elementari sono < e > che permettono rispettivamente di redirigere lo standard input e lo standard output su un le specicato dallutente dopo loperatore.26 Vediamo allora come si usano di questi due operatori, una modalit` alternativa di stampare a il contenuto di un le con cat, ` utilizzando un comando del tipo: e
piccardi@anarres:~/Truelite/documentazione/corso$ 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 le specicato dalla riga di comando, si legge sempre dallo standard input che per` in questo caso, invece di essere associato al terminale, ` stato rediretto o e dalloperatore < sul le /etc/profile. La redirezione delloutput avviene in maniera identica associando lo standard output ad un le, e ad esempio si pu` copiare il contenuto del le pippo sul le pippo2 con un comando del o tipo: cat pippo > pippo2 dato che invece che sul terminale adesso il contenuto di pippo sar` scritto su pippo2. Si tenga a conto che se il le su cui si eettua la redirezione non esiste viene creato, se invece esiste viene prima troncato a zero e poi sovrascritto. Fin qui di nuovo niente di particolarmente utile, dato che nel primo caso si sarebbe potuto stampare direttamente il le, e nel secondo si sarebbe potuto usare cp. Per`, e qui emerge anche o la vera utilit` del comando cat, con cp si pu` solo copiare il contenuto di un le su un altro, a o mentre cosa succede se con cat specichiamo una serie di le per poi redirigere luscita su di un altro? Per quanto appena detto il comando legger` il contenuto di ciascuno dei le passati come a argomenti, riscrivendolo sullo standard output, che nel caso ` stato rediretto sul nuovo le, per e cui questultimo risulter` appunto essere la concatenazione del contenuto di tutti i le passati a come argomenti. Cos` se si ` spezzato un le di grosse dimensioni in una serie una serie di le pi` piccoli (ad e u esempio per scriverlo su una serie di oppy) si potr` ricostruirlo con un semplice comando del a tipo: cat file1 file2 file3 ... > filecompleto La redirezione dello standard input ` invece molto utile con i programmi che richiedono e limmissione dei dati da tastiera, specie quando questi vengono eseguiti in uno script. Una volta deniti quali dati sono necessari infatti li si potranno scrivere in un le, e farli leggere al programma semplicemente con la redirezione dello standard input. Come accennato quando si eettua una redirezione dello standard output il le di destinazione viene sovrascritto; occorre pertanto stare molto attenti a non cancellare dei dati. Per questo ` e bene essere consapevoli della modalit` con cui il meccanismo funziona, se infatti si pensasse di a aggiungere dei dati in fondo ad un le con un comando del tipo di: cat file addendum > file
in realt` si pu` eettuare la redirezione su un qualunque le descriptor, specicando il suo numero prima a o delloperatore, ad esempio si pu` redirigere lo standard error con loperatore 2>. I dettagli sulle varie forme di o redirezione possono trovare nella pagina di manuale alla sezione REDIRECTION.
26

66

CAPITOLO 2. LA SHELL E I COMANDI

si andrebbe incontro ad una sgradita sorpresa. Quello che avviene con la redirezione infatti ` e che prima viene creato o troncato il le, e poi ci viene scritto sopra il risultato; il che comporta che nellesempio in questione cat alla lettura di file lo troverebbe vuoto. Nel caso specico cat ` in grado di rilevare la situazione anomala e stampare un errore, ma non ` detto che altri e e programmi (o versioni non GNU 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 ` disponibile un altro operatore di redirezione, >>, che e redirige lo standard output su di un le eseguendo per` la scrittura in append (una modalit` di o a scrittura speciale in cui i dati vengono aggiunti in coda a quelli gi` presenti). In questo modo si a sarebbe potuto realizzare laggiunta di informazioni alla ne del le file con il comando: cat addendum >> file La redirezione di ingresso ed uscita, per quanto utile, ` per` marginale rispetto ad una forma e o ` di redirezione molto pi` potente, il cosiddetto pipelining, che usa loperatore |. E questo u infatti quello che ci permette di eseguire la concatenazione dei comandi cui abbiamo accennato in sez. 2.1.1. Questo operatore infatti permette di collegare luscita del comando che lo precede con lingresso del successivo attraverso una pipe,27 che come indica il nome funziona appunto come tubo di collegamento fra i due comandi. Questo signica che si pu` fornire come dati o in ingresso ad un comando quelli prodotti in uscita da un altro. Cos` si possono lanciare in sequenza una serie di comandi in cui ciascuno elabora i risultati del precedente, fornendo un risultato per il successivo. Gi` questo comincia a farci intuire le capacit` intrinseche nel funzionamento della riga di a a comando, ad esempio non ` pi` necessario dover inserire in tutti i comandi una opzione per e u ordinare in maniera diversa i risultati, basta inviare questi ultimi con una pipe al programma sort il cui solo scopo ` quello di eettuare riordinamenti nelle modalit` pi` varie. e a u
Comando cmd < file cmd > file cmd >> file cmd 2> file cmd1 | cmd2 cmd > file 2>&1 cmd1 2>&1 | cmd2 Signicato redirige lo standard input: legge linput del comando cmd dal le file. redirige lo standard output: scrive il risultato del comando cmd sul le file. redirige lo standard output: scrive il risultato del comando cmd accodandolo al contenuto del le file. redirige lo standard error : scrive gli errori del comando cmd sul le 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 le file. redirige lo standard output e lo standard error del comando cmd1 sullo standard input del comando cmd2.

Tabella 2.4: Principali modalit` di redirezione. a

Vedremo in sez. 2.2 vari esempi di come queste funzionalit` possono essere sfruttate per a costruire delle vere e proprie catene di montaggio in cui si ottiene un risultato nale attraverso la concatenazione di molti comandi, concludiamo questa sezione riportando in tab. 2.4 un riassunto delle principali modalit` di redirezione utilizzate nella shell. Comprese alcune delle pi` esoteriche a u che permettono di redirigere pi` le. u
che ` del tutto analoga alle fo incontrate in sez. 1.2.1, solo che in questo caso non ` associata ad un oggetto e e nel lesystem, ma esiste solo come le descriptor accessibile dallinterno dei processi interessati.
27

2.1. LINTERFACCIA A LINEA DI COMANDO.

67

2.1.6

Scripting elementare

Una delle capacit` fondamentali della shell ` che, come avveniva per i le .bat del DOS, si a e possono inserire delle sequenze di comandi in dei le per farli eseguire direttamente senza doverli riscrivere tutte le volte. Ma se questo ` pi` o meno tutto quello che si pu` fare con il DOS, e u o il grande vantaggio di una shell unix che ` avete a disposizione un vero e proprio linguaggio e di programmazione con tanto di variabili e direttive di iterazione, condizionali, ecc. che vi permette di eettuare anche compiti di notevole complessit`, tanto che, per quanto sia poco a elegante e piuttosto limitato, viene comunque ampiamente utilizzato, per la sua immediatezza, per automatizzare una grande quantit` di compiti per i quali non vale la pena ricorrere ad un a linguaggio di pi` alto livello. u E per questo motivo che la shell, anche se nora ne abbiamo parlato solo come del programma che implementa linterfaccia a riga di comando, ` in realt` uno dei componenti essenziali per e a 28 e non solo dal punto di vista dellinterfaccia utente: tutti i sistemi far funzionare il sistema, di avvio del sistema infatti, come vedremo in sez. 5.3.4, usano proprio degli script di shell per eseguire le loro operazioni. La descrizione dettagliata del linguaggio della shell non ` arontabile adesso, le sue carattee ristiche principali si trovano comunque nella sezione SHELL GRAMMAR della pagina di manuale, ed un ottima risorsa per quanti vogliano approfondirlo ` [2]. Quello che ` importante sottolineare e e qui ` che la shell non solo pu` essere invocata in maniera interattiva, quando ` associata ad un e o e terminale ed utilizzata dagli utenti per dare comandi, ma pu` anche essere lanciata non inteo rattivamente 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 le dello script da eseguire, con sintassi del tipo bash script. In realt` gli script possono sfruttare una funzionalit` peculiare del link-loader 29 di Linux (che a a si trova comunque in tutti i sistemi unix-like), che oltre ad eseguire i programmi nel formato binario standard30 ` in grado di eseguire anche gli script, che vengono trattati esattamente allo e stesso modo. Questi sono identicati dal link-loader come le di testo dotati di permesso di esecuzione la cui prima riga ` nella forma: e #!/bin/bash in cui cio` si trovano i caratteri #! seguiti dal pathname di un programma che faccia da e interprete. In tal caso il link-loader lancer` automaticamente il comando (con le opzioni che si a possono specicare sempre sulla prima riga del le) dandogli come argomento il nome le stesso. Dato che per la shell e per tutti i linguaggi di scripting, come il python o il perl, che usano questa funzionalit` il carattere # indica linizio di una riga di commento, quando si vuole creare a uno script baster` scrivere un le di testo contenente tutte le istruzioni necessarie che inizi con a questa riga (che verr` ignorata nellinterpretazione dei comandi), e poi renderlo eseguibile.31 In a questa maniera uno script sar` del tutto equivalente ad un comando binario, ed oltre ad eseguirlo a come tale la shell provveder` anche a passargli gli argomenti scritti nella riga di comando, a esattamente come avrebbe fatto se di fosse trattato di un eseguibile compilato. Nel caso degli script per`, rispetto quanto avviene sulla riga di comando, si usa spesso una o sintassi della shell che prevede luso di istruzioni e comandi con una sintassi pi` complessa di u
si noti infatti che essa deve trovarsi, come richiesto dal FHS trattato in sez. 1.2.3, sotto /bin, dato che ` e essenziale per lavvio del sistema. 29 questo ` un programma speciale, che non costituisce un programma a se (ed infatti sta sotto /lib), ma che e viene lanciato come parte dalla chiamata al sistema che esegue un nuovo programma, che permette di utilizzare le librerie condivise e mettere in esecuzione gli altri programmi. 30 in Linux esistono sostanzialmente due formati binari, quello chiamato a.out, usato nei kernel delle serie no alla 1.2, e il formato ELF, usato nelle serie successive. 31 renderlo eseguibile in questo caso signica attivarne il permesso di esecuzione con chmod +x, dal punto di vista del contenuto del le non cambia assolutamente nulla, questo resta un normale le di testo.
28

68

CAPITOLO 2. LA SHELL E I COMANDI

quella elementare illustrata in sez. 2.1.3. Una sintassi e delle istruzioni che, per quanto siano utilizzabili in teoria anche sulla riga di comando, sono generalmente poco usate in quanto meno indicate ad un uso interattivo, o dipendenti da funzionalit` speciche degli script. a Una prima sintassi ` quella che permette di eseguire pi` comandi distinti sulla stessa linea; e u questo pu` essere fatto in tre modi diversi. La prima modalit` prevede che i singoli comandi o a siano separati fra di loro tramite il carattere ;, in tal caso si tratta semplicemente di scrivere quello che altrimenti si scriverebbe su linee diverse su una riga unica, usando il ; per indicare la ne di un comando e linizio del successivo: in questo caso essi saranno eseguiti in sequenza da destra a sinistra come al posto del ; si fosse premuto invio. In realt` questo ` di scarsa a e utilit` sulla linea di comando (se non per eseguire pi` comandi in sequenza senza dover stare ad a u attendere che ciascuno di essi nisca per lanciare il successivo) ma ` utile negli script dove alcuni e direttive di programmazione (come i condizionali) usano come parametro una linea di comando, la cui terminazione pu` essere resa esplicita con questo metodo.32 o La seconda modalit` ` quella in cui i comandi che si vogliono eseguire vengono separati a e dalloperatore &&, che assume il signicato di AND logico. In questo caso il comando successivo alloperatore verr` eseguito solo se il precedente non ha avuto errori. In caso di errori la catena a viene immediatamente interrotta. Questo consente allora di eseguire un secondo comando solo se il primo ha avuto successo; in genere lo si usa per vericare se un certo le esiste e poi eseguire un comando. La terza modalit` prevede che i diversi comandi sulla stessa linea vengano separati dallopea ratore ||, che invece assume il signicato di OR logico. In questo caso si avr` che il comando a successivo alloperatore verr` eseguito soltanto se il precedente ha fallito. Questo consente di a eseguire in alternativa due comandi; in genere lo si usa per eseguire le operazioni da eettuare solo in caso di errori. Queste due ultime modalit` fanno riferimento, per stabilire se un comando ha avuto o meno a successo, ad una caratteristica comune di tutti i programmi che una volta eseguiti riportano (nel caso specico alla shell che li ha lanciati) uno stato di uscita che serve ad indicare se le operazioni sono state concluse correttamente. La convenzione ` che un valore nullo (cio` e e 0) signica il successo delloperazione, mentre un valore non nullo (in genere 1) indica che c` stato un errore. Inoltre se il programma non si ` concluso spontaneamente ma ` stato e e e interrotto da un segnale la shell assegna al codice di uscita il valore di 128 + n, dove n ` il e ` con un controllo numero del segnale (ed ovviamente il comando viene considerato fallito). E automatico su questi valori che vengono prese le rispettive decisioni nelluso dei operatori && ` e || quando la shell concatena dei comandi. E inoltre da specicare che qualora invece si concatenino dei comandi senza condizionali con luso del ; verr` riportato il codice di uscita a dellultimo comando eseguito. La presenza di un codice di uscita ` molto importante, specie per gli script che possono usare e questa informazione per capire se ci sono stati problemi. Per questo la shell, nel ricevere lo stato di uscita di un comando, lo memorizza nella variabile speciale ?, cos` che per un comando successivo o allinterno di uno script ` possibile ricavare lo stato di uscita dellultimo comando e eseguito in precedenza accedendo a questultima. Allora potremo vericare che:
piccardi@anarres:~/Truelite/documentazione$ CVS README corso internet-server lucidi piccardi@anarres:~/Truelite/documentazione$ 0 piccardi@anarres:~/Truelite/documentazione$ ls: licidi: No such file or directory piccardi@anarres:~/Truelite/documentazione$ 1
32

ls samba echo $? ls licidi echo $?

` ad esempio il costrutto usato nel condizionale presente nellesempio di /etc/profile illustrato pi` avanti. e u

2.1. LINTERFACCIA A LINEA DI COMANDO.

69

e nel primo caso il comando ` stato eseguito correttamente, mentre nel secondo, non esistendo e il le licidi, no.
Variabile # * Signicato Il numero degli argomenti passati ad uno script. La lista degli argomenti. Se espansa fra virgolette come "$*" ` equivalente ad una unica stringa formata dal e contenuto dei singoli argomenti separato da spazi (o dal carattere di separazione specicato in IFS). La lista degli argomenti. Se espansa fra virgolette come "$@" ` equivalente alla lista dei singoli argomenti. e Il codice di uscita dellultimo comando eseguito. Il pid della shell. Il pid del programma in background che ` stato eseguito e per ultimo. Il nome della shell o dello script. Tabella 2.5: Principali variabili speciali.

@ ? $ ! 0

La variabile ? ` una delle variabili speciali (descritte nella sezione Special Parameters e della pagina di manuale), queste variabili vengono mantenute direttamente dalla shell stessa (non ha cio` senso assegnarle direttamente come visto in sez. 2.1.4) che vi memorizza il valore di e alcuni parametri interni. Ad esempio quando si lancia uno script con degli argomenti con $# si ` ottiene il numero degli stessi, con $1 il primo, con $2 il secondo, ecc. E inoltre possibile ottenere una stringa contenente tutti gli argomenti con $*, mentre con $@ si ottiene la lista degli stessi.33 Lelenco delle principali variabili speciali ` riportato in tab. 2.5. e Al di l` della semplice logica dei due operatori && e ||, la shell provvede anche delle a istruzioni che consentono di creare costrutti sintattici pi` complessi, propri di un vero linguaggio u di programmazione. Di questi illustreremo solo i pi` signicativi (lelenco completo ` nella u e sezione SHELL GRAMMAR della pagina di manuale). Il primo ` quello usato per specicare delle e esecuzioni condizionali ed ` basato sullistruzione if; la sua forma generica `: e e if comando; comando ... else comando ... fi then

dove dopo lif si esegue il comando specicato, che ` quello che specica la condizione, e a e seconda del suo codice di ritorno verranno eseguiti alternativamente i comandi indicati dopo listruzione then (se nullo, cio` condizione di riuscita) o listruzione else (se non nullo, cio` e e fallimento). La sintassi pu` essere pi` complessa in quanto si pu` sostituire listruzione else con unistruo u o zione elif che invece di eseguire una serie di comandi ripete un successivo blocco condizionale, prendendo come argomento un altro comando da usare come condizione, seguito da un altro then e da altri comandi; queste istruzioni possono essere ripetute no a chiudere la sequenza con listruzione else, o, se non ci sono alternative, chiudere denitivamente il blocco condizionale con listruzione fi.
la dierenza fra $* e $ pu` sembrare non signicativa, e se si stampano le due variabili con echo non se o ne vedr` nessuna; in realt` questa ` fondamentale negli script, infatti $* nelle istruzioni usate negli script viene a a e 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` un solo ciclo, mentre con la seconda si avranno tanti cicli quanti sono gli argomenti. a
33

70

CAPITOLO 2. LA SHELL E I COMANDI

Oltre alluso di if si possono eseguire cicli condizionali tramite delluso delle due istruzioni while e until che ripetono lesecuzione del comando specicato come argomento ntanto che questo non riporta rispettivamente uno stato di uscita nullo o non nullo, eseguendo ogni volta la lista dei comandi inserita nella sezione seguente delimitata dalle istruzioni do e done, secondo uno schema del tipo: while comando; do comando ... done (e analogo per until); in questo modo si possono eseguire dei cicli condizionali, basati sul successo (while) o linsuccesso (until) di un determinato comando che governa la ripetizione del ciclo. Se invece si devono operare delle scelte opzionali su un valore si pu` usare listruzione case, o che prende come parametro una espressione che possa assumere valori diversi (una variabile, una command expansion, ecc.) e che permette di eseguire comandi diversi a seconda dei valori che detta espressione pu` assumere, con una sintassi generica del tipo di: o case expr in valore1) comando ... ;; valore2) comando ... ;; *) comando; ... ;; 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, ed il valore generico ` indicato da un *. e Lutilit` di case rispetto alluso di una serie concatenata di if ed elif, oltre alla leggibilit`, a a ` che i valori con cui eettuare il controllo supportano i caratteri jolly con lo stesso signicato e che questi assumono nel lename globbing, anche se in questo caso vengono applicati alla lista dei valori forniti dallespressione, piuttosto che ai le. Questo consente allora di raggruppare in maniera essibile valori simili e trattarli con una unica serie di istruzioni. Inne listruzione for permette di compiere dei cicli su un numero stabilito di alternative, denendo una variabile che pu` essere utilizzata allinterno del ciclo, con una sintassi del tipo: o for var in lista ; do comando done dove var ` la variabile che assumer` per ciascun ciclo ciascuno dei possibili valori risultanti e a dallespansione dellespressione lista. Una delle caratteristiche comuni a tutti i linguaggi, e la shell non fa eccezione, ` quella della e possibilit` di denire delle funzioni cui fare eseguire compiti ripetitivi. Questa capacit` aggiunge a a una ulteriore funzionalit` alla linea di comando in quanto oltre ad eseguire i comandi binari e gli a

2.1. LINTERFACCIA A LINEA DI COMANDO.

71

script, o usare un alias per fare riferimento ad un comando, una modalit` con cui si possono far a eseguire dei comandi alla shell ` quello di denire delle funzioni ed eseguire una lista di comandi e richiamando semplicemente il nome della funzione. In generale una funzione ` denita allinterno di uno script, e viene introdotta dalla parola e chiave function (ma lo si pu` fare anche a linea di comando, ` solo molto pi` scomodo), cui o e u segue in nome della funzione e il costrutto (), dopo di che il corpo della funzione ` delimitato e fra parentesi grae; in sostanza la forma ` sempre qualcosa del tipo: e function nome () { comando1; comando2; ...; } dove ciascuna linea conterr` un comando. a Oltre alle istruzioni interne della shell esistono anche una serie di comandi che sono stati grati proprio per facilitare la scrittura di scritp. Il primo di questi ` seq, che permette di stampare e sullo standard output una sequenza di numeri. Il comando pu` essere invocato con un numero o di argomenti variabile da uno a tre numeri interi: un solo argomento indica il numero nale a cui fermare la sequenza, partendo da 1 ed incrementando di uno, specicando due argomenti si indicano il valore iniziale ed il valore nale, che viene raggiunto sempre a passi di uno, inne con tre argomenti il secondo viene usato come valore di incremento nellintervallo che inizia con il primo e nisce col terzo. Questo comando ` molto utile quando si vogliono fare dei cicli, lo si e pu` infatti usare per generare una lista di numeri da utilizzare con listruzione for, i cui valori o possono poi essere utilizzati allinterno del ciclo. 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` un valore nullo che nelle condizioni a implica vero, e viene utilizzato, come illustrato in sez. 2.2.1 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.3) per gli account degli utenti di sistema che non devono avere una shell. Un altro comando utilizzato negli script principalmente per controllare il suo codice di uscita ` test che ` uno dei comandi pi` comuni utilizzato in combinazione con le istruzioni condizionali e e u illustrate in precedenza. Per questo motivo una modalit` alternativa per invocare il comando a ` con il nome [ (si pu` infatti osservare lesistenza del le /usr/bin/[) nel qual caso la linea e o di comando dovr` essere terminata con una corrispondente ]. E questo il motivo per cui le a 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` eseguire controlli su una enorme serie di diverse condizioni, specicate attrao verso una opportuna espressione, ritornando un valore nullo se la condizione ` vericata, e non e 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 vericate da test fanno riferimento alle propriet` dei le, in a questo caso la condizione viene espressa con una opzione seguita dal nome del le cui la si vuole applicare; le principali opzioni utilizzate, ed il relativo signicato, sono riportati in tab. 2.6. Oltre alle condizioni sui singoli le il comando pu` essere usato per esprimere condizioni o relative a due le, in tal caso queste vengono espresse scrivendo questi ultimi come argomenti

72
Opzione -b -c -d -e -f -h -O -G -r -s -w -x Signicato il le esiste ed il le esiste ed il le esiste ed il le esiste il le esiste ed il le esiste ed il le esiste ed il le esiste ed il le esiste ed il le esiste ed il le esiste ed il le esiste ed

CAPITOLO 2. LA SHELL E I COMANDI

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

Tabella 2.6: Opzioni per le condizioni sui le del comando test.

separati dalla relativa opzione; con -ef si richiede che essi abbiano lo stesso inode, con -nt si richiede che il primo sia pi` recente (in termini di tempo di ultima modica, vedi sez. 1.2.1) u mentre con -ot che sia pi` vecchio (negli stessi termini). u 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 signicato ` banale e (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, e lopzione -z serve a vericare se la stringa ` vuota. e Oltre ad una sintassi pi` complessa, luso degli script ci pone di fronte ad alcune sottigliezze u del funzionamento della shell. Se infatti si lancia uno script esso viene eseguito come tutti gli altri comandi, la shell cio` crea un nuovo processo glio in cui esegue quella che si chiama una e subshell 34 a cui fa eseguire lo script. Questo vuol dire ad esempio che se nello script si eettuano operazioni che modicano le propriet` della shell (come modiche alle variabili di ambiente o a agli alias) queste modiche saranno eettive solo per la subshell, e non per la shell originaria da cui esso ` stato lanciato. e Per cui se si vogliono automatizzare una serie di impostazioni per la shell corrente, non si ` pu` pensare di far questo lanciando uno script che contiene i relativi comandi. E per` possibile o o eseguire i comandi di uno script senza usare una subshell, direttamente allinterno della shell corrente, usando il comando source,35 cui dare come argomento il nome dello script da cui leggerli. Ora ` abbastanza chiaro che, bench il programma sia lo stesso, una shell utilizzata per e e eseguire uno script necessita di impostazioni diverse rispetto ad una shell usata per gestire la riga di comando da un terminale (ad esempio non serve il prompt). Per questo la shell supporta diverse modalit` di funzionamento di cui quella usuale a linea di comando avviene attraverso a quella che si chiama una shell interattiva, in cui essa ` associata ad un terminale, e che deve e pertanto essere in grado di gestire tutte le problematiche relative al controllo di sessione illustrato in sez. 1.3.4, che invece non sono necessarie quando la si invoca per eseguire una script. Unaltra modalit` ` quella della shell di login (vedi sez. 4.3). Questa ` la modalit` che a e e a viene usata dal programma login quando d` allutente un accesso al sistema e che in genere a ` alla radice di ogni altro programma lanciato dallutente.36 Queste modalit` in realt` came a a biano pochissimo, quello che le contraddistingue ` che nel caso di shell di login viene sempre e
cio` unaltra istanza della shell, che viene eseguito da un altro processo. e una sintassi alternativa, pi` sintetica ma anche pi` criptica, ` quella di usare . al posto di source. u u e 36 in generale un utente pu` sempre lanciare, dopo il login, varie altre shell interattive, il sistema comunque ne o provvede una di default.
35 34

2.1. LINTERFACCIA A LINEA DI COMANDO.

73

letto ed eseguito (allinterno della shell corrente) il contenuto del le /etc/profile,37 in cui lamministratore di sistema pu` inserire una serie di impostazioni comuni per tutti gli utenti. o Un esempio di questo le, che pu` essere considerato una sorta di le di congurazione per o la shell, ` il seguente (lesempio ` preso dalla versione installata di default su una Debian): e e
# /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 export PATH PS1 umask 022

in questo caso si pu` notare come prima venga impostato la variabile PATH, poi, se la shell ` una o e bash, il prompt usando un valore di PS1 che sfrutta le funzionalit` di tab. 2.1, altrimenti (supa ponendo una shell generica) vengono usati direttamente i caratteri # e $ a seconda che lutente sia o meno lamministratore. Inne viene impostato il valore della umask (vedi sez. 1.4.4). Per permettere agli utenti di personalizzare la loro shell di login, dopo aver letto /etc/profile la bash cerca nella home degli utenti, in questordine, i le .bash_profile, .bash_login e .profile, ed esegue i comandi nel primo che trova (e per il quale ha il permesso di lettura), senza guardare gli altri. Si noti comunque che nessuno di questi le deve essere eseguibile, dato che non viene eseguito come script, per cui ` suciente il permesso di lettura. Un esempio di e .bash_profile ` il seguente: e
# ~/.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 modica la umask (vedi sez. 1.4.4) rispetto al valore impostato per il sistema e si utilizzano le impostazioni personali poste in un altro le, .bashrc. Luso di .bashrc per le impostazioni ` dovuto al fatto che se la shell ` interattiva ma non e e ` di login, (questo vale ad esempio per le shell lanciate dentro un terminale sotto X) al posto e ` dei precedenti le viene letto questultimo. E per questo che conviene inserire in esso le proprie personalizzazioni, ed eseguire un source di questo le allinterno di .bash_profile, in modo da averle disponibile in tutti i casi. Un esempio `: e
questo vale in generale per tutte le shell derivate dalla Bourne shell, quelle derivate dalla C shell usano /etc/csh.login.
37

74

CAPITOLO 2. LA SHELL E I COMANDI


# ~/.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 # 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

ed in questo caso quello che si fa ` denire una serie di alias, ed un nuovo prompt. e Si tenga conto che oltre a .bashrc per i singoli utenti esiste un equivalente di /etc/profile anche per le shell interattive, in cui sono mantenute le impostazioni generali scelte dallamministratore per tutto il sistema, che ` /etc/bash.bashrc. e

2.2

I comandi dei le

Dato che in un sistema unix-like tutto ` un le, ` naturale che la maggior parte dei comandi e e abbia a che fare con le operazioni di manipolazione dei le. Abbiamo gi` visto nel cap. 1 i a comandi elementari che ci permettono la gestione dei le sul lesystem come cp, mv, mkdir, ln, rm, ecc. In questa sezione aronteremo gli altri comandi che permettono di operare sul contenuto dei le ed eseguire su di essi operazioni pi` complesse, e dato che buona parte di queste vengono u eettuate con la redirezione vedremo anche delle applicazioni di questultima.

2.2. I COMANDI DEI FILE

75

2.2.1

Caratteristiche comuni

Bench, come anticipato in sez. 2.1, ogni comando sia specializzato per fare un compito specico, e esistono comunque una serie di caratteristiche comuni, dato che i comandi relativi ai le 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 le. La principale caratteristica comune a quasi tutti i comandi ` la gestione delle opzioni che avviene come illustrato in sez. 2.1.3 e alcune di esse, quelle pi` e u comuni, tendono ad essere le stesse; ad esempio per la gran parte dei comandi lopzione -h pu` o essere utilizzata per stampare a video una schermata di aiuto che riassume luso del comando. Questa ` comunque solo una convenzione, e non ` seguita da tutti i comandi, alcuni infatti e e usano delle sintassi diverse per eredit` storiche, (come abbiamo visto in sez. 1.3.1 con ps). La a convenzione per` viene usata da tutti i comandi realizzati allinterno del progetto GNU e da o quelli che usano le relative funzionalit` delle GNU libc, ed ` perci` molto diusa. a e o Le opzioni in genere sono di due tipi, dei semplici switch, che come degli interruttori attivano o disattivano una certa modalit` di funzionamento che si attivano semplicemente scrivendole a (ad esempio si usa spesso -v per aumentare la prolissit` dei messaggi del comando), o delle a opzioni pi` complesse che, come in maniera analoga ad un cursore o una manopola, permettono u di passare dei valori al comando (come il process ID del processo cui applicare un cambiamento di priorit`, che si viene dato come valore per lopzione -p di renice); in tal caso questo, nel a formato che varier` da caso a caso, il valore dovr` essere specicato di seguito allopzione. a a Inoltre comandi del progetto GNU supportano (come accennato in sez. 2.1.3) anche una versione estesa delle opzioni, in cui queste si possono specicare con parole intere invece che con singole lettere, nel qual caso esse iniziano con un --. Tutti i comandi GNU ad esempio supportano le due opzioni --help che stampa una schermata riassuntiva della sintassi, e --version che stampa il numero di versione. Se lopzione estesa deve indicare un valore questo deve essere specicato in forma di assegnazione con un =, ad esempio --tabsize=80. Inne una menzione speciale per due casi particolari; in genere la combinazione -- viene utilizzata per indicare di aver completato le opzioni,38 in modo tutti gli argomenti che seguono verranno usati direttamente senza essere considerati una opzione anche se cominciano per un -. Cos` se ad esempio avete in le il cui nome inizia per - vedrete che non ` aatto facile e cancellarlo con rm, dato che il comando si lamenter` di una opzione sbagliata; tutti i programmi a infatti prima esaminano le opzioni, segnalando errori se ne trovano di inesistenti, e poi trattano gli altri argomenti. Per questo scrivendo -- prima del nome del le linterpretazione delle opzioni sar` terminata ed il nome (anche se inizia per -) sar` preso come argomento. Invece a a per luso del - vale la convenzione, per quei comandi che prendono come argomento un le, di considerarlo (a seconda del contesto) come sinonimo dello standard input o dello standard output.

2.2.2

I comandi per le ricerche sui le

La ricerca di uno specico le allinterno del lesystem, o dei le con una certa serie di caratteristiche, ` una operazione molto comune, e per questo sono stati sviluppati alcuni comandi molto e essibili, che permettono di eettuare le pi` complesse tipologie di ricerca. u Il primo fra i comandi usati per cercare i le labbiamo gi` incontrato in sez. 2.1.4, ed ` a e which, che ci indica a quale le eseguibile corrisponde un certo comando, facendo una ricerca nel PATH. Questo per` esegue la ricerca solo fra i comandi. o Il comando pi` veloce per cercare un le qualunque ` invece locate, che come suggerisce il u e nome, serve a localizzare nel lesystem tutti i le che contengono nel loro pathname la stringa passata come argomento. Il vantaggio di questo programma ` la sua velocit`, esso infatti non e a
` unaltra delle funzionalit` introdotte dalla sezione delle GNU libc che permette di gestire le opzioni a riga e a di comando.
38

76

CAPITOLO 2. LA SHELL E I COMANDI

eettua la ricerca scandendo il contenuto del disco, ma in piccolo database interno che contiene lelenco di tutti i le presenti nel sistema. Il comando riconosce lopzione -i, che richiede che venga eettuata una ricerca case insensitive, e -e che richiede che sia vericata leettiva esistenza del le. Il comando inoltre consente luso come argomento di espressioni analoghe a quelle usate dalla shell per il lename globbing. Le altre opzioni e la descrizione completa del comando ` al solito disponibile nella relativa pagina e di manuale accessibile con man locate. Il fatto che il comando si adi ad un database ci fa capire immediatamente anche i suoi limiti: anzitutto la ricerca pu` essere eettuata solo per nome, ed inoltre ` in grado di cercare o e solo i le gi` inseriti nel database. Questo viene in genere creato dal comando updatedb (vedi a sez. 3.2.3) che viene eseguito in genere una volta al giorno (fra i lavori periodici di cron che vedremo in sez. 3.3.1), per cui se un le ` stato creato da poco non potrete vederlo. e Per superare i limiti di locate, si pu` usare il comando find, che non utilizza un database, o ma esegue la ricerca direttamente nel lesystem, al costo di una notevole attivit` su disco, e di a tempi di esecuzione decisamente pi` lunghi. Si pu` ridurre il carico comunque facendo eettuare u o la ricerca su sezioni ridotte dellalbero dei le, il comando infatti prende come primo argomento la directory da cui iniziare la ricerca, che verr` eseguita ricorsivamente in tutte le directory a sottostanti, se non si specica nulla la ricerca partir` dalla directory corrente. a 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 le in base ad una loro qualunque propriet` (nome, tipo, proprietario, i vari tempi, a permessi, ecc.), la terza (descritta nella sezione ACTIONS) contiene le opzioni che permettono di specicare una azione da eseguire per ciascun le che corrisponde alla ricerca, la quarta (descritta nella sezione OPERATORS) contiene le opzioni che permettono di combinare fra loro diverse selezioni. Le opzioni generiche, le principali delle quali sono riportate in tab. 2.7, permettono di modicare il comportamento del comando, ad esempio con -maxdepth si pu` limitare la ricerca ai o primi livelli di sottodirectory, mentre con -mindepth la si pu` far partire da un certo sottolivello. o
Opzione -follow -mount -maxdepth -mindepth Signicato dereferenzia i link simbolici. resta nel lesystem corrente e non analizza sottodirectory in altri lesystem. seguita da un numero di livelli indica il massimo numero di volte che scende in una sottodirectory. seguita da un numero di livelli indica quanti livelli di directory ignorare prima di iniziare la ricerca.

Tabella 2.7: Principali opzioni generiche di find.

Le maggiori potenzialit` di find derivano dalla sua capacit` di eettuare ricerche con i criteri a a pi` svariati, da quelli sul nome del le in varie forme (con -name, -regex, -path), a quelli per u gruppo e utente (con -group e -user), secondo i permessi (con -perm), secondo i vari tempi (-atime, -ctime, -mtime) per tipo di le, lesystem su cui ` il le, ecc. Un elenco delle principali e opzioni di ricerca, con il relativo signicato ` riportato in tab. 2.8. e Alcune di queste opzioni vanno chiarite, ad esempio con lopzione -name si pu` eettuare o la classica ricerca sul nome del le, con tanto di supporto per le wildcard (che per` vanno o adeguatamente protette per evitarne lespansione da parte della shell). La ricerca ` eettuata e esattamente sul nome del le cos` come ` scritto nella directory che lo contiene, non sul suo e pathname, se si vuole ricercare su questultimo occorre usare -path. Per tutte le opzioni che prendono un valore numerico (quelle sui tempi, gli identicatori, il

2.2. I COMANDI DEI FILE


Opzione -amin n Signicato Un le acceduto n minuti fa, le opzioni -cmin e -mmin eseguono lo stesso controllo rispettivamente con i tempi di ultimo cambiamento e ultima modica. Un le acceduto n giorni fa, le opzioni -ctime e -mtime eseguono lo stesso controllo rispettivamente con i tempi di ultimo cambiamento e ultima modica. Un le acceduto pi` recentemente di file, le opzioni u -cnewer e -mnewer eseguono lo stesso controllo rispettivamente con i tempi di ultimo cambiamento e ultima modica. Il group ID del gruppo proprietario ` n. e Il gruppo proprietario ` group. e Il le ha n hard link. Il nome del le corrisponde al pattern pattern. Prevede anche -iname per una ricerca case insensitive. Il pathname del le (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 le ` n. e Seleziona sul tipo di le, il valore di c corrisponde alla lettera usata da ls e riportata in tab. 1.1. Luser ID del proprietario ` n. e Il proprietario ` user. e

77

-atime n

-anewer file

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

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

Tabella 2.8: Principali opzioni di find per la ricerca.

numero di link), che ` stato indicato in tab. 2.8 con n, il comando permette una sintassi molto e potente: specicando 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; ` cos` allora che per esempio, nel caso dei tempi, si pu` richiedere che un le sia e o pi` vecchio o pi` giovane di un dato tempo. Cos` ad esempio se si vuole cercare i le modicati u u negli ultimi 5 minuti si dovr` fare: a
piccardi@anarres:~/Truelite/documentazione/corso$ find . -mmin -5 . ./shell.tex

mentre se si vuol cercare quelli non acceduti da pi` di quindici giorni si far`: u a
piccardi@anarres:~/Truelite/documentazione/corso$ find . -atime +15 ./ringraziamenti.tex

Una spiegazione a parte poi deve essere fatta per lopzione -perm, il cui valore mode deve essere specicato in ottale, e supporta i due segni + e - come per gli altri valori numerici. In questo caso per`, trattandosi di una maschera di bit, il signicato ` diverso. Come prima il valore o e senza segno richiede la corrispondenza esatta, questo per` ci renderebbe impossibile selezionare o per la presenza di uno o pi` bit senza curarsi dello stato degli altri (che ` in genere il tipo di u e ricerca pi` utile). Per questo si possono usare le altre due forme, se si usa il segno - allora u mode specica la maschera dei bit dei permessi che devono essere presenti sul le (i bit nulli cio` vengono ignorati); se invece si usa + la richiesta ` ancora pi` debole ed il le corrisponde e e u purch almeno uno dei bit di mode sia attivo. In questo modo con -mode si pu` richiedere una e o 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 ` quella relativa alle azioni; ` e e possibile infatti, per ogni le che corrisponde al criterio di ricerca specicato, far eseguire una

78

CAPITOLO 2. LA SHELL E I COMANDI

certa azione. Se non si specica nulla lazione di default ` quella di stampare il nome del le, e equivalente alla opzione -print; ma si possono anche scrivere i nomi su un le qualunque usando lopzione -fprint file, o usare vari formati.
Opzione -exec -print -print0 -fprint file -ok Signicato esegue un comando usando come argomento il nome del le. stampa il nome del le terminato con un a capo. stampa il nome del le terminato con un carattere NUL (il valore 0). scrive il nome del le sul le file. come -exec ma chiede conferma del comando.

Tabella 2.9: Principali opzioni di find per specicare azioni.

Lelenco delle opzioni principali ` riportato in tab. 2.9, ma quella di gran lunga pi` importante e u ` -exec che permette di eseguire, per ogni le corrispondente alla selezione, un comando. La e sintassi dellopzione ` complessa in quanto si deve inserire una riga di comando allinterno di e 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 no a che non si incontra un carattere ;, in detta riga si pu` fare riferimento al le che corrisponde con la stringa {}. o Il problema ` che tutti questi caratteri vengono interpretati dalla shell, e devono quindi essere e adeguatamente protetti; allora se ad esempio si vogliono spostare tutti i le non acceduti da pi` u di 15 giorni un una directory old, si potr` usare un comando del tipo: a
piccardi@anarres:~/Truelite/$ find . -atime +15 -exec mv \{\} old \;

La potenza del comando find ` poi ulteriormente aumentata dal fatto che le varie opzioni e precedenti possono essere combinate fra di loro con degli operatori logici. Ma se il signicato di -and o -or pu` sembrare immediato nel caso di criteri di ricerca, diventa meno chiaro quando o si ha a che fare con delle azioni. In realt` infatti il comando associa un valore logico ad ogni a opzione, e quando si esegue una selezione il valore ` automaticamente vero, lo stesso vale per e tutte le azioni, tranne -exec (e derivate come -ok) in cui il valore ` vero se il comando ha uno e stato di uscita nullo, e falso altrimenti. Il funzionamento di un operatore come -and (che ` sottinteso se si specicano pi` opzioni) e u ` che la seconda opzione (sia questa di ricerca, che una azione) viene eseguita solo se la prima ` e e vera. Viceversa con -or la seconda opzione viene eseguita solo se la prima ` falsa. Inne -not e nega il risultato di una opzione. Nel caso si combinino opzioni di ricerca tutto questo ` del tutto ininuente riguardo il e risultato del comando, che ` quello che ci si aspetta intuitivamente (entrambe le condizioni di e ricerca devono essere soddisfatte per -and o solo una per -or, o si inverte la selezione con -not), ma cambia profondamente quando ci sono di mezzo delle azioni come -exec, perch in tal caso e lesecuzione della seconda opzione dipende in maniera essenziale 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). Per questo ad esempio specicare con -and pi` comandi (o semplicemente scriverne pi` di u u uno, dato che in tal caso il -and ` sottinteso) non signica aatto che essi saranno eseguiti tutti: e 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` usare loperatore o , nel qual caso saranno eseguiti comunque tutti, ma si avr` un valore nale corrispondente a allultimo della lista. Abbiamo allora visto come find ci permette di trovare un le in base al nome e alle sue caratteristiche generiche, una ulteriore modalit` di ricerca ` quella che permette di eettuare a e

2.2. I COMANDI DEI FILE

79

ricerche in base al suo contenuto. Il comando che implementa questa funzionalit` ` grep, insieme ae ai suoi confratelli evoluti (come egrep) che nella loro forma elementare servono a cercare una stringa di caratteri allinterno di uno o pi` le, ma permettono anche di eettuare ricerche u estremamente evolute attraverso luso delle espressioni regolari.39 Luso elementare di grep ` banale, il comando prende come primo argomento la stringa da e cercare seguita dal nome del le (o dalla lista di le) in cui eettuare la ricerca. Il comando stampa in uscita ogni riga del le (o dei le, se se ne ` indicati pi` di uno) nella quale ha rilevato e u una corrispondenza. Ad esempio:
piccardi@anarres:~/Truelite/documentazione/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 eettuare ricerche case insensitive, -r che eettua la ricerca ricorsivamente, e -v che inverte il risultato della ricerca (cio` stampa le righe e che non corrispondono alla stringa utilizzata). Di nuovo le opzioni del comando sono moltissime; si sono riportate in tab. 2.10 le pi` importanti, al solito si rimanda alla pagina di manuale per u una descrizione pi` completa. u
Opzione -b -c -E -e -G -H -h -i -m N -n -P -r Signicato stampa la posizione nel le (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 le in testa a ciascuna riga di output (anche se si ricerca su un solo le). sopprime la stampa del nome del le in testa a ciascuna riga di output (quando sono pi` di uno). u non distingue fra maiuscole e minuscole. sospende la stampa in uscita dopo N corrispondenze. stampa il numero di riga del le 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 le contenuti nelle sottodirectory di quelle passate in ingresso (pu` essere specicata anche come -R). o sopprime la stampa degli errori al riguardo di le non leggibili o non esistenti. inverte la selezione, stampa le linee non corrispondenti.

-s -v

Tabella 2.10: Principali opzioni del comando grep.

Come gli altri comandi Unix anche grep legge, qualora non gli sia passato nessun le come argomento, dallo standard input e scrive sullo standard output; diventa allora evidente la sua
39 le espressioni regolari, o regex, dallinglese regular expressions, sono una specie estensione del sistema del lename globbing (che abbiamo illustrato in sez. 2.1.4) in cui, attraverso una serie di operatori, si possono eettuare corrispondenze fra stringhe con un grado di complessit` incredibilmente elevato, questo le rende allo stesso tempo a uno degli strumenti pi` potenti ed uno degli argomenti pi` ostici del mondo Unix. u u

80

CAPITOLO 2. LA SHELL E I COMANDI

utilit` come ltro per selezionare a piacere, sulla base delle opportune corrispondenze le righe di a un le. Si noti come facendo cos` si possano eettuare ricerche sempre pi` mirate semplicemente u 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 le, indicato con una sintassi speciale che ` quella delle espressioni e regolari. La trattazione dettagliata delle espressioni regolari va ben al di l` delle possibilit` di questo a a 40 in cui ci limiteremo a fornire la descrizione delle funzionalit` pi` elementari. Una esprestesto, a u sione regolare ` in sostanza una stringa di caratteri che identica un pattern, cio` una struttura e e ordinata di caratteri e stringhe, di cui cercare loccorrenza in un le eseguendo loperazione che viene usualmente chiamata pattern matching. 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 eettua la ricerca, alcuni caratteri sono invece riservati per svolgere il ruolo di operatori; uno di questi ` la barra rovescia \ con la quale si pu` richiedere e o linterpretazione letterale del carattere successivo (bloccandone lintepretazione come operatore). Il carattere ^ viene utilizzato per identicare linizio di una riga, mentre il carattere $ serve ad identicarne la ne; pertanto si potranno identicare i commenti in un le di congurazione con lespressione regolare ^# mentre con lespressione ^$ si identicheranno le righe vuote. Il carattere . viene invece utilizzato per indicare un carattere qualunque. Alcune delle espressioni usate nel lename globbing si ritrovano anche nelle espressioni regolari, anche se in questo caso assumono un signicato leggermente diverso41 In particolare le parentesi quadre vengono utilizzate come nel lename globbing per indicare una lista o un intervallo di caratteri (ad esempio [aeiou] indica le vocali e [a-z] le minuscole), la dierenza col lename globbing ` che in questo caso il carattere ^ messo allinizio viene interpretato come e inversione della lista seguente (con [^A-Z] si indicano tutti i caratteri che non siano una lettera maiuscola). Oltre a liste e intervalli specicati direttamente si possono indicare fra parentesi quadre una serie di classi predenite di caratteri con le espressioni riportate in tab. 2.11.
Classe [:alnum:] [:alpha:] [:cntrl:] [:digit:] [:graph:] [:lower:] [:print:] [:punct:] [:space:] [:upper:] [:xdigit:] Signicato lettere (maiuscole e minuscole, indipendenti dalla localizzazione) e numeri. lettere (maiuscole e minuscole, indipendenti dalla localizzazione). caratteri di controllo. numeri. caratteri stampabili (esclusi gli spazi). minuscole. caratteri stampabili (caratteri vuoti compresi). punteggiatura. caratteri vuoti verticali ed orizzontali (spazi, tabulatori, ritorni a capo). maiuscole. cifre esadecimali.

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

Anche i caratteri * e ? assumono un signicato simile a quello del lename globbing,


40 41

un buon testo sullargomento ` [3]. e questo ` spesso causa di confusione ed errori. e

2.2. I COMANDI DEI FILE

81

ma nel caso delle espressioni regolari questo accade perch essi vanno a far parte di un gruppo e particolare di operatori che sono chiamati operatori di ripetizione, riportati in tab. 2.12. 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` essere un numero qualunque (compreso nessuna) mentre con o ? si richiede che sia al pi` una volta (di nuovo lo zero ` compreso). u e
Operatore ? * + {n} {n,} {n,m} Signicato Lespressione precedente pu` corrispondere zero o una volta. o Lespressione precedente pu` corrispondere da zero ad un o qualsiasi numero di volte. Lespressione precedente pu` corrispondere da uno ad un o qualsiasi numero di volte. Lespressione precedente deve corrispondere esattamente n volte. Lespressione precedente deve corrispondere n o pi` volte. u Lespressione precedente deve corrispondere fra n e m volte..

Tabella 2.12: Gli operatori di ripetizione nelle espressioni regolari.

Questo signicato ` di nuovo leggermente diverso da quello presente nel lename globbing, e in particolare una espressione come ab* nel primo caso seleziona tutti i le 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 signicato 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, ` possibile per` applicarli ad una intera espressione regolare mettendola fra parentesi e o 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 ` usato il comando: e
piccardi@monk:~/Truelite/documentazione/corso$ grep -E (una ){2,} *.tex shell.tex:mentre nel secondo caso corrisponde ad una una linea che contenga una

dove appunto si ` richiesto che loccorrenza della stringa una avvenisse almeno due volte di e la. Un raggruppamento viene a costituire quello che viene chiamato un subpattern; e non solo si pu` richiedere, con luso degli operatori di ripetizione la presenza multipla di uno stesso pattern, o ma si pu` anche usare loperatore | posto fra due raggruppamenti per richiedere la presenza o alternativa di uno di essi. Cos` si pu` richiedere la presenza della parola pluto o della parola o pippo nella stessa riga con: piccardi@monk:~/Truelite/documentazione/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 protetti42 con la barra trasversa \ o quella delle espressioni regolari estese (quelle attivate con lopzione -E) dove la protezione non ` necessaria. e
allinterno dellespressione regolare stessa, si noti infatti come si sia espressa questultima fra degli apici per bloccare linterpretazione degli stessi caratteri da parte della shell.
42

82

CAPITOLO 2. LA SHELL E I COMANDI

Luso dei subpattern ha poi unulteriore vantaggio, e cio` che tutte le volte che uno di questi e viene trovato, il suo valore viene memorizzato in un elenco progressivo (secondo la sua posizione nellespressione regolare) e detto valore pu` essere referenziato (e riutilizzato allinterno della o stessa espressione) con luso delle sequenze speciali \1, \2, ecc. Cos` se ad esempio si vo gliono trovare tutte le righe in cui compare due volte, in posizione qualsiasi, una stessa identica combinazione di almeno 10 caratteri si potr` utilizzare lespressione: a
piccardi@monk:/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 ` richiesta la selezione di 10 caratteri consecutivi qualunque e poi si ` e e richiesto che la stessa selezione di caratteri comparisse di seguito sulla stessa linea (con interposti un numero qualunque di altri caratteri).

2.2.3

I comandi visualizzare il contenuto dei le

Un primo comando che permette di visualizzare il contenuto di un le lo abbiamo gi` incontrato a in sez. 2.1.5, arontando luso di cat, ed in tale occasione abbiamo anche citato che se lo scopo ` solo quello della visualizzazione del contenuto di un le esistono alternative migliori, che sono e quelle che tratteremo adesso. Il problema maggiore delluso di cat come visualizzatore ` che questo scrive tutto sul tere minale, senza possibilit` di mostrare il contenuto del le un po alla volta. Per questo sono a stati allora creati tutta una serie di programmi studiati per mostrare il contenuto dei le una pagina alla volta (dove per pagina si intende la schermata del terminale), che per questo sono detti pager. Ad essi ` dedicata anche una variabile di ambiente,PAGER, usata dai programmi che e necessitano di visualizzare il contenuto di un le, per scegliere quale di questi lanciare. Il primo programma usato per la visualizzazione ` more, il quale prende come argomento una e lista di le da leggere di cui stampa il contenuto sul terminale una pagina alla volta, attendendo che lutente gli 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` specicare un parametro che indica il numero di linee che devono essere stampate o 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` interrompere la visualizzazione con q, mentre con b si pu` tornare una pagina o o indietro. Se si sono indicati pi` le con :n si pu` passare alla visualizzazione del successivo u o mentre con :p tornare al precedente. Con il tasto / si fa apparire un prompt dove inserire una stringa da ricercare allinterno del le.43 Inne con v si pu` lanciare leditor impostato con la o variabile di ambiente EDITOR (gli editor sono trattati in sez. 2.4, quello usato di default ` vi) e per modicare il contenuto del le. Il comando more ` stato creato n dagli albori di Unix, e la sua sintassi risente anche del e fatto che i primi terminali erano delle telescriventi, dove lo scorrere avanti ed indietro signica semplicemente ristampare pezzi del le. Dato che ben presto tutti i terminali iniziarono a
43

in realt` si pu` usare una regular expression, e compiere quindi anche ricerche molto complesse. a o

2.2. I COMANDI DEI FILE

83

supportare la riscrittura dello schermo, e che tutte le tastiere iniziarono ad avere i tasti di freccia, venne creato less come evoluzione 44 di more. Le funzionalit` di less sono analoghe, e supporta anche tutti i comandi precedentemente a illustrati per more, ma il comando anche consente degli spostamenti pi` comodi, potendo naviu gare il contenuto del le avanti ed indietro con i tasti di freccia, pagina su e gi`, ecc. Il comando u poi supporta funzionalit` avanzate come la possibilit` di ridenire dei keybinding, di lanciare a a dei programmi per pre-processare dei dati (ad esempio decomprimere al volo dei le compressi), ecc. Per i dettagli si faccia al solito riferimento alla pagina di manuale. Un altro programma di visualizzazione, pi` utile in caso di le binari, ` od, (da Octal Dump) u e che permette di stampare il contenuto di un le in forma numerica, usando vari formati: decimale, ottale (il default), esadecimale e pure direttamente in semplice ASCII. La modalit` in cui viene a stampato il contenuto ` controllata dallopzione -t, che prende come parametro una stringa e indicante il formato, il cui primo carattere indica il tipo di rappresentazione scelta, secondo quanto riportato in tab. 2.13, mentre, nel caso di forma numerica, si pu` utilizzare un secondo o 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.13: I caratteri indicanti il formato per la stampa delloutput del comando od.

Una seconda opzione che permette di modicare il formato di stampa di od ` -A, che stabilisce e come deve essere stampato il numero progressivo che indica la posizione nel le; lopzione prende come parametro uno dei caratteri d, o, x, o n dove i primi tre hanno lo stesso signicato riportato in tab. 2.13 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 le e prende come parametro il numero di byte da saltare, e -n che permette di specicare (passandolo come parametro) il numero di byte da stampare (altrimenti il comando stampa tutto il contenuto del le). Per le altre opzioni ed i dettagli di funzionamento del comando si faccia al solito riferimento alla pagina di manuale.

2.2.4

I comandi per suddividere il contenuto dei le

Ma al di l` della necessit` di leggere il contenuto di un le scorrendolo un poco per volta, si a a pu` essere interessati ad eettuare delle selezioni pi` mirate. La nostra scatola degli attrezzi o u dei comandi Unix provvede allora due comandi specializzati, head e tail, che ci permettono di selezionare (nel caso scrivere sullo standard output) rispettivamente linizio e la ne del le. Entrambi usano lopzione -n per indicare il numero di linee totali da selezionare (il default ` e 10), e -c per eettuare la selezione in byte invece che in linee. Al solito si faccia riferimento alla pagina di manuale per lelenco completo e la descrizione dettagliata dei comandi. In questo caso nostra cassetta degli attrezzi sembrerebbe mancare di un comando ulteriore che ci permetta di selezionare una sezione qualunque del le a partire da una certa riga N per nire con unaltra M. Ma questo ` ancora una volta facilmente ottenibile concatenando i due e
44

si, volevano davvero fare gli spiritosi!

84

CAPITOLO 2. LA SHELL E I COMANDI

comandi precedenti; baster` tagliare prima la coda del le con head e poi la testa con tail, a costruendo una linea di comando del tipo:45 head -n M file | tail -n $((M-N)) Vale la pena poi menzionare esplicitamente lopzione -f di tail che quando usata fa si che il comando non esca e continui a stampare ogni eventuale altro dato aggiunto in coda al le, permettendo cos` di seguire la crescita di questultimo. Questa ` una opzione molto utile per e tenere sotto controllo i le di log, ed in generale tutti i le in cui altri programmi scrivono in coda i loro dati. Come contraltare di cat (che si ricordi serve a concatenare il contenuto dei le) si pu` usare o split, che viene usato per tagliare a fette un le. Il comando prende come argomento il le da aettare, e lo suddivide in tanti le di dimensione uguale che chiama progressivamente xaa, xab, xac, ecc. Se non specica un argomento al solito split legge dallo standard input, consentendo cos` ad esempio di creare un le con un comando e suddividerlo al volo con una pipe). Dato che il comando crea le sue fette in ordine alfabetico, per ricomporre il le originario baster` usare a un comando del tipo cat x* > file. Aggiungendo un secondo argomento dopo il nome del le da suddividere si pu` specicare un o presso diverso da x come intestazione dei nuovi le creati dal comando. La dimensione dei le viene specicata con lopzione -C se le si vuole in linee o con -b se la si vuole in byte, questultima supporta anche un valore del parametro con i sussi m e k per indicare rispettivamente megabyte e kilobyte. Inne se due lettere non bastano per indicizzare i le che si generano si pu` usare o lopzione -a per specicarne un numero diverso. Per tutti i dettagli si faccia al solito riferimento alla pagina di manuale. Se si vuole tagliare un le per colonne invece che per righe si pu` usare il comando cut. o Il comando opera sul le passato come argomento (o sullo standard input, rendendo di nuovo possibile operazioni complesse e ltri ricorsivi), stampando le colonne selezionate sullo standard output. Con lopzione -c si pu` creare la colonna selezionando i caratteri in base alla loro o posizione rispetto allinizio della riga. Lopzione prende una lista dei caratteri, separata da virgole, e supporta la presenza di intervalli, indicati con un -, cos` se si vuole ottenere la stringa dei permessi dalloutput di ls -l baster` fare: a
piccardi@anarres:~/Truelite/documentazione/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` del comando ` che oltre alle posizioni assolute, permette di eettuare la selezione in a e termini di campi delimitati da un carattere qualunque che pu` essere specicato con lopzione o -d (di default il comando usa come separatore il tabulatore), in tal caso si eettuer` la selezione a di quali campi stampare con lopzione -f, che indica la posizione in maniera analoga a -c. Cos` si potr` ad esempio stampare il proprio user ID con: a
piccardi@anarres:~/Truelite$ cat /etc/passwd | grep piccardi | cut -d: -f 3 1000
45

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

2.2. I COMANDI DEI FILE

85

Come contraltare a cut, il comando paste permette di concatenare le diversi in colonna. Il comando prende come argomenti i nomi di una serie di le, e produce in uscita un le le cui righe sono lunione delle righe dei le in ingresso, separate da dei caratteri di tabulazione. Se non si specica nessun le il comando legge dallo standard input, che pu` essere usato anche o allinterno di una sequenza di le indicandolo con -. Quando i le hanno dimensioni diverse il le prodotto sar` esteso alla lunghezza (in righe) del a pi` lungo dei le in ingresso, in cui le righe nali avranno dei campi vuoti in corrispondenza alle u righe mancanti nei le pi` corti. Questo comportamento pu` essere modicato usando lopzione u o -f che ferma la generazione di nuove righe non appena si incontra la ne di uno dei le dati in ingresso. Con lopzione -s invece si pu` eettuare una trasposizione dei le, in cui il contenuto (in o righe) di ciascuno, viene messo in colonna su di ununica riga. Se si usano pi` le in ingresso u saranno generate tante righe quanti sono i le. Con lopzione -d si possono modicare 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.

2.2.5

I comandi per ltrare il contenuto dei le

In questa sezione prenderemo brevemente in esame una serie di comandi che permettono di ltrare e manipolare in maniera automatica il contenuto dei le. Questi costituiscono in genere uno strumento estremamente potente, in quanto il loro inserimento allinterno di una concatenazione di comandi permette di eseguire delle operazioni di conversione in maniera rapida ed eciente. Il primo comando utilizzabile per manipolare il contenuto di un le ` tr, il cui nome sta per e TRanslate. Lo scopo del comando ` quello di eettuare delle conversioni dei caratteri. Come e tutti i comandi opera esso opera direttamente su un le qualora questo sia specicato a riga di comando altrimenti utilizza lo standard input, scrivendo il risultato sullo standard output; in tal modo lo si pu` utilizzare come una sorta di ltro. o Il comando, a parte le opzioni, pu` prendere uno o due argomenti. Il primo indica un o insieme di caratteri di cui eseguire la ricerca nel le, il secondo, quando presente, indica la lista dei caratteri con cui il corrispondente del primo insieme deve essere sostituito. In genere quando si specicano due argomenti questi devono specicare 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 ` pi` lungo vengono utilizzati solo i caratteri iniziali. e u Qualora si specichi lopzione -d il secondo insieme viene ignorato, e tutti i caratteri del primo insieme vengono cancellati. Se invece si specica lopzione -c il primo insieme viene considerato come quello dei caratteri che non devono corrispondere. Inne usando lopzione -s si possono strizzare preventivamente le ripetizioni di un qualunque carattere del primo insieme trasformandole in un carattere singolo (che poi potr` essere sostituito). a Le liste dei caratteri in genere si possono esprimere direttamente con delle stringhe, il comando per` supporta anche le classi di caratteri denite in tab. 2.11, e si possono usare gli o identicatori 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.14. Per la sintassi completa del comando ed i dettagli riguardo le varie forme che si possono utilizzare per specicare gli insiemi dei caratteri si faccia comunque riferimento alla pagina di manuale, al solito accessibile con man tr. Un secondo insieme di programmi operano sul contenuto dei le di testo, principalmente a scopo di riformattarlo adeguatamente. Il primo di questi ` pr che serve a suddividere il testo e

86
Espressione \NNN \\ \a \b \f \n \r \t \v

CAPITOLO 2. LA SHELL E I COMANDI


Signicato carattere specicato 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.14: Caratteri speciali ad uso del comando tr.

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 congurare in maniera diversa le modalit` con cui viene eettuata la suddivisione in pagine ed impostare le informazioni a mostrate in testa e coda delle stesse. Il secondo programma ` fmt che riformatta il le in uscita paragrafo per paragrafo, pere mettendo di impostare caratteristiche come indentazioni della prima riga e numero di spazi e mantenere una lunghezza costante della riga. Di nuovo le varie modalit` con cui si pu` compiere a o la formattazione sono controllate dalle opzioni, per le quali si rimanda alla pagina di manuale. Il terzo programma ` fold che si limita invece a troncare le righe troppo lunghe rispetto e ad una dimensione ssa delle stesse specicabile con lopzione -w. Questo ` il pi` semplice dei e u comandi di formattazione, con forse leccezione di nl, che come indica il nome serve a numerare le linee di ciascun le. Di nuovo si pu` fare riferimento alle pagine di manuale per le singole o opzioni. Vale poi la pena citare i due programmi expand e unexpand che servono rispettivamente a convertire tabulazioni in spazi e viceversa. Entrambi prendono le opzioni -t che permette di specicare le dimensioni del tabulatore se seguita da un numero come parametro, o le posizioni delle tabulazioni, che devono invece essere specicate come lista separata da virgole. Per i dettagli di nuovo si pu` fare riferimento alla pagina di manuale. o Abbiamo lasciato per ultimo pi` importante dei comandi per ltrare il contenuto dei le: u sed, il cui nome sta per Stream EDitor. Il programma serve appunto per eseguire una serie di trasformazioni su un usso di dati come quelle potrebbero essere fatte da un normale editor su un le, in modo da poter utilizzare il comando in una catena di pipeline che mettano in grado di eettuare le volute modiche nel passaggio dei dati dallo standard input allo standard output. Il comando prende come primo argomento lespressione di editing che indica le operazioni da eseguire, a meno che non si sia specicata questultima nel contenuto del le indicato tramite lopzione -f o direttamente come parametro per lopzione -e. I restanti argomenti, se presenti, indicano i le su cui applicare la suddetta espressione; se non ` presente nessun altro argomento e lo script viene applicato sullo standard input. Le principali opzioni sono riportate in tab. 2.15.
Opzione -e -f -n -r Signicato indica esplicitamente lespressione che indica i comandi di editing da applicare. indica un le contenente lespressione dei comandi di editing. sopprime la stampa del pattern space che avviene alla ne del processo di ogni riga. usa le espressioni regolari estese.

Tabella 2.15: Principali opzioni del comando sed.

A meno di non utilizzare lopzione -n il comando stampa tutto quanto ` stato letto in ingresso e ` cos` possibile salvare il risultato del (che sia stato modicato o meno) sullo standard output. E

2.2. I COMANDI DEI FILE

87

ltraggio redirigendo loutput del comando. Lopzione -n ` fornita per permettere (allinterno dei e 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 essibilit` dei comandi che possono essere dati tramite a lespressione di editing, alcuni di questi infatti utilizzano le espressioni regolari (le cui basi si sono illustrate in sez. 2.2.2) per individuare dei pattern nel le 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 le 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 specica nessun indirizzo, il comando si applica a tutte le righe del le. Inne se ad un indirizzo si fa seguire (prima del comando) il carattere ! la selezione delle righe viene invertita. In genere un indirizzo viene specicato 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` possibili delle selezioni pi` o u complesse, come $ che indica lultima riga del le, o /regexp/ che seleziona le righe corrispondenti ad una espressione regolare; un elenco delle principali forme con cui si pu` specicare o un indirizzo ` riportato in tab. 2.16. e
Espressione N N,M N~M /regexp/ $ N,+M Signicato 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 le. seleziona M righe a partire dalla N-sima.

Tabella 2.16: Espressioni per specicare un indirizzo al comando sed.

Una volta specicato lindirizzo la seconda parte di una espressione di editing ` composta e 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 grae, ed in genere vengono scritti uno per riga e possono essere letti da un le con lopzione -f. Per capire lazione dei vari comandi occorre capire come sed eettua la manipolazione dei dati e dove questi sono mantenuti. Quando una riga viene letta da un le essa viene posta nel cosiddetto pattern space dove vengono eettuate tutte le operazioni e la manipolazione del contenuto: ` cio` nel pattern space che si troveranno le modiche eseguite al contenuto originale e e dalle operazioni di sed. Il comando prevede inoltre anche la presenza di un altro spazio lo hold space, inizialmente vuoto, dove ` possibile inviare dati a partire dal pattern space, che e possono essere ripresi successivamente; questo permette operazioni complesse in cui i dati sono opportunamente spostati e ricombinati allinterno di detti spazi. Lelenco dei comandi pi` comuni ` riportato in tab. 2.17; ma sed ne supporta molti altri. u e Un elenco completo con una descrizione sommaria si pu` trovare nella pagina di manuale, ma la o documentazione completa, fornita anche di parecchi esempi, ` disponibile solo nelle pagine info, e accessibili con info sed. Il pi` importante ed utilizzato (e lunico che tratteremo esplicitamente) dei comandi di sed u ` s che permette di sostituire una sezione di testo nel pattern space con unaltra. La sintassi e del comando ` nella forma s/ricerca/sostituzione/ ed in questa forma rimpiazza (allinterno e del pattern space) la prima occorrenza della stringa ricerca con la stringa sostituzione. La potenza del comando sta nel fatto che la stringa di ricerca viene specicata come espressione regolare, pertanto diventa possibile fare selezioni estremamente complesse; inoltre si possono

88
Espressione q N p d s

CAPITOLO 2. LA SHELL E I COMANDI


Signicato 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.17: Principali espressioni di comando per sed.

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 sosticate. Dopo la / nale si possono specicare 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) mentre specicando un numero N si esegue la sostituzione solo per la N-sima corrispondenza trovata.

2.2.6

Altri comandi dei le

Raccogliamo qui una serie di altri comandi di uso abbastanza comune che non rientrano in nessuna delle precedenti categorie. Il primo di questi ` touch, che viene usato in quasi tutti e gli esempi per creare un le vuoto. In realt` il comando non serve a questo (dato che lo stesso a compito si potrebbe fare in molti altri modi) quanto, come dice il nome, a toccare un le. Se il le passato come argomento non esiste infatti il risultato del comando ` quello di crearlo e vuoto, ma se invece esiste leetto del comando ` quello di modicare al tempo corrente i tempi e di ultimo accesso e ultima modica (si ricordi quanto illustrato in sez. 1.2.1). Il comando prende varie opzioni e permette di modicare solo il tempo di ultimo accesso, se usato con lopzione -a o solo quello di ultima modica, se usato con lopzione -m. Le altre opzioni sono al solito sulla pagina di manuale. Un altro programma molto utile ` sort, che permette di ordinare il contenuto di un le. e Il comando prende come argomento un le e ne stampa il contenuto con le righe in ordine alfabetico. Dato che se non si specica nessun le 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` darlo in pasto a sort. Le opzioni permettono di a controllare le modalit` di ordinamento, ad esempio con -b si pu` dire al comando di ignorare gli a o 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 quello alfabetico (per avere 2 prima di 10), con -f di non dierenziare fra maiuscole e minuscole. Per lelenco completo si faccia al solito riferimento alla pagina di manuale. Un altro particolare riordinamento del contenuto di un le viene eseguito dal comando tac, che serve a stampare il contenuto di un le alla rovescia, cio` a partire dallultima riga verso la e prima.46 Il comando in realt` divide un le in campi separati da un carattere, che di default ` a e il ritorno a capo per cui i campi vengono a coincidere con le righe; con lopzione -s per` si pu` o o passare come parametro un diverso separatore, mentre con -r si pu` usare come separatore una o espressione regolare. Per i dettagli conviene consultare la pagina info con info tac dato che la pagina di manuale ` molto sintetica. e Un altro comando che permette di ltrare il contenuto di un le ` uniq, che elimina le e linee adiacenti uguali; il comando prende come argomento un nome di le (ma se non viene specicato legge lo standard input) e stampa il risultato sullo standard output. Al solito le varie
46

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

2.3. ALTRI COMANDI

89

opzioni permettono di controllare le modalit` con cui vengono eettuati confronti: con -i si pu` a o ignorare la dierenza fra maiuscole e minuscole, con -d si limita a stampare (senza rimuoverle) le linee duplicate, con -s si pu` specicare il numero di caratteri ad inizio riga da non inserire o nel confronto. Altre opzioni, al solito dettagliate nella pagina di manuale, permettono anche selezioni pi` complesse. u Di nuovo considerata a se stante, lutilit` di un comando come questo pu` apparire limitata, a o ma basta pensare alle combinazioni con altri comandi per apprezzarne la funzionalit`. Si consia deri ad esempio la necessit` di riunire elenchi di parole contenuti in pi` le (supponiamo siano a u elenco1.txt, elenco2.txt, ecc.), lo scopo ` quello di avere un le con lelenco completo in cui e tutte le parole compaiono una volta sola; questo pu` essere ottenuto in un batter docchio con o un comando come: cat elenco*.txt | sort | uniq > elencofinale Una ulteriore serie di comandi sono quelli che possono essere usati per fare dei sommari del contenuto di un le. Il pi` semplice ` wc, (da Word Count) che viene usato per contare le u e parole contenute in un le. Il comando prende come argomento una lista di le (se non se ne specicano al solito viene usato lo standard input) di cui stampa il numero totale di linee, di parole e byte. In genere il comando stampa tutte queste informazioni insieme al nome del le, se ne sono specicate pi` di uno. Si pu` far stampare solo il numero di linee, di parole o di byte u o con le opzioni -l, -w e -c; lopzione -L stampa la lunghezza della linea pi` lunga. u Altri comandi sono cksum e md5sum che stampano delle opportune checksum (delle somme di controllo,47 o hash che confrontate permettono di vericare lintegrit` di un le). Entrambi a prendono come argomenti una lista di le, per ciascuno dei quali sar` stampato a video il risultato a del calcolo, per cksum dalla lunghezza e dal nome, per md5sum solo dal nome. Al solito se non si specica nulla i comandi leggono dallo standard input. Inoltre md5sum supporta unopzione -c, che permette di specicare un solo parametro, che in questo caso sar` a un le che contiene una lista di risultati di precedenti invocazioni del programma. Il comando verr` applicato a ciascuno dei le elencati, segnalando eventuali dierenze. Diventa cos` possibile a eettuare direttamente un controllo di integrit`. a

2.3

Altri comandi

Dopo aver trattato i comandi che operano sui le, faremo una panoramica su una serie di altri comandi di varia utilit` che non sono direttamente connessi alla gestione dei le, ma che a risultano di grande utilit` come quelli per la documentazione, per impostare i tempi del sistema, a per eseguire manipolazione avanzate sulla redirezione ed in generale tutti i comandi che non hanno direttamente a che fare con la gestione dei le.

2.3.1

I comandi per la documentazione

Bench talvolta sia dicile trovare informazione sulle funzionalit` pi` esoteriche, una delle cae a u ratteristiche di un sistema GNU/Linux ` quella di essere fornito di una quantit` impressionante e a di documentazione, tanto che una delle risposte pi` frequenti alle domande di chiarimento ` u e RTFM.48 Come accennato in sez. 2.1.4 ciascun comando di norma supporta da suo una opzione --help che permette di visualizzarne brevemente la sintassi. Dato che questa informazione ` in genere e
si chiamano cos` delle opportune funzioni matematiche che hanno la caratteristica di dare risultati molto diversi anche per piccole dierenze nellinput. In particolare cksum usa un algoritmo chiamato CRC, che ` e piuttosto debole, cio` ` pi` facile avere lo stesso risultato, md5sum usa unaltro algoritmo, detto MD5, pi` recente, ee u u che ` meno soggetto ad errori, ma comporta pi` calcoli. e u 48 sigla che sta, a seconda dellumore del momento, per Read The Fine Manual o Read The Fucking Manual.
47

90

CAPITOLO 2. LA SHELL E I COMANDI

solo uno stringato riassunto delle opzioni disponibili, la fonte primaria delle informazioni relative ai comandi ` nelle pagine di manuale, n qui abbondantemente citate, che si accedono con il e comando man. 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 n dai primi Unix e prevede la documentazione di tutto il sistema. Per questo le pagine di manuale sono divise in sezioni, il cui numero ` quello che compare fra e 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 classicazione riportata in tab. 2.18.49
Sezione (1) (2) (3) (4) (5) (6) (7) (8) Signicato programmi eseguibili o comandi di shell. system call (funzioni fornite dal kernel). funzioni di libreria. documentazione sui le di /dev. formati dei le di congurazione. giochi. varie (convenzioni, informazioni generiche su argomenti). comandi di amministrazione. Tabella 2.18: 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 signicato delle direttive di un le di congurazione. Il comando supporta una serie di opzioni di formattazione e per inviare loutput su stampante, che al solito sono descritte in dettaglio nella sua pagina di manuale, che come per gli altri comandi si accede con man man. Si tenga presente che il comando man richiama la pagina relativa al nome che si ` passato e come argomento, cercando in sequenza50 nelle varie sezioni e restituendo la prima che trova. Per questo se esistono pi` versioni della stessa pagina in sezioni diverse (come ad esempio per u il comando passwd e per il le /etc/passwd) verr` mostrata solo la prima, se si vuole accedere a alla seconda si dovr` richiamarla esplicitamente indicando la sezione con un qualcosa del tipo a man 5 passwd. Il sistema delle pagine di manuale (torneremo sulla sua congurazione in sez. 3.1.5) permette per` di vericare se esistono pi` pagine associate ad uno stesso nome con il comando whatis, o u che stampa lelenco delle pagine ad esso corrispondenti, cos` ad esempio avremo:
piccardi@anarres:~/Truelite/documentazione/corso$ whatis passwd passwd (1) - change user password passwd (5) - The password file

Unaltra funzionalit` utile del sistema ` fornita dal comando apropos che permette di efa e fettuare 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:
49 in realt` qui si sono messe solo le sezioni classiche, ci possono essere altre sezioni speciche installate insieme a ad alcuni pacchetti come quelle della documentazione del perl (un linguaggio di programmazione). 50 si tenga presente che la sequenza esatta non ` detto sia quella di tab. 2.18, in realt` essa si imposta nella e a congurazione del sistema di gestione delle pagine di manuale, trattata in sez. 3.1.5.

2.3. ALTRI COMANDI

91

piccardi@anarres:~/Truelite/documentazione/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 eettuare una ricerca su una stringa contenente uno spazio, dato che altrimenti si sarebbero passate due stringhe al comando. Una seconda fonte di informazioni ` costituita dal sistema di help on line fornito dal comando e info. 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` avanzate e molto comode come: la possibilit` di navigare usando link ad altre pagine, una u a organizzazione gerarchica strutturata ad albero con nodi e sezioni, la possibilit` di consultare a indici, ecc. Grazie a questa struttura info permette anche di accedere a documenti pi` complessi u di una semplice pagina di manuale, e vi si trovano una grande quantit` di manuali di grandissima a importanza, come tutta la documentazione dei sistemi di sviluppo, dei linguaggi, delle librerie, ecc. Data le sue caratteristiche evolute info ` il formato raccomandato dal progetto GNU, che e lo considera alternativo rispetto alle pagine di manuale. Molti per` continuano ad utilizzare o questultime per cui alla ne i due sistemi si trovano a convivere. In genere il contenuto delle pagine di manuale ` direttamente accessibile anche con il comando info comando; se per` e o ci si limita a richiamare il comando info ci verr` mostrata la radice del sistema dove sono a elencati tutti i documenti installati, e sar` possibile iniziare la navigazione spostandosi con le a freccie, seguire i link premendo invio, tornare al livello precedente premendo u, passare al nodo successivo con n, tornare al precedente con p, andare allindice con i, eettuare una ricerca con /, ed inne visualizzare i vari comandi disponibili con ?. Inne si tenga presente che in genere i singoli pacchetti dei vari programmi vengono distribuiti la documentazione prodotta direttamente dagli autori che di norma, secondo il FHS, si trova nella directory /usr/share/doc/nomeprogramma. A questa 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) raccolti dal Linux Documentation Project, e di norma installati dalle varie distribuzioni insieme allaltra documentazione in /usr/share/doc/HOWTO/. Inne quando non si riescono a trovare informazioni nel sistema si pu` ricorrere direttameno te ad internet. Una delle risorse pi` usate ` quella degli HOWTO del Linux Documentation u e Project, che sono continuamente aggiornati sul sito del progetto, http://www.tldp.org. 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` trovare sul sito o del PLUTO (gruppo storico di utenti Linux italiani) nella sezione dedicata allItalian Linux Documentation Project allindirizzo http://ildp.pluto.it/. Una grande quantit` di informazioni, e laiuto di altri utenti, pu` essere trovato sui gruppi di a o discussione di usenet, una rete internazionale di distribuzione di notizie in cui chiunque (usando il relativo client) pu` lasciare messaggi e ricevere risposte (la losoa di funzionamento del sistema o ` ripresa da quella delle bacheche pubbliche delle universit`). e a In tal caso il proprio provider deve aver fornito una accesso ad un news server che riceve i gruppi dedicati alle discussioni su Linux, che nella gerarchia internazionale51 sono quelli che si trovano sotto comp.os.linux, mentre quelli della gerarchia italiana stanno sotto it.comp.os.linux. In tal caso ` comunque opportuno leggere in anticipo le FAQ (Frequently Asked Question) che e
tanto per cambiare, dato che anche questo servizio ` nato su Unix, i gruppi di discussioni sono organizzati e per temi, e strutturati ad albero in una gerarchia per cui si va da un tema pi` generale (comp per i computer) a u temi sempre pi` specici (comp.os per i sistemi operativi, comp.lang per i linguaggi di programmazione, ecc.). u
51

92

CAPITOLO 2. LA SHELL E I COMANDI

raccolgono una serie di riposte alla domande pi` ricorrenti, onde evitare di ripetere domande u banali che non sarebbero accolte molto amichevolmente. Inne lutilizzo dei motori di ricerca ` un ottimo sistema per recuperare le informazioni e pubblicate su internet. Fra queste troverete le versioni pubblicate degli HOWTO e delle FAQ (anche se queste vengono spesso distribuite come documentazione nel sistema, non ` detto che e 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` aver gi` avuto il vostro problema e trovato una risposta. o a

2.3.2

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 denizioni: ` calendar time : detto anche tempo di calendario. E il numero di secondi dalla mezzanotte del 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 chiamato anche GMT (Greenwich Mean Time) dato che lUTC corrisponde allora ` locale di Greenwich. E il tempo su cui viene mantenuto lorologio del kernel, e viene usato ad esempio per indicare le date di modica dei le o quelle di avvio dei processi. ` process time : detto talvolta tempo di processore. E il tempo usato internamente dal kernel per le sue temporizzazioni. In genere ` legato alle interruzioni del timer, e viene impiegato e per tutti i calcoli dello scheduler, ` pertanto il tempo in cui viene misurato il tempo di e esecuzione dei processi. In genere il tempo a cui si fa riferimento ` sempre il calendar time, il process time viene usato e soltanto dai comandi che riportano le propriet` speciche dei processi (come ps o top) relative a ai tempi di esecuzione degli stessi. Oltre a questi due, gi` trattati in sez. 1.3.1, lunico altro a comando che usa il process time ` time, che prende come argomento una riga di comando da e 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` allinterno delle system call invocate e dal processo (con la sigla sys), ad esempio:
piccardi@monk:~/Truelite/documentazione$ time ls CVS README corso internet-server ldap lucidi real user sys 0m0.030s 0m0.000s 0m0.010s samba

e si noti come il tempo reale ` sempre maggiore degli altri due in quanto tiene conto anche del e tempo in cui il processo ` stato in stato di sleep in attesa di I/O. e Il comando prende varie opzioni, le principali delle quali sono -o che permette di specicare un le su cui scrivere i risultati al posto dello standard output, e -f che permette di specicare 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 ` che esistono due orologi, quello di sistema, e

2.3. ALTRI COMANDI

93

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 ` spenta.52 Di solito il kernel lo legge allavvio per impostare il valore e iniziale dellorologio di sistema e non lo considera pi`. u La seconda complicazione ` che il kernel non conosce assolutamente niente dei fusi orari. Per e lui il tempo ` assoluto, e fa sempre riferimento al tempo standard universale (lUTC appunto); e tutta la gestione dei fusi orari ` demandata alle applicazioni in user space che, tutte le volte che e leggono un tempo, devono essere in grado di convertirlo nellora locale.53 Se ci si pensa questa ` la scelta pi` logica: non solo si evita di inserire una serie di informazioni e u 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 le modicati 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 le che possono anche risultare essere stati creati nel futuro), e soprattutto di incompatibilit` a dei tempi in caso di dual boot. Il comando che permette di leggere ed impostare lorologio di sistema ` date. Se usato senza e argomenti questo si limita a stampare data ed ora corrente nel formato standard:
piccardi@monk:~/Truelite/documentazione/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 modica loutput del comando facendogli stampare solo le parti di data volute. Se si vuole impostare la data questa deve essere specicata 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 nali YY o per intero con tanto di secoli come CCYY, inne i secondi ss devono essere preceduti da un punto; ad esempio si pu` provare ad impostare lorologio con: o
piccardi@monk:~/Truelite/documentazione/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 ` lamministratore, ma il tempo che si voleva impostare e 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` sostituita dallopportuno valore, tutti gli altri caratteri resteranno a immutati. Le principali direttive sono riportate in tab. 2.19, lelenco completo ` nella pagina di e manuale. Il comando prende inoltre varie opzioni, le principali delle quali sono -d che permette di specicare una data da stampare al posto del tempo corrente, e -s che permette, con lo stesso formato, di specicare limpostazione dellorologio di sistema. Lutilit` di queste due opzioni ` a e che la stringa che prendono come parametro pu` essere nelle forma pi` varie, e non solo riconosce o u tutti i formati standard che si ottengono con le direttive di tab. 2.19, ma anche descrizioni verbali (solo in inglese, per`) come 8 day ago, o 1 month. La descrizione di queste stringhe pu` essere o o
` lorologio che si trova sulla scheda madre, ed ` alimentato della batteria che si trova su di essa. e e il tutto ` fatto attraverso delle opportune funzioni di libreria, che permettono di eseguire il compito in maniera e trasparente.
53 52

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

CAPITOLO 2. LA SHELL E I COMANDI


Signicato il carattere %. il nome del giorno della settimana abbreviato, secondo la localizzazione. il nome del giorno della settimana, secondo la localizzazione. il nome del mese abbreviato, secondo la localizzazione. il nome del mese, 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.19: Direttive di formattazione per il comando date.

trovata solo nelle pagine info del comando, accessibili con info date, dove si trova anche la trattazione completa tutte le funzionalit`. a Il secondo comando che riguarda la gestione del tempo ` hwclock, che permette di impostare e lorologio hardware. Il comando non prende argomenti, e lo si utilizza attraverso le opzioni. Se non si specica nessuna opzione il comando si limita leggere il valore dellorologio hardware e a stamparlo sullo standard output, con un risultato del tipo:
monk:/home/piccardi/Truelite/documentazione/corso# hwclock Tue Sep 23 15:36:58 2003 -0.763201 seconds

(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 specichi la data da usare nel formato con cui la si specica anche per date. Si pu` per` usare lopzione -w (o --systohc) per impostare lora direttamente al tempo o o segnato dallorologio di sistema. Viceversa lopzione -s (o --hctosys) imposta lorologio di sistema al tempo di quello hardware.

2.3.3

I comandi di ausilio per la redirezione

Nonostante la grande essibilit` degli operatori di redirezione della shell, esistono situazioni a in cui il loro uso non ` suciente a fornire le funzionalit` necessarie, per questo esistono dei e a comandi che permettono di estendere luso della redirezione. Ad esempio uno dei fraintendimenti pi` comuni riguardo luso della concatenazione dei cou mandi ` quello in cui si pensa di usare la pipe per passare come argomenti ad un comando e successivo loutput di un comando precedente. Questo non ` ovviamente possibile perch luso e e 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. ` E per` possibile provvedere questa funzionalit` con luso del comando xargs, il cui compito o a ` replicare il comportamento della shell, che legge la linea di comando e ne estrae gli argomenti. e Il comando cio` eettua la lettura standard input e ne ricava una lista di argomenti da passare e

2.4. GLI EDITOR DI TESTO

95

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 argomenti un comando da eseguire e le eventuali opzioni o argomenti iniziali, e per ogni riga ricevuta sullo standard input esegue il comando passandogli gli ` ulteriori argomenti, separati da spazi, cos` come letti dallo standard input. E possibile proteggere la presenza di spazi allinterno degli argomenti cos` come si fa con la shell, usando le virgolette o la barra trasversa. Se non si passa nessun argomento viene usato echo come comando di default. In questo modo diventa ad esempio possibile applicare un comando qualunque ad una lista di le usando semplicemente cat e xargs. Se cio` si vogliono cancellare tutti i le contenuti nel e le lista, si potr` usare un comando del tipo: a cat lista | xargs rm -f ovviamente nel far questo occorrer` stare molto attenti, ` sempre consigliabile infatti, quando a e si usa xargs, lanciare il comando senza argomenti per vericare che non si stiano facendo degli errori. Il comando permette di impostare, con lopzione -e una stringa da usare come marcatore per la ne del le, in modo da ignorare tutto quanto sar` letto dopo; con lopzione -t inoltre a permette di stampare a video il comando eseguito, e con -p di richiedere conferma dellesecuzione sul terminale. Inne 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.). Lelenco completo delle opzioni ` riportato nella pagina di manuale, accessibile con man e xargs. Un secondo problema ` quello che si ha quando si redirige lo standard output su un le e e si perde cos` la possibilit` di esaminarlo sullo schermo. Anche in questo caso ` possibile avere a e questa funzionalit` usando un comando apposito tee. Il comando, come per la redirezione, ` a e in grado anche di eseguire la scrittura dei le in append usando lopzione -a, al solito tutte le opzioni ed i dettagli di funzionamento si trovano nella pagina di manuale. Un ultimo comando usato come ausilio per la redirezione ` yes, che ha il semplice compito e (se invocato senza argomenti) di scrivere continuamente sullo standard input una serie di y. Anche in questo caso lutilit` di fare un comando per un compito cos` specico diventa evidente a solo considerando la capacit` della shell di concatenare i comandi, per cui si pu` usare yes a o per pilotare automaticamente lo standard input di un comando che richiede conferme (come potrebbe essere rm -i). Il comando non ha nessuna opzione specica e prende come argomento una stringa, che verr` usata al posto di y. a

2.4

Gli editor di testo

Si ` preferito mantenere in una sezione separata la trattazione di una classe di programmi, e quella degli editor di testo, che vengono a costituire il principale strumento usato da tutti gli amministratori di sistema. Lo scopo di questa sezione ` quello di mettere il lettore in grado di e cavarsela con i principali editor disponibili in tutte le distribuzioni, poi con il tempo e lesperienza ognuno nir` con ladottarne uno come preferito. a

2.4.1

Introduzione

Unaltra delle caratteristica fondamentali di un sistema unix-like `, per le ragioni che tratteremo e in dettaglio in sez.3.1.1, quella di mantenere le congurazioni dei programmi allinterno di semplici le di testo. Per questo motivo lo strumento pi` usati dai professionisti nellamministrazione u di sistema ` quello delleditor di testi. e Infatti nonostante stia crescendo la disponibilit` di strumenti che permettono le pi` comua u ni operazioni di amministrazione tramite una interfaccia graca, questi in genere mettono a

96

CAPITOLO 2. LA SHELL E I COMANDI

disposizione solo un limitato numero di opzioni, e non danno mai il completo controllo sul comportamento di un programma, che si pu` ottenere soltanto operando direttamente sui le di o congurazione. Per questo motivo, leditor, cio` un programma che permetta di leggere le di e testo e modicarne il contenuto, diventa il principale strumento dellamministraizione di sistema. Inoltre quando un qualche problema sul disco, o il classico rm -fR dato un po troppo allegramente da root avr` danneggiato qualche le essenziale o bloccato il sistema allavvio, sar` a a sempre possibile usare una distribuzione su dischetto per rimettere le cose a posto, ma l` gli stru menti graci non saranno disponibili. E quandanche si usasse una delle tante distribuzioni su CD che sono in grado di fornire un desktop completo,54 le congurazioni sul sistema danneggiato andrebbero comunque eettuate a mano. Inne, anche se la diusione della banda larga riduce il problema, usare una interfaccia graca 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` usare un o 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, ` stato forse il primo e programma applicativo sviluppato sotto Unix, e come per molte altre applicazioni di uso generale ne esistono molte versioni, con i nomi pi` pittoreschi, che pur svolgendo lo stesso compito di u base, la modica dei le di testo, vanno da quelli dotati solo delle funzionalit` pi` elementari, a u come quelle di ed, uno dei primi editor che permette di operare solo su una linea alla volta55 ai pi` complessi e sosticati, come emacs che ha una quantit` innta di funzionalit` diverse e u a a viene paragonato da alcuni esagerati ad un secondo sistema operativo. Nel prosieguo di questa sezione daremo una breve panoramica sulluso dei pi` comuni editor u 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, comunque non entreremo nei dettagli delluso dei singoli editor, ci limiteremo a esporre quali sono i comandi base per leggere, modicare e scrivere su un le di testo. La scelta delleditor ` comunque una scelta personale, che genera spesso clamorose guerre di e religione fra le fazioni dei sostenitori dei diversi editor (particolarmente virulente sono quelle fra i sostenitori di emacs e vi, i pi` blasonati fra gli editor di testi). u

2.4.2

Un editor evoluto: emacs o xemacs

Per molti emacs56 ` leditor. Sicuramente ` il pi` potente; dentro emacs si pu` davvero fare di e e u o tutto: navigare fra i le 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 . Qualunque cosa sia possibile fare con del testo con emacs si fa, infatti leditor ` programe mabile,57 e per un qualunque compito specico sono state create delle le estensioni pi` varie in u grado di eseguire operazioni complesse, gestire automatismi, abbellire la visualizzazione, ecc. Tutto questo ha ovviamente un costo, ed infatti i detraxttori di emacs ne lamentano la pesantezza (di certo non lo troverete sulle distribuzioni su dischetto), ma data la diusione e la potenza dello strumento, e la preferenza personale nei suoi confronti, ne parleremo, considerato
54 ovviamente, anche se questo fosse dotato degli strumenti graci di amministrazione graci necessari, questi opererebbero sul sistema corrente, non su quello danneggiato. 55 quello che per questo viene chiamato un editor di linea, che origina dai tempi dei primi Unix quando i terminali erano delle vere telescriventi, ma i cui comandi si ritrovano ancora in altri editor e pure in programmi come sed. 56 nome che in teoria vorrebbe dire Extensible MACro System, ma ` stato ribattezzato in Eight Megs And e Constantly Swapping, o Escape Meta Alt Control Shift. 57 in un dialetto specico del lisp, un linguaggio funzionale estremamente potente che consente una enorme espandibilit` del programma. a

2.4. GLI EDITOR DI TESTO

97

poi che molti altri editor ne hanno copiato la sintassi e le modalit` duso, o forniscono modalit` a a di comando compatibili. Inoltre sia emacs, che il suo cugino xemacs, che nacque proprio per questo, sono editor usabili direttamente anche dallinterfaccia graca, nel qual caso verranno forniti allutente gli usuali men` a tendina in cui si potranno trovare buona parte delle funzionalit` di cui essi dispongono. u a

Figura 2.1: Schermata di avvio delleditor emacs.

Come per tutti gli editor una sessione di emacs inizia invocando il comando seguito dal nome del le da modicare; in tal caso si otterr` una nestra come quella mostrata in g. 2.1. Nella a prima riga si trova il men` dei comandi, ad esso segue la sezione principale, dove compare il u testo del le ed in cui ci si muove con le frecce, terminato da una barra di stato in cui compaiono varie informazioni (il nome del le, se sono state fatte modiche, ecc.). Nella la riga nale viene tenuto il cosiddetto minibuer, in cui compaiono brevi messaggi (come nellesempio, che riporta la scritta (Updating...done)) ed in cui si scrivono gli argomenti dei comandi pi` complessi. u Uno dei concetti fondamentali di emacs ` quello di buer, qualunque porzione di testo venga e utilizzata da emacs, con leccezione del men` e della barra di stato ` mantenuta in un buer, u e sia che si tratti di un le che si ` aperto per lavorarci sopra, che del testo generato automaticae mente nelle operazioni delleditor (come le liste dei le da scegliere che compaiono quando si usa lautocompletamento). Anche il minibuer ` un buer, con la peculiarit` di essere posizionato e a sullultima riga ed essere utilizzato per linterazione con i comandi. In genere un buer viene visto su una nestra che ne mostra il contenuto ed ` terminata da e una barra di stato (nellesempio ce n` solo una), ma allinterno di una stessa istanza delleditor e possono anche esserci pi` nestre che possono essere aperte sullo stesso buer o su buer diversi u (questo vuol dire che ad esempio la sezione centrale di g. 2.1 pu` venire divisa in due). Questo o permette, anche operando in console, di lavorare su due o pi` nestre, dato che ciascuna pu` a u o 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 nestra ci si pu` spostare con le frecce e gli altri tasti di spostamento,58 o e scrivere del testo, questo verr` sempre inserito nella posizione in cui si trova il cursore (nellea
emacs prevede una grande quantit` di combinazioni di tasti per andare avanti ed indietro, spesso tuttaltro a che intuitive per chi proviene da altri sistemi, questo ` una conseguenza che il programma ` nato quando ancora e e le tastiere non avevano n frecce n altri tasti di funzione. e e
58

98

CAPITOLO 2. LA SHELL E I COMANDI

sempio allinizio della prima riga in alto a sinistra). In genere il testo viene inserito spostando quanto gi` presente nel le, a meno di non porsi nella modalit` di sovrascrittura premendo il a a tasto INS (verr` noticato nella barra di stato) da cui si esce ripremendo lo stesso tasto. a I comandi invece vengono dati con delle combinazioni che prevedono la pressione contemporanea di un tasto modicatore 59 e di una lettera. Molti comandi inoltre prevedono luso di due combinazioni di tasti eseguite in successione. Data la complessit` e la grande quantit` di a a comandi esistono due modicatori per i comandi, il primo ` il classico control e ed secondo ` e e alt il cui uso pu` essere simulato, per le tastiere che non ce lhanno, premendo prima il tasto di o escape, (ESC) e poi la lettera relativa. Come gi` visto in sez. 1.3.4, dove la si ` usata senza formalizzarne la denizione, per india e care la pressione contemporanea di un modicatore con un tasto qualunque X utilizzaremo 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 modicatore viene chiamato meta in tutta la documentazione di emacs).
Operazione aprire un le salvare un le salvare con nome uscire annullare seleziona Combinazione di tasti C-x C-f seguito dal nome del le nel minibuer (supporta il completamento automatico). C-x C-s. C-x C-w seguito dal nome del le nel minibuer (supporta il completamento automatico). C-x C-c, se ci sono modiche chiede se salvarle, scartarle o cancellare loperazione. C-_, C-/ o C-x u, ripetendo si torna ulteriormente indietro nellannullamento. C-x spazio marca linizio di una regione e si porta in modalit` selezione, poi basta posizionarsi nel punto a nale. 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 minibuer esegue un ricerca incrementale sul testo specicato, C-s cerca il successivo, C-r cerca il precedente. C-h ? poi scegliere nella nestra quello che si vuole. (un comando) C-g o tre volte ESC.

taglia incolla cancella ricerca

help annulla

Tabella 2.20: I principali comandi di emacs.

In tab. 2.20 si ` riportata la lista dei comandi principali che sono attivi in qualunque modae lit`60 si usi emacs; il programma ne mette a disposizione molti altri sia generici che specici per a il tipo di le su cui si sta lavorando.61 Molti di questi comandi, ad esempio tutti quelli che richiedono limmissione di un nome di le, usano il minibuer per ricevere i relativi dati, e stampare messaggi; inoltre in certi casi (come quello della specicazione di un le) la selezione supporta il meccanismo dellautocompletamento (usando il tasto di tabulazione), e la capacit`, qualora i completamenti siano multipli, di creare a automaticamente una lista di selezione in una nuova nestra. In questo caso per spostarsi da una nestra allaltra occorrer` usare il comando C-x o (che ripetuto ritorna alla precedente), a mentre per eliminare tutte le nestre presenti tranne quella dove ` posizionato il cursore si potr` e a usare il comando C-x 1.
si chiamano cos` i tasti che hanno un eetto solo quando sono premuti in contemporanea ad altri tasti, come il tasto per la maiuscole, il control, ecc.. 60 essendo emacs un editor programmabile esso pu` essere usato in modalit` diverse a seconda del tipo di le o a su cui si sta lavorando, provvedendo in ciascun caso diverse serie di combinazioni di tasti e diversi comandi di manipolazione. 61 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 gure presenti, ecc.
59

2.4. GLI EDITOR DI TESTO

99

2.4.3

Un editor di base, vi

Uno dei editor pi` diusi, presente n dagli albori dei sistemi Unix ` vi.62 Deriva dagli editor u e di linea e ne eredita alcune caratteristiche, in particolare il fatto di essere un editor modale, in cui cio` i comandi e il loro eetto dipendono dalla modalit` di operazioni corrente in cui si trova e a il programma. Questa caratteristica lo rende senzaltro il meno intuitivo e pi` dicile da usare per il novizio. u Ma i fan(atici) tendono invece a considerarla una caratteristica utile in quando (secondo loro) con labitudine renderebbe pi` veloce le operazioni. Succede spesso per` che al primo impatto non u o 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 ` il principale concorrente) vi si usa soltanto per manipolare e le di testo, e non fornisce pertanto nessuna delle funzionalit` pi` evolute di emacs (come a u la possibilit` di fare debug dei programmi allinterno delleditor facendo riferimento diretto al a codice su cui si sta lavorando) ma resta comunque un editor molto potente. Il principale vantaggio di vi ` che essendo molto leggero e diuso n dalle prime versioni di e Unix lo si trova installato praticamente su qualunque sistema e molto spesso ` leditor di default. e Inoltre anche se le funzionalit` del programma originale sono veramente minime, esistono alcune a versioni pi` moderne, come vim, hanno introdotto alcune capacit` avanzate, come levidenziau a zione della sintassi. Non ` detto per` che questultimo sia sempre disponibile al posto del vi e o normale e di certo non lo ` su una distribuzione di recupero, dato che con le funzionalit` sono e a di pari passo aumentate anche le dimensioni.

Figura 2.2: Schermata di avvio delleditor vi.

Al solito vi si invoca passando come argomento il nome del le da modicare, il comando apre il le in modalit` comando in una nestra unica (mostrata in g. 2.2), dove compare il testo a ed in cui ci si muove con le frecce,63 lasciando libera lultima linea, usata per dare i comandi o ricevere le informazioni (nel caso il nome del le, la sua lungheza in righe e caratteri e la posizione del cursore sulla prima colonna della prima riga).
purtroppo i perch di questo nome si sono perse nei meandri del tempo, forse erano due lettere rimaste libere e scelte a caso ... 63 le versioni installata in tutte le distribuzioni di Linux se non altro supportano nativamente luso delle frecce.
62

100

CAPITOLO 2. LA SHELL E I COMANDI

Tutti i comandi di vi sono eseguiti con pressioni di singoli tasti, ma la possibilit` di dare dei a comandi dipende dalla modalit` in cui si trova leditor al momento, se in fatti si ` in modalit` a e a di inserimento i tasti verranno utilizzati per scrivere e non intepretati come comandi. Quando si avvia il programma questo si pone in modalit` normale, e in questo caso i tasti vengono a interpretati come comandi. In questa fase molti dei comandi sono dati direttamente con la pressione di uno o pi` lettere, u ma sullo schermo non viene visualizzato nulla (se non leetto del comando); tutti i comandi pi` complessi (ad esempio quelli che richiedono una scrittura di una espressione di ricerca o di u un nome di le) devono essere invece dati dalla riga di comando, che si attiva premendo :, in questo caso il cursore si sposta dal testo e si pone sulla riga nale dove si potr` inserire il resto a dellespressione. La pressione dei tasti corrispondenti ai relativi comandi consente di cambiare modalit`; a ad esempio premendo i si passa in modalit` di inserimento, e si pu` iniziare a scrivere in a o corrispondenza del cursore. Ma ci sono altri comandi che permettono di entrare in modalit` a inserimento, come a che vi entra ma riportandosi ad inizio riga o A che invece va a ne riga ed anche o che lo fa andando a capo creando una nuova riga. ` E allora abbastanza frequente che un utente alle prime armi, una volta aperto un le, tenti di scriverci e non veda nulla nch, premuto uno di questi tasti, non entra in modalit` di e a inserimento. Il problema in genere ` che una volta entrati in modalit` di inserimento lunico e a modo per uscirne ` quello di premere il tasto di escape ESC, non sapendolo ci si trover` bloccati e a ed incapaci di uscire dal programma. Una modalit` simile a quella di inserimento ` quella di rimpiazzo, in cui si entra con premendo a e 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` presente, sovrascriver` a a questultimo. Anche da questa modalit` si pu` uscire premendo il tasto di escape ESC. a o
Operazione aprire un le salvare un le salvare con nome uscire annullare seleziona taglia incolla cancella ricerca annulla Combinazione di tasti :ex file. :w. :w nomefile. :q, ma se ci sono modiche non esce; nel caso :qw le salva, :q! le scarta. u solo sullultima modica. v, e poi ci si sposta con i tasti di freccia, ma ` una e estensione esclusiva di vim. d, ma vale con questo signicato solo con una selezione fatta con vim. p inserisce lultimo oggetto cancellato. d seguito da una altra lettera che specica cosa cancellare; dw una parola, dd una riga, x cancella un carattere. / seguito da un testo o una espressione regolare. ESC annulla un comando. Tabella 2.21: I principali comandi di vi.

In tab. 2.21 si ` riportata la lista dei comandi principali usati per i compiti pi` comuni, si e u tenga presente per` che essi possono essere specicati solo dalla modalit` normale, se ci si ` posti o a e in modalit` di inserimento prima bisogner` uscirne con ESC. Un elenco degli altri comandi pu` a a o essere ottenuto con la documentazione interna, accessibile con :h. Come accennato vi supporta, per le tastiere che non hanno frecce, lo spostamento nel le con i tasti h, j, k, l che eettuano rispettivamente lo spostamento a sinistra, basso, alto e destra. Inoltre una caratteristica delleditor ` che qualunque comando dato in modalit` normale pu` e a o essere moltiplicato se lo si fa precedere da un numero, per cui per abbassarsi di 10 righe si pu` o scrivere qualcosa tipo 10j.

2.4. GLI EDITOR DI TESTO

101

Una delle caratteristiche che pu` lasciare pi` interdetti con vi ` che non esiste il classico o u e taglia e incolla in cui si seleziona una sezione qualunque del le, a meno che non usiate vim che denisce una modalit` visual (in cui si entra con v) che implementa questa funzionalit`. E a a ` possibile per` cancellare caratteri singoli (con x per quello corrente, con X il precedente), parole o (con dw) e righe (con dd), ed usare i moltiplicatori appena illustrati per cancellazioni multiple; si pu` poi incollare quanto appena cancellato (anche pi` volte se si usano i moltiplicatori) con o u p. Lapertura di nuovi le deve essere fatta sulla riga di comando, e si esegue con :ex, altri comandi che si possono utilizzare sono :w che salva il le e :x che salva ed esce, ed ` equivalente e al normale comando di uscita con salvataggio che ` :qw; luscita invece si pu` forzare con e o :q!, per questi due comandi esistono anche delle versioni da date in modalit` normale e cio` a e rispettivamente ZZ e ZQ. Unaltra caratteristica interessante della linea di comando di vi ` che ` possibile dare dei e e comandi di shell senza uscire dalleditor; una volta entrati sulla linea infatti si pu` usare il o carattere ! come shell escape, si potr` cio` usare una sintassi del tipo :!ls per ottenere la a e lista dei le. Unaltra funzionalit` presente sulla linea di comando ` quella di sostituzione, che a e ha la stessa sintassi delle espressioni usate da sed, potremo cio` eettuare una sostituzione di e una stringa con il comando :s/ric/sost/g, ma potremo anche usare le espressioni regolari con tutte le funzionalit` che si sono descritte in sez. 2.2.5. a

2.4.4

Gli altri editor

Un altro editor leggero e potente ` joe, gli aezionati del DOS noteranno che usa la sintassi di e wordstar, un word processor testuale di quellepoca. Ore le tutte le normali funzionalit` di un a editor di testi ha un help in linea per i vari comandi che si attiva con C-k h, che lo rende piuttosto facile da usare. Inoltre di solito il comando si pu` usare in modalit` di emulazione usando le o a sintassi di altri editor, ad esempio invocandolo come jmacs user` la sintassi dei comandi di a emacs.

Figura 2.3: Schermata di avvio delleditor joe.

Il comando prende al solito come argomento il nome del le che viene aperto e visualizzato nella nestra principale, mostrata in g. 2.3. La nestra presenta una riga di stato in testa

102

CAPITOLO 2. LA SHELL E I COMANDI

contenente i soliti dati (le, posizione, lunghezza ed il suggerimento per ottenere la schermata di aiuto), seguita dalla sezione principale in cui compare il testo del le ed in cui ci si muove con le frecce, lultima linea viene usata per mostrare i messaggi e per dare i comandi o ricevere le informazioni, e scompare quando non ` necessaria. e
Operazione aprire un le salvare un le salvare con nome uscire annullare seleziona taglia incolla cancella ricerca annulla Combinazione di tasti C-k e seguito dal nome del le. C-k x. C-k d seguito dal nome del le. C-k x esce e salva, C-c esce e se ci sono modiche 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 ne. 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.22: I principali comandi di joe.

In tab. 2.22 sono riportati i principali comandi per le funzionalit` di base. Anche in questo a 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.

Figura 2.4: Schermata di avvio delleditor jed.

Unaltro editor per la console ` jed, scritto come reimplementazione di emacs in C, che ` e e molto pi` leggero di questultimo (ma anche molto meno potente). Supporta anchesso per` un u o linguaggio di programmazione interno, ed ` pertanto in grado di fornire parecchie funzionalit` e a avanzate, e utilizzare diverse sintassi per i comandi a seconda del tipo di le. Fornisce anche unampia capacit` di evidenziazione della sintassi in console che con emacs ` disponibile solo a e nellultima versione.

2.4. GLI EDITOR DI TESTO

103

Essendo jed in sostanza un clone di emacs non staremo a ripeterne i comandi principali, che sono gli stessi di tab. 2.20, anche la composizione della nestra (una cui immagine ` mostrata in e g. 2.4) ` analoga a quella di emacs per cui basta rifarsi quanto detto in precedenza; il vantaggio e di jed ` che lutilizzo del men` ` molto pi` intuitivo e avviene direttamente in modalit` semie ue u a graca anzich allinterno di nestre secondarie. Essendo un editor leggero ma molto potente, e si trova su varie distribuzioni su dischetto. Un altro editor abbastanza diuso ` pico; questo ` derivato da pine, un client per leggere e e la posta elettronica in console, separando da esso leditor interno usato per per scrivere le email. Data la maggiore utilizzabilit` rispetto a vi esso si ` diuso parecchio, il problema ` che siccome a e e pine non ` software libero, non lo ` neanche pico; per questo motivo ` stato realizzato un clone e e e 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` in pi`. a u

Figura 2.5: Schermata di avvio delleditor nano.

Il programma si invoca al solito passando come argomento il nome del le da modicare, che viene aperto nella nestra mostrata in g. 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 ` mcedit; anche questo ` un sottoinsieme di unaltro programma e e mc (nome che sta per Midnight Commander, un le manager semigraco utilizzabile in console che nasce come clone del Norton Commander. Anche questo ` un editor che mantiene nella e 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 graci come quelli inseriti in Gnome (gedit) e KDE (kate) che non sono spiegati qui in quanto linterfaccia graca ` in grado di dare accesso alle funzionalit` base e a con i soliti men`. u Fra gli editor graci vale per` la pena segnalare uno dei pi` evoluti: nedit che dispone o u di un linguaggio di programmazione interna che ne permette una grande espandibilit` ed ` a e dotato di moltissime funzionalit` (forse il pi` vicino ad emacs); per questo ` uno degli editor a u e pi` potenti, pur restando anche facile da usare. Esistono inne anche versioni grache di alcuni u degli editor precedenti (come gvim per vi), mentre come gi` accennato sia emacs che xemacs a usati dallinterfaccia graca mettono a disposizione men` e utilizzo del mouse. u

104

CAPITOLO 2. LA SHELL E I COMANDI

Capitolo 3

La congurazione dei servizi di base


3.1 I le di congurazione

In questa sezione tratteremo la gestione generica dei le di congurazione allinterno di un sistema GNU/Linux, introducendo alcuni concetti validi in generale per qualunque le di congurazione. Descriveremo poi direttamente i le di congurazione di alcuni servizi di base, come quelli che controllano il comportamento delle librerie dinamiche e quelli usati per il login, ed alcuni servizi di base. Si tenga comunque presente che alcuni le di congurazione (in particolare fstab e mtab) sono gi` stati descritti in precedenza (vedi sez. 1.2.4). a

3.1.1

Una panoramica generale

A dierenza di Windows che tiene tutte le congurazioni in un unico le binario, il registro, le sole due caratteristiche comuni che potete trovare nei le di congurazione su un sistema GNU/Linux sono che essi sono mantenuti, come illustrato in sez. 1.2.3, nella directory /etc/ e che sono le di testo. Questo vale in generale per tutti i le di congurazione, e non ` limitato e a quelli che tratteremo nel prosieguo di questa sezione. La ragione di questa frammentazione dei le di congurazione deriva dellarchitettura del sistema (illustrata in sez. 1.1), per cui tutti i servizi sono forniti da opportuni programmi che non ` aatto detto siano sempre gli stessi anche per uno stesso servizio.1 Ci` comporta che e o i formati dei le di congurazione possano essere anche i pi` vari, dipendendo ciascuno dalla u 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 ` detto e che esse vengano sempre rispettate. Se da una parte tutto questo pu` spaventare, vista la lunghezza dellelenco che si produce o 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 ...
1

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

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

105

106

CAPITOLO 3. LA CONFIGURAZIONE DEI SERVIZI DI BASE

dallaltra ha invece il grande vantaggio che le modiche ad un singolo le di congurazione non hanno alcun modo di inuenzare quelli di altri programmi. Il secondo enorme vantaggio ` e che essendo i le di congurazione dei le di testo ` possibile eettuare ricerche ed operazioni e complesse con i soliti comandi di shell abbondantemente trattati in sez. 2.2, ed eseguire le operazioni di congurazione con un editor qualunque. Una seconda cosa di cui bisogna tenere conto ` che Linux ` multiutente, per cui ` molto e e e spesso possibile per ciascun utente scegliere le impostazioni che si ritengono pi` appropriate u per un programma mettendo un ulteriore le di congurazione nella propria home directory. In genere questi le sono invisibili (iniziano cio` con un .) ed hanno lo stesso nome del loro e analogo di /etc/ valido per tutto il sistema. Questa ` una forma molto potente e pulita di e consentire a ciascun utente di personalizzare le sue scelte senza dover andare a scomodare le impostazioni generali di tutto il sistema. ` E da tenere presente inne che per molti le di congurazione viene installata anche una 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` sempre la pena controllare la documentazione, che contiene tutti i a dettagli.

3.1.2

La gestione delle librerie condivise

Una delle funzionalit` pi` importanti per lesecuzione dei programmi in un qualunque sistema ` a u 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 ` il e meccanismo che permette di inserire tutto il codice comune usato dai programmi allinterno di opportune librerie,3 in modo che non sia necessario reinserirlo tutte le volte allinterno di ciascun programma. Per` per far s` che detto codice possa essere utilizzato dai singoli programmi occorre una o apposita infrastruttura. Come brevemente accennato in sez. 2.1.6 uno dei compiti fondamentali del sistema, quello di mettere in esecuzione i programmi, viene realizzato attraverso il linkloader. Questo non ` un vero programma a se stante, quanto una sezione di codice che viene e sempre eseguita preventivamente tutte le volte che si deve lanciare un nuovo programma4 che permette di identicare le librerie condivise che contengono le funzioni necessarie e di caricarle automaticamente in memoria, in maniera trasparente allutente. Per vericare quali librerie dinamiche sono necessarie per lesecuzione di un programma si pu` usare il comando ldd, che stampa sullo standard output i nomi delle librerie condivise di o 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@monk:~/Truelite/documentazione/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) si ricordi quanto detto in sez. 2.3.1. e abbiamo visto in sez. 1.2.3 come ci siano delle directory speciche previste dal Filesystem Hierarchy Standard che devono contenere i relativi le. 4 a meno che questo non sia stato compilato staticamente, cio` in maniera da includere al suo interno tutto il e codice che altrimenti sarebbe stato disponibile attraverso delle librerie condivise.
3 2

3.1. I FILE DI CONFIGURAZIONE

107

ci fa vedere le librerie necessarie alluso di ls. Lopzione pi` usata ` -v che permette di avere u e una descrizione pi` dettagliata con le informazioni relative alle versioni, le altre opzioni al solito u sono descritte nella pagina di manuale del comando. Si noti come le librerie siano le che terminano con lestensione .so (che sta appunto per shared object) seguita da un numero che ` detto major version. Questa ` una delle caratteristiche e e pi` utili in un sistema unix-like; le librerie cio` sono organizzate sempre con due numeri di u e versione, major e minor, ed una convenzione vuole che le interfacce pubbliche delle librerie non debbano mai cambiare ntanto che non cambia la major version.5 Con questo si ottengono due risultati di grande rilevanza, il primo ` che si pu` cambiare tranquillamente la minor version e o di una libreria senza che i programmi che la usano ne abbiano a risentire,6 il secondo ` che se e si ha bisogno di una versione vecchia delle librerie non c` nessun problema, basta installare e anche quella, e sar` tranquillamente usabile (attraverso la diversa major version) senza nessun a 7 conitto. 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 eettuare la ricerca in maniera eciente viene utilizzato un apposito le di cache in cui sono state indicizzate tutte le informazioni relative alle funzioni presenti ed alle librerie in cui esse sono contenute. Questo le 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 alle ultima versione dei le delle librerie; infatti queste vengono sempre cercate per numero di major version, ma la libreria installata sar` comunque contenuta in un le con una sua specica minor version, a perci` quello che si fa ` creare un link simbolico alla versione eettiva, per cui ad esempio avremo o e che:
piccardi@monk:/lib$ ls -l librt* -rw-r--r-1 root root lrwxrwxrwx 1 root root 26104 Sep 21 14:56 librt-2.3.2.so 14 Sep 22 14:44 librt.so.1 -> librt-2.3.2.so

un cui si pu` notare come una certa versione specica di una libreria (la 2.3.2) venga rimappata o come prima major version. Se invocato con lopzione -v il comando ldconfig stampa lelenco di tutte le directory esaminate e delle librerie usate nella ricostruzione, mentre con -N e -X si pu` bloccare rispettivamente o la ricostruzione della cache e dei link. In sez. 1.2.1 abbiamo visto come secondo il Filesystem Hyerarchy Standard le librerie possono essere mantenute in diverse directory; ma di default il comando ldconfig esamina soltanto le directory /lib e /usr/lib, se ci sono altre librerie condivise in altre directory queste possono essere specicate con un opportuno le di congurazione, /etc/ld.so.conf, che contiene la lista delle altre directory che contengono le librerie condivise, oltre alle canoniche /lib e /usr/lib. Pertanto se ad esempio si installa una nuova libreria dai sorgenti in /usr/local/lib, che di norma non compare in /etc/ld.so.conf, sar` necessario aggiungerla in questo le e poi a eseguire il programma ldconfig per aggiornare i link alle librerie condivise disponibili e ricreare la cache, in modo che il linker dinamico possa utilizzarle. Un esempio di questo le, cos` come viene installato su una Debian Sid, ` il seguente: e
/usr/local/lib /usr/X11R6/lib al solito ` una convenzione, anche se quasi universalmente rispettata; ogni tanto qualche programmatore anche e non pi` alle prime armi la viola, con il risultato che programmi che no ad allora funzionavano perfettamente si u trovano a riportare errori o a terminare improvvisamente. 6 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` di nuovo succedere di tutto. o 7 questo ` il motivo per cui il problema dei conitti di versione delle librerie tristemente noto su Windows, dove e questa distinzione non esiste, come DLL hell, ` sostanzialmente assente su GNU/Linux. e
5

108

CAPITOLO 3. LA CONFIGURAZIONE DEI SERVIZI DI BASE

Il default di ldconfig prevede luso di questo le, ma usando lopzione -f si pu` specicare o un qualunque altro le al suo posto, mentre con -n si pu` passare direttamente sulla linea di o comando una lista di directory dove eettuare la ricerca. Per le altre opzioni e la documentazione completa si consulti al solito la pagina di manuale disponibile con man ldconfig. Inne, nei casi in cui si vogliano utilizzare solo in forma temporanea delle librerie condivise, si pu` ricorrere alla variabile di ambiente LD_LIBRARY_PATH, in cui passare una lista8 di o ulteriori directory in cui verr` eettuata la ricerca di altre librerie (questa volta senza usare a lindicizzazione, per cui il sistema ` pi` lento). e u In genere si usa questa variabile quando si sviluppano delle librerie o se si vuole usare qualche pacchetto sperimentale oppure una versione alternativa delle librerie di sistema. Infatti le librerie contenute nelle directory specicate tramite LD_LIBRARY_PATH hanno la precedenza e vengono utilizzate per prime; in questo modo si pu` far uso di una libreria sperimentale senza conseguenze o per gli altri programmi9 del sistema che continueranno ad usare la versione abituale.

3.1.3

Il Name Service Switch

Una delle tante funzionalit` provviste dalle librerie standard del sistema ` fornire una serie di a e funzioni che permettono ai programmi di ottenere alcune informazioni relative alla gestione del sistema, come i nomi degli utenti, le loro password, i nomi dei gruppi, delle macchine ecc. Tradizionalmente, con leccezione per i nomi delle macchine che possono essere forniti anche attraverso luso del DNS, queste informazioni sono memorizzate in opportuni le di congurazione mantenuti sotto /etc.10 I sistemi moderni per` permettono di mantenere queste informazioni o anche in maniera diversa, e di centralizzarle per interi gruppi di macchine tramite opportuni servizi.11 Con lintroduzione di queste estensioni si presentava per` il problema di come indicare alle o 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 estendibilit` e compatibilit`. Per risolvere il problema venne creata una apposita interfaccia, il a a Name Service Switch,12 che permettesse di demandare a delle librerie esterne, congurabili in maniera indipendente, le modalit` con cui queste informazioni vengono ottenute. a Il grande vantaggio del Name Service Switch ` che diventa possibile denire in maniera e modulare ed estendibile sia delle classi di informazioni (cosicch qualora si debba fornire qualche e nuovo servizio si ha linfrastruttura gi` pronta) che il supporto (le, database o servizi di rete) a su cui queste informazioni sono mantenute; ` possibile inoltre specicare al sistema anche in e quale ordine utilizzare le varie fonti, permettendo congurazioni ibride. Le modalit` di funzionamento del Name Service Switch vengono gestite attraverso il suo le a di congurazione che ` /etc/nsswitch.conf/etc/nsswitch.conf; un esempio di questo le, e come installato su una Debian Sid, ` il seguente: e
# # # # #
8 9

/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.

nella stessa forma usata per PATH, cio` con le directory separate da dei :. e 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. 10 ne tratteremo alcuni in seguito, ad esempio quelli relativi alla gestione di utenti e gruppi in sez. 4.3 e quelli relativi alla rete in sez. 7.6. 11 gli esempi pi` comuni sono il NIS (Network Information Service ed LDAP (Lightweight Directory Access u Protocol ) due servizi di rete con cui si possono centralizzare le informazioni relative agli utenti. 12 il sistema ` stato introdotto la prima volta nelle librerie standard di Solaris, le librerie standard GNU hanno e ripreso lo stesso schema.

3.1. I FILE DI CONFIGURAZIONE

109

passwd: group: shadow: hosts: networks: protocols: services: ethers: rpc: netgroup:

compat compat compat files dns files db db db db files files files files

nis

Il formato del le ` sempre lo stesso, le linee vuote o che iniziano per # vengono ignorate, le e altre linee indicano una opzione. La pagina di manuale contiene una lista completa delle opzioni disponibili. La prima colonna, terminata da un : indica una classe di informazioni, di seguito vengono elencate, separate da spazi, le modalit` con cui queste informazioni vengono fornite; la a ricerca dei dati sulle varie fonti sar` eseguita nellordine in cui queste sono indicate. Lelenco a delle classi di informazioni disponibili ` riportato in tab. 3.1. e
Classe shadow Tipo di corrispondenza corrispondenze fra username, shadow password ed altre informazioni sulla gestione delle password (vedi sez. 4.3.3). corrispondenze fra username, identicatori di utente e gruppo principale, shell di default, ecc. (vedi sez. 4.3.3). corrispondenze fra nome del gruppo e propriet` dello a stesso. alias per la posta elettronica. corrispondenze fra numero IP e MAC address della scheda di rete. corrispondenze fra nome a dominio e numero IP. corrispondenze gruppo di rete e macchine che lo compongono. corrispondenze fra nome di una rete e suo indirizzo IP. corrispondenze fra nome di un protocollo e relativo numero identicativo. corrispondenze fra nome di un servizio RPC e relativo numero identicativo. corrispondenze fra nome di un servizio e numero di porta.

passwd group aliases ethers hosts netgroup networks protocols rpc services

Tabella 3.1: Le diverse classi di corrispondenze denite allinterno del Name Service Switch.

Per ciascuna nuova modalit` deve esistere una opportuna libreria che garantisce laccesso a alle informazioni con quella modalit`; esse si trovano tutte in /lib/ e devono avere il nome a libnss_NOME.so.X, dove X fa riferimento alla versione delle glibc,13 mentre NAME indica il tipo di supporto per quellinformazione (nel caso dellesempio sar` files, db, ecc.). a Di norma non c` niente da cambiare in questo le a meno che non si aggiunga un ulteriore e supporto, come un sistema di autenticazione basato su qualche altro meccanismo (ad esempio su LDAP), nel qual caso andr` installato lapposito pacchetto (che per LDAP ` libnss-ldap) a e ed inserita la relativa parola chiave (nel caso ldap) nella adeguata posizione allinterno delle colonne che specicano dove sono disponibili i servizi.
13

vale 1 per le glibc 2.0 e 2 per le glibc 2.1.

110

CAPITOLO 3. LA CONFIGURAZIONE DEI SERVIZI DI BASE

3.1.4

I le usati dalla procedura di login

Come accennato in sez. 1.3.4 la procedura di login da terminale ` gestita dai due programmi e getty e login. Questi usano una serie di le di congurazione che provvedono al controllo di alcune funzionalit`, che poi sono spesso riutilizzati anche dagli altri programmi che eseguono la a procedura di collegamento al sistema.14 In quella occasione abbiamo accennato che il messaggio di presenza stampato sui terminali viene letto da /etc/issue, che ` un semplice le il cui testo viene stampato sul terminale prima e della stringa login: . Il contenuto del le viene stampato integralmente, ma ` possibile e inserire delle direttive, attraverso luso del carattere \, 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. 3.2, lelenco completo ` riportato nella pagina di manuale di getty. e
Opzione \d \l \m \n \r \s \t Signicato data. nome del terminale. architettura (i486, ppc, ecc.). hostname. versione del kernel. nome del sistema (Debian, RedHat, ecc). ora.

Tabella 3.2: Principali caratteri di estensione per /etc/issue.

Analogo a issue ` il le /etc/issue.net che viene usato al suo posto da telnet per i e collegamenti eettuati via rete; se invece si usa ssh (vedi sez. 8.3) detti le vengono ignorati. Una volta completato il login viene invece mostrato un messaggio di benvenuto, che ` mantenuto e nel le /etc/motd; il nome del le sta per message of the day, e scrivere un messaggio in questo le ` una modalit` veloce per mandare un avviso a tutti gli utenti che entrano nel sistema. e a Uno dei le che controllava15 una serie di funzionalit` relative alla procedura di login, ` a e /etc/login.defs (che in realt` ` il le di congurazione del sistema di gestione delle shadow ae password, trattate in sez. 4.3.3). Al solito sono considerati commenti le righe che iniziano per # e ignorate le righe vuote. Il le contiene una serie di specicazioni di parametri, fatte nella forma: NOME valore

quelle che concernono la procedura di login sono ad esempio LOGIN_RETRIES che imposta quante volte pu` essere ritentata la procedura di login, e LOGIN_TIMEOUT che indica il numero di secondi o in cui il programma aspetta limmissione della password prima di cancellare la procedura, mentre MOTD_FILE permette di specicare un altro le al posto di /etc/motd. Un altro le di controllo per la procedura di login ` /etc/securetty. Questo le contiene la e lista delle console da cui si pu` collegare lamministratore di sistema (cio` lutente root). Viene o e usato dal programma login, che legge da esso i nomi dei dispositivi di terminale (le tty) dai quali ` consentito laccesso. Un esempio di questo le ` il seguente: e e
# Standard consoles tty1 tty2 tty3 tty4 in genere sono gestiti, come vedremo in sez. 4.3.4, attraverso dei moduli di PAM. con luso di PAM (vedi sez. 4.3.4) queste funzionalit` sono state inserite allinterno di questa libreria e gestite a dai relativi le di congurazione.
15 14

3.1. I FILE DI CONFIGURAZIONE


tty5 tty6 # Same as above, but these only occur with devfs devices vc/1 vc/2 vc/3 vc/4 vc/5 vc/6

111

il formato del le ` sempre lo stesso, ogni linea denisce un nome di dispositivo dal quale ` e e possibile il login, le linee vuote o che iniziano per # vengono ignorate. La pagina di manuale fornisce una descrizione completa. Dato che le console virtuali non sono indicate in questo le non ` normalmente possibile e eseguire un telnet da remoto per collegarsi come root su questa macchina. Bench sia possibile e consentirlo aggiungendo una riga, non ` assolutamente una buona idea per cui se volete farlo e dovrete studiarvelo da soli.16 Inne quando si vuole bloccare temporaneamente laccesso al sistema degli utenti normali, lamministratore pu` creare il le /etc/nologin; questo non ` propriamente un le di conguo e razione, dato che il suo contenuto ` ininuente, la sua presenza serve solo a dire alla procedue ra di collegamento al sistema che solo lamministratore pu` essere entrare. La sua rimozione o ripristiner` laccesso per tutti gli utenti. a

3.1.5

La congurazione del sistema delle pagine di manuale

Come accennavamo in sez. 2.3.1 il comando man supporta anche la possibilit` di generare docua mentazione stampabile. Questo avviene perch in realt` le pagine di manuale non sono scritte e a direttamente nel formato in cui le vediamo su video, ma in uno speciale linguaggio di formattazione, chiamato tro, che permette la creazione di sezioni, indici, ecc. e la generazione di vari tipi di formati in di uscita, fra cui quello del testo mostrato sul terminale ` uno fra i tanti. e Tutte le volte che si richiama il comando man per visualizzare una nuova pagina di manuale il comando dovr` recuperare uno di questi le generando un testo in formato opportuno per a la visualizzazione. Per evitare di ripetere il procedimento della generazione ad una successiva invocazione tutti questi le 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 ` quello dellindicizzazione dei cone tenuti usata dai comandi whatis e apropos; questa infatti non ` diretta (come si pu` vericare e o tutte le volte che si installa un nuovo pacchetto e non lo si trova nei risultati di detti comandi), ma viene eettuata normalmente tramite il programma mandb, che costruisce gli opportuni le con gli indici usati dai precedenti. In genere il programma viene invocato periodicamente nelle operazioni giornaliere eseguite da cron (vedi sez. 3.3.1), ma lo si pu` anche invocare direttamente; le opzioni principali sono o -c che gli fa ricreare tutti gli indici da zero (il default ` aggiornare quelli esistenti) e -p che e non fa eseguire la ripulitura degli indici dei dati della pagine non pi` presenti; per la descrizione u completa delle altre opzioni ed i dettagli sul comando al solito si faccia riferimento alla 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 eettuare le ricerche, il sistema usa il le di congurazione /etc/manpath.config.
in generale non ` comunque una buona idea neanche quella di usare telnet, quindi ` meglio se proprio lasciate e e perdere la cosa.
16

112

CAPITOLO 3. LA CONFIGURAZIONE DEI SERVIZI DI BASE

Il primo aspetto della congurazione ` quello della denizione delle directory in cui si trovano e le pagine di manuale; come per gli eseguibili infatti anchesse possono essere installate in diverse sezioni dellalbero,17 una lista di tutte queste directory si pu` stampare con il comando manpath, o ed in genere si otterr` qualcosa del tipo: a
[piccardi@gont corso]$ manpath /usr/local/man:/usr/share/man:/usr/X11R6/man

a meno di non aver denito in maniera diretta la variabile di ambiente MANPATH (nel qual caso sar` semplicemente stampato il suo valore) che permette di soprassedere il valore preimpostato a dal sistema. La congurazione delle directory in cui cercare le pagine di manuale ` una di quelle mantenute e 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 parametro 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.4) dellutente. La direttiva richiede due parametri; 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 ` aggiunta al MANPATH in maniera implicita. e Inne la direttiva MANDB_MAP serve ad indicare a mandb dove devono essere messi i le degli indici, e dove devono essere create le pagine temporanee. Un estratto del le manpath.config, cos` come installato su una Debian Sid, ` il seguente: e
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 in questo caso ci siano altre sezioni oltre a quelle classiche illustrate in tab. 2.18.
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.
17

3.2. ALTRI FILE

113

3.2

Altri le

Raccogliamo in questa sezione le informazioni relative ad una serie di altri le di congurazione relativi a funzionalit` del sistema che non sono facilmente raggruppabili sotto un denominatore a comune, o che hanno a che fare con la congurazione di comandi di base.

3.2.1

Il le rc.local e la directory rc.boot

Nella trattazione della procedura di avvio del sistema in sez. 5.3.4 vedremo che per far eseguire un proprio script nella sequenza di avvio baster` creare un opportuno link simbolico e come lo a si potr` inserire in un punto preciso della sequenza, compreso in fondo alla stessa; in alcune a distribuzioni per` si ` soliti usare un le specico per far eseguire dei comandi dopo che tutta o e la procedura di avvio ` stata completata. e In genere questo le ` rc.local e si trova fra gli script di avvio (in /etc/rc.d o anche e direttamente in /etc/). Esso viene eseguito alla ne della procedura di avvio, ed assume un po il signicato di quello che ` lautoexec.bat del DOS: contiene i comandi che si vogliono e eventualmente dare dopo che tutti i servizi sono partiti. Trattandosi di uno script di shell non si tratta propriamente di un le di congurazione. Una modalit` alternativa (supportata ad esempio da Debian), ` quella delluso della directory a e /etc/rc.boot nella quale si possono mettere gli script che si vuole siano eseguiti alla ne della procedura di inizializzazione. In tal caso occorre tenere presente che i le dovranno essere eseguibili, e il loro nome non dovr` contenere caratteri speciali.18 a

3.2.2

La directory /etc/skel ed il le /etc/shells

Altri le non classicabili in una specica categoria, anche se connessi alla gestione degli utenti, sono /etc/shells ed il contenuto della directory /etc/skel. Come vedremo meglio in sez. 4.3.2 trattando i comandi per la gestione degli utenti, ` possibile creare uno scheletro del contenuto e della home directory di ogni nuovo utente in modo che questo sia automaticamente disponibile tutte le volte che se ne crea uno. La directory /etc/skel, come il nome stesso suggerisce, ` quella che contiene questo schee letro. Tutti i le e le directory che si vuole siano creati nella home directory dei nuovi utenti (ad esempio una opportuna copia di .bashrc, .bash_profile e di altri eventuali le di congurazione) possono essere messi in questa directory, e saranno automaticamente copiati nella relativa home alla creazione di ogni nuovo utente. Il le /etc/shells invece ` quello che contiene la lista delle shell valide che lutente pu` e o selezionare con il comando chsh (vedi sez. 4.3.2). Il le utilizza il solito formato, le righe inizianti per # sono considerate commenti, e le righe vuote sono ignorate. Ogni riga non vuota contiene un solo campo che specica il pathname completo del programma che pu` essere usato o come shell. Un utente che voglia cambiare la propria shell di default potr` usare solo una shell fra quelle a che sono indicate in questo le; in questo modo lamministratore pu` lasciare allutente la libert` o a di modicare la propria shell di login, restringendola per` alle shell autorizzate. o Il le viene anche usato da alcuni servizi per vericare se un utente ` un utente normale, e sulla base della presenza della sua shell di login (tratteremo largomento in sez. 4.3.3) in questo le; ad esempio vari server FTP riutano laccesso ad username corrispondenti ad utenti che non hanno una shell valida fra quelle elencate in /etc/shells.
infatti Debian esegue gli script usando lo speciale comando run-parts che, come vedremo in sez. 3.3.1, lancia tutti gli script presenti in una directory posto che il loro nome sia nel formato adatto.
18

114

CAPITOLO 3. LA CONFIGURAZIONE DEI SERVIZI DI BASE

Si tenga conto comunque che un utente pu` comunque installare nella propria home directory o unaltra shell ed usare quella al posto della shell di login, semplicemente lanciandola come un qualunque altro programma; non potr` per` cambiare quella con cui entra nel sistema al login. a o

3.2.3

Il le /etc/updatedb.conf

Abbiamo visto in sez. 2.2.2 come con locate si possa ricercare la presenza di un le utilizzando un database di tutti quelli presenti creato attraverso il comando updatedb; questultimo prende una serie di opzioni (in forma estesa, si consulti la pagina di manuale) che gli permettono di denire quali directory (ad esempio non ha molto senso indicizzare /tmp) e quali lesystem (non ha senso indicizzare un CDROM) inserire nel database dei le e quali no. Oltre alle opzioni il comando utilizza delle omonime19 variabili di ambiente per ottenere le stesse impostazioni. Dato che normalmente il comando viene lanciato da uno degli script periodici eseguiti da cron (vedi sez. 3.3.1), quello che viene fatto ` di impostare queste varibili e di ambiente allinterno di un le, /etc/updatedb.conf, che serve come una specie di le di congurazione del comando. Il contenuto tipico di questo le (cos` come ottenuto dalla versione installata su una Debian Sid) ` il seguente: e
# 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 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` utilizzato con un source dallo script a che esegue la ricostruzione del database) la forma ` quella dellassegnazione delle variabili di e ambiente che poi saranno usate da updatedb. Allora PRUNEFS indicher` i lesystem da non a indicizzare, come quelli di rete, i lesystem virtuali come /proc o quelli di dispositivi estraibili; PRUNEPATHS indicher` le directory da non indicizzare (quelle dei le temporanei, gli spool delle a code di stampa e della posta, ecc.) e LOCALUSER indica lutente con i permessi del quale sar` a eettuata lindicizzazione, nel caso nobody,20 in modo da evitare che siano indicizzati le che gli utenti hanno protetto da lettura.

3.3

I servizi di base

In questa sezione prenderemo in esame la congurazione di alcuni servizi di base del sistema, come quelli per lesecuzione periodica dei comandi, il sistema di gestione dei log, ecc. In genere questi sono realizzati da degli appositi programmi detti demoni (si ricordi quanto detto in
rispetto al nome delle opzioni le variabili sono scritte in maiuscolo anzich miniscolo, e senza il -- iniziale. e un utente di servizio che non ha nessun privilegio nel lesystem, utilizzato come titolare dei programmi che devono avere accesso solo alle informazioni pubbliche.
20 19

3.3. I SERVIZI DI BASE

115

sez. 1.3.4) che lavorano in background ed il cui comportamento ` controllato dai relativi le di e congurazione.

3.3.1

Il servizio cron

Una funzionalit` importante presente in qualunque sistema operativo ` quella dellesecuzione di a e programmi su base periodica, essenziale per compiere tutte quelle operazioni che devono essere eseguite a periodi ssi, come la creazione del database dei le e lindicizzazione delle pagine di manuale, trattati rispettivamente sez. 3.2.3 e 3.1.5. Questa funzionalit` viene gestita dal servizio a chiamato cron, implementato attraverso luso del demone crond. Il demone ha il compito di svegliarsi ogni minuto ed eseguire ogni programma che ` stato programmato per quel momento. e Il le di congurazione principale di crond ` /etc/crontab che contiene lelenco dei delle e operazioni periodiche generali da eseguire nel sistema. Il primo le controllato da crond per decidere se c` da eseguire una operazione ` questo. In genere si deve intervenire su questo le e e solo quando si vuole cambiare uno degli orari a cui le operazioni vengono eseguite o per inserire una nuova operazione periodica. Il formato del le segue la solita regola di ignorare righe vuote ed inizianti per #, ogni riga deve contenere o una assegnazione di una variabile di ambiente (nello stesso formato usato negli script di shell) o la specicazione di una azione periodica. Lazione viene specicata da una serie di campi separati da spazi o tabulatori, i primi cinque indicano la periodicit` con cui il a 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` indicano rispettivamente: minuto (da 0 a 60), ora (da 0 a 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 qiestultimo 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 specicati nei cinque campi il comando viene eseguito. Il demone crond di GNU/Linux21 supporta poi alcune estensioni non presenti in altri sistemi unix-like: si pu` usare una lista (separata da virgole) per indicare pi` valori, un intervallo, o u specicando gli estremi separati con un -. Inne il programma supporta la possibilit` di a specicare 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` chiedere la ripetizione del lavoro ogni due minuti. a Si tenga presente che siccome il programma specicato nella parte conclusiva della linea viene eseguito direttamente dal demone crond, non saranno necessariamente denite le usuali variabili di ambiente presenti normalmente quando si esegue una shell. In particolare ` da tenere presente e che il demone si limita a denire solo alcune di esse ed in particolare per quanto riguarda PATH questa comprender` soltato le directory /usr/bin e /bin. Per questo motivo se necessita la a presenza di altri valori o altre variabili occorrer` inserire in testa al le le relative denizioni. a Per ulteriori dettagli si faccia riferimento alla pagina di manuale del le, accessibile con man 5 crontab. Un esempio del contenuto del le /etc/crontab, preso dal le installato di default su una Debian Sarge, ` il seguente: e
# # # #
21

/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.

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

116

CAPITOLO 3. LA CONFIGURAZIONE DEI SERVIZI DI BASE

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,22 tutte le domeniche alle 6:27 e tutti i primi giorni del mese alle 6:52. Il contenuto standard di questo le gi` prevede una serie di azioni giornaliere, settimanali e a mensili che vengono eseguite in maniera automatica. Queste azioni sono eseguite attraverso il comando run-parts23 dagli script presenti nelle directory elencate nellesempio precedente, per cui se non si hanno esigenze particolari non ` il caso di intervenire su questo le ma di aggiungere il e proprio script direttamente in /etc/cron.daily/, /etc/cron.weekly/, /etc/cron.monthly/. Occorre comunque fare attenzione, perch run-parts non esegue gli script il cui nome contiene e caratteri diversi da lettere maiuscole e minuscole, numeri, il carattere di sottolineatura ed il - (per i dettagli si consulti la relativa pagina di manuale). Oltre ai compiti generali appena illustrati il servizio cron ` in grado di eseguire anche operae zioni richieste da un singolo utente; in questo caso questi dovr` creare un suo crontab personale a tramite il comando crontab.24 Se lo si chiama con lopzione -e questo invocher` leditor prea denito (di norma ` vi, a meno di non aver impostato diversamente la variabile EDITOR). Il e formato di questo le ` identico a quello di /etc/crontab con leccezione del sesto campo, che e nel caso non ` necessario e non deve essere specicato, dato che lutente ` gi` ben denito. e e a Se lanciato senza opzioni il comando prende come argomento il le da usare come tabella, di cui legge il contenuto che deve essere nella forma in cui lo si scriverebbe con leditor; usando - si legge direttamente dallo standard input. Si pu` poi vedere la lista delle operazioni programmate o usando lopzione -l che scrive sullo standard output il contenuto del crontab dellutente.25 Con -r invece si esegue la rimozione completa della tabella corrente. Inne con -u si potr` modicare a (solo da parte dellamministratore) la tabella dellutente specicato come parametro. Si tenga presente che lamministratore pu` riservare luso del servizio cron solo ad alcuni o utenti, creando il le /etc/cron.allow, nel quale si devono elencare gli username degli utenti che lo possono usare. Se il le non esiste ` possibile vietare luso del servizio solo ad alcuni utenti e con la creazione del le /etc/cron.deny che di nuovo dovr` contenere la lista degli username a di coloro che non possono usarlo. In assenza di detti le chiunque pu` usare il servizio. o

3.3.2

Il servizio at

Abbiamo visto nella sezione precedente come si pu` programmare lesecuzione periodica di proo cessi con crontab, esistono per` anche necessit` di avere una esecuzione dierita dei programmi, o a senza che questa debba essere periodica. Per provvedere a questo compito esiste un altro servizio, detto at, per il nome dal comando che permette di richiedere lesecuzione di un programma ad
22 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. 23 nel le di crontab mostrato nellesempio viene fatto un controllo preventivo della presenza del comando anacron (installabile dal pacchetto omonimo), questo ` un sostituto di crond per le macchine che non ` previsto e e siano sempre accese, il quale si incarica anche di eseguire le operazioni che non sono state eettuate perch la e macchina era spenta, se ` installato le operazioni periodiche vengono eseguite da lui e non ` necessario lintervento e e di crond; lintallazione di default presuppone che la macchina non ne abbia bisogno, per cui il comando non sar` a presente e verr` eseguito invece run-parts. a 24 i le vengono mantenuti in /var/spool/cron/crontabs. 25 la versione usata da Debian in realt` non stampa le righe di commento iniziale che avvisano di non modicare a direttamente il contenuto del crontab, in modo da poter riutilizzare loutput del comando direttamente come input per un successivo crontab -.

3.3. I SERVIZI DI BASE

117

un tempo successivo. Il servizio comporta diverse modalit` di gestione della esecuzione dierita, a e vari programmi per la gestione della stessa. Il servizio ` realizzato dal demone atd, che come crond viene lanciato dagli script di avvio. e 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` essere anche lanciato manualmente, e prevede o come opzioni -l che permette di impostare manualmente un limite massimo per il carico della macchina, oltre il quale non saranno i programmi programmati (di default vale il valore preimpostato di 1.5, ha senso cambiarlo solo in caso di macchine multiprocessore), -b che permette di impostare un intervallo di tempo minimo (il default ` 60 secondi) fra la messa in esecuzione e di due successivi programmi. Al solito per lelenco completo si pu` fare riferimento alla pagina o di manuale. Il comando di base, che permette di programmare lesecuzione di un programma ad un dato momento, ` at. Il comando vuole come argomento data ed ora in cui il programma specicato e deve essere messo in esecuzione; il nome di questultimo viene letto dallo standard input o pu` o essere specicato direttamente dalla riga di comando con lopzione -f. La directory di lavoro e lambiente del comando che verr` lanciato sono quelli presenti al momento in cui si invoca at. a Il comando supporta una grande variet` di formati per le modalit` in cui si indica la data, a a fra cui tutti quelli del comando date, pi` altre estensioni che permettono di usare anche speciu cazioni in forma pi` discorsiva come at 1pm tomorrow. Una descrizione completa di queste si u trova nel le /usr/share/doc/at/timespec. Una alternativa ad at ` luso del comando batch che permette di programmare una esecue zione dierita non in base ad un orario ma in base al carico della macchina. Il comando cio` e sar` posto in esecuzione solo quando il carico medio della macchina scende sotto un certo valore. a Una volta programmata lesecuzione di un programma questo viene messo, per ciascun utente, in una opportuna coda. Gli utenti possono vedere la lista dei propri programmi in coda con il comando atq, mentre lamministratore pu` usare lo stesso comando per vedere la lista di tutti o quanti. Il comando stampa il nome di ciascun programma, lorario per cui ` stata programmata e lesecuzione, ed un numero identicativo ad esso associato. Un programma pu` essere rimosso dalla coda con il comando atrm, che prende come argoo mento lidenticativo dello stesso ottenibile con atq. Di nuovo un utente normale pu` operare o solo sui propri programmi, mentre lamministratore pu` operare su tutti quanti. o Inne come per luso di cron ` previsto un controllo degli accessi al servizio attraverso i e due le /etc/at.allow e /etc/at.deny, il cui formato e signicato sono identici a quello degli analoghi cron.allow e cron.deny.

3.3.3

Il servizio syslog

Il servizio di syslog ` il servizio usato dai demoni che girano in background (e dallo stesso kernel) e per inviare dei messaggi. Dato che detti programmi non sono associati ad un terminale non ` loro e possibile scrivere messaggi di avviso o di errore; per questo esiste un demone apposito, syslogd, che si occupa di fornire una sorta di servizio di segreteria telefonica, dove i vari programmi che devono dire qualcosa possono scrivere i loro messaggi. Di norma il servizio ` attivato automaticamente dagli script di avvio, ed ` possibile attivarlo e e e disattivarlo direttamente con luso diretto degli stessi, ma in caso di necessit` lo si pu` anche a o lanciare direttamente (ad esempio per poter utilizzare lopzione -d che attiva la modalit` di a debug). Se si vuole abilitare la ricezione di messaggi via rete invece occorre utilizzare lopzione -r. La descrizione completa del comando e di tutte le opzioni ` disponibile nella pagina di e manuale, al solito accessibile con man syslogd. Il le di congurazione per il demone syslogd ` /etc/syslog.conf. Il formato del le ` e e sempre lo stesso, ogni linea denisce una regola di registrazione, le linee vuote o che iniziano per # vengono ignorate. Ogni regola ` costituita da due campi separati da spazi o tabulatori; il e

118
Servizio auth authpriv cron daemon ftp kern lpr mail mark news security syslog user uucp

CAPITOLO 3. LA CONFIGURAZIONE DEI SERVIZI DI BASE


Signicato servizio identico a authpriv, deprecato. messaggi relativi ad autenticazione e sicurezza. messaggi dei demoni (at e cron) . demoni di sistema che non hanno una categoria di servizio a se stante. servizio FTP (File Transfere Protocol. messaggi del kernel. messaggi dai servizi di stampa. messaggi dai demoni di gestione della posta elettronica. 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.3: I servizi standard in cui sono classicati i messaggi del syslog.

primo campo ` detto selettore, il secondo azione. Il campo selettore ` costituito da due parti, il e e servizio e la priorit`, separate da un punto. Per una descrizione completa di tutti i dettagli si a faccia al solito riferimento alla pagina di manuale. Il servizio identica una categoria di servizi di sistema per conto dei quali si vuole registrare il messaggio, e viene specicato tramite una delle parole chiave riportate in tab. 3.3, dove sono elencati i servizi standard predeniti. Oltre a questo ci sono poi una serie servizi ausiliari, identicati dalle parole chiave da local0 a local7 che sono lasciati a disposizione dellutente per un uso non specico. I valori delle priorit` invece sono indicati in tab. 3.4 in ordine crescente, dalla pi` bassa alla a u pi` alta. Questi identicano limportanza del messaggio, tutti i messaggi di priorit` superiore u a od uguale a quella indicata nella regola verranno registrati.
Priorit` a debug info notice warning warn err error crit alert emerg panic Signicato messaggio di debug. messaggio informativo. situazione normale, ma signicativa. avvertimento. sinonimo di warning, deprecato. condizione di errore. sinonimo di err, deprecato. condizione critica. si deve intervenire immediatamente. il sistema ` inusabile. e sinonimo di emerg, deprecato.

Tabella 3.4: Le varie priorit` dei messaggi del servizio di syslog. a

Oltre a queste parole chiave syslogd riconosce alcune estensioni, un asterisco * seleziona o tutti i servizi o tutte le priorit` mentre la parola none li esclude tutti; una , permette di a elencare una lista di servizi per la stessa priorit`, o viceversa una lista di priorit` per un certo a a servizio. Si possono inne associare pi` selettori ad una stessa azione separandoli con il ; mentre u ulteriori estensione di questa sintassi sono date dal segno = che permette di registrare solo una specica priorit`, e dal segno ! che permette di escludere una specica priorit`. a a Lazione usata come secondo campo ` un termine astratto per descrivere come si vuole che e siano registrati i messaggi, il caso pi` comune ` scriverli in un le, che in questo caso esso dovr` u e a

3.3. I SERVIZI DI BASE

119

essere specicato dal pathname assoluto, si pu` inserire un - opzionale davanti al nome per o impedire che il contenuto del le venga sincronizzato ad ogni messaggio, lasciando spazio per la buerizzazione degli stessi. La potenza di syslogd ` comunque quella di permettere di eettuare le registrazioni in e maniera estremamente essibile, ad esempio se si premette un | al nome del le si indica che si sta facendo riferimento ad una fo (vedi sez. 1.2.1), oppure si pu` mandare loutput su una o console specicando come le quello di un dispositivo a terminale (ad esempio /dev/tty10). Si possono anche mandare i messaggi a liste di utenti, identicati per username e separate da virgole, e questi li riceveranno sul terminale su cui sono collegati, inne il carattere * fa si che i messaggi siano inviati a chiunque sia collegato. Una delle caratteristiche pi` utili del syslog ` che si possono mandare tutti i messaggi ad una u e macchina remota. Questo si fa usando il carattere @ seguito dallhostname della destinazione. Se su quella macchina ` stato predisposto un syslogd abilitato allascolto via rete questo ricever` e a tutti i messaggi. Si pu` realizzare cos` un macchina dedicata solo a questo servizio, in modo o da proteggere i le di log, che spesso possono contenere informazioni preziose utili in caso di intrusione (ovviamente detta macchina deve essere molto ben protetta). Un esempio per il le /etc/syslog.conf ` il seguente, che si ` estratto dal le di riferimento e e che viene installato di default su una Debian Sid:
auth,authpriv.* /var/log/auth.log *.*;auth,authpriv.none -/var/log/syslog #cron.* /var/log/cron.log daemon.* -/var/log/daemon.log kern.* -/var/log/kern.log lpr.* -/var/log/lpr.log mail.* -/var/log/mail.log user.* -/var/log/user.log 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 le a parte, mentre sul le 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` viene usato un le a a parte. Vengono poi deniti alcuni le per i messaggi generici come messages in cui si richiede linvio dei messaggi solo delle priorit` info, notice e warn escludendo una serie di servizi i cui a

120

CAPITOLO 3. LA CONFIGURAZIONE DEI SERVIZI DI BASE

messaggi sono archiviati altrove. Inne si noti come le emergenze (ad esempio i messaggi di uscita di shutdown) vengano stampati su tutti i terminali attivi.

3.3.4

Il sistema di rotazione dei le di log

I le di log, la cui produzione ` governata dal demone syslogd appena trattato, sono una e delle caratteristiche pi` utili di un sistema unix-like in quanto vi sono registrati i messaggi u (errori, avvertimenti, notiche, etc.) provenienti dai vari servizi, e per questo sono di importanza fondamentale per capire le ragioni di eventuali malfunzionamenti. Il problema con i le di log ` che essi tendono a crescere di dimensione, per cui si rischia e che niscano fuori controllo, riempiendo la partizione su cui risiede la directory /var/log/ in cui normalmente vengono memorizzati. Per risolvere questo problema esiste il programma logrotate che, lanciato su base periodica, (al solito da crond) gestisce la rotazione dei le di log specicati, con tanto di eventuale compressione, rimozione delle versioni troppo vecchie, ed e-mail di avviso allamministratore. Il comando deve essere lanciato specicando come argomento un le di congurazione che specica le modalit` di rotazione. Se si usa lopzione -v il comando stamper` una serie di a a messaggi durante le operazioni di rotazione. Lopzione -d permette di eseguire il comando in modalit` di debug (ed implica -v), mentre -f forza il comando ad eseguire una rotazione anche a quando questa non ` in programma. Al solito per lelenco completo delle opzioni si pu` fare e o riferimento alla pagina di manuale. Il formato del le di congurazione prevede la presenza di una direttiva per riga. Queste possono essere specicate direttamente nel le e vengono prese come impostazioni globali da applicare in maniera generica a tutti i le. E poi possibile indicare delle opzioni speciche per un singolo le scrivendo al posto di una direttiva il pathname assoluto di questultimo seguito da un blocco delimitato da parentesi grae, contenente le direttive da applicargli, specicate sempre una per riga. Inne come per gli altri le di congurazione le linee vuote o che iniziano per # vengono ignorate. Una direttiva particolare ` include che permette di includere altri le allinterno della cone gurazione. Il suo uso pi` interessante ` per` quello in cui viene usata per includere una directory; u e o in tal caso infatti vengono inclusi tutti i le in essa contenuti26 . Questo consente ad ogni servizio che gestisce autonomamente i suoi le di log, di usare un suo le di congurazione con delle impostazioni personalizzate semplicemente scrivendolo in una directory comune. La rotazione pu` essere specicata sia per intervalli temporali (con le direttive daily, weekly o 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 ` soddisfatta e solo in e questo caso (a meno di non aver specicato lopzione -f) la rotazione viene eseguita. Le altre principali direttive sono riportate in tab. 3.5, la descrizione completa di tutte le direttive e del loro signicato si trova nella pagina di manuale del comando, acccessibile con man logrotate. Bench sia possibile lanciare il comando a mano, gran parte delle distribuzioni invocano e logrotate fra le operazioni giornaliere eseguiti da crond. In quasi tutti i casi negli script viene usato come standard il le di congurazione /etc/logrotate.conf mentre ulteriori le di congurazione di singoli servizi sono mantenuti nella directory /etc/logrotate.d/. In genere si mettono in logrotate.conf solo alcune opzioni generali, le opzioni speciche per ciascun servizio vengono messe nella directory /etc/logrotate.d/. In questo modo si fa si che ogni pacchetto che ha bisogno di produrre dei log e ruotarli, inserisca in questa directory un opportuno le di congurazione per logrotate quando viene installato. Il contenuto della directory viene poi incluso dallapposita direttiva presente in logrotate.conf cos` che non ci sia necessit` di modicare questultimo ogni volta che si installa un altro pacchetto. a
a parte quelli con alcuni caratteri o con certe estensioni che li identicano come copie, denibili con la direttiva tabooext (vedi tab. 3.5).
26

3.3. I SERVIZI DI BASE


Direttiva daily weekly monthly size Signicato eettua una rotazione giornaliera. eettua una rotazione settimanale, un le viene ruotato se ` passata e pi` di una settimana dallultima rotazione. u eettua una rotazione mensile, i le vengono ruotati la prima volta che il comando viene eseguito in un certo mese. eettua la rotazione al superamento di una certa dimensione da parte del le di log (invece che su un periodo temporale); richiede che si specichi la dimensione come parametro (supporta i sussi k, M e G). specica il numero di copie (da passare come parametro) dei le di log che devono essere mantenute in una successione di rotazioni. legge tutti il le passato come parametro, o se trattasi di directory, tutti i le presenti allinterno di questa che non abbiano nel nome una delle estensioni vietate (tramite la direttiva tabooext). crea un nuovo le 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 specicati come parametri. permette di denire una lista di estensioni e caratteri vietati nei nomi dei le 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` esclusi, di default questi sono .rpmorig, .rpmsaa ve, .dpkg-dist, .dpkg-old, .dpkg-new, .disabled, ,v, .swp, .rpmnew, e ~. comprime le vecchie versioni dei le di log usando gzip. se il le di log ` assente non d` errori. e a

121

rotate include

create

tabooext

compress missingok

Tabella 3.5: Le principali direttive usate nel le di congurazione di logrotate.

Un esempio del contenuto di /etc/logrotate.conf ` il seguente, i commenti spiegano in e maniera molto chiara il signicato delle varie opzioni, lesempio ` estratto dalla versione del le e installata su una Debian:
# 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 }

122

CAPITOLO 3. LA CONFIGURAZIONE DEI SERVIZI DI BASE

# system-specific logs may be configured here

In questo caso prima si specica di ruotare i le settimanalmente e di mantenere quattro copie degli stessi; gli eventuali errori verranno noticati via e-mail allamministratore. Poi si dice di leggere tutto il contenuto della directory /etc/logrotate.d, inne si cambiano le impostazioni di default per i due le /var/log/wtmp e /var/log/utmp che non fanno riferimento a nessun pacchetto (contengono i dati delle sessioni degli utenti) che vengono ruotati mensilmente invece che settimanalmente.

3.4

LX Window System

In questa sezione tratteremo la congurazione dellinterfaccia graca nei sistemi Unix, in particolare vedremo le caratteristiche principali del sistema X Window System (spesso chiamato per brevit` X11, dalla versione nale del protocollo), e di come gestirlo e congurarlo. a

3.4.1

Introduzione a X Window System

Bench in realt` esistano diverse alternative per la realizzazione di applicazioni in ambiente e a graco, sia attraverso luso diretto del framebuer o dellhardware video, sia attraverso opportuni toolkit graci che attraverso sistemi a nestre completi come Fresco (http://www.fresco.org/), a tuttoggi lambiente graco pi` utilizzato in un sistema GNU/Linux (ed in generale in un u qualunque sistema Unix) ` X Window System. e Il fatto che esistano delle alternative complete per luso dellinterfaccia graca ci mette immediatamente di fronte ad una delle principali dierenze che c` fra un sistema unix-like come e GNU/Linux ed altri sistemi operativi: al contrario di altri sistemi come Windows o MacOS in un sistema GNU/Linux linterfaccia graca non fa parte del kernel, e non ha nessuna caratteristica privilegiata, ma viene eseguita dal kernel in user space come un qualunque altro programma. Tutto il sistema graco in sostanza non ` che un altro strato che viene posto sopra il kernel, e che pu` essere tranquillamente sostituito da uno strato diverso, e che pu` anche essere eliminato o o tutte le volte che non serve (ad esempio sui server). Linterfaccia graca X Window System nasce a met` degli anni 80 con il progetto Athena a allMIT, con lintento di fornire un ambiente graco per i sistemi UNIX, e costituisce probabilmente la prima interfaccia graca mai realizzata su un sistema operativo. La caratteristica principale del sistema, che a tuttoggi lo distingue dalle pi` diuse interfacce grache presenti u in altri sistemi operativi, ` che, oltre a fornire alle usuali funzionalit` che permettono disegnare e a nestre ed altri elementi graci su uno schermo, il sistema ` completamente trasparente rispetto e alla rete. Questo signica che X Window ` in grado di operare allo stesso modo sia in locale, e interfacciandosi direttamente allhardware graco della macchina su cui si sta operando, sia in rete, inviando attraverso di essa le informazioni per disegnare la graca di una applicazione su una macchina remota. Larchitettura di X Window infatti denisce una relazione client-server, illustrata in g. 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 ` incaricher` di disegnarne le nestre (lX-server ). E questa separazione che consente di denire a un protocollo di comunicazione (lX protocol ), fra client e server, che rende lintera interfaccia trasparente rispetto alla rete. Si tenga presente per` che in questa architettura in genere client e server hanno posizione o invertita rispetto al solito. Infatti in genere ` il client che viene eseguito localmente per ine terrogare un server remoto che fornisce delle risposte; in questo caso sono dei client remoti (le

3.4. LX WINDOW SYSTEM

123

Figura 3.1: Schema di funzionamento del protocollo X11

applicazioni) che inviano le informazioni al server locale (lX-server ) perch questo ne disegni le e nestre. Nel caso di GNU/Linux la versione pi` diusa dellX Window System ` XFree86, disponibile u e su http://www.xfree86.org/, che fornisce anche numerose estensioni (come il rendering dei font truetype, e varie accelerazioni grache) attraverso una architettura modulare. In realt` a essendo un protocollo standardizzato il cui codice di riferimento ` sempre stato rilasciato con e licenza libera,27 ne esistono anche varie versioni. A causa di un recente cambiamento di licenza che lo rende incompatibile con la GPL, ` e molto probabile che XFree86 resti limplementazione pi` diusa ancora per poco. Infatti con la u conversione dellX-Consortium, il titolare dei diritti dellimplementazione originale di X Window, da consorzio di industrie a fondazione aperta, si ` ripartiti dallultima versione di XFree86 e con la licenza originale ed ` gi` stata rilasciata una prima versione del server X.org (si veda e a http://www.x.org/), che mantiene la precedente licenza e che ` gi` previsto essere il sostituto e a di XFree86 nelle nuove versioni delle principali distribuzioni. Per il momento per` la gran parte o delle distribuzioni continua ad usare la vecchia versione di XFree86, e noi faremo riferimento, almeno per i nomi dei le, a quella.

3.4.2

La congurazione del server X

Il primo passo per utilizzare linterfaccia graca su GNU/Linux ` congurare il server X sulla e propria macchina, perch questo possa disegnare le nestre e ricevere i dati da tastiera e mouse e (oltre che dai client). Fino alla versione 3 di XFree86 il primo passo era quello di identicare la propria scheda graca 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 ` stato modularizzato, ed e il pacchetto che contiene il server ` uno solo. Noi faremo sempre riferimento a questa ultima e versione. La congurazione del server in XFree86 ` governata dal le XF86Config, il formato di questo e le ` stato modicato a partire dalla versione 4, per cui nelle distribuzioni pi` recenti si trova e u al suo posto il le XF86Config-4. Il server X in genere cerca prima questultimo e se non lo
la cosiddetta licenza X11, creata appunto per questo progetto e poi utilizzata in seguito anche per molti altri, che non essendo copyleft consente anche lesistenza di versioni proprietarie.
27

124

CAPITOLO 3. LA CONFIGURAZIONE DEI SERVIZI DI BASE

trova ricorre al precedente. Tutte le distribuzioni mantengono i vari le di congurazione dellX Window System in una directory separata, sotto /etc/X11. Le informazioni necessarie alla congurazione del server X sono quelle che riguardano le varie componenti utilizzate dallo stesso, e cio` mouse, tastiera, scheda video e monitor. Si tenga e presente che n dallinizio XFree86 ha sempre supportato la presenza di schermi multipli, e che nelle versioni pi` recenti sono state inserite pure delle estensioni che permettono di spalmare u un desktop su pi` schermi. u Congurare il server X signica allora creare un opportuno le /etc/X11/XF86Config-4 che lo metta in grado di utilizzare lhardware; in generale questo viene fatto automaticamente in fase di installazione (specie per le nuove distribuzioni su live-CD che usano lautorilevamento dellhardware) o attraverso un opportuno programma di congurazione che chiede i parametri. Ogni distribuzione ha creato un suo programma dedicato, ma con il pacchetto XFree86 vengono forniti direttamente anche due programmi per la congurazione, xf86cfg che opera ad interfaccia graca e xf86config che opera linea di comando; questi programmi, una volta inseriti i dati dellhardware, permettono di generare automaticamente il le di congurazione. Inne si pu` generare uno scheletro del le direttamente con il comando X -configure. o Il le ` diviso in varie sezioni ciascuna dotata di un suo nome che la identica, introdotta e dalla parola chiave Section e conclusa dalla parola chiave EndSection, allinterno di queste sezioni dovranno poi essere specicate le opzioni ed i valori delle congurazioni (dipendenti dal tipo di sezione), con una sintassi generica del tipo: Section "SectionName" SectionEntry ... EndSection I nomi delle principali sezioni utilizzate comunemente sono riportati in tab. 3.6, lelenco completo pu` essere trovato nella pagina di manuale accessibile al solito con man XF86Config-4. Le o sezioni hanno poi una loro gerarchia, ed alcune di esse devono essere necessariamente specicate.
Nome Files ServerFlags Contenuto Indica i pathname di le o directory contenenti informazioni usate dal server come le directory dei font o i le 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 graca, ecc.) ne deve essere specicata una per singolo dispositivo. Contiene le informazioni di congurazione di una scheda graca, ne deve essere specicata una per ogni scheda disponibile. Contiene le informazioni di descrizione di un monitor, ne deve essere specicata una per ogni monitor disponibile. Contiene la descrizione di una modalit` video (corrisponde a specicare a risoluzione, frequenza di refresh e profondit` di colore). a Contiene la denizione di uno schermo, combinando una scheda video ed un monitor. Contiene la congurazione generale del server. Contiene le speciche per il Direct Rendering Interface uninterfaccia diretta alle accelerazioni hardware delle schede grache.

Module

InputDevice

Device Monitor Modes Screen ServerLayout DRI

Tabella 3.6: I nomi delle varie sezioni del le XF86Config-4.

3.4. LX WINDOW SYSTEM

125

Al livello pi` alto c` la sezione ServerLayout che serve a collegare insieme i dispositivi u e di ingresso e di uscita che vengono usati dal server in una sessione. 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. 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` valori, che u hanno un formato comune per tutte le sezioni e possono essere di tre tipi diversi: o dei valori numerici interi, espressi direttamente col numero o con un presso 0x qualora li si scrivano in esadecimale, o dei valori numerici in virgola mobile, anchessi scritti direttamente, o delle stringhe, che devono essere espresse inserendole fra virgolette. Inoltre per tutte le sezioni esiste la direttiva generica Options che specica il valore di una opzione; questa richiede sempre due parametri di tipo stringa, il primo dei quali ne specica il nome ed il secondo il valore. La stringa che specica questultimo viene poi interpretata ed il suo contenuto viene classicato in altrettanti tipo di valore, i numeri (reali o interi, secondo il formato visto per i parametri generici) verranno interpretati come tali, le parole chiave yes/no, on/off, true/false esprimeranno invece dei valori logici, mentre apponendo ad un numero uno dei sussi Hz, kHz, MHz, ecc. si potranno specicare delle frequenze; il resto verr` interpretato a come stringa (lelenco completo dei tipi di valori ` comunque riportato nella pagina di manuae le). Inoltre usando il susso No nello scrivere il nome di una opzione si specicher` per essa a 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` fare riferimento alla pagina di manuale. La sezione o Files contiene la denizione di una serie di pathname che riguardano la posizione di le e directory utilizzate dal server. Le direttive possibili sono le seguenti: FontPath specica una lista di directory, separate da virgole, in cui si trovano i font usati dal server. Si pu` usare la direttiva pi` volte, e le relative directory verranno o u unite insieme. La direttiva richiede o un pathname assoluto ad una directory, o lidenticatore di un font server,28 nella forma: <trans>/<hostname>:<port-number> dove trans indica la modalit` di connessione (e vale unix per i socket locali e a 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 le contenente il database dei colori RGB, qualora non specicato viene utilizzato il valore di default che ` /usr/X11R6/lib/X11/rgb. e

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 specicare pi` directory usando pi` istanze della direttiva. Qualora non sia specicato nulla u u viene usata di default la directory /usr/X11R6/lib/modules/.
il font server ` un servizio fornito dal programma xfs che permette di mantenere i font su una singola e 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.
28

126

CAPITOLO 3. LA CONFIGURAZIONE DEI SERVIZI DI BASE

La sezione ServerFlags permette di impostare alcune opzioni generali relative al server, essa contiene solo direttive di tipo Options, la sezione Module ` usata per specicare quali e moduli di estensione del server devono essere caricate; questa in genere prevede solo la direttiva Load seguita dal nome del modulo, questo ` lo stesso del le corrispondente che si deve trovare e allinterno del path indicato ModulePath, tolto il lib iniziale e lestensione. Lunica formulazione alternativa ` usare una sintassi del tipo: e SubSection "extmod" Option "omit XFree86-DGA" EndSubSection dove il nome del modulo ` lo stesso e la direttiva Option viene utilizzata per passare dei parametri e al modulo. La sezione InputDevice serve a specicare 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 specicare anche di pi`, in caso di presenza di pi` tastiere (caso non molto comune) o u u di pi` mouse (caso comune invece con i portatili, cui in genere si usa un mouse USB da aancare u al touchpad, o con luso di tavolette grache). Ogni sezione viene specicata nel formato: Section "InputDevice" Identifier "nome" Driver "dispositivo" Option "..." ... EndSection dove le direttive Identifier, che indica un nome cui fare riferimento al dispositivo nelle altre sezioni e Driver, che ne specica il tipo, devono sempre essere specicate. 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` comune u di entrambe le tipologie. Le restanti direttive sono tutte da specicare nella forma di opzioni, le principali delle quali sono: CorePointer di valore booleano, che se viene impostata indica che il relativo dispositivo viene considerato come il mouse principale. di valore booleano, che se viene impostata indica che il relativo dispositivo viene considerato come la tastiera principale. indica il le di dispositivo da utilizzare per accedere al relativo dispositivo. invia gli eventi relativi ad un altro dispositivo come se fossero generati dal dispositivo principale (lo si usa per abbinare gli eventi di un eventuale mouse USB a quelli della touchpad sui portatili). XkbModel indica, nel caso di una tastiera, il modello (ad esempio pc105 per una tastiera da PC a 105 tasti). 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.) indica nel caso di un mouse, il protocollo utilizzato (i pi` comuni sono PS/2 u per i mouse ordinari e ImPS/2 per quelli dotati di rotellina).

CoreKeyboard

Device SendCoreEvents

XkbLayout

Protocol

3.4. LX WINDOW SYSTEM

127

La sezione Device serve a specicare le caratteristiche di una scheda graca, e ne deve esistere almeno una (ma se ne possono avere diverse in caso di presenza di pi` schede grache). Il suo u formato ` identico a quello visto in precedenza per InputDevice, e prevede le due direttive e obbligatorie Identifier e Driver, dove questultima indica il nome del modulo associato al driver che gestisce la relativa scheda graca. Il resto della sezione prevede come nel caso precedente solo delle direttive Option, buona parte delle quali sono speciche del driver della scheda graca utilizzato e sono descritte nella relativa pagina di manuale, che si accede nella sezione 4 usando il nome del driver stesso (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). Alcune opzioni generiche, valide per tutti i driver, sono tuttavia specicate direttamente nella pagina di manuale di XF86Config-4. La sezione Monitor serve ad indicare le caratteristiche di un monitor, e ne deve essere presente almeno una. Il formato generale della sezione ` del tipo: e Section "InputDevice" Identifier "nome" direttiva ... EndSection dove come nei casi precedenti Identifier specica una stringa identicativa del monitor (che pu` essere qualunque) ed ` obbligatoria; le restanti direttive servono a specicare le caratterio e stiche del monitor, le principali sono: VendorName ModelName HorizSync stringa che identica la marca del monitor. stringa che identica il modello del monitor. indica la frequenza (o lintervallo di frequenze) di sincronia orizzontale29 supportato dal monitor. Pu` essere indicato come singola lista di valori separati o da virgole come intervallo separato da un meno, e se non specicata con uno degli indicatori illustrati in precedenza ` supposto essere espressa in kHz. e indica la frequenza (o lintervallo di frequenze) di aggiornamento verticale30 supportato dal monitor. Come per HorizSync pu` essere indicato sia come o singola lista di valori che come intervallo, espresso di default in Hz. Questo valore viene usato dal server X per determinare se un modo video ` compatibile e con il monitor. ` una direttiva speciale da scriversi su pi` linee (chiuse da una direttiva e u EndMode) che permette di specicare una modalit` video cui viene dato il a nome passato come argomento, mentre i valori da usare in termini di risoluzione e frequenze di aggiornamento vengono specicati nelle righe successive (per la sintassi si consulti la pagina di manuale). In genere non ` necessario e utilizzarla in quanto vengono riconosciuti come predeniti una serie di modalit` video in standard VESA, con nomi del tipo di 1024x768, 1240x1024, ecc. a da utilizzare in una successiva sezione Screen.

VertRefresh

Mode

In genere i valori per HorizSync e VertRefresh sono critici per luso del monitor, in quanto sbagliandoli ` possibile mandare fuori sincronia lo stesso con il risultato di non vedere pi` nulla. e u
la frequenza di sincronia orizzontale ` la frequenza a cui il monitor pu` spostare il fascio che disegna una riga e o orizzontale. 30 ` la frequenza con cui pu` essere ridisegnato lintero schermo. e o
29

128

CAPITOLO 3. LA CONFIGURAZIONE DEI SERVIZI DI BASE

I monitor recenti supportano comunque un meccanismo di notica alle applicazione di questi ed altri dati, detto EDID, che evita di doversi andare a cercare i rispettivi valori su una qualche oscura pagina del manuale (sempre che si siano scomodati a scriverceli). Questi dati possono essere letti tramite il programma get-edid il cui output pu` essere trasformato direttamente o nella corretta sezione Monitor pronta per linclusione in XF86Config-4 mandandolo in pipe al comando parse-edid.31 Una volta denite le schede video ed i monitor presenti, questi vanno collegati fra loro oltre che con il cavo tramite una apposita sezione Screen che identica linsieme dei due, e denisce le caratteristiche dello schermo che verr` utilizzato dal server X. Il formato generale di questa a sezione ` il seguente: e 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 identica lo schermo in questione, ed ` obbligatoria come le due Device e Monitor che servono a specicare la scheda video ed il e monitor collegati allo schermo, che prendono come argomento lidenticatore utilizzato in una delle sezioni omonime. Viene spesso utilizzata anche la direttiva DefaultDepth che indica la profondit` di colore (in numero di bit) da utilizzare di default per lo schermo quando si hanno a pi` sottosezioni di tipo Display. u ` E inoltre obbligatoria la presenza di almeno una sottosezione Display che specichi la profondit` di colore (tramite la direttiva Depth, obbligatoriamente presente) e una (o pi`) varie a u modalit` video (con la direttiva Modes che prende un elenco di nomi (separati da spazi) di quelli a predeniti nello standard VESA o indicati da una precedente direttiva Mode inserita nella corrispondente sezione Monitor. Uno schermo infatti pu` essere utilizzato a diverse profondit` di o a colore, diverse risoluzioni e diverse frequenze di aggiornamento a seconda delle caratteristiche della scheda video e del monitor, ed qualora si specichino pi` modi, ` pure possibile passare u e al volo dalluno allaltro una volta avviato il server con la combinazione di tasti Ctrl-Alt-+ e Ctrl-Alt--. Inne la sezione ServerLayout serve ad ottenere una congurazione completa collegando uno o pi` schermi (deniti in altrettante sezioni Screen) con uno o pi` dispositivi di input (deniti u u 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" ...
31

nel caso di Debian per poter utilizzare questo comandi occorrer` installare il pacchetto read-edid. a

3.4. LX WINDOW SYSTEM opzioni ... EndSection

129

di nuovo Identifier indica una stringa di identicazione, mentre Screen e InputDevice servono a referenziare quali schermi e dispositivi di input inserire nel layout, usando lidenticatore specicato nelle omonime sezioni.

3.4.3

Lavvio del server

Le modalit` per attivare una sessione graca sono sostanzialmente due, quella che prevede a lavvio del server X e di tutto lambiente graco da console, e quella che prevede direttamente il login dallambiente graco, che viene lanciato direttamente nella procedura di avvio (tramite gli opportuni script) insieme al programma di gestione del login. Nel caso dellavvio da console il programma utilizzato per lanciare una sessione ` startx, e questo in realt` non ` altro che una interfaccia semplicata per chiamare un altro programma, a e ` xinit. E questultimo che avvia il server X e poi esegue un eventuale programma client passato come argomento, ad esempio un terminale da cui eseguire gli altri comandi. Alluscita del suddetto programma xinit si incarica anche di terminare il server X; si tenga presente per` o che questo avviene anche se gli eventuali altri programmi lanciati dal primo client eseguito direttamente da xinit sono ancora attivi. Per questo usualmente non si specica nessun programma, poich in tal caso xinit cerca se e nella home dellutente esiste un le .xinitrc e lo esegue come se fosse uno script di shell, terminando il tutto solo alla ne di questo. Questo consente di utilizzare il contenuto di .xinitrc per inizializzare il proprio ambiente graco, chiamando al suo interno i programmi che si intendono lanciare. In questo per` occorre considerare che i programmi indicati in .xinitrc vengono eseo guiti uno dopo laltro, per cui se si vuole che vengano eseguiti in maniera concorrente occorrer` a lanciarli in background, tranne lultimo alla cui uscita terminer` anche la sessione graca. Per a questo motivo in genere si lancia sempre per ultimo un window manager o un session manager (vedi sez. 3.4.4). Come accennato usualmente invece di usare direttamente xinit si lancia la sessione usando startx, questultimo infatti permette di denire opportunamente i parametri necessari allesecuzione del secondo, integrandosi con la distribuzione in modo da utilizzare gli eventuali window manager o session manager scelti come default. Altrimenti il secondo, in assenza di uno .xinitrc dellutente, lancerebbe semplicemente xterm.32 La seconda modalit` di avvio del server X ` attraverso un login manager graco (in realt` a e a nella nomenclatura di X questo viene chiamato X Display Manger ). Questultimo ` semplicee mente un programma che lancia il server e poi si incarica di mostrare allutente una nestra di login (graca) su cui questo pu` autenticarsi per entrare nel sistema ed eseguire una sessioo ne. Un vero login manager deve per` essere in grado di fare anche qualcosa di pi`, e gestire o u cio` la stessa procedura di autenticazione e di avvio di una sessione pure da remoto, sfruttando e la trasparenza sulla rete del protocollo X11, attraverso il supporto di un apposito protocollo, lXDMCP (X Display Manager Control Protocol ). Questo consente di presentare anche su macchine remote, che a questo punto assumeranno il compito di fare da semplici terminali per la sessione, la stessa nestra di login. In questo modo ` possibile centralizzare le applicazioni grache su un unico server su cui esse saranno eseguite, e ed riutilizzare macchine dotate anche di scarse risorse hardware, che non sarebbero in grado di sopportare il carico di tutta linterfaccia graca, solo per il disegno delle nestre attraverso linstallazione del solo X server..
il programma xterm ` probabilmente il pi` semplice dei programmi ad interfaccia graca, e si limita e u semplicemente a riprodurre dentro una nestra un terminale del tutto analogo a quello che si trova sulla console.
32

130

CAPITOLO 3. LA CONFIGURAZIONE DEI SERVIZI DI BASE

Nella distribuzione classica di X Window, quella distribuita direttamente con limplementazione di riferimento dellX-server, il programma che implementa il login manager ` xdm. Il e programma ha una interfaccia molto spartana, ma ` ampiamente congurabile in quanto il suo e comportamento viene governato da una serie di script di shell che eseguono i vari compiti, mentre la congurazione ` eettuata tramite le delle opportune risorse (la trattazione di queste ultime ` e e in sez. 3.4.4) che vengono specicate nel le di congurazione /etc/X11/xdm/xdm-config. Il programma per` onora anche una serie di opzioni, da indicare nel le /etc/X11/xdm/xdm.options, o che assumono i valori descritti nellomonima pagina di manuale, e controllano il comportamento del programma. Come accennato il funzionamento di xdm prevede luso di una serie di script e programmi, ad esempio la nestra di login in cui inserire username e password viene gestita dal programma xlogin, una volta terminato con successo il login xdm esegue lo script Xstartup (situato in /etc/X11/xdm) per inizializzare la sessione, e se questo ha successo il successivo Xsession, che tipicamente usa il le .xsession nella home directory dellutente come analogo di .xinit per lanciare la sessione graca dellutente. I le .xinit e .xsession hanno lo stesso scopo e signicato, tanto che in Debian la congurazione di default fa si che sia usato questultimo anche quando si lancia lambiente graco da console con startx. Entrambi contengono cio` i programmi da lanciare per gestire la sessione e graca, e 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. Bench si sia trattato pi` in dettaglio xdm, dato il suo legame diretto con il sistema di X e u Window, nelle distribuzioni GNU/Linux di oggigiorno i login manager pi` utilizzati sono altri, u 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 orono una graca molto pi` u accattivante di xdm ed un sistema di congurazione molto pi` avanzato (e semplicato). u Infatti bench entrambi non necessitino della presenza dei rispettivi ambienti desktop e pose sano essere usati indipendentemente, vengono solitamente installati in corrispondenza a questi. Il grande vantaggio di entrambi ` che, pur essendo controllati da un le di congurazione testuae le (rispettivamente /etc/gdm/gdm.conf per gdm e /etc/kde3/kdm/kdmrc per kdm), ` possibile e controllarli e modicarne limpostazione con un apposito programma di congurazione ad interfaccia graca (eseguibile anche al loro interno), che permette di attivare e controllare le loro funzionalit` senza dover modicare a mano il le di congurazione. a

3.4.4

Luso di X Window dal lato client

Come accennato qualunque programma che usi linterfaccia graca tramite le Xlib deve agire come client per un server X che si incaricher` di disegnarne le gli elementi graci sullo schermo. a Una delle caratteristiche di X Window ` quella di avere denito un meccanismo per memorizzare e in maniera generica le preferenze relative allambiente graco di ciascuna applicazione, attraverso quelle che vengono chiamate risorse. Il valore di ciascuna risorsa ` specicato da una stringa, ma queste ultime sono organizzate e in una gerarchia ad albero33 in cui ogni nodo ` identicato dal nome della risorsa, in cui i singoli e nodi della gerarchia sono separati da un . e che usa come radice il nome del programma stesso (spesso scritto con la prima lettera maiuscola). In genere ciascuna applicazione mantiene le impostazioni generali per le sue risorse in un
le risorse si chiamano cos` in quanto corrispondono eettivamente a delle strutture dati, che a loro volta possono contenere altre strutture con altri dati; i relativi campi identicano un possibile valore (o una ulteriore risorsa); ciascuna struttura viene associate al singolo programma, e ne controlla vari aspetti come il colore delle nestre, dello sfondo, il titolo della nestra, ecc., il valore ` associato ad un certo campo della risorsa stessa, con e un certo nome, per cui viene naturale accedere allinsieme di strutture e sottostrutture attraverso una gerarchia ad albero.
33

3.4. LX WINDOW SYSTEM

131

le apposito che in fase di installazione viene posto in una directory comune (di default viene usata /usr/X11R6/lib/X11/app-defaults/) con il nome stesso della risorsa; i singoli utenti per` possono cambiare a piacere questi valori tramite luso del le .Xresources nella propria o home directory, nel quale specicare 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 le in cui sono stati scritti i nuovi valori che saranno caricati immediatamente. Un esempio di un le di congurazione 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 modicano le impostazioni dei colori di sfondo e primo piano, si specica la geometria iniziale ecc. Si noti come la sintassi preveda una riga in cui si specica il nome della risorsa terminato da :, cui segue la stringa che assegna il valore. Si noti anche come il nome della risorsa possa contenere il carattere jolly * che assume lo stesso signicato che avrebbe se si specicasse un pathname.34 Inne si tenga presente che il carattere ! serve ad introdurre una riga di commento. Se le risorse permettono di controllare i vari parametri interni delle singole applicazioni, quello che contraddistingue una interfaccia graca ` la capacit` di poter eseguire vari programmi in e a contemporanea, ciascuno nella sua nestra. Come per` ci si potr` rendere conto ad esempio o a lanciando xinit a mano con una serie di programmi qualsiasi, questi ultimi, seguendo la solita losoa per cui ognuno si cura di eseguire un suo compito ben preciso, si limitano solo a disegnare il contenuto delle rispettive nestre. Il posizionamento delle stesse, il loro spostamento, il passaggio dalluna allaltra, ecc. devono essere invece gestiti a parte e non sono compito dei singoli programmi. Per questo per poter usare davvero uninterfaccia graca ` necessario avere almeno unaltro programma che esegua e questi compiti specici: quello che viene chiamato un window manager, e che assume un po quello che ` il ruolo della shell nella riga di comando (lanciare altri comandi e passare dalluno e allaltro). Senza un window manager infatti si avrebbe la graca ma non la possibilit` di spostare, a ` nascondere, ridimensionare le nestre, o di passare dalluna allaltra. E il window manager che si cura di tutti questi compiti, del disegno degli elementi graci di contorno, e della gestione il mouse per gestire lo spostamento, la ridimensionamento e la selezione delle nestre. Un compito fondamentale infatti, quando si hanno pi` nestre da gestire, ` appunto quello della selezione di u e quella che viene messa a fuoco, quella cio` cui verranno inviati tutti gli eventi in ingresso (ad e esempio quello che si scrive sulla tastiera), che ` un po lequivalente del processo in foreground e visto in sez. 1.3.4. Per usare con protto una sessione graca tutto quello che serve ` un window manager, e molti di questi infatti gestiscono anche la presenza di un men` o di una barra direttamente u sullo schermo (o eventuali altri elementi di contorno), usando i quali ` possibile lanciare altre e
cio` applica il valore a tutte le risorse che corrispondono alla stringa in cui nella gerarchia lasterisco ` sostituito e e da un nome qualunque.
34

132

CAPITOLO 3. LA CONFIGURAZIONE DEI SERVIZI DI BASE

applicazioni o avere informazioni sul sistema. I pi` comuni, tuttora in ampio uso da parte di u coloro che sono abituati alla loro interfaccia e non necessitano di funzionalit` pi` avanzate, sono a u Window Maker, ICEwm, blackbox, ecc. Le interfacce grache moderne vanno per` al di l` della semplice gestione delle nestre; per o a denire una infrastruttura che consenta operazioni come il cosiddetto drag and drop, in cui si possono passare elementi o dati da una nestra ad un altra (e cio` da una applicazione ad un e altra). Per questo un window manager non basta, il passo successivo ` allora quello delluso di un e desktop environment, cio` di una infrastruttura (completa di meccanismi di intercomunicazione) e che denisca non solo la gestione delle nestre, ma tutto un insieme di elementi (come oggetti graci comuni e meccanismi di intercomunicazione) che porta appunto un ambiente graco integrato analogo a quello che si trova su altri sistemi operativi come MacOS o Windows.

3.5

Il sistema di stampa

Tratteremo in questa sezione la congurazione delle stampanti sotto GNU/Linux; dopo una introduzione generale sulla gestione generica della stampa vedremo in particolare la congurazione secondo il sistema tradizionale del Line Printing Daemon di BSD e la nuova architettura del Common Unix Printing System.

3.5.1

Introduzione generale

Mantenendo la losoa progettuale di Unix per cui tutto ` un le, ` facile immaginarsi che la e e prima e pi` immediata modalit` di stampa sia quella di inviare il le da stampare direttamente u a al dispositivo associato alla stampante. Questo ` senzaltro possibile, ma si scontra con una e serie di problemi che lo rendono altamente sconsigliabile; il primo ` che non esiste un dispositivo e univoco che identichi una stampante, questa pu` essere infatti agganciata ai dispositivi pi` vari o u (e molte stampanti ne supportano pi` di uno), come la parallela, la seriale, una porta USB, ecc. u In ciascuno di questi casi il le andrebbe inviato sul relativo dispositivo (nel caso pi` comune, u di stampante su porta parallela, /dev/lp0). Tutto questo non costituirebbe di per s un grosso problema, basterebbe identicare il die spositivo specico e identicarlo con un link simbolico (un po come si fa per il CDROM). Il problema pi` importante ` invece quello relativo al contenuto del le da stampare; un tempo u e quando si stampavano solo le di testo senza formattazioni il problema non cera, oggi per` si o stampano le con contenuti graci 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` di uno), che permette di ottenere i risultati voluti. Questo signica che u anche un semplice le 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` essere opportunamente a tradotto. Il terzo problema ` quello di essere in presenza di un sistema operativo multiutente e mule titasking; il che comporta che con laccesso diretto si possono avere pi` processi che scrivono u in contemporanea sul dispositivo della stampante, coi relativi dati che si mescolano fra di loro dando luogo risultati tuttaltro che piacevoli nella stampa nale. Per questa serie di motivi in genere il dispositivo della stampante non ` mai accessibile e 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 ` che laccesso alla e stampante ` regolato attraverso un opportuno demone, che ` lunico che ci scrive, le stampe e e vengono richieste inviando i le da stampare al suddetto demone, che si incarica di eseguire

3.5. IL SISTEMA DI STAMPA

133

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 ` quella e delle code, le stampe cio` non vengono mai eseguite direttamente, ma immesse, tramite un e 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 g. 3.2.

Figura 3.2: Schema generico del funzionamento del sistema di stampa.

Il vantaggio di questo sistema ` che la gestione della coda pu` essere esguita indipendene o temente dalla gestione della stampante, ad esempio diventa possibile inviare la stampa su una coda remota se ` previsto un opportuno meccanismo di comunicazione. Lo stesso concetto di e stampa remota pu` essere realizzato in maniera alternativa usando una coda locale ed usando o direttamente il demone di stampa per inviare i le ad un altro demone remoto. Inoltre con lo schema di g. 3.2 nelleseguire linvio dei le dalla coda di stampa alla stampante il demone di stampa pu` eseguire tutte le operazioni necessarie (realizzate in genere attraverso o quelli che si chiamano ltri di stampa) per convertire il contenuto del le da stampare in uno formato che la stampante ` in grado di comprendere. e Inne luso di questa architettura permette anche di utilizzare pi` code di stampa per la u stessa stampante; questo consente ad esempio di utilizzare code diverse (con ltri diversi) a seconda del tipo di le che si vuole stampare, o con diversi privilegi o priorit`. a

3.5.2

Il sistema di stampa in stile BSD

Uno dei sistemi di stampa storici in ambiente Unix ` quello sviluppato per BSD, e tuttora e ` distribuito insieme a questo sistema operativo. E presente un porting anche per GNU/Linux, (nel caso di Debian si pu` installare con il pacchetto lpr) ma il suo funzionamento ` difettoso o e ed il numero di stampanti supportate ` limitato. Per questo esso ` in genere sostituito da una e e implementazione alternativa, LPRng, sviluppata indipendentemente che ha la stessa interfaccia e le stesse funzionalit` ma supporta anche molte estensioni (in Debian ` fornita dal pacchetto a e lprng). Noi faremo riferimento solo a LPRng, che uno dei sistemi di stampa di uso pi` comune nelle u distribuzioni GNU/Linux (laltro ` CUPS che tratteremo in sez. 3.5.4), ignorando completamente e limplementazione originale di BSD, facendo riferimento al tutto con il nome del protocollo LPD (acronimo di Line Printer Daemon) che ` pure standardizzato nellRFC 1179. e

134

CAPITOLO 3. LA CONFIGURAZIONE DEI SERVIZI DI BASE

Come il nome stesso suggerisce, il cuore del sistema di stampa LPD ` lomonimo demone e di stampa lpd che gestisce linvio dei le dalla coda di stampa alla stampante. 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, ne tratteremo la congurazione in sez. 3.5.3. Oltre a lpd il sistema di stampa in stile BSD prevede una serie di altri programmi per limmissione delle stampe nelle code e per la gestione di queste ultime.
Opzione -# -C -J -m -U Signicato specica il numero di copie da stampare, da passare come argomento. specica la priorit` della stampa, identicata da una lettera maiuscola a da A (pi` bassa) a Z (pi` alta), da passare come parametro. u u associa alla stampa il nome passato come parametro, in modo che questo venga stampato nellintestazione (quando questa ` prevista). e richiede linvio di una email allindirizzo passato come parametro qualora la stampa fallisca. permette di specicare (come parametro) lutente per conto del quale eseguire la stampa (utilizzabile solo dallamministratore). Tabella 3.7: Le principali opzioni del comando lpr.

Per richiedere la stampa di un le si deve utilizzare il comando lpr, che prende come argomenti i le da stampare (se non si specica nulla viene usato lo standard input), una volta messa in coda una serie di stampe il comando riporta sullo standard output un numero identicativo (che potr` essere usato con gli altri comandi per fare riferimento alle stesse) per ciascuna di a 35 esse. Lopzione principale di lpr ` -P che permette di indicare su quale coda di stampa inviare e il le da stampare; se non la si specica viene usato, se denito, il valore di una delle variabili PRINTER, LPDEST, NPRINTER o NGPRINTER, oppure la stampante di default, che ` la prima denita e in /etc/printcap, (vedi sez. 3.5.3). Unaltra opzione utile ` -h che inibisce la stampa di e eventuali pagine iniziali per le code in cui questa ` prevista e -# che richiede la stampa di un e certo numero di copie; le altre opzioni principali sono riportate in tab. 3.7, 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 ` lpq, che permette di esaminare e 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` specicare come argomento il numero identicativo della stampa (quello riporo tato nella colonna Job) ed il comando riporter` solo le informazioni ad essa relative. a Di default il comando esegue la ricerca delle stampe sulla coda di default, a meno di non usare lopzione -P per selezionare una coda specica. Si pu` usare lopzione -a per fare eseguire o
le stampe sono spesso chiamate, seguendo la nomenclatura inglese, job, in particolare i comandi fanno riferimento a questi identicativi come ai job ID e riportano il numero di stampe correnti come numero di job.
35

3.5. IL SISTEMA DI STAMPA

135

la ricerca su tutte le code; per le altre opzioni e per una descrizione dettagliata si pu` fare o riferimento alla pagina di manuale. Una volta creata una stampa, la si potr` eliminare dalla coda con il comando lprm; questo a prende come argomenti la lista delle stampe da rimuovere che possono essere indicati sia tramite il loro identicativo (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 lename globbing (vedi sez. 2.1.4). Luso della parola chiave all seleziona tutte le stampe presenti,36 mentre se non si specica nulla viene selezionata la prima che pu` essere rimossa. Di nuovo il comando o opera sulla coda di default a meno di non usare lopzione -P per specicarne 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` rimuovere solo quelle per i quali ha il permesso (per la gestione dei permessi si a veda sez. 3.5.3); con lopzione -U si pu` richiedere (se si ` root) di operare a nome di un altro o e 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 specicarne unaltra o lopzione -a per indicarle tutte. Se non si specicano argomenti il programma si porta su una linea di comando interna, da cui questi possono essere specicati. Il primo comando ` help che stampa la lista di tutti quelli e disponibili. Con status si ha la stampa dello stato della coda e relativa stampante associata. Si pu` fermare la stampa con luso del comando stop e farla ripartire con start. Si pu` invece o o bloccare limmissione di stampe su una coda con disable e riabilitarla con enable. Lelenco dei principali comandi ` riportato in tab. 3.8, al solito lelenco completo ed i dettagli sono nella e pagina di manuale. Un esempio di risultato di questo comando ` il seguente: e
parker:/var/log# lpq status 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 epson is ready no entries

Size Time

3.5.3

La congurazione della stampa con LPRng

Come accennato il principale programma di un sistema di stampa in stile BSD ` il demone e lpd che gestisce linvio dei le dalla coda di stampa alla stampante; il demone per` ` in grado oe anche di gestire la eventuale ricezione di richieste di stampa via rete (da un altro demone o direttamente da un client), e permette perci` di trasformare una qualunque stampante presente o sulla propria macchina in una stampante di rete. Pertanto la congurazione della stampante su una macchina che usa questo sistema consiste nel congurare opportunamente lpd. Nel nostro caso esamineremo la congurazione soermandoci specicamente sul caso particolare di LPRng, in cui ` prevista la presenza di una serie di e le di congurazione per i vari compiti eseguiti dal demone.
questa ` una caratteristica della versione di lprm del pacchetto lpr-ng, il pacchetto originale del demone di e 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 del sistema, se usato dallamministratore.
36

136
Comando disable down

CAPITOLO 3. LA CONFIGURAZIONE DEI SERVIZI DI BASE


Signicato disabilita limmissione di stampe su una coda di stampa; prende come argomento il nome della coda o all per indicare tutte le code. disabilita sia limmissione di nuove stampe in coda che la stampa di quelle presenti; prende come argomento il nome della coda o all per indicare tutte le code. abilita limmissione di nuove stampe su una coda di stampa; prende come argomento il nome della coda o all per indicare tutte le code. esce dal programma. sospende la stampa (su una stampante o per una singola stampa); prende come argomento il nome della stampante ed eventualmente lidenticatore del job. sospende automaticamente tutte le nuove stampe, che vengono accodate ma non stampate; prende come argomento il nome della coda o all per indicare tutte le code. sposta una stampa da una coda ad unaltra; prende come argomenti la coda di origine, lidenticativo della stampa e la coda di destinazione. sblocca la sospensione della stampa per una coda o una stampa specica; prende come argomento il nome della coda ed eventualmente lidenticatore della stampa. avvia una stampante, ` utilizzato principalmente quando un demoe ne termina lasciando dei job sulla coda per riavviarlo; prende come argomento il nome della coda o all per indicare tutte le code. riporta lo stato di una coda e relativa stampante; prende come argomento il nome della coda o all per indicare tutte le code. blocca ogni ulteriore stampa dopo il completamento della stampa corrente; prende come argomento il nome della coda o all per indicare tutte le code. sposta le stampe selezionate in cima alla coda di stampa; prende come argomento il nome della coda seguito dalla lista degli identicativi delle stampe. abilita sia limmissione nella coda che la stampa; prende come argomento il nome della coda o all per indicare tutte le code. Tabella 3.8: I principali comandi di lpc.

enable exit hold

holdall

move release

start

status stop

topq

up

Il primo le di congurazione, usato da tutti i demoni di stampa in stile BSD, ` /etc/printcap. e Il le contiene la denizione delle code di stampa con la assegnazione delle stampanti (e degli eventuali ltri) ad esse associate. Il le ` composto da una serie di blocchi, uno per ciascuna e coda che si intende utilizzare. Ciascun blocco ` composto da una serie di campi separati dal e carattere :, un blocco pu` essere scritto su pi` righe terminando ciascuna di esse con la barra o u rovescia \ come si fa per la shell;37 si tenga conto che lultimo campo deve essere anchesso terminato col carattere :. Al solito righe vuote e tutto quello che segue il carattere # viene ignorato. Il primo campo indica il nome della coda di stampa, esso pu` riportare pi` nomi (per una o u migliore identicazione della stampante associata) separati con la barra verticale |. Tutti gli altri campi, che controllano le caratteristiche della coda e della stampante associata, possono essere specicati in ordine qualsiasi, ciascun campo inizia sempre per un identicativo di due caratteri, seguito da una assegnazione con un = se il suo valore ` una stringa o con un # se e il valore ` numerico; un terzo tipo di campi ha valore logico, nel qual caso si usa semplicemente e la presenza del rispettivo identicativo. Di questi campi ` fondamentale specicare sempre sd, che come il nome fa supporre, indica la e spool directory, cio` la directory su cui verranno appoggiati temporaneamente i le da stampare; e se la stampante ` locale deve essere specicato il campo lp che indica quale dispositivo usare; se e invece la stampante ` remota si deve specicare un campo rm (da remote machine) per indicare e
37

in realt` con LPRng questo non ` necessario, ma ` meglio farlo per compatibilit`. a e e a

3.5. IL SISTEMA DI STAMPA

137

lhostname del computer (o lindirizzo IP) su cui essa si trova ed il campo rp (da remote printer ) per indicare il nome (cio` la coda di stampa) con cui essa ` identicata dal demone LPD presente e e su quel sistema. I principali campi del le sono riportati in tab. 3.9, al solito per lelenco completo ed i dettagli si pu` fare riferimento alla pagina di manuale. o
Campo if Signicato input lter, indica il ltro da applicare a tutti i le immessi sulla coda prima di inviarli alla stampante, ` quello che permette le conversioni e di formato, prende come valore il pathname al programma da usare come ltro, che deve leggere i dati dallo standard input e riemettere il risultato del ltraggio sullo standard output. log le, le su cui vengono registrati tutti gli errori del sistema, prende come valore un pathname. account file, le su cui viene registrato il rendiconto delle pagine stampate, prende come valore un pathname. line printer, le di dispositivo su cui ` situata la stampante (o pipe cui e pu` essere inviato il le da stampare), prende come valore il relativo o pathname. dimensione massima della pagina da stampare, da specicare in byte come valore numerico. page lenght, lunghezza della pagina in righe, da specicare come valore numerico. page width, larghezza della pagina in caratteri, da specicare come valore numerico. remote machine, nome della macchina remota cui inviare le stampe, da specicare come stringa contentente lhostname o lindirizzo IP (in notazione dotted decimal). remote printer, nome della coda di stampa su una macchina remota, da specicare come stringa. spool directory, nome della directory dove vengono mantenuti i le da stampare presenti nella coda. suppress header, sopprime la stampa delle intestazioni, ` un valroe e logico. Tabella 3.9: I principali campi di /etc/printcap.

lf af lp

mx pl pw rm

rp sd sh

Nel caso di LPRng il demone lpd viene controllato anche da altri due le di congurazione, usualmente mantenuti, insieme a tutti gli altri le del sistema, in /etc/lprng. Il primo le, lpd.conf, contiene la congurazione generale del demone, ma dato che tutti i valori sono ad un default corretto di norma questo non deve essere modicato. Si pu` usare questo le per specicare valori di default validi in generale per i parametri di o /etc/printcap, ma la sintassi prevede che il le contenga lassegnazione di un parametro per ogni riga (al solito righe vuote e tutto quello che inizia per # viene ignorato) anzich separati da e :. I parametri hanno gli stessi nomi usati in /etc/printcap, e lassegnazione, oltre alle modalit` previste per questultimo, prevede anche quella di utilizzare il carattere @ per identicare a un valore logico. Il le permette inoltre di specicare una serie di congurazioni generali del demone usando delle opportune direttive che non corrispondono a nessun parametro di printcap, ad esempio con la direttiva lockfile si specica la locazione del le di lock utilizzato per indicare la presenza di un demone che gira nel sistema, con printcap_path si indica la posizione di default del le printcap, mentre con la direttiva include si possono includere altri le. Al solito si rimanda alla pagina di manuale, accessibile con man lpd.conf, per i dettagli e lelenco completo delle direttive. Il secondo le di congurazione di lpd ` lpd.perms che viene utilizzato per il controllo degli e accessi. Questa ` la pi` grossa dierenza con il sistema di stampa di BSD classico, questo infatti e u utilizza semplicemente il le /etc/hosts.lpd (alternativamente viene usato, se presente, anche

138

CAPITOLO 3. LA CONFIGURAZIONE DEI SERVIZI DI BASE

host.equiv) per indicare le macchine da cui ` consentito collegarsi per stampare da remoto, e mentre con LPRng nessuno di questi le viene utilizzato. Al solito righe vuote e tutto quello che segue un # viene ignorato, se si deve usare questultimo carattere in una congurazione lo si deve pertanto proteggere con una barra inversa \. Il le contiene una serie di direttive tutte nella forma: ACCEPT [[not] chiave = valore[,valore]* ]* REJECT [[not] chiave = valore[,valore]* ]* DEFAULT ACCEPT DEFAULT REJECT dove con le parenteis quadre seguite dallasterisco si intende che una combinazione pu` essere o ripetuta pi` volte (per specicare ulteriori condizioni). u Le direttive REJECT e ACCEPT specicano, come il nome rende evidente, se accettare o meno un certo accesso sulla base della condizione espressa di seguito; il controllo dei permessi viene fatto usando un insieme di chiavi il cui valore viene confrontato con quanto specicato nel le, luso della direttiva DEFAULT serve a stabilre cosa succede quando non sono state specicate condizioni.
Valore P R C M Q S U X Signicato capacit` di inviare alla stampante il contenuto della coda. a richiesta di lpr da un host remoto. richiesta di controllo remoto tramite lpc. richiesta di rimozione di una stampa tramite lprm. richiesta di elencazione delle stampe tramite lpq. richiesta dello stato dello spool di stampa con lpc. operazione amministrativa di un utente. connessione remota.

Tabella 3.10: Valori del campo SERVICE in lpd.perms.

La chiave pi` importante ` SERVICE, che permette di classicare il tipo di richiesta di accesso, u e quando non la si specica si intende applicare la condizione seguente a qualunque tipo di accesso; questa pu` prendere uno o pi` dei valori identicata da una lettera, i cui valori p[ossibili, e o u relativo signicato sono riportati in tab. 3.10.
Valore REMOTEHOST REMOTEPORT REMOTEUSER SERVER LPC PRINTER USER HOST SAMEUSER SAMEHOST FORWARD Signicato lista degli IP da cui accettare connessioni remote (indicato alternativamente come REMOTEIP). porta da cui viene eettuata la connessione (indicata alternativamente come PORT). utente da cui proviene la richiesta di accesso. vera quando la richiesta ` locale. e per le richieste di controllo specica quali dei comandi di lpc possono essere eseguiti nome della stampante (o meglio della coda) cui viene richiesto laccesso. utente cui appartiene la stampa richiesta (denita per le operazioni su stampe esistenti). macchina da cui ` stato inserito la stampa richiesta (denita per le e operazioni su stampe esistenti). la richiesta proviene dallo stesso utente cui appartiene la stampa (denita per le operazioni su stampe esistenti). la richiesta proviene dalla stessa macchina da cui ` stato inserito la e stampa (denita per le operazioni su stampe esistenti). equivalente a NOT SAMEHOST

Tabella 3.11: Principali chiavi per le restrizioni di accesso in lpd.perms.

3.5. IL SISTEMA DI STAMPA

139

Tutte le chiavi partono con un valore nullo, ma ad ogni richiesta di accesso alcune di esse (a seconda del tipo di accesso) vengono inizializzate con i valori relativi ai parametri della richiesta, che poi saranno confrontati con le condizioni indicate allinterno di lpd.perms. In tab. 3.11 si sono riportate le principali chiavi ed il relativo signicato, per un elenco dettagliato si pu` fare o riferimento alla pagina di manuale accessibile con man lpd.perms. Il le esprime sempre un elenco di condizioni, che vengono controllate sequenzialmente, quando una di queste viene vericata gli ulteriori controlli vengono evitati. Un esempio di lpd.perms, estratto dalla versione installata su una Debian Sid, ` il seguente: e
REJECT NOT SERVER ACCEPT SERVICE=C SERVER REMOTEUSER=root ACCEPT SERVICE=C LPC=lpd,status,printcap REJECT SERVICE=C ACCEPT SERVICE=M SAMEHOST SAMEUSER ACCEPT SERVICE=M SERVER REMOTEUSER=root REJECT SERVICE=M REJECT SERVICE=R FORWARD DEFAULT ACCEPT

In questo caso la congurazione si apre vietando ogni accesso che non sia locale. Dopo di che viene consentito, con le regole per il servizio C, solo a root di controllare il demone con lpc in maniera completa, mentre per chiunque altro viene consentito (con la direttiva LPC) di utilizzare solo i comandi in essa elencati. Per quanto riguarda invece la capacit` di cancellare a un le (il servizio M) lo si permette solo a richieste provenienti dallo stesso utente e dalla stessa macchina, o in maniera generica allamministratore. Si elimina poi possibilit` di connettersi da a qualunque altra macchina che non sia quella locale.

3.5.4

Il Common Unix Printing System

Un approccio completamente nuovo e diverso rispetto a quello di LPD ` quello realizzato da e CUPS (acronimo di Common Unix Printing System), che realizza tutta linterfaccia al sistema di stampa attraverso un apposito servizio (in genere posto sulla porta 631) con cui si comunica via rete usando il protocollo HTTP. Rispetto ad un server HTTP per` un server CUPS prevede o una comunicazione con caratteristiche speciche che sono state standardizzate nellRFC 3239 in cui ` denito il protocollo IPP, acronimo di Internet Printing Protocol. e Luso di un protocollo di rete che ` comunque basato su HTTP ha il grande vantaggio che con e CUPS buona parte dellamministrazione del sistema di stampa, come la creazione il controllo e la rimozione di stampe e code di stampa o la congurazione delle stampanti, pu` essere eseguita o direttamente tramite un browser qualunque, che baster` puntare sulla porta 631 della macchina a da amministrare, e questa resta la modalit` principale, anche se ` possibile usare degli opportuni a e comandi di shell per eseguire gli stessi compiti. Il servizio ` fornito da un demone, cupsd, che ` controllato da un le di congurazione, e e cupsd.conf, che di norma viene installato in /etc/cups. Questo ` il le congura il servizio nel e suo insieme, come dicevamo infatti la gestione di stampanti, code e stampe avviene attraverso linterfaccia che il servizio mette a disposizione. Il formato del le ` simile a quello del le di e 38 la maggior parte sono una serie di direttive elementari nella forma: congurazione di Apache; NomeDirettiva valore dove il nome della direttiva ` composto da normali caratteri, e il valore viene specicato di e seguito separato da uno spazio; al solito righe vuote o inizianti per un # vengono ignorate.
38

il server web pi` diuso, che tratteremo in sez. ??. u

140

CAPITOLO 3. LA CONFIGURAZIONE DEI SERVIZI DI BASE

Con la direttiva Port si pu` specicare la porta su cui il servizio si pone in ascolto; una o delle caratteristiche pi` interessanti di CUPS per` `l a sua capacit` di riconoscere automaticau oe a mente le stampanti presenti su una rete (il cosiddetto browsing). Questa funzionalit` ` attivata ae di default (ma pu` essere disattivata impostando ad off la direttiva Browsing) e pu` essere o o controllata con la direttiva BrowseAddress per indicare lindirizzo 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 riutate.
Direttiva AccessLog BrowseAddress BrowseAllow BrowseDeny Browsing DataDir DefaultCharset DocumentRoot ErrorLog Group Include LogLevel PageLog Port Printcap Signicato il le su cui vengono registrati gli accessi; richiede come valore il nome del le o la parola chiave syslog che invia le informazioni allomonimo servizio. indirizzo di broacast 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 le su cui vengono registrati gli errori; richiede come valore il nome del le 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 le nella congurazione. livello dei messaggi da parte del demone. il le su cui vengono registrati i dati sulle pagine stampata; richiede come valore il nome del le o la parola chiave syslog che invia le informazioni allomonimo servizio. specica la porta su cui si pone in ascolto il demone cupsd (il default ` 631). e specica su quale le riprodurre un le printcap che faccia da sostituto per /etc/printcap per i programmi che necessitano di questultimo per riconoscere le code di stampa. specica la directory radice per il demone cupsd, di default ` /etc/cups. e la directory in cui inserire i le temporanei, in sostanza lo spool di stampa (di default ` /var/spool/cups/tmp). e utente per conto del quale viene eseguito cupsd (di default lp). numero massimo di copie che un utente pu` richiedere, il default ` 0 e signica nessun o e limite. numero massimo di stampe in coda, il default ` 0 e signica nessun limite. e numero massimo di stampe per utente, il default ` 0 e signica nessun limite. e Tabella 3.12: Principali direttive per il le /etc/cups/cupsd.conf.

ServerRoot TempDir User MaxCopies MaxJobs MaxJobsPerUser

In tab. 3.12 sono riportate le pi` importanti direttive elementari di /etc/cups/cupsd.conf, u per lelenco completo con una descrizione sommaria si pu` fare riferimento alla pagina di mao nuale; inoltre in genere le distribuzioni installano una versione predenita di questo le in cui tutte le opzioni (anche quelle non attivate esplicitamente) sono abbondantemente commentate. Per una documentazione completa invece si pu` fare riferimento ai manuali on-line direttamente o accessibili attraverso linterfaccia del sistema (unaltro 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, cupsd.conf prevede la presenza di direttive con una sintassi pi` complessa; in particolare queste sono quelle usate eettuare il controllo degli u accessi allinterfaccia di rete fornita da cupsd con cui ` possibile gestire il controllo del sistema e di stampa attraverso il protocollo IPP. Queste direttive sono in genere specicate in coda al le, ed hanno una forma diversa, del tipo: <Location /percorso>

3.5. IL SISTEMA DI STAMPA DirettivaAccesso1 valore1 DirettivaAccesso2 valore2 ... </Location>

141

Una direttiva Location viene utilizzata per identicare quella che si chiama una collocazione; laccesso alle varie funzionalit` del sistema di stampa via IPP viene infatti gerarchizzato in una a struttura ad albero analoga a quella dei le, 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.13: I percorsi per laccesso alla gestione delle operazioni denibili allinterno di una collocazione.

Specicando un percorso a partire da detta radice si possono denire le propriet` di accesso a per insiemi sempre pi` ristretti di operazioni. I principali percorsi utilizzabili in una collocazione u sono illustrati in tab. 3.13; per lelenco completo si pu` fare riferimento alla documentazione in o linea di CUPS. Una volta che con la scelta di un percorso nella direttiva Location si ` denito a quale e classe di operazioni si vuole che siano applicate le regole di accesso, queste ultime devono essere specicate allinterno della collocazione stessa; questo viene fatto attraverso una serie di ulteriori direttive, speciche 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.
Direttiva Order Signicato Denisce la modalit` con cui vengono gestite le autorizzazioni con le direttive Deny e a 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. denisce 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 specicato con la direttiva SystemGroup), Group che richiede che lutente appartenga al gruppo denito dalla direttiva AuthGroupName. denisce le modalit` di autenticazione, prende come valori: None che non eettua a nessuna autenticazione, Basic che eettua lautenticazione usando e credenziali standard della macchina, Digest e BasicDigest che utilizzano le credenziali speciche 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. nega laccesso, usa gli stessi valori appena descritti per Allow. abilita la cifrature della connessione, prende come valori: Never, IfRequested, Required il cui signicato ` autoesplicativo. e Tabella 3.14: Le direttive di accesso usate in una collocazione.

AuthClass

AuthType

Allow

Deny Encryption

Una collocazione prevede sempre la presenza di una direttiva Order (posta per chiarezza come prima direttiva al suo interno), che denisce la politica di accesso: se laccesso ` consentito e

142

CAPITOLO 3. LA CONFIGURAZIONE DEI SERVIZI DI BASE

per default si utilizza il valore Allow,Deny, mentre se ` vietato si utilizza il valore Deny,Allow. e 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` di autenticazione. I valori utilizzabili per queste direttive sono riportati a in tab. 3.14, 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` fare nuovamente riferimento alla o 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, ` il seguente: e
DefaultCharset notused LogLevel info Printcap /var/run/cups/printcap Port 631 <Location /> 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 congurazione lato server ` possibile specicare una congurazione generale sul e lato client (per tutti i programmi cio` che si appoggiano a CUPS per la stampa), che viene e mantenuta a livello di sistema nel le /etc/cups/client.conf, e pu` essere personalizzata dal o singolo utente in un le .cupsrc nella propria home directory. In genere le direttive principali che si utilizzano in detti le 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.14 per il server, che indica la modalit` con cui eseguire a una eventuale cifratura della connessione. Come accennato anche se la gran parte della gestione e della congurazione del sistema di stampa viene gestita attraverso linterfaccia web fornita da CUPS ` comunque possibile utilizzare e anche una serie di comandi di shell; il primo di questi ` lpadmin, che ` quello che si pu` utilizzare e e o per denire le propriet` generali delle stampanti presenti nel sistema. Il concetto di base ` quello a e 39 cui fare sempre riferimento con lopzione -p seguita dal di denire delle stampanti logiche, 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 identicarla con -p occorrer` anche denire con a 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` una stringa nella forma di un e indirizzo simile a quello di un sito web, che indica con quale modalit` ` possibile raggiungere ae la stampante stessa (se sulla porta parallela, seriale, USB, o via rete secondo vari protocolli di comunicazione), un breve elenco di possibili valori ` riportato in tab. 3.15. e
le si chiamano cos` in quanto si possono associare pi` stampanti logiche ad una stessa stampante sica, una u stampante logica ha una rozza equivalenza alla coda di stampa vista per LPD.
39

3.5. IL SISTEMA DI STAMPA


Nome ipp://remote.printer.ip smb://remote.printer.ip lpd://remote.printer.ip parallel:/dev/lp0 usb:/dev/lp0 serial:/dev/lp0 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.

143

Tabella 3.15: Le diverse possibili specicazioni per gli indirizzi del dispositivo associato ad una stampante (device-URI ).

Oltre a denire come si pu` parlare con la stampante ` necessario anche specicare quale o e linguaggio usare, questo si fa con lopzione -P che associa alla stampante logica il relativo le PPD (PostScript Printer Description) che ne descrive le capacit`; questo ` un po lequivalente a e del ltro di stampa, in quanto serve a denire quali sono le modalit` con cui alla ne i le a vengono stampati. Una delle caratteristiche pi` interesanti di CUPS ` quella di permettere di denire delle classi u e di stampanti, in sostanza una classe denisce un gruppo di stampante che pu` essere trattato o come un insieme, cos` che indicando di stampare su quella classe la stampa viene eettuta su una delle stampanti che ne fanno parte. La denizione 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 dipositivo da usare per parlare con la stampante (secondo il formato illustrato in tab. 3.15). denisce il le 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.16: Principali opzioni del comando lpadmin.

Le principali opzioni del comando sono riportate in tab. 3.16; al solito si pu` fare riferimento o alla pagina di manuale o alla documentazione di CUPS per un elenco completo e per la descrizione dettagliata. Una volta denita una stampante logica questa pu` essere abilitata o disabilitata alla stampa o 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 ` stata disabilitata (che sar` riportata dai comandi diagnostici). e a Si tenga presente comunque che abilitare o disabilitare una stampante logica signica sostanzialmente abilitare o disabilitare lesecuzione delle stampe su di essa, e che questa ` una e operazione diversa rispetto a quella di accettare o riutare 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 signicato. Il comando per richiedere una stampa ` invece lp (anche se il sistema supporta luso di lpr e

144

CAPITOLO 3. LA CONFIGURAZIONE DEI SERVIZI DI BASE

con la stessa sintassi vista in sez. 3.5.2), che prende come argomento il le da stampare, e lo invia sulla stampante di default riportando a video un identicatore 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 specica occorre specicarla come parametro per lopzione -h. Altre due opzioni utili sono -n che permette di specicare il numero di copie da stampare e -q che permette di impostare una priorit` (un numero da 1 a 100, con valore di default pari a 50). Le opzioni principali sono a riportate in tab. 3.17, per lelenco completo ed i dettagli si pu` fare riferimento alla pagina di o manuale.
Opzione -E -d -h -i -n -q -H Descrizione forza una comunicazione cifrata col server. specica la stampante o la classe da usare. specica la macchina remota cui inviare la stampa. specica la stampa su cui operare. specica il numero di copie da stampare. specica una priorit`. a specica quando eseguire una stampa: hold la blocca indenitamente, 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 identicare la stampa cui si fa riferimento). specica quali pagine stampare (passati come lista separate da virgole o intervalli separati da -).

-P

Tabella 3.17: Principali opzioni del comando lp.

Per cancellare una stampa si pu` invece usare il comando cancel, che prende come argomento o lidenticatore della stampa, o se specicato, 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 sigicato di lp; al solito per i dettagli si faccia riferimento alla pagina di manuale. Inne per ottenere informazioni riguardo il sistema di stampa ci sono due comandi, il primo ` lpinfo che permette di vedere i dispositivi sici ed i supporti per le stampanti disponibili e 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` eseguire o il comando:
monk:~# 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 ` lpstat che riporta le informazioni relative alle singole stampanti, classi e e stampe attive. Il comando usa le opzioni -E e -h con lo stesso signicato visto in tab. 3.17. Lopzione -c richiede la stampa delle informazioni relative ad una classe (o a tutte se non si specica 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

3.5. IL SISTEMA DI STAMPA

145

una stampante logica da interrogare, e riportano lo stato di tutte quelle denite se questa non viene specicata. Ulteriori dettagli sul comando e lelenco completo delle opzioni si trovano al solito sulla pagina di manuale

146

CAPITOLO 3. LA CONFIGURAZIONE DEI SERVIZI DI BASE

Capitolo 4

Amministrazione ordinaria del sistema


4.1 Archiviazione e backup

Una delle attivit` fondamentali della amministrazione di un sistema ` quella dei backup. In a e questa sezione prenderemo in esame i programmi per la gestione degli archivi di dati, per la gestione dei backup e la duplicazione dei dati dei dispositivi. Tratteremo le modalit` con cui si a possono eseguire i backup sia di le e directory che di interi lesystem.

4.1.1

Criteri generali per il backup

Quella dei backup ` probabilmente la principale attivit` di ogni sistemista. Nel mondo delline a formatica i dati sono il principale prodotto del lavoro svolto, e la perdita degli stessi signica spesso la perdita di grandi quantit` di ore di lavoro. Per questo motivo occorre prendere le a opportune misure per assicurarsi contro questa evenienza, ed il backup ` la principale di queste e misure. Ci possono essere varie ragioni per cui si possono perdere dei dati, in generale si tende a classicarle in quattro categorie diverse: disastri naturali, attivit` umane, errori del software e a guasti dellhardware; ciascuna di queste comporta rischi specici ed opportune contromisure. Oggi lhardware tende ad essere sucientemente adabile, ci` non di meno i guasti contio nuano ad esserci, e la sfortuna ` in agguato per farli avvenire nel peggior momento possibile. e In genere in questo caso i dispositivi pi` critici sono gli hard disk, che per quanto ben costruiti u hanno una loro fragilit` meccanica e sono comunque dispositivi basati sulla lettura di campi a magnetici di bassissima intensit`, per cui il rischio di malfunzionamento, per quanto ridotto, a non ` trascurabile. Nel caso dei dischi una possibile assicurazione contro il malfunzionamento ` e e quello delluso del RAID (vedi sez. 6.1), ma questo copre soltanto un caso particolare di guasti dellhardware. Al contrario dellhardware ladabilit` del software non sembra subire particolari miglioraa menti, ed un programma solido, adabile e sicuro ` sempre un caso piuttosto raro, ed inoltre e ladabilit` di un singolo programma ` relativamente inutile se un altro va a sovrascrivere per a e errore i suoi dati. In questo la struttura di un sistema Unix, con la separazione dei privilegi, e luso di utenti distinti pu` essere di aiuto, ma di nuovo non ` la soluzione al problema di o e eventuali perdite di dati. Ladabilit` delle persone ` sempre una variabile dicile da quanticare, sia in termini a e delle competenze che riducano la eventualit` di errori nelle operazioni (che per` possono sempre a o accadere anche al pi` esperto degli amministratori) sia nelladabilit` personale diretta in caso u a 147

148

CAPITOLO 4. AMMINISTRAZIONE ORDINARIA DEL SISTEMA

di eventuali azioni dolose che possono causare, direttamente o indirettamente, la distruzione di dati o il danneggiamento dei relativi supporti. Per quanto riguarda i disastri naturali, ed eventualit` remote ma completamente distruttive a di ogni tipo, occorre sempre valutare quanto la distruzione completa dei propri dati allinterno di un evento catastroco possa incidere in termini di perdite complessive e determinare se vale la pena di prevedere delle contromisure speciche per tali evenienze (che spesso comportano un discreto aggravio di spese sia in termini di attrezzature che di gestione). Come accennato, mantenere dei backup ` la strategia pi` semplice ed ecace per proteggersi e u 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, il costo della perdita si riduce semplicemente a quello del ripristino degli stessi da backup, e non della ricreazione da zero degli stessi. Perch questa strategia sia ecace comunque occorre che i backup siano eettuati in maniera e appropriata; come ogni altra cosa del mondo reale infatti essi possono fallire e al solito tenderanno a farlo nel peggior modo e momento possibili, per cui potreste trovarvi senza disco e scoprire che un nastro ` illeggibile, o che vi siete dimenticati di inserire nel backup alcune informazioni e essenziali, o che lunica unit` a nastro in grado di rileggere i vostri backup si ` rotta pure lei. a e Per questo motivo nelleettuare dei backup il primo punto ` quello di mettere a punto e una opportuna strategia. Ci sono infatti parecchie variabili da tenere sotto controllo, come la quantit` di dati che si vogliono mettere sotto controllo, la frequenza dei backup, il periodo che a si intende coprire con il backup, il mezzo utilizzato, le modalit` di gestione degli stessi. a In genere un primo passo ` quello di denire cosa si intende inserire nel backup: ad esempio e non ` quasi mai strettamente indispensabile eettuare un backup dei programmi di sistema, se e non nel caso in cui una reinstallazione da zero non comporti un carico di lavoro eccessivo, mentre pu` essere importante salvare delle congurazioni ottenute come risultato nale di parecchie ore o di lavoro. Sono senzaltro da salvare tutti i dati di sistema, gli archivi della posta e del database e del web, e quantaltro non ` replicabile in maniera automatica, insieme ai dati personali dei e 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 ` necessario salvare quelli di e /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 eettuano 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, quando invece nella pratica il caso pi` comune di recupero di dati u da un backup ` proprio quello di vecchi dati cancellati inavvertitamente, che qualora fossero gi` e a assenti alla data dellultimo backup disponibile sarebbero irrimediabilmente perduti. Questo comporta che deve essere determinata la frequenza con cui si vogliono eettuare 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 congurazioni 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 ` il tempo che occorre a creare il backup, dato che se questo dovesse eccedere il periodo fra due e 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. Inne 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 cancellazioni accidentali passate inosservate, o se si vuole mantenere una storia completa per ragioni di archiviazione. Ovviamente pi` lungo sar` il periodo, pi` risorse dovranno essere utilizzate nella u a u manutenzione dei backup.

4.1. ARCHIVIAZIONE E BACKUP

149

Per limitare loccupazione di risorse ed i tempo di esecuzione dei backup viene in aiuto la possibilit` di eettuare i cosiddetti backup incrementali, dei backup cio` in cui si archiviano solo a e i le che sono stati modicati rispetto ad un backup precedente. In questo modo ` possibile e ricostruire la situazione ad un dato istante senza dover registrare tutte le volte linsieme completo dei dati. Ai vantaggi in risparmio di tempo di esecuzione e di utilizzo delle risorse corrispondono per` degli svantaggi: anzitutto si complica la procedura di recupero (che necessiter` di un o a numero di passaggi crescente con il numero di backup incrementali coinvolti), ma soprattutto il fallimento di un backup incrementale render` inutilizzabili tutti quelli successivi basati su di a esso, per questo qualunque strategia di backup prevede comunque leettuazione periodica di backup completi. Unaltra decisione cruciale nella strategia di backup ` la scelta del supporto da utilizzare e per gli stessi. Le variabili in gioco sono il costo, ladabilit`, la velocit` e lutilizzabilit`. Il a a a costo incide direttamente sulla quantit` di dati che si possono salvare, per cui ` opportuno avere a e un mezzo poco costoso. Ladabilit` invece ` fondamentale, dato che un backup inadabile a e ` assolutamente inutile, ma ladabilit` dipende anche dal tipo di problema che ci si trova ad e a arontare, in genere i dischi sono molto adabili, ma non sono adatti come mezzi di backup in quanto stanno nello stesso computer dei dati originali che pu` andare distrutto, danneggiato o o 1 La velocit` ` senzaltro utile, ma diventa cruciale solo qualora un mezzo troppo manomesso. ae lento rendesse impossibile eettuare i backup con la frequenza necessaria. Lutilizzabilit` viene a spesso data per scontata, ma occorre invece riettere su quanto possa essere pericoloso avere uno splendido sistema di backup perfettamente funzionante, che funziona per` solo con una vecchia o scheda hardware fuori produzione. Tenendo conto di tutte queste caratteristiche alla ne i supporti pi` utilizzati per i backup u sono usualmente i nastri. I CD-R infatti, bench funzionali e poco costosi, hanno dei grossi e problemi di stabilit` nel lungo periodo, i oppy hanno capacit` ridotta e scarsa adabilit`, a a a mentre i vari tipi di dischi rimuovibili presentano in genere un costo troppo elevato con capacit` a insucienti. In genere inoltre si utilizzano unit` a nastro SCSI, dato che questa interfaccia ha a dimostrato di mantenersi utilizzabile nel tempo, anche in presenza di nuove tecnologia per le schede. Oltre alla scelta dei supporti una strategia di backup deve comunque anche prevedere la denizione delle modalit` di conservazione degli stessi. Ad esempio pu` non essere troppo a o saggio tenere i propri supporti in un armadio nel corridoio, sotto una vecchia tubatura del riscaldamento. Inoltre qualunque sia la modalit` di stoccaggio utilizzata occorre anche prevedere a veriche periodiche del funzionamento dei backup (eettuando dei ripristini di controllo), dato che accorgersi che qualcosa ` andato storto nel momento del bisogno non ` molto simpatico.2 e e A titolo di esempio una strategia comunemente utilizzata ` quella di eettuare backup incree mentali a frequenza giornaliera, intervallati da backup completi a cadenza settimanale o mensile, archiviando i backup mensili per un periodo di tempo pi` o meno lungo a secondo delle esigenze u storiche che si possono avere.

4.1.2

Il comando tar

Il comando pi` usato per la gestione di archivi di le ` tar, chiamato cos` dallinglese Tape u e ARchive dato che il comando ` nato apposta per archiviare i le su nastro magnetico. Al di l` e a del suo uso per la creazione di archivi, tar ` anche il programma pi` diuso per la distribuzione e u
ovviamente a questo fanno eccezione i dischi estraibili, ma questo comporta altri problemi, fra cui quello del costo che, dovendosi utilizzare dischi estraibili a caldo, ` solitamente molto alto. e 2 ` rimasto famoso lesempio di un sistemista coscenzioso che aveva accuratamente pianicato tutta la sua e 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 li del riscaldamento del sedile della macchina su cui appoggiava i nastri quando li portava al sito di stoccaggio.
1

150

CAPITOLO 4. AMMINISTRAZIONE ORDINARIA DEL SISTEMA

di pacchetti di software dai sorgenti (come vedremo in sez. 4.2.1). La caratteristica del comando ` che ` in grado di salvare (e ripristinare) il contenuto e la struttura di una certa directory e e e di tutto il suo contenuto, mantenendo invariate anche le caratteristiche speciche dei le (come permessi, proprietari, tempi, ecc.). Il comando tar supporta una grande variet` di opzioni ed argomenti, e la versione GNU ` a e stata dotata di una serie di ulteriori estensioni. In generale per` si possono distinguere le opzioni o del comando in due classi principali: quelle che indicano delle operazioni e quelle che specicano dei parametri. In ogni invocazione si pu` specicare non pi` di una operazione, mentre si pu` o u o avere un numero qualunque di parametri. Il comando ha tre operazioni principali, -c per creare un archivio, -t per vericarne 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 ` usata la sintassi delle opzioni in forma GNU, ma tar ` uno e e 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` sempre fare a meno di o utilizzare il - per specicare una opzione in forma breve.
Opzione --create --extract --list --concatenate --diff Signicato crea un nuovo archivio. estrae i le da un archivio. elenca i le contenuti in un archivio. aggiunge un archivio in coda ad un altro. confronta i membri di un archivio con la controparte sul lesystem e riporta ogni dierenza in dimensioni, permessi, proprietari e tempi. aggiunge le in coda allarchivio, ma solo se sono pi` u recenti della versione gi` presente nellarchivio o non sono a presenti in esso. aggiunge le in coda allarchivio. cancella i le da un archivio (questo non pu` funzionare o sui nastri). identica a --diff. identica a --extract.

-c -x -t -A -d

-u

--update

-r

--append --delete --compare --get

Tabella 4.1: Operazioni del comando tar.

Oltre alle operazioni tar supporta una enorme quantit` di opzioni che modicano il compora tamento del programma. Di queste ne esistono due di uso comune; la prima ` -v (o --verbose), e che aumenta la prolissit` del comando, facendogli stampare a video durante lesecuzione molte a pi` informazioni (ad esempio la lista dei le inseriti o estratti dallarchivio). E in genere possibile u aumentare ulteriormente la quantit` di informazioni stampate inserendo la stessa opzione una a seconda volta. La seconda ` -f (--file) che serve a specicare il nome del le da usare come archivio da e cui leggere o su cui scrivere; in generale, a meno di non specicare il le con -f il comando usa come default /dev/st0 o il primo dispositivo che riconosce come una unit` a nastri, per a evitare confusione ` pertanto opportuno specicare sempre esplicitamente il nome dellarchivio e con questa opzione. Come accennato per creare un archivio il comando necessita dellopzione --create o -c; in questo caso dovr` anche essere specicato con -f il nome del le su cui saranno archiviati i le, a di norma si utilizza anche lestensione .tar per identicare questi le. Date queste due opzioni il comando prende come argomenti una lista dei singoli le da archiviare, se per` fra questi si o inserisce una directory il comando archivier` anche il contenuto di questultima, e di tutte le a directory sottostanti. Ad esempio si possono archiviare alcuni le con:

4.1. ARCHIVIAZIONE E BACKUP

151

piccardi@anarres:~/Truelite/documentazione/corso$ tar -cvf dispense.tar *.tex Struttura.tex advadmin.tex config.tex corso.tex fdl.tex netadmin.tex netbase.tex netinter.tex ordadmin.tex ringraziamenti.tex shell.tex struttura.tex

e si noti come si sia usata anche lopzione -v per stampare la lista dei le archiviati; allo stesso modo si potr` archiviare tutta una directory con: a
piccardi@anarres:~/Truelite/documentazione$ tar -cvf dispense.tar corso corso/ corso/CVS/ corso/CVS/Root corso/CVS/Repository corso/CVS/Entries corso/images/ corso/images/CVS/ corso/images/CVS/Root corso/images/CVS/Repository corso/images/CVS/Entries corso/images/dir_links.eps corso/images/dir_links.dia ... corso/ordadmin.tex.~1.5.~ corso/netbase.tex corso/netinter.tex corso/dispense.tar corso/#ordadmin.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 le di destinazione viene sovrascritto, se si vuole invece aggiungere dei le ad un archivio preesistente occorre usare lopzione -r. Inoltre, a meno di non specicare un pathname assoluto, il le viene creato nella directory corrente, questo signica anche che se questultima ` inclusa nellarchivio tar si trover` ad e a arontare il problema di come archiviare larchivio stesso; il comando ` sucientemente scale tro da accorgersi di questa situazione ed evitare di inserire nellarchivio che sta creando il le dellarchivio stesso:
piccardi@anarres:~/Truelite/documentazione/corso$ tar -cf dispense.tar . tar: ./dispense.tar: file is the archive; not dumped

Una volta creato un archivio se ne potr` vericare il contenuto con -t (o --list); di nuovo si a dovr` utilizzare -f per indicare il le contenente larchivio che in questo caso sar` letto. Se non a a si passano altri argomenti il risultato sar` la stampa a video della lista di tutti i le contenuti a nellarchivio, anche senza la presenza dellopzione -v, specicando la quale si otterr` invece una a lista in formato esteso, analogo a quello di ls -l. Si pu` vericare la presenza di un singolo o le o di una lista passando come argomento il nome (o i nomi), si tenga presente per` che in o

152

CAPITOLO 4. AMMINISTRAZIONE ORDINARIA DEL SISTEMA

questo caso deve essere specicato il nome completo del le cos` come ` stato archiviato (quello e stampato dallopzione -v in fase di creazione), il confronto infatti viene eseguito solo nei termini della corrispondenza fra largomento ed il nome cos` questo viene visto nellarchiviazione. Per estrarre i dati inseriti in un archivio si deve utilizzare lopzione --extract o -x, di nuovo ` necessario specicare larchivio da cui si estraggono i le con -f. Come per la creazione e luso dellopzione -v permette di ottenere la lista dei le 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 specica nessun argomento il comando estrae il contenuto completo dellarchivio, ma ` possibile estrarre un singolo le fornendone il nome (o e se il pathname se questo ` collocato in una sottodirectory), quello che si pu` ottenere dalla lista e o fornita dallopzione -t. Si tenga presente inne che nellestrazione il comando ricrea i le con tutte le caratteristiche che essi avevano nel sistema su cui sono stati creati; questo signica anche che vengono mantenuti i permessi e utente e gruppo proprietario del le, utente e gruppo che nel sistema corrente possono non esistere o essere del tutto diversi. Di questo pu` essere necessario dover tenere conto quando o si estraggono degli archivi creati da altri (come quelli dei pacchetti sorgenti di cui parleremo in sez. 4.2). Inoltre dato che alcuni lesystem (come il vfat di Windows) non supportano la presenza di permessi, utenti e gruppi, il programma pu` lamentarsi dellimpossibilit` di ricreare o a questi attributi dei le; un altro errore che viene segnalato, in caso di impostazione sbagliata dellora di sistema, ` quando i le che vengono creati hanno dei tempi situati nel futuro. e

4.1.3

Il comando cpio

Un comando alternativo per la gestione dellarchiviazione di le e directory ` cpio, che permette e di estrarre ed inserire le in un archivio, per il quale ` anche in grado di usare lo stesso formato e usato da tar. A dierenza di tar per` prende sempre come argomento di ingresso una lista di o le. Il comando cpio ha tre modalit` operative, che devono essere sempre indicate ad ogni ina vocazione del programma. In modalit` copy-out il comando copia i le dentro larchivio; per a attivare questa modalit` deve essere specica lopzione -o o --create. Il programma legge una a lista di le dallo standard input e scrive larchivio risultante sullo standard output. Pertanto una invocazione tipica ` qualcosa del tipo: e cpio < lista_file > archivio ` uso comune generare la lista direttamente con luso di find. e In modalit` copy-in il comando estrae i le contenuti in un archivio o ne elenca il contenuto; a per attivare questa modalit` deve essere specicata lopzione -i o --extract. Larchivio viea ne letto dallo standard input, se non si specica nessuna opzione tutti i le vengono estratti, altrimenti tutti gli argomenti che non sono opzioni vengono considerati come pattern secondo la sintassi3 del lename globbing della shell (vedi sez. 2.1.4) e vengono estratti solo i le che corrispondono. Pertanto una invocazione tipica in questa modalit` ` del tipo: ae cpio < archivio In modalit` pass-through il comando copia dei le da una directory ad un altra, combinando a in sostanza le due modalit` copy-in e copy-out in un unico passo senza creare un archivio; per a attivare questa modalit` deve essere specicata lopzione -p o --pass-through. Il comando a legge la lista dei le da copiare dallo standard input e li copia nella directory che deve essere
con due eccezioni, vengono considerati validi come caratteri sui quali vericare una corrispondenza anche un . allinizio del le e il carattere /, cos` da considerare nella corrispondenza anche i le nascosti e intere sezioni di pathname.
3

4.1. ARCHIVIAZIONE E BACKUP

153

specicata come argomento non opzionale. Pertanto una invocazione tipica in questa modalit` a ` del tipo: e cpio < lista directory

Il comando, a parte quelle usate per specicarne la modalit` di operazione, supporta molte a altre opzioni. In particolare con -v si richiede una maggiore prolissit` nelle operazioni, con a la stampa dei nomi dei le che vengono processati; con -t si richiede di stampare la lista del contenuto di un archivio, con -A di aggiungere i le ad un archivio esistente (invece di sovrascriverlo).
Opzione -0 Signicato prende in ingresso una lista di stringhe terminate dal carattere NUL (generabili con find) per permettere larchiviazione di le il cui nome contiene un carattere di a capo. ripristina il tempo di ultimo accesso sui le appena letti perch non risultino tali. e ricrea le directory in cui si trovano i le (altrimenti questi verrebbero creati nella directory corrente). copia solo i le che non corrispondono al pattern specicato. permette di specicare un nome di le da usare come archivio al posto dello standard input o dello standard output. preserva i precedenti tempi di ultima modica quando ricrea i le in fase di estrazione. stampa la lista dei le contenuti nellarchivio. sovrascrive eventuali le gi` esistenti con quelli a dellarchivio senza chiedere conferma. stampa informazioni aggiuntive sui le che vengono processati dal comando (in combinazione con -t viene usato un formato analogo a quello di ls -l).

-a -d -f -F

-m -t -u -v

Tabella 4.2: Principali opzioni del comando cpio.

Lelenco delle principali opzioni ` riportato in tab. 4.2, in cui si sono tralasciate le tre opzioni e principali per selezionare le modalit` di operazione; al solito lelenco completo delle opzioni ` a e disponibile nella pagina di manuale accessibile con man cpio.

4.1.4

I comandi dump e restore

I comandi tar e cpio appena illustrati, vengono usati per archiviare i le presenti allinterno delle directory specicate, ma esistono comandi, come dump e restore che permettono di eettuare larchiviazione a livello di un intero lesystem. Il limite di un programma come dump ` che questo funziona solo per un lesystem che ne e supporti le operazioni salvando le informazioni necessarie. Questo nel caso di Linux ` vero e solo per il lesystem ext2 e la sua estensione journalled ext3. Inoltre per poter utilizzare questa funzionalit` occorre anche montare opportunamente il lesystem, e come accennato in sez. 1.2.4, a per questo il le /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 lesystem tramite fstab eettuando operazioni di backup dello stesso tramite dump saranno salvate le informazioni necessarie a ricostruire quali le sono stati cambiati da un backup allaltro, cos` da permettere dei backup incrementali. Il funzionamento del programma prevede la possibilit` 10 diversi livelli di dump, numerati da 0 a a 9, da specicare con le opzioni omonime (cio` -0, -1, ... -9), e se non specicato viene usato e il livello 9.

154

CAPITOLO 4. AMMINISTRAZIONE ORDINARIA DEL SISTEMA

Il livello 0 indica un backup completo, in cui si sono salvati tutti i le, e stabilisce un punto di partenza per tutti gli altri livelli. Un livello superiore richiede il salvataggio di tutti i le che sono cambiati dallultimo backup eettuato con un livello inferiore. Questo signica che un backup di livello 9 salver` sempre solo i le modicati dopo lultimo backup precedente. a Quindi per fare un esempio,4 se si esegue un backup con livello 2 seguito da uno di livello 4 si avranno in questultimo solo i le cambiati dal momento in cui si ` eseguito il precedente e backup di livello due; se poi si eseguisse un dump di livello 3 sarebbero salvati di nuovo tutti i le modicati 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 le modicati dopo il backup di livello 4. Questo permette di poter eseguire i backup incrementali in maniera eciente per ridurre al minimo sia il tempo di recupero che il numero di supporti utilizzati. Una possibile strategia di backup ` quella riportata nella pagina di manuale, in cui si fanno backup incrementali giornalieri, e usando un insieme di supporti da ruotare settimanalmente, ed un algoritmo di tipo torre di Hanoi modicato. A parte lopzione che ne specica il livello il comando richiede la presenza dellopzione -f seguita da un parametro che indica il le su cui eettuare il backup (in genere si usano unit` a a nastri, e cio` /dev/st0, ma si pu` specicare un le ordinario o usare - per indicare lo e o standard output), e prende come argomento il mount point del lesystem di cui si vuole eseguire il backup.5 Oltre quelle citate dump prende numerose altre opzioni molte delle quali sono relative alla gestione dei nastri su cui usualmente vengono salvati i backup, si sono riportate le principali in tab. 4.3, per lelenco completo si pu` al solito fare riferimento alla pagina di manuale. o
Opzione -D Signicato permette di cambiare il le su cui viene mantenuta linformazione relativa ai precedenti backup (completi o incrementali) che di solito ` /var/lib/dumpdates. e esclude dal backup una lista di inode (vedi sez. 1.2.1) passati per numero. esclude una lista di inode elencati nel le specicato come parametro. scrive il backup sul le passato come parametro, si possono specicare pi` le separandoli con virgole, e saranno u considerati come volumi successivi. usa la stringa passata come parametro come etichetta del backup. abilita il salvataggio multivolume (in cui si usa -f per specicare pi` di un volume di backup). u aggiorna il le /var/lib/dumpdates che contiene la tabella in cui sono scritte i lesystem per i quali e le date in cui sono stati eettuati i backup, e a quale livello. aumenta la prolissit` del comando facendogli stampare a a video pi` informazioni riguardo le operazioni correnti. u

-e -E -f

-L -M -u

-v

Tabella 4.3: Principali opzioni del comando dump.

Il comando che permette di recuperare i dati archiviati con dump ` restore, che esegue e esattamente il compito inverso, e come dump usa lopzione -f per indicare il le (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` di operazione. Le principali sono a -C che eettua un confronto fra i le passati come argomento e quelli sul backup, -i che porta
si suppone che prima si sia partiti con un dump di livello 0, un passaggio iniziale infatti ` sempre necessario. e in realt` si pu` anche specicare una directory contenente i le che si vogliono archiviare e non un mount a o point, in questo caso per` sono consentiti solo backup completi di livello 0 e tutto il contenuto della directory o deve risiedere nello stesso lesystem.
5 4

4.2. LA GESTIONE DEI PACCHETTI SOFTWARE

155

in modalit` interattiva (dove possono essere dati una serie di comandi, descritti nella pagina di a manuale), -r che permette di ricostruire un intero lesystem da zero, -t che verica se i le passati come argomento sono nel backup o stampa a video il contenuto integrale dello stesso se invocato senza argomenti, e -x che eettua 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 Signicato indica il le in cui ` stato memorizzato il backup. e esegue un confronto fra i le presenti nel lesystem e quelli nel backup. attiva la modalit` interattiva. a ricostruisce un intero lesystem da zero. presenta un elenco di le 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` di informazione durante a le operazioni.

Tabella 4.4: Principali opzioni del comando restore.

Come dump anche restore prevede numerose opzioni, parecchie delle quali servono a controllare propriet` relative alluso dei nastri, oltre a quelle brevemente spiegate in precedenza si a sono riportate in tab. 4.4 le pi` rilevanti; al solito tutti i dettagli e lelenco completo delle opzioni u (e dei comandi disponibili in modalit` interattiva) sono riportati nella pagina di manuale. a

4.2

La gestione dei pacchetti software

Aronteremo in questa sezione le varie modalit` in cui un amministratore pu` installare e rimuoa o vere software dal sistema, in particolare esaminando le funzionalit` di gestione automatizzata a dei pacchetti che permettono di tenere traccia di tutto quello che si ` installato nel sistema. e

4.2.1

Linstallazione diretta

Uno dei grandi vantaggi del software libero ` che avendo a disposizione i sorgenti dei programmi e che si usano ` sempre possibile eettuare una installazione diretta dei pacchetti software che ci e servono a partire da questi ultimi. In genere 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 norna li si trovano distribuiti in le che usano lestensione .tar.gz6 dato che il programma di compressione piu usato ` gzip; una alternativa e che si inizia a diondere per gli archivi pi` grandi ` quella delluso di bzip2 (che comprime u e molto di pi`, anche se ` pi` lento), nel qual caso lestensione usata ` .tar.bz2. u e u e Per installare un pacchetto dai sorgente la prima cosa da fare ` scaricarsi larchivio degli e stessi dal sito di sviluppo: ` consigliato usare, se ci sono, eventuali mirror, dato che questi di e norma sono meno occupati del sito originale, e probabilmente anche pi` vicini a voi e quindi u con una maggiore velocit` di accesso. Una volta scaricato il pacchetto se ne pu` vericare a o il contenuto o scompattarlo usando il comando tar usando la sintassi trattata in sez. 4.1.2. Pertanto se il nostro pacchetto software ` pacchetto.tar.gz lo si potr` decomprimere con tar e a
talvolta abbreviata in tgz, per luso di sistemi obsoleti che hanno problemi coi nomi di le che hanno troppi caratteri . al loro interno.
6

156

CAPITOLO 4. AMMINISTRAZIONE ORDINARIA DEL SISTEMA

-xvzf pacchetto.tar.gz; in genere questo crea nella directory corrente una sottodirectory (quella che conteneva i le sulla macchina in cui ` stato creato larchivio) con il contenuto e dellarchivio, che di solito ha lo stesso nome del pacchetto. A questo punto per linstallazione occorre eseguire le relative operazioni. Queste possono essere molto diverse da pacchetto a pacchetto; in genere chiunque distribuisce software fornisce anche le relative informazioni per linstallazione che si trovano insieme ai sorgenti del pacchetto nei le README o INSTALL. Se il pacchetto usa gli autotool GNU7 o segue la procedura di installazione standard tutto quello che c` da fare ` di entrare nella directory dove si ` scompattato il e e e contenuto della tarball ed eseguire la sequenza di comandi: ./configure make make install Il primo comando (./configure) esegue uno script di shell che verica che nel sistema sia presente tutto quello che serve per compilare il pacchetto. Questo ` il punto pi` critico della e u procedura, in quanto se manca qualcosa lo script si interromper` dicendo che non esiste il a supporto per quella funzionalit` o mancano i le di dichiarazione relativi ad una certa libreria a che serve al programma (o la libreria stessa). Uno dei problemi pi` comuni ` che, pur avendo installato una libreria, non si sono installati u e i le di dichiarazione che sono usati dal compilatore per poter accedere, quando compila il pacchetto, alle funzioni della stessa. In genere infatti, quando si installano pacchetti binari gi` a compilati, questi non sono necessari, e pertanto nella installazione standard di una distribuzione normalmente vengono tralasciati. In genere questi sono disponibili nei dischi di installazione come pacchetti con lo stesso nome delle librerie relative, estesi con un -dev. In questo caso quello che c` da fare ` installare questi pacchetti con il relativo meccanismo di gestione, secondo e e le modalit` che vedremo pi` avanti. a u Una volta che ./configure ha completato con successo le sue operazioni potremo eseguire il secondo comando nella sequenza, make. Questo ` un programma per la costruzione di altri e programmi, che usa meccanismo molto sosticato che permette di creare i le nella giusta sequenza. Il funzionamento di make va al di la di quanto sia possibile arontare qui, basti dire quello che si otterr` dal comando ` una lunga serie di linee di uscita da parte del compilatore, a e no a quando tutte le operazioni saranno completate ed i binari del pacchetto saranno stati creati. Se qualcosa va storto in questa procedura avete due strade, scrivere un bug report a chi ha creato il pacchetto (evitando troppi accidenti e fornendogli le righe in cui si ` vericato e lerrore) o provare a correggere lerrore voi stessi (ma dovete essere pratici di programmazione, nel caso probabilmente non starete a leggere questo manuale). A questo punto con make install si dice allo stesso programma di eseguire le istruzioni di installazione. Si tenga presente che ` la procedura standard prevede di installare i pacchetti e compilati dai sorgenti in /usr/local/, per cui per poterli utilizzare dovete avere le directory di questa gerarchia secondaria nel PATH (vedi sez. 2.1.4) ed essere in grado di usare le eventuali librerie installate dal pacchetto (secondo quanto vedremo in sez. 3.1.2). In questo modo ` possibile installare pacchetti generici, il problema di tutto ci`, oltre al tempo e o perso a compilare i programmi (che per pacchetti piccoli ` forse trascurabile, ma per pacchetti e importanti come il server X pu` essere, a seconda della potenza della macchina, dellordine delle o ore o dei giorni), ` che dovete ricordarvi di cosa avete installato, dove e quando, e che se installate e una nuova versione dovete vericare che la sovrapposizione non generi problemi. Inoltre se installare ` facile, ` pi` problematico disinstallare. Alcuni pacchetti (una minoranza e e u
un insieme di programmi che consente di usare delle procedure automatizzate per linstallazione controllando che sulla macchina sia presente tutto quello che serve per creare il pacchetto.
7

4.2. LA GESTIONE DEI PACCHETTI SOFTWARE

157

purtroppo) provvedono uno speciale bersaglio 8 per make che consente la disinstallazione con make unistall. Ma se questo non c` occorre tracciarsi a mano i le che sono stati installati e e cancellarli. Per questo, come vedremo nelle sezioni seguenti, gran parte delle distribuzioni utilizzano un sistema di gestione dei pacchetti che permette di tenere traccia di cosa si installa, di dove sono messi i le, per poi permettere una cancellazione pulita del pacchetto quando lo si vuole disinstallare.

4.2.2

La gestione dei pacchetti con rpm

Uno dei primi sistemi di gestione dei pacchetti, il RedHat Package Manager ` stato introdotto e dalla RedHat nella sua distribuzione; data la sua ecacia esso ` stato poi adottato da molte e altre distribuzioni, divenendo probabilmente il pi` diuso sistema di gestione automatizzata dei u pacchetti. Il RedHat Package Manager si basa su un programma, rpm, che serve a gestire linstallazione e la rimozione dei pacchetti, i quali sono distribuiti in le in un apposito formato, anchesso caratterizzato dalla estensione .rpm. In realt` RPM fa molto di pi` che installare e disinstala u lare. Il comando tiene traccia di ogni pacchetto installato e di dove ` stato installato, cos` pu` e o accorgersi se un pacchetto va in conitto con altri cercando di installare gli stessi le, inoltre ` in grado di eseguire degli script in fase di installazione e disinstallazione che permettono di e norma anche una congurazione automatica del pacchetto stesso. Il comando ` complesso e prende molteplici opzioni, come molteplici sono le funzionalit` che e a provvede. Le due opzioni pi` semplici sono -i che installa un pacchetto e -e che lo cancella. u Nel primo caso deve essere specicato il le .rpm che contiene il pacchetto, nel secondo caso il nome del pacchetto stesso. Se il pacchetto ` gi` installato si pu` usare -U che esegue lupgrade. e a o Inoltre con lopzione -q ` possibile eseguire una serie di interrogazioni sul database dei e pacchetti installati; se non si specica altro lopzione prende un nome di pacchetto di cui verica lesistenza, mentre con rpm -qa si ottengono tutti i pacchetti installati nel sistema. Se invece si usa -qf, seguito dal nome del pacchetto, si stampano i le in essi contenuti. Si pu` anche leggere o il contenuto di un pacchetto non installato con lopzione -qpf specicando il le dello stesso. Il comando prende molte altre opzioni, le principali delle quali sono riportate in tab. 4.5, la descrizione dettagliata del comando con lelenco completo delle opzioni sono al solito disponibili nella relativa pagina di manuale.
Opzione -i -U -e -q -qa -ql -qf -V -K -v -h Signicato Installa il pacchetto. Esegue lupgrade del pacchetto. Rimuove il pacchetto. Interroga il database per la presenza di un pacchetto. Stampa tutti i pacchetti installati. Stampa i le contenuti in un pacchetto. Stampa il pacchetto che contiene un le. Verica lo stato di un pacchetto. Verica la rma digitale di un pacchetto. Stampa pi` informazioni nellesecuzione delle operazioni. u Stampa una barra di progressione. Tabella 4.5: Principali opzioni del comando rpm.

Una delle funzionalit` pi` importanti di un gestore di pacchetti ` quella di essere in grado a u e
si chiamano cos` dallinglese target, glii argomenti che di norma si passano a make e che normalmente indicano , quali delle varie sezioni di comandi di costruzione e installazione devono essere usati; non specicare nulla usa il primo dei target disponibili, che esegue di norma il compito principale, di solito ne esistono anche degli altri, uno comune ad esempio ` clean che serve a cancellare i risultati della compilazione per riportare la directory del e pacchetto nelle condizioni iniziali precedenti alla costruzione dello stesso.
8

158

CAPITOLO 4. AMMINISTRAZIONE ORDINARIA DEL SISTEMA

gestire le cosiddette dipendenze di un pacchetto da un altro, deve cio` essere in grado di accorgersi e se per installare un certo pacchetto ` necessaria la presenza di un altro (ad esempio perch si possa e e usare un programma che usa linterfaccia graca dovr` prima essere installata questultima). a Nel caso in questione rpm ` in grado, sia pure in forma non troppo sosticata (il che porta a e quella situazione che viene chiamata dependency hell, quando un pacchetto dipende da unaltro che a sua volta dipende da una altro che a sua volta ... e cos` via) di avvisare lutente quali sono i le che devono essere gi` presenti nel sistema perch un certo pacchetto possa essere installato. a e In questo modo il programma permette di evitare di installare pacchetti che non funzioneranno a causa della mancanza di un qualche componente a loro essenziale. Il meccanismo per` si limita o a questo, sta allamministratore trovare, scaricare ed installare i pacchetti mancanti.

4.2.3

La gestione dei pacchetti di Debian

Uno dei pi` grandi vantaggi di Debian ` proprio il suo sistema di gestione dei pacchetti. Esso u e ` basato su un programma di gestione dei singoli pacchetti con funzionalit` analoghe a quelle e a di rpm, ma sopra di esso ` stata costruita una infrastruttura molto pi` complessa che rende e u estremamente semplice e funzionale la gestione dei pacchetti. I pacchetti Debian sono distribuiti in le con lestensione .deb ed usano un formato diverso rispetto agli RPM; il programma che permette di installare questi pacchetti ` dpkg, ed e ` sostanzialmente un analogo (in realt` cera da prima) di rpm, in quanto provvede le stesse e a funzionalit`: installa e rimuove pacchetti mantenendo un database dei pacchetti e dei relativi a le installati, provvede lesecuzione di script in fase di installazione e rimozione, ` in grado di e accorgersi di eventuali conitti con pacchetti gi` installati, e delle dipendenze da altri pacchetti, a pu` interrogare il database dei pacchetti e ottenere informazione sul loro contenuto. o Le opzioni principali del pacchetto sono -i che esegue linstallazione di un le .deb e -r che rimuove un pacchetto dal sistema. Inoltre con -l viene stampata la lista dei pacchetti installati (se non si specica nulla, se si specica un nome viene ricercata la presenza di un pacchetto con quel nome), con -L si stampa la lista dei le contenuti nel pacchetto e con -S quella dei pacchetti che contengono un le corrispondente alla stringa passata come parametro. Le altre opzioni principali sono riportate in tab. 4.6, 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 Signicato Installa il pacchetto. Rimuove il pacchetto. Interroga il database per la presenza di un pacchetto. Stampa i le contenuti in un pacchetto. Ricerca i pacchetti che contengono un le. 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.6: Principali opzioni del comando dpkg.

Bench ormai anche i .deb risultino piuttosto usati (dato che sono diventate parecchie le e distribuzioni basate su Debian) la loro diusione su internet come le a se stante ` piuttosto e ridotta. Questo avviene perch in realt` dpkg ` solo la parte di basso livello del sistema di e a e gestione dei pacchetti di Debian, ed ` piuttosto raro dover usare questo comando per installare e un pacchetto. Uno dei grandi vantaggi di questa distribuzione (e di quelle che usano il suo sistema di gestione) ` costituito dalla interfaccia di alto livello chiamata Advanced Package Tool, che permette e di cancellare completamente il problema delle dipendenze. I pacchetti Debian infatti sono organizzati per indicare in maniera coerente da quali altri pacchetti essi dipendono, diventa cos`

4.3. LA GESTIONE DI UTENTI E GRUPPI

159

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` che permette il download automatizzato degli stessi. a Il programma di gestione principale per i pacchetti non ` allora dpkg, ma apt-get, che serve e appunto da front-end per tutto il sistema dellAdvanced Package Tool. In una distribuzione Debian tutto quello che si deve fare ` mantenere una lista degli appropriati repository dei pace chetti nel le /etc/apt/sources.list. Un repository non ` altro che una directory (locale o e remota) che contiene i vari pacchetti e le relative informazioni organizzati in maniera opportuna. Baster` poter accedere a detta directory (cosa che pu` essere fatta in una molteplicit` di modi, a o a i principali dei quali sono via HTTP o via FTP). Una volta impostati i vari repository da cui si vogliono recuperare i pacchetti baster` eseguire a il comando apt-get update per scaricare la lista aggiornata dei pacchetti. A questo punto sar` possibile installare un pacchetto con il comando apt-get install nome, il programma a si incaricher` di eettuare automaticamente il download dello stesso, e di quelli necessari per a soddisfare eventuali dipendenze, ed installare il tutto. Inoltre in Debian ` stato pure creato un sistema generico per la auto-congurazione automae tica dei pacchetti (chiamato debconf ) che permette, una volta scaricati i pacchetti, di richiedere allutente tutte le informazioni necessarie per la congurazione degli stessi. Cos` oltre alla in stallazione viene anche eseguita la congurazione di base con la creazione dei relativi le, che nel 90% dei casi ` comunque tutto quello che c` da fare. e e Qualora si voglia rimuovere un pacchetto il comando ` apt-get remove nome, ed in questo e caso, se altri pacchetti dipendono da quello che si vuole rimuovere, il comando chiede conferma della volont` di rimuovere anche loro, ed in caso di conferma procede alla rimozione completa. a Inne il sistema consente una estrema facilit` di aggiornamento del sistema, basta infatti a usare il comando apt-get upgrade dopo aver usato apt-get update per ottenere linstallazione automatica delle eventuali nuove versioni presenti sul repository di tutti i pacchetti che sono installati nel sistema. Il comando per` non rimuove mai un pacchetto gi` presente dal o a sistema, anche quando questo pu` essere stato sostituito da un altro. Per risolvere questo tipo o di situazione (che si incontra di solito quando si passa da una versione di Debian ad un altra) si pu` usare il comando apt-get dist-upgrade che esegue una risoluzione intelligente dei conitti o ed ` in grado di eettuare lupgrade di pacchetti importanti a scapito di quelli secondari, che e possono essere disinstallati.
Opzione install remove clean update upgrade dist-upgrade autoclean Signicato Installa un pacchetto. Rimuove un pacchetto. Cancella larchivio dei pacchetti scaricati. Scarica la lista aggiornata dei pacchetti. Esegue lupgrade dei pacchetti aggiornati. Esegue lupgrade della distribuzione. Cancella dallarchivio i pacchetti con vecchie versioni.

Tabella 4.7: Principali opzioni del comando apt-get.

Le opzioni principali di apt-get sono riportate in tab. 4.7, lelenco completo, insieme alla descrizione dettagliata di tutte le caratteristiche del comando, ` al solito disponibile nella relativa e 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 modicarne le propriet` ed esamineremo quali sono a

160

CAPITOLO 4. AMMINISTRAZIONE ORDINARIA DEL SISTEMA

le modalit` con cui vengono mantenute allinterno del sistema le informazioni ad essi relative. a

4.3.1

Una visione generale

Dato che GNU/Linux ` un sistema multiutente abbiamo nora dato per scontato la presenza di e utenti che potessero utilizzarlo. In realt` la questione non ` aatto cos` immediata. Il kernel a e infatti supporta la presenza di utenti e gruppi associando a questi degli identicatori numerici che poi vengono usati nella gestione dei processi e dei le, 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. Perch questa sia eettuata per` occorrono le opportune informazioni che e o 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 perch questo accada, non solo occorrer`, come accennavamo in sez. 1.4.1, che un utente si e a identichi appropriatamente, ma dovranno anche essere identicate le risorse che gli si mettono a disposizione. Una delle parti pi` critiche dellamministrazione del sistema ` allora quella che permette u e di creare e mantenere le informazioni relative agli account degli utenti presenti, che dovranno contentere sia le informazioni necessarie allidenticazione 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 ` il nome che il sistema associa allutente, ed una password segreta la cui e conoscenza serve a dimostrare lautenticit` della propria identit`. Come accennato in sez. 1.4.1 a a il sistema prevede anche la presenza di gruppi di utenti, che a loro volta vengono identicati9 da altri nomi (i groupname). Inoltre, come visto in sez. 1.2.2, ogni utente ha a disposizione una home directory per i propri le, e quando si collega al sistema gli viene messa a disposizione una shell (la shell di login, cui abbiamo accennato a pag. 72). Tutte queste informazioni sono quelle che vengono mantenute ed utilizzate dai programmi per la gestione di utenti e gruppi. Nelle prime versioni di Unix tutte le informazioni relative agli utenti ed ai gruppi presenti nel sistema erano memorizzate su due le, /etc/passwd e /etc/group, che tratteremo meglio in sez. 4.3.3. Dato che questi, come tutti i le di congurazione del sistema, sono le di testo, in teoria non ci sarebbe nessuna necessit` di programmi specici per la loro gestione, dato che a possono essere modicati a mano con un qualunque editor.10 Nei sistemi moderni per` il meccanismo di gestione di utenti e gruppi ` stato completamente o e modularizzato attraverso sia luso del Name Service Switch, visto in sez. 3.1.3, che di PAM (Pluggable Authentication Method ), su cui torneremo in sez. 4.3.4. In questo modo ` possibile e mantenere le informazioni ed eettuare i relativi controlli usando i supporti pi` disparati (server u NIS, vari database, server LDAP, ecc.), e quindi non ` pi` possibile andare ad eettuare le e u modiche a mano con un editor. Luso di un supporto modulare per` fa s` che si possano utilizzare buona parte degli steso
si ricordi che il kernel conosce solo degli identicativi 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. 10 cosa che in certi casi ` comunque utile saper fare, ad esempio per togliere una password di amministratore e dal sistema contenuto in un disco montato a mano usando un sistema di recupero, poich in quel caso i comandi e andrebbero ad operare sulla congurazione del sistema di recupero, e non di quello che si vuole riparare.
9

4.3. LA GESTIONE DI UTENTI E GRUPPI

161

si comandi che in origine operavano solo sui le di testo in maniera trasparente rispetto al meccanismo con cui sono eettivamente gestite le informazioni.

4.3.2

I comandi per la gestione di utenti e gruppi

Il primo comando di gestione che prendiamo in esame ` useradd, che permette di aggiungere e un nuovo utente al sistema (cio` di creare un account). Il comando prende come argomento il e nuovo username. Si tenga presente che di default il comando si limita a creare il nuovo utente, ma non imposta la password (che resta disabilitata), non crea la home directory e non imposta una shell di login. E possibile comunque impostare ciascuna di queste propriet` (e molte altre) attraverso le a opportune opzioni: ad esempio -p permette di specicare la password dellutente,11 -s la shell, -g il gruppo iniziale, -G eventuali altri gruppi di appartenenza, -m richiede la creazione della home directory, con tanto di creazione di tutti i le contenuti nella directory /etc/skel (vedi sez. 3.2.2). Inne con -u si pu` impostare un valore specico per lo user ID, altrimenti il comando o assegner` allutente un valore predenito corrispondente al primo numero maggiore di 9912 e pi` a u grande di tutti gli altri valori utilizzati per gli altri utenti.
Opzione -b -d -u -p -s -m -g -G -o Signicato imposta la home directory. imposta la home directory dellutente. specica un valore numerico per luser ID. imposta la password. imposta la shell di default. copia il contenuto di /etc/skel nella home. imposta il gruppo di iniziale. imposta eventuali gruppi aggiuntivi. permette di specicare un user ID gi` esistente. a

Tabella 4.8: Principali opzioni del comando useradd.

Le principali opzioni sono riportate in tab. 4.8, lelenco completo che comprende anche quelle pi` sosticate, legate alluso delle shadow password che permettono di impostare alcuu ne propriet` delle password (come durata, lunghezza minima, ecc.) insieme a tutti i dettagli a sul funzionamento del comando sono disponibili nella pagina di manuale accessibile con man useradd. Oltre che a creare un nuovo utente il comando pu` essere anche usato per modicare le o propriet` di un utente gi` esistente, nel qual caso deve essere invocato con lopzione -D. Per a a questo per` ` disponibile anche il comando usermod, che ` del tutto analogo alluso di useradd oe e con lopzione -D, e prende le opzioni elencate in tab. 4.8 per useradd, ma prima di operare si assicura che lutente che si va a modicare non sia collegato alla macchina. Inoltre usermod supporta le opzioni -L e -U usate rispettivamente per bloccare e sbloccare laccesso di un utente inserendo un carattere ! nel campo che contiene la sua password criptata (su questo torneremo in sez. 4.3.3). Analogo ad useradd ` groupadd che permette di creare un nuovo gruppo. In questo caso e le uniche opzioni sono -g che permette di specicare un group ID specico (il valore di default ` impostato con gli stessi criteri visti per luser ID) e -o che unito al precedente permette di e specicare un group ID gi` in uso. a Lomologo di usermod per i gruppi ` invece il comando groupmod che permette di modicare e un gruppo, in particolare il comando permette di cambiare il group ID usando -g, supportando
che deve essere specicata in forma cifrata, per cui di norma non si usa mai questa opzione, ma si provvede ad eseguire il comando passwd in un secondo tempo. 12 i valori fra 0 e 99 sono usati normalmente per gli utenti corrispondenti ad alcuni servizi di sistema.
11

162

CAPITOLO 4. AMMINISTRAZIONE ORDINARIA DEL SISTEMA

sempre lopzione -o per poter specicare un gruppo gi` assegnato, e di cambiare il nome del a gruppo con lopzione -n. I comandi userdel e groupdel permettono invece di cancellare rispettivamente un utente e un gruppo, da specicare come argomento. Nel caso di groupdel il comando non ha nessuna opzione specica, mentre userdel si limita a cancellare lutente, se si vuole anche rimuoverne la home directory13 si dovr` usare lopzione -r che ` lunica opzione supportata dal comando. a e Per ciascuno di questi comandi per la creazione e rimozione di utenti e gruppi Debian mette a disposizione una interfaccia pi` amichevole attraverso gli analoghi comandi adduser ed addgroup u e deluser ed delgroup. I primi permettono una impostazione automatica di tutti gli attributi di un nuovo utente, secondo quanto specicato nel le di congurazione /etc/adduser.conf, richiedendo quando serve le informazioni necessarie come la password ed il nome reale. I secondi eseguono la rimozione dellutente e del gruppo14 seguendo lo schema specicato nel le di congurazione /etc/deluser.conf. Le informazioni complete sono disponibili al solito nelle relative pagine di manuale. Oltre ai precedenti comandi generali, esistono una serie di comandi diretti che permettono di modicare i singoli attributi, il pi` comune ` passwd che permette di cambiare la password. u e Lutilizzo pi` comune ` quello di invocare il comando per cambiare la propria password, nel u e qual caso non ` necessario nessun argomento; il comando chieder` la password corrente e poi e a la nuova password per due volte (la seconda per conferma, onde evitare errori di battitura). Se si specica un argomento questo indica lutente di cui si vuole cambiare la password, ma si tenga presente che solo lamministratore pu` cambiare la password di un altro utente, gli utenti o normali possono cambiare solo la propria e solo dopo essersi autenticati con la vecchia. Oltre alla semplice operazione di cambiamento della password il comando supporta molte altre funzionalit` di gestione delle stesse, in particolare per la gestione delle caratteristiche delle a shadow password (su cui torneremo in sez. 4.3.3), dette opzioni con il relativo signicato sono riportate in tab. 4.9, e possono essere utilizzate solo dallamministratore.
Opzione -x Signicato imposta in numero massimo di giorni per cui la password rimane valida, passati i quali lutente sar` forzato a a cambiarla. imposta il numero minimo di giorni dopo il quale una password pu` essere cambiata, lutente non potr` modicarla o a prima che siano passati. imposta il numero di giorno 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 ` scaduta, passato i e quali laccount sar` disabilitato. a fa scadere immediatamente una password, forzando cos` lutente a cambiarla al login successivo.

-n

-w -i

-e

Tabella 4.9: Opzioni del comando passwd per la gestione delle informazioni relative alle shadow password.

Oltre alle funzioni di gestione delle shadow password il comando permette anche di bloccare e sbloccare luso di un account rispettivamente con le opzioni -l e -u, inoltre lopzione -d consente di cancellare la password lasciandola vuota, in tal caso per` chiunque pu` entrare nel sistema o o conoscendo lusername. Inne, bench sia una funzionalit` poco nota, il comando permette anche, usando lopzione e a -g, di cambiare (o mettere, dato che di norma non viene impostata) la password per un gruppo.
si tenga presente che questo non assicura la cancellazione di tutti i le di propriet` dellutente che potrebbero a essere in altre directory diverse dalla sua home. 14 gestendo anche, rispetto ai corrispondenti programmi base, leliminazione dei le non contenuti nella home.
13

4.3. LA GESTIONE DI UTENTI E GRUPPI

163

Se si specica anche -r la password presente sul gruppo viene rimossa. Solo lamministratore o lamministratore del gruppo possono eseguire questo comando. Questultimo ` uno degli utenti del gruppo cui ` stato dato il compito di amministrare lo e e stesso, e oltre a poterne cambiare la password ` in grado di aggiungere altri utenti al gruppo e usando il comando gpasswd. Questo, oltre alla capacit` di cambiare la password di un gruppo, a permette allamministratore di aggiungere utenti a un gruppo con lopzione -M, o denire degli utenti amministratori del gruppo con lopzione -A. Questi ultimi potranno con le opzioni -a e -d aggiungere o rimuovere altri utenti dal gruppo e disabilitare laccesso al gruppo da parte di esterni con -R. Inserire una password su un gruppo signica consentire ad altri utenti che non sono nel gruppo di farne parte attraverso luso del comando newgrp. Questo comando permette infatti di cambiare il proprio group ID assumendo quello di un gruppo, ma solo quando ` stata impostata e una password per il gruppo, che deve essere fornita (altrimenti loperazione non ` consentita). e Se invecee si fa gi` parte del gruppo non ` necessaria nessuna password. a e Oltre a newgrp si pu` cambiare gruppo anche con il comando sg cos` come il comando su o permette di assumere lidentit` di un altro utente. Entrambi i comandi vogliono come argomento a il nome del (gruppo o dellutente) del quale si vogliono avere i diritti e richiedono la relativa password. Se usati con lopzione -c si pu` specicare un comando da eseguire con i diritti o del gruppo o dellutente richiesto. Al solito la pagina di manuale riporta la documentazione completa. Gli altri comandi per la gestione delle propriet` degli utenti sono chsh, che permette ad a un utente di cambiare la sua shell di login di (ma solo fra quelle elencate in /etc/shells, vedi sez. 3.2.2) e chfn che permette di cambiare le informazioni mantenute nel campo chiamato Gecos (vedi sez. 4.3.3), in cui si scrivono il nome reale e altri dati relativi allutente. Al solito si faccia riferimento alle relative pagine di manuale per la descrizione completa.

4.3.3

Il database di utenti e gruppi

Come accennato in sez. 4.3.2 nelle prime versioni di Unix tutte le informazioni relative ad utenti e gruppi venivano tenute in due soli le. Bench questo schema si sia evoluto con lintroduzione e prima delle shadow password e poi di PAM e del Name Service Switch, a tuttoggi la modalit` a pi` comune per mantenere il database degli utenti su un sistema GNU/Linux resta quella di u scrivere le relative informazioni su alcuni le di testo. Il primo le su cui sono mantenute queste informazioni ` /etc/passwd chiamato cos` perch e e ` al suo interno che nelle prime versioni di Unix venivano memorizzate le password. Il le e deve essere leggibile da tutti perch oltre alle password memorizza anche la corrispondenza fra e lusername ed il relativo identicativo numerico, ` da qui che normalmente i programmi come e ls o ps ottengono lusername che corrisponde ad un certo user ID. Nel le sono mantenute poi anche altre informazioni come la shell di login, la home directory, ecc. Il fatto che il le sia leggibile da tutti pu` far sorgere il dubbio di come si possa avere o una cosa del genere per un le in cui sono memorizzate delle password. In realt` queste non a sono memorizzate in chiaro (il testo della password non viene mai scritto da nessuna parte nel sistema), quello che viene memorizzato ` solo il risultato della cifratura della password, quello e che si chiama un hash crittograco. Tutte le volte che si richiede una autenticazione quello che il sistema fa ` semplicemente e ricalcolare questo valore per la password che gli si fornisce e vericare che coincida con quello memorizzato; dato che solo se si ` fornita la password originaria si potr` riottenere lo stesso e a risultato, in caso di coincidenza si ` ottenuta lautenticazione. Siccome poi dal punto di vista e matematico ` praticamente impossibile (ogni metodo ` equivalente a quello provare tutte le e e possibilit`) risalire dal valore cifrato alla password originale, il rendere leggibile questultimo a non costituiva un problema.

164

CAPITOLO 4. AMMINISTRAZIONE ORDINARIA DEL SISTEMA

Bench per la gestione normale degli utenti ci siano gli opportuni programmi di shell (che e abbiamo visto in sez. 4.3.2) abbiamo accennato come in casi di emergenza pu` essere utile o modicare a mano il le; per questo occorre sapere come vengono mantenute le informazioni. Il formato del le ` molto semplice, per ogni utente deve essere presente una riga composta da 7 e campi separati dal carattere :, non sono ammessi n commenti n righe vuote. Il signicato e e dei sette campi ` il seguente: e nome di login (o username). password cifrata (opzionale). identicatore numerico dellutente (user ID). identicatore numerico del gruppo di default (group ID). nome e cognome dellutente ed eventuali altri campi di commento separati da virgole; questo campo ` detto anche Gecos. e home directory dellutente (pathname assoluto). shell di login. ed un esempio di questo le pu` essere il seguente: o
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 gdm:x:100:101:Gnome Display Manager:/var/lib/gdm:/bin/false

i dettagli del formato del le possono essere trovati nella relativa pagina di manuale accessibile con man 5 passwd.15 La presenza di una x nel secondo campo del nostro esempio indica che sono attive le shadow password, su cui torneremo fra poco. Posto che per cambiare shell o le informazioni del quinto campo ` opportuno usare i comandi di shell, in caso di emergenza pu` essere necessario modicare e o questo le, ad esempio se si ` persa la password di root, nel qual caso occorrer` far partire il e a computer con un disco di recupero e togliere la x lasciando il campo vuoto, cos` che la richiesta della password venga disabilitata al successivo riavvio, in modo da poter entrare per ripristinarla. Analogo a /etc/passwd per mantenere lelenco dei gruppi c` il le /etc/group che contiene e le informazioni ad essi relative. In questo caso i campi sono soltanto quattro (sempre separati da :) ed indicano rispettivamente: il nome del gruppo (o groupname). la password del gruppo (si ricordi quanto visto in sez. 4.3.2). il valore numerico del gruppo (group ID). la lista degli username degli utenti appartenenti al gruppo, separati da virgole.

un esempio di questo le ` il seguente: e


root:x:0: daemon:x:1: bin:x:2: sys:x:3: adm:x:4: tty:x:5:piccardi,admin ... piccardi:x:1000: ...
15

si ricordi quanto detto in sez. 2.3.1 riguardo le sezioni delle pagine di manuale.

4.3. LA GESTIONE DI UTENTI E GRUPPI

165

anche le informazioni mantenute da questo le sono usate da tutti i programmi che devono tradurre lidenticatore numerico del gruppo in un nome e pertanto deve essere mantenuto aperto in lettura. Bench lalgoritmo crittograco con cui si calcolano le password sia piuttosto robusto,16 e mantenere leggibili le password, anche se cifrate, espone comunque ad un attacco a forza bruta (cio` alla possibilit` che qualcuno tenti di provarle tutte). Se quando ` stato creato Unix questa e a e eventualit`, dati i computer dellepoca, era impraticabile, con la potenza dei computer di oggi a lo ` molto meno. Inoltre anche se oggi ` diventato possibile usare altri algoritmi di crittograa e e che rendono pi` dicile un compito del genere, c` sempre da fare i conti con la pigrizia degli u e utenti che tendono ad usare password come pippo o ciccio e simili. Per cui anche se spesso gli attacchi a forza bruta non sono praticabili, ` comunque piuttosto e semplice (e ci sono un sacco di programmi molto ecienti nel farlo) utilizzare quello che si chiama un attacco a dizionario, in cui invece di tutte le combinazioni si provano solo quelle relative ad un dizionario di possibili password. E non giovano neanche trucchetti come quello di scrivere le parole alla rovescia, invertire delle lettere o mettere un 3 al posto di una e o un 1 al posto di una i. Tutti trucchetti ampiamente noti che qualunque programma decente di password cracking applicher` alle parole del suo dizionario. a Per questo motivo non ` comunque molto sicuro lasciare leggibili a tutti le password anche e nalla forma cifrata, dato che potrebbero essere soggette ad una analisi di questo tipo. Per questo motivo alcuni anni fa, nella reimplementazione dei meccanismi di autenticazione, venne introdotto quello che ` stato chiamato il sistema delle shadow password che oltre a consentire e di spostare le password in un le a parte ha pure aggiunto una serie di funzionalit` di sicurezza a ulteriori. Se nel sistema sono state abilitate le shadow password (in genere lo si fa in fase di installazione, anche se ormai questa non ` neanche pi` una opzione e vengono usate di default) nel e u secondo campo di /etc/passwd viene posta una x e le le password cifrate vengono spostate in /etc/shadow. In questo caso, dato che le altre informazioni necessarie ai programmi restano disponibili in /etc/passwd si pu` proteggere questo le in lettura cos` che solo lamministratore possa acceo dervi. Oltre alle password sono memorizzate in /etc/shadow una serie di ulteriori informazioni che permettono un controllo molto pi` dettagliato su di esse, come date di scadenza, date in cui u sono state cambiate ecc. Il formato del le ` analogo a quelli gi` visti, ci sono 9 campi separati e a con dei :, il cui rispettivo contenuto `: e nome di login (o username). password cifrata. giorno in cui ` stata cambiata password lultima volta (espresso in numero di giorni dal e 1/1/1970). numero di giorni che devono passare dallultimo cambiamento prima che la password possa essere cambiata nuovamente. numero di giorni dallultimo cambiamento dopo i quali la password scade e deve essere necessariamente cambiata. numero dei giorni precedenti quello di scadenza della password in cui gli utenti vengono avvisati. numero dei giorni successivi a quello di scadenza della password dopo i quali lutente viene disabilitato. giorno in cui lutente ` stato disabilitato (espresso in numero di giorni dal 1/1/1970). e
16 per i curiosi lalgoritmo originale si chiama DES, oggi ` poco usato per la sua debolezza, il suo problema infatti e ` che prevede delle chiavi di dimensione ridotta ed ha dei limiti sul numero di caratteri delle password (vengono e usati solo i primi 8 caratteri) per cui in genere si usano algoritmi alternativi come MD5 che prende password di dimensioni qualsiasi.

166 campo riservato.

CAPITOLO 4. AMMINISTRAZIONE ORDINARIA DEL SISTEMA

ed un esempio di questo le `: e
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::: ...

al solito i dettagli sul signicato dei campi si trovano nella pagina di manuale, accessibile con man shadow. Si noti come per alcuni utenti la password sia sostituita dal carattere * (talvolta viene usato anche !), questo ` un modo, dato che detti caratteri non corrispondono ad un valore possibile e per una password cifrata, di impedire che il corrispondente utente possa eseguire un login, 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. Lutilit` del sistema delle shadow password, ` che questo consente anche di impostare delle a e politiche di gestione delle stesse. Ad esempio si pu` impostare un tempo di scadenza forzando o gli utenti a non utilizzare sempre la stessa password, cosa che a lungo andare fa aumentare le possibilit` che essa venga scoperta. a Inne dato che anche i gruppi hanno le loro password, anche queste sono state spostate in un altro le, /etc/gshadow. Il formato ` sempre lo stesso, i campi in questo caso sono 4, ed e indicano rispettivamente: nome del gruppo password cifrata amministratore del gruppo utenti appartenenti al gruppo

ed un esempio di questo le ` il seguente: e


root:*:: daemon:*:: bin:*:: sys:*:: adm:*:: tty:*::piccardi,admin ... piccardi:x:: ...

Tutte le distribuzioni recenti installano di default le shadow password, ` comunque possibie le eettuare una conversione automatica dal sistema tradizionale usando il comando pwconv. Questo prima rimuove da /etc/shadow tutte le voci non presenti in /etc/passwd, poi riporta le password presenti in esso allinterno di /etc/shadow, ed inne le sovrascrive con una x. Inoltre il programma usa i valori di PASS_MIN_DAYS, PASS_MAX_DAYS e PASS_WARN_AGE presi da login.defs (vedi sez. 3.1.4) per impostare i rispettivi campi di /etc/shadow). Si tenga presente che login.defs non viene usato se si utilizza PAM e le relative informazioni sono prese direttamente dalla congurazione di questultimo. Analogo a pwconv, ma operante sui gruppi (e relativi le /etc/group e /etc/gshadow) ` e grpconv; essendo le password dei gruppi poco utilizzate anche questo comando non ` molto usato. e ` E possibile inoltre eettuare anche la conversione inversa, tornando dalle shadow password al

4.3. LA GESTIONE DI UTENTI E GRUPPI

167

sistema tradizionale con i comandi pwunconv e grpunconv, in questo caso le password verranno reinserite in /etc/passwd ed /etc/shadow, ma le informazioni aggiuntive (come i dati sulle scadenze delle password) verranno persi. Si ricordi che, come accennato allinizio, luso dei le appena descritti, pur restando ancora oggi quello pi` diuso, ` solo uno dei metodi per mantenere le informazioni riguardo gli account u e degli utenti. Per questo motivo esaminare il contenuto di questi le non ` detto sia suciente ad e identicare tutti gli utenti di un sistema, in quanto le informazioni potrebbero essere mantenute anche altrove. Per questo motivo si pu` utilizzare un apposito comando, getent, che, quando le informazioni o sono distribuite su pi` supporti, consente di interrogare il sistema dal Name Service Switch u per richiedere una lista completa. Il comando richiede come argomento una delle classi di informazioni gestite dal Name Service Switch fra quelle di tab. 3.1, e stampa a video il risultato. In questo modo si otterr` la stampa delle informazioni degli utenti nello stesso formato in a cui sono mantenute nel corrispondente le tradizionale; ad esempio si avr`: a
piccardi@monk:~/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

4.3.4

Il Pluggable Authentication Method

La necessit` di una maggiore essibilit` della gestione degli utenti non riguarda soltanto la a a possibilit` di mantenere su diversi supporti i dati loro associati, ma anche, e soprattutto, quella a di permettere la gestione di diverse modalit` per gestire lautenticazione. A questo provvede il a sistema chiamato Pluggable Authentication Method, in breve PAM, introdotto inizialmente su Solaris e poi portato anche su GNU/Linux. Lidea ` quella di realizzare un meccanismo che ricopra per i programmi di autenticazione e il ruolo che ha il Name Service Switch per quelli che richiedono una corripondenza fra identicatori numerici e simbolici. Dato che in questo caso la richiesta ` pi` sosticata il sistema sar` e u a pi` complesso, ma in sostanza si tratta sempre delle denizione di una interfaccia di programu mazione generica per cui tutti i programmi che necessitano di compiere una qualche forma di autenticazione (come login o passwd) lo fanno attraverso una liberia che fa da intermediario rispetto al meccanismo con cui poi le operazioni vengono eettivamente 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.10, dove si sono riportate anche le quattro parole chiave usate nella congurazioni per identicarle. La essibilit` di PAM ` dovuta al fatto che il sistema ` implementato come una libreria dia e e namica che permette di caricare una serie di moduli (usualmente mantenuti in /lib/security) che realizzano diverse funzionalit` in una o pi` delle classi di tab. 4.10. Una delle caratteristia u che pi` interessanti di PAM ` questi moduli possono essere impilati in modo da combinare le u e funzionalit` di ciascuno nella fornitura di un determinanto servizio. Inoltre il sistema permette a di utilizzare impostazioni diverse per le dierenti applicazioni che lo usano. La congurazione di PAM pu` essere eettuata in due modi; quello pi` comune ` luso di una o u e serie di le (uno per ciascuna applicazione che usa il sistema) posti nella directory /etc/pam.d. In questo modo infatti ` molto pi` semplice per le singole applicazioni mantenere un proprio le e u di congurazione. Ogni applicazione che necessita delluso del sistema sar` controllata da un apposito le in a /etc/pam.d il cui nome corriponde a quello dellapplicazione stessa (si avranno cio` le come e

168

CAPITOLO 4. AMMINISTRAZIONE ORDINARIA DEL SISTEMA


ipologia account Signicato fornisce il servizio di verica della presenza di un account e della relativa validit` (le password sono scadute, si pu` a o accedere al servizio, ecc.). fornisce il servizio di verica dellidentit` di un utente, a in genere sulla base di un meccanismo di sda/risposta (come dare la password), ma pu` essere esteso in mao niera generica (permettendo luso anche di dispositivi hardware). 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 ne della sessione.

auth

password

session

Tabella 4.10: Le quattro tipologie di servizi forniti da PAM.

login, su, passwd, ecc.). Ciascun le contiene una regola per riga (si pu` proseguire una regola o su pi` righe terminandole con il carattere \) ed al solito righe vuote ed inizianti per # vengono u ignorate; una regola ` composta da almeno tre campi separati da spazi (o tabulatori), allultimo e dei quali, che indica il modulo da utilizzare, possono seguire altri campi che specicano degli argomenti, nella forma: type control module-path [arguments ...]

Il primo campo, type, indica (con le parole chiave di tab. 4.10), la classe di servizi a cui la regola fa riferimento. Il secondo campo, control, indica la modalit` di comportamento che le a applicazioni devono assumere in caso di successo o fallimento del compito assegnato al modulo, questi prevedono una sintassi semplicata, in cui si utilizza direttamente uno dei valori riportati tab. 4.11, o la sintassi completa illustrata nella pagina di manuale di PAM, accessibile con man 7 pam.
ipologia requisite Signicato il fallimento del modulo comporta limmediata terminazione della procedura di autenticazione, gli altri eventuali moduli non vengono chiamati. il fallimento del modulo comporta il fallimento della procedura di autenticazione, ma . . .

required sufficient optional

Tabella 4.11: I principali valori per il campo di controllo dei risultati usati nei le di congurazione di PAM.

Una forma alternativa di congurazione ` quella delluso del le /etc/pam.conf in cui si e inseriscono tutte le regole di gestione che starebbero dentro i le di /etc/pam.d.17 Il le prevede una linea per ciascuna regola ed al solito si ignorano le righe vuote e quelle inizianti per #; a dierenza delle precedenti queste sono composta da cinque campi separati da spazi, 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 ` il nome del le). e
17

se questultima ` presente il le viene ignorato. e

Capitolo 5

Amministrazione straordinaria del sistema


5.1 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.1.1

Le versioni del kernel

Uno dei primi problemi che ci si trova ad arontare nella gestione del kernel ` quello della scelta e di versione quale usare. Nella maggior parte dei casi il kernel viene installato dalla propria distribuzione durante linstallazione, e molti, non avendo necessit` speciche (ad esempio la a mancanza di supporto per un qualche dispositivo) evitano di installarne un altro. Le esigenze che portano allinstallazione di un nuovo kernel sono in genere due, la prima ` e ottimizzare il kernel per renderlo pi` adatto alla propria congurazione hardware; molti kernel u 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` essere o utile ricompilarli per eliminare il supporto di funzionalit` superue non disponibili e attivare a quello per la versione specica del proprio hardware. In questo caso si hanno due scelte, si pu` ricompilare il kernel della propria distribuzione (in o genere tutte forniscono i relativi sorgenti), od utilizzare un kernel uciale.1 In genere infatti le varie distribuzioni installano una propria versione del kernel, modicata applicando vari patch 2 che si ritiene migliorino le prestazioni o la stabilit` ed aggiungono funzionalit` reputate rilevanti, a a ma non ancora incluse nel kernel uciale. Qualora si scelga il kernel della propria distribuzione c` solo da procurarsi i relativi sorgenti, e i le di congurazione e provvedere alla ricompilazione secondo le istruzioni di sez. 5.1.3. Se invece si vuole installare un kernel uciale (ad esempio per avere le funzionalit` aggiunte nello a sviluppo eettuato nel frattempo) occorre scegliere una versione adeguata. La scelta della versione di kernel da utilizzare ` in linea generale abbastanza semplice, occorre e prendere lultima versione stabile. Per stabilire di quale versione si tratta basta andare sul sito uciale del kernel. Conviene comunque dare alcune spiegazioni sul signicato dei numeri di versione del kernel: essi sono espressi sempre da tre numeri separati da punti.
1 si chiama cos` il kernel pubblicato su http://www.kernel.org, curato dal mantainer uciale (lo stesso Linus o chi lui ha delegato al compito). 2 si chiamano cos` le modiche, in forma di le prodotti dal programma diff, da applicare ai sorgenti tramite il comando omonimo, per ottenere una nuova versione degli stessi.

169

170

CAPITOLO 5. AMMINISTRAZIONE STRAORDINARIA DEL SISTEMA

Il primo numero esprime la major version, un numero di versione che cambia solo in caso di fondamentali modiche strutturali dellinfrastruttura, cosa avvenuta nora una sola volta (nel passaggio dei formati dei binari dalla.out allELF). Al momento la major version ` la 2 e non e sembrano esserci allorizzonte modiche tali da giusticare una 3. Il secondo numero esprime il cosiddetto patchlevel, ma indica pi` propriamente una serie di u sviluppo, che ` quella che invece cambia periodicamente. La convenzione scelta dagli sviluppatori e ` che un numero pari indica una versione stabile, mentre un numero dispari indica la versione e sperimentale, di sviluppo, in cui vengono introdotte tutte le nuove funzionalit` e le modiche a infrastrutturali che porteranno alla successiva versione stabile. Per esempio i kernel della serie 2.4.x indicano i kernel stabili, usati per le macchine in produzione, lo sviluppo dei quali3 ` e volto alla eliminazione dei bug e alla stabilizzazione del sistema, mentre i kernel della serie 2.5.x indicavano i kernel sperimentali, nati a partire da un precedente kernel stabile, nei quali sono state introdotte le nuove funzionalit`, riscritte parti che non si consideravano soddisfacenti, ecc. a Lultimo numero di versione ` inne il numero progressivo che identica i kernel allinterno e di una serie, e che viene aggiornato periodicamente con il relativo sviluppo, nella direzione della stabilizzazione per le serie pari, nella direzione delle nuove funzionalit` ed infrastrutture per a quelle di sviluppo. Si tenga presente che ogni versione stabile ha in genere un suo mantainer (quello delle versioni di sviluppo nora ` sempre stato Linus), che ne cura lo sviluppo ed il e rilascio delle nuove versioni. Al momento della scrittura di queste dispense (gennaio 2004) lultimo kernel stabile ` il e 2.6.1, mentre non esistono ancora kernel in versione instabile: siamo cio` in quel periodo che e segue il rilascio di una nuova serie stabile in cui non si ` ancora dato vita ad una nuova versione e di sviluppo.4 Questo ci dice che in realt` il nuovo kernel stabile non ` lo poi cos` tanto, dato a e che la nuova serie ` appena nata; in genere ci vuole sempre un po di tempo perch le nuove e e versioni stabili maturino e possano sostituire completamente le versioni precedenti. Per questo al momento ` senzaltro pi` opportuno utilizzare lultima versione stabile precedente, cio` il e u e kernel 2.4.24. Questo ci dice che anche se genericamente valida, lindicazione di utilizzare lultimo kernel della serie stabile, va presa comunque con prudenza. Possono esistere anche delle buone ragioni (macchine con software vecchio che non gira sulle nuove versioni e che non si pu` aggiornare) o motivi di spazio (i nuovi kernel tendono a consumare pi` risorse e a non supportare pi` piatu u taforme hardware particolarmente datate) che spingono a mantenere lutilizzo di vecchie serie, come la 2.0.x e la 2.2.x, che sono a tuttora sviluppate, sia pure solo a livello di correzione dei pochi errori restanti.

5.1.2

Sorgenti e patch

Una volta scelta la versione del kernel da utilizzare, il passo successivo ` quello di scaricare e i sorgenti e ricompilarli. Come accennato il sito per la distribuzione delle versioni uciali ` 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 ` segnalata sulla stessa pagina. e In genere i sorgenti vengono distribuiti nella directory /pub/linux (vi si accede sia in FTP
accade spesso che gli sviluppatori si lascino comunque prendere la mano e introducano comunque nuove funzionalit`, o eseguano backporting di codice dalla versione di sviluppo, si pu` dire comunque che in generale in a o una versione stabile viene curata molto la stabilit` del sistema e la correzione degli errori rispetto allinserimento a di nuove funzionalit`, che avviene solo quando esse sono state abbondantemente vericate. a 4 dopo alcuni mesi dal rilascio della nuova serie 2.6.x, (nel novembre 2004, alla serie 2.6.9), pare essere cambiata la modalit` di sviluppo del kernel, che non prevede per il momento la creazione di nuove serie instabili, ma il a passaggio da una versione stabile alla successiva, integrando anche grossi cambiamenti del kernel, e leventuale introduzione di un quarto livello di numerazione per tenere conto di eventuali stabilizzazioni di queste release successive.
3

5.1. LA GESTIONE DI KERNEL E MODULI

171

che in HTTP) e sono disponibili in tre forme,5 le prime due sono degli archivi completi in formato tar compressi o con bzip2 o con gzip, il cui nome sar` qualcosa del tipo linux-2.4.24.tar.bz2 a o linux-2.4.24.tar.gz (il primo ` pi` compresso e si scarica pi` velocemente, ma sono sempre e u u una ventina di megabyte abbondanti) 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.4.23 si potr` passare al 2.4.24 scaricando soltanto il le patch-2.4.24.gz (di norma viene a compresso anche questo). Cos` diventa possibile aggiornare alla versione successiva senza dover eettuare dei download di enormi dimensioni. Una volta scaricati gli archivi si dovranno scompattare questi ultimi che creeranno una directory linux-2.4.24 nella directory corrente. A seconda dei casi il comando da usare ` e tar -xvjf linux-2.4.24.tar.bz2 o tar -xvzf linux-2.4.24.tar.gz 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 ` necessario usare root per la compilazione, luso e della propria home directory potrebbe anche essere una scelta migliore. Un discorso diverso va fatto qualora si vogliano utilizzare i patch. Questo tra laltro vale sia per il passaggio da una versione di kernel allaltra, che per lapplicazione di patch relativi allinstallazione di funzionalit` aggiuntive che possono interessare, ma che non sono ancora a incluse nei sorgenti del kernel. Per questo occorre capire cos` un patch: questo ` denito sulla base della dierenza fra due e e le (in genere dei sorgenti, ma la cosa vale per qualunque le di testo), cos` come prodotta dal comando diff, che permette di indicare quali righe sono cambiate dalluno allaltro e salvare il tutto su un le. Cos` si pu` passare da una versione di un programma alla successiva tra o smettendo solo le dierenze nel relativo sorgente. Il comando diff pu` inoltre essere eseguito o ricorsivamente su due intere directory, registrando le dierenze sia per quanto riguarda i vari le che esse contengono, che per laggiunta o la rimozione di alcuni di essi. Si pu` poi salvare il o tutto su unico le, che verr` a costituire per lappunto il patch; un esempio di ` il seguente: a e
--- linux-2.4.20-ben8/arch/ppc/kernel/ppc_ksyms.c 2002-11-23 10:52:30.000000000 +0100 +++ linux-2.4.20-ben8-xfs-lolat/arch/ppc/kernel/ppc_ksyms.c 2003-05-15 17:12:38.000000000 +0200 @@ -163,6 +163,7 @@ EXPORT_SYMBOL(_outsw_ns); EXPORT_SYMBOL(_insl_ns); EXPORT_SYMBOL(_outsl_ns); EXPORT_SYMBOL(ioremap); +EXPORT_SYMBOL(ioremap_bot); EXPORT_SYMBOL(__ioremap); EXPORT_SYMBOL(iounmap); EXPORT_SYMBOL(iopa); @@ -196,6 +197,7 @@ EXPORT_SYMBOL(flush_dcache_range); EXPORT_SYMBOL(flush_icache_user_range); EXPORT_SYMBOL(flush_icache_page); EXPORT_SYMBOL(flush_dcache_page); +EXPORT_SYMBOL(local_flush_tlb_all); EXPORT_SYMBOL(xchg_u32); #ifdef CONFIG_ALTIVEC EXPORT_SYMBOL(last_task_used_altivec);

la prima riga qui indica il le originale, 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 ` stato eseguito il diff. Le righe che iniziano per @@ indicano a quale riga nei due le e fanno riferimento i dati riportati di seguito, nel caso 6 righe del primo le a partire dalla 163, e 7 del secondo a partire sempre dalla stessa riga. Le dierenze sono mostrate apponendo un + alle righe aggiunte nel secondo le ed un - a quelle tolte.
in realt` esiste anche una forma di distribuzione tramite il protocollo rsync, che permette di ridurre la quantit` a a di dati da scaricare.
5

172

CAPITOLO 5. AMMINISTRAZIONE STRAORDINARIA DEL SISTEMA

Con il comando patch si pu` invece compiere loperazione inversa, e cio` applicare ad un certo o e le le dierenze ottenute con il metodo precedente, in modo da convertirlo nella nuova versione. La cosa pu` essere eettuata anche ricorsivamente, su un intero albero di le e directory. Cos` o se chi dispone dei nuovi sorgenti del kernel 2.4.24 mantiene anche quelli della versione 2.4.23, potr` generare un patch delle dierenze, che applicato a questi ultimi li trasformer` in quelli a a del 2.4.24. Lutilit` dei patch ` che in questo modo anche chi cura la manutenzione di ulteriori a e funzionalit` non presenti nei kernel uciali potr` limitarsi a distribuire il patch che contiene le a a relative aggiunte e modiche, cos` che un utente possa, se lo desidera, applicarle senza dover scaricare tutto un nuovo albero dei sorgenti. Il meccanismo ` del tutto generale, ed inoltre il comando patch ` sucientemente intelligente e e da essere in grado di applicare anche pi` patch distinti in successione, ntanto che questi non u andranno ad operare esattamente sulle stesse righe degli stessi le eseguendo modiche incompatibili fra di loro. Cos` diventa possibile inserire nel kernel anche pi` funzionalit` aggiuntive, u a ntanto che queste non interferiscono fra loro, o saltare da una versione di kernel ad un altra che non sia la successiva applicando in successione pi` patch. u Come accennato il comando per applicare un patch ` appunto patch. Nel caso pi` semplice e u in cui si deve operare su un singolo le la sintassi ` immediata e si pu` eseguire il comando con e o un qualcosa del tipo: patch original patch.diff nel qual caso, a meno che non si sia specicata lopzione -b (o --backup) per richiedere un backup, la nuova versione prender` il posto delloriginale. a Quando per` si ha a che fare con un patch che coinvolge pi` le (come quelli che si applicano o u ad un albero di sorgenti) i nomi dei le cui esso va applicato ` riportato nel le stesso, e non e devono quindi essere specicati; inoltre in questo caso il comando legger` il contenuto del patch a dallo standard input, per cui occorrer` usare una redirezione. a In questo caso per capire il funzionamento del comando occorre rifarsi allesempio di patch mostrato in precedenza, il comando ricerca (a partire dalla directory corrente) il le che considera la vecchia versione e cerca di applicarvi le dierenze. Il problema che molto spesso ci si trova di fronte ` che si ha a disposizione solo la versione di partenza e non quella di arrivo, ad e esempio si sono scompattati i sorgenti nella directory linux-2.4.23 ma non si ha la directory linux-2.4.24. Per questo motivo di norma bisogna dire al comando, usando lopzione -p, da quale livello di directory nellalbero dei sorgenti si vuole partire per applicare il patch. Il livello 0 usa semplicemente quanto specicato nel patch stesso, ma nel caso appena illustrato questo non funzionerebbe, in quanto non si sarebbe in grado di trovare il le di destinazione, se per` ci si o ponesse direttamente dentro la directory linux-2.4.23 cancellando il primo livello di directory tutti i pathname relativi sarebbero risolti; pertanto di norma per applicare un patch sui sorgenti del kernel quello che si fa `: e cd /usr/src/linux patch -p1 < /path/to/patch/patch.diff Si tenga presente che se non si specica un livello, il default di patch ` di utilizzare solo il nome e del le, ignorando le directory presenti nel pathname relativo, per cui in genere lapplicazione fallir`. Se il comando non riesce ad applicare un patch (ad esempio perch se ne ` gi` applicato a e e a uno incompatibile, o si ` sbagliato le) generer` dei automaticamente dei le terminanti in .rej e a che contengono le modiche che ` stato impossibile eettuare. Inoltre patch ` in grado di e e rilevare il caso in cui si prodotto il patch invertendo le versioni, nel qual caso avvisa richiedendo il permesso di applicare il patch alla rovescia; questo pu` essere richiesto esplicitamente con o lopzione -R (o --reverse). Si tenga presente per` che se si tenta di applicare lo stesso patch o una seconda volta si avr` proprio questo comportamento, ma proseguire nellapplicazione non a

5.1. LA GESTIONE DI KERNEL E MODULI

173

sarebbe corretto, per questo esiste lopzione -N (o --forward) che indica di ignorare i patch che sembrano invertiti o gi` applicati. a Il comando patch prende molte altre opzioni ed ` in grado di utilizzare vari formati per i e patch ed anche di interagire direttamente con vari programmi per il controllo di versione per identicare quali sono i le su cui operare. Per tutti i dettagli sul funzionamento del comando e sul signicato delle opzioni si pu` al solito fare riferimento alla pagina di manuale, accessibile o con man patch.

5.1.3

La ricompilazione del kernel

Una volta che si sono scompattati i sorgenti ed applicati gli eventuali patch ritenuti opportuni si pu` passare alla compilazione del kernel. Questa, come per la maggior parte dei pacchetti o 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, in quanto nel caso del kernel non esiste uno script di congurazione, ma tutto viene gestito attraverso una procedura di costruzione dedicata, creata dagli stessi sviluppatori. Pertanto tutto la procedura ` controllata dal Makefile principale e presente nella base della directory dei sorgenti, e le varie operazioni sono compiute invocando gli opportuni target 6 del comando make. Una delle caratteristiche peculiari di Linux (torneremo sullargomento in dettaglio anche in sez. 5.1.4) ` quella di essere modulare. A dierenza cio` degli altri sistemi unix-like in cui il e e kernel ` un unico programma monolitico, caricato in memoria allavvio del sistema ed in cui e devono essere inserite tutte le funzionalit` che si vogliono usare, Linux pu` partire con un kernel a o contenente le sole funzionalit` di base e poi caricare da disco in maniera dinamica delle ulteriori a sezioni di codice, dette moduli, che aggiungono le funzionalit` ulteriori o il supporto per luso a di certi dispositivi, solo quando servono. Questa ` una delle caratteristiche pi` rilevanti di Linux, che gli permette una essibilit` di e u a utilizzo che gli altri kernel non hanno. E possibile infatti modularizzare lo sviluppo del kernel separandone le funzionalit`, evitare di mantenere permanentemente in memoria parti di codice a che sono utilizzate solo per limitati periodi di tempo (ad esempio il codice per accedere a CDROM o oppy occupa inutilmente memoria se non li si stanno utilizzando), indicare opzioni speciche per la gestione di un dispositivo in fase di caricamento, o modicarle 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 pianicato accuratamente in fase di compilazione e congurazione. Un primo aspetto delluso dei moduli ` che quando e 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 identicati, come questultimo, per la relativa versione, quella che viene mostrata dal comando uname -r.7 Sorge allora un problema quando si vogliono ottenere due (o pi`) kernel diversi a partire dagli stessi u sorgenti, dato che in questo caso la versione sar` la stessa. a Per risolvere questo problema ` allora possibile denire una versione personalizzata. La vere sione del kernel ` indicata dai sorgenti, ed ` codicata nelle prime righe del Makefile principale, e e che sono nella forma:
VERSION = 2 PATCHLEVEL = 4 SUBLEVEL = 23 EXTRAVERSION = -ben1 KERNELRELEASE=$(VERSION).$(PATCHLEVEL).$(SUBLEVEL)$(EXTRAVERSION) si ricordi quanto accennato in sez. 4.2.1 relativamente al funzionamento di questo comando. in realt` come vedremo in sez. 5.1.4, i moduli sono identicati soprattutto per la directory in cui sono a mantenuti, che ` /lib/modules/uname -r. e
7 6

174

CAPITOLO 5. AMMINISTRAZIONE STRAORDINARIA DEL SISTEMA

e come si vede ` qui che viene denita la variabile KERNELRELEASE che poi sar` usata in tutto e a il resto della procedura. Si noti allora la presenza, appositamente predisposta, della variabile EXTRAVERSION, che serve appunto a specicare un ulteriore identicativo 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. In genere questa ` lunica modica che pu` essere necessario fare a mano (anche se il e o kernel-package di Debian fornisce il comando make-kpkg che ` in grado di farla automaticae mente), tutte le altre congurazioni sono gestite in maniera indipendente, attraverso la modalit` a che vedremo pi` avanti. Le uniche altre eventuali (anche se poco probabili) modiche che si posu sono voler fare al Makefile riguardano la variabile CROSS_COMPILE, che pu` essere usata per o 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 ` meglio lasciar stare al e valore di default, che ` sicuro, a meno di non sapere esattamente quello che si sta facendo, o e essere in vena di sperimentazione). Un secondo aspetto delluso dei moduli che occorre tener presente ` che per poterli utilizzare e occorre anzitutto poter caricare in memoria il loro codice; il che signica che si deve essere in grado di leggere i relativi le oggetto,8 dato che questi non sono altro che codice, come quello dei programmi ordinari, anche se un po particolare.9 Questo comporta allora che le funzionalit` del a kernel necessarie ad accedere al supporto su cui si trovano i moduli non possono essere ottenute con luso di questi ultimi (e dovranno essere inserite allinterno del kernel in maniera monolitica). Per capire quali sono queste funzionalit` occorre ricordare quali sono i due compiti di base a 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 lesystem, 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` comunque a essere inserito permanentemente nel kernel, pena il fallimento dellavvio con un kernel panic.10 A parte le eventuali modiche del Makefile per modicare la EXTRAVERSION, il primo passo per la compilazione del kernel ` quello della congurazione, in cui si scelgono quali funzionalit` e a attivare e quali no, quali mettere direttamente dentro il kernel, e quali utilizzare come moduli. Una volta che si sia specicato quanto voluto, il kernel verr` costruito di conseguenza. a Tutto questo viene fatto, dal punto di vista della compilazione e della costruzione del kernel, tramite il contenuto del le .config, sempre nella directory base dei sorgenti, dove sono memorizzate tutte le opzioni di congurazione. Un estratto del contenuto del le ` il seguente: e
# # 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 congurazione sono tutte dichiarate come variabili nella forma CONFIG_XXX, quelle attivate non sono commentate ed assegnate al relativo valore, alcune indicano dei vaun le oggetto, in genere identicato dallestensione .o, ` un le che contiene il codice compilato di una o pi` e u funzioni, in cui per` gli indirizzi non sono stati assegnati, in questo modo, attraverso un procedimento successivo o detto collegamento (o meglio linking) si possono unire insieme pi` funzioni per dar luogo a quello che poi andr` a u a costituire un eseguibile; questo ` anche quello che si fa quando si produce limmagine del kernel, e luso dei moduli e consente di ripetere il procedimento sul codice del kernel che sta girando. 9 ed infatti a partire dalla serie 2.6.x li si ` distinti dai normali le oggetto usando lestensione .ko al posto di e .o (ma si ricordi che lestensione in Unix ` solo una convenzione, nel caso conta solo il contenuto). e 10 si chiama cos` un crash fatale del kernel; questo pu` avvenire solo per errori fatali durante lesecuzione dello o stesso (in caso di bug particolarmente gravi, molto rari, o di problemi hardware, assai meno rari), o in fase di boot quando mancano le componenti essenziali per lavvio del sistema.
8

5.1. LA GESTIONE DI KERNEL E MODULI

175

lori generici (come il tipo di processore o la codica NLS11 usata di default) ma la maggior parte possono avere come valori possibili solo y che ne indica linclusione nel kernel (o la semplice attivazione), o, qualora lopzione faccia riferimento ad una funzionalit` che pu` essere a o modularizzata, m. Come scritto nellestratto illustrato in precedenza normalmente .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 congurazione viene eseguita invocando make con uno dei target di congurazione. Il primo target ` config, questo avvia uno script di shell che eettua la congurazione e chiedendo di immettere sul terminale uno per uno i valori da assegnare varie opzioni che si vogliono attivare. Ovviamente eviter` di eseguire ulteriori domande qualora non si attivi una a che le prevede opzione, ma il procedimento ` comunque molto scomodo in quanto non esiste un e meccanismo per correggere una impostazione una volta che si sia fatto un errore, per cui occorre ricominciare da capo. Pertanto ` oggi praticamente in disuso, a parte per una sua versione e modicata, invocabile con il target oldconfig che si limita a rileggere e riprocessare il le di congurazione precedente ricavando da questo, invece che dalle nostre risposte sul terminale, le risposte alle domande. Questo pu` risultare utile qualora si siano eettuate modiche a mano o del le .config e si voglia essere sicuri di ottenere un le di congurazione coerente. Gli altri due target sono menuconfig e xconfig che attivano invece due interfacce utente, testuale la prima e graca la seconda, con nestre e men` che permettono di selezionare inteu rattivamente le varie opzioni ed eettuare 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 grache sono diventate 2, la prima, sempre accessibile con make xconfig ` basata sulle librerie QT, la seconda, accessibile e con make gconfig, ` basata sulle librerie GTK. e

Figura 5.1: Schermata di avvio della congurazione del kernel con make menuconfig.

Eseguendo make menuconfig nella directory dei sorgenti del kernel si otterr` la pagina di a avvio del programma di congurazione, mostrata in g. 5.1. 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 ` basata linterfaccia a nestre. Di norma e
11

il Native Language Support, indica la codica dei vari codici ASCII per le stringhe, come iso8859-1.

176

CAPITOLO 5. AMMINISTRAZIONE STRAORDINARIA DEL SISTEMA

queste vengono installate, ma non altrettanto avviene per i le di dichiarazione necessari alla compilazione, nel qual caso andr` installato il relativo pacchetto12 (e quelli delle glibc, qualora a anchessi fossero assenti). La nestra di avvio riporta nella prima riga in alto la versione del kernel, se si ` modicata e la EXTRAVERSION questa dovr` comparire. Subito sotto c` il titolo della sezione in cui ci si trova a e (nel caso ` il men` principale), seguito da un breve riassunto dei principali comandi disponibili. e u Le frecce verticali permettono di spostarsi nella nestra centrale che contiene le varie sezioni in cui sono state suddivise le opzioni di congurazione. Nella parte bassa ci sono le tre opzioni principali che permettono di selezionare una opzione, uscire dalla nestra corrente e ottenere una nestra di aiuto (contestuale allopzione selezionata), che possono essere cambiate con le frecce orizzontali. Dal men` principale ` possibile selezionare una sezione premendo invio (a meno di non aver u e cambiato lopzione di selezione), e questo ci porter` nella nestra di congurazione delle relative a opzioni, un esempio della quale ` mostrato in g. 5.2. I valori delle opzioni sono riportati e allinizio di ogni riga, quelli indicati fra parentesi tonde sono per le opzioni che richiedono un valore generico, che pu` essere selezionato da un men` a tendina o inserito da una nestra di o u immissione che si attivano quando lopzione viene selezionata.

Figura 5.2: Schermata di congurazione del kernel con make menuconfig.

I valori fra parentesi quadre indicano le opzioni per le quali ` possibile solo scegliere fra e lattivazione o meno e la scelta pu` essere fatta premendo il tasto y per attivare e n per o disattivare, premendo la barra si pu` ciclare fra le due opzioni. Un asterisco indica che la o funzionalit` ` attivata, uno spazio vuoto che non ` attivata. Si tenga presente che se si tratta ae e del supporto per funzionalit` speciche del kernel questo implica che il relativo codice sar` incluso a a monoliticamente, molte di queste opzioni per` servono anche per attivare ulteriori congurazioni o o specicare caratteristiche di unaltra opzione (che pu` anche essere modulare), nel qual caso o le successive descrizioni appariranno indentate. I valori fra parentesi angolari indicano invece le opzioni relative a funzionalit` che possono a 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
le librerie ncurses sono presenti in tutte le distribuzioni, per cui ` sempre il caso di usare i relativi pacchetti, e per Debian sono ncurses e libncurses-dev.
12

5.1. LA GESTIONE DI KERNEL E MODULI

177

` optato per la creazione del relativo modulo, se invece si ha un * la funzionalit` sar` inserita e a a direttamente nel kernel. Inne 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 men` principale). Una u volta che si sono eettuate le proprie scelte selezionando la voce di uscita si pu` tornare al men` o u precedente, se si ` gi` nel men` principale invece si uscir` eettivamente dalla congurazione, e a u a e comparir` una nestra che richiede se si vuole che le nuove congurazioni siano salvate o a scartate, sovrascrivendo un nuovo .config. Due opzioni speciche per il men` principale sono poi quelle disponibili separatamente in u fondo allo stesso, che permettono di salvare i valori della congurazione su, o caricarli da, un le specicabile dalla solita riga di immissione dei dati. Questo pu` comunque essere ottenuto o con delle semplici copie del le .config. Data la quantit` (alcune centinaia) delle opzioni disponibili non ` possibile commentarle a e tutte, pertanto ci limiteremo ad una descrizione sommaria del contenuto delle varie sezioni del men` principale, quelle disponibili con i kernel della serie 2.4.x13 sono le seguenti: u Code maturity level options Questa sezione contiene una sola opzione che se attivata permette di vedere tutte le opzioni che sono classicate come sperimentali; in realt` ` sempre il caso di attivarla ae in quanto buona parte delle opzioni sperimentali sono ampiamente utilizzate e perfettamente funzionanti; le opzioni pericolose vengono ampiamente segnalate nelle relative descrizioni. Loadable module support In questa sezione si attivano le opzioni per abilitare la gestione dei moduli ed il relativo supporto nel kernel. Le opzioni sono tre e in generale si possono attivare tutte, si pu` o disattivare la seconda, che introduce un controllo di versione per i moduli in modo che non vengano caricati per errore moduli compilati per unaltra versione del kernel;14 questo pu` comportare problemi qualora si vogliano utilizzare moduli compilati a parte o o distribuiti in forma binaria. 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). Di particolare importanza ` poi lopzione per il Sime metric multi-processing che consente luso di macchine multiprocessore. Sempre qui vanno attivate le opzioni per luso di grandi quantit` di memoria (High Memory a Support) quando si ha pi` di 1Gb. u General setup Questa ` la sezione dove si attiva il supporto per le funzionalit` principali del kernel, e a in particolare per i vari tipi di bus, per la rete, e per alcuni servizi interni, il formato degli eseguibili. In genere deve essere sempre abilitato il supporto per il bus PCI e per la rete (Networking support e PCI support). Il supporto per il formato ELF (Kernel support for ELF binaries) deve essere sempre incluso nel kernel (` il formato standard degli eseguibili, senza il quale non ` possibile lanciare nessun e e programma). Altre due opzioni essenziali (necessarie al funzionamento moltissimi programmi) sono System V IPC e Sysctl support.
alcune di queste sono presenti solo nelle versioni pi` recenti. u il meccanismo funziona aggiungendo una checksum a tutti i nomi dei simboli del kernel, cosicch le relative e funzioni possono essere chiamate solo allinterno dello stesso kernel.
14 13

178

CAPITOLO 5. AMMINISTRAZIONE STRAORDINARIA DEL SISTEMA

Memory Technology Devices Questa sezione contiene le opzioni relative ai supporti di memoria opzionali come ash, memorie a stato solido ecc. utilizzate prevalentemente nei sistemi embedded. 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. Plug and Play conguration Questa sezione contiene le opzioni per abilitare il supporto alluso del Plug and Play per le schede che lo supportano. Pu` essere completamente modulare. o Block devices Questa sezione contiene le opzioni per abilitare il supporto di una serie di dispositivi a blocchi (i oppy, vari disk-array e RAID hardware, i RAM disk e il loopback). A meno di non avere la radice su uno di questi dispositivi il supporto pu` essere modulare. o Sono in genere da attivare Normal oppy disk support, RAM disk support e Loopback device support. Multi-device support Questa sezione contiene le opzioni per abilitare il supporto del RAID software (vedi sez. ) e del Logical Volume Manager (vedi sez. 6.2). A meno di non avere la radice su uno di questi dispositivi il supporto pu` essere modulare. o Networking options Questa sezione contiene le opzioni relative alla rete, in particolare il supporto per i vari protocolli di rete e tipi di socket e le funzionalit` relative al ltraggio dei pacchetti a (Network packet ltering) ed al routing avanzato. Sono da attivare TCP/IP networking, Packet socket e Unix domain sockets, per gli ultimi due ` possibile e farlo anche in maniera modulare. Se si usa dhclient ` altres` necessario il supporto e per il Socket Filtering. 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. ATA/IDE/MFM/RLL support Questa sezione contiene le opzioni per il supporto del bus IDE, di tutti i relativi dispositivi (dischi, CDROM, ecc.) e dei vari chipset. Se come nella maggior parte dei casi si hanno dischi IDE occorre abilitare ed inserire nel kernel ATA/IDE/MFM/RLL support e nella sottosezione IDE, ATA and ATAPI Block devices le due opzioni Enhanced IDE/MFM/RLL disk/cdrom/tape/oppy support e Include IDE/ATA-2 DISK support, oltre al supporto per il proprio chipset, tutto il resto ` pu` essere modulare. E buona norma lasciare attivi Generic PCI IDE Chipset o Support e Generic PCI bus-master DMA support che permettono lavvio con un supporto generico. Inoltre ` utile attivare lopzione Use PCI DMA by default e when available altrimenti lI/O su disco risulterebbe estremamente rallentato. SCSI support Questa sezione contiene le opzioni per il supporto dei dispositivi SCSI (dischi, CD, 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

5.1. LA GESTIONE DI KERNEL E MODULI

179

IDE-SCSI) e le chiavi di memoria USB (che usano il protocollo SCSI per vedere la memoria come un disco). Se non si ha la radice su un disco SCSI tutto tranne SCSI support, SCSI disk support ed il supporto per il proprio controller pu` essere o ` modulare. E presente una sottosezione per selezionare il supporto per i vari tipi di controller. Fusion MPT device support Questa sezione contiene le opzioni di congurazione per una scheda LSI Logic Fusion. IEEE 1394 (FireWire) support Questa sezione contiene le opzioni per il supporto delle interfacce e dei protocolli per il bus Firewire. I2O device support Questa sezione contiene le opzioni per il supporto del bus di comunicazione I2O usato per la comunicazione a basso livello fra i vari dispositivi presenti sulla scheda madre (ad esempio i sensori di temperatura). Network device support Questa sezione contiene le opzioni di congurazione per le varie schede di rete utilizzabili con Linux (sia ethernet che di altro tipo), pi` il supporto per alcuni protocolli u di comunicazione di basso livello (PPP, SLIP, ecc.) e dispositivi virtuali. Il supporto pu` anche essere modulare, a meno di non avere la radice su un lesystem di rete. o Amateur Radio support Questa sezione contiene le opzioni per la congurazione del protocollo AX.25, detto anche Packet radio, usato dai radioamatori per la trasmissione dati via radio. IrDA (infrared) support Questa sezione contiene le opzioni per il supporto dei dispositivi di comunicazione ad infrarossi (le porte IrDA). ISDN subsystem Questa sezione contiene le opzioni per il supporto dei dispositivi ISDN e dei relativi protocolli. Old CD-ROM drivers Questa sezione contiene le opzioni per il supporto dei vecchi CDROM pilotati direttamente dalla schede audio. Ampiamente in disuso. Input core support Questa sezione contiene le opzioni per il supporto per mouse, tastiere, joystick ed altri dispositivi di interazione (detti Human Interface Device su USB. Character devices Questa sezione contiene le opzioni di congurazione per una serie di dispositivi a caratteri. Sono essenziali le opzioni per il supporto dei terminali (Virtual terminal e Support for console on virtual terminal) che servono allavvio per la console di sistema. Per poter utilizzare connessioni da remoto (ad esempio con ssh) ` poi e necessario il supporto per gli pseudo-terminali (Unix98 PTY support). E sempre in questa sezione che si abilita il supporto per le porte seriali Standard/generic serial support (e se si vuole la console sulla seriale anche Support for console on serial port). Qui pu` essere abilitato il supporto per la stampante su parallela (Parallel o printer support), per luso del bus AGP (/dev/agpgart (AGP Support)) e per il supporto delle accelerazioni grache (Direct Rendering Manager) attraverso la interfaccia DRI di XFree86. Pu` essere inoltre utile abilitare il supporto per lorologio o in tempo reale (Enhanced Real Time Clock Support).

180

CAPITOLO 5. AMMINISTRAZIONE STRAORDINARIA DEL SISTEMA

Multimedia devices Questa sezione contiene le opzioni per il supporto di schede TV e schede radio. File systems Questa sezione contiene le opzioni per il supporto di un gran numero di diversi lesystem. Si deve essere sicuri di inserire nel kernel il supporto per il lesystem della radice (/), qualunque esso sia (i pi` usati sono ext2, ext3 e reiserfs). Qui si pu` u o anche abilitare il supporto per il lesystem dei CDROM (ISO 9660 CDROM le system support), e per i vari lesystem di Windows. E sempre opportuno abilitare il supporto per il lesystem /proc (che ` usato da moltissimi programmi) e per gli e pseudo-terminali (/dev/pts). Una sottosezione a parte ` dedicata ai lesystem di rete e (NFS, SMB ed altri), dove pu` essere congurato il relativo supporto. o Console drivers Questa sezione contiene le opzioni per il supporto di tutta una variet` di diversi dia spositivi a caratteri. Di norma basta congurare solo lopzione VGA text console, a meno di non avere necessit` del framebuer (come avviene per le macchine che non a usano la VGA, come gli Apple). Sound Questa sezione contiene le opzioni relative al supporto delle schede sonore per Linux.

USB support Questa sezione contiene le opzioni per il supporto dei vari chipset del bus USB e dei vari dispositivi che si possono inserire su di esso. Bluetooth support Questa sezione contiene le opzioni per il supporto dei protocolli e dei dispositivi Bluetooth. Kernel hacking Questa sezione contiene le opzioni per la congurazione del supporto di alcune funzionalit` utilizzate principalmente dagli sviluppatori per il debug del kernel. Pu` essere a o 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. Cryptographic options Questa sezione contiene le opzioni per il supporto di vari algoritmi crittograci allinterno del kernel. In genere viene utilizzato per supportare lesystem cifrati e IPSEC. Library routines Questa sezione contiene le opzioni per la congurazioni di alcune librerie usate dal kernel. Una volta completata la congurazione, qualunque sia il metodo con cui la si ` eettuata, e viene salvato il nuovo .config. A questo punto la porcedura cambia a seconda che si stia utilizzando un kernel dalla serie 2.4.x o precedenti o un 2.6. Infatti con la serie 2.6.x anche la procedura di ricompilazione ` stata e profondamente modicata (e migliorata), pertanto quanto segue si applica soltanto ai kernel precedenti la serie 2.6.x. Se ` la prima volta che si compila il kernel, il primo passo ` creare le dipendenze con il e e comando make dep. Il comando esegue due compiti, il primo ` creare le dipendenze15 per e la compilazione, il secondo, se si ` abilitato il controllo della versione dei moduli, ` calcolare e e
cio` determinare quali le di dichiarazione (i .h) sono necessari per produrre i relativi le binari (i .o) e contenenti il codice di kernel e moduli.
15

5.1. LA GESTIONE DI KERNEL E MODULI

181

le informazioni per il versionamento nei simboli.16 Pertanto quando se non si ` abilitato il e versionamento ` necessario eseguire questo comando soltanto la prima volta che si eettua una e compilazione, altrimenti deve essere eseguito ogni volta che si cambia la congurazione, in quanto linformazione sulla versione dei simboli dipende da questa. Il passo successivo ` normalmente quello di compilare il kernel, sui normali PC questo si fa con e il comando make bzImage, che crea lomonima immagine compressa del kernel nella directory arch/i386/boot/; su altre architetture si usa in genere make vmlinux che crea una immagine non compressa nel le omonimo nella directory corrente. Un altro bersaglio possibile ` make e zImage, che crea una immagine compressa, valido anche in per altre architetture. Questo era il bersaglio originale per la creazione delle immagini del kernel, e pu` essere ancora o usato ntanto che il kernel ` di dimensione inferiore a 512kb. Se la dimensione ` superiore occorre e e invece usare make bzImage, non tanto, come qualcuno ancora ritiene, perch cos` limmagine e viene compressa di pi`,17 quanto perch nel primo caso il kernel viene caricato nella cosiddetta u e low memory (cio` sotto i primi 640kiB) e viene utilizzato un meccanismo davvio diverso, mentre e nel secondo caso viene caricato sopra 1MiB. Al giorno doggi lunica ragione per usare zImage ` quella della compatibilit` con alcune e a vecchie versioni di LILO ed alcuni vecchi BIOS che non supportano la procedura di avvio di bzImage, che non risente del limite di 512k nella dimensione, ed ` anche pi` veloce. Questo e u ovviamente vale solo per larchitettura PC, se si usano altre architetture ci possono essere altri bersagli o pu` non essere necessario luso di un kernel compresso (` il caso dellarchitettura PPC o e dei Mac).
Target config oldconfig menuconfig xconfig dep depend zImage bzImage vmlinux modules modules_install clean mrproper distclean Signicato interfaccia di congurazione a linea di comando. interfaccia di congurazione a linea di comando, che riutilizza i valori precedentemente immessi. interfaccia di congurazione a graca testuale, basata sulle librerie ncurses. interfaccia di congurazione graca. crea le dipendenze per la compilazione e le informazioni per il versionamento dei moduli. 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 le 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 le prodotti cercando di riportare lalbero dei sorgenti identico allo stato immediatamente dopo la scompattazione.

Tabella 5.1: Principali target del comando make per la compilazione del kernel no alla versione 2.4.x.

Una volta compilata limmagine del kernel il passo successivo `, se li si sono abilitati, passare e
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. 17 la compressione ` identica nei due casi e viene sempre eettuata con gzip, nonostante il nome bzImage possa e trarre in inganno, bzip2 non viene mai usato.
16

182

CAPITOLO 5. AMMINISTRAZIONE STRAORDINARIA DEL SISTEMA

alla compilazione dei moduli. Questo viene fatto con il comando make modules. La compilazione del kernel (e dei moduli) ` in genere un processo piuttosto lungo e che e utilizza pesantemente le risorse (memoria e CPU) della macchina. Pertanto viene spesso anche usato come test di ecienza.18 Il procedimento pu` essere velocizzato usando lopzione -j del o comando make che consente di parallelizzare la compilazione. Questa ` una funzionalit` del e a tutto generale di make19 che consente di specicare come parametro dellopzione un numero di processi da eseguire in parallelo,20 ciascuno dei quali compiler` parti indipendenti,21 cos` da a avere in generale sempre qualche processo in compilazione anche quando gli altri sono bloccati sullI/O. Una volta eseguita la compilazione i passi successivi riguardano linstallazione; il primo passo ` installare i moduli, questo viene fatto usando un ulteriore target, con il comando make e 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 denita nel Makefile); cos` nel caso si installino i moduli del kernel 2.4.24 i moduli e tutti i relativi le saranno installati in /lib/modules/2.4.24/. I passi successivi sono linstallazione della nuova immagine del kernel e di le relativi. Per questo vengono anche forniti alcuni target per make, ma in genere ` preferibile eseguire loperae zione manualmente, anche perch in questo caso le operazioni sono indipendenti dal bootloader e che si intende usare. Come spiegato in sez. 1.2.3 i le necessari allavvio del sistema sono mantenuti in /boot, pertanto ` qui che deve essere copiata limmagine del kernel, che nella maggior parte dei casi ` e e arch/i386.boot/bzImage; la convezione ` chiamare il le con il nome vmlinuz-versione, dove e la versione ` quella impostata con il Makefile. In genere ` utile anche copiare il le System.map, e e questo contiene le informazioni che permettono di identicare per nome (e non tramite lindirizzo in memoria) le varie routine del kernel, la cosiddetta mappa dei simboli.22 Il contenuto di questo le ` utilizzato dal processo interno al kernel che invia al servizio del e syslog gli eventuali errori riscontrati nellesecuzione del kernel; questi contengono degli indirizzi binari, ed il le viene usato per poter ottenere i nomi delle funzioni coinvolte invece dei loro indirizzi.23 La sua assenza perci` non comporta problemi di funzionamento del sistema, ma solo o una maggiore dicolt` per chi dovr` andare ad analizzare gli errori. a a Lo stesso le ` utilizzato anche in sede di installazione dei moduli quando vengono calcolate e le dipendenze di un modulo da un altro, ed il comando depmod (che vedremo a breve) dar` a degli errori in caso di sua mancanza o di non corrispondenza con il kernel attivo. Come per limmagine del kernel questo viene di norma copiato su /boot appendendo un - e la versione; questo fa si che ogni kernel sia in grado di trovare ed utilizzare la sua mappa. Inne ` buona norma, tutte le volte che si installa un nuovo kernel, salvare anche le opzioni e di congurazione con cui lo si ` prodotto, questo signica copiare anche il le .config, di norma e questo si fa (ad esempio ` la scelta di Debian) copiandolo sempre sotto /boot, con il nome e config-versione.
18 ad esempio pu` facilmente causare il surriscaldamento della CPU, per cui viene utilizzato spesso per vericare o se un overclocking ` andato a buon ne. e 19 in realt` la funzionalit` ` della versione GNU di make, non ` detto la si ritrovi su altre versioni. a ae e 20 la cosa ` particolarmente eciente su macchine multiprocessore. e 21 questo ` possibile sfruttando appunto le informazioni sulle dipendenze usate da make per adare a processi e diversi la compilazioni di sorgenti indipendenti. 22 ` in questo le cio` che viene mantenuto lelenco completo dei nomi delle funzioni esportate (cio` rese visibili e e e anche alle altre funzioni, cos` che queste possano chiamarle) allinterno del kernel, sia quelle presenti nellimmagine di avvio che quelle presenti nei moduli. 23 la funzionalit` di per s non ` essenziale, ma senza questa informazione diventa molto complesso per chi svia e e luppa il kernel capire dove si ` vericato lerrore, ed anche pi` dicile per voi chiedere aiuto o cercare informazioni e u relativamente allerrore stesso.

5.1. LA GESTIONE DI KERNEL E MODULI

183

Ricapitolando, linsieme dei vari passi per ottenere un nuovo kernel ed installare tutti i le relativi, ` il seguente: e
make config make dep make -j 3 bzImage make -j 3 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

dopo di che occorrer` congurare il proprio bootloader (vedi sez. 5.3) per luso del nuovo kernel. a

5.1.4

La gestione dei moduli

Come accennato nella sezione precedente una delle caratteristiche pi` signicative del kernel u Linux ` la modularit`, che permette, tutte le volte che si richiede una funzionalit` mancante, di e a a tentare, prima di restituire un errore, il caricamento del modulo che la provvede. Come abbiamo visto questo comporta la congurazione del relativo supporto nel kernel e la compilazione come moduli delle varie funzionalit` che si vogliono utilizzare in questo modo; inoltre occorre a anche linstallazione di una serie di programmi in user space che permettono di gestire questa funzionalit`: il pacchetto modutils. a Nelle vecchie versioni del kernel la gestione dei moduli era fatta 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 ` stato realizzato con un apposito sottosistema del kernel, e detto kmod. Il meccanismo si basa una apposita funzione interna al kernel24 che prende come parametro una stringa indicante il modulo che si vuole caricare (ma con questa si possono anche richiedere, come vedremo fra poco, funzionalit` generiche) e crea un processo temporaneo interno al kernel a che consente di invocare un apposito programma in user space il quale si incarica di tutte le operazioni necessarie al caricamento del modulo.25 Questo ` di norma modprobe (che esaminee remo in dettaglio a breve) ma si pu` specicare un qualunque altro programma sia attraverso o linterfaccia del sysctl che scrivendolo direttamente in /proc/sys/kernel/modprobe. Il programma fondamentale per luso dei moduli ` insmod, che si incarica di caricare un e modulo allinterno del kernel, leggendolo dal disco, eettuando la risoluzione dei simboli, e collegandolo al codice del kernel. Il comando prende come parametro il nome del modulo, e per trovare il le il comando cerca il corrispondente le oggetto (cio` nome.o) sotto la directory e /lib/modules/uname -r,26 a meno che non si sia usata la variabile di ambiente MODPATH o una diversa opzione nel le di congurazione /etc/modules.conf per indicare una directory diversa. Se il modulo li prevede possono essere ulteriormente specicati dei parametri nella forma parametro=valore dove il parametro dipende dal modulo (la lista dei parametri disponibili per ciascun modulo si pu` ottenere tramite il comando modinfo), ed il valore pu` essere una stringa o o o un numero intero, questultimo specicabile sia in forma decimale (17), che ottale (021), che esadecimale (0x11).
la funzione ` request_module, inizialmente oltre a questa kmod era un processo interno al kernel che girava in e permanenza, poi per` linterfaccia ` stata semplicata in modo da usare solo questa funzione e creare il processo o e su richiesta. 25 data la complessit` delle operazioni non ` possibile eseguire un compito del genere in kernel space, mentre a e usando un programma in user space si possono avere a disposizione tutte le funzionalit` del sistema. a 26 si ` indicata la directory con questa notazione in quanto uname -r restituisce appunto la stringa con il nome e della versione del kernel, ed ` proprio con tale nome che vengono cercati i moduli. e
24

184

CAPITOLO 5. AMMINISTRAZIONE STRAORDINARIA DEL SISTEMA

Si tenga presente che insmod consente di inserire nel kernel solo un modulo alla volta, e per farlo ha bisogno di risolvere tutti i simboli necessari al modulo stesso, se alcuni di questi non sono presenti nel kernel, ma in altri moduli, il comando fallir` con un errore di unresolved a symbol. Come norma di sicurezza il comando non carica i moduli se i relativi le non appartengono allamministratore, onde evitare che il contenuto di un modulo possa essere sovrascritto in caso di compromissione dellutente cui appartiene, con la conseguente possibilit` di far eseguire a direttamente al kernel il codice che si vuole; questo comportamento pu` essere disabilitato con o lopzione -r (ad uso principalmente degli sviluppatori). Inoltre insmod di norma controlla che la versione del kernel corrente e quella del modulo combacino, in questo modo si evita di caricare moduli che appartengano a kernel diversi; anche questo comportamento pu` essere disabilitato con lopzione -f. Si tenga presente per` che in o o questo caso viene evitato soltanto il controllo sulla versione del kernel, il controllo sulluso dei nomi dei simboli non pu` essere evitato, questo signica che se si sono compilati i moduli con il o supporto per il versionamento (che crea dei nomi di simboli contenenti una checksum) non sar` a comunque possibile utilizzarli. Per lelenco completo di tutte le opzioni (alcune sono comunque obsolete, facendo riferimento al vecchi kerneld) con le relative spiegazioni dettagliate si pu` consultare al solito la pagina di o manuale, accessibile con man insmod; le principali opzioni si sono comunque riportate in tab. 5.2 con una breve spiegazione.
Opzione -f -L -h -n -r -v -k Signicato Evita il controllo della corrispondenza fra versione del kernel e versione del modulo. Usa il le locking per prevenire tentativi simultanei di caricare lo stesso modulo. Stampa un sommario del comando e relative opzioni. Esegue tutta la procedura eccettuato il caricamento nale del modulo. Disabilita la condizione che il modulo da caricare sia di propriet` di root. a Abilita la stampa di un maggior numero di informazioni. imposta il ag di auto-clean per il modulo, che viene controllato da kerneld per rimuovere i moduli non pi` u in uso.

Tabella 5.2: Principali opzioni del comando insmod.

Come accennato insmod 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 deniti da un altro modulo, si avr` un problema di dipendenze. Per ovviare a questo problema a c` un secondo comando, modprobe, che permette di risolvere anche tutte le dipendenze, trovare e quali sono gli altri moduli che servono per poterne utilizzare uno, e caricare preventivamente anche questi. Il meccanismo con cui modprobe ` in grado di risolvere le dipendenze si basa sul contenuto e del le modules.dep che si trova nella directory in cui sono installati i moduli. Questo viene di norma prodotto in fase di installazione degli stessi (tramite il comando depmod su cui torneremo pi` avanti) ed ha un formato del tipo: u /lib/modules/2.4.23/kernel/fs/vfat/vfat.o: /lib/modules/2.4.23/kernel/fs/fat/fat.o

che assomiglia a quello di un Makefile, dove per ciascun modulo viene indicato la lista degli altri da cui dipende. Come insmod anche modprobe eettua la ricerca dei moduli da caricare fra quelli compilati per il kernel corrente, nella directory /lib/modules/uname -r, dove questi vengono installati

5.1. LA GESTIONE DI KERNEL E MODULI

185

con make modules_install. In genere i moduli vengono poi suddivisi in ulteriori sottodirectory; questa suddivisione cambia a seconda della versione del kernel. Ad esempio a partire dal kernel 2.4 i moduli sono installati sotto la directory kernel, e allinterno di questa suddivisi per categorie: nel caso avremo fs per il supporto dei lesystem, driver per il supporto delle periferiche, net per il supporto dei protocolli di rete, crypto per gli algoritmi di crittograa. A loro volta i moduli installati sotto drivers sono suddivisi per tipologia di hardware. La potenza di modprobe ` che il comando, oltre alla risoluzione automatica delle dipendenze, e ` in grado anche di caricare pi` moduli in contemporanea e, sfruttando la suddivisione delle e u sottodirectory appena illustrata, anche uno fra tutti quelli che forniscono una certa funzionalit`. a Di norma infatti modprobe prevede come argomento il nome (o i nomi) dei moduli da caricare, (da indicare senza lestensione .o nale), se invece si specica lopzione -t si indica di trattare il parametro successivo come un pattern di ricerca allinterno della directory dei moduli, in questo caso il comando tenter` di caricare in sequenza tutti i moduli il cui pathname corrisponde al a pattern, fermandosi al primo che viene caricato con successo. Questo consente ad esempio di chiedere il caricamento del driver di una scheda di rete (senza dover specicare quale) con un comando del tipo: modprobe -t drivers/net \* dato che in questo caso verranno provati tutti i moduli presenti in quella directory. Specicando anche lopzione -a la stessa operazione verr` eseguita per tutti i moduli della a lista senza fermarsi al primo che ` stato caricato successo. Con lopzione -l invece si avr` la lista e a dei moduli che corrispondono. Inne con lopzione -r si pu` richiedere la rimozione dellintera o pila di moduli caricati in dipendenza dal modulo specicato (sempre che nel frattempo non siano stati utilizzati). Come nel caso di insmod anche con modprobe si pu` specicare un parametro da passare al o modulo che viene caricato, il vantaggio di modprobe ` che attraverso luso del suo le di conie gurazione si possono passare dei valori di default senza doverli scrivere esplicitamente. Le altre opzioni del comando sono riportate in tab. 5.3, lelenco completo ed una descrizione dettagliata delle stesse ` come sempre disponibile nella pagina di manuale, accessibile con man modprobe. e
Opzione -t -a -l -n -r -v -C -c Signicato Usa una lista di moduli da caricare che corrispondono ad un pattern. Carica tutti i moduli della lista specicata con -t invece di fermarsi al primo. Stampa la lista dei moduli che corrispondono ad un certo pattern specicato con -t. Esegue tutta la procedura eccettuato il caricamento nale del modulo. Rimuove il modulo specicato e linsieme di moduli da cui esso dipende, o esegue lautoclean. Abilita la stampa di un maggior numero di informazioni. Permette di usare un dierente le di congurazione (da passare come parametro per lopzione). mostra i valori della congurazione corrente.

Tabella 5.3: Principali opzioni del comando modprobe.

Un comando essenziale per il funzionamento di modprobe ` depmod che crea il le modules.dep e ` che identica le dipendenze fra i vari moduli passati come argomenti sulla riga di comando. E grazie a questo le che ` possibile determinare quali sono i moduli che contengono i simboli e necessari per poter poi caricare una altro modulo, cos` da poter eettuare il caricamento di tutti i moduli nella giusta sequenza. In genere il comando viene sempre invocato senza argomenti e

186

CAPITOLO 5. AMMINISTRAZIONE STRAORDINARIA DEL SISTEMA

con lopzione -a,27 dato che in tal caso esegue il calcolo delle dipendenze con i moduli presenti in tutte le directory specicate in modules.conf. Con lopzione -A il calcolo viene eettuato controllando preventivamente i tempi dei le, aggiornando modules.dep solo se qualcosa ` e cambiato. Una volta che i moduli non sono pi` utilizzati possono essere rimossi con il comando rmmod, u che prende come parametro il nome di un modulo. Ovviamente perch il comando abbia successo e il modulo in questione non deve essere in uso, n contenere simboli usati da un altro modulo e (cio` non devono esserci altri moduli che dipendano da esso). e Se per` si usa lopzione -r il comando esegue una rimozione ricorsiva, cercando di rimuovere o anche i moduli che dipendono dal modulo indicato (diventa cos` possibile eettuare loperazio ne inversa di modprobe). Luso dellopzione -a attiva invece lautoclean, marca cio` i moduli e inutilizzati come ripulire e rimuove i moduli che erano gi` stati marcati come tali. In questo a modo si pu` compiere loperazione in due passi diminuendo la probabilit` di rimuovere moduli o a temporaneamente inutilizzati. Al solito lelenco completo delle opzioni con le relative descrizioni ` disponibile nella pagina di manuale accessibile con man rmmod. e Il comportamento del comando modprobe, e con esso dellintero meccanismo di caricamento automatico dei moduli, che viene realizzato attraverso questo programma, ` determinato dal le e 28 Qui si possono specicare una serie di direttive che di congurazione /etc/modules.conf. permettono di controllare sia le modalit` con cui vengono caricati i moduli, che le directory dove a eettuare le ricerche. Il formato del le prevede anche la presenza di direttive condizionali e luso di variabili, con sintassi analoga a quella della shell, ma queste funzionalit` non sono molto a usate. La direttiva principale che si trova nel le ` alias, che permette di associare un modulo ad e una certa funzionalit`. In realt` la direttiva consente semplicemente di associare un nome (un a a alias appunto) ad un modulo (indicato al solito con il nome del relativo le oggetto, ma senza estensione). In questo modo si pu` usare il nome dellalias al posto di quello del modulo nella o invocazione di modprobe. La potenza reale della direttiva sta nel fatto che il kernel, quando necessita delluso di un certa funzionalit`, utilizza kmod per invocare modprobe, passandogli a come parametro un opportuno identicativo, e si capisce subito allora che basta usare detto identicativo come alias per un certo modulo per ottenere lassociazione di questultimo alla relativa funzionalit`. a Il problema ` allora di sapere quali sono gli identicativi utilizzati dal kernel; un certo numero e di essi sono predeniti,29 ed gi` associati allunico modulo che pu` essere utilizzato. Esistono a o per` tutta una serie di funzionalit` che non sono necessariamente associate ad un unico modulo: o a il caso classico ` quello del controller SCSI (vedi sez. 5.4.2, identicato come scsi-hostadapter, e che deve essere fatto corrispondere al modulo specico della scheda SCSI di cui si dispone, ad esempio se si ha una Adaptec si potr` usare una riga del tipo: a alias scsi-hostadapter aic7xxx Il problema ` che non esiste una lista di riferimento che indichi i nomi delle varie funzionalit`, e a per cui si possono dare solo indicazioni generali. Allora per quanto riguarda ethernet si possono associare le singole interfacce ad un certo modulo (relativo ad una certa scheda) usando il nome dellinterfaccia stessa. Per le schede sonore invece si pu` usare la sound-slot, per il controller o del bus USB (vedi sez. 5.4.4) usb-interface, ecc. Inoltre per le periferiche associate ad un le di dispositivo si pu` usare la notazione generica char-major-NN, o block-major-NN-MM o o direttamente il le di dispositivo stesso; cos` un estratto del le potrebbe essere:
nelle ultime versioni questa ` opzionale. e in alcuni sistemi pi` vecchi pu` essere usato invece il le /etc/conf.modules, che ` deprecato e non deve u o e essere pi` utilizzato. u 29 invocando modprobe -c specicando un le di congurazione vuoto (con -C) si pu` stampare la congurazione o di default.
28 27

5.1. LA GESTIONE DI KERNEL E MODULI


... alias alias alias alias alias alias ... alias alias ...

187

sound-slot-0 dmasound_pmac char-major-14-3 dmasound_pmac /dev/dsp dmasound_pmac sound-service-0-0 i2c-keywest char-major-14-0 i2c-keywest /dev/mixer i2c-keywest eth0 sungem eth1 airport

Si tenga presente inne che si possono tranquillamente creare alias facendo riferimento ad altri alias. Inoltre ci sono due parole chiave che si possono specicare al posto del modulo, con off si indica a modprobe di ignorare le richieste di caricare quel modulo, con null invece si fa si che la richiesta abbia comunque successo, anche se non viene caricato niente. Una seconda direttiva ` option, che prende come primo argomento il nome di un modulo (o e di un alias) seguito dai parametri da passare al suddetto modulo quando viene caricato. Alla direttiva si pu` apporre un add che fa si che i parametri specicati vengano aggiunti ad altri o eventualmente gi` presenti. a Inne la direttiva path permette di specicare le directory in cui eseguire la ricerca dei moduli, questa ha due diverse forme possibili: path=/lib/modules/2.0.*/ path[net]=/lib/modules/uname -r/net nella prima si indica semplicemente una directory, mentre nella seconda si specica anche, fra parentesi quadre, una etichetta che identica una classe di moduli (se non specicata si assume il valore misc). Se la direttiva non viene utilizzata vengono usate le directory predenite che sono le seguenti: path[boot]=/lib/modules/boot path[toplevel]=/lib/modules/uname -r path[toplevel]=/lib/modules/kernelversion path[toplevel]=/lib/modules/default path[toplevel]=/lib/modules ma anche una singola occorrenza della direttiva path sovrascrive questi valori con quanto indicato; se si vuole che queste vengano mantenute si utilizzare la direttiva keep prima di specicare qualunque direttiva path. Un elenco delle altre principali direttive, con relativa descrizione, ` riportato in tab. 5.4, per e lelenco completo e delle spiegazioni pi` dettagliate si pu` al solito fare riferimento alla pagina u o di manuale, accessibile con man modules.conf. Si tenga comunque presente che con il kernel 2.6 il meccanismo di caricamento dei moduli ` stato completamente riscritto, e che quanto illustrato nora fa riferimento solo alle versioni e precedenti (per essere precisi no al kernel 2.5.48, quando ` stato introdotto il nuovo sistema). e Un altro le utilizzato da Debian per la gestione dei moduli ` /etc/modules, che contiene e la lista dei moduli che si vuole siano caricati allavvio del sistema. Il formato del le ` sempre e lo stesso, ogni linea deve contenere il nome di un modulo; le linee vuote o che iniziano per # vengono ignorate. Un possibile esempio di questo le `: e
# # # # # /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.

188

CAPITOLO 5. AMMINISTRAZIONE STRAORDINARIA DEL SISTEMA


Opzione path keep option alias pre-install install post-install pre-remove remove post-remove Signicato denisce una directory dove cercare i moduli. mantiene le directory predenite per la ricerca dei moduli . denisce un parametro opzionale da passare al modulo quando viene caricato. denisce un nome da associare a un modulo. denisce un comando da eseguire prima di caricare il modulo specicato. denisce un comando da usare al posto di insmod per caricare il modulo specicato. denisce un comando da eseguire dopo aver caricato il modulo specicato. denisce un comando da eseguire prima di rimuovere il modulo specicato. denisce un comando da usare al posto di rmmod per caricare il modulo specicato. denisce un comando da eseguire dopo aver rimosso il modulo specicato.

Tabella 5.4: Principali direttive del le di congurazione modules.conf.

#ide-floppy auto # # I2C adapter drivers i2c-isa i2c-ali15x3 # I2C chip drivers w83781d eeprom

Oltre ai comandi per il caricamento dei moduli, il pacchetto modutils contiene altri comandi di gestione. Abbiamo visto che molti moduli possono prendere dei parametri che consentono di specicarne il comportamento. Per sapere quali sono si pu` usare il comando modinfo che o consente di esaminare il le oggetto del modulo ed estrarne una serie di informazioni, la principale delle quali ` la lista dei parametri supportati dal modulo. Un esempio del comando ` il seguente: e e

anarres:/home/piccardi# modinfo radeon filename: /lib/modules/2.4.23-ben1/kernel/drivers/char/drm/radeon.o description: "ATI Radeon" author: "Gareth Hughes, Keith Whitwell, others." license: "GPL and additional rights" parm: drm_opts string

e come si vede questo modulo ha un parametro prm_opts il cui valore ` una stringa. Il comando e supporta una serie di opzioni che gli permettono di stampare solo alcune delle informazioni disponibili, per la descrizione completa si pu` fare riferimento alla relativa pagina di manuale. o Inne il comando lsmod permette di ottenere la lista dei moduli caricati in memoria e tutte le informazioni ad essi relative; il comando non prende opzioni (a parte le classiche -h e -V) n e argomenti; un esempio di questo comando `: e

5.2. LA GESTIONE DEI DISCHI E DEI FILESYSTEM

189

anarres:/home/piccardi# lsmod Module Size Used by Not tainted hid 23156 0 (unused) radeon 111132 1 agpgart 18012 3 ds 8284 1 yenta_socket 11936 1 dmasound_pmac 65408 1 (autoclean) dmasound_core 12832 1 (autoclean) [dmasound_pmac] soundcore 4184 3 (autoclean) [dmasound_core] pcmcia_core 44328 0 [ds yenta_socket] airport 3348 1 (autoclean) orinoco 38616 0 (autoclean) [airport] hermes 9088 0 (autoclean) [airport orinoco] usb-ohci 22848 0 (unused) usbcore 72628 1 [hid usb-ohci]

La prima colonna indica il nome del modulo, mentre la seconda le sue dimensioni. La terza colonna indica quante volte ` usato il modulo, mentre lultima colonna indica se il modulo ` e e inutilizzato o marcato per la rimozione (fra parentesi tonde) e quali altri moduli dipendono da lui (fra parentesi quadre). Un modulo il cui conteggio di utilizzo non sia nullo non pu` essere rimosso, lo stesso vale se o il modulo ha altri moduli che dipendono da lui, a meno di non usare lopzione -r di rmmod.

5.2

La gestione dei dischi e dei lesystem

In questa sezione prenderemo in esame la gestione dei dischi a partire da alcune nozioni relative allhardware, per passare al partizionamento ed ai relativi programmi. Tratteremo inoltre la gestione dei lesystem per quanto riguarda quelle tutte le operazioni (come creazione, riparazione e modica dei parametri interni) che non sono direttamente connesse alluso ordinario (montaggio e smontaggio), che ` gi` stato trattato in sez. 1.2.4. e a

5.2.1

Alcune nozioni generali

Prima di arontare luso dei programmi per la gestione di dischi e lesystem occorre introdurre qualche concetto relativo al funzionamento sico dei dischi rigidi. In genere, e per questo sono 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. Dal disco si pu` sempre o 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. Le prime interfacce IDE separavano sicamente le linee di indirizzamento che consentivano richiedere la lettura di un particolare settore allinterno del disco in tre gruppi. Un primo gruppo serviva per indirizzare le testine dei diversi piatti, da cui il nome head e la sigla H; 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; inne lultimo gruppo indicava come muoversi lungo la coordinata radiale, da cui il nome cylinder e la sigla C. Per questo ancora oggi si parla di geometria di un disco, e quando se ne vuole identicare le dimensione si indica 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` del disco. a

190

CAPITOLO 5. AMMINISTRAZIONE STRAORDINARIA DEL SISTEMA

Il problema ` che nelle prime interfacce IDE cera una separazione sica delle linee che e indicavano questi indirizzi, 10 linee servivano per indicare il cilindro, 4 per le testine, e 6 per i settori, per un totale di 1024x16x63 settori, pari a 504Mib. Anche il BIOS usava questa suddivisione nella routine di accesso al disco (la INT13), 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,30 ed in particolare 10 bit erano utilizzati per indicare il cilindro, 6 bit per indicare il settore ed 8 bit per la testina. La corrispondenza diretta fra valori di head, sector e cylinder e coordinate siche del settore indirizzato ` andata persa quasi subito, non appena i dischi han cominciato a superare le dimene sioni massime previste dallinterfaccia IDE originale. Ma per mantenere la compatibilit` con i a sistemi operativi che usavano il BIOS, linterfaccia di accesso di questultimo ` rimasta invariae ta, laccesso ad un settore veniva eseguito direttamente dallhardware in maniera trasparente, indipendentemente dalla geometria reale del disco. Dato che il parametro indicante la testina ` e di 8 bit, la dimensione massima ottenibile con questa interfaccia ` di un totale di 1024x256x64 e settori, pari a circa 8.4GiB, a lungo considerato un limite irraggiungibile. Il limite irraggiungibile ` stato per` raggiunto piuttosto presto, ma a questo punto ci si e o ` trovati di fronte al limite non pi` superabile delle restrizioni sui valori massimi di cilindro, e u testina e settore, da cui deriva il famoso problema di non poter accedere a dischi oltre il 1024simo cilindro che aigge i BIOS pi` vecchi, ed i sistemi operativi e le vecchie versioni di LILO u che sono in grado di usare soltanto linterfaccia originaria. Tutto questo ` stato superato con lintroduzione del Linear Block Addessing, in cui anche e per i dischi IDE laccesso ` eseguito, come per i dischi SCSI,31 specicando semplicemente un e numero di settore che cresce linearmente da 0 al valore massimo. Questo per` comporta che la o vecchia interfaccia non ` pi` utilizzabile; per questo nei BIOS pi` recenti al posto della vecchia e u u INT13 pu` essere usata anche una INT13 estesa che utilizza direttamente il numero del settore o in forma lineare. Resta il problema che alcuni sistemi operativi e vari programmi non sono in grado di utilizzare questa nuova interfaccia, e per loro deve essere usata la vecchia interfaccia. In genere il problema della geometria non si pone assolutamente per Linux, dato che il kernel ` in grado di accedere nativamente allinterfaccia IDE ed indirizzare direttamente laccesso ai e singoli settori, per cui non risente aatto delle limitazioni del BIOS, il problema invece si pone per un bootloader come LILO che dovendo stare nei pochi byte a disposizione nel Master Boot Record (vedi sez. 5.2.2) non pu` implementare un suo accesso indipendente. Il che signica o che se si mette il kernel in una zona del disco oltre il 1024-simo cilindro con dei BIOS che non supportano LBA, LILO non sar` in grado di leggerlo. Questo ` un problema che in tutti a e i computer moderni ` abbondantemente superato, ma che si pu` presentare ancora quando si e o mettono dischi nuovi su macchine molto vecchie. In tal caso si deve avere laccortezza di mettere il kernel in una sezione di disco che sia entro il 1024-simo cilindro (cio` nella parte iniziale del disco). Questo pu` voler dire la necessit` di e o a creare una partizione iniziale (di solito la si monta sotto /boot) su cui si mettono le immagini del kernel; ma pu` essere un problema quando nella prima partizione si ` installato Windows e o e questa ` troppo grossa. e

5.2.2

Il partizionamento

Uno dei compiti di preparazione che occorre eseguire tutte le volte che si installa un nuovo disco ` quello di suddividerne lo spazio in opportune partizioni. In genere questo viene fatto e
per i dettagli sui registri e su tutte le varie limitazioni storicamente susseguitesi si pu` leggere il Large Disk o HOWTO. 31 il protocollo SCSI non ha mai avuto problemi di geometria, dato che ha sempre previsto luso di un valore lineare per indicare il settore, anche se poi il BIOS si doveva inventare una geometria per poter usare le sue routine di accesso.
30

5.2. LA GESTIONE DEI DISCHI E DEI FILESYSTEM

191

allinstallazione del sistema attraverso il programma di installazione, che in tutte le distribuzioni pi` recenti ` in grado di eseguire il compito in maniera semi-automatica. Quando si installa un u e nuovo disco, o se si vuole eettuare loperazione manualmente per avere un maggior controllo, occorre utilizzare un apposito programma, fdisk. Prima di entrare nel dettaglio del funzionamento di fdisk e derivati ` comunque oppore tuno dare alcuni cenni sui criteri base del partizionamento. Anzitutto occorre ricordare che nellarchitettura del PC esiste (a causa delle limitazioni storiche) un limite massimo al numero di partizioni siche eettive (dette anche partizioni primarie), queste vengono memorizzate nel primo settore di ciascun disco, quello che viene chiamato, dato che ` sempre l` che viene installato e il bootloader per lavvio del sistema, il Master Boot Record. Una parte di questo settore costituisce la cosiddetta tabella delle partizioni, e dato lo spazio limitato questa non pu` contenerne o pi` di quattro. Qui vengono memorizzate settore di inizio e di ne delle partizioni. I u Architetture meno obsolete (come SPARC, PowerPC Apple, o Alpha) non hanno questo limite, ed il numero di partizioni ` sostanzialmente arbitrario. Per superare questa limitazione e dellarchitettura PC sono state introdotte le cosiddette partizioni logiche o estese. In tal caso quello che si fa ` di indicare nella tabella delle partizioni sullMBR lutilizzo di una partizione e estesa e poi utilizzare il settore di inizio di questultima per installarvi una ulteriore tabella delle partizioni, in modo da poterne utilizzare di altre, che vengono chiamate logiche o secondarie, in numero pi` elevato. u Come accennato in sez. 1.2.4 le partizioni vengono indicate nel le di dispositivo che si riferisce ad un disco con il relativo numero. Le partizioni primarie sono sempre numerate da 1 a 4, mentre quelle logiche iniziano dal 5, cos` ad esempio /dev/hda2 ` la seconda partizione e primaria del primo disco del primo canale IDE, mentre /dev/hdb5 ` la prima partizione logica e del secondo disco del primo canale IDE. Partizioni primarie e secondarie possono coesistere, nei termini in cui si usa una partizione primaria per indicare la tabella delle partizioni secondarie. In genere questo lo si fa creando tre partizioni primarie ed usando la quarta per le partizioni secondarie, ma si pu` usare una o partizione primaria qualunque, (ad esempio la seconda) tenendo presente per` che si ` utilizzata o e una partizione primaria per indicare le partizioni estese, le partizioni primarie successive (nel caso la terza e la quarta) non saranno pi` utilizzabili. u Il comando che tradizionalmente viene utilizzato per ripartizionare un disco32 ` fdisk, sulla e sua base sono stati creati anche altri programmi (ad esempio il diskdrake usato dallinstallatore di Mandrake che ha una interfaccia utente graca ed ` pertanto pi` facile da usare), ma noi e u faremo riferimento solo a questo e alla variante cfdisk. Il comando prende come argomento il le di dispositivo che indica un disco (ad esempio /dev/hdc per un disco IDE o /dev/sda per un disco SCSI), lunica opzione che ha senso usare ` -l che si limita a stampare la tabella delle partizioni presente. Le altre opzioni servono e per specicare le caratteristiche del disco e non servono pi` in quanto i valori sono determinati u automaticamente (e per quanto riguarda numero di cilindri, testine e settori possono essere modicati anche allinterno del comando). Quando il comando viene lanciato stampa un messaggio di benvenuto, e avvisa di possibili problemi (vedi sez. 5.3.2) quando il numero dei cilindri ` e maggiore di 1024. Un esempio del risultato del comando ` il seguente: e

32

su un PC, non tratteremo qui le altre architettura, che hanno programmi diversi.

192

CAPITOLO 5. AMMINISTRAZIONE STRAORDINARIA DEL SISTEMA

monk:/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 si pone in attesa dei comandi che vengono specicati con le relative lettere. Cos` se vogliamo una lista dei comandi possibili possiamo premere m, 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):

ed allora con p potremo stampare la tabella delle partizioni corrente:


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 mostra due partizioni, di cui una normale, una per la swap. Si noti anche come viene riportata una geometria per il disco; questa ` quella che ` vista dal kernel, ed in genere coincide e e con quanto visto dal BIOS, ma ` possibile cambiarla (anche se inutile) con una dei comandi delle e funzionalit` avanzate. a A questo punto si pu` usare d per cancellare una partizione (ne chieder` il numero), ed n per o a crearne una nuova, nel qual caso prima chieder` se primaria o secondaria e poi il relativo numero. a Una volta scelta la partizione il programma chieder` il settore di partenza (proponendo come a default il primo che risulta libero) e la dimensione: questultima pu` essere specicata in varie o unit` di misura o direttamente con il settore nale (il comando propone come default lultimo a settore del disco). Il comando t permette di impostare il valore numerico che identica il tipo di partizione; questo viene in genere utilizzato per indicare che tipo di lesystem sar` contenuti nella stessa. a

5.2. LA GESTIONE DEI DISCHI E DEI FILESYSTEM

193

Per i lesystem di Linux il valore ` 83 (in esadecimale) e vale per tutti i lesystem. I lesystem e Windows invece usano vari codici diversi a seconda del tipo di lesystem. Il valore 82 ` invece e usato per indicare una partizione destinata alluso come swap (vedi sez. 5.2.5). Altri valori usati da Linux sono fd per indicare le partizioni usate per il RAID software (vedi sez. 6.1 e 8e per quelle usate per il Logical Volume Manager (vedi sez. 6.2). Qualunque modica si eettui sulla tabella delle partizioni non sar` mai registrata eeta tivamente su disco ntanto che non si d` il comando w, il quale comunque chieder` conferma a a avvertendo che si possono perdere tutti i dati presenti sul disco. Si esce da fdisk con il comando q, che per` non salva le modiche eettuate. o Un comando alternativo a fdisk ` cfdisk, una versione pi` amichevole che permette luso e u una interfaccia testuale semigraca ed interattiva in cui si possono eseguire le varie operazioni spostandosi su comandi e partizioni con luso delle frecce. In g. 5.3 ` mostrata la schermata di e cfdisk, dalla quale ` poi possibile dare tutti i comandi. e

Figura 5.3: Schermata del comando cfdisk.

Ovviamente il partizionamento di un disco ` una operazione privilegiata, che pu` compiee o ` re solo lamministratore. E anche un compito delicato, in quanto se si cambia la tabella delle partizioni cancellando o modicando una di quelle presenti il relativo contenuto andr` perso.33 a Occorre quindi stare molto attenti ed evitare di salvare le modiche ntanto che non si ` assolue tamente sicuri di quanto si ` fatto. Infatti ogni lesystem viene creato per stare esattamente nelle e dimensioni di una partizione, se se ne modicano le dimensioni o la posizione le informazioni del lesystem non saranno pi` utilizzabili. u Per questo in genere occorre pianicare bene le dimensioni delle partizioni n dallinizio, perch modicarle in un secondo tempo comporta quasi sempre la necessit` di dover fare un e a backup dei contenuti. Esiste comunque un comando molto utile, parted (per il quale rimandiamo alla relativa documentazione, disponibile sia nella pagina di manuale, che nelle FAQ distribuite con il pacchetto), che permette di ridimensionare un lesystem e restringere le relative partizioni, anche se loperazione resta complessa e delicata. Per questo nellinstallazione occorre normalmente decidere una strategia di partizionamento, cio` decidere quante partizioni fare e come assegnarle; per questo occorre tenere ben presenti le e
al riavvio successivo, in quanto il kernel legge la tabella delle partizioni allavvio e la mantiene in memoria; per questo se si ripartizione un disco in uso occorre riavviare il sistema.
33

194

CAPITOLO 5. AMMINISTRAZIONE STRAORDINARIA DEL SISTEMA

indicazioni su contenuto delle varie directory di sistema illustrate in sez. 1.2.3. Una delle strategie pi` semplici ` quella di creare una partizione unica e mettere tutto quanto su di essa. Questo u e schema ha il vantaggio di non doversi preoccupare del dimensionamento delle altre partizioni n e del rischio di esaurire lo spazio su una mentre le altre sono vuote. Ha per` lo svantaggio che o se si deve reinstallare il sistema i dati degli utenti e quelli di sistema (come pagine web, posta archiviata e tutto quanto in genere si tiene sotto /var) verr` cancellato. Inoltre se si hanno pi` a u dischi non ` ovviamente possibile mettere tutto su una sola partizione. e Per questo di solito si preferisce creare almeno una partizione su cui montare /home per i dati degli utenti, ed unaltra per /var. Se poi si vuole separare anche quanto strettamente necessario allavvio dal resto del sistema si pu` mettere anche /usr su una partizione separata. Inne in o certi casi (per il solito problema del 1024 cilindro visto in sez. 5.3.2) pu` essere necessario creare o una partizione separata per /boot. Inne se si opera spostando tutto il possibile su partizioni separate si avr` una riduzione del a contenuto della radice che consente di attuare una strategia di ridondanza in cui si tengono due copie della stessa su due partizioni diverse. In questo modo se per qualche motivi si danneggiano le essenziali per il sistema, si avr` sempre a disposizione laltra partizione con un sistema a pienamente funzionale. Usare varie partizioni (e pi` dischi) ha comunque una serie di controindicazioni; anzitutto u si pu` sprecare inutilmente spazio disco quando una partizione si riempie mentre le altre sono o 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 ` il massimo delleleganza, e e pu` comportare una serie di problemi per i programmi di backup che di norma vengono usati o imponendo di archiviare solo i le presenti sul lesystem corrente, per evitare di inserire nel backup cose che non centrano nulla. Inoltre una volta che si sono spostate /home, /var e /usr (ed eventualmente /opt) non ` e che resti molto altro, e per quanto grandi si possano fare le partizioni, non si risolver` mai il a problema di esaurire lo spazio in quelle con la maggior parte dei contenuti, se loccupazione cresce oltre la capacit` del pi` grande dei dischi che si hanno. Per questo spesso ad esempio si ` a u e costretti ad usare pi` dischi per le home directory degli utenti, che non possono essere pi` tenute u u sotto una directory unica, ma andranno suddivise su path diversi, complicandone la gestione. Come si vede luso delle partizioni comporta una serie di potenziali problemi di gestione dovuti alla necessit` di pianicare adeguatamente la gestione dello spazio disco; per risolverli a alla radice ` disponibile, a partire dai kernel della serie 2.4.x il sistema del Logical Volume e Manager (che tratteremo in sez. 6.2) che permette di unire partizioni34 e dischi sici diversi in dei volumi logici allinterno dei quali creare i relativi lesystem.

5.2.3

La creazione di un lesystem

Abbiamo visto in sez. 1.2.4 come si pu` rendere disponibile il contenuto di un lesystem nellalo bero delle directory; quando si installa il sistema per` (o quando si aggiunge un disco) i lesystem o devono essere creati, in modo da strutturare lo spazio disponibile (che sia una partizione o un dispositivo sico o virtuale) per luso, operazione comunemente detta formattazione. Si tenga presente che questa ` una operazione diversa dalla formattazione sica del dispositivo e che divide lo spazio sul disco in tracce e settori, come quella che di solito si fa sui dischetti. In genere per gli hard disk questa operazione non ` pi` necessaria dato che viene eseguita e u direttamente dal fabbricante una volta per tutte. Si deve invece eseguirla per i oppy, con il comando fdformat, ma questo non comporta che poi si possa utilizzarlo, occorrer` anche creare a il lesystem: in Linux infatti la formattazione sica del dispositivo e la creazione del lesystem,
si noti come in g. 5.3 compaia appunto una partizione di tipo Linux LVM, che ` quella da usare per i volumi e sici che verranno usati con LVM come componenti di un volume logico.
34

5.2. LA GESTIONE DEI DISCHI E DEI FILESYSTEM


Filesystem reiserfs Opzione -b N -s N -j file -h hash msdos -F N -n name -c vfat ext2 -b N -F -i N -j -j -m N -c -L ext3 Descrizione mkreiserfs Specica la dimensione dei blocchi. Specica la dimensione del giornale. Specica un le di dispositivo per il giornale. Specica un algoritmo di hashing per la ricerca veloce dei le allinterno delle directory. mkfs.msdos Specica la dimensione della FAT (File Allocation Table). Specica un nome per il volume (11 caratteri). Esegue il controllo del dispositivo per eventuali settori difettosi. mkfs.vfat Identiche a mkfs.msdos. mkfs.ext2 Specica la dimensione dei blocchi. Forza successivo controllo del lesystem. Specica ogni quanti byte di spazio disco deve essere creato un inode, non pu` essere inferiore alle dimensioni di un blocco. o Crea il giornale per il lesystem (equivalente ad invocare il comando come mkfs.ext3). Permette di specicare i parametri per la gestione del le di giornale. Specica 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 lesystem (che pu` essere utilizzata per farvi o riferimento al posto del le di dispositivo) . mkfs.ext3 Identiche a mkfs.ext2.

195

Tabella 5.5: Le principali opzioni per i comandi di creazione dei lesystem.

che sono comunque delle operazioni operazioni distinte nonostante alcuni sistemi operativi le eseguano insieme, vengono sempre tenute separate. La creazione di un lesystem su un dispositivo si esegue con il comando mkfs, questo prende come parametro il le di dispositivo su cui si vuole creare il lesystem, mentre il tipo di lesystem che si vuole creare si specica con lopzione -t. In realt` il comando ` solo un front-end, che a e chiama, per ciascun tipo di lesystem, un comando specico. Cos` ad esempio se si vuole formattare un lesystem msdos con mkfs -t msdos verr` invocato mkfs.msdos. In generale i a programmi di formattazione sono forniti insieme agli altri programmi di supporto per il lesystem (come quelli per il controllo di consistenza) e possono avere un nome specico (ad esempio per Reiser FS il programma si chiama mkreiserfs) che pu` essere invocato direttamente, ma perch o e la forma generica mkfs -t type funzioni deve essere presente il corrispondente mkfs.type. Le altre opzioni dipendono dal lesystem 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 lesystem ` riportato in tab. 5.5. e Bench oggi esistano molteplici alternative (Reiser, JFS, XFS), il lesystem pi` usato con e u Linux ` ext2, o il suo fratello maggiore ext3, che mantiene una identica struttura dei dati e su disco, e viene gestito semplicemente in maniera diversa a livello del kernel. Per questo motivo esamineremo, anche nelle sezioni seguenti, i vari comandi specici della gestione di questo lesystem (che valgono anche per ext3), a partire da quello usato per la creazione, mke2fs, un cui esempio `: e

196

CAPITOLO 5. AMMINISTRAZIONE STRAORDINARIA DEL SISTEMA

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 specicare altro che il dispositivo35 da formattare il comando si limita a creare ` il lesystem, stampando tutta una serie di informazioni ad esso relative. E particolarmente signicativa quella relativa a dove sono stati posti i vari backup del superblock 36 questo infatti ` e un blocco speciale che contiene tutte le informazioni relative alla congurazione del lesystem, ed ` essenziale per poterlo montare. La perdita del superblock causerebbe la perdita completa e del lesystem per cui ne vengono mantenute varie copie in modo che in caso di distruzione o corruzione si possa usare una delle copie. Pertanto ` bene annotarsi la posizione delle varie e copie, anche se ` possibile recuperarla in un secondo momento con dumpe2fs. e Al di l` della invocazione diretta appena mostrata il comando prevede numerose opzioni che a permettono di impostare tutta una serie di caratteristiche del lesystem che si va a creare. Una delle principali ` la dimensione dei blocchi in cui lo spazio disco viene suddiviso, da specicare e tramite lopzione -b. Con blocco si indica in genere lunit` minima di spazio disco che viene a allocata per inserirvi i dati di un le; in genere37 ogni le consuma almeno un blocco, e le dimensioni dei le 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 lesystem.38 Qualora si usi un valore negativo questo viene preso come limite inferiore per la dimensione di un blocco. Un altro parametro importante ` quello del numero di inode da creare (si ricordi che, come e detto in sez. 1.2.2, ogni le ` sempre associato ad un inode). Questi di norma vengono mantenuti e in una sezione apposita del lesystem, le cui dimensioni vengono determinate in sede di creazione del lesystem.39 Il comando permette, con luso dellopzione -i di impostare ogni quanti byte di spazio disco deve essere creato un inode. Si deve dare cio` la valutazione della dimensione e
anche se volendo si pu` anche usare un le normale che potr` poi essere montato in loopback. o a la spiegazione esatta del signicato dei vari parametri come quelli relativi a group blocks e fragments va al di l` di quanto sia possibile fare qui, in breve per` si pu` dire che un lesystem ext2 divide lo spazio disco in blocchi a o o 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` completa di pu` leggere il le filesystem/ext2.txt distribuito nella documentazione allegata ai sorgenti del u o kernel. 37 per alcuni lesystem pi` evoluti, come Reiser, esistono dei meccanismi automatici che permettono di mettere u il contenuto di diversi le di piccole dimensioni in un solo blocco. 38 questo pu` essere indicato tramite lopzione -T, che prende i tre valori news, largefile e largefile4 e assegna o un diverso rapporto fra numero di inode e spazio disco disponibile. 39 alcuni lesystem pi` evoluti permettono di cambiare questo parametro anche in un secondo tempo. u
36 35

5.2. LA GESTIONE DEI DISCHI E DEI FILESYSTEM

197

media di un le sul disco, specicare un valore troppo alto creer` pochi inode, con il rischio di a esaurirli, un valore troppo basso ne creer` troppi, con conseguente spreco di risorse. a Si tenga presente che per la gestione dei le in un lesystem blocchi e inode sono due risorse indipendenti, si possono cio` esaurire sia i blocchi liberi che gli inode disponibili (anche se il e primo caso ` di gran lunga quello pi` comune), e trovarsi cos` nella condizione di non poter pi` e u u creare nuovi le. 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` veloci nella ricerca, ma si corre u il rischio di nirli prima di esaurire lo spazio disco. Altre caratteristiche aggiuntive di un lesystem ext2 possono essere impostate attraverso lopzione -O, che prende una lista di parametri, separata da virgole se sono pi` di uno, che u specicano la caratteristiche da abilitare. I valori possibili per i parametri di -O sono illustrati in tab. 5.6. Di default vengono attivate le due caratteristiche sparse_super e filetype, che per` non sono compatibili con le implementazioni di ext2 antecedenti i kernel della serie 2.2, per o cui se si deve utilizzare il lesystem con un kernel 2.0 ` necessario specicare come parametro il e valore none che disabilita tutte le caratteristiche aggiuntive.
Parametro dir_index filetype has_journal journal_dev sparse_super Signicato usa una struttura ad alberi ed hash per la gestione del contenuto delle directory. memorizza il tipo di le nelle voci delle directory. crea anche il le per il giornale (equivalente alluso di -j). richiede che sul dispositivo indicato sia creato un giornale invece di un lesystem. crea un lesystem con meno copie del superblock per non sprecare spazio sui lesystem molto grandi.

Tabella 5.6: Parametri per lattivazione delle estensioni dei lesystem ext2 attivabili mediante lopzione -O di mke2fs.

Nel caso si voglia creare un lesystem di tipo ext3, si deve utilizzare -j che permette di creare un le apposito per il giornale (aronteremo il tema dei lesystem journalled in sez. 5.2.4), a questa si abbina di solito -J che permette di specicarne delle ulteriori caratteristiche. Qualora non venga utilizzata sono utilizzati i valori di default, altrimenti questi possono essere specicati nella forma parametro=valore; un elenco dei parametri specicabili con -J ` illustrato in e tab. 5.7, con relativa spiegazione.
Parametro size Signicato Specica la dimensione del giornale, da specicare in MiB. 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 le di dispositivo si pu` specicare una letichetta associata al lesystem (con o lopzione -L). Il dispositivo che fa da giornale deve essere inizializzato con il mke2fs -O journal_dev.

device

Tabella 5.7: Parametri per la gestione del giornale di un lesystem ext3 specicabili tramite lopzione -J di mke2fs.

Un problema che si pu` avere nella gestione dei dischi ` quello dei settori difettosi. In genere o e lavvenire di errori di questo indica che il disco si sta degradando, ed ` bene provvedere ad un e ` backup ed alla sua sostituzione. E comunque possibile, con ext2 ed ext3, creare il lesystem in modo da non utilizzare i blocchi contenenti settori difettosi attraverso lopzione -c che esegue

198

CAPITOLO 5. AMMINISTRAZIONE STRAORDINARIA DEL SISTEMA

un controllo per vericarne la presenza ed escluderne dalluso qualora rilevati. Qualora lopzione venga specicata due volte il controllo viene eseguito in maniera distruttiva (ed estremamente lenta), scrivendo e rileggendo tutto il disco. Specicando lopzione -l invece di eseguire il controllo direttamente su legge una lista di questi blocchi da un le; di norma questo pu` essere o prodotto indipendentemente dal programma badblocks che ` quello che viene eseguito anche e quando di usa -c per eettuare il controllo. Le altre opzioni principali di mke2fs sono riportate nella lista di tab. 5.5, per un elenco si faccia al solito riferimento alla pagina di manuale. Se lo si usa indipendentemente da mke2fs anche badblocks vuole come argomento il le di dispositivo da esaminare, ed opzionalmente il blocco di partenza e quello nale del controllo. Si deve aver cura di specicare con lopzione -b la dimensione dei blocchi, che dovr` ovviamente a coincidere con quella usata con mke2fs, per cui in genere ` sempre meglio non usare direttamente e il programma, ma invocarlo tramite mke2fs o e2fsck. Lopzione -c permette di selezionare quanti blocchi vengono controllati alla volta (il default ` 16), aumentandolo si accresce la velocit` di esecuzione del comando, ma anche il suo consumo e a di memoria. Con lopzione -i si indica un le contenente una lista nota di blocchi danneggiati (quella presente nel lesystem ` ottenibile con dumpe2fs), mentre con -o si indica un le su e scrivere i risultati. Inne ci sono una serie di opzioni per indicare il tipo di test da eseguire, normalmente viene eseguita una lettura dei blocchi per vericare errori, se non ce ne sono si prosegue; con -p che pu` specicare quante volte ripetere la scansione di un blocco prima di decidere che non ci o sono errori, con -w si richiede di eseguire il controllo scrivendo dei dati e poi rileggendoli per vericarne lintegrit`; il metodo ` molto pi` preciso, ma anche molto pi` lento, inoltre in questo a e u u modo il controllo ` distruttivo in quanto sovrascrive i dati, pertanto non pu` essere usato su e o un lesystem montato. Si pu` eseguire questo stesso tipo di test in modalit` non distruttiva o a con lopzione -n, nel qual caso per` il controllo diventa estremamente lento. Per le rimanenti o opzioni del comando si pu` al solito fare riferimento alla pagina di manuale. o Una volta creato il lesystem, come anche mostrato nelloutput di mke2fs, si possono modicarne alcune caratteristiche con luso del comando tune2fs. Luso pi` comune di tune2fs ` u e probabilmente quello per trasformare un lesystem ext2 in un lesystem ext3 creando il giornale; questo ` ottenibile immediatamente con lopzione -j, e si pu` usare -J con le stesse opzioni e o di tab. 5.7 per indicare le caratteristiche del giornale. Unaltra opzione di uso comune ` -c che permette di impostare il numero di volte che il e lesystem pu` essere montato senza che venga forzato un controllo di consistenza con fsck, o analoga a questa ` -i che specica lintervallo massimo, in giorni, mesi o settimane, fra due e controlli. Con -C si pu` anche modicare a mano il contatore del numero di volte che un o lesystem ` stato montato, in modo da poter forzare il controllo ad un successivo riavvio. e Con lopzione -O si possono modicare in un secondo tempo le caratteristiche avanzate specicando come parametro una lista dei valori gi` illustrati in tab. 5.6, in questo caso per a disabilitare una funzionalit` si pu` apporre un carattere ^ al corrispondente parametro. Si a o tenga presente che se si modicano i parametri sparse_super o filetype sar` poi necessario a eseguire una riparazione del lesystem con e2fsck. Le altre opzioni principali sono illustrate in tab. 5.8, al solito si pu` ottenere lelenco completo o ed una descrizione dettagliata nella pagina di manuale del comando.

5.2.4

Controllo e riparazione di un lesystem

Come gi` accennato in sez. 5.2.3 il comando dumpe2fs pu` essere usato per recuperare una serie a o di informazioni riguardo ad un lesystem ext2. 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 specicando lopzione -h:

5.2. LA GESTIONE DEI DISCHI E DEI FILESYSTEM


Opzione -c Signicato Imposta il numero di volte che un lesystem pu` esseo re rimontato prima di subire un controllo; prende come parametro un numero. Modica il contatore del numero di volte che un lesystem ` stato montato; prende come parametro un e numero. Modica il comportamento del kernel quando viene rilevato un errore sul lesystem, prende come parametro uno dei valori: continue (continua ignorando lerrore), remount-ro (rimonta il lesystem 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 lesystem. sovrascrive i parametri del giornale, prende come parametro uno dei valori di tab. 5.7. stampa i contenuti del superblock (come dumpe2fs). Imposta il nome del volume, per un massimo di 16 carat` teri. E questo nome (detto anche label ) che pu` essere o usato da vari comandi per indicare il lesystem al posto del dispositivo. Imposta la percentuale di blocchi riservati (messi a disposizione dellutente specicato con -u, di norma lamministratore). Imposta le caratteristiche avanzate del lesystem, prende come parametri uno dei valori di tab. 5.6. Imposta il numero di blocchi riservati. Imposta lutente che pu` usare i blocchi riservati. o Imposta luniversally unique identier (UUID) del lesystem, un numero (espresso in cifre esadecimali) che identica il lesystem (in maniera analoga alla label ).

199

-C

-e

-i

-j -J -l -L

-m

-O -r -u -U

Tabella 5.8: Principali opzioni per il comando tune2fs.

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 Check interval: 15552000 (6 months) Next check after: Fri Jun 18 15:45:22 2004

200

CAPITOLO 5. AMMINISTRAZIONE STRAORDINARIA DEL SISTEMA

Le altre opzioni principali del comando sono -b, che restituisce lelenco dei blocchi marchiati come danneggiati in un lesystem, -ob che permette di specicare 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 ` una informazione necessaria solo in caso di e corruzione del lesystem). Inne -i permette di leggere le informazioni invece che dal lesystem da una immagine create 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 lesystem ext2 ` quella di crearne una immagine con il comando e2image. e Questo comando permette di salvare su un le i dati critici del lesystem 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 lesystem ed il nome del le su cui salvare limmagine. Lunica opzione ` -r che crea una immagine binaria che pu` essere usata dai vari programmi di e o 40 controllo come se fosse lintero lesystem. In generale il funzionamento dei lesystem in Linux ` estremamente stabile, ed una volta e creati ` praticamente impossibile41 danneggiarli nel corso delle normali operazioni. Se per` si ha e o un black-out improvviso, o qualcuno inciampa nel cavo di alimentazione del server, ` normale che e il lesystem, dal momento in cui laggiornamento dei dati su disco ` stato interrotto brutalmente, e si possa trovare in uno stato incoerente. In questo caso si pu` avere un danneggiamento della struttura del lesystem, che deve essere o riparato. In genere ogni lesystem prevede lesistenza di un ag su disco, attivato quando viene montato, che indica che ` in uso, e che viene azzerato solo quando il lesystem viene smontato e (nel qual caso si ` certi che tutte le operazioni sospese sono state completate e lo stato ` coerente). e e Se c` stata uninterruzione della corrente questo ag rester` attivo ed il sistema potr` rilevare, e a a al successivo tentativo di montaggio, che qualcosa ` andato storto. e Quello che pu` succedere in questi casi dipende dal lesystem. Coi lesystem tradizionali di o norma mount rileva lerrore e non monta il lesystem o lo monta in sola lettura (a seconda delle opzioni scelte). A questo punto occorre usare lopportuno programma di controllo per vericare lo stato del lesystem ed eventualmente riparare gli errori. Di norma in caso di rilevamento di un errore questo viene automaticamente avviato. In genere la procedura di controllo e riparazione pu` essere molto lunga e complessa, speo cie per lesystem di grandi dimensioni, in quanto prevede una serie di controlli accurati per identicare informazioni incoerenti e parziali, che comportano varie scansioni del contenuto del lesystem. Questo pu` signicare dei tempi che possono diventare ore o addirittura giorni per i o dischi pi` grandi; per questo molti dei lesystem pi` avanzati supportano il cosiddetto journalu u ling, che permette di evitare questo procedimento e riportare il lesystem in uno stato coerente con grande velocit`. a Il concetto fondamentale del journalling ` che le operazioni sul lesystem vengono prima e registrate su un giornale, (un le apposito a questo dedicato) e poi riportate sul lesystem. Cos` se si ha una interruzione improvvisa si hanno due casi: nel primo, in cui linterruzione ` avvenuta durante laggiornamento del lesystem, questo sar` in uno stato incoerente, ma il e a giornale sar` coerente e al riavvio baster` utilizzarlo per riprendere la registrazione da dove era a a stata interrotta. Se invece linterruzione ` avvenuta durante la scrittura nel giornale sar` questo e a ad essere scartato, si perderanno cos` le ultime modiche, ma il lesystem sar` comunque in uno a stato coerente.
40 per far questo viene creato uno sparse le delle stesse dimensioni del lesystem; uno sparse le ` un le in e cui non sono state scritte le parti vuote, pertanto anche se la sua dimensione pu` essere enorme, pari appunto ad o un intero lesystem, in realt` viene occupato su disco solo lo spazio relativo alle parti non vuote. a 41 a meno di non usare kernel sperimentali, nel qual caso si stanno cercando rogne, ed ` anche possibile trovarle. e

5.2. LA GESTIONE DEI DISCHI E DEI FILESYSTEM

201

In questo modo quando si ha un lesystem journalled si pu` evitare il lungo procedimento di o riparazione. In realt` in questo non ` che il procedimento non avvenga, solo che grazie alla prea e senza del giornale questo viene eseguito con grande rapidit`, non dovendo eettuare il controllo a completo del lesystem. In generale comunque, specie se si usa ext3, ` comunque opportuno e mantenere un controllo periodico sul lesystem, in quanto errori sul disco, cavi difettosi o bug del kernel possono comunque corrompere le informazioni. Il programma generico per il controllo di un lesystem ` fsck (da File System ChecK ) che, e come mkfs, non ` altro che un front-end per i singoli programmi specici di ciascun tipo di e lesystem, che vengono attivati attraverso lopzione -t seguita dal nome del lesystem. Il programma prende come argomenti un elenco di lesystem da controllare (specicati per dispositivo o mount point, se sono citati in /etc/fstab). Se si specica pi` di un lesystem la lista dei u relativi tipi, separata da virgole, deve essere specicata come parametro per -t. Quando il comando viene invocato con lopzione -A (di solito questo viene fatto nella procedura di avvio) questo esegue una scansione di /etc/fstab e cerca di controllare ogni lesystem ivi elencato, a meno che il sesto campo del le non sia impostato a zero (si ricordi quanto detto in sez. 1.2.4). Nel qual caso prima prova ad eseguire il controllo per il lesystem radice e poi per tutti gli altri in ordine di valore crescente del suddetto campo. Come per mkfs le opzioni disponibili dipendono dallo specico lesystem, di solito sono denite 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` intea rattiva. Per le altre opzioni si pu` fare riferimento alle pagine di manuale dei vari programmi o dedicati di ciascun lesystem. Nel caso di Linux tutti i lesystem pi` recenti (ReiserFS, JFS e XFS) supportano nativamente u il journalling; ed anche il tradizionale ext2 ha ottenuto questa funzionalit` con la nuova versione a ext3. Comunque luso di un giornale ha un impatto sulle prestazioni del lesystem, non ` detto e che questo venga sempre utilizzato, per cui la diusione di ext2 ` ancora molto ampia. Inoltre per e la facilit` della conversione (tutto quello che occorre fare ` aggiungere il giornale al lesystem con a e tune2fs -j e rimontarlo come ext3) si pu` sostanzialmente considerare ext2 (ed ext3, che nella o gestione dei dati ` identico) come il lesystem pi` diuso. Per questo motivo ci concentreremo e u sulla versione dei programmi di riparazione e controllo specici di questo lesystem. Il programma di controllo e riparazione del lesystem ext2 ` e2fsck, che prende come argoe mento il dispositivo da controllare. Il comando supporta le opzioni generiche -a e -r illustrate in precedenza, che sono state mantenute solo per compatibilit`, in realt` -a ` deprecata in favore a a e della pi` recente -p mentre -r non fa niente dato che il comando viene sempre eseguito in mou ` dalit` interattiva. E comunque possibile usare lopzione -y per ottenere per far rispondere yes a automaticamente a tutte le domande in modo da poter eseguire il comando in modalit` non a interattiva (ad esempio da uno script), mentre con -n si fa la stessa cosa aprendo il lesystem in sola lettura,42 e dando una risposta di no a tutte le domande. In caso di lesystem pesantemente corrotto si possono poi specicare il superblock da utilizzare con -b e la dimensione di un blocco con -B. Se si ` usato un giornale posto su un altro e dispositivo questo deve essere specicato con lopzione -j. Quando si ` usata lopzione -b e e il lesystem non ` stato aperto in sola lettura e2fsck si cura anche di ripristinare anche il e superblock al completamento del controllo. Usando lopzione -c si pu` richiedere anche la scansione per il rilevamento di settori difettosi, o e specicandola due volte viene usato il metodo non distruttivo di scansione con scrittura e rilettura. Con lopzione -l si pu` specicare un le con una lista da aggiungere a quella dei o blocchi difettosi, mentre con -L il le indica la nuova lista di blocchi difettosi.
eccetto il caso in cui si siano specicate le opzioni -c, -l o -L nel qual caso il lesystem viene aperto in scrittura per aggiornare la lista dei settori difettosi.
42

202

CAPITOLO 5. AMMINISTRAZIONE STRAORDINARIA DEL SISTEMA

Le altre opzioni principali del comando sono riportate in tab. 5.9, per un elenco completo e la relativa documentazione si pu` al solito fare riferimento alla pagina di manuale del comando. o
Opzione -b -B -c -f -j -l -L -n -t -y Signicato Specica la dimensione dei blocchi. Specica le dimensioni di un blocco. Esegue il controllo del dispositivo per eventuali settori difettosi. forza il controllo del lesystem. Specica il dispositivo di un giornale esterno. Specica il le con una lista di blocchi difettosi da aggiungere a quelli gi` presenti. a Specica il le 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` necessit` di eseguire direttamente e2fsck, in quanto di norma questo viene e a eseguito dagli script di avvio. Nel caso lo di voglia eseguire comunque, oltre a specicare lopzione -f occorre assicurarsi che il lesystem relativo non sia montato, o sia montato in sola lettura. Di norma lesecuzione automatica (quella ottenuta con -a o -p) prevede che il lesystem sia riparato senza necessit` di intervento da parte dellutente. Ci sono casi comunque in cui questo a non ` possibile, nel qual caso il programma si ferma. e Quando questo avviene durante la procedura di avvio di norma il sistema viene mandato in Single User Mode (si veda sez. 5.3.4) e viene richiesto di rieseguire il programma manualmente. In tal caso di norma il lesystem non ` montato, a meno che il lesystem danneggiato non sia e la radice, nel qual caso esso deve essere comunque montato,43 ma in sola lettura. Qualora anche la riparazione con e2fsck eseguito manualmente fallisca ci si trova di fronte ad un lesystem pesantemente danneggiato. In questo caso lultima risorsa ` quella di utilizzare e debugfs per provare ad eseguire manualmente la riparazione. Il comando permette di aprire anche un lesystem danneggiato, e di eseguire su di esso delle operazioni. Non ` detto che si riesca e a riparare completamente il lesystem44 , 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 lesystem da esaminare; in caso di lesystem pesantemente danneggiato lopzione -b permette di specicare una dimensione dei blocchi, lopzione -s permette di specicare il superblock, ed inne lopzione -i permette di specicare una immagine creata con e2image. Inne si tenga presente che per Linux non esistono programmi di uso comune per la deframmentazione del disco.45 Questa infatti ` un problema solo per quei lesystem la cui architettura e ` talmente inadeguata da renderlo tale. In generale un qualunque lesystem unix-like ` in grae e do di gestire la allocazione dello spazio disco in maniera da evitare il sorgere del problema n dallinizio.

5.2.5

La gestione della swap

Come ultimo argomento relativo alla gestione dei dischi aronteremo quello della gestione dello spazio dedicato alla swap. Questa costituisce un complemento essenziale alla gestione della
chiaramente se il lesystem ` danneggiato cos` gravemente da non poter neanche essere montato si avr` un e a kernel panic. 44 per questo occorre una conoscenza dettagliata della struttura di un lesystem ext2, in eetti il programma, come dice il nome, non ` uno strumento per il controllo quanto per il debugging, ad uso dei cosiddetti lesystem e guru. 45 in eetti ci sono alcuni programmi per questa operazione, ma non vengono usati, proprio perch inutili. e
43

5.2. LA GESTIONE DEI DISCHI E DEI FILESYSTEM

203

memoria virtuale, il meccanismo con cui il kernel gestisce lallocazione della memoria sica ai vari processi. Come accennato in sez. 1.1 e poi approfondito in sez. 1.3.1 il kernel gestisce, con laiuto della MMU (Memory Management Unit) del processore una rimappatura dello spazio degli indirizzi dei processi sulla memoria sica eettivamente disponibile. In questo modo ciascun processo pu` usare un suo spazio di indirizzi virtuale (usando un qualunque valore fa quelli possibili), e o tramite la MMU acceder` ad indirizzo reale della memoria eettivamente disponibile. a Una delle caratteristiche del meccanismo ` che in questo modo ciascun processo mantiene un e suo spazio di indirizzi separato; se un processo usa un indirizzo che non corrisponde a nessuna pagina di memoria si avr` quello che si chiama un segmentation fault ed il sistema si accorger` a 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 sica, quando luso di questa diventa eccessivo. ` E questo lo scopo della cosiddetta area di swap, una sezione di disco (in genere una partizione, ma si pu` usare anche un le) su cui il kernel pu` salvare le pagine di memoria meno utilizzate o o di un processo, in modo che altri possano utilizzare la memoria sica che cos` viene liberata. Chiaramente quando si andr` a rieseguire il processo le cui pagine di memoria sono state salvate a sullarea di swap e questo cercher` di accedere a quelle, si avr` quello che si chiama un page fault 46 a a a questo punto il sistema della memoria virtuale provveder` a recuperare la pagina dallarea di a swap e a rimetterla in memoria, cos` che il processo possa proseguire la sua esecuzione come se nulla fosse.47 Perch il kernel possa usare unarea di swap questa deve essere opportunamente inizializzata, e come se fosse un lesystem;48 a questo provvede il comando mkswap che prende come argomento il le da usare come area di swap. In genere si usa il comando specicando come argomento un le di dispositivo indicante una partizione appositamente riservata (vedi sez. 5.2.2), in questo caso infatti laccesso al disco ` diretto (` quindi pi` veloce) rispetto al caso, comunque possibile, e e u 49 in cui si usa un le normale. 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` di trasferimento a ` dei dati, ` in genere una pessima idea usare un disco vecchio e lento per questo scopo. E per e questo motivo inoltre che si preferisce usare per larea di swap lultima partizione disponibile (quella che contiene i settori pi` esterni del disco, dove la velocit` di trasferimento ` maggiore). u a e Il comando prevede (per compatibilit` con le vecchie versioni) un secondo argomento che a specica la dimensione dellarea di swap; se non lo si specica 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 specicare come parametro la dimensione delle pagine di memoria (in genere 4096 byte, ma dipende dallarchitettura hardware), lelenco delle opzioni ` riportato in tab. 5.10. e Si tenga presente che per i kernel precedenti il 2.4.10 erano possibili no ad un massimo di 8 aree di swap, a partire da esso sono state portate a 32; un elenco di quelle attive ` visibile in e /proc/swaps. La dimensione massima dellarea di swap dipende sia dalla versione utilizzata che
quello che succede ` che quando la MMU si accorge che la pagina richiesta non ` mappata su della memoria e e sica invia un segnale al processore, cos` che questo possa eseguire la opportuna sezione del kernel, questultimo si occuper` o di recuperare la pagina dalla swap (se lindirizzo era giusto) o di inviare un segnale di SIGSEGV (se a laccesso era sbagliato). 47 in realt` ovviamente tutto questo richiede tempi che sono ordini di grandezza superiori rispetto allaccesso a diretto alla RAM, per cui il nulla ` solo teorico, in pratica il programma sar` molto pi` lento. e a u 48 dato che larea deve essere solo utilizzata per copiarci pagine in questo caso non sono aatto necessarie tutte le infrastrutture mostrate in sez. 1.2.2. 49 per il quale si dovrebbe prima passare attraverso il relativo lesystem.
46

204

CAPITOLO 5. AMMINISTRAZIONE STRAORDINARIA DEL SISTEMA


Opzione -c -f -p -v Signicato 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). specica, con il valore passato come parametro la dimensione delle pagine di memoria. specica la versione della formattazione dellarea di swap da utilizzare, con -v0 usa il vecchio stile (deprecato) con il -v1 usa il nuovo. Tabella 5.10: Opzioni per il comando mkswap.

dallarchitettura hardware. Con la vecchia versione il massimo dipendeva solo dalla dimensione delle pagine (ed era di 128MiB con le pagine di 4096 byte della architettura standard dei PC) con la nuova versione dipende solo dallarchitettura ed ` di 2GiB per la maggior parte di esse. e Una volta creata unarea di swap questa non verr` utilizzata dal kernel ntanto che non la a si attiva con il comando swapon; questo prende come argomento il le da usare coma area di swap, che verr` immediatamente attivata. In generale per` il comando non viene mai invocato a o direttamente, ma chiamato con lopzione -a negli script di avvio, ed in questo caso attiver` tutti a i dispositivi che sono marcati come swap allinterno di /etc/fstab. Se invece si vuole avere una lista dei dispositivi attualmente utilizzati si potr` usare lopzione -s con qualcosa del tipo: a
monk:/home/piccardi/truedoc/corso# swapon -s Filename Type /dev/hda2 partition Size 498004 Used 1936 Priority -1

Unaltra opzione importante ` -p, che permette di impostare una priorit` (un parametro di e a valore fra 0 e 32767) per luso della partizione. Quando si ha una sola area questo valore non ` e signicativo in quanto il kernel si limiter` ad usare la prima sezione libera che trova, se le aree a sono pi` di una lalgoritmo di utilizzo prevede che il kernel usi a turno quelle della stessa priorit` u a (realizzando cos` una forma di RAID-1, vedi sez. 6.1.1) e passi ad una di priorit` inferiore solo a quando quelle di priorit` superiore sono piene. a Se non si specica nulla le priorit` vengono assegnate automaticamente andando a diminuire a nellordine di attivazione (cos` che la prima area attivata ` quella a priorit` maggiore), usando -p e a si pu` forzare la stessa priorit` ottenendo un uso pi` ecace e maggiore velocit`. Si pu` ottenere o a u a o questo risultato anche per le aree di swap attivate con swapon -a specicando in /etc/fstab nel relativo campo lopzione pri=N dove N ` lo stesso valore che si userebbe con -p. e Inne si pu` disattivare unarea di swap usando il comando swapoff, anche in questo caso o occorre fornire come argomento il le di dispositivo indicante larea da disabilitare; il comando consente anche luso dellopzione -a nel qual caso non sar` necessario passare argomenti e saranno a disattivate tutte le aree di swap presenti, cos` come indicate in /proc/swaps e /etc/fstab.

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 congurazione) a ciascuno stadio di questa procedura.

5.3.1

Lavvio del kernel

Una volta accesa la macchina ` il BIOS che si incarica di lanciare il sistema operativo. Le e modalit` possono dipendere da tipo e versione di BIOS, ed in genere le versioni pi` moderne a u permettono di avviare il sistema da una variet` di supporti (ivi compreso lavvio via rete). In a

5.3. LA GESTIONE DELLAVVIO DEL SISTEMA

205

genere comunque tutti i BIOS supportano lavvio da oppy, disco e CDROM (anche se alcuni dei pi` vecchi non supportano il CDROM). u Per quanto riguarda lavvio da CDROM e oppy non esiste nessuna congurazione specica per Linux, occorre semplicemente impostare opportunamente il BIOS perch vengano usato tali e dispositivi. In genere questo si fa tramite lapposito men` di congurazione che permette di u selezionare la sequenza in cui vengono controllati i vari dispositivi per lavvio. Il primo su cui si trovano i dati opportuni verr` utilizzato. a Il caso pi` comune ` quello in cui lavvio viene fatto dal disco rigido, ed ` su questo che ci u e e soermeremo con maggior dettaglio nei paragra successivi. La procedura prevede che il BIOS legga il primo settore del disco50 scelto per lavvio51 che viene detto Master Boot Record, o MBR. Questo contiene un programma apposito, chiamato bootloader, che si incarica di eettuare il lancio del sistema operativo. In generale il bootloader ` un programma elementare il cui unico compito ` quello di trovare e e sul disco il le che contiene il sistema operativo, caricarlo in memoria ed eseguirlo, passandogli eventuali parametri di avvio. Una delle caratteristiche di Linux infatti ` che, essendo in n e dei conti anche questo un programma, pu` prendere degli argomenti, solo che in questo caso o non esiste una riga di comando da cui darglieli, se non quella che pu` mettere a disposizione il o bootloader 52 prima di eseguirlo. Normalmente non c` necessit` di passare argomenti specici al kernel, in generale questi e a servono a passare valori ad alcuni sottosistemi53 o ad impostare delle funzionalit` usate allava vio; essi sono sempre nella forma chiave=valore, dove valore pu` essere un valore numerico o (espresso in notazione decimale, ottale o esadecimale) o una stringa, o una lista di stringe separate da virgole. Un elenco dei principali argomenti ` riportato in tab. 5.11, un elenco dettagliato e pu` essere trovato nel le kernel-parameters.txt della documentazione allegata ai sorgenti o del kernel54 o nel boot-prompt-HOWTO.
Argomento vga=mode mem=size Signicato dove mode ` un valore intero che stabilisce la modalit` video in cui e a utilizzare la console, o il valore ask per fare eseguire una scansione. imposta la dimensione della memoria da utilizzare, veniva utilizzato per soprassedere il malfunzionamento del sistema di autorilevamento del kernel. specica un RAM disk iniziale (che verr` usato come radice prova visoria), ` compito del bootloader interpretare il signicato di e file. specica (in genere col nome del le di dispositivo) il disco (o la partizione) da montare come radice. specica il programma da lanciare come primo processo del sistema (di default ` /sbin/init). e specica un le di dispositivo da usare come console per i messaggi di errore.

initrd=file

root=dev init=command console=dev

Tabella 5.11: Principali argomenti per la linea di comando del kernel.

Una delle caratteristiche dei bootloader (tratteremo pi` avanti i due pi` comuni) ` che essi, u u e oltre che nel Master Boot Record, possono essere installati anche nel settore iniziale di ciascuna
si sottintende disco IDE, se si vuole usare un disco SCSI occorre comunque impostare il BIOS per lavvio su SCSI, ed avere un controller SCSI che supporta il boot. 51 per molti BIOS questo pu` essere solo il primo disco IDE, anche se BIOS pi` recenti permettono di usare o u anche altri dischi 52 che in questo caso svolge il ruolo della shell, e deve anche essere in grado, per alcuni argomenti, di fornire una opportuna interpretazione. 53 ad esempio i moduli che supportano luso di parametri in fase di caricamento (vedi sez. 5.1.4), qualora compilati allinterno del kernel possono ricevere in questo modo i valori dei loro parametri. 54 nella directory Documentation.
50

206

CAPITOLO 5. AMMINISTRAZIONE STRAORDINARIA DEL SISTEMA

partizione. Questo permette allora di concatenare pi` bootloader (in particolare questa ` la u e tecnica usata normalmente per lanciare il bootloader di Windows) in modo che il primo lanci il successivo, e cos` via. Inne si tenga conto che tutto questo si applica solo ai normali PC. Linux per` gira su molo tissime architetture hardware diverse, come Alpha, Sparc, HP-UX, PowerPC, ecc. In tal caso la procedura di avvio ` spesso gestita direttamente dallequivalente del BIOS per quellarchitettura, e come SILO per la Sparc, MILO per le Alpha e OpenFirmware per i Mac, ognuno dei quali ha un suo diverso meccanismo di funzionamento; non ci occuperemo di questi casi. Una volta avviato il kernel eettuer` una serie di operazioni preliminari, come le inizializzaa zioni delle infrastrutture generiche, e dei dispositivi il cui supporto ` stato compilato direttamente e 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 ` /sbin/init. Le operazioni di avvio, per quanto riguardo il e kernel, si concludono con il lancio di init, tutto il resto verr` eseguito da questultimo in user a space. La procedura con cui il BIOS carica in memoria il sistema dipende ovviamente dal supporto da cui lo prende, e questo deve ovviamente contenere i dati in un formato adeguato. Il caso del oppy ` analogo a quello di un disco, il BIOS legge il primo settore del oppy ed esegue il e programma che c` contenuto. e Il vantaggio di questo metodo ` che se si crea una immagine compressa del kernel (con la e procedura vista in sez. 5.1.3) viene automaticamente inserito nei primi 512 byte della stessa un programma di avvio che si limita a caricare il resto del contenuto del oppy in memoria, scompattarlo ed eseguirlo. Pertanto basta luso di dd per copiare direttamente limmagine del kernel su un dischetto con un comando del tipo: dd if=bzImage of=/dev/fd0 per ottenere un oppy di avvio. Il problema con un disco davvio fatto in questo modo ` che non si possono fornire argomenti e allavvio. In particolare questo signica che il sistema user` come radice quella in uso quando a viene compilata limmagine. In realt` alcuni argomenti di avvio in questo caso possono essere a modicati con il comando rdev. Se usato senza argomenti il comando si limita a stampare una riga in riporta quale ` la partie zione impostata come directory radice per il sistema corrente. Se si specica un solo argomento questo deve essere un le contenente limmagine di un kernel e allora stamper` la radice predia sposta per quel kernel; se si specica un secondo argomento questo dovr` essere il dispositivo a contenente la nuova directory radice che andr` a sovrascrivere la precedente. a Il comando permette anche di modicare anche altri due parametri che sono mantenuti nellimmagine del kernel, la modalit` video usando lopzione -v, o invocandolo come vidmode, a e la dimensione del RAM disk iniziale, usando lopzione -r o invocandolo come ramsize. Per i dettagli si faccia riferimento alla pagina di manuale. Nel caso di un CDROM il meccanismo di avvio ` sostanzialmente lo stesso dei oppy, posto e che il CDROM sia stato masterizzato con le opportune estensioni. In sostanza viene inserita nel CD limmagine di un oppy e lavvio viene eseguito alla stessa maniera. In questo caso per` o di solito non viene usata una immagine di un oppy contenente soltanto il kernel, ma viene utilizzato il programma syslinux per creare una immagine di avvio contenuta in un lesystem FAT. In tal caso baster` copiare i le necessari (come limmagine del kernel o del RAM disk iniziale) a sul oppy55 di destinazione e poi eseguire il programma, che prende come argomento il le del
o su qualunque altro dispositivo si stia utilizzando; il vantaggio di utilizzare un lesystem consente, una volta che lo si ` montato, di accedere direttamente ai contenuti. e
55

5.3. LA GESTIONE DELLAVVIO DEL SISTEMA

207

dispositivo da inizializzare (in genere /dev/fd0). Il comando sovrascriver` opportunamente il a settore iniziale del disco e ci copier` un le LDLINUX.SYS che contiene il programma di avvio. a Questo mette a disposizione una riga di comando analoga a quella di LILO (vedi sez.5.3.2), ed ` controllato dal le di congurazione SYSLINUX.CFG che basta inserire nella radice del oppy. e Per i dettagli si pu` fare riferimento alla pagina di manuale di syslinux al solito accessibile con o man syslinux.

5.3.2

Luso di LILO

Il primo bootloader creato per Linux ` stato LILO, da LInux LOader, ed a lungo ` stato anche e e ` lunico presente. E un bootloader con una architettura elementare, che si ada al BIOS per la lettura del disco, e pertanto risente di tutti i limiti che questo pu` avere. Uno di questi problemi o ` che, a causa delle restrizioni ereditate dai primi PC illustrate in sez. 5.2.1, alcuni BIOS non e sono capaci di leggere i dischi oltre il 1024-simo cilindro. In genere LILO viene installato nellMBR alla ne della procedura di installazione di una distribuzione. In generale ` possibile, come accennato in precedenza, installarlo allinterno di e 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, (in sostanza in fase di installazione viene memorizzato il settore su cui essa si trova) caricarla in memoria, passare tutti gli eventuali parametri di avvio specicati in fase di congurazione, e poi eseguirla.56 Da questo punto in poi il controllo passa al kernel, che si incarica di tutto il resto. La congurazione di LILO ` gestita tramite il le /etc/lilo.conf, questo contiene sia le e opzioni passate al kernel in fase di avvio, che le direttive che permettono di controllare direttamente il comportamento del bootloader. Si tenga presente per` che, al contrario di quanto o avviene in genere per altri le di congurazione, non basta modicarlo perch i cambiamenti die ventino eettivi 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 le tutte le volte che si vuole usare un nuovo kernel. Infatti per poter lanciare un kernel occorre specicarne la posizione su disco al bootloader in modo che questo possa caricarlo. La cosa va fatta anche se si ` semplicemente sovrascritto un e kernel precedente con un altro (e pertanto non si ` neanche dovuto modicare /etc/lilo.conf); e si ricordi infatti che LILO (il bootloader, quello che sta nellMBR) conosce solo la posizione sica del kernel nel disco, non quella logica nel lesystem; pertanto se si sovrascrive un le non ` e aatto detto che la posizione sica del nuovo le sia la stessa (anzi di norma non lo ` aatto) e per cui al successivo riavvio senzaltro LILO non potrebbe non essere pi` in grado di trovare il u kernel, con la conseguente impossibilit` di lanciare il sistema. a Il formato di /etc/lilo.conf ` simile a quello degli altri le di congurazione, le linee vuote e o che iniziano per # vengono ignorate. Le altre linee indicano una opzione o una direttiva. Un esempio di questo le ` il seguente: e
# 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. (/) # qualora lo si sia richiesto, si pu` caricare in memoria anche limmagine di un ram-disk, che serve come o lesystem iniziale per il kernel.
56

208

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 specicano opzioni globali, che si applicano al comportamento generale del bootloader, le direttive che specicano 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` importante ` u e boot, che specica il dispositivo su cui installare il bootloader, nel caso ` lMBR del primo disco e IDE, indicato tramite il suo le di dispositivo come /dev/hda. Si pu` specicare allo stesso o 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 specica il le (di norma boot.map) che contiene la mappa della posizione su disco delle varie immagini del kernel; questa viene denita automaticamente alla installazione del pacchetto e ricostruita tutte le volte che si lancia il comando lilo. La direttiva install invece specica qual` il le che contiene il programma del bootloader, ne possono esistere varie e versioni, che presentano una interfaccia di avvio semplicata a men` o semplicemente testuale. u In genere tutti questi i le referenziati da queste direttive vengono tenuti, come illustrato in sez. 1.2.3, nella directory /boot. Le altre direttive globali pi` usate sono quelle che controllano le modalit` di avvio. Se u a

5.3. LA GESTIONE DELLAVVIO DEL SISTEMA

209

si specica prompt il bootloader si ferma allavvio presentando una riga di comando da cui lutente pu` immettere dei comandi (si tratta in genere di scrivere il nome di uno dei kernel o predeniti, seguito dalle eventuali opzioni che gli si vogliono passare). Specicando un numero con timeout si introduce un tempo massimo (in decimi di secondo) dopo il quale, pur avendo specicato prompt, si proceder` automaticamente allavvio. Se non si specica prompt invece a lavvio verr` eettuato automaticamente, senza possibilit` di intervento dellutente,57 dopo il a a numero di decimi di secondo specicato 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 specicata 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, specicando cilindro, testina e settore, ed il caricamento del kernel viene utilizzando linterfaccia classica illustrata in sez. 5.2.1, questo comporta che si avranno problemi tutte le volte che si installa un kernel al di l` del limite del 1024-simo cilindro. Con i BIOS (e le versioni di LILO) a pi` recenti, si deve sempre specicare la direttiva lba32, in tal caso gli indirizzi nella boot map u saranno tenuti in forma lineare, e verr` usata la nuova interfaccia di accesso della INT13 estesa, a e ci si pu` dimenticare di tutti i problemi relativi alla geometria dei dischi. o 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 INT13 originale. Questo pu` essere utile in quanto non ` detto o e che Linux ed il BIOS concordino sempre sulla geometria del disco; se questo accade e non si ` usato linear allavvio LILO user` dei valori per cilindro, testina e settore relativi ad una e a geometria diversa a quella vista dal BIOS, con relativo fallimento. Usando linear invece lidea della geometria che ha il kernel viene diventa irrilevante, e sar` LILO ad usare allavvio la a 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` scegliere quale, fra le varie immagini del kernel installate o o gli altri sistemi operativi presenti su altre partizioni, viene selezionato come default per lavvio (e lanciato quando scade il tempo specicato da timeout). Per farlo basta riferimento alletichetta che si ` associata con la direttiva label a ciascuna immagine o altro sistema presente. e Unaltra direttiva fondamentale ` root che denisce il dispositivo da cui montare la directory e radice, nel nostro esempio /dev/hdb5.58 Di solito la si specica allinizio del le per utilizzarla come valore di default per tutti i kernel, ma pu` essere anche specicata per ciascuna immagine. o La direttiva che permette di identicare un kernel da lanciare ` image, che prende come e parametro il le che contiene limmagine del kernel. Si ricordi che bench qui essa sia specicata e tramite il pathname del le che la contiene, LILO vi acceder` direttamente usando posizione a di questultima nel disco. Questo signica che se si copia su una di queste immagini un altro le (ad esempio per un aggiornamento), essendo questo creato altrove (quando si sovrascrive con cp prima viene creata la copia, poi cancellato il le preesistente e assegnato il suo nome al nuovo), ntanto che non si ricrea la boot map e la si reinstalla, LILO continuer` ad accedere alla a posizione del vecchio le. Questo signicher` nel migliore dei casi, se si ` fortunati e nessuno ha a e sovrascritto i dati, che si utilizzer` ancora la vecchia immagine, mentre in caso di sovrascrittura a lavvio fallir` (in maniera pi` o meno spettacolare a seconda dei casi). a u Per ciascuna direttiva image vanno poi fornite una serie di ulteriori direttive speciche da applicare allavvio di quella immagine. Una sempre necessaria ` label che denisce letichetta e che identica limmagine, da usare nella fase di avvio e per la direttiva default. La direttiva initrd specica il le da utilizzare come ram-disk per lavvio, la direttiva append permette di specicare dei parametri di avvio al kernel, analoghi a quelle che si possono scrivere
57 58

in realt` ` comunque possibile ottenere la riga di comando se ti tiene premuto il tasto di shift. ae si noti che non ` assolutamente detto che questa debba stare sullo stesso disco da cui si lancia il kernel. e

210

CAPITOLO 5. AMMINISTRAZIONE STRAORDINARIA DEL SISTEMA

al prompt, la direttiva read-only fa montare la radice in sola lettura (in genere ` cura degli e 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 specicando la partizione su cui si trova questultimo. Anche questa direttiva deve essere seguita da una label. Lelenco completo si trova al solito nella pagina di manuale, accessibile con man lilo.conf. Una direttiva utile per la sicurezza ` password che permette di proteggere con una password e la procedura di avvio. Dato che la password ` scritta in chiaro nel le di congurazione, qualora e 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 le accessibile in lettura). Luso di questa direttiva permette di controllare le modalit` con cui si fanno partire le varie a immagini (o i sistemi operativi alternativi), attraverso ulteriori direttive da indicare nelle relative sezioni del le di congurazione. Specicando bypass non viene applicata nessuna restrizione; specicando restricted si impedisce allutente di passare dei parametri al kernel sul prompt, a meno di non fornire la password; specicando mandatory ` necessario fornire la password anche e per avviare la relativa immagine. Una volta che si sono denite le impostazioni in /etc/lilo.conf, si pu` attivarle con il o comando lilo. Questo si limita a leggere il suddetto le e a reinstallare il bootloader con i nuovi valori. Il comando prende varie opzioni che permettono di soprassedere i valori specicati da lilo.conf, al solito si pu` fare riferimento alla pagina di manuale, accessibile con man lilo per o lelenco completo. Vale la pena per` di ricordarne due, la prima ` -r che permette di specicare una directory o e nella quale eseguire un chroot prima di eseguire il comando; essa ` molto utile quando di si avvia e il sistema da un disco di recupero (ad esempio perch si ` fatto casino con LILO ed il sistema non e e parte pi`) perch permette di correggere i valori nel lilo.conf del disco, e ripristinare il sistema u e 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 ` montato. e La seconda opzione ` -R che invece specica una riga di comando da passare a LILO al e successivo riavvio, come se la si scrivesse direttamente dal prompt. Lutilit` dellopzione ` che a e questo avviene una sola volta, per cui solo il riavvio successivo user` le nuove opzioni; cos` a se qualcosa non va, ed il riavvio fallisce, basta far riavviare la macchina per riavere i valori precedenti, che si presume siano funzionanti.

5.3.3

Luso di GRUB

Il secondo bootloader disponibile per Linux ` GRUB (da Grand Unied Bootloader ); GRUB ` e e 59 ma ` in grado di avviare qualunque altro tipo di nato come bootloader per il sistema HURD e sistema (compreso Linux e BSD). La caratteristica principale rispetto a LILO ` che GRUB ` formato da diverse parti, dette e e stadi, ciascuno dei quali, come gli omonimi dei razzi, viene usato per lanciare il successivo. In sostanza poi gli stadi sono due, il primo ` un analogo di LILO e viene installato sul bootloader; e il suo unico compito ` quello di lanciare lo stadio successivo, che poi si incaricher` di eettuare e a tutte le operazioni successive. Il grande vantaggio di GRUB ` che siccome il primo stadio deve solo occuparsi di trovare e il secondo ed ` questultimo che fa tutto il lavoro, tutte le restrizioni che si applicano ad un e programma che deve stare nellMBR scompaiono. Per questo GRUB non solo non sore del
HURD ` un sistema libero sperimentale realizzato dalla FSF, basato su una architettura microkernel, con e funzionalit` molto avanzate e completamente modulare; il suo sviluppo per` ` ancora allinizio. a oe
59

5.3. LA GESTIONE DELLAVVIO DEL SISTEMA

211

problema del 1024-simo cilindro, ma ` in grado di leggere nativamente i principali lesystem, e cosicch non solo si pu` fare riferimento alle immagini del kernel attraverso un pathname, ma e o si ha anche a disposizione una micro-shell che consente di navigare attraverso un lesystem ed esplorarne il contenuto. Questo vuol dire che basta cambiare il le di congurazione di GRUB (o sovrascrivere una immagine del kernel) perch la nuova versione sia usata al successivo riavvio, e e non ` necessario utilizzare un comando apposta come per LILO (evitando i guai che nascono e tutte le volte che ci si dimentica di farlo). Un altro grande vantaggio ` che GRUB pu` ricevere i comandi avvio non solo dalla console, e o ma anche via seriale e via rete, dato che non ha bisogno del BIOS per gestire lI/O, il che lo rende molto pi` essibile. Inoltre non ` limitato a lanciare il sistema dal primo canale IDE, ma, u e essendo di nuovo indipendente dal BIOS, pu` usare uno qualunque dei dischi presenti. o Tutti i le di GRUB sono mantenuti in /boot/grub, in questa directory si trovano i le stage1 e stage2 che contengono i due stadi standard usati nellavvio, e una serie di stage1_5 che contengono gli stadi intermedi che GRUB utilizza per accedere ai contenuti di vari lesystem (sono supportati tutti i principali lesystem di Linux). Il le 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 le ` il seguente: e
piccardi@monk:/boot/grub$ cat device.map (fd0) /dev/fd0 (hd0) /dev/hda

che ci mostra come su questa macchina sia presente un oppy ed un hard disk. GRUB identica i dispositivi con un nome fra parentesi tonde, il oppy viene sempre identicato con fd0 (nel caso ci siano due oppy ci sarebbe anche fd1) mentre i dischi vengono identicati, in ordine di rilevazione, con hd0, hd1, ecc. Si tenga presente che GRUB non distingue i nomi per i dischi SCSI, quindi anche questi verrebbero identicati con la sigla hdN (con N dipendente dallordine di rilevamento). Il le device.map viene generato con il comando di installazione di GRUB, grub-install: questo prende come parametro il dispositivo su cui si vuole installare GRUB. Il comando copia anche nella directory /boot tutti i le di GRUB, si pu` dirgli di usare una radice diversa con o lopzione --root-directory=DIR. Il comando esegue anche una scansione dei dispositivi e crea device.map. In realt` GRUB non ha un vero e proprio le di congurazione, infatti se avviato normala mente mette a disposizione una specie di shell da cui eseguire i vari comandi interni. Questa ` disponibile anche da Linux, se lo si lancia con il comando grub, la dierenza ` che essa ` e e e disponibile anche quando viene lanciato allavvio. I comandi di GRUB sono molteplici ed oltre a quelli usati per impostare lavvio dei vari kernel, ce ne sono altri con capacit` di ricerca dei le, a di visualizzazione e confronto del loro contenuto, e la shell di GRUB ore funzionalit` avanzate a ` come lauto-completamento di comandi e nomi, ed un help on line con il comando help. E per` possibile inserire una lista di questi comandi nel le menu.lst (sempre sotto /boot/grub) o e questi verranno eseguiti automaticamente allavvio, per cui questo diventa una sorta di le di congurazione. Il vantaggio di usare menu.lst ` che questo permette di creare automaticamente un men` e u semigraco (in formato testo) dal quale scegliere quale kernel (o altro sistema) avviare. Un contenuto tipico di questo le `: e
## 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.

212
default

CAPITOLO 5. AMMINISTRAZIONE STRAORDINARIA DEL SISTEMA


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 savedefault title root kernel savedefault

Debian GNU/Linux, kernel 2.4.21 (hd0,0) /boot/vmlinuz-2.4.21 root=/dev/hda1 ro

Debian GNU/Linux, kernel 2.4.21 (recovery mode) (hd0,0) /boot/vmlinuz-2.4.21 root=/dev/hda1 ro single

e su Debian si pu` anche usare il comando update-grub, che eettua una ricerca dei kernel o presenti in /boot/ e crea automaticamente una le relative voci in menu.lst. I vari kernel sono introdotti da una direttiva title, che specica una stringa che comparir` a nel men` iniziale, ad essa si associa la direttiva root, che specica su quale partizione cercare u il le. 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 da caricare si specica con la direttiva kernel, seguita dal pathname del le. Si tenga presente che questo ` relativo alla partizione stessa (non esiste in concetto di radice e in GRUB), per cui se ad esempio si ` posto /boot su unaltra partizione non ` pi` necessario e e u specicarla nel nome del le. Al nome del le si devono poi far seguire le opzioni da passare al kernel allavvio, fra cui occorre comunque specicare il dispositivo da montare come radice (nellesempio con root=/dev/hda1). La direttiva default permette di stabilire quale, nella lista di immagini dichiarate, deve essere lanciata se lutente non interviene, dopo un tempo di attesa specicato con timeout. Lelenco completo delle funzionalit` di GRUB ` disponibile nel GRUB-HOWTO. a e

5.3.4

Il sistema di inizializzazione alla SysV

Come accennato in sez. 5.3.1 una volta lanciato il kernel si cura solo dellinizializzazione dellhardware, di montare la directory radice e di lanciare il programma di avvio del sistema, che per tradizione ` /sbin/init.60 Questo ` uno dei motivi per cui questo programma (come tutti e e quelli essenziali allavvio, deve stare nella radice in /sbin.
60

in realt` passando lopzione init=... si pu` lanciare un programma qualunque indicandone il path. a o

5.3. LA GESTIONE DELLAVVIO DEL SISTEMA

213

Due degli errori pi` comuni, che comportano limpossibilit` di proseguire nella procedura di u a avvio, sono proprio quelli relativi alllimpossibilit` di montare la radice (ad esempio perch ci si ` a e e dimenticati di inserire nel kernel il supporto per accedere al dispositivo su cui essa si trova o quello per il suo lesystem) o allimpossibilit` di lanciare init (ad esempio perch si ` danneggiato il a e e programma, o qualche libreria, o si ` indicato come radice una partizione sbagliata). e Una volta lanciato init il kernel non esegue pi` direttamente nessun altro compito, tutto il u ` resto viene eettuato attraverso gli opportuni programmi invocati da init. E a questo punto che emerge una delle principali dierenze 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 SysV, e quella sviluppata a Berkley, che dar` origine alla famiglia dei BSD. Una delle dierenze a principali fra i due sistemi ` quello del procedimento di avvio. e La dierenza non ` tanto nel meccanismo di funzionamento del sistema, dato si che tratta e sempre di lanciare gli opportuni programmi, quando nella modalit` in cui questi vengono avviati. a 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 solo una distribuzione, la Slackware, ha adottato questa modalit`, tutte le altre han preferito, per la sua maggiore essibilit`, lo stile di avvio di a a SysV. I sistemi derivati da SysV usano un sistema pi` complesso, ma che ore maggiore funzionalit` u a e soprattutto ` pi` modulare. La gran parte delle distribuzioni di GNU/Linux61 ha adottato e u questo sistema. Lavvio alla SysV avviene sulla base dei cosiddetti runlevel, una sorta di modalit` operative a del sistema in cui vengono lanciati un particolare insieme di programmi, che garantiscono la ` presenza di un certo gruppo di servizi. E possibile selezionare sia quali programmi (ed in che ordine) lanciare in ciascun runlevel, sia quale runlevel utilizzare. Inoltre ` possibile passare da e ` compito di init portare il sistema in un certo runlevel, secondo quanto un runlevel allaltro. E specicato nel suo le di congurazione, /etc/inittab. I runlevel validi sono 7, numerati da 0 a 6, normalmente il runlevel 0 ` usato per fermare il e sistema, mentre il runlevel 6 per riavviarlo; il runlevel 1 serve per andare nel cosiddetto single user mode, la modalit` di recupero in cui pu` entrare nel sistema solo lamministratore e solo a o dalla console, con tutti i servizi disattivati e 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 da 2 a 5 sono tutti equivalenti, RedHat usa il 2 per lavvio in console senza rete, 3 per lavvio in console con la rete e 5 per lavvio in modalit` graca. a Tutto il procedimento di avvio eseguito viene controllato da /etc/inittab. Il formato di questo le ` molto semplice, come al solito le linee vuote o che iniziano per # vengono ignorate, e le altre prevedono quattro campi separati dal carattere :, nella forma: id:runlevels:action:process dove il campo id deve essere una sequenza unica di 1-4 caratteri che identica la linea (ed in certi casi delle azioni speciali), il campo runlevel la lista dei runlevel (espressa coi numeri di cui sopra) cui si applica lazione specicata dalla parola chiave del campo action mentre il campo process indica il programma che deve essere lanciato (e relative opzioni ed argomenti). I principali valori utilizzabili per il campo action sono riportati in tab. 5.12, i dettagli e lelenco completo si trovano al solito nella pagina di manuale accessibile con man inittab. Un esempio di questo le ` il seguente: e
GNU/Linux ` stato sviluppato da zero, per cui non deriva da nessuna delle due famiglie di Unix, per questo e in genere si ` cercato di prendere il meglio da entrambe. e
61

214

CAPITOLO 5. AMMINISTRAZIONE STRAORDINARIA DEL SISTEMA


Argomento respawn wait Signicato il processo viene eseguito allingresso nel runlevel e viene riavviato tutte le volte che termina. il processo viene eseguito una volta allingresso nel runlevel e si aspetta la sua terminazione prima di proseguire. il processo viene eseguito una volta allingresso nel runlevel senza aspettare la sua terminazione prima di proseguire. il processo viene eseguito una sola volta allavvio del sistema; 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 specicato 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. eseguito quando viene noticata ad init la caduta della linea elettrica da parte del programma di gestione del gruppo di continuit`. a eseguito quando viene noticato 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` che le a batterie si stanno esaurendo.

once

boot initdefault ctrlaltdel

powerwait

powerokwait powerfailnow

Tabella 5.12: Principali valori delle azioni indicabili nellomonimo campo di /etc/inittab.

# 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

Il le viene letto da init e le azioni specicate vengono eseguite nella procedura di avvio (e ad ogni cambio di runlevel forzato con il comando telinit). Se il numero del runlevel scelto corrisponde con almeno uno di quelli indicati nel secondo campo viene eseguito il comando

5.3. LA GESTIONE DELLAVVIO DEL SISTEMA

215

indicato nella ultima colonna secondo la modalit` specicata dal terzo campo. Specicando a come azione wait si richiede che il programma sia eseguito una sola volta, attendendo che esso sia concluso prima di passare allazione successiva; nellesempio ` questo il caso con gli script e /etc/init.d/rc (che, come vedremo fra poco, sono quelli usati per avviare e fermare i servizi). Se invece non ` necessario attendere la conclusione si pu` usare once. e o Specicando respwan 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 ` quello che e 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` login per lautenticazione e questo eseguir` a a la shell,62 alluscita dalla shell, init, accorgendosi della terminazione del processo, rilancer` di a nuovo getty. Il problema con questo le ` che il signicato di queste azioni non ` di immediata comprensioe e ne, in quanto alcune sono indipendenti dal runlevel scelto, come per powerwait, powerfailnow, powerokwait, e altre come initdefault impostano proprio il runlevel di default. Inoltre il campo id pu` dover essere soggetto a restrizioni come nel caso delle righe di getty che richiedono o il numero della console. In genere non c` molto da fare con questo le, lunica cosa che pu` servire ` cambiare la e o e linea dellazione initdefault per cambiare il run level di default a cui ci si trova dopo lavvio, ad esempio per passare dal login da console a quello su X (sempre che questo sia previsto dalla distribuzione, per RedHat questo signica mettere un 5 al posto di 3, in Debian invece non esiste). Un seconda azione che si pu` volere modicare (o disabilitare) ` la reazione alla combinao e zione di tasti ctrl-alt-del che nellesempio ` specicata dallazione ctrlaltdel, ed invoca il e programma shutdown per riavviare il computer. Come si pu` notare dallesempio precedente, attraverso inittab si possono impostare solo o alcune azioni elementari, tutto il procedimento di avvio di SysV viene eettuato, come accennato, grazie alluso dello script /etc/init.d/rc. Come si pu` notare questo viene invocato, per o ciascun runlevel, con un argomento pari al numero dello stesso. Il meccanismo di avvio di SysV si basa infatti sulla presenza, per ciascun programma o servizio che si vuole attivare, di uno specico script di avvio, la cui locazione, secondo il FHS, ` e in /etc/init.d. Questi script prendono sempre come parametri una serie di comandi: start, che avvia il servizio, stop che lo ferma, restart che lo ferma e lo riavvia, reload che fa rileggere la congurazione. Se si va ad analizzare il contenuto di /etc/init.d/rc ci si accorger` che questo verica a la presenza di una directory rcN.d,63 dove N corrisponde al numero del runlevel passato come argomento e legge la lista dei le ivi presenti. Se vediamo il contenuto di queste directory vedremo che esse contengono tutte una serie di link simbolici agli script di /etc/init.d, 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 le 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 ) ed largomento start a quelli che iniziano per S. 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 ` possibile, per ogni servizio, avere una procedura davvio personalizzata, da e mettere in /etc/init.d, ed avviarlo o fermarlo a piacere nei vari runlevel con un semplice link simbolico. Si pu` anche, grazie alle due cifre, decidere anche in quale punto della sequenza di o
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` sempre lo stesso. a 63 direttamente sotto /etc o dentro /etc/init.d a seconda delle distribuzioni.
62

216

CAPITOLO 5. AMMINISTRAZIONE STRAORDINARIA DEL SISTEMA

avvio lanciare un certo servizio (ad esempio un server di rete dovr` essere lanciato sempre dopo a che questa ` stata attivata). e Si noti come la presenza dei servizi presenti in un determinato runlevel possa dipendere da come si ` arrivati ad esso; nel passaggio da un runlevel ad un altro infatti i servizi avviati dal e primo vengono fermati dal secondo solo in presenza di uno corrispondente script iniziante per K, altrimenti resteranno attivi, anche se non sono previsti fra quelli che verrebbero avviati se si andasse direttamente in quel runlevel. Come accennato attivare o disattivare un servizio su un certo runlevel ` semplicemente e questione di creare un link simbolico con lopportuna sigla iniziale, sono comunque disponibili innumerevoli programmi in grado di automatizzare il compito, come update-rc.d per Debian o chkconfig per RedHat, per luso i quali rimandiamo alle rispettive pagine di manuale.

5.4

La gestione di interfacce e periferiche

Tratteremo in questa sezione i programmi e le funzionalit` disponibili per la congurazione di a una serie di interfacce hardware di cui i moderni computer sono dotati (escludendo le interfacce di rete che saranno trattate a parte in sez. 7.3) per le quali, al di l` dellaccesso ai dispositivi a nali secondo linterfaccia classica per cui in un sistema unix-like tutto ` un le, sono necessari e ulteriori modalit` di accesso e controllo per le funzionalit` che non sono comprese in questa a a astrazione.

5.4.1

Gestione delle interfacce di espansione

Una delle caratteristiche essenziali dellarchitettura hardware dei computer moderni ` quella di e disporre di opportune interfacce di espansione in cui inserire delle schede dedicate che permettono luso di nuove periferiche; si ha cos` la possibilit` di ampliare le capacit` di un computer a a utilizzando degli appositi dispositivi in grado eettuare i pi` svariati compiti. u Una interfaccia di espansione in sostanza non fornisce direttamente delle funzionalit` nali, a che sono speciche 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` inviare comandi e scambiare o dati con le singole periferiche, in modo da poterne utilizzare le capacit` speciche. a In Linux il supporto per queste interfacce ` ovviamente fornito direttamente dal kernel, e che predispone tutta linfrastruttura software con cui ` possibile leggere i dati relativi a dette e interfacce, e poi dialogare con i singoli dispositivi su di esse presenti. Questi ultimi, seguendo il criterio fondamentale dellarchietettura di un sistema unix-like per cui tutto ` un le, potranno e poi essere acceduti attraverso linterfaccia generica illustrata in sez. 1.2.1. Le due interfacce di espansione tradizionalmente pi` utilizzate nel mondo dei computer bau sati 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` recente ed u ampiamente utilizzata PCI (Peripheral Component Interconnect). Entrambe queste interfacce deniscono uno standard sia hardware (consistente in piedinatura, dimensioni, speciche dei segnali elettrici ecc.) che software (i comandi che la CPU deve dare per comunicare con linterfaccia ed i dispositivi presenti sulla stessa). La struttura di base di queste interfacce ` quella di denire uno speciale canale di comunie cazione (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 (identicando opportunamente i ussi di dati sul bus) con ciascuna delle periferiche presenti sullinterfaccia.

5.4. LA GESTIONE DI INTERFACCE E PERIFERICHE

217

Una descrizione dettagliata del funzionamento di queste interfacce va ben oltre lo scopo di queste dispense, la loro gestione ` infatti completamente realizzata allinterno del kernel attravere so il codice relativo al loro supporto. Quello che interessa dal punto di vista dellamministrazione di sistema ` capire quali sono le risorse utilizzate e come allocarle e le funzionalit` messe a die a sposizione del kernel che consentono di accedere alle informazioni relative a dette interfacce ed ai dispositivi su di esse presenti a scopo di congurazione o di controllo. Le risorse fondamentali usate da una interfaccia sono sostanzialmente due gli interrupt e i canali DMA. Un interrupt ` un un meccanismo con cui un dispositivo hardware pu` inviare un e o segnale al processore64 (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, oggi sono state portate a 15), in altre architetture sono 32 o 64. La seconda risorsa ` quella dei canali DMA, questi sono un meccanismo hardware che cone sente dei trasferimenti diretti di dati da una periferica alla memoria senza che questi debbano essere letti direttamente con lintervento della CPU, che pu` essere utilizzata in altre operazioni. o 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 sistema possa utilizzare i dati disponibili in memoria. Uno dei problemi relativi alla gestione delle interfacce di espansione ` allora proprio quello e della allocazione degli interrupt e dei canali DMA ai dispositivi esistenti,65 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 le /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 NMI: 0 LOC: 584659 ERR: 848 MIS: 0

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

che mostra lallocazione degli interrupt, il cui numero progressivo ` riportato in prima colonna, e rispettivamente ai dispositivi ad essi associati (riportati nellultima); nella seconda colonna sono
in senso sico, viene alzato un livello su uno dei piedini del processore a questo dedicato. in realt` questo ` un problema che si ha quasi esclusivamente sui PC intel-compatibili, che hanno pochi a e interrupt e canali DMA e tutta una serie di limitazioni ereditate dallarchitettura originaria che su altre piattaforme non esistono.
65 64

218

CAPITOLO 5. AMMINISTRAZIONE STRAORDINARIA DEL SISTEMA

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. Una terza risorsa ` quella delle porte di I/O, una modalit` di comunicazione diretta fra la e a CPU e le stesse eettuata 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 devono essere allocate opportunamente quando si inserisce il relativo dispositivo su una interfaccia di espansione; la situazione corrente dellallocazione ` riportata dal kernel nel le /proc/ioports, un cui esempio `: e 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 ...

Linterfaccia ISA nasce come estensione dei bus dei vecchi PC, che consentivano lutilizzo di schede di espansione, originariamente prevedeva un bus a 8 bit, quasi subito portato a 16; usata principalmente per modem interni e schede sonore, al giorno doggi ` sostanzialmente in disuso, e e si trova soltanto sulle macchine pi` vecchie. u 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 dierenza del pi` recente bus PCI non possono essere condivisi u 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 lautocongurazione delle schede chiamato Plugn Play,66 in cui le precedenti risorse potevano essere allocate dinamicamente dal sistema operativo o dal BIOS ed impostate sulle schede. Il supporto per questa funzionalit` prevede un meccanismo a 67 in cui ad ogni scheda venga assegnato un Card Serial Number di congurazione detto isolation,
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` di usare le espansioni. a 67 una descrizione pi` dettagliata pu` essere trovata nel Plug-and-Play HOWTO. u o
66

5.4. LA GESTIONE DI INTERFACCE E PERIFERICHE

219

(in breve CSN) che la identica e ne vengono rilevate le caratteristiche, dopo di che alle varie schede vengono assegnate le risorse da utilizzare in modo che non ci sia conitto. In questo modo un driver potr` utilizzare la scheda conoscendo i parametri che indicano a 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 ` che se un modulo viene caricato prima che il PnP abbia eseguito e lallocazione la scheda non sar` utilizzabile, inoltre se il meccanismo fallisce ci si pu` trovare con a o delle schede presenti ma non utilizzabili, se poi si cerca di riallocare le risorse di una scheda in uso gli eetti possono essere anche peggiori.68 Le modalit` con cui le schede vengono congurate sono sostanzialmente due: alcuni BIOS a sono in grado di eseguire da soli il procedimento di allocazione delle risorse, e presentare il risultato nale al sistema operativo;69 altri non sono in grado di farlo70 ed il procedimento dovr` a allora essere eettuato direttamente dal sistema operativo prima di poter utilizzare i driver.71 In genere72 quando il BIOS esegue la congurazione delle schede PnP questa viene salvata nella memoria non volatile (la cosiddetta ESCD, Extended System Conguration Data, dove vengono mantenute tutte le congurazioni del BIOS) in modo da poter essere riutilizzata al riavvio successivo; quando viene inserita una nuova scheda Plugn Play questa verr` riconosciuta a e congurata e la congurazione sar` aggiunta nella ESCD. Sebbene in teoria questo permetta a di evitare la ricongurazione tutte le volte che si riavvia la macchina, con Linux c` il problema e che quando la congurazione 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 nisce con il complicare notevolmente le cose, dato che molte delle funzionalit` vengono a dipendere dalla versione di a BIOS disponibile e da come questo e le relative schede supportano lo standard. Per questo motivo con Linux ` in genere preferibile usare le capacit` di congurazione fornite direttamente e a dal sistema. Prima dei kernel della serie 2.4.x, lunico modo di eseguire la congurazione era grazie al programma isapnp, a partire da essi il supporto per la congurazione ` stato introdotto nel e 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 ` pi` strettamente necessario, almeno n quando i driver ed il supporto e u sulle schede funzionano correttamente. Il comando prende come unico argomento il nome di un le di congurazione (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 signicato ` evidente; a partire dalla versione 1.18 si pu` e o usare anche - come nome di le, per indicare una lettura dallo standard input. Eseguendo il comando si esegue la congurazione delle schede e lassegnazione delle risorse secondo quanto specicato nella congurazione. In genere dovrebbe essere eseguito ad ogni riavvio, in quanto con Linux non c` modo di salvare le impostazioni precedenti. Se non si fa cos` e si corre il rischio, usando Windows (95 o 98) sulla stessa macchina che questo conguri le schede in maniera dierente, cos` che al successivo riavvio con Linux queste diventino inutilizzabili. Il formato di isapnp.conf ` piuttosto complesso, e non staremo qui a descriverlo (gli intee ressati possono fare riferimento alla pagina di manuale, accessibile con man isapnp.conf) dato
con buona probabilit` il blocco completo del sistema. a questo nel caso di Linux signica solo che si dovranno individuare quali sono le risorse assegnate, passando gli opportuni valori ai moduli che le utilizzano. 70 o si pu` dire al BIOS di non farlo specicando che si ha un sistema operativo Pnp enabled che si occuper` o a del compito nella apposita sezione di congurazione. 71 questo, nel caso di Linux, signica che la congurazione dovr` essere eettuata prima di caricare i moduli a relativi a dette schede. 72 alcuni BIOS meno evoluti non supportano questa funzionalit`. a
69 68

220

CAPITOLO 5. AMMINISTRAZIONE STRAORDINARIA DEL SISTEMA

che in genere questo le 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 ` che in certi casi le informazioni riportate non sono accurate; questo perch e e ntanto che le schede non erano necessarie allavvio alcuni produttori sono stati piuttosto pigri nella specicazione delle risorse necessarie allinterno della scheda, contando sulluso del driver (ovviamente fornito solo per DOS/Windows) per eseguire le impostazioni. Questo signica 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 eettuando vari tentativi di comunicazione con le eventuali schede, interrogando in la tutte le porte di I/O possibili (nellintervallo fra 0x203 e 0x3ff, riservato alle schede ISA), per identicare quali di queste corrispondono ad un dispositivo presente sul BUS, cui richiedere le informazioni. Si tenga presente per` che in certi casi si o possono avere conitti (linterrogazione cio` pu` interferire con altre schede non PnP o gi` e o a congurate) con risultati che vanno dalla successiva inutilizzabilit` delle suddette schede al a blocco completo del sistema. Pertanto ` sempre opportuno eseguire il comando in single user e mode (vedi sez. 5.3.4). Se invocato senza argomenti il comando stampa sullo standard output il risultato della scansione, direttamente nel formato utilizzato per la congurazione del programma isapnp; di default per` tutte le istruzioni sono commentate, pertanto ` comune salvare il le e poi o e editarlo per togliere i commenti. Se per` lo si invoca con lopzione -c il comando stesso cerca o di determinare le impostazioni pi` sicure e fornisce una versione pronta (cio` senza necessit` di u e a togliere i commenti) del le stesso. Si tenga presente per` che se lallocazione risulta impossibile o il comando pu` bloccarsi indenitamente nel tentativo di trovare una soluzione. o 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` cos` limitare lintervallo o evitando di interrogare schede gi` congurate o non PnP. Largomento pu` essere specicato a o 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 signicato di numero di schede gi` identicate e congurate dal BIOS, nel qual caso il programma non esegue la a procedura di ricerca, e inizia la scansione per nuove schede a partire dallindirizzo passato come secondo argomento. Le opzioni principali del comando sono riportate in tab. 5.13. Al solito per lelenco completo ed i dettagli si faccia riferimento alla pagina di manuale.
Opzione -c Signicato tenta di determinare delle impostazioni sicure per i dispositivi, e produce un output direttamente utilizzabile senza necessit` di rimuovere i a commenti. scarica i valori dei registri interni per ogni scheda e li stampa sullo standard output, in questo modo ` possibile vedere le eventuali impostazioni e 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 ` dovuto a conitti e porta e a classicare come non valide tutte le porte, ignorandolo si potranno trovare lo stesso le schede presenti. stampa la versione scrive il risultato sul le passato come parametro invece che sullo standard output. Tabella 5.13: Principali opzioni per il comando pnpdump.

-d

-h -i

-v -o

5.4. LA GESTIONE DI INTERFACCE E PERIFERICHE

221

Lo standard PCI Peripheral Connect Interface nasce per fornire un bus di espansione generico che fosse adatto allevoluzione dei computer, ed in grado di supportare velocit` di trasferimento a 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; dello standard sono state proposte varie estensioni (fra cui il bus AGP delle schede video che ` sostanzialmente un e PCI con frequenze operative pi` alte). u A dierenza del bus ISA nel caso di PCI la allocazione delle risorse ` dinamica; in genere gli e interrupt vengono associati sulla base dello slot su cui ` inserita la scheda di espansione, inoltre e il bus supporta la condivisione degli interrupt. Unaltra caratteristica specica del bus PCI ` che e ogni scheda riporta al suo interno (nel rmware) una serie di informazioni fra cui da una coppia di numeri che specicano sia il produttore che il tipo della scheda, che possono essere confrontati con un database delle schede prodotte (usualmente mantenuto nel le /usr/share/misc/pci.ids). In un bus PCI ciascuna periferica viene identicata univocamente grazie ad un indirizzo che ` composto da tre numeri: il numero di bus, il numero di dispositivo ed il numero di e funzione. Il numero di bus identica su quale bus si trova la scheda, infatti lo standard supporta la possibilit` di avere pi` bus (sicamente distinti) sulla stessa macchina, no ad un massimo a u di 256. Una caratteristica comune del PCI ` che i bus possono essere collegati in fra di loro e 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 no a 32 schede diverse (identicate per numero di dispositivo) che possono supportare no 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.

Figura 5.4: Schema della disposizione del bus PCI e delle varie interfacce di espansione.

I computer pi` recenti in genere hanno sempre almeno due bus (uno dei quali viene usato u principalmente per lAGP), la CPU ` collegata attraverso il cosiddetto host bridge sul bus prine cipale che ` sempre il bus 0, ulteriori bus sono agganciati su questo con un PCI bridge e su di e essi possono essere agganciati ulteriori bus in modo da formare un albero. Uno schema della disposizione dei bus pi` comune nelle architetture PC ` in g. 5.4. u e In generale il kernel riporta le informazioni relative a tutte le periferiche disponibili sul bus PCI allinterno del lesystem proc nella directory /proc/bus/pci, che contiene una directory (chiamata con il numero corrispondente per ciascun bus presente nel sistema, pi` il le devices u

222

CAPITOLO 5. AMMINISTRAZIONE STRAORDINARIA DEL SISTEMA

in cui sono riportate le informazioni relative a tutte le schede presenti (ed agli eventuali moduli cui sono associate). Questo per` vale per le versioni di kernel pi` recenti, nelle versioni pi` vecchie o u u esisteva solo il le /proc/pci, attualmente deprecato, bench ancora presente per compatibilit`, e a che contiene una lista descrittiva delle varie schede presenti. La lista dei dispositivi presenti sul bus pu` essere ottenuta anche con il comando lspci (nei o nuovi kernel questo ` il metodo canonico, e sar` lunico supportato in futuro). Il comando non e a 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 40) 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 40) 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/8139C+ (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` avere una descrizione pi` dettagliata comprensiva o u 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] 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` dettagli. u Con lopzione -t si pu` invece avere una stampa della struttura ad albero del bus, mentre con o -s si pu` selezionare quali dispositivi guardare, passando un parametro che esprime il relativo o indirizzo nella forma bus:slot.func (il formato della prima colonna del precedente esempio) dove ciascun numero identicativo pu` essere sostituito dal carattere jolly *. Le altre opzioni o principali sono riportate in tab. 5.14, per un elenco completo si faccia al solito riferimento alla pagina di manuale del comando. Un secondo comando utilizzabile per operare sul bus PCI ` setpci, che pu` essere utilizzato e o per interrogare e congurare i singoli dispositivi presenti sul bus. Il comando necessita sempre di una opzione di selezione per indicare su quale dispositivo operare, questa pu` essere sia -s per o usare lindirizzo che -d) per usare lidenticativo della scheda; entrambe usano la stessa sintassi gi` vista in tab. 5.14 per lspci. a Il comando prende come argomento il nome del registro73 su cui si vuole operare. Indicando solo il nome di un registro ne sar` stampato il valore corrente, indicando una assegnazione nella a forma registro=valore ne sar` invece cambiato il contenuto (si tenga conto che il valore deve a essere espresso in esadecimale). Al nome del registro si possono aggiungere i sussi .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` anche essere usato un valore o esadecimale che ne indica la posizione nello spazio dei registri.
lo standard PCI prevede che tutte le schede debbano avere una serie di registri di congurazione, che contengono informazioni o controllano vari aspetti del loro funzionamento, come il tempo massimo che un dispositivo pu` tenere il bus. o
73

5.4. LA GESTIONE DI INTERFACCE E PERIFERICHE


Opzione -v -n -b -t -s Signicato aumenta le informazioni stampate (pu` essere ripetuto due volte). o riporta il valore numerico degli identicatori 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 dispositivi che corrispondono ad un certo indirizzo sul bus espresso un parametro nella forma bus:slot.func. mostra le informazioni relative ai dispositivi di un singolo produttore (usando gli identicativi della scheda sulla base del valore del parametro vendorID:deviceID dove entrambi gli identicativi sono espressi come numeri esadecimali. usa il le passato come parametro come database degli identicativi delle schede PCI. Tabella 5.14: Principali opzioni per il comando lspci.

223

-d

-i

Un elenco sommario dei principali registri e del relativo signicato ` riportato in tab. 5.15, un e elenco completo di tutti i nomi deniti ` riportato nella pagina di manuale di setpci (i nomi sono e riportati in maiuscolo, ma possono essere specicati anche in minuscolo), per il relativo signicato si pu` fare riferimento alla dichiarazione delle constati omonime in /usr/include/linux/pci.h o o alle speciche dello standard PCI.
Registro device_id vendor_id latency_timer Signicato identicativo del dispositivo. identicativo del produttore del dispositivo. imposta un temporizzatore scaduto il quale il dispositivo rilascia luso del bus (cos` si permette in uso pi` corretto del bus da parte di altri u dispositivi presenti). valore (in sola lettura) del tempo minimo per il quale deve essere garantito luso del bus al dispositivo (in unit` di quarti di a microsecondo). valore (in sola lettura) che specica quanto spesso il dispositivo necessita di accedere al bus (in unit` di quarti di microsecondo). a

min_gnt

max_lat

Tabella 5.15: Costanti identicative di alcuni registri PCI usate dal comando setpci.

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.2 in quanto anche essa denisce una struttura a bus su cui vengono innestati dispositivi multipli. La trattiamo a parte in quanto in realt` questa a non ` necessariamente una interfaccia collegata ad un solo PC74 e di norma viene realizzata e 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 dierenza con le interfacce generiche di sez. 5.4.1 ` che nonostante sia possibile e inserire dispositivi diversi su un bus SCSI, linterfaccia ` utilizzata quasi esclusivamente per e laccesso a periferiche di stoccaggio di dati (principalmente dischi e nastri, ma anche CD e
` infatti possibile, e viene fatto normalmente con sistemi di dischi condivisi, collegare pi` PC alla stessa e u interfaccia SCSI.
74

224

CAPITOLO 5. AMMINISTRAZIONE STRAORDINARIA DEL SISTEMA

masterizzatori) e non alluso di periferiche generiche,75 ed il protocollo stesso della trasmissione dei dati sul bus ` dedicato a questo tipo di lavoro. Inne il bus non ` di solito cablato in soluzione e e unica su una piastra madre, ma pu` essere realizzato anche con un insieme di connettori che o collegano fra loro le varie periferiche. Uno dei problemi maggiori con le interfacce SCSI ` che dalla prima denizione dello standard e (SCSI-1, del 1986) si sono susseguite molte modiche (lo SCSI-2, cui segue lo SCSI-3 che per` o non ` mai stato rilasciato come tale ed ` stato suddiviso in parti distinte dellinterfaccia) ma e e anche allinterno degli stessi standard le modalit` di realizzazione delle cablature, dei connettori a 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` uno di parit`) erano riservati per la trasmissione dei dati, la frequenza di trasmissione u a era di 5MHz, con una corrispondente velocit` massima di trasferimento di 5MiB/s, erano poi a previste 4 linee per gli indirizzi, consentendo no ad un massimo di 8 periferiche sul bus. Una prima modica, chiamata Fast SCSI venne fatta aumentando la frequenza del bus a 10MHz per raddoppiare la velocit` di trasferimento. Altre modiche vennero fatte riguardo la a modalit` di gestione dei segnali sui cavi ed il tipo di cablatura, questo port` allo sviluppo di a o 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 dierenziali, 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` comandi, in modo da poterne ottimizzare lordine di esecuzione. u

Figura 5.5: Schema della struttura delle interfacce SCSI.

Una delle modiche principali (detta Wide SCSI ), che richiede un connettore diverso a 68 pin, prevedeva la possibilit` di usare un bus per il trasferimento dati a 16 bit (detto wide, in a contrapposizione con il precedente, detto narrow ) raddoppiando anche il numero di periferiche inseribili nel bus. In questo modo si otteneva a parit` di frequenza (con il cosiddetto Fast a Wide SCSI ) un raddoppio della velocit` di trasferimento 20MiB/s. Passi successivi sono state a lintroduzione di bus con frequenze sempre maggiori consentendo velocit` di trasferimento sempre a maggiori: Ultra SCSI a 40MiB/s, Ultra2 a 80MiB/s, Ultra160 a 160MiB/s e ultimamente pure Ultra 320 a 320MiB/s. Lo schema classico di una interfaccia SCSI ` riportato in g. 5.5, il bus prevede lesistenza e di almeno una unit` di controllo, la scheda, detta controller SCSI, che in genere si mette sul bus a
unica eccezione ancora in uso ` quella degli primi scanner che, non essendo allepoca disponibile una interfaccia e pi` semplice con sucienti capacit`, venivano pilotati da una interfaccia SCSI. u a
75

5.4. LA GESTIONE DI INTERFACCE E PERIFERICHE

225

PCI del computer, e a cui si collegano le altre periferiche utilizzando gli appositi connettori. Un singolo controller pu` gestire anche pi` bus, nel qual caso sar` in grado di alloggiare pi` conneto u a u tori. Tutte le periferiche sul bus, compreso lunit` di controllo, vengono identicate attraverso a un indirizzo di identicazione, detto SCSI ID.

Figura 5.6: Strutturazione del supporto alle interfacce SCSI nel kernel.

Nel caso di Linux il supporto SCSI ` presente n dalle prime versioni del kernel, ma dato che e lo standard prevede vari tipi di periferiche a partire dal kernel 2.4 il sistema ` stato organizzato e su tre livelli, secondo lo schema illustrato in g. 5.6. Al livello pi` alto, utilizzati direttamente dai u programmi quando accedono ai relativi le di dispositivo, stanno i driver per le periferiche che si trovano sul bus, come CD, nastri o dischi, ciascuno dei quali richiede una modalit` daccesso a 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 nali ed i driver che invece si occupano di gestire i controller per laccesso al bus, che saranno diversi a secondo della scheda SCSI utilizzata. Oltre a questultimi per` si situano a questo livello anche tutti i moduli che o consentono di utilizzare il protocollo SCSI per controllare dispositivi posti su altre interfacce; ad esempio il protocollo viene utilizzato sia per accedere ai dischi sul bus USB (che siano memorie a stato solido o veri e propri hard disk), che 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 identicate attraverso quattro numeri: il primo ` lhost adapter number che identica, come il nome stesso indica, quale ` linterfaccia e e (in genere la scheda col controller, ma pu` essere anche linterfaccia di un bus virtuale) con o 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 ` un numero progressivo che parte da zero. e Il secondo numero ` il cosiddetto channel number, che identica ciascun bus (detto anche, in e altra nomenclatura, canale SCSI ) associato ad un host adapter ; alcuni controller infatti possono gestire pi` di un bus, e questi saranno numerati progressivamente a partire da zero, nellordine u in cui ladatattore stesso li presenta (che dipender` ovviamente da come ` fatto questultimo). a e Anche questo ` un numero progressivo che parte da zero. e Allinterno di ciascun canale si avr` poi lidenticativo del singolo dispositivo posto su di a esso (lo SCSI ID di cui abbiamo gi` parlato). In genere sui dispositivi questo viene stabilito a

226

CAPITOLO 5. AMMINISTRAZIONE STRAORDINARIA DEL SISTEMA

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 lidenticativo pu` essere modicato dal BIOS di congurazione, ma ` in o e genere preimpostato al valore pi` alto (in genere 7) che ` quello che ha maggiore priorit`. u e a Inne alcuni dispositivi pi` sosticati (come le unit` a nastro dotate di libreria, o i juke-box di u a CDROM) possono avere al loro interno diverse funzionalit` che vengono allora indirizzate da un a quarto numero detto Logical Unit Name, o LUN. In questo caso la periferica da usare (ad esempio lunit` a nastro o il meccanismo di controllo della libreria) viene identicata completamente a usando anche il LUN; per la maggioranza dei dispositivi, che non hanno pi` periferiche a bordo, u questo ` nullo. e Pertanto una modalit` di indicare le periferiche SCSI ` quella di fornire una quadrupletta di a e 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` in messaggio del tipo: a 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 e si noti come in questo caso sia stato rilevato un hard-disk su USB, in cui linterfaccia di emulazione viene vista come scsi0, ed dispositivo viene riconosciuto (non essendo qui disponibile un meccanismo di assegnazione degli ID ogni dispositivo verr` associato ad una diversa interfaccia) a 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 le scsi; un esempio del contenuto del le, quando si ha una interfaccia cui sono agganciati pi` dispositivi ` il seguente: u e
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` mostrato nel precedente esempio sul contenuto dei messaggi di avvio ogni volta a che una periferica viene rilevata su una interfaccia SCSI gli viene assegnato un le di dispositivo, questultimo dipende dal tipo di dispositivo, nel caso di dischi essi sono tutti nella forma /dev/sdX dove X ` una lettera progressiva a partire da a; le eventuali partizioni saranno accedute e per numeri crescenti a partire da 1, esattamente come per i dischi IDE. Qualora invece si abbia a che fare con dei CDROM si avranno dispositivi diversi, in particolare nel caso del secondo esempio si avr` (andando a controllare i messaggi di avvio) un risultato del a tipo:

5.4. LA GESTIONE DI INTERFACCE E PERIFERICHE 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

227

i CD infatti vengono acceduti con i dispositivi /dev/srN dove N ` un numero progressivo a partire e da 0; un nome equivalente, anchesso utilizzato, ` /dev/scdN. Gli altri dispositivi utilizzati sono e /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 ne). Una caratteristica speciale del le /proc/scsi/scsi ` che questo pu` essere acceduto anche e o in scrittura, si possono cos` rimuovere e aggiungere dispositivi, funzionalit` che pu` essere utile a o qualora si disponga di periferiche hot-swap che possono essere estratte a caldo dal bus76 ; questo pu` essere fatto con comandi come: o 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 identica il dispositivo. Ovviamente un dispositivo potr` essere rimosso solo se non ` al momento utilizzato. a e 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 le con nome corrispondente al numero di ciascun host adapter number presente con quella interfaccia, nella forma: /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 sso anche una penna USB, otterremo al suo interno due le, corrispondenti alle due istanze della stessa interfaccia viste come host adapter diversi.77 Rispetto agli equivalenti dispositivi IDE in genere dischi e CDROM SCSI hanno prestazioni superiori per la capacit` del bus di gestire linvio di comandi multipli, vista per` la maggiore a o complessit` del protocollo sono anche in genere pi` costosi (per questo CD e masterizzatori a u sono ormai praticamente inesistenti, e rimangono sostanzialmente solo dischi e nastri per luso professionale). Un secondo aspetto da tenere presente nel caso di dispositivi SCSI ` che in genere il cablaggio e degli stessi ` pi` delicato, alcuni bus infatti devono essere opportunamente terminati per cone u sentire una corretta trasmissione dei segnali, inoltre la presenza di diversi standard sullo stesso bus pu` portare a degrado di prestazioni. Inne occorre tenere sotto controllo lallocazione degli o ID, che ` di norma a carico degli utenti, la presenza di due dispositivi con lo stesso ID infatti li e rende entrambi inutilizzabili. Un programma storicamente utilizzato per ricavare le informazioni relative ai dispositivi SCSI ` scsi_info, (che in Debian fa parte del pacchetto pcmcia-cs); questo permette di ricavare dal e dispositivo le informazioni ad esso sottostanti come:
monk:/home/piccardi/truedoc/corso# scsi_info /dev/sda SCSI_ID="0,0,0" HOST="0" MODEL="IC35L120 AVV207-0" FW_REV=" 0 0" questo ` possibile solo se il bus e le periferiche sono cablati con dei connettori appositi (ad 80 pin) che e supportino questa funzionalit`. a 77 si avrebbe lo stesso risultato nel caso si installassero pi` schede con lo stesso controller. u
76

228

CAPITOLO 5. AMMINISTRAZIONE STRAORDINARIA DEL SISTEMA

Gran parte dei programmi di gestione dellinterfaccia SCSI sono per` distribuiti con il paco chetto scsitools; il principale ` scsiinfo che permette di interrogare un dispositivo (passato e come argomento) per ricavarne tutta una serie di propriet` (per lelenco completo e le relative a spiegazioni si consulti la pagina di manuale), ` invece da segnalare luso dellopzione -l, da fare e senza specicare un dispositivo, che riporta quelli presenti. Inne sempre con il pacchetto scsitools 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 le /proc/scsi/scsi illustrati in precedenza.

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 congurazioni 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` veloci come lUSB) tendono ad essere meno presenti. Ci` u o non di meno esse restano le interfacce tipiche con cui vengono gestiti i modem,78 ed una delle interfacce pi` semplici per collegarsi a dispositivi esterni come router o switch programmabili. u Data la loro presenza n dalle origini dellarchitettura dei PC, lassegnazione delle risorse delle porte seriali ` predenita, e sia le porte di I/O che gli interrupt utilizzati per le 4 porte e previste dallarchitettura sono riportati in tab. 5.16, insieme ai le di dispositivo con cui si pu` o accedere ad essi.
Interrupt 3 4 3 5 Porta I/O 0x3F8 0x2F8 0x3E8 0x2E8 Dispositivo /dev/ttyS0. /dev/ttyS1. /dev/ttyS2. /dev/ttyS3.

Tabella 5.16: Risorse e le di dispositivo usati dalle porte seriali.

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 ` necessario e un numero maggiore di porte seriali occorre utilizzare delle schede di estensione apposite (esistono ad esempio delle schede dedicate ad alta velocit`, usate per lo pi` dai provider per gestire i a u modem), per le quali il kernel ` in grado di supportare la condivisione degli interrupt. Un caso e di conitto pi` comune ` invece quello in cui, come parte di una scheda ISDN o di un modem-fax u e interno, viene installata una nuova interfaccia seriale ed in tal caso occorrer` vericare questa a non sia sulla stessa linea di interrupt di una porta seriale che ` gi` in uso. e a Uno dei problemi pi` che si possono avere utilizzando altre porte oltre quelle standard ` u e che queste possono non essere congurate correttamente. Per ovviare a questo problema si pu` o utilizzare il programma di congurazione delle interfacce seriali setserial. Questo prende come primo argomento il le di dispositivo da congurare (o controllare), se utilizzato senza opzioni viene stampato un breve riassunto delle principali caratteristiche dello stesso:
monk:/home/piccardi/truedoc/corso# setserial /dev/ttyS1 /dev/ttyS1, UART: 16550A, Port: 0x02f8, IRQ: 3
78

quelli esterni, ma pure alcuni di quelli interni, sia che siano modem reali che modem nti, come i winmodem.

5.4. LA GESTIONE DI INTERFACCE E PERIFERICHE

229

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`; loutput delle informazioni riportate dal a comando ` controllato dalle ulteriori opzioni -a, che fa stampare tutte le informazioni possibili, e e -b che riporta solo un riassunto della congurazione del dispositivo; lelenco delle principali opzioni ` riportato in tab. 5.17. e
Opzione -a -b -G -z Signicato stampa tutte le informazioni disponibili. stampa un riassunto della congurazione. stampa le informazioni nel formato in cui vengono prese sulla riga di comando. azzera tutti i valori prima di fare le impostazioni.

Tabella 5.17: 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` modicare i parametri dellinterfaccia, ma alcuni di questi possono essere impostati o anche da un utente normale.
Opzione port 0xHHHH irq N uart type Signicato 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 autocongurazione al kernel (la porta di I/O deve essere gi` impostata) con cui determinare la UART e se auto_irq anche la a linea di interrupt. richiede di autocongurare anche la linea di interrupt. imposta la frequenza delle operazioni di base, in bit per secondo, in genere vale 115200, che ` il massimo raggiungibile da una seriale e standard. richiede luso di una velocit` di 57600bps (bit per secondo). a richiede luso di una velocit` di 115200bps (bit per secondo). a richiede luso di una velocit` di 230400bps (bit per secondo). a richiede luso di una velocit` di 460800bps (bit per secondo). a richiede luso di una velocit` di 38400bps (bit per secondo). a richiede una velocit` personalizzata pari a valore di baud_base diviso a per quello di divisor. imposta il divisore con cui calcolare una velocit` personalizzata. a

autoconfig

auto_irq baud_base X

spd_hi spd_vhi spd_shi spd_warp spd_normal spd_cust divisor N

Tabella 5.18: Principali direttive di impostazione del comando setserial.

I due parametri principali impostabili dal comando sono port e irq, il cui signicato ` ovvio e 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; inne si pu` controllare o la velocit` della porta seriale con la serie di argomenti spd_* il cui signicato, insieme a quello a degli altri parametri principali, ` riportato in tab. 5.18; al solito per una descrizione dettagliata e su pu` fare riferimento alla pagina di manuale di setserial. o

5.4.4

Gestione delle interfacce USB

Linterfaccia USB (Universal Serial Bus) nasce sulla piattaforma PC allo scopo di fornire una interfaccia di comunicazione semplicata e con prestazioni ridotte, ma molto semplice ad realiz-

230

CAPITOLO 5. AMMINISTRAZIONE STRAORDINARIA DEL SISTEMA

zare e poco costosa per la realizzazione di dispositivi semplici (ed in genere portabili, ` infatti e prevista anche la capacit` di fornire alimentazione) che non necessitano di tutte le risorse (in a termini di velocit` di accesso e banda passante nella trasmissione dei dati) fornite dalle usuali a interfacce di espansione trattate in sez. 5.4.1. Un bus USB ` costruito in maniera gerarchica ed ` controllato da una unit` di controllo (o e e a host), a cui ` direttamente collegato un concentratore (o hub) radice a cui tutti i dispositivi o e eventuali altri concentratori secondari vanno ad agganciarsi, secondo la struttura mostrata in g. 5.7. Il protocollo prevede che le comunicazione siano tutte controllate dallunit` di controllo, a che ` lunica che pu` iniziare una comunicazione, ed i dispositivi possono solo rispondere allunit` e o a di controllo; non ` prevista nessuna possibilit` di comunicazione dei singoli dispositivi fra di e a loro.79

Figura 5.7: Schema della struttura di un bus USB.

In genere su un computer ` presente un solo host (anche se alcuni ne hanno pi` di uno, ed e u ` comunque possibile aggiungerne altri usando schede di espansione) cui sono agganciate 2 o 4 e porte. A ciascuna porta USB si pu` agganciare un dispositivo o un hub, il quale a sua volta o avr` altre porte cui agganciare altri dispositivi ed hub. Il bus prevede no ad un massimo di a 127 unit` per ciascuna unit` di controllo; la presenza di hub secondari permette lutilizzo di un a a maggior numero di periferiche rispetto alle porte presenti sul PC, ma si tenga conto che anche essi contano come unit` sul bus, pertanto le unit` disponibili per le periferiche sono in realt` a a a 127 meno il numero di hub aggiuntivi. Come mostrato in g. 5.7 il bus prevede due direzioni per il usso dei dati, dallhost alla
altre architetture non hanno queste limitazioni, ma USB ` stata progettata con un compromesso fra prestazione e ed economicit`, per cui si sono evitate funzionalit` avanzate come larbitraggio del bus che comportano una a a maggiore complessit` realizzativa per dispositivi che dovevano essere estremamente semplici a
79

5.4. LA GESTIONE DI INTERFACCE E PERIFERICHE

231

periferica e viceversa, indicati con downstream e upstream; inoltre vengono specicati quattro tipi di trasferimento: Control transfers utilizzati per inviare pacchetti di controllo, che devono essere di dimensioni ridotte e trasportati con adabilit`; viene usata per congurare i dispositivi e per supportare a i comandi di controllo di base. Bulk transfers usata per trasmettere dati alla massima velocit` possibile in maniera adabile; viene a 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 notica (dato che non esiste un vero e proprio interrupt). Isochronous transfers usata per inviare e riceve dati potendo contare su una quantit` di banda garantita, a ma senza adabilit`, usata per trasferimenti real-time (ad esempio i trasferimenti per a video e audio). La presenza di due direzioni nel usso di dati si riette anche sui connettori, che in genere sono classicati in due tipi diversi, a seconda che siano rivolti allunit` di controllo (di tipo A) a o verso una periferica (di tipo B). Inoltre i dispositivi si possono suddividere in autoalimentati, alimentati dal bus,80 o entrambi. Unaltra distinzione fra i dispositivi ` fra quelli lenti (come e mouse, tastiere, ecc.) che comunicano al massimo ad 1.5Mbit/s e quelli veloci che possono usare potenzialmente no al 90% della banda passante massima. La prima versione del protocollo (USB 1.0) consentiva una banda passante massima di 12Mibit/s. Tuttavia luso di dispositivi lenti, gli interrupt e loverhaed del protocollo non consentono velocit` superiori a 8.5Mbit/s anche in condizioni ideali, mentre prestazioni tipiche sono intorno a ai 2Mbit/s. La seconda versione del protocollo, la USB2 permette invece di portare la banda passante ad un massimo teorico 480Mibit/s, ampliando notevolmente lutilizzabilit` del bus per a 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` di controllo. Per quanto riguarda USB 1.0 le unit` di controllo sono a a sostanzialmente di due tipi, o compatibili con le speciche Open Host Controller Interface (o OHCI) della Compaq (usata anche nel mondo Mac) o con la speciche Universal Host Controller Interface della Intel. Le funzionalit` sono le stesse, ma la seconda specica richiede hardware a pi` semplice e quindi ` meno costosa, ma richiede un driver pi` complesso e quindi un maggior u e u carico sulla CPU. Il supporto per USB ` stato introdotto per la prima volta a partire dal kernel 2.2.7; ma e nella serie 2.2.x il supporto ` molto grezzo, almeno no al 2.2.18 in cui sono state portate e indietro parecchie funzionalit` del 2.4; per un supporto pieno delle funzionalit` del bus (ed in a a 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` di controllo (UHCI o OHCI), a utilizzando rispettivamente i moduli usb-uhci e usb-ohci (da selezionare nella relativa sezione di congurazione del kernel, vedi sez. 5.1.3). In genere ` estremamente facile riconoscere quale delle due interfacce viene utilizzata, basta e infatti usare lspci per vericare il tipo di unit` di controllo; avremo allora, a seconda dei casi, a per una macchina che ha una unit` UHCI: a
che fornisce un massimo di 400 mA, quindi attenzione a non sovraccaricare, pena il rischio di non far funzionare nulla per mancanza di potenza.
80

232

CAPITOLO 5. AMMINISTRAZIONE STRAORDINARIA DEL SISTEMA

holland:~# lspci -v ... 00:04.2 USB Controller: VIA Technologies, Inc. VT82xxxxx UHCI USB 1.1 Controller (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` OHCI si avr`: a 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` USB 2, le speciche utilizzate sono quelle della Extended Host a Controller Interface, identicata con la sigla EHCI, mentre in questo caso il modulo da utilizzare ` ehci-hcd. In generale la scelta di quale modulo deve essere fatta in sede di installazione, e e pu` essere ssata usando modules.conf (vedi sez. 5.1.4). o Una delle caratteristiche del bus USB ` che (a dierenza ad esempio di quanto avviene per e il bus SCSI) la numerazione delle periferiche presenti non deve essere eettuata a mano, in quanto questo compito ` eseguito dal bus stesso. Laltra caratteristica interessante del bus ` che e e esso supporta sempre la possibilit` di disconnettere a caldo i dispositivi (anche se questo non a pu` avere conseguenze poco piacevoli se fatto senza accortezza). Per questo motivo in genere il o sistema ` in grado di usare un demone dedicato come hotplug,81 che ` in grado di rilevare la e e connessione e la disconnessione di nuove periferiche caricando (e rimuovendo) automaticamente i relativi moduli. Il bus fornisce inoltre al kernel la possibilit` di rilevare tutta una serie di informazioni dai a singoli dispositivi (il protocollo infatti prevede che questi forniscano i dati relativi a loro stessi); in genere questa informazione ` disponibile sotto /proc/bus/usb una volta che si sia montato il e 82 cosa che si pu` fare automaticamente allavvio aggiungendo una lesystem virtuale usbdevfs, o riga del tipo: none /proc/bus/usb usbdevfs defaults 0 0

a /etc/fstab. 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` un le con a nome il numero associato a ciascun dispositivo presente su detto bus, contenente i relativi dati. Un sommario con una presentazione pi` leggibile degli stessi dati ` fornito invece dal le u e /proc/bus/usb/devices che riporta lelenco di tutti i dispositivi presenti con una contenuto del tipo:
T: B:
81

Bus=01 Lev=00 Prnt=00 Port=00 Cnt=00 Dev#= Alloc= 0/800 us ( 0%), #Int= 0, #Iso= 0

1 Spd=480 MxCh= 6

inizialmente la gestione automatica veniva eettuata tramite il demone usbmgr, questo ` ormai obsoleto e e sostituito da hotplug che fornisce lo stesso tipo di funzionalit` in maniera generica per tutte le periferiche a (PCMCIA, SCSI, PCI, USB) che possono essere connesse e disconnesse a caldo. 82 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


D: P: S: S: S: C:* I: E: T: D: P: S: S: S: C:* I: E: E: 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 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

233

Il principale utilizzo di questo le ` per vericare se il riconoscimento di una periferica e la e relativa numerazione ` stata eseguito correttamente, infatti per ciascun dispositivo presente sul e bus viene riportata ne le 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 dello dispositivo allinterno del bus, dove Bus indica il numero progressivo del bus, Lev il livello (in termini di passaggi per eventuali hub secondari) 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 identicatori del venditore e del prodotto che vengono utilizzati per selezionare automaticamente83 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 stringe fornite dal produttore e mostrate nelle righe inizianti per S. Per il resto della sintassi si pu` fare riferimento alla Linux o USB Guide disponibile su http://www.linux-usb.org/USB-guide/book1.html Per una visualizzazione pi` intelligibile di queste informazioni si pu` usare i programmi u o del pacchetto usbutils, in particolare il programma lsusb permette di avere una lista molto semplice dei dispositivi presenti nella forma:
piccardi@monk:~/truedoc/corso$ lsusb Bus 001 Device 002: ID 04b4:6830 Cypress Semiconductor Corp. Bus 001 Device 001: ID 0000:0000

Il programma pu` comunque stampare la lista anche in forma gerarchica usando lopzione -t, o mentre si pu` ottenere informazioni molto pi` dettagliate con lopzione -v. Si possono poi usare o u 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 identicativo (con la sintassi bus:num) o del produttore (usando i rispettivi identicatori cui abbiamo accennato in precedenza). Al solito si faccia riferimento alla pagina di manuale per una descrizione completa.

se si ` installato il demone hotplug, che si cura di identicare, tramite questi numeri ed un opportuno database e di corrispondenze, ogni nuovo dispositivo attaccato ad una porta USB e di caricare in memoria il relativo modulo.

83

234

CAPITOLO 5. AMMINISTRAZIONE STRAORDINARIA DEL SISTEMA

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 adabilit`; partiremo con una introduzione teorica a questa tecnologia per poi vedere le varie a modalit` con cui essa viene realizzata e pu` essere utilizzata con Linux. a o

6.1.1

Introduzione

La tecnologia RAID (acronimo che sta per Redundant Arrays of Inexpensive Disks) nasce con un articolo pubblicato nel 1987 a Berkley, dove si descrivevano varie tipologie di disk array. Lidea di base ` quella di combinare pi` dischi indipendenti di piccole dimensioni per ottenere o e u prestazioni, o adabilit` o quantit` di spazio disco superiori a quelle ottenibili con un qualunque a a disco SLED (Single Large Expensive Drive). Larticolo prevedeva cinque diversi tipi di architetture RAID (da RAID-1 a RAID-5) ciascuna delle quali provvedeva diversi gradi di ridondanza per fornire tolleranza alla rottura e diversi gradi di prestazioni. A queste si ` aggiunta poi la notazione RAID-0 per indicare una congurazione e senza ridondanza. Oggigiorno alcune delle congurazioni previste nellarticolo non sono pi` supportate (se non u 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 (spesso indicata come RAID-10) o quella denita linear.1 In generale comunque ci si suole riferire a queste congurazioni con il nome di livelli, quelli che prenderemo in esame sono pertanto: linear In questo livello due o pi` dischi vengono combinati in un singolo dispositivo. I u dischi sono semplicemente accodati uno sullaltro, cos` che scrivendo in maniera lineare prima verr` riempito il primo e poi i successivi. La dimensione dei singoli a dischi in questo caso ` del tutto irrilevante. e Questo livello non assicura nessun tipo di ridondanza, e se uno dei dischi si rompe si perderanno probabilmente tutti i dati. Data la modalit` di scrittura comunque si a perderanno solo i dati presenti nel disco rotto, e qualche forma di recupero potrebbe comunque essere possibile.
con il kernel 2.6.x ` stata introdotta pure una tecnologia RAID-6 analoga alla RAID-5 che per` usa due dischi e o invece di uno per mantenere la ridondanza e pertanto assicura una maggiore adabilit`. a
1

235

236

CAPITOLO 6. AMMINISTRAZIONE AVANZATA DEL SISTEMA Questa congurazione non migliora le prestazioni di lettura o scrittura sulla singola operazione, ma quando pi` utenti accedono allarray si pu` una distribuzione del u o carico sui vari dischi, qualora per un caso fortuito venga eseguiti degli accessi a dati posti su dischi diversi.

RAID-0

Questo livello ` anche chiamato stripe mode; in questo caso dischi dovrebbero avere e la stessa dimensione (anche se non ` strettamente necessario). In questo caso le e operazioni sullarray vengono distribuite sui singoli dischi. Se si scrive un blocco di dati questo verr` suddiviso in strisce (le stripes, appunto) di dimensione predenita2 a che vengono scritte in sequenza su ciascuno dei vari dischi che compongono larray: una striscia sul primo, poi sul secondo, ecc. no allultimo per poi ricominciare con il primo. In questo modo la capacit` totale resta la somma di quella dei singoli dischi. a In questo modo le prestazioni di lettura e scrittura possono essere notevolmente aumentate, in quanto vengono eseguite in parallelo su pi` dischi, e se i dischi sono u veloci ed in numero suciente si pu` facilmente saturare la capacit` del bus, o se o a questultimo ` veloce si pu` ottenere una banda passante totale pari alla somma di e o quella dei singoli dischi. Se ` presente un disco di dimensioni maggiori si potr` continuare ad accedere opee a rando solo sullo spazio presente sulla parte nale dello stesso, ma in questo caso si operer` su un solo disco, e non si avr` quindi nessun miglioramento delle prestazioni a a per quanto riguarda i dati che vanno a nire 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 dierenza di linear, blocchi di dati continui pi` lunghi della dimensione di una striscia. In questa modalit` lMTBF u a (Mean Time Between Failure per` diminuisce proporzionalmente al numero di dischi o dellarray in quanto la probabilit` di fallimento dellarray ` equivalente a quella di a e un singolo disco moltiplicata per il numero dei dischi che compongono larray.

RAID-1

Questo ` il primo livello che fornisce della ridondanza. Richiede almeno due dischi e per larray e leventuale presenza di dischi di riserva. Inoltre i dischi devono essere tutti uguali, se sono diversi la dimensione dellarray sar` quella del pi` piccolo dei a u dischi. I dati vengono scritti in parallelo su tutti i dischi che compongono larray, pertanto basti che sopravviva anche un solo disco dellarray perch i dati siano e 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 ladabilit` in quanto la probabilit` di a a fallimento dellarray ` equivalente a quella di un singolo disco divisa per il numero e dei dischi dellarray. In realt` poi ` ancora minore, in quanto la probabilit` che i a e a dischi falliscano tutti insieme ` ancora minore, per cui basta sostituire un disco rotto e per recuperare lintera funzionalit` dellarray. a Come controparte per ladabilit` le prestazioni di scrittura di un RAID-1 sono in a genere peggiori di quelle del singolo disco, in quanto i dati devono essere scritti in contemporanea su pi` dischi, e se questi sono molti (e si usa una implementazione u software) facendo passare tante copie si pu` superare il limite di banda del bus su o cui sono posti i dischi abbastanza facilmente. In questo caso i controller hardware

questa viene di norma denita in fase di creazione dellarray, ed ` uno dei parametri fondamentali per le e prestazioni dello stesso.

6.1. LUTILIZZO DEL RAID

237

hanno il vantaggio di gestire internamente la replicazione dei dati, richiedendo linvio su bus di una sola copia. 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` approttare o del diverso posizionamento delle testine sui dischi per leggere i dati da quello che deve compiere un minore spostamento delle testine.3 RAID-4 Bench disponibile ` senzaltro il meno usato. Necessita di tre o pi` dischi. Mantiene e e u delle informazioni di recupero su un disco di parit`, ed utilizza gli altri in RAID-0. a I dischi devono essere di dimensioni identiche, altrimenti larray avr` la dimensione a del pi` piccolo di essi. Se uno dei dischi in RAID-0 si rompe ` possibile utilizzare le u e informazioni di recupero del disco di parit` per ricostruire i dati in maniera completa. a Se si rompono due dischi si perderanno invece tutti i dati. Questo livello cerca di bilanciare i vantaggi di adabilit` del RAID-1 con le prestaa zioni del RAID-0, ma non viene usato molto spesso per` perch il disco di parit` o e a viene a costituire un collo di bottiglia in quanto comunque tutte le informazioni devono esservi replicate, lunico caso di impiego reale ` quello di un disco veloce e aancato ad un gruppo di dischi pi` lenti. u RAID-5 Come per il RAID-4 anche in questo caso si cercano di ottenere sia vantaggi di adabilit` che quelli di prestazioni, ed ` il pi` usato quando si hanno pi` di due a e u u 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`, queste vengono distribuite su tutti i dischi che fanno parte dellarray. In a questo modo anche se uno dei dischi si rompe le informazioni di parit` presenti a 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` si rompono due dischi i dati sono persi. o Il RAID-5 presenta inoltre, dato che dati sono comunque distribuiti su pi` dischi, gli u 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`, o dellora dine di quelle del RAID-1. In generale comunque le prestazioni aumentano sia in lettura che in scrittura. Inoltre nel caso di RAID software ` richiesto un discreto e consumo di risorse (sia di memoria che di CPU) per il calcolo delle informazioni di parit`. a RAID-10 Si suole denire cos` una congurazione in cui si eettua un RAID-0 di pi` array u congurati 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` dischi, ma ntanto che almeno ne resta almeno uno attivo nei u due RAID-1 le informazioni saranno integre. Il tutto al prezzo di un numero molto maggiore di dischi per ottenere la stessa capacit`. a Uno degli scopi pi` comuni di un RAID ` quello di proteggersi dal fallimento di un disco (per u e questo il RAID-0 non deve mai essere usato in un sistema di produzione, il rischio di fallimento hardware si moltiplica per il numero di dischi); si tenga comunque presente che lutilizzo di un livello di RAID che assicuri la ridondanza non ` mai un sostituto di una buona politica di e
` caratteristica comune degli hard disk avere tempi di risposta nettamente diversi per la lettura sequenziale e di dati, rispetto al posizionamento (il cosiddetto seek time).
3

238

CAPITOLO 6. AMMINISTRAZIONE AVANZATA DEL SISTEMA

backup; un RAID infatti pu` proteggere dal fallimento dellhardware di un disco, ma non pu` o o nulla contro la corruzione di un lesystem, un utente che cancella i dati dal disco, o un qualunque 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: hardware o software. Nel primo caso occorre poter disporre di un supporto hardware, cio` di e un controller per i dischi che esegue le operazioni necessarie al suo interno, e presenta al sistema operativo linsieme dei dischi come un dispositivo unico. In teoria un RAID hardware ` lopzione migliore sul piano delle prestazioni in quanto non e necessita di utilizzare dalle risorse (CPU e memoria) della macchina, ma in genere chiede parecchio (specie per gli SCSI) da quelle del portafogli. Inoltre la superiorit` di prestazioni ` spesso a e solo teorica, molti controller hardware (specie quelli IDE) si sono rivelati essere molto pi` lenti u dellimplementazione software del kernel Linux per la scarsa potenza dei processori utilizzati. Questo, unito al fatto che in genere per molti server la CPU ` una risorsa che conta assai poco in e confronto allimportanza dellI/O su disco, fa si che lopzione del RAID software nella maggior parte dei casi si riveli estremamente competitiva. In ogni caso Linux supporta vari controller RAID hardware, sia SCSI che IDE. Nel primo caso (i controller SCSI) i vari driver sono disponibili nella sezione Block Devices della congurazione del kernel. Essi sono in genere accessibili attraverso i le di dispositivo posti in opportune sottodirectory di /dev a seconda del controller (ad esempio per il DAC Mylex si usa rd mentre per gli array Compaq si usa ida). I singoli array vengono identicati per canale (spesso i controller supportano pi` di una singola catena SCSI) e per disco, un dispositivo tipico di un u array ` sempre nella forma /dev/rd/c0d0 che indica il primo array sul primo canale. Una volta e 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 ` nella sezione ATA/IDE/MFM/RLL support, attraverso e i le 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` cio` ad esempio qualcosa a e del tipo di /dev/ataraid/d0p1. Per quando non si dispone di un supporto hardware Linux fornisce un supporto software, attivabile nella sezione Multi-device support, che supporta la creazione di RAID-0, RAID-1, ` RAID-4, RAID-5 e linear. E cio` possibile far costruire al kernel stesso degli array utilizzando e qualunque tipo di dispositivo a blocchi; dato che gli stessi RAID software sono a loro volta dispositivi a blocchi, ` possibile riutilizzarli per metterli in RAID fra di loro (pertanto ` possibile e e creare un RAID-10 mettendo semplicemente in RAID-0 un precedente array software creato in RAID-1). Una volta costruiti gli array si potr` accedere ad essi con i le di dispositivo /dev/mdX. a

6.1.3

Il RAID software

A parte abilitare il supporto nel kernel (cui abbiamo accennato in sez. 5.1.3), per lutilizzo del RAID software ` necessario utilizzare anche gli opportuni programmi in user space; di questi e esistono sostanzialmente due versioni, i raidtools (disponibili nellomonimo pacchetto) e il programma mdadm che invece ` un singolo programma che raccoglie al suo interno tutte le e funzionalit` divise nei vari componenti dei raidtools, e pu` funzionare anche senza lausilio di a o un le di congurazione (/etc/raidtab) che invece ` necessario per i raidtools. Nel nostro e caso ci concentreremo comunque su questi ultimi. Come accennato i raidtools utilizzano nelle loro operazioni un apposito le di congurazione, /etc/raidtab, che contiene le denizioni di tutti gli array. Il le ` diviso in sezioni che e

6.1. LUTILIZZO DEL RAID

239

deniscono i vari array, identicati dalla direttiva raiddev, che prende come parametro il nome del dispositivo da utilizzare per accedere ad esso. Una volta che si ` denito un array lo si pu` e o riutilizzare (in successive direttive raiddev. Un esempio di questo le, preso dalla pagina di manuale, ` il seguente: e
# # sample raiddev configuration file # old RAID0 array created with mdtools. # raiddev /dev/md0 raid-level 0 nr-raid-disks 2 persistent-superblock 0 chunk-size 8 device /dev/hda1 raid-disk 0 device /dev/hdb1 raid-disk 1 raiddev /dev/md1 raid-level 5 nr-raid-disks 3 nr-spare-disks 1 persistent-superblock 1 parity-algorithm left-symmetric device /dev/sda1 raid-disk 0 device /dev/sdb1 raid-disk 1 device /dev/sdc1 raid-disk 2 device /dev/sdd1 spare-disk 0

La sintassi del le ` molto semplice, righe vuote o inizianti per # vengono ignorate, ogni riga e valida contiene una direttiva seguita da un parametro che ne specica il valore. Alla denizione di una sezione con raiddev devono seguire le altre direttive che specicano di che tipo di array di tratta. La principale ` raid-level, che prende come parametro il numero di livello: i valori e possibili sono 0, 1, 4 o 5) oppure linear. A questa segue di solito la direttiva nr-raid-disks che indica il numero di dischi dellarray. Per i livelli che supportano dei dischi di riserva (vale a dire RAID-5 e RAID-1) se ne pu` specicare il numero con nr-spare-disks. o Per ciascuna componente dellarray si deve poi specicare con la direttiva device qual` il e le di dispositivo con cui vi si accede. Questo pu` essere un qualunque dispositivo a blocchi, o ivi compreso un altro RAID, purch questo sia gi` stato denito in una precedente sezione di e a /etc/raidtab. Ad una direttiva device deve seguire una direttiva raid-disk che ne specica la posizione nellarray (in ordine progressivo, a partire da 0). Gli eventuali dischi di riserva devono essere anchessi dichiarati con device, e poi specicati con la direttiva spare-disk. Nel caso di RAID-4 esiste anche la direttiva di specicazione parity-disk che identica il disco con le informazioni di parit`. Devono essere specicate tante a direttive device quanti sono i dischi che si ` indicato (con nr-raid-disks e nr-spare-disks) e fare parte dellarray. Oltre a queste che sono fondamentali per denire la struttura di una array, esistono una serie di direttive opzionali che permettono di congurare altre caratteristiche del RAID. Ad esempio luso della direttiva persistent-superblock permette di salvare le informazioni relative alla congurazione di un array in tutte le partizioni che ne fanno parte, in un apposito blocco di dati, il persistent superblock appunto, detto cos` in quanto in questo modo le informazioni sullarray sono sempre disponibili, anche quando non si pu` accedere ad /etc/raidtab (ad esempio quando o

240

CAPITOLO 6. AMMINISTRAZIONE AVANZATA DEL SISTEMA

si ha la partizione radice sul RAID). I valori possibili sono 1 e 0 che rispettivamente attivano e disattivano luso del persistent superblock. Questa funzionalit` ` essenziale, se si ` compilato il relativo supporto del kernel, ad attivare ae e anche lautorilevamento del RAID allavvio del kernel, occorre per` anche aver marcato le paro tizioni che fanno parte di un array come di tipo 0xFD; in tal caso infatti il kernel riconosce la partizione come componente di un RAID, e legge dal persistent superblock tutte le informazioni necessarie per attivarlo. Unaltra direttiva importante ` chunk-size che dice le dimensioni, in kilobyte, delle stripe e in cui vengono divisi i dati scritti sullarray per i livelli che supportano lo striping. Questa non ha nessun signicato n per il RAID-1 n per il linear, perch in entrambi i casi i dati e e e vengono comunque scritti (rispettivamente su entrambi o su uno dei dischi) qualunque sia la loro dimensione, ma negli altri casi questo dice la dimensione delle strisce in cui vengono divisi i dati inviati su dischi consecutivi. Inne ` molto utile la direttiva failed-disk che permette di creare un array inserendoci un e dispositivo senza che questo venga eettivamente utilizzato; in sostanza questa direttiva marca il dispositivo suddetto come rotto, e cos` diventa possibile ad esempio utilizzare il suddetto dispositivo ed al contempo essere in grado anche di montare il dispositivo RAID che user` a ` in questo modo che di solito si eettua una installazione che usi come i restanti dischi. E directory radice un array: prima si installa su un disco normale, poi si crea larray (di cui fa parte anche detto disco, ma come failed-disk) e si copia su di esso tutto il sistema. Riavviando ed usando larray come radice si potr` successivamente aggiungere allarray il disco usato per a linstallazione, facendo fare la sincronizzazione dei dischi al kernel. Le altre principali direttive di /etc/raidtab sono riassunte in tab. 6.1; al solito lelenco completo ` nella pagina di manuale, accessibile con man raidtab. e
Direttiva raiddev raid-level nr-raid-disks nr-spare-disks persistent-superblock chunk-size device raid-disk spare-disk failed-disk Signicato introduce la sezione che denisce un array, prende come parametro il relativo le di dispositivo. indica il tipo di RAID da utilizzare. indica il numero di dischi che costituiscono direttamente larray. indica il numero di dischi di riserva inseriti nellarray. registra le informazioni sullarray in un apposito settore sui dispositivi sottostanti. dimensione delle strisce (per le modalit` RAID che le a supportano). indica uno dei dispositivi costituenti larray. indica la posizione nellarray del precedente dispositivo indicato con device. indica la posizione nellarray del precedente dispositivo indicato con device come disco di riserva. indica la posizione nellarray del precedente dispositivo indicato con device come disco rotto.

Tabella 6.1: Principali direttive di congurazione di /etc/raidtab.

Una volta denite le propriet` dei vari RAID in /etc/raidtab si pu` inizializzare ed attia o vare ciascuno di essi con il comando mkraid, che prende come parametro il le di dispositivo /dev/mdX che identica ciascun array. Con lopzione -c si pu` specicare in le di congurazioo ne alternativo. Si tenga presente che loperazione distrugge il contenuto dei dischi, a meno che questi non siano marcati come failed-disk; in genere comunque il comando rileva la presenza di dati e si riuta di eseguire linizializzazione a meno che non la si forzi con luso dellopzione -f. Il comando rileva anche se i dispositivi scelti sono gi` stati utilizzati per un altro RAID, nel a qual caso per forzare linizializzazione occorrer` usare lopzione -R. a

6.1. LUTILIZZO DEL RAID

241

Una volta creato un array lo si pu` attivare con raidstart o si lo pu` disattivare4 con o o raidstop; entrambi i comandi vogliono come argomento il dispositivo da attivare (come identicato in /etc/raidtab) oppure si pu` usare lopzione -a per operare su tutti gli array deniti. o Anche per questi comandi si pu` utilizzare un le di congurazione alternativo specicabile con o lopzione -c; per tutti i dettagli si faccia al solito riferimento alla pagina di manuale. Una volta che si ` creato ed attivato un array se ne pu` controllare lo stato sul le /proc/mdstat e o che riporta tutte le informazioni relative ai dispositivi RAID presenti nel sistema; un esempio di questo le ` il seguente: e
davis:~# 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 ` presente un solo array in RAID-1, sincronizzato e attivo; quando invece si ha il caso di e un array in cui alcuni dischi non sono attivi e devono essere sincronizzati si avr` un risultato del a tipo:
server:~# 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 = md2 : active raid1 hdc3[2] hda3[1] 4490048 blocks [2/1] [_U]

0.8% (581632/69336448) finish=183.7min speed=6232K/sec

dove si hanno tre array RAID-1 costruiti con le prime tre partizioni di due dischi, in cui ` e attivo solo il secondo disco (/dev/hda), e si vede come il primo array sia integro, il sistema stia provvedendo alla ricostruzione del secondo, ed il terzo abbia un solo disco attivo. Una delle funzionalit` pi` interessanti delluso di tecnologie RAID che supportano la ridona u danza (come RAID-1 e RAID-5) ` quella per cui ` possibile continuare ad utilizzare il sistema e e anche senza utilizzare uno dei dischi. In genere un disco diventa inutilizzabile in caso di problemi hardware, per` ntanto che fa parte dellarray sar` possibile sostituirlo. Per questo esiste il o a comando raidhotremove che permette di forzare luscita di un disco dallarray (ovviamente il comando funziona solo se i restanti dischi sono sucienti a mantenere attivo larray). Il comando prende come argomenti il dispositivo dellarray seguito da quello del disco da rimuovere. Luso di questo comando pu` servire ad esempio quando si vuole sostituire un disco, una o volta tolto il disco dallarray infatti lo si potr` rimuovere (anche senza riavviare, se il dispositivo a ` hot-pluggable) senza problemi, e senza dover fermare larray (cosa che ad esempio non sarebbe e possibile se su di esso si ` posta la directory radice). In sostanza leetto ` lo stesso che si sarebbe e e ottenuto creando larray con la direttiva failed-disk, ma pu` essere ottenuto in qualunque o momento. Cosi come si pu` rimuovere un disco da un array, ` possibile aggiungerne uno usando il o e comando raidhotadd; in questo caso un disco non attivo (perch rimosso in precedenza o perch e e marcato failed-disk quando si ` creato larray) pu` essere inserito a caldo nellarray, questo e o permetter` ad esempio di sostituire un disco mettendone uno nuovo, e non appena esso sar` a a
4

ovviamente larray non deve essere in uso.

242

CAPITOLO 6. AMMINISTRAZIONE AVANZATA DEL SISTEMA

reinserito nellarray il kernel provveder` automaticamente ad eettuare la sincronizzazione del a contenuto dello stesso ricostruendo lintegrit` dellarray, cos` come mostrato nel secondo esempio a del contenuto di /proc/mdstat.

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 essibile lo spazio disco per superare le dicolt` a di modicare le dimensioni delle partizioni qualora i lesystem in essa contenuti non abbiano pi` spazio suciente. Luso del Logical Volume Manager permette cio` di evitare alla radiu e ce tutta le problematiche, evidenziate in sez. 5.2.2, relative alle diverse possibili strategie di partizionamento.

6.2.1

Introduzione

Uno dei problemi che la struttura di un lesystem unix-like presenta ` che quando si riempie e un dispositivo montato su una directory non se ne pu` aumentare la dimensione direttamente o semplicemente aggiungendo un altro disco perch questo andrebbe montato altrove. Pertanto e in casi come questi si ` spesso costretti a complesse operazioni di backup per sostituire il disco e 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 ` stato creato il sistema del Logical Volume Mae nager, grazie al quale ` possibile creare un lesystem invece che su un disco singolo o su una e partizione, allinterno di un volume logico. Questultimo poi non ` altro che un dispositivo e virtuale creato a partire da un insieme di volumi sici, che vengono opportunamente riuniti dal kernel in modo da presentarsi come un unico disco. Il vantaggio ` che i volumi logici possono essere ridimensionati a piacere senza necessit` e a di toccare le partizioni o i dischi che stanno al di sotto, per cui usando i programmi per il ridimensionamento dei lesystem si possono allargare o restringere questi ultimi in maniera molto comoda (con certi lesystem le operazioni possono essere eseguite a caldo, con il lesystem montato). In questo modo se lo spazio disco su un volume logico si esaurisce baster` allargarlo, e a se lo spazio disco sottostante non ` suciente baster` comprare un nuovo disco ed agganciarlo al e a 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) ` riportato e in g. 6.1, il sistema consiste nellintrodurre un livello intermedio, quello del gruppo di volumi (indicato in gura 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 sici (indicati con PV, da physical volume), che lo vanno a costituire. In sostanza il kernel si cura di suddividere un disco sico in tante piccole sezioni (dette physical extent, e indicate in gura con PE) che poi vengono rimappate5 nei corrispondenti logical extent (indicati con LE) che vanno a costituire un volume logico. Una delle funzionalit` pi` interessanti di LVM ` quella di poter utilizzare il sistema per a u e poter creare degli snapshot,6 cio` poter creare una copia dello stato di un volume logico ad un e 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 modiche eseguite al volume
5 da cui il nome di device mapper che il sistema ha assunto a partire dal kernel 2.6.x, dove ` stato riscritto da e zero per migliorare stabilit` e prestazioni. a 6 si tenga presente per` che gli snapshot al momento della scrittura di queste note non sono ancora stati portati o a LVM2.

6.2. IL SISTEMA DEL LOGICAL VOLUME MANAGER

243

Figura 6.1: Strutturazione del Logical Volume Manager.

originario. La versione corrente del lesystem sul volume logico originale registrer` tutte le a modiche nel nuovo spazio allocato, mentre il volume creato come snapshot conterr` i dati cos` a come erano al momento della creazione. Questo ` molto comodo per poter eseguire dei backup per volumi di grosse dimensioni senza e doversi preoccupare del fatto che durante lesecuzione del backup i dati vengano modicati; basta assicurarsi che nel breve tempo necessario a creare lo snapshot non ci siano attivit`, dopo a di che si potr` eseguire il backup con tutta calma su di esso mentre le operazioni continuano a regolarmente sul volume originale. Una volta completato il backup si potr` rimuovere il volume a logico usato per lo snapshot ed il volume logico originario manterr` in maniera trasparente tutte a le modiche eseguite nel frattempo; lunico aspetto critico ` quello di assicurarsi di avere allocato e per lo snapshot spazio suciente a contenere tutte le modiche, 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.1.3), ed avere installato gli opportuni programmi in user-space. Nel passaggio dal kernel 2.4.x al 2.6.x il sistema ` stato completamente riscritto, pertanto si potranno avere delle dierenze a seconda che e si usi la prima versione (detta anche LVM1) o la seconda (detta LVM2). In ogni caso la nuova versione ` in grado di riconoscere la presenza di volumi logici creati con la versione precedente e e di riutilizzarli senza problemi ed ` in genere pi` performante, anche se alcune funzionalit` sono e u a tuttora in fase di adeguamento.

244

CAPITOLO 6. AMMINISTRAZIONE AVANZATA DEL SISTEMA

6.2.2

La gestione dei volumi sici

Il primo passo nelluso di LVM ` quello della inizializzazione dei volumi sici; questo prevede e due passi, il primo ` quello di marcare la partizione usata (vedi sez. 5.2.2) con il codice 0x8E per e indicare il suo uso come volume sico e poi inizializzarla con il comando pvcreate; questo prende come argomento il le di dispositivo che identica il volume sico (se ne possono specicare anche pi` di uno) nel quale crea uno spazio iniziale nel quale mantenere le informazioni relative u al volume (come il gruppo di volumi di cui andr` a fare parte o lidenticatore univoco assegnato a al volume). Il comando pu` essere applicato anche a dischi interi, nel qual caso occorrer` eliminare la o a tabella delle partizioni (se questa viene rilevata il comando segnala un errore), cosa che pu` esser o fatta facilmente con un comando di cancellazione come: dd if=/dev/zero of=/dev/hdX bs=512 count=1 Il comando prende come opzioni speciche -u, che permette di specicare uno UUID7 ) a mano invece di farlo generare automaticamente al comando e -f che forza la creazione del volume senza richiedere conferma (distruggendo eventuali dati presenti). Inne (ma solo con la versione di LVM2) con -M si pu` indicare quale versione usare per il formato meta-dati (specicato con il o numero con lvm1 o lvm2). Le altre opzioni riguardano aspetti specici della gestione interna ed al solito rimandiamo alla pagina di manuale per una trattazione pi` dettagliata. u Con il comando pvscan, si pu` eseguire una scansione dei dischi presenti per rilevare al loro o interno la presenza di volumi sici usati da LVM, il comando si invoca senza argomenti, e si avr` a un risultato del tipo:
monk:/home/piccardi/Truelite/documentazione/corso# pvscan pvscan -- reading all physical volumes (this may take a while...) pvscan -- ACTIVE PV "/dev/hda3" of VG "vg" [54.51 GB / 19.51 GB free] pvscan -- total: 1 [54.52 GB] / in use: 1 [54.52 GB] / in no VG: 0 [0]

che mostra la presenza di in unico volume sico completamente utilizzato. 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 sici che non appartengono ad un volume logico, per le altre opzioni si faccia riferimento alla pagina di manuale. Un secondo comando diagnostico ` pvdisplay che stampa a video le caratteristiche di uno e pi` volumi sici (specicati come argomenti), nel nostro caso avendo visto che abbiamo un u volume sico su /dav/hda3 potremo ottenere:
monk:/home/piccardi/Truelite/documentazione/corso# pvdisplay /dev/hda3 --- Physical volume --PV Name /dev/hda3 VG Name vg PV Size 54.52 GB [114334605 secs] / NOT usable 4.19 MB [LVM: 182 KB] PV# 1 PV Status available Allocatable yes Cur LV 3 PE Size (KByte) 4096 Total PE 13955 Free PE 4995 Allocated PE 8960 PV UUID ZeyhF7-CK5M-HXup-rc0f-Ji1U-UKqq-3rr4yE lo Universal Unique IDentier ` un numero a 128 bit utilizzato per identicare univocamente un oggetto, ` e e composto di varie sezioni, fra cui N riferimento ad un MAC-address per il computer locale, una marca temporale e una parte casuale per garantire unicit`. a
7

6.2. IL SISTEMA DEL LOGICAL VOLUME MANAGER

245

che ci mostra tutte le caratteristiche di questultimo. Anche per questo comando le opzioni servono a controllare linformazione riportata; le principali sono: -s che fa stampare solo la dimensione totale del volume, -c che produce un output coi dati separati da un carattere : cos` da poterlo usare facilmente allinterno di script. Per un elenco completo e i dettagli si pu` fare riferimento alla pagina di manuale. o Inne un comando estremamente utile8 ` pvmove che permette di spostare tutti i dati mane tenuti su un certo volume sico su di un altro (cos` da poterlo rimuovere dal gruppo di volumi di cui fa parte). Il comando prende come argomenti il volume sico sorgente da cui rimuovere i dati e quello di destinazione su cui inviarli; ovviamente la destinazione deve avere spazio libero suciente a contenerli. Si pu` anche evitare di specicare un volume sico di destinazione, o nel qual caso lo spazio sar` redistribuito automaticamente sui volumi appartenenti allo stesso a gruppo. Il comando ha tre opzioni principali, la prima ` -i che fa stampare una percentuale di e completamento delle operazioni tutte le volte che ` trascorso il numero di secondi passato come e parametro; con -n invece si pu` restringere lo spostamento ai dati relativi al solo volume logico il o cui nome si ` passato come parametro. Inne con --abort si pu` abortire un precedente tentativo e o di spostamento non completato; se infatti il comando viene interrotto durante lesecuzione non c` nessun problema, e baster` reinvocarlo senza parametri per fare ripartire lo spostamento dal e a 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 sici necessari il secondo passo ` combinarli in un gruppo e di volumi, per questo si deve usare il comando vgcreate che crea un nuovo gruppo di volumi assegnandogli il nome specicato come primo argomento, ed inserendoci tutti i volumi sici specicati negli argomenti successivi; perch il comando abbia successo tutti i volumi sici e devono essere stati preventivamente inizializzati con pvcreate. Una volta creato un gruppo di volumi con nome vgname si avr` a disposizione una corrispondente directory /dev/vgname/ a in cui si troveranno tutti i le (in particolare i le relativi ai volumi logici, che tratteremo in sez. 6.2.4). Lopzione -s permette di denire le dimensioni dei physical extent in cui saranno divisi i volumi sici, da passare come argomento numerico seguito dalle estensioni standard per indicare kilo, mega e gigabyte. La dimensione standard ` di 4Mb, ed i valori possono spaziare da 4kb a e 16Gb in potenze di due, si tenga presente che un volume logico pu` mantenere un massimo di o 64k physical extent che comporta una dimensione massima di 256Gb, se si ha a disposizione pi` u spazio disco occorrer` usare delle dimensioni pi` ampie per i physical extent. a u Lopzione -l permette di denire un numero massimo di volumi logici che possono essere estratti dal gruppo; il valore massimo assoluto ` di 256, con -p invece si imposta il numero e massimo di volumi sici che possono essere inclusi, ed il massimo assoluto ` sempre lo stesso. e Per le ulteriori opzioni si pu` fare riferimento alla pagina di manuale, un elenco di opzioni comuni o a buona parte dei comandi che operano con i gruppi ed i volumi logici si trova in tab. 6.2, lelenco completo invece ` riportato nella pagina di manuale dedicata a LVM, accessibile con man lvm. e Una volta creato un gruppo di volumi questo pu` essere espanso aggiungendovi altri volumi o sici con vgextend, che di nuovo prende come primo argomento il nome del gruppo (che stavolta deve esistere) seguito dai volumi sici che si vogliono aggiungere (al solito specicati tramite il relativo le di dispositivo). Per i dettagli sulle opzioni (alcune delle quali sono riportate in tab. 6.2) si pu` fare riferimento alla pagina di manuale. o 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
sfortunatamente questa funzionalit` non ` stata ancora reimplementata su LVM2 allinterno del kernel stabile, a e anche se un supporto iniziale ` disponibile nel ramo di sviluppo. e
8

246

CAPITOLO 6. AMMINISTRAZIONE AVANZATA DEL SISTEMA


Opzione -v -d -t -h -M Signicato imposta il livello di prolissit`, pu` essere ripetuto no a a o tre volte per aumentare le informazioni stampate a video. importa il livello di debug, pu` essere ripetuto no a sei o volte per aumentare le informazioni stampate a video. esegue il comando in modalit` di test, i dati non vengono a modicati. stampa un messaggio di aiuto. imposta il formato dei meta-dati, prende come valore lvm1 o lvm2 (o semplicemente il numero), questa opzione ` disponibile solo su LVM2. e esegue automaticamente il backup dei metadati quando essi vengono cambiati, prende come valore y o n, (il default ` il primo e non ` il caso di cambiarlo). e e cerca di accedere al meglio ai dati quando i gruppi di volumi sono solo parzialmente accessibili.

-A

-P

Tabella 6.2: Principali opzioni comuni dei comandi di gestione di LVM.

che si vogliono rimuovere. Ovviamente perch il comando abbia successo tutti i volumi che si e vogliono rimuovere dal gruppo non devono essere utilizzati; con lopzione -a non ` necessario e specicare 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 ` comunque solo un primo passo, prima di poterlo e utilizzare infatti questo deve essere attivato in modo da poter essere utilizzato. Per questo si usa in genere il comando vgchange il cui scopo ` quello di modicare le propriet` di un gruppo e a di volumi. Il comando al solito prende come argomento il nome del gruppo di volumi, ma se non se ne specica uno si applica a tutti quelli presenti. Lopzione che ci interessa ` -a che ` quella che permette di attivare o disattivare il gruppo, e e rispettivamente con i parametri y e n; in genere gli script di avvio di LVM eseguono sempre un comando del tipo vgchange -a y. Altre opzioni sono -l che modica il numero massimo di volumi logici, passato come parametro (deve essere eseguita su un gruppo inattivo) e -x che attiva o disattiva (sempre con i parametri y e n) la possibilit` di estendere o ridurre il gruppo a togliendo o aggiungendo volumi sici. Un secondo comando usato allavvio del sistema (ma solo per LVM1, in LVM2 la cosa ` e automatica) ` vgscan che esegue una scansione dei dischi presenti per rilevare la presenza di e gruppi di volumi (analogo a quanto fa pvscan per i volumi sici), in genere lo si lancia prima di vgchange, e lunica opzione signicativa (per le altre si consulti la pagina di manuale) ` e --mknodes che crea in /dev i le speciali necessari alluso di dei dispositivi. Un esempio di questo comando `: e
monk:~# vgscan vgscan -- reading all physical volumes (this may take a while...) vgscan -- found active volume group "vg" vgscan -- "/etc/lvmtab" and "/etc/lvmtab.d" successfully created vgscan -- WARNING: This program does not do a VGDA backup of your volume group

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 nel sistema se non si specica nulla. Le opzioni sono le stesse gi` viste in sez. 6.2.2 per pvdisplay; a un esempio di questo comando `: e

6.2. IL SISTEMA DEL LOGICAL VOLUME MANAGER

247

monk:~# vgdisplay --- Volume group --VG Name VG Access VG Status VG # MAX LV Cur LV Open LV MAX LV Size Max PV Cur PV Act PV VG Size PE Size Total PE Alloc PE / Size Free PE / Size VG UUID

vg read/write available/resizable 0 256 3 3 255.99 GB 256 1 1 54.51 GB 4 MB 13955 8960 / 35 GB 4995 / 19.51 GB ePD2qd-BolC-6h0T-0mm5-Th01-Aqbl-BNbdsO

Quando si vogliono riunire in uno solo due gruppi di volumi si pu` utilizzare il comando o vgmerge, questo prende come primo argomento il gruppo di destinazione, che diventer` lunione a 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 metadata 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.2), per i dettagli si faccia riferimento alla pagina di manuale. Se invece si vuole spezzare in due un gruppo di volumi si pu` usare il comando vgsplit, o 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 dai volumi sici da inserire in questultimo. Dato che i volumi logici non possono essere suddivisi fra gruppi diversi occorrer` che ciascun volume a logico esistente sia compreso interamente nei volumi sici che restano in uno dei due gruppi. Al solito per le opzioni (sono solo quelle comuni) ed i dettagli si pu` fare riferimento alla pagina di o manuale.

6.2.4

La gestione dei volumi logici

Una volta creato un gruppo di volumi sar` possibile estrarre da esso lo spazio necessario a a creare un volume logico. Il comando principale per eseguire questo compito ` lvcreate che crea e 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 specicata la dimensione del volume sico 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,9 o con lopzione -L seguita dalla dimensione in byte; lopzione supporta anche la specicazione di altre unit` di misura come kilobyte, megabyte, gigabyte o terabyte se si aggiunge al numero a passato come parametro liniziale (va bene sia maiuscola che minuscola) della misura utilizzata. Se non si specica altro il comando crea un volume logico con un nome assegnato automaticamente al valore lvolN dove N ` il numero progressivo usato internamente dal sistema; si pu` e o per` specicare un nome qualunque con lopzione -n lvname; in questo caso si potr` accedere o a al nuovo volume logico usando come le di dispositivo /dev/vgname/lvname. Una delle funzionalit` di LVM ` che permette di suddividere i dati su pi` volumi sici in a e u maniera analoga al RAID-0, denendo con lopzione -i un numero di stripes su cui distribuire
9

le dimensioni sono le stesse dei physical extent sottostanti, denite in fase di creazione del gruppo.

248

CAPITOLO 6. AMMINISTRAZIONE AVANZATA DEL SISTEMA

i dati. Valgono in questo caso le stesse considerazioni viste in sez. 6.1.1 per il RAID-0.10 Se si utilizza questa funzionalit` si pu` anche determinare la dimensione delle stripes con lopzione a o -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 specicare 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 ` riportato in tab. 6.3, il comando utilizza anche e molte delle opzioni generali accennate in tab. 6.2; per i dettagli al solito si pu` fare riferimento o alla pagina di manuale.
Opzione -i Signicato indica di utilizzare il numero di stripe passato come parametro per distribuire i dati sui volumi sici sottostanti. imposta la dimensione di una stripe nella distribuzione dei dati su pi` volumi sici (da specicare con un numero u n da 2 a 9 per indicare 2n kilobyte). imposta la dimensione di un volume sico per numero (passato come parametro) di logical extent. imposta la dimensione di un volume sico specicata 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. importa il numero di settori da leggere in anticipo per migliorare le prestazioni (solo per LVM1). indica la richiesta di creazione di un volume di snapshot.

-I

-l -L -n -p

-r -s

Tabella 6.3: Principali opzioni del comando lvcreate.

Come per i volumi sici e quelli logici si possono usare i comandi lvscan e lvdisplay rispettivamente per eseguire una scansione dei volumi logici presenti e per ottenere un sommario delle relative propriet`. Anche le opzioni sono analoghe e non staremo a ripeterle. a La comodit` di LVM consiste nel fatto che una volta che si ` creato un volume logico si potr` a e a accedere a questultimo con il relativo le di dispositivo e trattarlo come un qualunque disco; il vantaggio ` che qualora si avesse la necessit` di ampliarne le dimensioni si potr` ricorrere al e a a comando lvextend, dopo di che non rester` che ridimensionare il lesystem presente sul volume a logico (vedi sez. 6.2.5) per avere a disposizione lo spazio aggiunto. Il comando richiede obbligatoriamente come argomento il volume da estendere e la dimensione nale dello stesso che deve essere specicata o con lopzione -l in numero di logical extent o direttamente con lopzione -L (con la stessa convenzione di lvcreate). Si possono per` usare le o stesse opzioni per specicare la dimensione dellestensione al posto di quella totale, apponendo al valore specicato il carattere +. Il comando supporta anche luso delle stripe (con le stesse opzioni di tab. 6.3) ed inoltre si pu` specicare come argomenti ulteriori una lista di volumi sici sui quali si vuole che sia o 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` specicata apponendovi un segno - per o
in particolare si avr` un enorme degrado di prestazioni qualora si usassero partizioni diverse dello stesso disco a come volumi sici su cui distribuire le stripes.
10

6.2. IL SISTEMA DEL LOGICAL VOLUME MANAGER

249

richiedere una riduzione. Si tenga presente che i dati presenti nella parte tolta con la riduzione vengono persi, pertanto ` fondamentale ridurre le dimensioni di un eventuale lesystem presente e sul volume logico prima di eseguirne una riduzione. Per completare i comandi di ridimensionamento si deve citare il generico lvresize che unisce le funzionalit` dei precedenti lvreduce e lvextend permettendo ridimensionamenti in a 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` utilizzato lo si pu` eliminare usando lvremove, il u o comando prende come argomento uno o pi` volumi da rimuovere, lunica opzione specica supu portata ` -f che permette di sopprimere la richiesta di conferma della rimozione dallo standard e input.

6.2.5

Il ridimensionamento dei lesystem

Bench non direttamente attinente ad LVM conviene trattare qui i comandi per il ridimensionae mento dei lesystem dato che il loro uso pi` comune ` appunto in combinazione con i comandi u e per ridurre o aumentare le dimensioni dei volumi logici di LVM.11 La possibilit` di ridimensionare un lesystem dipende dalla presenza di un opportuno proa gramma specico per ciascun tipo di lesystem. Correntemente la gran parte dei lesystem presenti su Linux (ext2/ext3, reiserfs, XFS,12 JFS) ` dotata di questa funzionalit`. In genee a rale questa operazione pu` essere eseguita solo a lesystem inattivo (cio` senza che questo sia o e montato), il che comporta degli ovvi problemi se si vuole ridimensionare la directory radice. Alcuni lesystem per` supportano anche il ridimensionamento a caldo (cio` senza smontare il o e lesystem) se questo avviene per accrescimento. Come accennato ogni lesystem ha normalmente un suo programma per il ridimensionamento, fa eccezione JFS, che si ridimensiona con una opzione di mount, per ridimensionare un lesystem JFS infatti baster` rimontarlo con un comando del tipo: a mount -t jfs -o remount,resize=10G /dev/vg/home /home dove se non si specica nessun parametro per lopzione resize il ridimensionamento viene fatto alla dimensione totale del dispositivo sottostante. Il comando che permette di ridimensionare un lesystem ext2 (o ext3, la struttura dei due ` e identica) ` resize2fs; il programma richiede che il lesystem sia smontato (anche se il supporto e per le operazioni a caldo ` disponibile come patch) e prende come primo argomento il dispositivo e su cui si trova il lesystem da ridimensionare. Se non viene specicato un secondo argomento indicante la dimensione da usare il ridimensionamento avviene alla dimensione corrente del dispositivo.13 La dimensione pu` essere indicata con la convenzione sulle unit` di misura gi` o a a illustrata in precedenza che prevede che queste siano specicate posponendo al numero la relativa iniziale. Si tenga presente che il comando non tiene assolutamente in considerazione le dimensioni del dispositivo sottostante, per cui se si usa una dimensione troppo grande si avranno problemi, inoltre se si ridimensiona una partizioni occorre avere cura che essa continui ad avere lo stesso cilindro iniziale, altrimenti il programma non potr` funzionare. a 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.
11 questi comandi sono comunque validi qualunque sia il dispositivo su cui ` mantenuto il lesystem, e possono e anche essere utilizzati quando di ridimensiona una partizione su un disco con parted. 12 che per` supporta solo accrescimenti. o 13 questo signica che largomento non ` necessario in caso di espansione e lo ` in caso di riduzione. e e

250

CAPITOLO 6. AMMINISTRAZIONE AVANZATA DEL SISTEMA

Per ridimensionare un lesystem di tipo reiserfs si deve invece usare il comando resize_reiserfs, passando come argomento il dispositivo contenente il lesystem da ridimensionare. La nuova dimensione si specica con lopzione -s seguita dal valore (con la solita convenzione per le unit` a di misura). Lopzione supporta anche luso dei segni + e - per indicare dei ridimensionamenti relativi (accrescimenti o riduzioni); se non si specica nulla il comando user` la dimensione del a dispositivo sottostante. Il comando permette anche di specicare con lopzione -j un dispositivo alternativo su cui mantenere il giornale, e di forzare le operazioni senza eseguire controlli con -f, per avere pi` u informazioni nel corso delle operazioni si deve invece usare -v.

6.3

Le quote disco

Una delle caratteristiche avanzate della gestione dei dischi presenti n dal kernel 2.0 ` quella e delle quote disco, un meccanismo che consente di limitare la quantit` delle risorse su disco che i a singoli utenti (o gruppi) possono usare. Tratteremo in questa sezione il loro utilizzo e le relative modalit` di gestione. a

6.3.1

Visione generale

Una delle risorse principali che gli amministratori di sistema devono gestire ` quella dello spazio e disco; uno dei problemi pi` comuni ` infatti quello del riempimento del disco, e questo avviene u e sovente perch alcuni utenti non si curano di controllare le risorse che usano, e niscono per e riempire tutto lo spazio disponibile, a scapito pure degli altri utenti. Per questo motivo una delle caratteristiche presenti da sempre in sistemi multiutente ` quella e di poter imporre delle restrizioni allo spazio disco utilizzato dai singoli utenti. Nel caso specico di un sistema unix-like questo ` sempre stato realizzato attraverso le cosiddette quote disco, un e meccanismo, realizzato nel kernel, che pone delle restrizioni alle risorse che un singolo utente pu` utilizzare. o Lidea ` che in questo modo esiste un limite di occupazione delle risorse oltre il quale ogni e utente non pu` andare. La struttura del meccanismo di controllo opera sia sulla quantit` di o a spazio disco (cio` sul numero di blocchi) che sul numero di le (cio` sul numero di inode) e e da mettere a disposizione; le due risorse sono completamente indipendenti per cui ` possibile e superare il limite sul numero di le occupati pur avendo ancora spazio disco disponibile. Le quote sono sempre calcolate per ogni singolo lesystem (che deve supportare il meccanismo14 ), pertanto ` usuale attivarle sul lesystem su cui si sono piazzate le home degli utenti. Si e tenga presente comunque che se gli utenti possono scrivere su pi` lesystem le quote opereranno u in maniera indipendente su ciascuno di essi, e dovranno perci` essere impostate separatamente. o Unultima caratteristica generale delle quote disco ` che il controllo sulla occupazione delle e risorse pu` avvenire a sia livello di un singolo utente (cio` in base allUID), che di un gruppo o e (cio` in base al GID), che di entrambi. In pratica, si avr` la possibilit` di utilizzare il disco e a a per aggiungere un certo le se questo ` consentito dalla quota dellutente cui apparterr` il le e a in questione o se ` consentito dalla quota di gruppo (sempre per il gruppo di appartenenza del e le).

6.3.2

Congurazione del sistema delle quote

Per poter utilizzare le quote disco occorre anzitutto abilitare il relativo supporto nel kernel nella sezione File systems della congurazione. Del sistema esistono due versioni, entrambe
con gli ultimi kernel il supporto ` presente per ext2, ext3, e reiserfs, mentre per XFS la caratteristica deve e essere esplicitamente abilitata dato che ` gestita in modo diverso. e
14

6.3. LE QUOTE DISCO

251

supportate per compatibilit`, anche se nei nuovi sistemi ` preferibile usare la pi` recente. Si a e u 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). Se si vuole utilizzare il controllo delle quote il secondo passo ` segnalarne la presenza in fase e di montaggio del lesystem perch il kernel sia successivamente in grado di mantenere i dati e relativi alluso del disco ed applicare le restrizioni, questo viene fatto utilizzando due opzioni speciche per /etc/fstab: per le quote gli utenti si usa usrquota mentre per quelle dei gruppi grpquota, un esempio di utilizzo di queste opzioni ` il seguente: e /dev/vg/home /home ext3 defaults,usrquota,grpquota 0 1

Una volta abilitato il supporto nel kernel e montato opportunamente il lesystem il passo successivo ` quello di avere presenti15 nella radice del relativo lesystem (la directory corrispone dente al mount point) dei due le quota.user e quota.group se si usa la versione 1 del supporto ` o aquota.user e aquota.group se si usa la versione 2. E in questi le che sono mantenuti i dati relativi alluso del disco da parte di utenti e gruppi rispettivamente. In generale non ` necessario creare questi le a mano,16 se sono assenti infatti la prima volta e che si usa il comando quotacheck verranno creati automaticamente. Questo comando deve essere sempre eseguito su un lesystem 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 le di dispositivo su cui ` posto il lesystem da cone trollare o il rispettivo mount point presente in /etc/fstab, ma questo argomento pu` essere o tralasciato con luso dellopzione -a che controlla tutti i lesystem montati (tranne quelli montati via NFS).
Opzione -a -R -F Signicato controlla tutti i lesystem montati. se specicata con -a non controlla la radice. controlla le quote nel formato specicato, 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 le con i dati delle quote esistenti. riporta lo stato di avanzamento delle operazioni. forza il controllo delle quote senza rimontare il lesystem in sola lettura. esegue il controllo anche con il lesystem montato in scrittura se il tentativo di rimontarlo in sola lettura fallisce.

-u -g -c -v -m -M

Tabella 6.4: Principali opzioni del comando quotacheck.

Il comando costruisce una tabella con delluso corrente del disco e la confronta, a meno di non usare lopzione -c (nel qual caso detti le 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 lesystem in sola lettura, onde evitare delle variazioni dello spazio occupato durante il calcolo; si pu` forzare lesecuzione se il lesystem non ` montabile in o e sola lettura usando lopzione -m.
questo non ` vero per le quote su XFS, in detto lesystem infatti le quote sono mantenute nei metadati e non e su le visibili. 16 alcuni HOWTO indicano di crearli vuoti con il comando touch se non sono presenti.
15

252

CAPITOLO 6. AMMINISTRAZIONE AVANZATA DEL SISTEMA

Di default il comando controlla solo le quote utente, se si vogliono controllare solo le quote gruppo occorre specicarlo esplicitamente usando lopzione -g, se le si vogliono controllare entrambe va specicata esplicitamente anche lopzione -u. Le altre opzioni principali sono riportate in tab. 6.4, per lelenco completo ed i dettagli al solito si faccia riferimento alla pagina di manuale. Una volta che si ` montata una partizione con il controllo delle quote perch questo sia e e applicato ` necessaria una attivazione esplicita con il comando quotaon; come per quotacheck e il comando richiede come argomento uno (o pi`) le di dispositivo su cui ` situato il lesystem u e con le quote o lopzione -a per attivarli tutti. Il comando prende le opzioni -u e -g con lo stesso signicato di quotacheck per attivare le quote su utenti e gruppi; al solito di default sono attivate soltanto quelle sugli utenti. Lopzioni -v aumenta la prolissit` del comando stampando a ogni lesystem 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` fare o riferimento alla pagina di manuale. In sostanza per poter utilizzare le quote, una volta modicato /etc/fstab per indicare i lesystem su cui usarle, si dovr` provvedere a lanciare negli script di avvio (subito dopo il a montaggio dei lesystem) 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.17 Il sistema del controllo delle quote pu` anche essere disabilitato utilizzando quotaoff. Il o comando (che ` equivalente a chiamare quotaon con lopzione -f) e notica al kernel la richiesta e di non eettuare pi` controlli sul superamento delle quote. Il comando prende gli stessi argomenti u di quotaon (in realt` si tratta dello stesso eseguibile, solo invocato con un nome diverso), e le a due opzioni -v e -p hanno lo stesso eetto descritto in precedenza.

6.3.3

Gestione delle quote di utenti e gruppi

Una volta attivato il congurato il supporto delle quote, e attivato lo stesso con i passi appena visti, il passo successivo ` quello di impostare quali restrizioni (in termini di spazio disco e di e inode disponibili) si vogliono imporre ai vari utenti (e gruppi). Come accennato in sez. 6.3.1 le quote si applicano in maniera indipendente per ciascun lesystem, inoltre se si ricorda quanto illustrato in sez. 5.2.3, un lesystem 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 le, 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` essere superato per brevi periodi di tempo, ed uno duro (detto o hard limit) che non pu` mai venir superato. Il breve periodo di tempo durante il quale ` possibile o e superare il primo limite ` detto periodo di grazia (grace period ), durante detto periodo ` ancora e e possibile creare nuovi le o usare spazio disco superando il limite morbido, ma comunque mai al di l` del limite duro. a Il programma che permette di impostare le quote (ovviamente solo allamministratore) ` e edquota, e nella sua forma pi` semplice prende come argomento lutente di cui si vogliono u modicare le quote, il comando infatti per default agisce sulle quote utente, se si vuole operare su un gruppo occorre specicare lopzione -g. Il comando crea un le 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:
17

nel caso di Debian lo script ` /etc/init.d/quota e fa parte del pacchetto omonimo. e

6.3. LE QUOTE DISCO /dev/hda3: blocks in use: 2594, limits (soft = 5000, hard = 6500) inodes in use: 356, limits (soft = 1000, hard = 1500)

253

le informazioni riguardo luso corrente sono riportate solo per riferimento, e una loro modica verr` ignorata, modicando invece i valori dei limiti fra parentesi, salvando il le ed uscendo a dalleditor questi verranno utilizzati come nuovi limiti; un limite pu` essere annullato usando il o valore 0. In realt` ` possibile specicare come argomenti pi` utenti (o gruppi) ed utilizzare lopzione -p ae u per specicare un utente (o gruppo) di riferimento le cui impostazioni dovranno essere utilizzate per tutti gli altri; in questo modo ` possibile eettuare una impostazione generale per un singolo e utente senza doverla poi ripetere a mano per tutti gli altri. Se non si specica nulla il comando imposta le quote per tutti i lesystem che le supportano; si pu` delimitare lazione del programma ad un solo lesystem specicando questultimo (indicato o per le di dispositivo) con lopzione -f. Inne con lopzione -t si pu` impostare il periodo di grazia, questa ` una propriet` globale e o e a pu` essere impostata solo a livello di tutti gli utenti (o tutti i gruppi) di un singolo lesystem; in o tal caso di nuovo sar` aperto un le temporaneo allinterno delleditor di default, il cui contenuto a sar` qualcosa del tipo: a 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 specicare un valore nullo per il periodo di grazia signicava utilizzare il valore del periodo di default (una settimana) con le nuove versioni ` necessario impostare esplicitamente un limite. e Un elenco delle principali opzioni del comando edquota ` riportato in tab. 6.5, per i dettagli e e lelenco completo si faccia al solito riferimento alla pagina di manuale.
Opzione -f -u -g -t -p Signicato limita le impostazioni lesystem specicato. richiede limpostazione delle quote per un utente. richiede limpostazione delle quote per un gruppo. imposta il periodo di grazia. specica un utente di riferimento.

Tabella 6.5: Principali opzioni del comando edquota.

Una volta attivare le quote si possono ci sono due comandi che permettono di vericarne lo stato, il primo ` quota che permette ad un utente di vericare le condizioni delle sue quote e disco, il comando con lopzione -u (il default, pu` essere omessa) stampa un resoconto delle o quote utente, se si vuole controllare le quote di gruppo occorre usare lopzione -g. Lamministratore (e solo lui) pu` anche richiedere il resoconto delle quote di un altro utente o o gruppo specicando questultimo come argomento del comando. Le altre opzioni principali di quota sono riportate in tab. 6.6, per i dettagli e lelenco completo si faccia al solito riferimento alla pagina di manuale.
Opzione -f -u -g -l -q Signicato limita le impostazioni lesystem specicato. richiede i dati delle quote utente. richiede i dati delle quote gruppo. riporta solo le quote su lesystem locali. stampa le informazioni in modalit` succinta. a

Tabella 6.6: Principali opzioni del comando quota.

254

CAPITOLO 6. AMMINISTRAZIONE AVANZATA DEL SISTEMA

Un secondo comando per il controllo dello stato delle quote ` repquota che per` ` ad uso e oe esclusivo dellamministratore, in quanto serve a fornire dei rapporti globali sullo stato delle quote nel sistema, 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 non prevede argomenti, e le opzioni servono per lo pi` a controllare le informazioni u che vengono stampate, un sommario delle principali opzioni ` riportato in tab. 6.7, al solito per e lelenco completo ed i dettagli di funzionamento del comando si pu` fare riferimento alla pagina o di manuale.
Opzione -a -u -g -n -q -s -v Signicato elenca i dati per tutti i lesystem 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` succinta. a adatta le unit` di misura per spazio disco e inode. a riporta maggiori informazioni e stampa anche i dati delle quote anche quando non sono usate.

Tabella 6.7: Principali opzioni del comando repquota.

Capitolo 7

Lamministrazione di base delle reti


7.1 Unintroduzione ai concetti fondamentali delle reti.

Il campo della comunicazione via rete ` uno dei pi` vasti e complessi di tutta linformatica. Nel e u corso degli anni sono stati sviluppati molti mezzi (cavo, bra, 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 identica 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 classicazione, quale lestensione, la topologia con cui sono realizzate ed i protocolli di comunicazione usati.

7.1.1

Lestensione

Una delle forme di classicazione di una rete pi` elementari, ed una delle meno precise, ` quella u e per estensione o area. In origine, quando le reti erano disponibili solo nei grandi centri di ricerca o nelle grandi imprese, la classicazione 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 edicio o gruppo limitrofo di edici (in genere una universit` o la sede di a una grande impresa) che di norma sono possedute e gestite da una sola organizzazione. 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 ` un esempio di WAN). In e questo caso la rete non ` propriet` di una entit` singola, ma viene gestita in comune e a a da pi` enti o organizzazioni. u

WAN

Con il diondersi dei computer e delle tecnologie di comunicazione, anche questa classicazione delle reti si ` evoluta, e la suddivisione per area di estensione si ` diversicata notevolmente, e e 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 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` legate al governo della citt`. a a 255

256 SAN

CAPITOLO 7. LAMMINISTRAZIONE DI BASE DELLE RETI 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. 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. 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.

PAN

DAN

In generale comunque, la sola classicazione rilevante ` la prima, le altre si sovrappongono e 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 classicazione generale applicabile a qualunque rete ` quella basata sulla sua topologia. La e topologia (dal greco topos) ` una branca della geometria che studia le propriet` delle connessioni e a fra oggetti geometrici, e si applica pertanto anche alla struttura delle reti. La classicazione 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: bus ` E una rete che utilizza un canale centrale (detto backbone) per connettere fra loro tutti i dispositivi. Il canale funziona come collettore cui ogni stazione si collega con un connettore inviandovi tutti i messaggi. Ogni stazione pu` osservare tutto il traco o del canale, estraendone i messaggi a lei indirizzati. ` E la topologia classica delle vecchie reti Ethernet su BNC. In genere questo tipo di rete ha il vantaggio della facilit` di installazione, ma ` ecace solo per un numero a e limitato di stazioni, in quanto il canale deve distribuire ad ogni nodo tutto il traco, compreso quello destinato agli altri, e pu` essere facilmente saturato. Inoltre in caso o di rottura del canale tutto il traco di rete ` totalmente bloccato e lintera rete non e ` usabile. e ` E una rete in cui ogni stazione ha due stazioni vicine, a loro volta collegate ad unaltra stazione, no a formare un anello. Ciascuna stazione comunica con le stazioni limitrofe, ed i messaggi vengono inoltrati lungo lanello per essere ricevuti dalla stazione di ` destinazione. E potenzialmente pi` eciente della struttura a bus in quanto non u ` necessario che il messaggio attraversi tutto lanello, ma solo la parte necessaria a e raggiungere la destinazione. Anche in questo caso per` la rottura di un cavo o di una o stazione comporta linutilizzabilit` dellintera rete. a ` E una rete in cui esiste uno snodo centrale (un hub o uno switch) cui vengono 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 sore del problema del collo di bottiglia dovuto alla necessit` di trasmettere tutti i dati ad a ogni stazione collegata.

ring

star

7.1. UNINTRODUZIONE AI CONCETTI FONDAMENTALI DELLE RETI. tree

257

` E una rete che integra in forma gerarchica pi` reti a stella. Viene in genere realizzata u 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` di traco che deve a passare per la backbone. ` E una rete che comporta la presenza di diversi percorsi possibili per la comunicazione. ` E in genere la modalit` in cui vengono create le reti WAN, o i cosiddetti fabric switch, a in cui, per ottimizzare la velocit` di trasmissione, si eettuano connessioni incrociate a fra pi` switch, cos` da avere strade diverse per il usso dei dati, con un traco pi` u u distribuito, che permette di comunicare con latenze inferiori.

mesh

7.1.3

I protocolli

Come abbiamo accennato parlare di reti signica parlare di un insieme molto vasto ed eterogeneo di mezzi di comunicazione che vanno dal cavo telefonico, alla bra 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` famoso dei quali, quello alla base del u funzionamento di internet, ` il protocollo TCP/IP. e Una caratteristica comune dei protocolli di rete ` il loro essere strutturati in livelli sovrape posti; in questo modo ogni protocollo di un certo livello realizza le sue funzionalit` basandosi su a un protocollo del livello sottostante. Questo modello di funzionamento ` stato standardizzato e dalla International Standards Organization (ISO) che ha preparato n dal 1984 il Modello di Riferimento Open Systems Interconnection (OSI), strutturato in sette livelli, secondo quanto riportato in tab. 7.1.
Livello Livello 7 Livello 6 Livello 5 Livello 4 Livello 3 Livello 2 Livello 1 Nome Applicazione Presentazione Sessione Trasporto Rete Collegamento Dati Connessione Fisica

Application Presentation Session Transport Network DataLink Physical

Tabella 7.1: I sette livelli del protocollo ISO/OSI.

La denizione di ciascuno di questi livelli ` la seguente: e Applicazione Il livello di applicazione indica il livello nale 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` di codica e conversione dei dati usate a 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; ` a questo livello e che sono impostati, deniti e sincronizzati gli scambi di dati. Di norma ` qui che sono e deniti i protocolli di funzionamento dei singoli servizi (telnet, FTP, e-mail) che vengono oerti sulla rete.

258

CAPITOLO 7. LAMMINISTRAZIONE DI BASE DELLE RETI

Trasporto Il livello di trasporto fornisce la comunicazione tra le applicazioni che girano sulle due stazioni terminali; ` sostanzialmente equivalente allomonimo livello del modello e TCP/IP illustrato pi` avanti. u Rete Il livello di rete si occupa dello smistamento dei singoli pacchetti su una rete interconnessa, ed ` a questo livello che si deniscono gli indirizzi di rete che identicano macchine e non in diretto collegamento sico; ` sostanzialmente equivalente allomonimo livello del e modello TCP/IP illustrato pi` avanti. u

Collegamento Dati Il livello di collegamento dati ` quello che fornisce una trasmissione adabile dei dati e su una connessione sica. A questo livello si deniscono caratteristiche come lindirizzamento dei dispositivi, la topologia della rete, la sequenza dei pacchetti, il controllo del usso e la notica degli errori sul livello di connessione sica (cio` delle singole stae zioni collegate direttamente fra loro da una connessione sica, e non attraverso i livelli superiori del protocollo). La IEEE ha diviso questo livello in due ulteriori parti, il Logical Link Control (LLC), denito 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 sico, e consente a dispositivi diversi di identicarsi univocamente in una rete: a questo livello sono deniti gli indirizzi sici, detti appunto MAC address, delle schede di rete. Connessione sica Il livello di connessione sica si occupa delle caratteristiche materiali (elettriche, siche, meccaniche) e funzionali per attivare, disattivare e mantenere il collegamento sico fra diverse reti di comunicazione. Sono deniti 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 ` stato sviluppato in corrispondenza alla denizione della serie di protoe colli X.25 per la commutazione di pacchetto. Nel frattempo per` era stato sviluppato un altro o protocollo di comunicazione, il TCP/IP (su cui si basa internet) che ` diventato uno standard e de facto. Il modello di questultimo, pi` semplice, viene chiamato anche modello DoD (sigla che u sta per Department of Defense), dato che fu sviluppato dallagenzia ARPA per il Dipartimento della Difesa Americano. Cos` come ISO/OSI anche il modello del TCP/IP ` stato strutturato in livelli (riassunti in e tab. 7.2); un confronto fra i due modelli ` riportato in g. 7.1, dove viene evidenziata anche la e corrispondenza fra i rispettivi livelli (che comunque ` approssimativa). Si ` indicato in gura e e 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, SLIP

Tabella 7.2: I quattro livelli del protocollo TCP/IP.

Il nome del modello deriva dai due principali protocolli su cui ` basata internet, il TCP e (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:

7.1. UNINTRODUZIONE AI CONCETTI FONDAMENTALI DELLE RETI.

259

Figura 7.1: Confronto fra il modello OSI ed il modello TCP/IP nella loro relazione con il sistema.

Applicazione E relativo ai programmi di interfaccia con la rete, in genere questi vengono realizzati secondo il modello client-server, realizzando una comunicazione secondo un protocollo che ` specico di ciascuna applicazione. e Trasporto Fornisce la comunicazione tra applicazioni che girano sulle stazioni terminali su cui girano gli applicativi, regola il usso delle informazioni, pu` fornire un o trasporto adabile, cio` con recupero degli errori o inadabile. I protocolli e principali di questo livello sono il TCP e lUDP. 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 ` IP e (sia nella attuale versione, IPv4, che nella nuova versione, IPv6). ` E responsabile per linterfacciamento al dispositivo elettronico che eettua la comunicazione sica, gestendo linvio e la ricezione dei pacchetti da e verso lhardware. Quale dei due modelli usare ` spesso una questione di gusti; il modello ISO/OSI ` pi` e e u teorico e generale, il modello TCP/IP ` pi` legato alla struttura con cui la gestione della rete ` e u 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. 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` dalla buca delle lettere per portarla al centro di smistamento, a dove in base alla sua destinazione sar` impacchettata insieme a tutte quelle che devono essere a inviate per posta aerea, e mandata al successivo centro di raccolta. Qui sar` reimpacchettata a 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 nale. Qui un altro postino prender` la vostra e la metter` nella cassetta a a della posta del vostro destinatario, il quale la aprir` e legger` quello che gli avete scritto. a a Questo ` molto simile a quello che succede quando volete spedire dei dati via rete, secondo il e procedimento che ` illustrato in g. 7.2. Ad ogni passaggio attraverso un livello del protocollo al e

Rete

Collegamento

260

CAPITOLO 7. LAMMINISTRAZIONE DI BASE DELLE RETI

Figura 7.2: Strutturazione del usso dei dati nella comunicazione fra due applicazioni attraverso i protocolli della suite TCP/IP.

nostro pacchetto di dati viene aggiunta una intestazione relativa al protocollo utilizzato in quel livello, si dice cio` che un pacchetto di un protocollo viene imbustato nel protocollo successivo. e A dierenza 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` rende facile il o progettare il software in maniera modulare facendo riferimento unicamente a quanto necessario ad un singolo livello, con la condenza che questo poi sar` trattato uniformemente da tutti i a 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` prenderemo in esame soltanto il caso di reti o basate su TCP/IP, il protocollo1 pi` diuso, quello su cui si basa Internet, e che ormai ` diu e ventato 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.
in realt` non si tratta di un solo protocollo, ma di una suite in cui sono inseriti vari protocolli, in modo da a coprire in maniera sostanzialmente completa le pi` varie esigenze di comunicazione. u
1

7.2. IL TCP/IP.

261

7.2.1

Introduzione.

Dato che il protocollo ` nato su macchine Unix, il TCP/IP ` la modalit` di comunicazione nativa e e a di GNU/Linux, e bench per compatibilit` siano stati implementati nel kernel anche parecchi e a altri protocolli di comunicazione (come DECnet, AppleTalk, IPX), questo resta il principale ed il pi` usato. u

Figura 7.3: Panoramica sui vari protocolli che compongono la suite TCP/IP.

Come illustrato in sez. 7.1.3 linsieme di protocolli che costituisce il TCP/IP ` strutturato, e secondo lomonimo modello, su 4 livelli; a ciascuno di essi corrisponde un particolare compito, svolto da uno (o pi`) protocolli specici. In g. 7.3 si ` riportata una panoramica dei principali u e 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 ` quella e dei cosiddetti socket, nata nel 1983 a Berkley e resa pubblica con il rilascio di BSD 4.2. La essibilit` e la genericit` dellinterfaccia consente di utilizzare i socket con i pi` disparati meccanismi a a u di comunicazione, e non solo con linsieme dei protocolli TCP/IP. Con i socket infatti si pu` creare un canale di comunicazione fra due stazioni remote, sul quale o 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 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 g. 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` specicate dal tipo di socket scelto. Cos` se si ` usato uno a e stream socket basato sul TCP questultimo si curer` di stabilire la connessione con la macchina a

262

CAPITOLO 7. LAMMINISTRAZIONE DI BASE DELLE RETI

remota e garantire ladabilit` della comunicazione controllando eventuali errori, ritrasmettendo a i pacchetti persi e scartando quelli duplicati. 2 Al livello successivo sar` poi IP che curer` linvio dei singoli pacchetti sulla rete, ed ` su questo a a e livello che operano i vari dispositivi che su internet consentono lo smistamento dei pacchetti no ` alla loro destinazione nale. E a questo livello che sono deniti gli indirizzi IP che identicano ogni macchina sulla rete. Il livello nale ` quello dellinterfaccia di rete usata per trasmettere i pacchetti verso lesterno, e che a seconda dei casi pu` essere una scheda ethernet o linterfaccia associata al modem; questo si o incaricher` di trasmettere i dati sulla rete sica che connette la macchina allesterno (sia questa a una rete locale o internet). In g. 7.3 si sono riportati i protocolli principali che costituiscono il TCP/IP. In queste dispense copriremo solo quelli di utilit` pi` comune; una breve descrizione di quelli riportati in a u gura ` comunque la seguente: e IPv4 ` Internet Protocol version 4. E quello che comunemente si chiama IP. Ha origine negli anni 80 e da allora ` la base su cui ` costruita internet. Usa indirizzi a 32 bit, e e e 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 specici di IPv6) vengono trasmessi attraverso di esso. ` Internet Protocol version 6. E stato progettato a met` degli anni 90 per rimpiazzare a IPv4. Ha uno spazio di indirizzi ampliato 128 bit che consente pi` gerarchie di indiu rizzi, lautocongurazione, ed un nuovo tipo di indirizzi, gli anycast, che consentono di inviare un pacchetto ad una stazione su un certo gruppo. Eettua lo stesso servizio di trasmissione dei pacchetti di IPv4 di cui vuole essere un sostituto. ` Trasmission Control Protocol. E un protocollo orientato alla connessione che provvede un trasporto adabile per un usso di dati bidirezionale fra due stazioni remote. Il protocollo ha cura di tutti gli aspetti del trasporto, come lacknoweledgment, i ` timeout, la ritrasmissione, etc. E usato dalla maggior parte delle applicazioni. ` User Datagram Protocol. E un protocollo senza connessione, per linvio di dati a pacchetti. Contrariamente al TCP il protocollo non ` adabile e non c` garanzia e e che i pacchetti raggiungano la loro destinazione, si perdano, vengano duplicati, o abbiano un particolare ordine di arrivo. ` Internet Control Message Protocol. E il protocollo usato a livello 2 per gestire 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` venire usato direttamente o da alcuni programmi come ping. A volte ci si riferisce ad esso come ICPMv4 per distinguerlo da ICMPv6. Internet Group Management Protocol. E un protocollo di livello 2 usato per il multicasting. Permette alle stazioni remote di noticare ai router che supportano questa comunicazione a quale gruppo esse appartengono. Come ICMP viene implementato direttamente sopra IP. ` Address Resolution Protocol. E il protocollo che mappa un indirizzo IP in un indirizzo ` hardware sulla rete locale. E usato in reti di tipo broadcast come Ethernet, Token

IPv6

TCP

UDP

ICMP

IGMP

ARP
2

in questo caso dal punto di vista dellutente la trasmissione dei dati ` pi` simile ad un collegamento telefonico e u che ad un invio di lettere. Useremo questa ed altre analogie nel seguito, ma si deve essere consapevoli che nessuna di esse ` mai perfettamente congruente con il comportamento eettivo della rete. e

7.2. IL TCP/IP.

263

Ring o FDDI che hanno associato un indirizzo sico (il MAC address) alla interfaccia, ma non serve in connessioni punto-punto. RARP ` Reverse Address Resolution Protocol. E il protocollo che esegue loperazione inversa rispetto ad ARP (da cui il nome) mappando un indirizzo hardware in un indirizzo IP. Viene usato a volte per durante lavvio per assegnare un indirizzo IP ad una macchina.

ICMPv6 Internet Control Message Protocol, version 6. Combina per IPv6 le funzionalit` di a ICMPv4, IGMP e ARP. EGP ` Exterior Gateway Protocol. E un protocollo di routing usato per comunicare lo stato fra gateway vicini a livello di sistemi autonomi 3 , con meccanismi che permettono di identicare i vicini, controllarne la raggiungibilit` e scambiare informazioni sullo a stato della rete. Viene implementato direttamente sopra IP. ` Open Shortest Path First. E in protocollo di routing per router su reti interne, 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. ` Generic Routing Encapsulation. E un protocollo generico di incapsulamento che permette di incapsulare un qualunque altro protocollo allinterno di IP. Authentication Header. Provvede lautenticazione dellintegrit` e dellorigine di un a ` una opzione nativa in IPv6 e viene implementato come protocollo a pacchetto. E s su IPv4. Fa parte della suite di IPSEC che provvede la trasmissione cifrata ed e autenticata a livello IP. Encapsulating Security Payload. Provvede la cifratura insieme allautenticazione dellintegrit` e dellorigine di un pacchetto. Come per AH ` opzione nativa in IPv6 e a e viene implementato come protocollo a s su IPv4. e ` Point-to-Point Protocol. E un protocollo a livello 1 progettato per lo scambio di pacchetti su connessioni punto punto. Viene usato per congurare i collegamenti, ` denire i protocolli di rete usati ed incapsulare i pacchetti di dati. E un protocollo complesso con varie componenti. ` Serial Line over IP. E un protocollo di livello 1 che permette di trasmettere un pacchetto IP attraverso una linea seriale. ` Dinamic Host Protocol. E un protocollo di livello 1 che permette di inviare informazioni di inizializzazione alle stazioni presenti in una LAN, come numero di IP, indirizzi di gateway e nameserver, le per il boot via rete, ecc.

OSPF

GRE AH

ESP

PPP

SLIP DHCP

7.2.2

Gli indirizzi IP

Per poter comunicare fra loro due computer in rete devono potersi in qualche modo riconoscere. Gli indirizzi IP, deniti dallInternet Protocol visto in sez. 7.1.3, svolgono esattamente questo ruolo, che ` analogo a quello del numero di telefono o dellindirizzo di una casa. Essi devono e identicare univocamente un nodo della rete. Lanalogia pi` diretta ` quella con il telefono; per poter telefonare occorre avere un numero u e di telefono e conoscere quello di chi si vuole chiamare. Lindirizzo IP ` lequivalente del numero e di telefono, solo che invece che di un numero decimale composto di un numero variabile di cifre
3

vengono chiamati autonomous systems i raggruppamenti al livello pi` alto della rete. u

264

CAPITOLO 7. LAMMINISTRAZIONE DI BASE DELLE RETI

` un numero binario (quindi espresso con soli 0 e 1) ed ha una dimensione ssa di quattro byte. e Come per i telefoni ad un numero pu` corrispondere solo un telefono, ma ad un telefono possono o essere collegati pi` numeri, vedremo pi` avanti come ad uno stesso computer (o a una stessa u u interfaccia di rete) possono essere assegnati pi` indirizzi IP. u Di solito, visto che scrivere i numeri in formato binario ` poco comprensibile, si ` soliti e e 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 ` tipo di 192.168.111.11. E attraverso questo numero il vostro computer viene identicato 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 ` vera anche per le reti private non connesse direttamente e ad Internet (come quelle che collegano i computer di un ucio). Per proseguire nellanalogia si pensi alle linee telefoniche interne di una ditta, usate per parlare allinterno degli uci. Dato che Internet, come dice il nome, ` un insieme di reti, anche queste devono venire idene ticate. Questo ` fatto attraverso altrettanti indirizzi IP, che corrispondono alla parte comune e di tutti gli indirizzi delle macchine sulla stessa rete. Per proseguire nellanalogia con il telefono si pu` pensare allindirizzo di rete come al presso che serve per parlare con un altra citt` o un o a altro stato, e che ` lo stesso per tutti i telefoni di quellarea. e La dierenza con i pressi ` che un indirizzo di rete IP, quando lo si scrive, deve essere e completato da tanti zeri quanti sono necessari a raggiungere la dimensione di 32 bit degli indirizzi normali; per riprendere il precedente esempio di numero IP, un possibile indirizzo di rete ad esso relativo potrebbe essere 192.168.111.0. Questo meccanismo signica in realt` che ogni indirizzo su Internet, pur essendo espresso a sempre come un singolo numero, nei fatti ` composto da due parti, lindirizzo di rete, che prende e la parte superiore dellindirizzo e identica 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 identica la macchina allinterno della vostra rete. La situazione dunque ` ancora analoga a quella di un numero di telefono che ` diviso in e e presso e numero locale. Un presso ` lequivalente dellindirizzo di rete, il numero IP completo e ` quello che identica il singolo telefono, solo che in questo caso il numero di cifre (binarie) che e si usano per il presso non ` sso, e pu` anche essere cambiato a seconda dei casi. e o Per questo motivo, quando si congura 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 identicare 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 ` gestita a livello internazionale dalla IANA (Internet Assie gned 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 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

0.0.0.0 128.0.0.0 192.0.0.0 224.0.0.0 240.0.0.0

Tabella 7.3: Le classi di indirizzi IP.

7.2. IL TCP/IP.

265

Le classi usate per il dispiegamento delle reti di cui ` attualmente composta Internet sono le e prime tre; la classe D ` destinata allancora non molto usato multicast, 4 , mentre la classe E ` e e riservata per usi sperimentali e non viene impiegata. Oggigiorno questa divisione in classi non ` e pi` molto usata (perch come vedremo fra poco ` ineciente), ma la si trova riportata spesso, u e e ed alcuni programmi cercano di calcolare automaticamente la netmask a seconda dellIP che gli date, seguendo queste tabelle.5 Una rete di classe A ` una rete che comprende 16777216 (cio` 224 ) indirizzi di singoli computer e e ed ha una netmask pari a 255.0.0.0, una rete di classe B comprende 65536 (cio` 216 ) indirizzi e ed ha una netmask pari a 255.255.0.0 e una rete di classe C comprende 256 (cio` 28 ) indirizzi e ed ha una netmask pari a 255.255.255.0.
n bit CIDR net Id 32 n bit host Id

Tabella 7.4: Uno esempio di indirizzamento CIDR.

La suddivisione riportata in tab. 7.3 ` largamente ineciente in quanto se un utente necessita e di anche solo un indirizzo in pi` dei 256 disponibili6 con una classe A occorre passare a una u classe B, con un conseguente enorme spreco di numeri (si passerebbe da 256 a 65536). Per questo nel 1992 ` stato introdotto un indirizzamento senza classi (detto CIDR) in cui il e limite fra i bit destinati a indicare il numero di rete e quello destinati a indicare lhost nale pu` o essere piazzato in qualunque punto dei 32 bit totali (vedi tab. 7.4), permettendo cos` di accorpare ` pi` classi C su ununica rete o suddividere una classe B. E stata cos` introdotta anche una nuova u 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. Per concludere questa panoramica sugli indirizzi occorre accennare allindirizzo di broadcast, mostrato insieme agli altri visti nora nello specchietto in tab. 7.5, in cui si ` riassunta la e struttura di un indirizzo IP di esempio. In ogni rete Internet infatti esiste un indirizzo riservato, che per convenzione ` sempre ottee nuto mettendo ad 1 tutti i bit della porzione dellindirizzo riservata allhost, che viene utilizzato da una singola stazione quando vuole inviare un messaggio contemporaneamente a tutti gli altri nodi presenti su quella rete.7
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.

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
il multicast ` una modalit` di comunicazione per consentire la spedizione simultanea di uno stesso pacchetto e a IP da una stazione singola, che lo emette una volta sola, verso pi` stazioni riceventi; ottimizzando quindi la u trasmissione dati da uno verso molti; per utilizzare questa comunicazione occorre operare su uno di questi indirizzi. 5 e questo alle volte pu` creare problemi, dato che non ` detto che la rete in questione sia ancora classicabile o e in questo modo. 6 in realt` gli indirizzi disponibili con una classe A sono 254, questo perch lindirizzo .0 ` riservato per indicare a e e la rete, mentre lindirizzo .255, come vedremo fra poco, ` quello di broadcast; questi indirizzi sono riservati per e ogni rete e non possono essere usati per un singolo host. 7 questo permette di usare direttamente le capacit` di broadcasting di alcune interfacce di rete che supportano a questa modalit` di comunicazione. a
4

266

CAPITOLO 7. LAMMINISTRAZIONE DI BASE DELLE RETI

presenti (ad esempio quelli che permettono di scoprire quali sono gli indirizzi realmente attivi), senza doversi indirizzare a ciascuno di essi individualmente. Inne alcuni indirizzi sono trattati a parte e considerati riservati, ad esempio dalla classe A ` e stata rimossa lintera rete 127.0.0.0 che viene associata ad interfaccia di rete virtuale, indicata dalla sigla lo, interna al singolo nodo. Si tratta di una interfaccia assolutamente virtuale che eettua la comunicazione in locale facendo passare i dati attraverso il kernel; di solito le si associa lindirizzo 127.0.0.1, il localhost, che viene utilizzato per comunicare, senza inuenzare la rete, quando un programma che usa i socket TCP/IP deve fare riferimento a se stesso. Un altro indirizzo speciale ` lindirizzo nullo 0.0.0.0 che viene usato per indicare un indirizzo e generico non specicato. Lo si usa anche per indicare linsieme di tutti gli indirizzi possibili, e per questo viene anche usato per indicare la cosiddetta default route, cio` la destinazione verso e cui inviare tutti i pacchetti con una destinazione al di fuori della rete locale. Inne lRFC 1918 riserva una serie di indirizzi per le reti private, cio` per le reti interne che e non devono mai essere connesse direttamente ad internet; 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.
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.

7.2.3

Il routing

Lidenticazione di un nodo nella rete eettuata tramite lindirizzo IP ` solo il primo passo e per poter stabilire eettivamente una comunicazione. Una volta che si sappia la destinazione nale infatti, occorre infatti sapere anche come poterci arrivare. Il lavoro di smistamento e reindirizzamento verso la loro destinazione nale dei pacchetti di dati che vengono trasmessi via rete ` quello che in termini tecnici viene chiamato instradamento, in inglese routing. e In questo caso il problema si pu` sostanzialmente dividere in due, cio` nella parte relativa o e alla propria rete locale, ed in quello che succede una volta usciti da essa. Largomento del routing ` uno dei pi` complessi nella gestione delle reti, ma dal punto di vista di una rete locale tutto si e u riduce al problema dellinstradamento dei pacchetti che escono dai computer che ne fanno parte. In questo caso si pu` ancora fare riferimento allanalogia telefonica: si pu` pensare alla propria o o rete locale come alla rete telefonica interna di una ditta; per poter uscire e telefonare allesterno occorre in qualche modo passare dal centralino. In una rete locale il ruolo del centralino ` svolto dal cosiddetto default gateway, questa ` la e e macchina che nella vostra rete fa da ponte verso lesterno. Tutte le telefonate dirette fuori (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 gateway. La dierenza coi numeri telefonici sta per` nel fatto che lindicazione di usare un centralino o non si pu` inserire allinterno del numero che si compone (ad esempio mettendo un 0 o un 1 o allinizio dello stesso), ma in questo caso deve essere proprio specicato lindirizzo completo della macchina che fa da ponte, che anchessa avr` un suo numero IP. a Una volta usciti dalla rete locale la situazione si complica molto, ed in questo caso lanalogia telefonica non ci aiuta, perch il collegamento telefonico nasce a commutazione di linea, cio` e e per realizzarlo si mettevano eettivamente in collegamento elettrico i due telefoni con una serie di selettori, mentre internet ` progettata per funzionare a commutazione di pacchetto, cio` non e e esiste mai una connessione diretta fra due nodi, anche se poi i programmi usano delle funzionalit` a

7.2. IL TCP/IP.

267

che permettono di lavorare come se le cose fossero eettivamente cos` ma i dati inviati vengono , spezzati in pacchetti passati da un nodo della rete allaltro no ad arrivare alla loro destinazione nale dove vengono riassemblati. Per questo, come dice poi lo stesso nome di instradamento, unanalogia che pu` spiegare un o po meglio le cose, ed illustra pi` chiaramente i concetti del routing ` quella delle reti stradali. u e 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 li 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, ` che i pacchetti che escono dal vostro computer vengono inviati al router e (lequivalente del casello) del vostro provider; da li prenderanno la strada opportuna per arrivare al router del provider a cui ` collegato il computer del vostro interlocutore, che li mander` a lui. e a 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 nale. La dierenza fra i caselli ed i router ` che questi ultimi sanno indicare da soli ai pacchetti la strada su cui devono e andare per arrivare a destinazione. In realt` sono ancora pi` intelligenti, e sono in grado di a u far prendere ai pacchetti la strada pi` veloce, tenendo conto di eventuali ingorghi, incidenti, u interruzioni del traco ecc. Cos` se il tunnel del Monte Bianco viene chiuso, quando arrivate a Torino il router vi far` dirottare per il Frejus. a

7.2.4

I servizi e le porte.

Finora abbiamo parlato quasi esclusivamente di IP; come accennato nellintroduzione (si ricordi quanto detto in sez. 7.1.3) questo ` solo uno dei protocolli di internet, e copre soltanto il livello e di rete. Abbiamo gi` visto che per poter eettuare delle comunicazioni in generale i programmi a necessitano di creare delle connessioni, e per far questo ci sono i socket, che usano i protocolli del livello di trasporto, come TCP ed UDP. Occorre perci` introdurre unaltra delle caratteristiche del protocollo TCP/IP, relativa stao volta 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 viene, sia pure in maniera molto parziale, in aiuto. Finora infatti abbiamo parlato dei numeri IP come dei numeri di telefono, ma questo riguarda solo la parte del protocollo che viene usato per eettuare la trasmissione fra due computer, e cio` il protocollo IP. e Allora come su un numero di telefono pu` rispondere una persona (se solleva la cornetta), una o segreteria telefonica, un fax, o un altro computer (se c` attaccato un modem), lo stesso accade e anche per internet; su un numero IP possono in realt` rispondere diversi servizi, corrispondenti a a forme di comunicazione diversa. Lanalogia usata ` molto debole perch di solito per fare ognuno di questi compiti ci vogliono e e apparecchi diversi (anche se talvolta si trovano oggetti che assommano pi` di uno di essi). Per u questo in realt` si potrebbe pensare alle porte come ai canali della lodiusione,8 cio` a delle a e specie di frequenze diverse su cui sintonizzate il vostro telefono, sulle quali trovate i contenuti pi` diversi. u
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`, ma che oggi non esiste praticamente pi`. a u
8

268

CAPITOLO 7. LAMMINISTRAZIONE DI BASE DELLE RETI

In realt` non ` neanche cos` perch nel caso della lodiusione il segnale non viene da a e , e 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 volete9 in contemporanea. Questo avviene perch, come spiegato, TCP/IP ` un insieme di protocolli, ed IP (quello e e dei numeri) serve solo a gestire la trasmissione dei pacchetti attraverso una rete. Per poter eettuare 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` in l` di quanto si fa con u a IP, che serve solo ad inviare pacchetti da un computer allaltro, e non da una applicazione ad unaltra. E per questo motivo che nei protocolli del livello di trasporto, come UDP e TCP, ` stato e introdotto questo concetto delle porte, cio` di un secondo numero che in sostanza permette e di identicare le due applicazioni che stanno usando il protocollo, in modo da poter gestire la possibilit` di avere pi` connessioni10 contemporanee tra le stesse macchine (destinate a servizi a u diversi o provenienti da applicazione diverse) e tenere separati i pacchetti ad esse relative. Cos` quando si vuole inviare della posta elettronica si comunicher` attraverso una di queste a porte, mentre quando si vuole leggere una pagina web se ne user` unaltra, usando uno scambio di a dati specico che va a costituire lultimo livello (quello di applicazione) della struttura mostrata in g. 7.1. Si tenga conto per` che il concetto di porta ` spesso fuorviante, in quanto con porta si intende o e una qualche forma di accesso permanente che pu` essere aperto o chiuso. In realt` non esiste o a nessuna forma di accesso permanente e lo scambio di dati avviene solo se si hanno da ambo le parti gli strumenti per eettuarlo11 (il server ed il client); per questo sarebbe pi` chiaro parlare u di frequenza, su cui si pu` trasmettere o ascoltare, ed in cui ciascuno pu` essere la trasmittente o o (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 specici (la porta 25 alla posta elettronica, la porta 80 al web, ecc.). In un sistema Unix le prime 1024 porte sono dette riservate in quanto solo lamministratore pu` installarci sopra dei servizi; la corrispondenza fra queste porte ed i servizi che ci devono o essere installati ` regolata a livello internazionale: nessuno vi obbliga a rispettare la convenzione, e ma se mettete la posta elettronica sulla porta 80 e il web sulla 25 avrete certamente delle grosse dicolt` a comunicare con gli altri, dato che in genere i browser cercano i siti sulla porta 80, ed a i client di posta cercano un server sulla porta 25. Al di sopra della porta 1024 qualunque utente pu` mettere un suo servizio, avviando un o demone che si metta in ascolto, alcune di queste porte per` sono state usate tradizionalmente o da altri servizi molto diusi, per cui in certi casi si potranno avere comunque dei conitti; come vedremo in sez. 7.6.3 un elenco che associa un numero di porta ad un servizio noto viene mantenuto nel le /etc/services. Inoltre si ricordi che come c` una porta per contattare il server sulla macchina di destinazione e si deve avere anche una porta che identica il programma client che ha eseguito la connessione sulla macchina sorgente. Questo perch se ad esempio si lanciasse due volte un browser per e leggere lo stesso sito si avrebbe una situazione in cui si contatta un server web a partire dallo
in realt` lo si pu` fare no ad un numero massimo di 65535 porte, pari a 216 1. a o per UDP ` pi` corretto parlare di canali di comunicazione in quanto non c` una connessione come nel caso e u e di UDP, in cui oltre allinvio dei pacchetti si cerca di assicurare pure una comunicazione adabile. 11 per questo non sar` mai possibile sfondare una porta sul vostro computer, se su di essa non c` un server, a e cos` come non possono mandarvi oese sulla radio, se non siete in ascolto.
10 9

7.3. LA CONFIGURAZIONE DI BASE

269

stesso IP sorgente, verso lo stesso IP e la stessa porta di destinazione; ma il kernel deve essere in grado di poter separare i pacchetti inviati indietro alle due istanze del browser (che potranno leggere contenuti diversi) e per questo dovranno essere usate da ciascuna istanza delle porte sorgenti diverse. Questo comporta che ogni client viene sempre contattato (dai pacchetti di risposta) su una porta specica (quella sorgente), la dierenza ` che in genere questa viene scelta automaticamene te dal kernel quando il client crea la connessione, ed ` detta pertanto porta emera (o ephemeral e port) proprio in quanto non corrisponde ad un valore sso ed il suo utilizzo ` limitato al solo e tempo di una connessione.

7.3

La congurazione di base

La congurazione della rete ` una materia alquanto complessa e di una vastit` impressionante. e a In particolare essendo numerosissimi, e spesso molto complessi, i servizi che operano sulla rete, sono altrettanto numerose e complesse le congurazioni che si possono arontare. In questa sezione per` aronteremo solo la congurazione di base della rete, e non dei vari servizi che o possono essere realizzati su di essa. In particolare vedremo come eettuare le varie impostazioni relative alluso e alla gestione dei tre livelli pi` bassi del protocollo TCP/IP, che sono la base su cui tutto il resto ` costruito, u e ed esamineremo sia i comandi di base con i quali si eettua la congurazione manuale della rete, che i le di congurazione usati nel procedimento di avvio per la congurazione automatica dellinterfaccia.

7.3.1

Il supporto nel kernel

Come mostrato g. 7.1 ` il kernel che fornisce il supporto dei protocolli necessari (per i livelli di e trasporto, di rete ed il collegamento sico) per il funzionamento della rete e delle interfacce di comunicazione. In genere tutte le distribuzioni provvedono dei kernel standard che sono gi` predisposti a a supportare tutto quello che serve nei casi pi` comuni. Nel caso il vostro hardware non sia u supportato, o vi necessiti un protocollo o una funzionalit` non previsti nel kernel corrente vi a occorrer` ricompilare il kernel12 . a Il procedimento per la ricompilazione del kernel ` arontato in sez. 5.1, per cui non ci e dilungheremo su questa procedura, ma solo sulle opzioni di compilazione che ci interessano. Le sezioni relative alla rete sono due, Networking options e Network device support, come si pu` vedere dalla schermata del men` di congurazione riportata in g. 7.4. o u Nelle prima delle due opzioni segnalate con un asterisco in g, 7.4 si possono attivare i protocolli di rete di alto livello (sopra il collegamento) necessari. Di solito per il TCP/IP tutto quello che serve ` attivato di default, ` necessario intervenire qui solo se si vuole supportare e e un altro protocollo (come IPX o Appletalk), o attivare alcune opzioni specialistiche (su cui eventualmente torneremo pi` avanti). u Nella seconda parte si attivano invece i driver per le varie schede ed i protocolli di basso livello. In genere anche in questo caso la congurazione di default per la maggior parte delle distribuzioni fornisce il supporto per le condizioni di uso pi` comune; se per` si ha una scheda u o di rete non supportata dal kernel di default pu` essere necessario accedere alla sottosezione o Ethernet (10 or 100Mbit)13 dove troverete le opzioni per una vasta scelta di schede. In tal caso la dicolt` maggiore sar` quella di selezionare il modulo che corrisponde alla a a vostra scheda, cosa che potrete fare ricorrendo ad una lettura dellEthernet HOWTO (disponi12 13

nel caso di kernel modulare pu` bastare la compilazione dei moduli necessari, si veda sez. 5.1.3 o a meno che non abbiate una gigabit o qualche scheda WAN, nel qual caso dovrete cercare nelle relative sezioni.

270

CAPITOLO 7. LAMMINISTRAZIONE DI BASE DELLE RETI

Linux Kernel v2.4.16 Configuration --------------------------------------------------------------------------+------------------------------- Main Menu -------------------------------+ | Arrow keys navigate the menu. <Enter> selects submenus --->. | | Highlighted letters are hotkeys. Pressing <Y> includes, <N> excludes, | | <M> modularizes features. Press <Esc><Esc> to exit, <?> for Help. | | Legend: [*] built-in [ ] excluded <M> module < > module capable | | +---------^(-)--------------------------------------------------------+ | | | Multi-device support (RAID and LVM) ---> | | | | * Networking options ---> | | | | Telephony Support ---> | | | | ATA/IDE/MFM/RLL support ---> | | | | SCSI support ---> | | | | Fusion MPT device support ---> | | | | IEEE 1394 (FireWire) support (EXPERIMENTAL) ---> | | | | I2O device support ---> | | | | * Network device support ---> | | | + Amateur Radio support ---> | | | +---------v(+)--------------------------------------------------------+ | +-------------------------------------------------------------------------+ | <Select> < Exit > < Help > | +-------------------------------------------------------------------------+
Figura 7.4: Schermata di congurazione per la compilazione del kernel; le opzioni di congurazione per il supporto di rete sono indicate con un asterisco

bile su http://en.tldp.org/HOWTO/Ethernet-HOWTO.html) che di solito si trova anche nella documentazione allegata con la vostra distribuzione, e nel quale ` riportata una lunga lista di e schede supportate. Se non avete idea di quale sia la scheda che avete sulla macchina, e vi secchi aprire il computer, potete sempre ricorrere al comando lspci14 , come illustrato in sez. 5.4.1; nellesempio riportato a pag. 222 potete vericare come la scheda di rete sia una Realtek 8139. In questo caso dovrete semplicemente attivare il relativo supporto nella sezione delle schede ethernet RealTek RTL-8139 PCI Fast Ethernet Adapter support nella sezione Ethernet (10 or 100Mbit). Nel caso abbiate optato per un supporto modulare dovrete inoltre congurare opportunamente il le /etc/modules.conf, che permette di associare un modulo ad una specica interfaccia, cos` da specicare in maniera univoca a quale interfaccia viene associata una certa scheda; in particolare una sezione del le tipo: alias eth0 3c59x alias eth1 eepro100 dice di usare la 3Com Vortex per la prima interfaccia e la Intel EtherExpress per seconda. Inoltre se lo ritenete opportuno potete far caricare i moduli relativi alle interfacce di rete allavvio della macchina, questo viene fatto indicando i rispettivi nomi nel le /etc/modules.

7.3.2

Il comando ifconfig

Il primo passo per poter utilizzare la rete ` quello di assegnare ad una interfaccia di rete il e suo numero IP. Il comando che vi consente di fare questo ` ifconfig, che permette anche di e
si suppone che abbiate una scheda PCI, per le schede ISA si pu` usare pnpdump, ma ` senzaltro meglio andare o e a comprarsi una scheda pi` recente u
14

7.3. LA CONFIGURAZIONE DI BASE

271

impostare le varie caratteristiche delle interfacce di rete. Tutto quello che serve nella maggior parte dei casi sono soltanto le opzioni che permettono di attivare e disattivare una interfaccia. Se usato senza opzioni e senza specicare una interfaccia il comando mostra lo stato di tutte le interfacce attive. Questo ` il primo passo da fare sempre prima di qualunque congurazione e per vedere lo stato del sistema (ed anche dopo per controllare che sia tutto a posto). Un risultato possibile ` il seguente: e
[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 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 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)

eth1

lo

Se si specica come argomento il nome di una interfaccia il comando mostra lo stato solo dellinterfaccia specicata, se invece si vuole lo stato di tutte le interfacce esistenti, comprese quelle non attive, occorre usare lopzione -a. Come si vede nellesempio sulla macchina sono presenti 3 interfacce di rete; due di esse (eth0 e eth1) corrispondono a due schede di rete ethernet, la terza (lo) ` una interfaccia logica, la e 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.
Valore UP NOARP RUNNING MULTICAST BROADCAST POINTOPOINT LOOPBACK Tipo indirizzo Linterfaccia ` attiva. e Non ` attivato il protocollo ARP per linterfaccia. e Linterfaccia sta funzionando. Sullinterfaccia ` attivato il multicast. e Linterfaccia ` in modalit` broadcast. e a Linterfaccia ` in modalit` punto-punto. e a Linterfaccia ` in modalit` loopback. e a

Tabella 7.7: Stati riportati nella terza riga del comando ifconfig e relativo signicato.

Si pu` notare come il comando riporti le varie caratteristiche delle singole interfacce: nella o

272

CAPITOLO 7. LAMMINISTRAZIONE DI BASE DELLE RETI

prima riga viene scritto il tipo di collegamento sico usato da ciascuna di esse, e se presente per quel tipo di interfaccia anche lindirizzo sico; 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 signicato ` riportato e in tab. 7.7, inne sulle righe seguenti vengono scritte una serie di altre informazioni statistiche relative al traco 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 aftype del comando ifconfig.

A parte il caso in cui si legge la congurazione generica il comando richiede sempre come primo argomento il nome dellinterfaccia su cui operare, ad esso pu` seguire un argomento opzioo nale aftype che serve a specicare i tipo di indirizzo che si vuole associare allinterfaccia. I valori possibili sono riportati in tab. 7.8, il valore di default, sottinteso quando non si specica nulla, ` inet, che indica il protocollo TCP/IP, dato che il caso pi` comune ` relativo allimpostazione e u e di indirizzi IP. Il risultato del comando riportato a pag. 271 ci mostra anche che linterfaccia eth0 ` come suol e dirsi multihomed ; essa cio` compare con due indirizzi diversi, identicati in due sezioni separate e introdotte dalle stringhe eth0 ed eth0:0, che presentano indirizzi diversi. Si noti comunque come le statistiche siano riportate solo per la prima istanza, in quanto esse non possono che essere uniche per ciascuna interfaccia. ` E sempre possibile assegnare pi` indirizzi ad una stessa interfaccia, purch si sia abilitato il u e relativo supporto nel kernel; lopzione ` indicata come IP aliasing, nella sezione Networking e options,15 e lassegnazione degli indirizzi ulteriori si pu` fare appunto specicando delle ino terfacce virtuali ulteriori nella forma eth0:X dove X ` un numero crescente a partire da e 0. Prima di poter congurare una interfaccia ` opportuno vericare che essa non sia gi` attiva, e a perch quando si assegna un indirizzo IP il valore precedente viene sovrascritto. Il comando e ifconfig iface (dove iface ` il nome della singola interfaccia che si vuole controllare, ad e esempio eth0) ci mostrer` lo stato dellinterfaccia, dando un errore nel caso il supporto nel a kernel non sia attivato. Qualora invece la si voglia disattivare si potr` usare un comando del a tipo:
[root@havnor root]# ifconfig eth0 down

utilizzando lopzione down, mentre per riattivarla si potr` utilizzare un comando del tipo: a
[root@havnor root]# ifconfig eth0 up

inne si pu` assegnarle un indirizzo ed attivarla in un colpo solo con il comando: o


[root@havnor root]# ifconfig eth0 192.168.1.100

in cui ` sottintesa lopzione up in quanto si d` per scontato che assegnare un IP allinterfaccia e a implichi la volont` di utilizzarla. a
15

nei kernel recenti ` attivata di default, e lopzione non compare pi`. e u

7.3. LA CONFIGURAZIONE DI BASE

273

Si ricordi che ad ogni indirizzo ` sempre associata una rete, nel caso specico per` essa e o sembra non comparire; questo ` dovuto al fatto che, se non viene specicato esplicitamente, il e comando appena visto assegna automaticamente allinterfaccia una netmask corrispondente alla classe cui lindirizzo appartiene secondo la suddivisione tradizionale di tab. 7.3 (nel caso sarebbe pari a 255.255.255.0, dato che lindirizzo ` di classe C). La rete su cui si allaccia linterfaccia e pu` anche essere specicata esplicitamente indicando la netmask con una opzione del tipo: o
[root@havnor root]# ifconfig eth0 192.168.1.100 netmask 255.255.0.0

Oltre ai due argomenti up e down appena illustrati, il comando ifconfig supporta molte altre direttive di congurazione. Le principali sono elencate in tab. 7.9, per le altre, che normalmente vengono lasciate al valore di default, si rimanda alla lettura della pagina di manuale, accessibile con man ifconfig.
Valore [-]arp media type Signicato attiva e disattiva (con -) luso del protocollo ARP per linterfaccia. Se non specicato il default ` arp. e seleziona il tipo di mezzo (in genere il cavo), tramite il parametro type (che pu` assumere ad esempio valori come 10base2, 10bao seT, ecc.); di solito viene impostato automaticamente usando il default che ` auto. e abilita il multicast sullinterfaccia, normalmente ` selezionato e automaticamente quando si attiva linterfaccia. attiva e disattiva (con -) il modo promiscuo (in cui tutti i pacchetti vengono ricevuti) per linterfaccia. imposta la maschera di rete per lindirizzo.

multicast [-]promisc netmask addr

Tabella 7.9: Possibili opzioni del comando ifconfig.

7.3.3

Il comando route

Avere attivato linterfaccia ed averle assegnato un numero di IP ` solo il primo passo, perch sia e e possibile utilizzare la rete occorre anche impostare linstradamento; per questo si usa il comando route, che si chiama cos` proprio perch serve a specicare la strada che i pacchetti possono e prendere per arrivare a destinazione. Il comando permette di manipolare la tabella di instradamento del protocollo IP: questa ` una tabella usata e mantenuta dal kernel per decidere come smistare i pacchetti in uscita e e in transito. In sostanza la tabella contiene le associazioni fra le possibili destinazioni di un pacchetto e linterfaccia che deve essere usata perch questo possa raggiungerle. e Il comando prende come argomenti delle direttive che ne specicano le operazioni; le direttive fondamentali sono sono due: add, che permette di aggiungere una voce alla tabella, e del che ne permette la cancellazione. Se non si specica nessuna direttiva il comando viene usato per mostrare lo stato corrente della tabella, e le opzioni sono quelle riportate in tab. 7.10. Il concetto fondamentale del routing ` che ciascun nodo sulla rete deve sapere a quale nodo e 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` quando si ha a che fare con una rete locale le cose sono molto pi` semplici, e, tornando a u allanalogia telefonica, tutto quello che dovete fare ` specicare qual` il numero del centralino e e e quali sono i numeri diretti. Supponiamo di avere la rete schematizzata in g. 7.5, che prenderemo come riferimento per i nostri esempi, e vediamo come deve essere congurata la tabella di instradamento per le varie macchine di cui la rete ` composta. In questo caso si vede che un ruolo particolare ` rivestito e e dalla macchina havnor, che ` posta a cavallo fra due reti diverse; nel nostro esempio questa dovr` e a

274
Opzione -C -e -F -n -A

CAPITOLO 7. LAMMINISTRAZIONE DI BASE DELLE RETI


Descrizione opera sulla cache di instradamento del kernel. usa il formato di netstat (vedi sez. 7.4.3), ripetuto due volte stampa pi` informazioni. u opera direttamente sulla tabella di routing (il default). non eettua la risoluzione degli indirizzi. usa gli indirizzi della famiglia passata come parametro (il default ` inet per gli indirizzi IP, prende gli stessi valori e usati da ifconfig riportati in tab. 7.8). esegue le operazioni in maniera prolissa.

-v

Tabella 7.10: Opzioni a riga di comando per luso di route.

Figura 7.5: Schema di una rete di prova.

fare da ponte16 fra le due reti, passando i pacchetti da una interfaccia ad unaltra; perch questo e funzioni per` deve essere stato abilitato il cosiddetto IP forwarding, che di default ` disabilitato; o e questo si pu` fare attraverso linterfaccia del sysctl, o usando direttamente i le con cui questa o viene rappresentata nel lesystem /proc; per cui abilitare lIP forwarding baster` eseguire il a comando:
[root@havnor root]# echo 1 > /proc/sys/net/ipv4/ip_forward

Vediamo allora come congurare le rotte della rete in g. 7.5 usando route. Il primo passo ` sempre quello di controllare la situazione corrente. Quando ` invocato senza parametri il e e comando vi mostra il contenuto corrente della tabella di instradamento. Ad esempio, nel caso illustrato in g. 7.5, andando su havnor avremo:
tecnicamente si parla di un bridge quando si ha a che fare con un apparato che fa da ponte fra due sottoreti siche passando i pacchetti dalluna allaltra a livello di datalink, in maniera completamente trasparente ai livelli superiori. Linux pu` essere utilizzato anche in questo modo, abilitando lopportuno supporto nel kernel, qui per` o o stiamo parlando semplicemente del passaggio di un pacchetto da una interfaccia ad un altro a livello di rete, che invece ` il lavoro svolto dai router. e
16

7.3. LA CONFIGURAZIONE DI BASE

275

[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

e si ` usata lopzione -n per avere un output con i valori numerici per gli indirizzi. e 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` cambiate), in contrapposizione alle u rotte dinamiche che vengono impostate dai demoni di routing,17 che modicano continuamente le rotte presenti nella tabella di instradamento per tenere conto delle condizioni della rete. Se non specicato altrimenti il comando tenta anche di risolvere (vedi sez. 7.6) i nomi delle macchine e delle reti. Loutput usa la formattazione appena mostrata in cui la prima colonna identica 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 signicato delle altre colonne ` associato e agli aspetti pi` sosticati del routing, gestiti di norma dai demoni di routing; uno specchietto u delle informazioni mostrate dal comando ` in tab. 7.11, maggiori dettagli sono nella pagina di e manuale.
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 ag 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 veriche 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. ag che indica se il lindirizzo hardware per la rotta in cache ` aggiornato. e

Tabella 7.11: Nomi della colonna e relativo signicati per le varie informazioni riportate nelluscita del comando route.

Nellesempio mostrato si pu` notare come ci siano tre diverse destinazioni associate a tre o diverse sottoreti, di cui due fanno capo alla stessa interfaccia (quella che in sez. 7.3.2 abbiamo visto essere multihomed). Per tutte queste sottoreti, essendo esse accessibili direttamente da una interfaccia locale, non esiste un gateway (` come per le telefonate allinterno dellucio, e non c` bisogno di usare il centralino) e questo ` indicato dalluso dellindirizzo generico in e e
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 informazione ottenute.
17

276

CAPITOLO 7. LAMMINISTRAZIONE DI BASE DELLE RETI

seconda colonna. Lultima riga indica invece quello che ` il default gateway, cio` lindirizzo cui e e devono essere inviati i pacchetti che non hanno una strada specicata altrimenti; in tal caso la destinazione ` indicata dallindirizzo nullo (che fa le veci della wildcard). e In realt` se avete una sola interfaccia, e non uscite dalla rete locale, non c` bisogno di a e chiamare esplicitamente route; infatti tutte le volte che tirate su una interfaccia la rotta per la rete a cui lindirizzo ` associato viene inserita automaticamente. Il problema si pone quando la e struttura della rete ` pi` complicata, e la rete ` divisa in diverse parti. e u e
Simbolo U H G R D M A C ! Signicato la rotta ` attiva. e la destinazione ` un nodo. e usa un gateway. rotta reintegrata da un instradamento dinamico. installata dinamicamente da un demone o una redirezione. modicata da un demone o una redirezione. installata da addrconf. voce nella cache. rotta bloccata (impedisce linstradamento per la destinazione specicata).

Tabella 7.12: Signicato dei simboli utilizzati nella colonna Status del comando route.

Nel caso di un computer con una sola interfaccia di rete inserito in una LAN singola, una volta assegnato lindirizzo con ifconfig tutto quello che resta da fare ` specicare qual` il e e default gateway, cio` lindirizzo della macchina (di solito un router) che si usa per uscire in e internet; questo si fa ad esempio con il comando:
[root@havnor root]# route add default gw 192.168.0.1

che ovviamente deve essere dato da root, in quanto cambiare i contenuti della tabella di instradamento ` una operazione privilegiata. Il comando ` mostrato per havnor, ma dovr` essere e e a ripetuto per tutte le macchine mostrate in g. 7.5. Per le macchine sulla rete 192.168.168.0 c` per` il problema che esse non possono vedere e o direttamente il router, che ` posto su una LAN diversa; lo stesso vale per le macchine di quella e LAN, che non possono accedere direttamente al tratto di rete delle precedenti. 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 tramite fra i due tratti separati. In tutti i casi in laccesso ad una rete ` condizionato al passaggio da una macchina specica e che fa da collegamento, si deve specicare esplicitamente 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.160.0 di usare come gateway la macchina 192.168.0.234. Allo stesso modo perch oppish possa accedere ad hogen (e ad internet e attraverso il router roke) si dovr` impostare una rotta statica con: a
[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 routing in ordine di dimensione della rete di destinazione a partire da quella pi` specica per arrivare alla pi` generica (di norma quella associata u u al default gateway che ha per destinazione tutta internet), ed invia un pacchetto in uscita sulla

7.3. LA CONFIGURAZIONE DI BASE

277

prima rotta che comprende nella sua destinazione lindirizzo cui esso ` destinato. Cos` nella rete e di esempio un pacchetto destinato ad oppish verr` instradato (correttamente) su havnor e non a su roke, perch la rotta per la rete 192.168.2.0 ` pi` specica di default. e e u 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 prende sempre due opzioni: -net per indicare una voce riferita ad una rete e -host per una stazione singola, e deve essere seguito dallindirizzo (di rete o di nodo) della destinazione (sia in forma numerica che simbolica). Si deve inoltre, nel caso si sia indicata una rete, specicare anche la relativa netmask con la direttiva netmask ed eventualmente linterfaccia da utilizzare con la direttiva dev; le altre principali direttive utilizzabili sono riportate in tab. 7.13, queste in genere sono opzionali o inutilizzate per le rotte statiche e di norma vengono automaticamente impostate agli opportuni default relativa allinterfaccia cui la rotta fa riferimento. Le opzioni base (-net e -host) valgono anche per il comando del, la dierenza fra ` che e mentre con add devono essere specicate interamente le caratteristiche della rotta, in questo caso basta identicare univocamente la voce che si vuole cancellare perch il comando abbia eetto. e
Direttiva netmask gw reject metric mss window irtt mod,dyn,reinstate dev Parametro Nm Gw M M W I If Descrizione imposta la maschera per rete imposta lindirizzo del gateway installa una rotta bloccata imposta il valore del campo Metric imposta la Maximum Segment Size del TCP per la rotta imposta la dimensione della advertizing window del TCP per la rotta imposta il Round Trip Time iniziale per la rotta ag diagnostici usati dai demoni di routing imposta linterfaccia usata per raggiungere la destinazione

Tabella 7.13: Direttive del comando route.

7.3.4

La congurazione automatica.

La congurazione della rete allavvio viene fatta da degli opportuni script di inizializzazione, la cui locazione dipende dalla distribuzione; in tab. 7.14 si sono riportati quelli delle principali distribuzioni. In genere, per le distribuzioni che supportano i run level in stile System V (tutte tranne Slackware), per far partire o fermare la rete ` suciente lanciare uno di questi script e rispettivamente con il parametro start o stop. Gli script usano al loro interno i comandi visti in sez. 7.3, per impostare gli indirizzi IP sulle interfacce ed il default gateway (o eventuali rotte statiche).
Distribuzione Debian Slackware RedHat Suse IP e routing /etc/init.d/networking /etc/rc.d/rc.inet1 /etc/rc.d/init.d/network /etc/rc.d/network Servizi /etc/rc2.d/... /etc/rc.d/rc.inet2 /etc/rc.d/rc3.d/... /etc/rc.d/rc3.d/...

Tabella 7.14: Gli script di inizializzazione della rete per varie distribuzioni.

Di solito la congurazione dei dati permanenti della rete viene eettuata una volta per tutte in fase di installazione, dove una opportuna applicazione vi richieder` tutte le informazioni a necessarie che verranno memorizzate negli opportuni le di congurazione (vedi sez. 7.3.5). Di solito i casi pi` comuni che si presentano sono due: u

278

CAPITOLO 7. LAMMINISTRAZIONE DI BASE DELLE RETI

Il computer di casa, che si collega ad internet attraverso un provider (connessione via modem analogico, ISDN, ADSL). Un computer connesso in rete locale (con una scheda di rete). Nel primo caso vi verranno chiesti i dati necessari alla connessione, che vi devono essere forniti dal provider (ad esempio nel caso del modem numero telefonico, username e password del vostro account, modalit` di autenticazione) ed eventualmente quelli relativi al vostro modem a (anche se ormai tutte le distribuzioni sono in grado di eseguire il riconoscimento automatico), dopo di che sar` il programma di connessione che si preoccuper` di eseguire le relative operazioni a a per attivare la connessione. In questo caso non dovete preoccuparvi dellimpostazione dellindirizzo IP in quanto ci penser` il programma di connessione (che in genere ` una qualche forma di front-end per pppd, che a e tratteremo in sez. 7.7.1) a utilizzare opportunamente le informazioni che gli vengono fornite dal provider per eseguire le congurazioni opportune. Al pi` ci potr` essere da congurare a mano, u a per quei pochi provider che non forniscono linformazione, gli indirizzi dei DNS (torneremo su questo in sez. 7.6.5). Nel secondo caso invece ` molto probabile che dobbiate eseguire voi limpostazione dellIP e chiedendo allamministratore di fornirvi una serie di informazioni. In particolare vi occorrer` il a numero IP da assegnare alla vostra macchina, la netmask, e lindirizzo del gateway (oltre alla informazione sul DNS da usare). Se invece nella rete ` disponibile un server DHCP lindirizzo e non dovr` essere specicato a mano, ma potr` impostato automaticamente grazie ad esso. Tutti a a i programmi di congurazione prevedono questa possibilit`, nel qual caso non dovrete fornire a nessuna informazione specica, se non quella di usare DHCP. Questo ` un passo necessario anche se volete creare la vostra rete interna, in questo caso e lamministratore di rete siete voi, e i numeri li dovete decidere da soli; vi consiglio caldamente di usare le varie classi riservate per le reti locali di tab. 7.6, che la IANA ha destinato appositamente a questo uso, e che non vengono mai usati per macchine pubbliche su Internet.18 Quasi tutte le distribuzioni hanno dei programmi per congurare la rete locale,19 che permettono di impostare questi valori in maniera semplice, in genere attraverso una interfaccia a nestre e campi (che pu` essere graca o testuale). I comandi pi` comuni sono riportati in o u tab. 7.15, ed in genere si tratta di soltanto di specicare i valori richiesti.
Distribuzione Debian RedHat Slackware Comando dpkg-reconfigure etherconf netcfg, netconfig netconfig

Tabella 7.15: Comandi di congurazione della rete.

7.3.5

I le di congurazione delle interfacce statiche.

Come accennato tutte le distribuzioni attivano la rete tramite gli opportuni script di avvio; uno specchietto degli script usati ` riportato nella seconda colonna di tab. 7.14. In genere questi script e non fanno altro che andare a leggere degli opportuni le di testo che contengono le informazioni necessarie (quante interfacce ci sono, quali IP devono essere assegnati, qual` il default gateway, e ecc.) ed eseguono poi i comandi necessari ad attivare le interfacce ed impostare le rotte statiche.
se con le vostre macchine non accedete mai ad internet potreste anche pensare di usare altri indirizzi; questo purtroppo ` un errore sciocco, che va interamente a vostro scapito. Una volta infatti che uno di questi computer e dovesse accedere ad internet, ad esempio attraverso un modem, i siti su internet che hanno i numeri che voi avete assegnato alle vostre macchine interne non sarebbero pi` raggiungibili. u 19 nel caso di Debian non c` un programma specico, ma si pu` usare il pacchetto etherconf, che usa il sistema e o standard di debconf per eettuare la ricongurazione.
18

7.3. LA CONFIGURAZIONE DI BASE

279

Luso manuale dei singoli comandi per impostare la rete lo abbiamo gi` discusso nelle sezioni a precedenti, ma se si modica la congurazione a mano, al successivo riavvio tutti i cambiamenti saranno perduti, per cui se vogliamo eettuare una impostazione permanente dobbiamo andare a modicare i le in cui sono memorizzate le informazioni usate dagli script di avvio della rete. Anche questi le variano da distribuzione a distribuzione, cos` come pu` essere diverso il loro o formato; prenderemo in esame due dei casi pi` comuni, Debian e RedHat (Mandrake usa gli u stessi le di RedHat). In genere i programmi di congurazione automatica (o i vari programmi graci per la congurazione) non fanno altro che leggere e modicare i valori che stanno su questi le; farlo a mano pu` servire quando non avete la graca a disposizione; essendo le di o testo basta usare un editor qualunque. Debian Il le di congurazione delle interfacce20 ` /etc/network/interfaces, il cui formae to ` descritto in dettaglio dalla omonima pagina di manuale. Per luso normale ` e e suciente specicare i dati con un contenuto del tipo: auto lo eth0 iface lo inet loopback iface eth0 inet static address 194.177.127.234 netmask 255.255.255.0 gateway 194.177.127.1 la prima riga, introdotta dalla parola chiave auto, dice quali sono le interfacce attivare automaticamente allavvio del sistema, che possono essere specicate 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 specicarne il nome, la famiglia di protocolli usata,21 e le modalit` della a stessa; queste sono sostanzialmente tre: loopback si usa per linterfaccia di loopback. dhcp static si richiedono i dati di congurazione ad un server DHCP. si assegnano i valori secondo i parametri specicati nelle righe seguenti.

per i primi due non occorre altro, ma se si specica static si devono impostare i relativi parametri nelle righe seguenti, che di solito si indentano, per maggiore chiarezza, come nellesempio. Quando si usa la parola chiave iface le righe successive, indentate per chiarezza, specicano le ulteriori opzioni, nel caso in esempio si sono indicati lindirizzo, la netmask e lindirizzo del gateway. Questultimo deve essere specicato una volta sola, nel caso compaiano pi` interfacce. Possono inoltre essere specicati dei comandi da u chiamare contestualmente allattivazione e alla disattivazione dellinterfaccia, usando le parole chiave up, pre-up, down, post-down seguite dal comando, che verr` eseguito a rispettivamente dopo e prima dellattivazione e prima e dopo la disattivazione. Inne ` possibile usare la parola chiave mapping per eettuare una mappatura fra e interfacce logiche e siche,
in realt` si tratta del le di congurazione usato dai comandi ifup e ifdown che sono quelli usati da Debian a per gestire attivazione e disattivazione delle interfacce. 21 inet indica lusuale TCP/IP, ma sono possibili anche ipx per IPX, e inet6 per IPv6.
20

280

CAPITOLO 7. LAMMINISTRAZIONE DI BASE DELLE RETI Si tenga presente che in generale le interfacce temporanee relative alluso di PPP non vengono mai menzionate in questo le, ma vengono congurate a parte dagli script di avvio della connessione.

RedHat i le di congurazione delle interfacce sono dentro /etc/sysconfig/networking/devices, e ce n` uno per interfaccia con un nome del tipo ifcfg-iface, dove iface ` il nome e e dellinterfaccia da congurare, ciascuno di questi contiene poi i relativi parametri; cos` ad esempio avremo un le ifcfg-eth0 relativo alla prima interfaccia ethernet, il cui contenuto sar`: a DEVICE=eth0 BOOTPROTO=dhcp IPADDR= NETMASK=255.255.255.0 GATEWAY=192.168.0.254 BROADCAST=192.168.0.255 NETWORK=192.168.0.0 USERCTL=no ONBOOT=yes Il contenuto di ciascun le ` sempre nella forma di assegnazione di un valore ad una e variabile22 il cui signicato ` espresso in maniera evidente dal relativo nome per gran e parte di esse. Si noti che nel caso si ` scelto, usando BOOTPROTO=dhcp di assegnare e lIP attraverso un server DHCP, ed IPADRR non viene denita, se invece si fosse voluto assegnare un IP sso si sarebbe dovuto utilizzare il valore BOOTPROTO=static ed impostare il relativo numero IP denendo IPADRR.

7.4

I comandi diagnostici

Una volta eseguita la congurazione di base il primo passo ` in genere controllare il funzionae mento del tutto, cosa che pu` essere fatta utilizzando un qualunque client (il modo pi` comune o u ` lanciare un browser). In caso di malfunzionamento, o comunque per eseguire una serie di e controlli, sono comunque disponibili una serie di comandi ad uso diagnostico da utilizzare per stabilire il buon funzionamento della rete.

7.4.1

Il comando ping

Una volta congurate le interfacce il primo controllo da eettuare per vedere se la rete funziona ` pingare23 unaltra macchina. Nella nostra analogia telefonica questo equivale a telefonare e per sentire se d` il libero. a 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` di ricevere, mostrando anche il tempo intercorso fra linvio e a la risposta. Il comando si invoca passando come argomento lIP della macchina bersaglio, si pu` usare o anche il nome, ma in tal caso oltre al collegamento verso la macchina bersaglio deve funzionare
in eetti si tratta proprio di questo, il le viene letto dallo script di avvio che usa queste variabili di shell per eettuare la congurazione. 23 il nome e la terminologia derivano dallanalogia con gli impulsi usati dai sonar.
22

7.4. I COMANDI DIAGNOSTICI

281

quello con il DNS,24 perch se per qualche motivo non riusciste a risolvere il nome non otterreste e nulla anche se il resto della rete fosse a posto. Un esempio di uso del comando ` il seguente: e
[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 --- 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, e nel caso riceve sempre risposta riportando il tempo che ci ` voluto. Quando lo fermate (con C-c) vi stampa anche una statistica riassuntiva. e Questo ci dice che la macchina con IP 192.168.168.10 ` attiva ed ` raggiungibile. Il comando e e prende una serie di opzioni; le principali, insieme al loro signicato, sono riportate in tab. 7.16, per le altre si pu` fare riferimento alla pagina di manuale. o
Opzione -c count -f Signicato Invia solo count pacchetti e poi esce stampando la statistica senza bisogno di interruzione esplicita. Invia i pacchetti alla velocit` con cui tornano indietro, o 100 al secondo, a stampando un . per ogni pacchetto inviato ed un backspace per ogni pacchetto ricevuto, cos` da visualizzare le perdite. Solo root pu` usare o questa opzione che carica pesantemente la rete. Aspetta wait secondi invece di uno fra linvio di un pacchetto ed il successivo. non eettua la risoluzioni di nomi e indirizzi. si possono specicare no a 16 byte con cui riempire il contenuto del pacchetto. Il valore pattern deve essere specicato come numero esadecimale. Si usa questa opzione per diagnosticare eventuali problemi di corruzione dei dati. sopprime tutte le stampe eccetto le statistiche nali. Invia pacchetti di dimensione size invece dei 56 byte di default. Tabella 7.16: Opzioni del comando ping.

-i wait -n -p pattern

-q -s size

Si tenga presente che quello che si pu` eettuare con ping ` solo un controllo preliminare; o e se non ricevete risposta il motivo pu` dipendere da molti fattori, da un errore di congurazione o ad aver usato un indirizzo sbagliato, incluso il fatto che la macchina che volete controllare pu` o essere spenta, o che qualche router nel mezzo non funziona. Se per` va tutto bene potete se non o altro concludere che la rete ` attiva e funzionante ed evitare di mettervi a controllare se avete e attaccato il cavo.

7.4.2

Il comando traceroute

Un secondo comando che permette di controllare il funzionamento di un collegamento ` traceroute, e che, come dice il nome, serve a tracciare la strada che fanno i pacchetti per arrivare alla destinazione indicata. 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
in realt` si pu` usare anche il nome pure in assenza di DNS, ma esso deve essere scritto in /etc/hosts (vedi a o sez. 7.6.2).
24

282

CAPITOLO 7. LAMMINISTRAZIONE DI BASE DELLE RETI

si annulla il protocollo richiede25 che il router scarti il pacchetto ed invii un messaggio ICMP (di tipo time exceeded ) al mittente. Il comando 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. In questo modo si pu` avere tracciata tutta la strada fatta da un pacchetto. Un esempio del o funzionamento del comando ` il seguente: e
piccardi@oppish:~/temp/video/riserva$ traceroute www.linux.it traceroute to picard.linux.it (62.177.1.107), 30 hops max, 38 byte packets 1 10.16.34.54 (10.16.34.54) 404.842 ms 228.168 ms 217.859 ms 2 213.234.139.162 (213.234.139.162) 295.735 ms 271.781 ms 120.006 ms 3 interbusiness-mix.mix-it.net (217.29.66.35) 417.619 ms 62.880 ms 296.789 ms 4 151.99.98.225 (151.99.98.225) 209.817 ms 275.854 ms 125.990 ms 5 151.99.75.219 (151.99.75.219) 157.818 ms 363.377 ms 64.956 ms 6 80.17.211.190 (80.17.211.190) 477.793 ms 190.838 ms 191.940 ms 7 r-ge10-vl2.opb.interbusiness.it (195.31.96.227) 365.857 ms 222.774 ms 310.838 ms 8 62.86.83.194 (62.86.83.194) 70.828 ms 156.906 ms 67.908 ms 9 sircore1-ext.publinet.it (62.177.0.1) 67.880 ms 561.587 ms 694.767 ms 10 picard.linux.it (62.177.1.107) 293.828 ms 464.118 ms 217.977 ms

Cos` se per un qualche motivo non riuscite a raggiungere il vostro indirizzo di destinazione potete vericare se questo ` dovuto al fatto che la strada che prendono i vostri pacchetti ` e e interrotta da qualche parte,26 visualizzando dove si fermano sulla strada verso la destinazione.
Opzione -l -f first -i iface -n -I -s source -m -w time Signicato stampa anche il TTL dei pacchetti ricevuti come risposta, utile per vericare la presenza di un routing asimmetrico. Imposta il valore del TTL del primo pacchetto. Invia i pacchetti con lindirizzo dellinterfaccia iface; ha senso solo quando ci sono pi` indirizzi sulla stessa macchina. u non eettua la risoluzioni di nomi e indirizzi. invia pacchetti ICMP invece che UDP. usa lindirizzo source come indirizzo sorgente dei pacchetti inviati. imposta il valore massimo del TTL usato (il default ` di 30 hop). e Imposta il numero di secondi time da attendere per ricevere una risposta. Tabella 7.17: Opzioni del comando traceroute.

Il comando traceroute prende come argomento lindirizzo (numerico o simbolico) di cui si vuole tracciare la rotta, ed opzionalmente una dimensioni dei pacchetti da usare. Il comando supporta anche numerose opzioni, che permettono di impostare varie caratteristiche dei pacchetti inviati, al solito si sono riportate le principali in tab. 7.17; per le restanti si faccia riferimento alla pagina di manuale. Del comando esiste una versione pi` moderna, che presenta anche una interfaccia graca, u mtr, che mostra dinamicamente lo stato della strada percorsa dai pacchetti, insieme con una serie di statistiche relative al loro inoltro, unicando le funzionalit` dei due comandi traceroute e a ping. La caratteristica di mtr ` inoltre quella di utilizzare vari tipi di protocolli per i pacchetti di e prova, mentre traceroute usa pacchetti UDP, cos` spesso mtr riesce a funzionare anche quando traceroute fallisce poich i pacchetti di prova vengono bloccati dai rewall. e
25 questo viene fatto per evitare che i pacchetti persi nei routing loop continuino a circolare sulla rete, con spreco di banda. 26 sempre che qualche amministratore di rete troppo zelante ed un po ignorante non si sia messo a ltrare anche i pacchetti di controllo usati dal protocollo.

7.4. I COMANDI DIAGNOSTICI

283

7.4.3

Il comando netstat

Un altro comando diagnostico molto utile che permette di visualizzare una grande quantit` di a informazioni relative alla rete, ` netstat. Il comando ` piuttosto complesso dato che permette di e e ottenere informazioni riguardo a tutte le funzionalit` del sistema concernenti la rete rete, anche a se lo scopo per cui viene usato per lo pi` ` quello di visualizzare tutte le connessioni attive sulla ue macchina (un po come potrebbe fare il quadro di un centralino che mostra tutti i collegamenti in corso). Il comando prevede che la prima opzione indichi il tipo di informazione da mostrare, lelenco di quelle disponibili ` riportato in tab. 7.18, ma se non se ne indica nessuna viene assunto il e comportamento di default che ` quello di mostrare la lista di tutti i socket aperti nel sistema. e
Opzione -r -g -i -M -s Signicato mostra le informazioni relative alle tabelle di intradamento (equivalente alluso di route senza argomenti). mostra le informazioni relative ai gruppi di multicast di cui si fa parte.27 mostra le informazioni relative alle interfacce di rete (equivalente alluso di ifconfig senza argomenti). mostra le informazioni relative alle connessioni mascherate dal rewall (funziona solo con i kernel della serie 2.2.x). mostra delle statistiche sommarie sulluso dei vari protocolli di rete.

Tabella 7.18: 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; anche i socket locali, che sono usati da vari programmi come meccanismo di intercomunicazione, che non hanno nulla a che fare con la rete. Per questo motivo ` duopo e specicare 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 ` allora il seguente: e
[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 esistono anche tutti i socket per i quali non ci sono connessioni, ma che sono in ascolto di connessione, questi si possono vedere solo se si usa lopzione -a, per cui il risultato precedente diventa:
[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
27

State LISTEN LISTEN LISTEN LISTEN LISTEN LISTEN LISTEN LISTEN LISTEN LISTEN ESTABLISHED

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` reinviarle i pacchetti di a multicast ricevuti per esso.

284

CAPITOLO 7. LAMMINISTRAZIONE DI BASE DELLE RETI

Inne usando lopzione -n i risultati verranno stampati con tutti gli indirizzi ed i numeri delle porte espressi in forma numerica, senza che ne sia eettuata la risoluzione (vedi sez. 7.6). Le altre principali opzioni di controllo non rientranti in quelle gi` illustrate in tab. 7.18 sono a riportate in tab. 7.19.
Opzione -t -u -n -c -e -l -a Signicato 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` essere ripetuto due volte per avere o ancora pi` informazioni. u 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.19: Opzioni principali del comando netstat.

Il comando riporta una tabella con le indicazioni relative a ciascuna connessione. 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 signicato dei vari campi va di nuovo al di l` delle a possibilit` di questo corso (specie per il campo State), e richiede una trattazione approfondita a del protocollo TCP/IP.28 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, nel caso ce ne sono vari corrispondenti a servizi come la posta, le news, il DNS, la stampa via rete, gli indirizzi sono di norma non specicati in quanto la connessione pu` essere eettuata su uno qualunque degli indirizzi locali, da un qualunque indirizzo o esterno. Lo stato ESTABLISHED indica le connessioni stabilite ed attive, e riporta nei campi degli indirizzi i due capi della connessione. Altri stati che possono essere riportati sono FIN_WAIT, TIME_WAIT, e si riferiscono a connessioni che si stanno chiudendo.

7.4.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 sico presente sulla rete locale (quello che per gran parte delle reti ` il cosiddetto MAC e address) al corrispondente indirizzo IP, cosicch il kernel possa sapere a quale scheda (ethernet e nel caso pi` comune) mandare i pacchetti. u In realt` il protocollo viene utilizzato tutte le volte che il kernel deve inviare un pacchetto a IP verso lesterno su una rete di tipo ethernet (o con funzionalit` equivalenti, come il token ring a o lFDDI). Le possibilit` sono sempre due, o si deve comunicare con un indirizzo IP nella stessa a sottorete, nel qual caso si invier` il pacchetto direttamente al destinatario tramite lindirizzo a sico della sua scheda di rete, o si deve inviare il pacchetto altrove passando attraverso un gateway, nel qual caso dalla tabella di routing si avr` lindirizzo IP di questultimo che sar` a a usato per ricavare il MAC address della scheda cui inviare il pacchetto. Il protocollo viene usato per mandare delle richieste in broadcast, cio` richieste che vengono e 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 ` lindirizzo IP che si vuole risolvere, ed Y.Y.Y.Y ` quello e e
28

una trattazione completa ` in [4], una sintesi si pu` trovare nelle appendici di [1]. e o

7.4. I COMANDI DIAGNOSTICI

285

del richiedente. Questultimo viene automaticamente identicato dato che il suo MAC address ` riportato come indirizzo sorgente nel pacchetto di richiesta, cos` che la macchina la cui ine terfaccia ha lIP X.X.X.X pu` rispondere direttamente con un messaggio del tipo X.X.X.X ` o e NN:NN:NN:NN:NN:NN trasmettendo il suo MAC address direttamente al richiedente. In questo modo una macchina pu` interrogare le sue vicine sulla stessa LAN e costruire un o 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 certi casi pu` essere utile esaminare e modicare la ARP cache. Ad esempio una tecnica o comune ` quella del proxy ARP, usata quando si divide in due una rete che prima era unica, e introducendo un router a separarle i due rami. Dato che il router non trasmette i pacchetti a livello di collegamento sico si fa s` che alle richieste ARP per gli IP della nuova rete posti al di l` del router venga comunque risposto fornendo lindirizzo della scheda del router, che a cos` li ricever` anche senza aver impostato su tutte le macchine una opportuna rotta statica. a Ovviamente questa ` una soluzione provvisoria, che come tutte le soluzioni provvisorie ha la e brutta abitudine di diventare spesso denitiva.
Opzione -a host -f file -n -s host val -d host Signicato mostra le voci relative al nodo host, se non specicato mostra tutte le voci. legge i valori da immettere nella cache dal le file. non eettua la risoluzioni di nomi e indirizzi. inserisce una voce nella cache, associando al nodo host lindirizzo val. cancella la voce relativa al nodo host. Tabella 7.20: Opzioni del comando arp.

Il comando che permette di esaminare e modicare la ARP cache del kernel ` arp, se chiamato e senza opzioni il comando mostra il contenuto della cache, ad esempio se eseguiamo il comando da gont avremo:
[root@gont corso]# arp Address oppish.earthsea.ea havnor.earthsea.ea HWtype ether ether HWaddress 00:48:54:3A:9A:20 00:48:54:6A:4E:FB Flags Mask C C Iface eth0 eth0

Le due operazioni fondamentali sono la cancellazione (con lopzione -d) e linserimento (con lopzione -s) di una voce nella cache, ad esempio possiamo cancellare la voce relativa ad oppish con il comando: arp -d oppish mentre si pu` inserire una voce in pi` con il comando: o u arp -s lorbaner 00:48:54:AA:9A:20 le altre opzioni principali sono riportate in tab. 7.20, e per una spiegazione completa si pu` fare o ricorso alla pagina di manuale con man arp. Come per la risoluzione dei nomi (vedi ad esempio sez. 7.6.6) ` possibile anche specicare un e certo numero di corrispondenze manualmente usando un opportuno le di congurazione, che nel caso ` /etc/ethers. Questo contiene delle corrispondenze nella forma: e MAC-address numero-IP anche se al posto del numero IP si pu` anche specicare un nome, posto che questo sia risolvibile. o Il formato dei MAC address ` quello solito di sei byte esadecimali separati da ":", il contenuto e tipico di /etc/ethers sar` cio` qualcosa del tipo: a e 08:00:20:00:61:CA 129.168.1.245

286

CAPITOLO 7. LAMMINISTRAZIONE DI BASE DELLE RETI

7.5

I client dei servizi di base

Una volta che se ne sia completata la congurazione e vericato il funzionamento, lutilizzo della rete avviene attraverso luso dei servizi che su di essa vengono forniti. In generale i servizi di base sono forniti tutti secondo unarchitettura client-server; aronteremo pi` avanti la congurazione u dei server (la maggior parte dei server corrispondenti ai client qui descritti viene fornita attraverso uno dei superdemoni descritti in sez. 8.1), qui ci limiteremo a descrivere il funzionamento dei programmi client usati per usufruire del servizio.

7.5.1

Il comando telnet

Uno dei servizi di base un tempo pi` utilizzato sulla rete ` quello del telnet, nato per eseguire delle u e 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 ` assolutamente e da evitare, ed oggi ` essenzialmente sostituito dal comando ssh che vedremo in sez. 8.3.2. e In ogni caso il comando telnet continua ad esistere, e pu` essere usato su una rete locale o sicura o quando non esiste una versione di SSH per la macchina in questione (ad esempio se si ha a che fare con un vecchio VAX). Un suo uso pi` interessante per` ` quello diagnostico, per u oe vericare la funzionalit` dei servizi. a Il comando prende come argomento la macchina cui collegarsi ed opzionalmente la porta (specicata per numero o per nome del servizio); non specicando nessuna porta il comando si collega sulla porta 23, che corrisponde al servizio standard telnet, mostrando (qualora si attivo il relativo server) una schermata di login. Il comando supporta varie opzioni, per lo pi` relative alle modalit` di gestione della sessione di u a terminale remota, dato che questo uso ` assolutamente sconsigliabile non le riportiamo neanche, e i pi` curiosi possono consultare la pagina di manuale accessibile con man telnet. Di norma si u 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 ` usato per connettersi alla porta 25 della propria macchina, per vericare che e il relativo servizio SMTP (cio` il server per la ricezione e la trasmissione della porta) sia attivo: e si noti che si ` poi anche ottenuta la risposta del server che nal caso in questione ` Postx ). e e Con la stessa sintassi si pu` usare il comando per vericare la presenza e lattivit` dei servizi o a sulle relative porte. Anche se non si riceve nessuna risposta (ad esempio perch il servizio e interrogato necessita di una richiesta prima di rispondere), la presenza della riga Connected indicher` che la connessione ` riuscita ed ` attiva. a e e Se invece tentiamo di collegarci ad un servizio su cui non ` attivo nessun server otterremo e qualcosa del tipo:
piccardi@oppish:~$ telnet localhost 80 Trying 127.0.0.1... telnet: Unable to connect to remote host: Connection refused

7.5.2

Il comando ftp

Il protocollo FTP ` uno dei pi` vecchi protocolli che consentono lo scambio di le su internet. e u Il protocollo permette di prelevare od immettere le su un server FTP, previa autenticazione

7.5. I CLIENT DEI SERVIZI DI BASE

287

analoga a quella del login o dellaccesso con telnet. Una sua forma particolare ` il cosiddetto e FTP anonimo in cui il servizio viene utilizzato per distribuire i le posti in un server (in questo caso il servizio non richiede autenticazione, e di norma consente solo il prelievo dei le). Dato che il protocollo, come telnet, non prevede alcuna cifratura dei dati, ` meglio non e usarlo in quanto lautenticazione verrebbe eseguita in chiaro; unica eccezione ` la modalit` e a anonima in cui non c` autenticazione che ` tuttoggi una delle modalit` pi` ecaci per distribuire e e a u pubblicamente le. Qualora si necessiti di un meccanismo per lo scambio di le via rete fra i vari utenti sono disponibili alternative come luso di scp o sftp29 che tratteremo in sez. 8.3. Oggi esistono molti client per il protocollo FTP, sia graci che testuali; ma il comando originale usato per lanciare il client testuale ` ftp. Un esempio di uso generico del comando `: e e
piccardi@oppish:~$ ftp ftp.linux.it Connected to vlad-tepes.bofh.it. 220 (vsFTPd 1.1.3) Name (ftp.linux.it:piccardi): anonymous 331 Please specify the password. Password: 230 Login successful. Have fun. 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 ` installata,30 e vanno vericate facendo riferimento alla relativa pagina di manuale. e Si noti come nelluso generico sia suciente indicare la macchina cui ci si vuole collegare. Nel caso ci viene noticato lhostname eettivo del server e ci viene richiesto un nome di login che di default corrisponde al nostro username. Avendo contattato un FTP anonimo lutente da usare ` anonymous specicato il quale ci viene richiesta una password, che nel caso ` ininuente e e (qualunque cosa si scriva ci sar` garantito laccesso). a Fatto questo ci si ritrova con un prompt ftp> dal quale sar` possibile inviare i vari comandi a del protocollo; i pi` importanti di questi si sono riportati in tab. 7.21. La lista completa ` al u e solito disponibile nella pagina di manuale.
Comando ls cd lcd pwd ascii binary pasv get file put file mget files* mput files* open host quit Signicato stampa la lista dei le (sul server) cambia directory (sul server) cambia directory (sul client) stampa la directory corrente (sul server) modalit` di trasferimento di le ascii a modalit` di trasferimento di le binari a abilita i trasferimenti in modo passivo scarica il le file dal server invia il le file sul server scarica i le che corrispondono alla wildcard files* invia i le che corrispondono alla wildcard files* apre una connessione verso il server host chiude la sessione Tabella 7.21: Comandi del protocollo FTP.

Si tenga inoltre presente che non tutti i comandi possono essere supportati dal server. Ad
sftp ` un programma che ha esattamente la stessa sintassi di ftp, ma consente luso di una connessione e cifrata attraverso il protocollo SSH. 30 questa ` la risposta data dal comando ftp che si trova su Debian Woody, derivato dalloriginale programma e nato con BSD, alternative possono essere client pi` evoluti come lftp o ncftp che supportano la history dei u comandi, il completamento dei nomi, e capacit` aggiuntive. a
29

288

CAPITOLO 7. LAMMINISTRAZIONE DI BASE DELLE RETI

esempio il comando pasv, che abilita il modo passivo,31 ` eseguibile solo se il server supporta e questa modalit` di operazione, mentre i comandi ascii e binary non hanno nessun signicato a su sistemi unix-like, ma possono averlo per altri sistemi come il VMS o il DOS.

7.5.3

Il comando finger

Il comando finger viene usato n 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 ` stato trasferito sulla rete, e ed il client funziona sia in locale che in remoto (nel qual caso si eseguir` una richiesta con un a parametro del tipo nome@host. Un possibile esempio di uso del comando, fatto in locale, ` il seguente: e
[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` aggiungervi ulteriori informazioni creando un le .plan nella sua home directory, che verr` o a mostrato allesecuzione del comando. 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` usare lopzione -m. Se invocato senza argomenti mostra lelenco o 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` fare riferimento alla pagina di manuale. o Dato che il comando fornisce delle informazioni che potrebbero essere utili per attivit` non a 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` a non attivare questo servizio u sulla rete. Talvolta per` esso viene utilizzato per pubblicare delle informazioni, non legate o alla presenza di specici utenti sulla macchina, come eventuali recapiti e contatti, oppure per distribuire le chiavi GPG degli utenti (usando un le .pgpkey nella home directory degli stessi).

7.5.4

Il comando whois

Il comando whois viene usato per contattare il servizio whois. Questo servizio viene utilizzato per mantenere un database dei titolari dei domini su internet. In genere lo si utilizza quando si cercano informazioni sulla registrazione dei domini, e per il contatto dei relativi proprietari. Ad esempio avremo che:
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 le questo viene eettuato dal server con una seconda connessione che contatta il client sulla porta 20. Dato che normalmente i rewall bloccano le connessioni entranti, il modo passivo fa s` che sia sempre il client a creare la nuova connessione anche per i dati.
31

7.6. LA RISOLUZIONE DEI NOMI

289

[piccardi@gont piccardi]$ whois truelite.it domain: truelite.it x400-domain: c=it; admd=0; prmd=truelite; org: Simone Piccardi descr: Via Xyxyxyx, 8 descr: 50100 Firenze (FI) admin-c: SP1700-ITNIC tech-c: SP1700-ITNIC tech-c: TS7016-ITNIC postmaster: SP1700-ITNIC zone-c: TS7016-ITNIC nserver: 195.110.99.23 ns1.register.it nserver: 213.246.4.72 ns2.register.it mnt-by: REGISTER-MNT created: 20020819 expire: 20030819 changed: [email protected] 20020815 source: IT-NIC person: address: address: address: address: phone: e-mail: nic-hdl: changed: source: person: address: address: phone: fax-no: e-mail: nic-hdl: notify: mnt-by: changed: changed: source: Simone Piccardi Simone Piccardi Via Xyxyxyx, 8 50100 Firenze (FI) IT +39 055 NN000NN [email protected] SP1700-ITNIC [email protected] 20020819 IT-NIC Technical Services Register.it Italy +39 035 3230400 +39 035 3230312 [email protected] TS7016-ITNIC [email protected] REGISTER-MNT [email protected] 20011016 [email protected] 20030423 IT-NIC

e come si pu` notare si ottengono tutta una serie di informazioni relative alla gestione (e al o relativo titolare) di un nome a dominio.

7.6

La risoluzione dei nomi

Tratteremo in questa sezione la congurazione del servizio di risoluzione dei nomi, che permette di identicare una macchina invece che per il numero IP attraverso un nome simbolico. Vedremo come questa funzionalit` sia provvista direttamente dalle librerie del sistema e quali sono i relativi a le di congurazione.

7.6.1

Introduzione

Finora abbiamo parlato della congurazione di base della rete, che riguarda principalmente lassegnazione degli indirizzi e delle rotte per lo smistamento dei pacchetti, cio` il livello pi` e u basso del protocollo TCP/IP, che in genere viene gestito direttamente dal kernel.

290

CAPITOLO 7. LAMMINISTRAZIONE DI BASE DELLE RETI

Quando per` vi collegate ad internet ` piuttosto raro che dobbiate usare un numero IP, per o e questo uno dei servizi di base per il funzionamento di internet ` quello della risoluzione dei nomi e con il quale potete identicare un sito o una macchina sulla rete attraverso un nome che poi sar` a risolto nel relativo numero IP. Su internet il servizio di risoluzione dei nomi ` realizzato principalmente attraverso il coside detto Domain Name Service, o DNS, che tratteremo in cap. 9. Il servizio DNS ` in sostanza un e enorme database distribuito che associa ad un nome letterale (quello dei nomi di dominio, che identica i siti internet) ad un indirizzo IP, e che pu` essere interrogato da tutti i programmi o che necessitano di questa risoluzione. In generale ogni singolo programma viene poi a costituire, tutte le volte che vuole accedere ad un nodo attraverso il suo nome invece che con il numero, un client per questo servizio. Dato linteresse generale per una grande quantit` di programmi diversi (ad esempio tutti a i client di servizi di rete), allinterno di un sistema unix-like il servizio di risoluzione dei nomi viene eettuato da una serie di funzioni, fornite dalle librerie standard del C, che vanno a costituire quellinsieme di funzionalit` che viene chiamato resolver e che permette di ottenere a delle associazioni fra nodi della rete e identicativi associati agli stessi. Per questo prima di trattare del DNS in quanto servizio fornito sulla rete, prenderemo in considerazione i le di congurazione usati dalle routine 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. Se restiamo nella nostra analogia telefonica, il sistema del resolver ` in sostanza il meccanismo e che ci porta dal sapere il nome del destinatario allavere il numero del telefono. Come per il telefono questo pu` avvenire in pi` modi, si pu` andare a cercare sulla rubrica, che nel caso ` o u o e realizzata dal le /etc/hosts, si pu` cercare nellelenco del telefono, oppure ci si pu` rivolgere o o ad un server DNS, che ` pi` simile al servizio 12. Luso del DNS ha anche il vantaggio (come il e u servizio 12 rispetto ad una rubrica) che qualora una associazione fra nome e numero IP dovesse cambiare questa viene aggiornata automaticamente. Per questo motivo quando congurate la rete con i programmi di interfaccia creati dalle varie distribuzioni, una delle informazioni che di norma vi vengono richieste ` lindirizzo IP (numerico e ovviamente) di un server DNS (ogni provider ne mette a disposizione almeno una) da contattare per la risoluzione dei nomi quando navigate su internet.

7.6.2

I le /etc/hosts e /etc/hostname

Normalmente, a meno di una diversa impostazione nei vari le di congurazione che esamineremo pi` avanti, il primo le utilizzato dal resolver per eettuare una corrispondenza fra numeri IP u e nomi simbolici ` /etc/hosts. Questo le contiene un elenco di nomi di macchine, associati al e relativo numero IP. Lo si usa quindi come unagenda del telefono per specicare 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 le ` molto semplice, le righe vuote od inizianti per una # sono ignorate, le e altre righe devono contenere, separati da spazi o caratteri di tabulazione, il numero di IP, il nome completo (in termini di dominio, quello che viene detto FQDN, Fully Qualied Domain Name) ed un nome breve. Un possibile esempio di questo le ` il seguente: e
# 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 g. 7.5 sono sulla rete secondaria di havnor i relativi nomi. Ovviamente usare questo le ` la maniera pi` semplice per identicare una macchina su una e u rete locale, lo svantaggio ` che in una rete questo le dovrebbe essere presente su ogni macchina, e

7.6. LA RISOLUZIONE DEI NOMI

291

e quando il numero di nodi coinvolti aumenta, diventa sempre pi` complicato il lavoro di tenerli u tutti aggiornati e coerenti fra loro. Per questo vedremo in sez. 9.2.4 come fare lo stesso lavoro attraverso il DNS. Bench il le faccia riferimento ad delle caratteristiche tipiche delluso della rete, esso deve e comunque essere presente anche quando la macchina non ` in rete, in quanto esiste comunque e linterfaccia locale, e molti programmi fanno riferimento a questo le per la risoluzione del nome di questultima. Un caso particolare di gestione dei nomi ` quello che riguarda il nome che contraddistingue la e macchina stessa, comunemente detto hostname, che ` quello che viene stampato da vari comandi e non soltanto relativi alla rete (come uname, il prompt della shell o le schermate di avvio). Bench e questo abbia di solito pi` signicato quando si ` collegati in rete, il nome di una macchina ` u e e una propriet` del tutto indipendente dalla presenza in rete della stessa, e viene perci` impostato a o attraverso luso del comando hostname. Di norma buona parte delle distribuzioni chiedono il nome in fase di installazione e lo memorizzano nellomonimo le /etc/hostname (in alcune viene invece usato /etc/HOSTNAME) che viene usato negli script di avvio per leggere il nome della macchina quando questo viene impostato con il comando hostname. Perci` si deve essere consapevoli che cambiare il contenuto di o questo le non cambia il nome della macchina ntanto che non si chiama direttamente anche hostname o si rieseguono gli script di avvio.

7.6.3

Gli altri le per i nomi di rete

Oltre alle associazioni fra numeri IP e nome simbolico di una macchina, esistono una serie di altre informazioni relative ad una rete, di norma identicate nei protocolli da valori numerici, ai quali per` viene assegnato un corrispondente nome simbolico come facilitazione mnemonica. o Come accennato in sez. 7.2.4 le corrispondenze fra servizi, identicati da nomi simbolici, e numeri delle porte loro assegnate viene mantenuta nel le /etc/services. Di norma questo non ` un le che sia necessario modicare, ma ` utile per avere un riferimento. Il formato del e e le ` molto semplice, un elenco di numeri a ciascuno dei quali ` associato un nome simbolico che e e individua il servizio ad esso associato dalle convenzioni internazionali. Un estratto del le `: e
... 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

fspd # SSH Remote Login Protocol # SSH Remote Login Protocol

mail timserver timserver nicname # Remote Mail Checking Protocol # Remote Mail Checking Protocol # name-domain server # deprecated # BOOTP server # BOOTP client

nameserver nameserver

# Internet Gopher

292
rje finger www www ... 77/tcp 79/tcp 80/tcp 80/udp

CAPITOLO 7. LAMMINISTRAZIONE DI BASE DELLE RETI


netrjs http # WorldWideWeb HTTP # HyperText Transfer Protocol

Come per buona parte dei le di congurazione, righe vuote e tutto quello che segue un # viene considerato un commento e ignorato; ogni riga ha il formato: nome numero/protocollo alias

dove nome lidenticativo simbolico del servizio, numero ` il numero di porta ad esso assegnato, e e protocollo indica se si tratta di UDP o TCP, mente alias ` la lista di eventuali altri nomi e ` associati allo stesso servizio. E in questo le che i vari programmi attinenti alla rete, quando devono identicare un determinato servizio attraverso un numero di porta possono utilizzare il relativo nome simbolico al posto del valore numerico. Un altro le che mantiene corrispondenze fra numeri e nomi ` /etc/networks, che ` lanalogo e e di /etc/hosts per quanto riguarda le reti. Anche queste, come le singole stazioni, possono essere identicate da un nome, e di nuovo le corrispondenze statiche fra nome e indirizzo IP della rete vengono mantenute in questo le, il cui formato ` analogo a quello di /etc/hosts. e Il formato del le, 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 il suo indirizzo, nella notazione dotted decimal (tralasciando opzionalmente gli eventuali .0 nali), il terzo un eventuale alias (questo campo ` opzionale). Al solito le righe vuote e tutto e quello che segue un # viene ignorato. Un esempio del contenuto di questo le potrebbe essere: localnet 192.168.1.0 questo le viene utilizzato da comandi come netstat o route per mostrare i nomi simbolici al posto dei valori numerici; si tenga conto per` che con questo le viene supportata solo la o corrispondenza con reti espresse nella notazione tradizionale per classi di tipo A, B o C, e che lindirizzamento CIDR non funziona. Oltre ai nomi delle reti, i vari comandi di sistema possono avere altre necessit` di usare nomi a simbolici al posto dei valori numerici; un esempio di questo ` nella corrispondenza fra numeri e di porta e servizi illustrata in sez. 7.2.4, che viene mantenuta in /etc/services. Un altro le usato per questo tipo di corrispondenze ` /etc/protocols, che associa al numero usato a livello e di IP per identicare il protocollo di trasporto usato nello strato successivo (si ricordi quanto detto in sez. 7.1.3) ad un identicativo. Il formato di questo le ` identico a quello di /etc/networks: sono supportati tre campi e divisi da spazi, in cui il primo identica il nome simbolico, il secondo il valore numerico che identica il protocollo ed il terzo un alias. Un esempio di questo le ` il seguente (lestratto ` e e preso da una Debian):
ip icmp igmp ggp ipencap st tcp egp pup udp hmp xns-idp rdp 0 1 2 3 4 5 6 8 12 17 20 22 27 IP ICMP IGMP GGP IP-ENCAP ST TCP EGP PUP UDP HMP XNS-IDP RDP # # # # # # # # # # # # # 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

7.6. LA RISOLUZIONE DEI NOMI


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 ... ISO-TP4 XTP DDP IDPR-CMTP IPv6 IPv6-Route IPv6-Frag IDRP RSVP GRE IPSEC-ESP IPSEC-AH SKIP # # # # # # # # # # # # # 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

293

Al solito le righe vuote e tutto quello che segue un # viene ignorato; la descrizione completa del le ` riportata nella pagina di manuale accessibile con man protocols. e Unaltra informazione usata da parecchi programmi che hanno a che fare con la rete e non solo ` il nome della macchina su cui ci si trova. Questa ` in genere una informazione indipendente dal e e fatto di essere in rete, e viene gestita attraverso il comando hostname che serve sia per impostare che per mostrare il nome della stazione su cui ci si trova. In generale la gran parte delle distribuzioni usano un le che ` /etc/hostname o /etc/HOSTNAME e nel quale scrivere il nome della macchina; questo poi viene usato per impostare lhostname (in genere negli script di avvio). Di solito si usa lo stesso comando hostname che con lopzione -F permette di impostare il nome della macchina leggendolo da un le. Anche in questo caso le righe vuote e tutto quello che segue un # viene ignorato. Un secondo comando relativo allhostname ` dnsdomainname che invece permette di ottenere e il nome di dominio in cui si trova la macchina. In questo caso per` non ` possibile usare questo o e comando per modicarne il valore, in quanto questo viene determinato dal resolver sulla base della congurazione di questultimo.

7.6.4

Il le /etc/nsswitch.conf

In generale oltre alla risoluzione dei nomi associati alle singole stazioni esiste la necessit` di poter a eettuare altra associazioni, 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, con dei le come /etc/hosts o /etc/protocols, ma anche su database, con LDAP, o su un server DNS, le librerie del C GNU prevedono una modularizzazione di questi servizi attraverso il cosiddetto Name Service Switch. Questo ` un insieme di librerie dinamiche che permettono di mantenere le varie corrispone denze fra nomi e numeri in maniera generica su vari tipi di supporti. Il loro comportamento ` e regolato dal le /etc/nsswitch.conf che serve, per ciascuno dei servizi gestiti dal Name Service Switch, a indicare su quale supporto si trovano, ed in quale ordine cercarle, le informazioni di corrispondenza. Per il le valgono le solite convenzioni per cui quello che segue un # e le righe vuote vengono ignorate. Il formato richiede un nome di servizio seguito da due punti, ed una lista di possibili supporti nellordine in cui verranno esaminati. Un estratto del le ` il seguente: e
... hosts: networks: protocols: services: ethers: rpc: files dns files db files db files db files db files

294

CAPITOLO 7. LAMMINISTRAZIONE DI BASE DELLE RETI

netgroup:

nis

ed ad esempio nel caso di risoluzione dei nomi la riga che interessa ` quella relativa a hosts che ci e dice che prima si dovr` andare a risolvere i nomi usando i le locali standard (cio` /etc/hosts) a e e poi il DNS. Se si volessero mettere le corrispondenze fra macchine locali e nomi su un server LDAP si potrebbe modicare questa linea come: hosts: files ldap dns

nel qual caso prima di interrogare il DNS si eettuerebbe una ricerca su LDAP.

7.6.5

Il le /etc/resolv.conf

` E nel le /etc/resolv.conf che vengono memorizzate le informazioni principali relative alla risoluzione dei nomi, come il dominio locale e lIP del nameserver che vengono di solito indicati in fase di installazione o congurazione iniziale della rete. In sostanza ` in questo le che dovete e dire qual` il numero di telefono del servizio 12 a cui vi rivolgete; di solito ogni provider ha il e suo, e voi potete creare anche il vostro DNS locale. Anche questo le controlla il comportamento delle funzioni del cosiddetto resolver, di norma contiene il nome del dominio e la lista degli IP dei nameserver; il formato ` molto semplice, una e serie di righe nella forma direttiva valore con le righe vuote e quelle che iniziano per # che vengono ignorate. Un possibile esempio ` il seguente: e
nameserver 127.0.0.1 search firenze.linux.it nameserver 195.110.99.218

La direttiva nameserver serve ad indicare la specicazione del numero IP di un nameserver, la risoluzione di un nome verr` eseguita nellordine in cui esse sono state specicate. Normalmente a si possono specicare no ad un massimo di 3 diversi nameserver, lindirizzo deve sempre essere fornito in forma numerica. La direttiva search specica una lista di domini in cui cercare i nomi; di norma contiene solo il dominio locale, cos` quando si specica un nome gli viene aggiunto automaticamente quel dominio. In questo modo si pu` specicare solo lhostname del computer, e la ricerca assumer` o a che esso si trovi nella lista dei domini qui elencati. Un elenco delle opzioni principali ` riportato in tab. 7.22; la descrizione pi` dettagliata di e u tutte le opzioni si pu` trovare nella pagina di manuale ottenibile con man resolv.conf. o
Direttiva nameserver search domain Signicato denisce lIP di un server DNS da utilizzare per la successiva risoluzione dei nomi lista dei domini su cui eettuare una ricerca preventiva nome del dominio locale, se assente viene determinato sulla base di quanto specicato con /etc/hostname Tabella 7.22: Direttive del le di con resolv.conf.

Se siete su una rete locale dovete impostare questi valori manualmente (in genere questo viene fatto dal programma di congurazione della rete, che, quando vi chiede dominio e DNS, va a creare automaticamente questo le). Se invece usate un collegamento punto-punto con un modem o una ADSL sono i programmi che lanciano la connessione (cio` pppd o leventuale e interfaccia a questultimo) che usano le informazioni ottenute dal provider durante la fase di negoziazione del collegamento, e riscrivono al volo questo le; in questo caso vi pu` servire di o aggiungerci al volo qualche altro DNS (ce ne sono di pubblici) qualora quello del vostro provider avesse problemi.

7.7. IL PROTOCOLLO PPP

295

7.6.6

Il le /etc/host.conf

Il le /etc/host.conf controlla le modalit` di funzionamento delle routine che eseguono la a risoluzione dei nomi (il resolver ). Al solito le righe vuote od inizianti per # sono ignorate, le altre devono contenere una parola chiave che esprime una direttiva seguita o meno da un valore. Un esempio comune del contenuto di questo le ` il seguente: e
order hosts,bind multi on

la prima direttiva controlla la sequenza in cui viene eettuata la risoluzione dei nomi, e dice che deve prima essere usato il le hosts di sez. 7.6.2, e poi le interrogazioni ai DNS esterni. La seconda permette di avere indietro tutti gli indirizzi validi di una stazione che compare pi` volte u in hosts, invece di avere solo il primo.
Direttiva nospoof spoofalert reorder Signicato attiva il controllo antispoong, chiedendo la risoluzione inversa dellIP ricevuto e fallendo in caso di mancata corrispondenza. se nospoof ` attivo inserisce un avviso degli errori rilevati nei log di e sistema. riordina gli indirizzi in modo da restituire per primi quelli locali. Tabella 7.23: Direttive del le di con host.conf.

Oltre a queste due le principali direttive ed il relativo signicato ` riportato in tab. 7.23, e tutte le direttive ivi riportate prendono come argomenti on ed off che attivano e disattivano il comportamento richiesto, se non esplicitamente richiesto inoltre il comportamento di default ` equivalente ad off. Per i dettagli completi si pu` consultare la pagina di manuale con man e o host.conf.

7.7

Il protocollo PPP

Come accennato in sez. 7.2.1 il PPP ` uno dei protocolli del livello di rete su cui si innestano tutti e i protocolli dei livelli successivi. Nel caso specico PPP ` un protocollo generico che permette e di inviare dati su diversi collegamenti seriali punto-punto. Il protocollo si compone di tre parti, un metodo generico per incapsulare dati su collegamenti seriali, un protocollo estensibile per il controllo del collegamento (Link Control Protocol o LCP) ed una famiglia di protocolli (Network Control Protocols o NCP) per stabilire e congurare le connessioni coi protocolli di livello superiore. In generale esso 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 gli altri protocolli. Luso pi` tipico ` comunque quello con i modem u e analogici.

7.7.1

Il demone pppd

Delle tre parti cui ` composto il protocollo PPP, la incapsulazione ` gestita dal kernel, il resto e e ` adato ad un demone apposito, il pppd, che si cura di fornire il controllo del collegamento, e lautenticazione, e lNCP che riguarda la congurazione e la gestione del protocollo IP su PPP. La sintassi generica con cui si pu` chiamare il programma, come riportata dalla pagina di o manuale, ` la seguente: e pppd [ ttyname ] [ speed ] [ options ]

296

CAPITOLO 7. LAMMINISTRAZIONE DI BASE DELLE RETI

dove ttyname specica il dispositivo da usare per la comunicazione, speed la velocit` di comunia cazione dello stesso in baud e options indica tutte le altre opzioni. Ad esempio, per far partire la connessione con un modem attaccato alla prima seriale, si potrebbe usare il comando: pppd /dev/ttyS0 115200 connect "/usr/sbin/chat -v -f /etc/chatscripts/provider" dove lopzione connect viene usata per specicare il comando da usare per far impostare correttamente la linea seriale prima di far partire la connessione. In realt` non ` necessario specicare nessuna opzione a riga di comando, esse di norma a e vengono lette allavvio del demone dal le /etc/ppp/options, o, per quelle che sono impostabili da un normale utente, dal le .pppdrc nella home dello stesso. Se si ` specicato a riga di e comando un particolare dispositivo (come /dev/ttyS0 nellesempio), le opzioni verranno prese, se esiste, dal le /etc/ppp/options.ttyNAME (nel caso options.ttyS0). Una forma diversa di chiamata del demone pu` essere attraverso lopzione call, che pero mette di personalizzare le opzioni in base al service provider che si vuole utilizzare; in questo infatti caso le opzioni saranno lette da un le posto nella directory /etc/ppp/peers, cos` se /etc/ppp/peers/adsl contiene le opzioni per chiamare il provider con un modem ADSL, potremo attivare la connessione con un comando del tipo di: pppd call adsl Le opzioni pi` comuni si sono riportate in tab. 7.24, insieme ad una loro breve descrizione, u la descrizione e lelenco completo delle varie opzioni sono disponibili nelle pagine di manuale accessibili con man pppd.
Direttiva call name connect script crtscts defaultroute lock demand usepeerdns Signicato Usa le opzioni contenute nel le name in /etc/ppp/peers. Usa lo script script (di norma chat) per preimpostare la linea. Attiva il controllo di usso hardware sulle porte seriali. Aggiunge una rotta di default alla tabella di routing usando lIP ricevuto sulla connessione. Crea un le di lock per la seriale. Crea la connessione a richiesta quando vede del traco. 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 le resolv.conf che li usi come nameserver. Abilita il debugging, ` utile per avere pi` informazioni quando la e u connessione non funziona. Tabella 7.24: Opzioni del demone pppd.

debug

Una volta lanciato il demone stabilisce una connessione sulla linea indicata tramite le opzioni. Di norma perch questo avvenga ` necessario che la linea venga opportunamente preparata; ad e e esempio se si ha un modem occorrer` che questo eettui la chiamata telefonica ed attivi la a connessione. Di solito questo si fa attraverso luso del comando chat. Questo ultimo viene lanciato da pppd con lopzione connect, che esegue un qualunque programma o script da usare per inizializzare la connessione. Nel nostro caso chat verr` solo usato per dare le istruzioni al modem e vericare la riuscita a della chiamata. Le opzioni pi` signicative sono -f che permette di indicare un le per lo script u di chat, e -v che permette di registrare i risultati della comunicazione a scopo di controllo. Le restanti opzioni possono essere trovate nella pagina di manuale accessibile con man chat. Il comando usa uno script di chat con il quale gestisce la comunicazione iniziale con il modem, esso ` composto da coppie di valori, in cui il primo indica quello che ci si attende di sentire dal e dispositivo ed il secondo quanto scrivere in risposta. Un esempio di le di chat potrebbe essere il seguente:

7.7. IL PROTOCOLLO PPP ABORT BUSY "" ATZ OK ATDT055507979 CONNECT \d\c

297

in cui le direttive ABORT deniscono le condizioni in cui viene abortita la connessione (possono essere BUSY, VOICE, NO DIALTONE ecc.). Si noti come si inizi non aspettandosi niente (questo il signicato della stringa vuota ) cui si risponde con il comando ATZ del modem. Alla risposta OK si esegue il comando ATDT055507979 che esegue la telefonata. Alla risposta CONNECT lo script nisce 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 in certi casi ` necessaria una procedura di login prima che laltro capo e attivi il suo demone pppd sulla connessione, il che pu` comportare ad esempio la presenza di o ulteriori linee del tipo di: ogin: username ssword: password o quel che sar` necessario a seconda della risposta dellaltro server (di norma appunto un login: a cui va risposto con lusername, cui seguir` password: a cui rispondere con la password), tenendo a conto che basta una corrispondenza parziale della risposta, come nellesempio. Se la connessione viene stabilita regolarmente, il demone si incarica di creare una nuova interfaccia di comunicazione ppp0 (in generale pppN a seconda di quante connessioni PPP si sono stabilite) sulla quale passer` il relativo traco. Inoltre viene lanciato lo script /etc/ppp/ip-up a che si cura eseguire una serie di azioni programmate relative alla presenza di una nuova connessione (come 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. 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.

7.7.2

I meccanismi di autenticazione

Al di l` della possibile necessit` di autenticarsi per laccesso alla linea seriale (come mostrato a a nellesempio riguardante chat) il demone pppd prevede una sua procedura di autenticazione diretta. Questa pu` avvenire secondo due protocolli, il Password Authentication Protocol (noto o come PAP) ed il Challenge Handshake Authentication Protocol (noto come CHAP). Il primo ` pi` elementare e prevede che il client invii un username ed una password in chiaro e u sulla linea; si ` cos` esposti ad una eventuale intercettazione telefonica. Il secondo procedimento e invece prevede linvio da parte del server di una sda nella forma di un pacchetto che contiene il nome del server, cos` che il client pu` rispondere con un pacchetto che contenga un hash o crittograco del pacchetto di sda cui si ` aggiunto il valore di un segreto condiviso (la password) e cos` da comprovare la conoscenza del segreto senza inviarlo sulla linea. Le informazioni di autenticazione usate dal demone vengono mantenute rispettivamente in due le: /etc/ppp/pap-secrets ed /etc/ppp/chap-secrets che hanno lo stesso formato. Un esempio di uno questi le ` il seguente: e
# 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 "*" -

298
stats frijole "*" # OUTBOUND connections piccardi * password

CAPITOLO 7. LAMMINISTRAZIONE DI BASE DELLE RETI

Il le prevede quattro campi separati da spazi; il primo campo indica il lusername usato dal client, il secondo il nome del server, il terzo il segreto condiviso, il quarto, opzionale, una lista degli IP da cui ` possibile eettuare il collegamento (un - indica nessun IP), si possono e indicare delle sottoreti in notazione CIFS 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 la password inizia per @ si indica che essa ` contenuta nel le specicato di seguito. e Dato che il collegamento ` punto-punto il procedimento di autenticazione ` simmetrico: ogni e e demone pu` chiedere allaltro di autenticarsi; per questo i le contengono sia le informazioni per o essere autenticati presso gli altri che per autenticarli. Di norma per`, a meno di non gestire un o provider, si deve solo essere autenticati, per questo il default ` che pppd non esegue richieste di e autenticazione, ma si limita a rispondere a quelle che gli vengono fatte.

Capitolo 8

La gestione dei servizi di base


8.1 La gestione dei servizi generici

In genere su ogni macchina in rete viene installata una serie di piccoli servizi generici, spesso attivi solo per uso di test, come echo o discard, che non vengono eettuati da altrettanti demoni perennemente attivi, ma attraverso un apposito programma che viene chiamato superdemone, il cui compito ` un po quello della segretaria, che riceve le telefonate sul centralino e poi passa e ciascuna di esse allucio competente. Di norma i servizi pi` importanti ed usati, come il web, la posta, il DNS, o SSH non vengono u utilizzati in questo modo, perch questa interposizione di un altro programma avrebbe eetti e negativi sulle prestazioni. Inoltre esistono vari programmi in grado di svolgere questo compito, anche se i due principali sono il tradizionale inetd, ed il pi` moderno xinetd. u

8.1.1

Il superdemone inetd

Tradizionalmente la gestione dei servizi generici ` sempre stata eettuata tramite il programma e ` inetd, che ancor oggi viene usato dalla gran parte delle distribuzioni. E attraverso questo programma che di norma vengono lanciati invece alcuni fra i servizi pi` semplici e meno usati, u come telnet o ftp, che non vale la pena di mantenere in memoria. In questo caso ` inetd che e si mette in ascolto sulle rispettive porte, e lancia il relativo programma solo quando qualcuno eettua una connessione. Il programma viene di norma lanciato dagli script di avvio, ed al solito pu` essere controllato o manualmente con il relativo script che di norma ` /etc/init.d/inetd. In caso di necessit` lo e a si pu` eseguire anche direttamente a riga di comando, nel qual caso si pu` usare lopzione -d o o per farlo partire in modalit` di debug, mentre con -q si pu` importare la profondit` della coda a o a delle connessioni in ingresso per cui si sta in ascolto. Il programma inoltre fornisce direttamente alcuni servizi elementari come echo, discard o daytime, per i quali non ` necessario lanciare nessun programma. Ma laspetto interessante ` e e che inetd ` in generale in grado di associare ad una porta un programma qualunque. Quello che e succeder` ` che in occasione di una connessione di rete esso eseguir` il programma collegando sia ae a lo standard input che lo standard output dello stesso al socket, cos` ad esempio si pu` attivare il o servizio netstat semplicemente facendogli lanciare lomonimo programma, il cui risultato sar` a inviato via rete. Il le di congurazione di inetd ` /etc/inetd.conf, ed ` qui che si specica su quali porte il e e demone deve porsi in attesa e quali programmi lanciare. Un esempio di questo le ` il seguente: e
# /etc/inetd.conf: see inetd(8) for further informations. # # Internet server configuration database #

299

300

CAPITOLO 8. LA GESTIONE DEI SERVIZI DI BASE

# <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 #:INFO: Info services ident stream

news

/usr/sbin/tcpd

/usr/sbin/leafnode

tcp

wait

identd

/usr/sbin/identd

identd

come si vede il formato ` relativamente semplice, una tabella in cui ogni riga ` relativa ad un e e servizio da lanciare, ed i campi sono separati da spazi o tabulatori; al solito righe vuote e iniziate da # sono ignorate. Il servizio da lanciare ` identicato dal primo campo, tramite il suo valore simbolico cos` come e viene indicato in /etc/services. Il successivo campo indica il tipo di socket: i due tipi pi` u comuni sono stream o dgram, ma si possono indicare tutti i tipi di socket supportati con Linux, (come raw, rdm, or seqpacket). Il terzo campo indica il protocollo usato: di norma si tratta di tcp o udp, (ma si pu` specicare un qualunque nome valido riportato in /etc/protocols) che o in pratica corrispondono rispettivamente ai tipi stream e dgram. Il quarto campo ` applicabile solo quando si ` usato un socket dgram, e indica se il server ` in e e e grado di trattare altri pacchetti mentre sta rispondendo (nel qual caso si imposta nowait) o meno, nel qual caso si deve aspettare la ne del processo corrente prima di rilanciare il programma; per gli altri socket deve essere nowait. Il quinto campo indica lutente per conto del quale viene eseguito il programma; se si vuole specicare anche un gruppo diverso da quello di default, lo si pu` fare scrivendo il campo nella forma user.group. o Il quinto campo deve indicare il pathname completo del comando che verr` eseguito in caso a di connessione, o la parola chiave internal se quel servizio ` fornito direttamente da inetd. e Eventuali argomenti dovranno essere specicati di seguito; dato per` che inetd usa direttamente o il resto della linea per invocare la funzione exec, questi non potranno essere specicati normalmente riprendendo quanto si scriverebbe su una riga di comando, ma dovranno essere preceduti dallargomento iniziale (che la riga di comando costruisce automaticamente, per cui non viene mai specicato), che indica il nome del programma lanciato. Come si pu` notare nellesempio sono abilitati solo due servizi, il primo ` un server news o e gestito tramite il programma leafnode, il secondo ` il servizio ident, denito dallRFC 1413, e che permette di identicare lutente proprietario del processo che ha 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.3. Se vogliamo provare ad abilitare un nuovo servizio netstat possiamo aggiungere al le una riga del tipo: netstat stream tcp nowait nobody /bin/netstat netstat -ant

e si noti come si sia specicato, prima dei parametri -ant, il nome del programma netstat; senza questo il risultato sarebbe stato che allesecuzione di /bin/netstat nome del processo

8.1. LA GESTIONE DEI SERVIZI GENERICI

301

(come ottenibile attraverso il comando ps) sarebbe risultato -ant, mentre le opzioni sarebbero state perse. A questo punto si pu` vericare il funzionamento del nostro nuovo servizio usando telnet; o 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:709 0.0.0.0:* 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 0.0.0.0:884 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:* tcp 0 0 0.0.0.0:119 0.0.0.0:* tcp 0 0 0.0.0.0:631 0.0.0.0:* tcp 0 0 0.0.0.0:25 0.0.0.0:* tcp 0 0 0.0.0.0:444 0.0.0.0:* tcp 0 0 192.168.1.1:32777 195.110.124.18:993 tcp 0 0 127.0.0.1:32944 127.0.0.1:15 tcp 0 0 192.168.1.1:32778 62.177.1.107:5223 tcp 0 0 192.168.1.1:32772 192.168.1.168:5901 tcp 0 0 127.0.0.1:15 127.0.0.1:32944 Connection closed by foreign host.

State LISTEN LISTEN LISTEN LISTEN LISTEN LISTEN LISTEN LISTEN LISTEN LISTEN LISTEN ESTABLISHED ESTABLISHED ESTABLISHED ESTABLISHED ESTABLISHED

e come si pu` notare si ottiene il risultato del comando netstat, come se lo si fosse eseguito o sulla nostra macchina. Questa ` una caratteristica generale del comportamento di inetd. Il superdemone infatti ` e e in grado di eseguire un programma qualsiasi; in generale sar` compito del programma eseguito a gestire la connessione di rete, ma inetd quando lancia il programma fa s` che standard input, standard output e standard error siano comunque associati al socket su cui ` stata aperta la e connessione. Questo signica che si pu` lanciare attraverso inetd un programma qualsiasi, e o questo accetter` linput dal socket e su di esso scriver` il suo output. a a Nellesempio appena mostrato quello che ` successo ` che ` stato eseguito il programma e e e netstat sul server remoto che come al solito ha prodotto la lista dei socket attivi scrivendola sullo standard output, per poi terminare. Questo ha fatto s` che noi la ricevessimo sul socket creato dalla connessione eettuata con telnet, che ` stato automaticamente chiuso alla terminazione e del processo. La cosa ` applicabile in generale a qualunque comando di shell per cui potremmo e denire un servizio di rete ps (assegnandogli una porta in /etc/services) che ci fornisce lelenco dei processi, o quello che vogliamo.

8.1.2

Il superdemone xinetd

Il programma xinetd nasce come estensione 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 come per i TCP wrapper, ma oltre a questo ha una serie di funzionalit` ulteriori come la possibilit` di mettere a disposizione a a i servizi in orari determinati, dei meccanismi di redirezione delle connessione, delle capacit` di a logging estese, dei meccanismi di protezione nei confronti dei portscan, delle capacit` di limitare a il numero di istanze del server lanciate, per resistere agli attacchi di denial of service.

302

CAPITOLO 8. LA GESTIONE DEI SERVIZI DI BASE

Le maggiori funzionalit` comportano ovviamente il prezzo di una maggiore complessit` di a a congurazione, comunque il comando supporta una opzione -inetd_compat che gli permette di operare in modalit` di compatibilit` con inetd. In tal caso infatti il programma prima a a legge i suoi le di congurazione, e poi /etc/inetd.conf facendo partire i servizi deniti in questultimo (questa ` la congurazione standard di Debian). e Il le principale di congurazione di xinetd ` /etc/xinetd.conf; un esempio tipico del suo e contenuto ` il seguente: e
# Simple configuration file for xinetd defaults { # The maximum number of requests a particular service may handle # at once. instances = 25 # The type of logging. This logs to a file that is specified. # 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 ci si ` limitati a dichiarare la sezione speciale defaults, che contiene i valori di e default delle opzioni, da applicare per tutti i servizi per i quali essi non sono stati esplicitamente specicati. La riga nale con la riga includedir ci dice poi di includere automaticamente nella congurazione il contenuto di tutti i le contenuti nella directory specicata (di norma, come nel caso, si usa /etc/xinetd.d), il che permette di poter attivare in maniera indipendente ciascun servizio con la semplice installazione di un le in tale directory. Al solito le righe vuote e il cui primo carattere non di spaziatura ` # vengono ignorate; per il e resto per ciascun servizio che si vuole attivare ` necessario specicare una voce (nel caso baster` e a scrivere un le che la contenga in /etc/xinetd.d) che inizia con la direttiva service; la sintassi generica di tale voce ` del tipo: e service <nome_servizio> { <attributo> <operatore> <valore> <valore> ... ... } dove <nome_servizio> indica il servizio che si vuole fornire, e gli attributi permettono di specicarne le caratteristiche, con un operatore di assegnazione che nella gran parte dei casi ` =, e con signicato ovvio, ma che pu` essere anche += per aggiungere e -= per togliere dei valori agli o attributi che lo supportano.

8.1. LA GESTIONE DEI SERVIZI GENERICI

303

Come mostrato nellesempio precedente, anche la direttiva default prende degli attributi; in genere questi sono attributi generali che possono a loro volta essere rispecicati in maniera diversa per i singoli servizi. Nel nostro caso il primo attributo ` instances che permette di porre e un limite massimo al numero di istanze di uno stesso server che il programma pu` lanciare. o Il secondo attributo ` log_type, che permette di specicare le modalit` con cui viene efe a fettuato il logging; queste possono essere FILE per specicare a seguire un le su cui salvare direttamente i dati, o SYSLOG per specicare luso del syslog, indicando poi con lulteriore parametro auth quale facility utilizzare (` possibile anche specicare di seguito una priority, se e diversa dal default info). I due attributi successivi, log_on_success e log_on_failure, permettono di specicare 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 ` disponibile il servizio identd secondo lRFC 1413) relativi alla connessione e 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 del processo (con PID). Inne 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 degli attributi che possono essere specicati nella sezione defaults, con la relativa descrizione, ` rie portato in tab. 8.1, lelenco completo pu` essere trovato nelle pagine di manuale accessibili con o man xinetd.conf.
Attributo instances log_type log_on_success log_on_failure per_source only_from no_access access_times cps Descrizione Numero massimo di processi lanciati per ogni servizio. Un argomento intero. Metodologia di registrazione dei log, su le o tramite syslog. Opzioni FILE o SYSLOG. Cosa registrare per le connessioni riuscite. Uno o pi` fra PID, HOST, u USERID, EXIT, DURATION. Cosa registrare per le connessioni fallite. Uno o pi` fra HOST, USERID, u ATTEMPT. Numero massimo di connessioni per IP sorgente. Un argomento intero. Lista degli host da cui ` possibile accedere. Indirizzi in forma dotted e decimal, CIDR o simbolica. Lista degli host da cui ` impossibile accedere. Indirizzi in forma dotted e decimal, CIDR o simbolica. Intervallo temporale nel quale ` possibile accedere ai servizi. Intervallo e temporale nella forma HH:MM-HH:MM. Rate massimo di accesso. Un argomento decimale per indicare il limite sulle connessioni al secondo, ed un argomento intero per specicare il numero di secondi da aspettare prima di accettare nuove connessioni una volta superato il limite. Valore di nice da applicare ai demoni lanciati. Un argomento intero. Carico massimo oltre il quale la macchina smetta di accettare connessioni. Un argomento decimale.

nice max_load

Tabella 8.1: Attributi specicabili in generale per tutti i servizi gestiti attraverso il superdemone xinetd.

Come accennato il programma ` in grado di implementare direttamente dei controllo di e accesso, che di utilizzare quelli eventualmente specicati tramite i le di controllo dei TCP wrappers 1 (vedi sez. ??), i due attributi only_from e no_access per` sono in grado di specicare o direttamente le stesse condizioni allinterno del le di congurazione di xinetd. In questo caso le sintassi supportate sono sia le forme dotted decimal (interpretando gli zeri nali come indirizzi di rete), che quelle CIDR, sia quelle espresse con indirizzi simbolici.
Si tenga presente che luso dei TCP wrapper ha di norma la precedenza sul controllo interno, per cui se si abilita laccesso con queste direttive, ma esso ` negato dai TCP wrapper, questi ultimi avranno la meglio. e
1

304

CAPITOLO 8. LA GESTIONE DEI SERVIZI DI BASE

Come gi` accennato ciascun servizio che si vuol lanciare con xinetd deve essere specicato a con la direttiva service seguita dal nome dello stesso; un esempio possibile ` il seguente: e
service time { disable = yes type id socket_type protocol user wait } service time { disable type id socket_type protocol user wait }

= = = = = =

INTERNAL time-stream stream tcp root no

= = = = = = =

yes INTERNAL time-dgram dgram udp root 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 deniti due servizi gestiti direttamente da xinetd, e cio` il servizio e time su TCP e UDP, entrambi sono disabilitati, avendo disable impostato su yes. Si noti come siano stati dierenziati attraverso la presenza di un argomento id. Inoltre con socket_type si ` specicato il tipo di socket da usare, e con protocol il relativo protocollo. Il campo type dice e che il servizio ` fornito internamente, mentre user indica che verr` eseguito per conto dellutente e a root. Inne il campo wait indica se il servizio pu` essere fornito in maniera concorrente (con o molte connessioni contemporanee) senza attendere la conclusione di una connessione, o no. Oltre ai due servizi interni si ` abilitato anche il servizio di news; in questo caso restano e specicati con lo stesso signicato precedente gli argomenti wait, socket_type e user (anche se per questultimo si ` usato lutente news), mentre non esistendo il servizio news su UDP e non ` stato necessario importare protocol. Si ` invece specicato il programma da usare come e e server con server, passando i relativi argomenti con server_args. Inoltre nel caso si ` ristretto e laccesso al servizio alle macchine della sottorete 192.168.0.0/24 con only_from e negli orari di ucio usando access_times. Oltre a quelli appena illustrati, si sono riportati i principali attributi utilizzabili in tab. 8.2. Li si sono poi suddivisi in due sezioni, la prima contenente quelli che, a certe condizioni, devono comunque essere specicati, la seconda quelli che sono sempre opzionali. Si ricordi che anche i precedenti argomenti visti in tab. 8.1 possono essere utilizzati e saranno applicati solo al servizio in questione. Al solito nelle pagine di manuale ` riportato un elenco completo di tutti gli e argomenti presenti e la descrizione dettagliata di ciascuno di essi. Anche con xinetd ` possibile creare un proprio servizio usando i comandi di shell; ripeteremo e allora quanto visto con inetd denendo un nuovo servizio netstat. Dato che il servizio ` previsto e

8.1. LA GESTIONE DEI SERVIZI GENERICI


Attributo socket_type user Descrizione Tipo di socket. Prende gli stessi valori (stream, dgram, ecc.) dellanalogo parametro in inetd.conf. Utente per conto del quale ` lanciato il servizio. Deve essere presente e in /etc/passwd. Si pu` specicare un eventuale gruppo con lattributo o group. Pathname del programma server da lanciare. Va sempre specicato se il servizio non ` gestito internamente. e 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 specicata se si ` e specicato un servizio non riportato in /etc/services. Tipo di servizio. Pu` assumere i valori INTERNAL (per servizi gestiti o internamente) e UNLISTED per servizi non presenti in /etc/services. Eventuali argomenti da passare al programma server quando viene lanciato. Non necessita di specicare largomento iniziale come per inetd. Indica se attivare il servizio, il default ` disattivo. Pu` assumere i valori e o yes e no. Identicatore aggiuntivo qualora si tratti di servizi diversi con lo stesso nome. Consente di specicare linterfaccia su cui fornire il servizio. Prende lIP ad essa associato. Consente di redirigere il servizio ad unaltra macchina. Prende lindirizzo IP e la porta verso quale redirigere tutto il traco.

305

server wait

protocol port type server_args

disable id bind redirect

Tabella 8.2: Attributi specicabili per un servizio gestito attraverso il superdemone xinetd.

in /etc/services solo per TCP possiamo attivarlo creando in /etc/xinetd.d un nuovo le con un contenuto del tipo di: service netstat { socket_type wait user server server_args }

= = = = =

stream no root /bin/netstat -ant

e, una volta riavviato xinetd, potremo vericarne come prima il funzionamento, con un telnet sulla porta 15.

8.1.3

I TCP wrappers

In generale la gran parte dei demoni di rete, nati in un periodo in cui internet era una rete costituita principalmente da istituzioni ed enti e laccesso era molto limitato, non provvedono nessun tipo di controllo degli accessi, e permettono a chiunque di collegarsi, da qualunque macchina si trovi. Con lespandersi della rete e la possibilit` di accessi non voluti o maliziosi, ` diventato sempre a e pi` importante poter eettuare un controllo degli accessi; per questo Wietse Wenema, un esperto u di sicurezza, ha creato un insieme di librerie e programmi, chiamati appunto TCP wrappers che permettono di specicare un controllo degli accessi che consente il collegamento a certi servizi

306

CAPITOLO 8. LA GESTIONE DEI SERVIZI DI BASE

solo da parte di certe stazioni o reti, (insomma, una specie di ltro telefonico alla rovescia che impedisce che ci possano chiamare da certi numeri). Le modalit` con cui si possono utilizzare le capacit` di ltraggio dei TCP wrappers sono a a sostanzialmente due. La prima ` quella pi` semplice che vede luso del programma tcpd, da e u cui deriva appunto il nome, che fa da involucro allesecuzione di altri programmi. Esso viene di norma utilizzato attraverso il demone inetd come illustrato in sez. 8.1.1 per lanciare altri programmi, eettua un controllo e se laccesso ` consentito lancia il demone specicato come e argomento. La seconda modalit` ` quella che prevede luso delle librerie di controllo allinterno del demoae ne, che deve essere collegato alle stesse, in modo da poterne usare direttamente le funzionalit`. a Sono esempi di questa modalit` servizi come SSH, LDAP o NFS. a In entrambi i casi le connessioni ai servizi controllati vengono archiviate tramite syslog in modo da lasciare traccia di eventuali tentativi non autorizzati di accesso, dopo di che vengono eseguiti i vari controlli che prevedono. Il controllo di accesso implementato dai TCP wrappers ` gestito attraverso due le, hosts.allow e e hosts.deny, che contengono le regole di accesso, secondo una sintassi specica che ` riportata e per esteso nella pagina di manuale accessibile con man 5 hosts_access. Il primo le, come suggerisce il nome, elenca le regole che negano laccesso, il secondo quelle che lo consentono. Si tenga presente che il funzionamento dei TCP wrappers ` tale che prima viene controllato e hosts.allow, e se una regola corrisponde laccesso ` garantito ed il controllo nisce qui; altrie menti viene controllato hosts.deny e se una regola corrisponde laccesso ` negato. Se entrambi e i le sono vuoti quindi, laccesso ` consentito. e In genere allora quello che si fa ` negare tutti gli accessi in hosts.deny e consentire poi solo e quelli voluti in hosts.allow. Per questo lesempio tipico di hosts.deny ` il seguente: e
# /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

la sintassi delle regole si intravede gi` in questo esempio; al solito righe vuote e tutto quello che a segue un # viene ignorato, ogni riga poi ha la forma: lista dei server: lista dei client : comando shell dove la terza parte (: comando shell) ` opzionale e pu` essere omessa. e o Un altro esempio, pi` signicativo del precedente, ` quello del contenuto di hosts.allow u e riportato di seguito:
# /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.

Nellesempio indicato si sono indicati tre servizi, il primo ` la secure shell, che permette un e collegamento sicuro da remoto, che ` gestita come server dal programma sshd; il secondo ` il e e servizio che permette di tenere un server di news in locale (a scopo di caching), gli altri sono i

8.1. LA GESTIONE DEI SERVIZI GENERICI

307

vari server necessari al funzionamento di NFS (si veda sez. 8.4.1). Lesempio consente laccesso ad ssh, laccesso a NFS per la rete locale, e luso del server di news solo tramite il localhost. In generale per lista dei server si intende il nome (o i nomi, se se ne vuole indicare pi` di u uno) del programma che gestisce lo specico servizio. Occorre fare attenzione, perch il nome ` e e quello del programma che fornisce il servizio, non quello del servizio indicato in inetd.conf. Nella lista dei client si indicano invece gli IP o le reti a cui si vuole consentire laccesso. Per le reti in genere si usa la notazione sia numerica che alfabetica, e si pu` usare una * come wildcard o per raggruppare indirizzi; si pu` anche specicare una netmask con un indirizzo del tipo: o 131.155.72.0/255.255.254.0 e specicare la lista degli indirizzi usando un le dando il pathname assoluto dello stesso. Il formato e la lista completa delle funzionalit` che sono controllabili tramite questi le ` a e riportato nella pagina di manuale ad essi associate, accessibili con man 5 hosts_access. Si tenga comunque conto che alcuni servizi (NFS per esempio) supportano solo un sottoinsieme delle funzionalit` denite in generale. a Per una migliore gestione dei TCP wrapper il relativo pacchetto fornisce anche dei programmi di utilit` che permettono di vericare la congurazione eettuata ed eettuare dei controlli di a accesso. Il primo programma ` tcpdchk che esegue un controllo delle regole di accesso impostate e 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 ` stato e rimosso. Il comando permette di controllare gli hosts.allow e hosts.deny nella directory corrente invece che sotto /etc usando lopzione -d, mentre si pu` specicare un diverso le per inetd.conf o con lopzione -i, la documentazione completa ` al solito disponibile con man tcpdchk. e Il secondo comando di controllo ` tcpdmatch che permette di vericare il comportamento dei e TCP wrapper per una specica richiesta da un servizio. Il comando richiede due parametri, il primo che specichi il servizio che si vuole controllare ed il secondo la stazione da cui si intende eettuare laccesso. Il comando eseguir` una scansione delle regole e riporter` i risultati. Ad a a 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

che controlla laccesso al servizio SSH (si noti che si deve specicare il nome del programma che esegue il servizio) da parte della macchina oppish, trovando che questo ` consentito dalla riga e 14 del le hosts.allow. Il comando rileva anche che il servizio non ` lanciato attraverso inetd e e quale ` lIP eettivo della macchina. e

308

CAPITOLO 8. LA GESTIONE DEI SERVIZI DI BASE

8.2

I protocolli RARP, BOOTP e DHCP

In questa sezione tratteremo vari protocolli utilizzati prevalentemente per la assegnazione automatica dei numeri IP. Il primo, il Reverse Address Resolution Protocol ` stato il primo protocollo e usato a questo scopo, ed ` sostanzialmente in disuso essendo sostituito dagli altri due. Il secone do, il BOOTP, nasce principalmente invece per distribuire via rete immagini di avvio, mentre lultimo, il DHCP, ricomprende tutte queste esigenze allinterno di un unico servizio.

8.2.1

Il protocollo RARP

Il protocollo RARP (sigla che sta per Reverse Address Resolutoin Protocol ), ` un protocollo e elementare, denito nellRFC 903 che, come il nome stesso indica, esegue il compito inverso rispetto al protocollo ARP gi` visto in sez. 7.4.4. Il protocollo ` implementato direttamente a a e livello di collegamento sico (cio` nella maggior parte dei casi su ethernet) e serve ad ottenere, e dato un MAC address sulla rete, lindirizzo IP ad esso associato. Lo scopo del protocollo era principalmente quello di provvedere 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) una richiesta RARP ed utilizza il numero IP fornito come risposta (la cosa presuppone la presenza del relativo server). Tutto ci` oggi, in presenza di altri protocolli pi` sosticati in grado di eseguire sia questo che o u 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` con vecchi a sistemi viene ancora usato questo metodo per lassegnazione degli indirizzi, ci limitiamo a citare la possibilit` compilare il kernel per utilizzare questo supporto. a

8.2.2

Il protocollo BOOTP

Il protocollo BOOTP (da Bootstrap Protocol ), ` denito nellRFC 951 e nasce come protocollo e per gestire lavvio automatico delle macchine. Rispetto al precedente RARP ` basato su IP e e UDP (e non direttamente sul collegamento sico) ed non si limita alla ricerca di un numero IP da assegnare automaticamente ad una scheda di rete, ma prevede anche la richiesta del nome di un le da usare come sistema operativo e dellindirizzo di una macchina a cui rivolgersi per ottenere questultimo. Il protocollo nasce principalmente per fornire un meccanismo con cui macchine senza disco possano eseguire un avvio del sistema via rete, ottenendo questo ultimo (in genere tramite luso del protocollo TFTP,2 anche se possono essere usati altri protocolli) da un opportuno server. In questo caso ` compito del BIOS della macchina implementare la parte client del protocollo (sia e di BOOTP che di TFTP, se poi viene usato questultimo), in modo da ottenere poi limmagine del sistema che verr` caricata in memoria ed eseguita. a Come sottoinsieme delle funzionalit` del protocollo c` ovviamente anche quella della assea e gnazione automatica di un numero IP (il trasferimento dellimmagine del sistema avviene sempre con un altro protcollo che necessita di IP), che ` il motivo per cui lo abbiamo citato. Di nuovo e qualora questa funzionalit` fosse necessaria allavvio di un sistema GNU/Linux (ad esempio per a lavvio di un sistema con la directory radice su NFS) occorrer` compilare il kernel con il relativo a supporto (analogamente a quanto si farebbe per luso di RARP). Nel caso di GNU/Linux il supporto per la parte server del protocollo ` disponibile con e il programma bootpd (su Debian il pacchetto ` bootp) che implementa tutte le funzionalit` e a
il Trivial File Transfer Protocol ` un protocolllo elementare per il trasferimento di le basato su UDP, che e implementa un meccanismo elementare, cos` da essere utilizzabile in programmi estremamente semplicati come quelli che sono contenuti nel BIOS di una macchina.
2

8.2. I PROTOCOLLI RARP, BOOTP E DHCP

309

denite nellRFC 951 e pure le estensioni dei successivi RFC 1532 e RFC 1533. In genere il servizio viene avviato tramite inetd, ma pu` essere eseguito anche in modalit` standalone. o a Il comando prevede come argomento il le da cui leggere le impostazioni, che pu` essere o omesso nel qual caso verr` utilizzato il default che ` /etc/bootptab; questultimo contiene a e tutte le denizione 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 identicati 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 le di avvio. nome del dominio. lista dei server DNS. lista dei gateway. indirizzo sico (MAC address) della macchina. home directory per il le di avvio. hostname da inviare al client. IP da assegnare. pathname della directory da montare come radice. indirizzi del server TFTP da usare. maschera di rete della macchina. directory radice per il server TFTP.

Tabella 8.3: Etichette dei parametri assegnabili in bootptab.

Un elenco delle etichette dei principali parametri usati da bootptab ` riportato in tab. 8.3, e al solito lelenco completo e tutti i dettagli sono nella pagina di manuale.

8.2.3

Il protocollo e la congurazione di un server DHCP

Il protocollo DHCP, sigla che sta per Dynamic Host Conguration Protocol, ` un protocollo e per la congurazione automatica delle reti; il protocollo prevede la possibilit` da parte di una a singola stazione di eettuare delle richieste in broadcast sulla rete locale, alla ricerca di un server al quale chiedere quale indirizzo IP utilizzare. In questo modo lindirizzo IP pu` essere assegnato o dinamicamente, evitando di doverlo specicare con la procedura vista in sez. 7.3 per ciascuna delle macchine. Si pu` cos` centralizzare lassegnazione dei numeri IP, ed inserire anche dei limitati meccanio smi di controllo sulle macchine presenti in rete, sulla base dei MAC address delle varie schede. Si tenga comunque presente che ` sempre possibile assegnare un IP anche senza passare dal server e DHCP, e che ` possibile falsicare i MAC address, quindi il controllo eettuabile ` relativo. e e Oltre per` al servizio di assegnazione dinamica degli indirizzi IP il protocollo provvede anche o i servizi previsti dal precedente BOOTP, del quale implementa, in manier` compatibile allina dietro, tutte le funzionalita. La descrizione completa del protocollo ` ottenibile nellRFC 2131 e che ne denisce tutte le caratteristiche. Dal lato server il protocolle DHCP viene implementato da un apposito demone, il programma dhcpd, che si incarica di ascoltare le richieste e fornire le risposte. Il server ` controllato da un e le di congurazione che di norma ` /etc/dhcpd.conf; un esempio ` il seguente: e e
# # Sample configuration file for ISC dhcpd for Debian # # option definitions common to all supported networks... option domain-name "earthsea.ea";

310

CAPITOLO 8. LA GESTIONE DEI SERVIZI DI BASE

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 le ` relativamente semplice, e assomiglia a quello di named (vedi sez. 9.2.2). e Vale la solita regola che linee vuote e tutto ci` che segue un # viene ignorato. Il contenuto o ` divisibile sommariamente in due categorie di direttive, la specicazione di parametri e le e dichiarazioni. Un esempio di specicazione di parametri sono le righe iniziali che nel caso sono utilizzate per impostare alcuni parametri globali, come il dominio di riferimento o il nameserver, mentre un esempio di dichiarazione ` quello relativo alla denizione delle sottoreti e degli host. e Un elenco delle principali opzioni impostabili come parametri (nella forma option name valore;) ` riportato in tab. 8.4, a queste vanno aggiunte le dichiarazioni dirette dei paramee tri come quelle relative ai tempi massimi per cui vengono mantenute le corrispondenze3 come max-lease-time e default-lease-time che sono specicati in secondi.
Distribuzione domain-name domain-name-servers Comando Specica il nome di dominio in cui ci si trova (ad uso dellimpostazione automatica di resolv.conf). Specica una lista di nameserver (anche questo per limpostazione automatica dei relativi campi in resolv.conf). Imposta la netmask per la rete associata allindirizzo assegnato. Imposta lindirizzo di broadcast per la rete associata allindirizzo assegnato. Imposta il default gateway per la rete associata allindirizzo assegnato.

subnet-mask broadcast-address routers

Tabella 8.4: Opzioni impostabili nel le dhcpd.conf.

Le opzioni possono essere inserite sia direttamente nel corpo principale di dhcpd.conf che allinterno di dichiarazioni. Queste ultime sono sempre nella forma keyword { parameter value; ... } come mostrato per le due dichiarazioni relative una rete ed una stazione mostrate nellesempio a pag. 309. Si noti come il protocollo consenta di dividere gli IP restituiti alle stazioni in sottoreti, nel nostro caso baster` usarne una. La parola chiave subnet specica una sottorete, ed ` a e seguita dallindirizzo della rete e dalla specicazione della relativa netmask. Allinterno della dichiarazione poi si pu` indicare lintervallo di indirizzi assegnati con il parametro range, ed il o relativo router. Si possono anche rispecicare (cambiandole rispetto a quelle generali impostate allinizio del le) le varie opzioni di tab. 8.4.
3 di norma una volta assegnato un numero IP il server mantiene lassociazione con la macchina cui lha assegnato (identicata dal MAC address) per un certo tempo, onde evitare di riassegnare immediatamente lIP ad unaltra macchina in caso di assenza temporanea della prima, cosa che provocherebbe delle interferenze con le cache ARP (vedi sez. 7.4.4) delle macchine sulla stessa rete locale.

8.3. IL SERVIZIO SSH

311

Inne unaltra dichiarazione utile ` quella relativa ad una stazione singola, anchessa mostrata e nellesempio a pag. 8.2.3, introdotta dalla parola chiave host e dal nome della stazione, che permette di assegnare ad una macchina, identicata dal MAC address (specicato dal parametro hardware ethernet), un indirizzo sso (specicato dal parametro fixed-address). Per una lista completa dei parametri si pu` fare riferimento alla pagina di manuale del le o di congurazione accessibile con man dhcpd.conf.

8.2.4

Uso del servizio DHCP dal lato client

Per poter usufruire dei servizi di un server DHCP esistono vari programmi; i pi` comuni e u diusi sono pump e dhclient. Luso di questi programmi ` estremamente semplice la sintassi ` e e rispettivamente: pump -i eth0 oppure: dhclient eth1 eth2 Di norma in fase di congurazione della rete si pu` sempre specicare che lindirizzo di una o interfaccia deve essere ottenuto dinamicamente, nel qual caso ` compito degli script di avvio e della rete chiamare autonomamente uno di questi programmi.

8.3

Il servizio SSH

La sigla SSH sta a signicare Secure SHell, ma in realt` identica un protocollo di comunicazione a che permette di creare un canale di comunicazione cifrato fra due macchine. Bench sia possibile e utilizzare il canale in maniera generica con qualunque tipo di servizio, luso principale di SSH ` e quello di fornire una shell remota per lamministrazione, da cui il nome del servizio.

8.3.1

Il server sshd

Il servizio SSH viene fornito dal demone sshd. Come per gli altri demoni esso di norma viene lanciato automaticamente dagli script di avvio creati in fase di installazione del pacchetto. Il servizio ascolta di default sulla porta 22. In genere i le di congurazione del servizio vengono mantenuti in /etc/ssh/; la congurazione del server ` data dal le sshd_config, un cui estratto e ` riportato di seguito: e
# 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 # Authentication: LoginGraceTime 600 PermitRootLogin yes StrictModes yes RSAAuthentication yes PubkeyAuthentication yes

312

CAPITOLO 8. LA GESTIONE DEI SERVIZI DI BASE

# 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 Subsystem sftp /usr/lib/sftp-server

Si tenga presente che nel nostro caso si fa riferimento alla implementazione del protocollo realizzata dal pacchetto OpenSSH, il programma ssh originale infatti, dopo essere stato rilasciato per un certo tempo con licenza libera, ` diventato proprietario, ma un gruppo di programe matori indipendente ` riuscito, partendo dalla ultima versione libera disponibile, a creare una e implementazione completa del protocollo, che nel frattempo ` stato standardizzato. e Le opzioni principali usate nel le di congurazione, ed il relativo signicato, sono state riportate in tab. 8.5; si sono descritte solo le opzioni che ` pi` probabile che un amministratore e u si trovi a dover modicare, i valori delle altre sono di norma impostati in fase di installazione. Al solito per una descrizione completa delle varie opzioni si pu` fare riferimento alla pagina di o manuale disponibile con man sshd_config.
Opzione Protocol Signicato La versione del protocollo. Deve essere impostata a 2, ` in quanto le precedenti versioni sono insicure. E possibile abilitarle solo a ne di compatibilit`, ma si consiglia a energicamente di aggiornare i client. Permette il login diretto allamministratore. Per default ` disabilitato, il che comporta la necessit` di collegarsi e a come utente normale e poi usare su. Abilita il forwarding delle sessioni X11, cio` la possibilit` e a di esportare il display di X e le nestre da una macchina allaltra attraverso il canale cifrato. Assegna al display X fatto passare attraverso il canale cifrato un oset di 10, cos` da non creare conitti con gli altri display eventualmente presenti in locale. Permette di abilitare laccesso alla macchina con una sintassi simile a FTP, tramite il programma sftp.

PermitRootLogin

X11Forwarding

X11DisplayOffset

Subsystem

Tabella 8.5: Principali opzioni di congurazione per il demone sshd usate nel le sshd_config.

Si tenga presente inoltre che sshd onora la presenza del le /etc/nologin non consentendo, quando esso esiste, la connessione ad utenti che non siano lamministratore, che lutilizzo dei TCP wrappers,

8.3. IL SERVIZIO SSH

313

8.3.2

I comandi ssh ed scp

I due comandi principali di utilizzo di SSH dal lato client sono ssh e scp utilizzati rispettivamente per il collegamento su una macchina da remoto, e per la copia dei le. Per scp ` di norma e disponibile anche un front-end con comandi simili a quelli di FTP, attraverso luso del comando sftp. Prima di entrare nei dettagli dei vari comandi occorre precisare che anche i client sono controllati da un le di congurazione, /etc/ssh_config, un estratto del quale ` riportato di seguito; e di norma, come nellesempio, non ` necessario impostare niente di diverso dai default. Lammie nistratore pu` per` voler imporre delle restrizioni nellaccesso a certe macchine (in particolare o o si pu` disabilitare la possibilit` del forwarding delle sessioni X). o a
# Host * # ForwardAgent no # ForwardX11 no # RhostsAuthentication no # RhostsRSAAuthentication no # RSAAuthentication yes # PasswordAuthentication yes # HostbasedAuthentication no # BatchMode no # 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 ~

Esempi delle possibili opzioni impostabili sono riportati direttamente nellesempio; al solito lelenco completo, la spiegazione delle stesse e i loro possibili valori sono riportati nella pagina di manuale accessibile con man ssh_config. Il comando generico del client ` ssh. La sintassi ha due forme, la pi` semplice, che serve per e u ottenere una shell remota (o eseguire un comando specico), `: e ssh [-l login_name] hostname | user@hostname [command] in cui in sostanza ci si pu` collegare ad un computer remoto con un username e password o (questultima viene richiesta da terminale). Non specicando command si avr` una shell remota, dalla quale inviare comandi come da a un qualunque terminale, altrimenti si pu` specicare un qualunque comando che sar` eseguito o a sulla macchina remota. Una opzione interessante ` la possibilit` di specicare lopzione -X, che e a abilita il forward della sessione X11, permettendo di ricevere sul proprio desktop le nestre delle applicazioni lanciate in remoto. Per le altre opzioni si rimanda di nuovo alla pagina di manuale del comando che ` accessibile con man ssh. e Con il comando scp si pu` invece copiare un le da una macchina ad unaltra attraverso la o rete, usando sempre il canale cifrato, la sintassi ` analoga a quella del comando cp, solo che un e le pu` essere indicato in forma generica da un identicativo del tipo utente@macchina:file o dove utente ` lusername con il quale ci si vuole collegare alla macchina remota, che deve essere e specicato, se non corrisponde a quello con cui si sta lavorando, mentre macchina ` lindirizzo e (numerico o simbolico) di quella macchina, e file il pathname (assoluto o relativo alla home dellutente usato) del le in questione su quella macchina. Cos` se si vuole copiare un le da una macchina remota si potr` eseguire un comando del a tipo:

314

CAPITOLO 8. LA GESTIONE DEI SERVIZI DI BASE

scp [email protected]:netadmin.pdf . che copia il le netadmin.pdf dalla mia home sul server alla directory corrente, mentre per eettuare un trasferimento in direzione opposta si potr` usare: a scp -r gapil [email protected]:public_html/ che copia ricorsivamente il contenuto della directory gapil nella directory public_html della mia home sul server (che ` quella pubblicata su web tramite Apache). e Il comando richiede ovviamente limmissione da terminale della password relative allutente delle macchine a cui ci si collega, dopo di che eettua la copia; lopzione -p permette di preservare i tempi ed il modo del le originale, mentre lopzione -r esegue una copia ricorsiva di intere directory. Al solito per i dettagli su tutte le altre opzioni si pu` fare riferimento alla pagina di o manuale accessibile con man scp.

8.3.3

Autenticazione a chiavi

Una delle caratteristiche pi` interessanti del protocollo ` quella di consentire, rispetto alla classica u e autenticazione con password identica a quella ottenibile su un terminale classico, la possibilit` a di utilizzare una autenticazione basata su chiavi crittograche. Questo permette una serie di semplicazione delluso dei comandi, come la possibilit` di creare delle sessioni in cui, data una a password allinizio, diventa possibile evitare di riscriverla tutte le volte che si utilizza uno dei comandi ssh o scp. La tecnica utilizzata ` quella delle chiavi asimmetriche, che possono essere sia di tipo RSA che e DSA. 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 usata del server come identicatore dello stesso. La trattazione della crittograa a chiave simmetrica va al di l` di quanto sia possibile arontare in questo contesto, basti sapere che le chiavi asimmetriche a sono generate in coppie e che un messaggio cifrato con una delle due chiavi pu` essere decifrato o solo dallaltra. Per questo in genere si distribuisce una delle due chiavi della coppia, la chiave pubblica, in modo che solo chi possiede laltra, la chiave privata possa decifrare i messaggi creati con la prima. Nel caso specico il protocollo prevede comunque luso di chiavi simmetriche in fase di negoziazione della connessione via SSH; ciascun capo della connessione fornisce allaltro la propria chiave pubblica, dopo di che i due si potranno scambiare in maniera cifrata una chiave di sessione con cui sar` crittato tutto il successivo scambi di dati. Per maggiore sicurezza questa a chiave viene cambiata periodicamente (secondo quanto specicato per il server con il parametro di congurazione KeyRegenerationInterval). Nel caso di autenticazione a chiave quello che succede ` che il server invia al client un segreto e cifrato con la chiave pubblica dellutente cui si vuole garantire laccesso, solo il reinvio del segreto decifrato ` garanzia che il client conosce la chiave privata, che ` quello che garantisce lautenticit` e e a dellidentit` dellutente. a Per poter utilizzare questa modalit` di autenticazione occorre anzitutto generare una coppia a di chiavi; il pacchetto OpenSSH mette a disposizione un apposito programma per la creazione e la gestione delle chiavi, ssh-keygen, la cui sintassi, come risulta dalla pagina di manuale, ` la e seguente: ssh-keygen [-q] [-b bits] -t type [-N new_passphrase] [-C comment] [-f output_keyfile] ssh-keygen -p [-P old_passphrase] [-N new_passphrase] [-f keyfile] ssh-keygen -c [-P passphrase] [-C comment] [-f keyfile]

8.3. IL SERVIZIO SSH

315

Se invocata senza nessuna opzione il comando stampa un messaggio di aiuto, per eseguire la creazione di una nuova coppia di chiavi occorre infatti specicare 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 (la versione 1, adesso in disuso perch e insicura). Se non si specica nientaltro il comando chiede il le in cui salvare la chiave, che di default ` nella directory .ssh nella home directory dellutente, con un nome che pu` essere id_dsa o e o id_rsa a seconda del tipo della chiave (o identity per le chiavi del vecchio protocollo), ed inne una passphrase che serve a proteggere laccesso alla chiave privata, che non pu` essere o letta senza di essa. Il comando crea anche la rispettiva chiave pubblica, con lo stesso nome usato per quella privata ma con un .pub terminale. Si pu` specicare un nome diverso anche a riga o di comando usando lopzione -f seguita dal nome del le. Se si vuole cambiare la passphrase in un secondo tempo si pu` usare lopzione -p, alla chiave o ` pure associato un commento, che non ha nessun uso nel protocollo, e serve solo da identicativo e della chiave; esso viene di solito inizializzato alla stringa user@host e pu` essere cambiato con o lopzione -c. Con lopzione -l invece si pu` stampare la ngerprint della chiave (a scopo di o verica); inne lopzione -b permette di specicare la lunghezza della chiave (in bit); il valore di default, 1024, ` pi` che adeguato. I dettagli sul funzionamento del comando e le restanti opzioni e u sono accessibili nella pagina di manuale con man ssh-keygen. Una volta creata la coppia di chiavi diventa possibile utilizzarla per lautenticazione. Per far questo occorre inserire la chiave pubblica della persona a cui si vuole dare laccesso nel le .ssh/authorized_keys posto nella home dellutente per conto del quale si acceder`. Il le pu` a o 4 per cui si deve eettuare laggiunta con contenere un numero imprecisato di chiavi pubbliche, un comando del tipo: cat id_dsa.pub >> .ssh/authorized_keys (si suppone di essere nella home dellutente che da laccesso) dove id_dsa ` la chiave dellutente e che deve poter accedere. Si tenga presente che, come accennato, in questo caso essa viene eettuata solo sulla base della corrispondenza fra una chiave pubblica ed una chiave privata, non ` necessario che il nome dellutente sia lo stesso, tutto quello che serve ` la presenza della e e coppia di chiavi, la pubblica per lutente che concede laccesso, e la privata per quello che deve accedere. Il procedimento pu` essere eseguito direttamente con il comando ssh-copy-id, che si o cura di aggiungere adeguatamente la chiave nellauthorized_keys di una macchina destinazione con: ssh-copy-id [email protected] Dunque la protezione della chiave privata ` essenziale, chiunque ne venga in possesso e possa e utilizzarla ottiene immediatamente tutti gli accessi a cui essa ` abilitata, e questo ` il motivo e e per cui essa viene protetta con una passphrase, che deve essere fornita tutte le volte che la si deve usare. Essa comunque deve essere protetta sia da lettura che da scrittura da parte di estranei. Questo ` imposto dallo stesso comando, che si riuta di usare (stampando un clamoroso e avvertimento) una chiave privata leggibile da altri rispetto al proprietario. A questo punto per` ci si potrebbe chiedere lutilit` di tutto questo armamentario, dato che o a invece di una password per il login bisogna comunque inserire una passphrase per sbloccare la chiave pubblica; lutilit` sta nel fatto che ` possibile usare un altro programma, ssh-agent, a e 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.
le chiavi sono mantenute una per riga, in formato codicato ASCII, per cui le singole righe sono di norma molto lunghe.
4

316

CAPITOLO 8. LA GESTIONE DEI SERVIZI DI BASE

Lidea ` che ssh-agent dovrebbe essere lanciato allinizio di una sessione, dopo di che tutti i e comandi verranno lanciati come client di esso cosicch questi possano interrogarlo tutte le volte e che ` necessario compiere una operazione con la chiave privata. Sar` comunque ssh-agent ad e a 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 grache; 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` la passphrase della chiave privata e la sbloccher`, a a inviandola allagent che da quel momento in poi potr` utilizzarla. a Per poter poter comunicare con ssh-agent i vari programmi usano la variabile di ambiente SSH_AUTH_SOCK che identica il socket locale su cui esso ` in ascolto; se questa non ` denita e e anche se il programma ` attivo lautenticazione a chiavi non funzioner` (e si passer` direttamente e a a alla autenticazione normale). La variabile ` denita dallo stesso ssh-agent quando viene lanciato e (che la stampa anche sullo standard output). Si ricordi per` che le variabili di ambiente deninte o da un processo vengono viste soltanto nei processi gli (per questo la shell prevede il comando export), pertanto quandi si lancia ssh-agent in console, questo rester` attivo in background, a ma ntanto che non si inserir` manualmente la variabile SSH_AUTH_SOCK nellambiente, non a potr` essere utilizzato. a

8.4

Il protocollo NFS

Il protocollo NFS, sigla che sta a signicare Network File System, ` stato creato da Sun per e permettere montare dischi che stanno su stazioni remote come se fossero presenti sulla nostra macchina. In questo modo si pu` assicurare un accesso trasparente ai le, e si pu` utilizzare un o o lesystem anche su una macchina senza dischi, passando solo attraverso la rete.

8.4.1

Il server NFS

In genere tutte le distribuzioni prevedono i pacchetti per linstallazione di un server NFS. La sola scelta che si pu` dover fare ` fra luso del supporto nel kernel o luso di una implementazioo e ne realizzata completamente in user-space, che per le sue peggiori prestazione ` comunque da e evitare. Per questo occorrer` avere abilitato il supporto nel kernel, cosa che vale in genere per i kernel a standard di tutte le distribuzioni. Qualora si ricompili un kernel da soli occorrer` vericare che a siano abilitate in .config le seguenti opzioni: CONFIG_NFS_FS=m CONFIG_NFS_V3=y CONFIG_NFSD=m CONFIG_NFSD_V3=y accessibili con make menuconfig dal men` File system nel sotto men` Network File System. u u Il protocollo NFS ` piuttosto complesso, ed ` basato sul sistema delle RPC (Remote Procedure e e Call ), un meccanismo di intercomunicazione generico basato sui protocolli di trasporto (TCP e UDP), che permette ai processi di accedere a dei servizi (nella forma di chiamate a procedure esterne) in maniera trasparente rispetto alla rete. Ciascun servizio ` fornito da un apposito e demone, in ascolto su una porta generica: un programma che lo voglia utilizzare deve prima rivolgersi al cosiddetto portmapper che registra i servizi attivi ed ` in grado di indicare la porta e su cui sono forniti.

8.4. IL PROTOCOLLO NFS

317

Il servizio del portmapper ` realizzato dal demone portmap, ` lunico cui viene assegnata e e una porta denita, la 111, che corrisponde al servizio chiamato sunrpc. Al funzionamento di NFS, oltre a portmap, concorrono ben altri cinque demoni: rpc.nfsd rpc.statd rpc.lockd ` il demone che svolge la gran parte del lavoro, realizzando le funzioni di accesso e al contenuto dei le. Deve essere lanciato dopo che ` stato attivato portmap. e ` il demone che gestisce le caratteristiche dei le come tempi di accesso, permessi, e ecc. Deve essere lanciato dopo che ` stato attivato portmap. e ` il demone che gestisce, quando questo ` abilitato, il le locking. Di norma viene e e lanciato da rpc.nfsd in caso di necessit`. a

rpc.mountd ` il demone che gestisce le richieste di montaggio del lesystem. Deve essere e lanciato dopo che sono stati attivati rpc.nfsd e rpc.statd. rpc.rquotad ` il demone che permette, quando sono attivate, di gestire le quote sul lesystem e di rete. Deve essere lanciato dopo che sono stati attivati rpc.nfsd e rpc.statd. Bench complicato da descrivere dal punto di vista funzionale un server NFS ` in genere e e molto semplice da congurare. Infatti di norma il servizio viene avviato automaticamente dagli script di avvio installati dai pacchetti, e tutto quello che c` da congurare ` il le /etc/exports e e che denisce su ciascuna macchina quali sono le directory da esportare verso lesterno e chi ha la facolt` di utilizzarle; un esempio del le ` il seguente: a e
# /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/24(rw)

Il le prende una serie di campi separati da spazi o tabulazioni; il primo campo specica la directory da condividere, i campi successivi deniscono chi e come pu` utilizzarla. Si pu` o o specicare, come nellesempio, sia una singola stazione, che una rete (usando la notazione CIDR) si possono usare anche indirizzi simbolici (che in questo caso devono poter essere risolti) nel qual caso si possono usare i caratteri wildcard * e ? per esprimere i nomi. Fra parentesi tonde poi si possono specicare le modalit` di accesso; il formato generale di una riga ` il seguente: a e /path/to/directory machine1(option11,option12) machine2(option21,option22) dove il separatore ` costituito dallo spazio.5 e 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` di accesso ai le, rw e ro, che a 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.6 Quando si esporta una directory si pone il problema dellaccesso ai le, infatti il protocollo associa i le agli utenti ed ai gruppi cos` come sono impostati sul server, utilizzando rispetti vamente i relativi uid e gid, ed utente sul client potr` avere accesso ai le solo qualora questi a corrispondano. In alcuni casi per` occorrono delle eccezioni, ad esempio non ` desiderabile o e
attenzione quindi a non specicare le opzioni inserendo uno spazio fra il nome della macchina e le parentesi che le delimitano, in tal caso infatti esse verrebbero considerate come un nuovo indirizzo. 6 questa opzione ` disabilitata di default, in quanto in caso di crash del server le modiche andrebbero perse. e Il comando exportfs notica se nessuna di queste due opzioni ` stata impostata, avvisando che sar` usata sync e a di default.
5

318

CAPITOLO 8. LA GESTIONE DEI SERVIZI DI BASE

che lamministratore di un client sia trattato come root anche nellaccesso ai le del server. Per questo motivo di default ` attiva lopzione root_squash che rimappa gli uid e gid 0 usati e dallamministratore (root) sul valore 65534 (2), corrispondente rispettivamente a nobody e nogroup. I nomi delle opzioni principali ed il relativo signicato sono riportati in tab. 8.6, lelenco completo delle opzioni ` riportato nella pagina di manuale accessibile con man exports. e
Opzione rw ro async sync root_squash no_root_squash all_squash anonuid anongid Signicato 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.6: Possibili opzioni per le directory esportate tramite NFS nel le /etc/exports.

Per controllare i lesystem che si sono esportati si pu` usare il comando exportfs. La o sintassi del comando, come descritta dalla pagina di manuale `: e /usr/sbin/exportfs /usr/sbin/exportfs /usr/sbin/exportfs /usr/sbin/exportfs [-avi] [-o options,..] [client:/path ..] -r [-v] [-av] -u [client:/path ..] [-v]

Di norma vengono esportati tutti i lesystem elencati in /etc/exports con il comando exportfs -a; qualora si modichi /etc/exports si pu` usare il comando exportfs -r per o sincronizzare la tabella dei lesystem esportati con i contenuti del le. Inne con lopzione -u si pu` rimuovere uno dei lesystem esportati, mentre con -o si possono cambiare le opzioni. I o dettagli si trovano al solito nella pagina di manuale, accessibile con man exportfs. Si tenga conto inne che i vari demoni che forniscono il servizio hanno il supporto per i TCP ` wrapper, quindi onorano le restrizioni descritte in sez. 8.1.3. E buona norma, visto la delicatezza del servizio fornito, 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` avere il supporto nel kernel, ed oltre a portmap a dovranno essere attivi i due demoni rpc.statd e rpc.lockd. Inoltre si deve avere una versione sucientemente recente del comando mount che sia in grado di montare un lesystem NFS. Come per il lato server di norma lutilizzo ` molto semplice e si esaurisce nel montare il e lesystem 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 lesystem NFS ` comunque estremamente semplice, invece di indicare un dispoe sitivo baster` indicare lindirizzo (simbolico o numerico) del server seguito da : e dalla directory a che si vuole montare (che dovr` essere presente e accessibile nel le /etc/exports del server). a Se si vuole eseguire il comando a mano baster` eseguire mount con una sintassi del tipo: a
[piccardi@hogen]# mount -t nfs havnor:/home/piccardi/share /mnt/nfs

Si pu` poi denire un mount point permanente in /etc/fstab aggiungendo una riga del o tipo:

8.5. LA CONDIVISIONE DEI FILE CON SAMBA 192.168.1.1:/home/piccardi/temp /mnt/nfs nfs user,exec,noauto 0 0

319

dove la dierenza con un lesystem su disco ` luso di nfs come lesystem type e lindirizzo della e directory da montare al posto del le di dispositivo. Per ulteriori dettagli riguardo il protocollo e le opzioni pi` avanzate si possono consultare le u pagine di manuale dei vari comandi e le di congurazione. Si tenga inne conto di un problema che pu` sorgere con luso di NFS. Il protocollo supporta o un lesystem di rete di tipo Unix, prevede pertanto permessi e proprietari dei le, il problema ` e che i proprietari dei le sono riconosciuti sulla base degli user-id deniti sul server. Pertanto se sul client lutente relativo non esiste o ha un user-id diverso (cosa possibile, se non si sono creati gli utenti nella stessa sequenza) la titolarit` dei le non corrisponder`, e si avranno problemi. a a Pertanto luso di NFS richiede una certa cura nella gestione di utenti e gruppi.

8.5

La condivisione dei le con Samba

La suite Samba ` un insieme di programmi che permette ad una macchina Unix di utilizzare e il protocollo di comunicazione SMB (Service Message Block ) dei server Windows. Originariamente il servizio veniva fornito attraverso il protocollo proprietario NetBIOS usato da Windows come protocollo di trasporto; a questo livello il protocollo ormai ` in disuso, ed attualmente ` e e implementato direttamente su TCP/IP.

8.5.1

La congurazione di Samba come server

Limplementazione dei servizi SMB ` realizzata da Samba attraverso due demoni, smbd che e implementa la condivisione dei le e delle stampanti e nmbd che implementa i servizi NetBIOS (cio` il riconoscimento della presenza di server sulla rete, la risoluzione dei nomi, ecc.). e Lavvio del servizio ` generalmente curato dagli opportuni script di avvio creati in fase di ine stallazione del pacchetto, che ciascuna distribuzione inserisce allinterno del proprio meccanismo di boot. Nel caso di Debian ad esempio questo ` gestito dallo script /etc/init.d/samba. e Entrambi di demoni vengono congurati tramite il le smb.conf. La sintassi ` quella dei le e .ini di Windows, ma viene supportata pure la sintassi dei commenti inizianti per # di Unix. Un estratto di questo le, preso dalla installazione di una Debian, ` il seguente: e
[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 directory mask = 0700 [printers]

320
comment = All Printers browseable = no path = /tmp printable = yes public = no writable = no create mode = 0700

CAPITOLO 8. LA GESTIONE DEI SERVIZI DI BASE

Il le ` diviso in sezioni distinte introdotte da un nome in parentesi quadra, ciascuna delle e quali descrive una risorsa condivisa attraverso SMB (quello che viene chiamato uno share). Sono per` previste tre sezioni speciali, [global], [homes], e [printers] che non corrispondono a o degli share, ma servono ad impostare alcune funzionalit` generiche. Allinterno di una sezione i a 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 denisce il nome del dominio NT in cui gurer` la macchina e security che denisce le modalit` di accesso al server (e pu` assumere i a a o valori user, share, server e domain), di norma (a meno di non avere un accesso anonimo, nel qual caso si pu` usare share) si utilizza come valore user che richiede che esista un utente Unix o per ciascun utente che si collega al server. Gli altri due valori servono quando si vuole dirottare la richiesta di autenticazione. In tab. 8.7 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 le fornito dai pacchetti di installazione, vengono impostati valori ragionevoli adatti agli usi pi` comuni. Una spiegazione dettagliata va al di l` dello scopo di questo corso. u a 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 denite, e qualora non sia stata trovata nessuna corrispondenza la sezione richiesta viene trattata come un username da controllare sul le delle password locali. Se lutente esiste ed ` stata data una e password corretta viene creato al volo il corrispondente share con le caratteristiche impostate in questa sezione. Tutto questo funziona in maniera immediata solo quando si ` impostato il parametro encrypt e password a false, altrimenti diventa necessario creare lopportuno supporto perch Samba possa e mantenere gli utenti e relative password. I client infatti (come semplici client Windows) non sono in grado di inviare password con un hash in formato UNIX, ed ` pertanto impossibile eseguire e un confronto diretto con il contenuto di /etc/passwd; la cosa diventa possibile solo quando la password viene inviata in chiaro, nel qual caso ` il server ad operare il confronto. Torneremo e sullautenticazione degli utenti in sez. 8.5.2. 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 le /etc/printcap per vericare se contiene una stampante con il nome richiesto, ed in caso positivo viene creato al volo il relativo share. Viene comunque usata lautenticazione degli accessi appena esposta. Per aggiungere uno share ` pertanto suciente denire una nuova sezione; ad esempio si e potr` inserire in coda al le mostrato in precedenza una ulteriore sezione del tipo: a [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. Laccesso richieder` un username ed una password, a meno che non si a sia indicata una ulteriore riga del tipo guest ok = yes, nel qual caso sar` consentito laccesso a

8.5. LA CONDIVISIONE DEI FILE CON SAMBA


Parametro security Signicato Il parametro stabilisce le modalit` di accesso al server. Il a valore di default ` user che richiede un username ed una e ` password per garantire laccesso. E necessaria la presenza di un corrispondente utente sulla macchina. Denisce il gruppo di lavoro di cui il server far` para te (quello che ` il nome di dominio NT, detto anche e workgroup name). Utilizza una autenticazione basata su password cifrate, limpostazione di default ` true in quanto corrispondente e al rispettivo default di Windows 98 e NT. Se attivato necessita la presenza dellautenticazione basata sul le smbpasswd. Specica lutente utilizzato per laccesso ospite (cio` sene za 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 specica sempre root. Specica delle opzioni relative al comportamento del sistema nei confronti della rete. Specica la lista dei supporti vengono mantenute le password. Quando il server ` usato per la risoluzione dei nomi, passa e le richieste non risolte al DNS. Se specicato il server tenta di sincronizzare le password UNIX quando si ` cambiata nel le smbpasswd. e 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 ` possibile connettersi e al server.

321

workgroup

encrypt passwords

guest account

invalid users socket options passdb backend dns proxy unix password sync wins support wins server host allow

Tabella 8.7: Signicato dei parametri globali per Samba, come impostati nella sezione [globals] di /etc/smb.conf.

senza password, con lutente specicato da guest user. Luso della direttiva browseable = yes permette di far apparire il nuovo share nella lista pubblica mostrata dal Network Neighborhood di Windows. In ogni caso gli eettivi permessi disponibili su /home/bar saranno quelli previsti dal sistema per lutente con cui ci si ` connessi, il server non pu` in nessun caso garantire maggiori permessi e o di quelli forniti dal sistema, pu` invece ridurli, ad esempio impostando read only = yes. o Per maggiori informazioni si pu` consultare il Samba-HOWTO, tutti i dettagli della cono gurazione 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 le di congurazione per rilevarne eventuali errori. Il comando smbstatus inoltre permette di controllare lo stato delle connessioni.

8.5.2

Limpostazione degli utenti

Abbiamo gi` accennato come uno dei servizi forniti da Samba sia quello della autenticazione a degli utenti; questo si sovrappone in maniera spesso non banale con lo stesso servizio fornito dal sistema di autenticazione nativo di Linux, ad esempio abbiamo visto in sez. 8.5.1 riguardo la necessit` di inviare in chiaro le password, se si vuole che lautenticazione degli share creati a automaticamente nelle home directory degli utenti sia eseguita contro il le /etc/passwd. Inviare password in chiaro sulla rete non ` mai una buona cosa, pertanto ` opportuno abilitare e e

322

CAPITOLO 8. LA GESTIONE DEI SERVIZI DI BASE

sempre luso delle password cifrate, questo per` comporta che sia il server a dover eettuare da o solo lautenticazione, con un protocollo compatibile con Windows, per questo dovr` essere in a grado di mantenere un elenco di utenti e password in maniera indipendente da quello del sistema ospite. I supporti per lautenticazione sono vari, il pi` semplice ` luso del le smbpasswd, che viene u e abilitato specicando come valore del parametro di congurazione passdb backend il valore smbpasswd. Questo le contiene gli hash in formato Windows delle password di ciascun utente che cerca di collegarsi al server; il formato del le ` analogo a quello di passwd, una riga per e ogni utente con campi separati da ":", il primo campo specica il nome utente ed il secondo il suo uid, che devono corrispondere agli analoghi in passwd, seguono due hash crittograci in formato diverso, poi dei ag per laccount, identicati da lettere fra parentesi quadra e inne la data di ultima modica della password. Il formato ` descritto in dettaglio nella pagina di e manuale accessibile con man 5 smbpasswd. Un secondo supporto possibile ` quello di un piccolo database binario, che in macchine con e molti utenti permette di velocizzare notevolmente le operazioni di scansione, in tal caso i dati verranno memorizzati nel le passdb.tdb e si dovr` indicare per passdb backend il valore a ` tdbsam. E inne usare come supporto LDAP, nel qual caso il valore da usare ` ldapsam. e Di norma la creazione del le di supporto per lautenticazione deve essere eseguita esplicitamente dallamministratore di sistema, ed i singoli utenti devono essere aggiunti al sistema. Non essendo infatti possibile ricavare la password degli stessi dallhash mantenuto in /etc/passwd non esiste una modalit` di replicazione automatica dei contenuti di questultimo. Pertanto a lamministratore dovr` inserire i singoli utenti a mano con comandi del tipo: a smbpasswd -a utente il comando chieder` la nuova password (due volte per evitare errori di battitura) ed aggiunger` a a lutente, che deve essere gi` presente nel sistema, allinterno dellopportuno supporto. Lopa zione -a che permette di aggiungere un utente, cos` come lopzione -x che lo cancella, e -e e -d che rispettivamente lo abilitano e disabilitano temporaneamente, possono essere usate solo dallamministratore. Lo stesso vale per -n che permette di impostare una password nulla. Lutente normale pu` usare lo stesso comando per modicare la sua password, nel qual o caso dovr` comunque fornire quella precedente. Al solito lelenco completo delle opzioni (il a comando consente pure di cambiare la propria password su un server remoto e quella sul LDAP) ` disponibile nella pagina di manuale, accessibile con man smbpasswd. e

8.5.3

Luso di Samba dal lato client

Luso principale di Samba ` permettere la condivisione di le e stampanti su una macchina e Unix da parte di client Windows. Da questo punto di vista Samba ` completamente trasparente e allutente, che dovr` semplicemente cercare fra le risorse di rete i servizi messi a disposizione dal a server Samba. La suite per` comprende anche alcuni programmi per poter utilizzare da GNU/Linux i servizi o presenti su un server Windows (o unaltro server Samba, anche se in questo caso sarebbe pi` u opportuno utilizzare le applicazioni native Unix). Il primo programma ` smbclient, che permette di connettersi ad un server SMB con una ine terfaccia simile a quella di FTP. La sintassi del comando come riportata dalla pagina di manuale, `: e smbclient servicename [ password ] [ -b <buffer size> ] [ -d debuglevel] [ -D Directory ] [ -U username ] [ -W workgroup ] [ -M <netbios name> ] [ -m maxprotocol ] [ -A authfile ] [ -N ] [ -l logfile ] [ -L <net- bios name> ] [ -I destinationIP ] [ -E ] [ -c <command string> ]

8.5. LA CONDIVISIONE DEI FILE CON SAMBA

323

[ -i scope ] [ -O <socket options> ] [ -p port ] [ -R <name resolve order> ] [ -s <smb config file> ] [ -T<c|x>IXFqgbNan ] dove in generale servicename ` specicato nella forma //server/service e la password pu` e o essere omessa nel qual caso sar` richiesta allesecuzione del comando. a Lopzione principale ` -U che permette di specicare il nome utente (relativo al server) e con il quale ci si vuole connettere al servizio. Per i dettagli relativi alle altre opzioni si pu` o fare riferimento alla pagina di manuale, accessibile con man smbclient, che riporta anche vari esempi. Un altro comando importante ` smbmount, che permette di montare uno share di Windoe ws allinterno del lesystem di Linux. Richiede il supporto nel kernel del lesystem SMB (di solito presente in tutte le distribuzioni standard, e comunque attivabile nella sezione Network filesystem dei men` di congurazione). La sintassi del comando `: u e smbmount service mount-point [ -o options ] ma lo si pu` invocare indirettamente attraverso mount specicando lopzione -t smbfs. Un o analogo comando smbumount permette di smontare un lesystem smbfs. La sintassi ` molto semplice, service si specica nella stessa forma //server/service usate e per smbclient, mentre il mount point ` una qualunque directory locale. Le opzioni sono sempre e nella forma keyword=valore, lopzione pi` importante ` username che permette di specicare, u e nella forma user/work-group%password, utente, workgroup e relativa password con la quale accedere allo share di Windows. Per i dettagli si pu` consultare la pagina di manuale accessibile o con man smbmount.

324

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 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 ` uno dei protocolli fondamentali per il funzionamento di internet, e come gi` accennato e a in sez. 7.6 si tratta in realt` di un enorme database, distribuito su un gran numero di nameserver a (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 le che conteneva tutte le corrispondenze fra numeri IP ed nomi. Col crescere della rete questo approccio ` rapidamente divenuto insostenibile, e non tanto e non solo per le dimensioni crescenti del le, quanto per la quasi impossibilit` di a mantenerlo aggiornato. Per questo ` stato creato il protocollo del DNS, il cui scopo era quello e di poter distribuire il compito di associare un indirizzo simbolico ad uno numerico, e di eseguirlo in maniera veloce ed eciente. Il funzionamento del DNS ` sostanzialmente basato su un meccanismo chiamato delegazione: e si sfrutta la suddivisione gerarchica dello spazio dei nomi, in domini di primo livello (i .com, .org, .it, ecc.) di secondo livello (google.com, softwarelibero.org, truelite.it) ecc. per distribuire il carico delle richieste di risoluzione, passandole attraverso una gerarchia di server, in cui, in corrispondenza a ciascun livello, un server che non ` in grado di rispondere alla richiesta, e sa per` qual` il server del livello successivo a cui reinviare la richiesta. o e Il meccanismo con il quale viene eseguita la risoluzione di un nome a dominio, ad esempio sources.truelite.it, ` il seguente: quando ci si rivolge ad un nameserver (ad esempio quello e del provider) questo controlla anzitutto se ha in cache la risposta, nel qual caso risponde immediatamente, altrimenti va a cercare, sempre nella cache, se ha lindirizzo di uno dei server che gli pu` rispondere, salendo lungo la gerarchia dei domini. Nella peggiore delle ipotesi, in cui o non sa a chi chiedere n per .truelite.it n per .it il server si dovr` rivolgere a quelli che e e a sono chiamati i root DNS, che permettono di risolvere i domini di primo livello. La lista degli indirizzi IP di questi server ` pubblicata ed aggiornata periodicamente ed ogni server DNS deve e sempre essere in grado di contattarli. La ricerca avviene quindi ricorsivamente, con una scansione dellalbero dei domini: alla radice si contatter` un root DNS chiedendogli chi ` il server responsabile per il dominio di a e primo livello .it. I domini di primo livello sono deniti a livello internazionale dalla cosiddetta naming authority, e la lista dei relativi nameserver ` mantenuta direttamente nei root DNS. A e 325

326

CAPITOLO 9. IL SERVIZIO DNS

questo punto la scansione proseguir` ripetendo la richiesta per .truelite.it al DNS di primo a livello appena trovato; essendo compito di questo server conoscere tutti quelli di secondo livello, sar` in grado di indicarvi qual` il server DNS responsabile per .truelite.it a cui chiedere la a e risoluzione di sources.truelite.it. In tutti questi passaggi il server DNS che avete interrogato memorizzer` le varie informazioni nella sua cache, in modo da evitare una ulteriore richiesta ai a root DNS se ad esempio volete risolvere www.softwarelibero.it. Questo meccanismo permette di distribuire in maniera ecace il compito di fornire le risposte e di mantenere aggiornata la corrispondenza fra nomi ed indirizzi IP, in quanto alla ne ` il e responsabile di ciascun dominio nale a dover mantenere un DNS che contenga le informazioni relative alle sue macchine. Inoltre il meccanismo del caching dei risultati permette di aumentare lecienza della ricerca, evitando di ripetere pi` volte le stesse operazioni. Ovviamente questo ha u anche un costo, in quanto se viene eseguito un cambiamento in una associazione nome-indirizzo questo non verr` visto dagli altri server ntanto che c` unaltra associazione valida nella loro a e cache. Per questo tutte le informazioni del DNS sono corredate da un tempo di scadenza, da impostare opportunamente a seconda delle frequenze con cui esso pu` cambiare, che permettono, o con tempi pi` o meno rapidi a seconda di quanto impostato, di propagare i cambiamenti su tutta u la rete. Il concetto fondamentale del protocollo del DNS ` quello delle cosiddette zone di autorit`, e a cio` delle parti dello spazio dei nomi di dominio per i quali un singolo nameserver ha una risposta e diretta. In generale i server di livello pi` alto non conoscono, a meno che questa non sia nella u loro cache, la risposta a richieste come sources.truelite.it, perch delegano lautorit` per e a le varie zone di cui ` composto il dominio ad altri server, che a loro volta possono eettuare e ulteriori delegazioni per quanto loro assegnato. Cos` i root DNS delegano lautorit` per i domini a di primo livello ai relativi nameserver, e questi a loro volta a quelli di secondo livello e cos` via. Questo meccanismo introduce anche una distinzione fra le risposte, che sono dette autoritative o meno, a seconda che provengano direttamente dal nameserver che ha lautorit` per quella a richiesta o dalla cache di un qualche altro server.
Tipo A NS CNAME SOA PTR MX TXT AAAA SRV Descrizione una corrispondenza nome indirizzo IP un nameserver per la zona nome alternativo (un alias ad un altro nome) inizio zona per il quale si ha autorit` a una corrispondenza indirizzo nome un server di posta un commento o altro testo una corrispondenza nome indirizzo IPv6 la locazione di un servizio noto

Tabella 9.1: Descrizione ed identicativo per alcuni tipi di record usati dal protocollo DNS.

Si tenga presente inoltre che il protocollo DNS permette di inserire in questo database distribuito vari tipi di informazione, come il server che riceve la posta inviata ad un dominio, le informazioni che dicono se esistono altri nameserver per domini di livello inferiore, corrispondenze con indirizzi diversi da quelli IP (ad esempio indirizzi IPv6), ecc. Per questo motivo esistono vari tipi di record che possono essere gestiti inseriti in un DNS; un elenco dei principali tipi ` e riportato in tab. 9.1, un elenco completo si pu` trovare nella pagina di manuale del comando o host.

9.1.2

I comandi host e dig

Il comando host permette di interrogare un nameserver. La sintassi del comando, cos` come ` e riportata nella pagina di manuale ` la seguente: e

9.1. IL FUNZIONAMENTO DEL SERVIZIO DNS host host host host host [-v] [-v] [-v] [-v] [-v] [-a] [-t querytype] [options] name [server] [-a] [-t querytype] [options] -l zone [server] [options] -H [-D] [-E] [-G] zone [options] -C zone [options] -A host

327

host [options] -x [name ...] host [options] -X server [name ...] e come si pu` notare il comando ` in grado di eettuare diversi tipi di interrogazione. o e In genere luso pi` comune del comando ` per vericare che limpostazione della congurau e zione del resolver funzioni davvero. Accade spesso infatti che la rete funzioni, ma non si riesca a fare nulla perch gli indirizzi simbolici non vengono risolti (ad esempio si ` sbagliato ad indicare e e il nameserver in resolv.conf); un esempio del comando `: e
[piccardi@havnor piccardi]$ host www.linux.it www.linux.it CNAME picard.linux.it picard.linux.it A 62.177.1.107

che ci dice che lindirizzo www.linux.it ` risolto come corrispondente allIP 62.177.1.107. e Loutput del comando mostra anche il tipo di record restituito, nel caso un record di tipo CNAME, relativo al nome richiesto, che ci reinvia al nome principale della macchina, ed un record di tipo A per questultimo che lo associa al relativo indirizzo. Il comando funziona anche alla rovescia, si pu` cio` trovare lindirizzo simbolico a partire da quello numerico con: o e
[piccardi@havnor piccardi]$ host 62.177.1.107 Name: picard.linux.it Address: 62.177.1.107

e si noti come in questo caso il nome riportato sia picard.linux.it, che ` diverso da www.linux.it, e in quanto riporta una macchina specica allinterno del dominio. In realt` si possono avere anche a pi` nomi associati allo stesso indirizzo, ad esempio se cerchiamo: u
[piccardi@havnor piccardi]$ host www.firenze.linux.it www.firenze.linux.it CNAME serverone.firenze.linux.it serverone.firenze.linux.it A 195.110.124.18

vediamo che lindirizzo www.firenze.linux.it ` un alias (infatti il tipo di record ` CNAME) al e e precedente. Si tenga presente che ad un solo IP possono essere associati diversi nomi relativi a domini completamente scorrelati; ad esempio anche interrogando con:
[piccardi@havnor piccardi]$ host www.softwarelibero.it www.softwarelibero.it A 195.110.124.18

si ottiene di nuovo lo stesso numero, dato che la macchina che ospita il sito dellAssociazione Software Libero ` la stessa. e Il comando host permette di richiedere esplicitamente anche gli altri tipi di record usando lopzione -t querytype per indicare il tipo di record voluto, in cui per querytype si possono usare i tipi mostrati in tab. 9.1. Ad esempio se vogliamo vedere chi riceve la posta nel dominio firenze.linux.it possiamo usare:
[piccardi@havnor piccardi]$ host -t MX firenze.linux.it firenze.linux.it MX 5 mail.firenze.linux.it firenze.linux.it MX 666 lorien.prato.linux.it

328

CAPITOLO 9. IL SERVIZIO DNS

che ci risponde restituendo i record MX, che indicano i server di posta del dominio, usando ANY come tipo (o direttamente lopzione -a) si avranno tutti i record di quel dominio. Oltre ai domini il programma ` in grado di elencare tutti i record relativi ad una determinata zona, i dettagli e sono riportati nella pagina di manuale. Il comando dig ha sostanzialmente le stesse funzionalit` di host, la sintassi, come riportata a dalla pagina di manuale `: e dig @server name type dove server indica il server DNS da interrogare name il nome della risorsa che si vuole cercare e type il tipo di record da cercare (al solito con i valori di tab. 9.1). Se non si fornisce nessun argomento il comando sottintende che i server sono quelli specicati in resolv.conf, il tipo ` A e ed il nome ` ., per cui restituisce lelenco dei root DNS. e La dierenza con host ` che il comando restituisce loutput completo inviato dal nameserver, e e non solo il campo richiesto, inoltre dig pu` essere usato in batch (cio` in forma non interattiva) o e con lopzione -f file per permette di eettuare le ricerche leggendo i comandi da un le.

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` diuso ` il programma named. Il programma ` parte del pacchetto bind, scritto u e e originariamente da Paul Vixie, e mantenuto dallInternet Software Consortium, ` attualmente e giunto alla versione 9. Linstallazione del pacchetto bind ` prevista da tutte le maggiori distribuzioni. Il programma e viene lanciato dagli opportuni script di avvio, riportati in tab. 9.2, che possono essere utilizzati per avviare e fermare il servizio con i soliti parametri standard. Di norma viene anche automaticamente inserito in tutti i runlevel e lanciato allavvio dal sistema di inizializzazione di System V.
Distribuzione Debian RedHat Slackware Comando /etc/init.d/bind /etc/rc.d/init.d/named /etc/rc.d/rc.inet2

Tabella 9.2: Script di avvio del server DNS nelle varie distribuzioni.

Nei casi in cui, per eettuare delle prove, si vuole lanciare a mano il programma, la sintassi, come riportata dalla pagina di manuale, ` la seguente: e 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` consultare la stessa pagina di manuale, di norma ` o e suciente lanciare il programma senza opzioni, nel qual caso saranno usate le congurazioni standard, se si vuole lasciare il programma attivo, si pu` usare lopzione -f che evita che vada o

9.2. LA GESTIONE DI UN SERVER DNS

329

in background, mentre con -d si pu` impostare il livello di debug; usandole entrambe si avr` o a tutta la diagnostica a schermo invece che in un le di log. Di norma il programma viene lanciato usando lopzione -u, che permette di usare un utente dedicato, senza privilegi speciale, dopo aver eettuato linizializzazione dello server1 per le normali operazioni del DNS. Lutente dipende dalla distribuzione e dallinstallazione che si ` e eettuata.

9.2.2

Il le named.conf

Il le di congurazione di named ` named.conf, di solito si trova questo le in /etc/named o e in /etc/bind/ (se non direttamente sotto /etc) a seconda delle distribuzioni. Il le ha una sintassi abbastanza complessa e simile a quella dei programmi in C, il le contiene una serie di comandi, che a loro volta possono contenere blocchi di ulteriori sottocomandi racchiusi fra parentesi grae; ogni comando ` terminato da un ; che ne indica la conclusione. Anche i e 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 signicato generico ` la seguente: e include include il contenuto di un altro le di congurazione, come se questo fosse stato scritto direttamente dentro named.conf. In questo modo diventa possibile dividere le varie congurazioni (ad esempio le zone per diversi domini, o altre congurazioni) e mantenere separatamente le varie parti. permette di impostare alcune propriet` generali del server ed i default per le altre a direttive. Conviene inserirla in un le a parte (ad esempio in Debian ` mantenuta in e /etc/bind/named.conf.options) da includere con include. denisce le modalit` con cui le varie informazioni vengono inviate sui le di log o al a sistema del syslog. viene usata per denire una zona del DNS e le modalit` con cui vengono utilizzate a le relative informazioni. Una zona serve ad identicare una parte di nomi di dominio per il quale il server deve eseguire delle azioni speciche.

options

logging

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 le named.conf, ripreso dal le installato dal pacchetto bind su una distribuzione Debian Sid, ` riportato di seguito: e
// // // // // // 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; }; dovendo porsi in ascolto sulla porta 53, che ` una delle porte riservate, ` necessario avere i privilegi di e e amministratore, che nel corso delle ulteriori operazioni non sono pi` necessari. u
1

330
category cname { null; }; }; ...

CAPITOLO 9. IL SERVIZIO DNS

si noti come in questo caso viene incluso un le 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 le in seguito, in relazione a diverse congurazioni.

9.2.3

La congurazione base

Le modalit` di utilizzo di un server DNS possono essere le pi` svariate, aronteremo qui solo a u quelle relative al suo uso allinterno di una rete locale. La modalit` pi` semplice ` quella di un a u e caching DNS, cio` di usare il server come un proxy per evitare di ripetere ogni volta le richieste e di risoluzione dei nomi su internet. Anzitutto andranno impostate le opzioni generali per il server, questo viene fatto dal comando options, si avr` pertanto una sezione del tipo di: a options { directory "/var/cache/bind"; ... }; che specica la directory rispetto nella quale il server cerca i vari le; anche questa pu` variare o a seconda della distribuzione. Il primo passo da fare ` quello di far sapere al server dove pu` trovare i root DNS ; questo e o 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 denisce una zona per la radice (che nel sistema dei nomi di dominio ` indicata da un "."). I le preimpostati nellinstallazione standard gi` prevedono una sezione e a di questo tipo. Le zone possono essere di vari tipi, come specicato 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 specica il le da cui prendere le informazioni, questo pu` essere o indicato in forma assoluta, come nellesempio, o in forma relativa rispetto alla directory denita dalla direttiva directory del comando options. In questo caso il le ` /etc/bind/db.root che e contiene lelenco dei root DNS, questo pu` essere ottenuto con il comando dig (vedi sez. 9.1.2) o 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 specicano le caratteristiche della zona. In generale, oltre alla zona per i root DNS, quando si installa il pacchetto di bind, i le di congurazione sono preimpostati per la risoluzione del localhost. Vedremo i dettagli al riguardo in sez. 9.2.4, quando tratteremo la congurazione 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` provare a vericarne il funzionamento, se da un terminale si esegue una o richiesta ad un indirizzo no ad allora non usato, avremo che:

9.2. LA GESTIONE DI UN SERVER DNS

331

[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. ;; ANSWER SECTION: www.consumattori.org. ;; AUTHORITY SECTION: consumattori.org. consumattori.org. ;; ;; ;; ;;

IN

3600

IN

80.241.162.128

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. ;; ANSWER SECTION: www.consumattori.org. ;; AUTHORITY SECTION: consumattori.org. consumattori.org. ;; ;; ;; ;;

IN

3595

IN

80.241.162.128

895 895

IN IN

NS NS

ns7.gandi.net. 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` ` il nostro nameserver che si incarica di eettuare il procedimento di scansione ricorsiva o e che abbiamo illustrato in sez. 9.1.1, possiamo limitare ulteriormente le richieste che escono dalla nostra rete usando il nameserver del provider per eettuare la scansione per conto nostro, questo si fa aggiungendo alla sezione options le speciche per luso di altri server come forwarders, aggiungendo una sezione del tipo: options { ...

332 forwarders { 213.234.128.211; 213.234.132.130; }; };

CAPITOLO 9. IL SERVIZIO DNS

ed in questo modo uscir` solo una richiesta verso i server che sono dichiarati nella direttiva a forwarders.

9.2.4

La congurazione di un dominio locale.

Vediamo ora come congurare un dominio locale, per la risoluzione dei nomi delle macchine interne di una LAN; per semplicit` prenderemo un dominio completamente astratto, earthsea.ea. a Per far questo dovremo denire la relativa zona, dovremo aggiungere quindi al le di congurazione 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` essere sensato mantenere in un le a parte, da includere o dal le principale con il solito comando include. Si noti come sempre si debbano denire 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 eettuare 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` generale di risoluzione ` dato dalla parte u e pi` signicativa del numero. u Inoltre nella installazione standard ` prevista la congurazione per la risoluzione in locale e del localhost, il che di norma comporta la presenza dentro il named.conf di default di due zone del tipo: 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 ` di tipo master in quanto ` sempre il nostro server ad essere e e il responsabile della risoluzione di questo nome.

9.2. LA GESTIONE DI UN SERVER DNS

333

Vediamo allora quale ` il formato dei le di congurazione delle singole zone, che contengono e 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 le:
$TTL @ 604800 IN SOA localhost. root.localhost. ( 1 ; Serial 604800 ; Refresh 86400 ; Retry 2419200 ; Expire 604800 ) ; Negative Cache TTL localhost. 127.0.0.1

; @ @

IN IN

NS A

I le 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` il tempo massimo di validit` del record nella cache di e a un nameserver (si ricordi quanto detto al proposito in sez. 9.1.1); nel nostro esempio il tempo ` e stato specicato in secondi, e corrisponde ad una settimana; formati alternativi prevedono luso dei sussi 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 specicare i campi su pi` righe, racchiudendoli fra u parentesi tonde. Inne si possono inserire commenti ovunque precedendoli con il carattere ";". Il formato dei vari record ` simile, la sintassi generale ` la seguente: e e {<domain>|@|<blank>} [<ttl>] [<class>] <type> <rdata> [<comment>] Il primo campo indica il nome di dominio che viene ricercato; esso pu` essere immesso o esplicitamente, ma se il campo ` vuoto (cio` blank) viene usato lultimo nome immesso; inne e e si pu` usare il carattere speciale "@", che viene automaticamente espanso nel nome della zona o indicato dal comando zone che fa riferimento al le, che viene detta origine. Il campo ttl viene di norma omesso, in quanto di solito si usa la direttiva $TTL per specicarlo 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 specicato e denisce il tipo di record, inne 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 ` essenziale, ma ` convenzione specicare sempre e e per primo un SOA che dichiara che il nostro server ` autoritativo per quel dominio (di nuovo si e ricordi quanto detto in sez. 9.1.1), dato che non ce ne pu` essere pi` di uno per le. Questo o u signica anche la necessit` di un le separato per ogni dominio che si vuole denire. Si prosegue a poi con la dichiarazione dei record di tipo NS che deniscono i nameserver per il dominio in questione, a cui fanno seguito gli altri tipi di record. La prima colonna di un record SOA ` il nome del dominio per il quale si dichiara di avere e autorit`, nel caso in esempio si ` usato il carattere speciale @, altrimenti si sarebbe dovuto a e specicare il nome del dominio completo nella forma localhost., con il "." nale in quanto i nomi vanno dichiarati in forma assoluta (facendo riferimento alla radice che ` appunto ".") e segue la classe IN ed il tipo SOA. Nel caso di un record SOA i dati prevedono il server che far` da a 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 root@localhost). a Le restanti informazioni, inserite fra parentesi per poterle dividere su pi` righe, sono usate u nella replicazione dei dati fra nameserver primari e secondari: una funzionalit` avanzata del a

334

CAPITOLO 9. IL SERVIZIO DNS

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 modicare ` quella identicata come serial che indica un numero seriale (crescente) da aggiornare tutte e le volte che si eettua una modica alla zona. Tornando allesempio, i due record successivi dichiarano rispettivamente (il record NS) la macchina nel dominio che fa da nameserver (nel caso quella identicata dal nome del dominio stesso) e lindirizzo del dominio (il record A). Vista la particolarit` del dominio localhost vediamo un esempio pi` signicativo, su come a u impostare un nostro dominio locale per risolvere i nomi della macchine di una rete locale. Nel caso lesempio ` tratto dalla mia congurazione della rete di casa. Si ` scelto il dominio earthsea.ea, e e i cui dati sono mantenuti nel le 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 ` cominciato con un record di tipo SOA che dichiara lautorit` per earhsea.ea, in e a questo caso il nameserver ` la macchina gont.earhsea.ea., anchessa identicata dal suo nome e 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 specica il nameserver semplicemente con gont. Lamministratore della macchina sono io per cui la posta sar` inviata a a me con lindirizzo [email protected]. Il secondo record denisce il nameserver, cio` gont.earthsea.ea.: si noti che di nuovo, e come per il precedente, non lo si ` denito con lindirizzo IP ad esso corrispondente; tutto e quello che occorre infatti ` usare un nome che corrisponda ad un record di tipo A. Nel caso si ` e e specicato un solo nameserver, ma se ne possono denire pi` di uno; linformazione sar` passata u a nelle richieste di risoluzione, che potranno essere rivolte ad uno qualunque dei server della lista. Il record successivo, di tipo MX, serve a denire a quale macchina viene inviata la posta per il dominio earthsea.ea, di nuovo si ` specicato gont, ma stavolta, per dare un esempio di come e si possono scrivere le cose in maniera pi` compatta, non si ` dichiarato il dominio (che essendo u e blank corrisponde a quello precedente, e cio` sempre earthsea.ea, si ` tralasciata la classe IN e e che essendo quella di default pu` non essere specicata esplicitamente, e si ` indicato gont senza o e

9.2. LA GESTIONE DI UN SERVER DNS

335

usare il nome assoluto. Il valore inserito 10 inserito prima del nome indica la priorit` del server a di posta, ` possibile infatti specicare pi` di un server di posta, con valori diversi, in modo che e u verr` sempre contattato per primo quello con il valore pi` basso, passando ai successivi solo in a u caso di fallimento dei precedenti. Si tenga presente che anche questi record ` opportuno facciano e riferimento a nomi associati a record di tipo A. Inne si sono inseriti i vari record di tipo A contenenti gli indirizzi, ed i record di tipo CNAME che deniscono dei nomi alternativi per le stesse macchine. Per quanto visto nora il formato di questi record ` evidente. e Una volta denito il nostro dominio occorre anche denire la risoluzione inversa, questo ` e fatto tramite il le db.192.168.1, il cui contenuto ` il seguente: 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. ; ; 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 denire anche il nameserver per questo dominio inverso, che ovviamente ` sempre gont.earthsea.ea. (qui specicare gont non avrebbe e funzionato, lindirizzo assoluto invece funziona in quanto il dominio ` stato gi` denito prima). e a Seguono inne i record di tipo PTR che contengono il nome delle singole macchine, in questo caso per` gli indirizzi devono corrispondere ad un solo nome, quello canonico e contrariamente o a prima non si possono associare pi` nomi allo stesso indirizzo. Anche se ` possibile associare u e due nomi allo stesso IP molti sistemi non sono preparati a questa evenienza, che ` bene pertanto e escludere onde evitare comportamenti inattesi. Completati i nostri le possiamo riavviare il servizio, e controllare i risultati. Al solito usiamo dig per interrogare il nostro server:

336

CAPITOLO 9. IL SERVIZIO DNS

[piccardi@gont piccardi]$ dig any earthsea.ea ; <<>> DiG 9.2.2 <<>> any earthsea.ea ;; 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. ;; ANSWER SECTION: earthsea.ea. earthsea.ea. ;; AUTHORITY SECTION: earthsea.ea. ;; ADDITIONAL SECTION: gont.earthsea.ea. ;; ;; ;; ;;

IN

ANY

100000 100000

IN IN

NS SOA

gont.earthsea.ea. gont.earthsea.ea. piccardi.gont.earthsea.ea. 2 10800 3600 60480

100000

IN

NS

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. ;; ANSWER SECTION: lorbaner.earthsea.ea. ;; AUTHORITY SECTION: earthsea.ea. ;; ADDITIONAL SECTION: gont.earthsea.ea. ;; ;; ;; ;;

IN

100000

IN

192.168.1.17

100000

IN

NS

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 inne proviamo con la risoluzione inversa, ricordiamoci che in questo caso dig vuole lopzione -x, ed otterremo:

9.3. CONFIGURAZIONI AVANZATE

337

[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: ;17.1.168.192.in-addr.arpa.

IN

PTR

;; ANSWER SECTION: 17.1.168.192.in-addr.arpa. 100000 IN ;; AUTHORITY SECTION: 1.168.192.in-addr.arpa. 100000 ;; ADDITIONAL SECTION: gont.earthsea.ea. ;; ;; ;; ;;

PTR

karegoat.earthsea.ea.

IN

NS

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:52:09 2003 MSG SIZE rcvd: 112

e di nuovo ` tutto a posto. e

9.3

Congurazioni avanzate

Tratteremo in questa sezione le congurazioni pi` avanzate di BIND, come limpostazione di u eventuali secondari, la gestione delle delegazioni, ed le varie tipologie di controllo degli accessi disponibili nel programma. Chiuderemo la sezione con un breve accenno alla congurazione 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 ` la capacit` e 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.

9.3.2

La gestione di un secondario

Una delle caratteristiche del DNS ` quella di consentire in maniera naturale la distribuzione e di carico e la ridondanza attraverso la possibilit` di gestire dei DNS secondari cui trasferire in a maniera automatica tutte le informazioni di una certa zona.

9.3.3

La congurazione con bind4

Bench ormai la gran parte dei server sia passata alle versioni pi` recenti di bind (la versione e u 8 o la 9) esistono ancora un certo numero di server che mantengono la vecchia versione 4. Il passaggio da questa alle successive ha visto un grosso cambiamento del server, ed in particolare della sua congurazione. Il cambiamento principale (a parte la struttura interna del server stesso) ` stato quello nei le e di congurazione; la versione 4 infatti non usa named.conf ma un le named.boot, che ha una

338

CAPITOLO 9. IL SERVIZIO DNS

sintassi completamente diversa; le dierenze per fortuna si fermano qui, ed i le che deniscono le zone sono sostanzialmente immutati. Un possibile esempio di le named.boot, con una congurazione che ` sostanzialmente e equivalente a quella vista nei paragra precedenti, ` il seguente: e
; ; Bind v4 configuration file ; directory /etc/bind forwarders 213.234.128.211 213.234.132.130 cache . db.root ; zone definitions ; type domain file primary 0.0.127.in-addr.arpa db.127 primary localhost db.local primary earthsea.ea db.earthsea primary 1.168.192.in-addr.arpa db.192.168.1

La direttiva directory specica la directory di lavoro corrente del server, cos` che tutti i pathname relativi impiegati in seguito faranno riferimento ad essa. La direttiva primary permette di denire un dominio per cui si ` DNS primario; deve essere seguita dal nome del e dominio e dal le in cui sono contenute le informazioni sui relativi resource record. La direttiva secondary invece permette di denire un dominio per cui si ` DNS secondario, deve essere e seguita dal nome del dominio, dalla lista dei server primari e dal le su cui salvare i dati. La direttiva forwarders permette, come lanaloga opzione di bind8, di reinviare le richiesta ad altri server DNS, la cui lista ` a seguire. Inne la direttiva cache permette di ottenere le informazioni e su un dominio da un le (` analoga ad una zona di tipo hint di bind8) e nel caso permette di e specicare la lista dei root DNS.
Direttiva domain <nome> directory <path> primary <dominio> <file> secondary <dominio> <lista> <file> cache <dominio> <file> forwarders <list> options <opzione> Signicato Imposta il nome di dominio di default. Specica la directory di lavoro del server. Denisce un dominio per cui si ` DNS primario. e Denisce un dominio per cui si ` DNS secondario. e Denisce un le di cache per un dominio. Imposta i DNS a cui reinviare le richieste. Imposta una opzione.

Tabella 9.3: Opzioni impostabili nel le named.boot.

Lelenco delle direttive principali ` riportato in tab. 9.3; lelenco completo delle opzioni si e pu` trovare nella pagina di manuale di named.boot, insieme alla documentazione di bind4. o

Appendice A

Sinossi dei comandi principali


A.1 Comandi per la gestione dei le

Comando ls mv

cp

rm ln

Signicato e sintassi Mostra il contenuto di una directory. ls [OPTION]...[FILE]... Sposta e rinomina i le. mv [OPTION]... SOURCE DEST mv [OPTION]... SOURCE... DIRECTORY Copia i le. cp [OPTION]... SOURCE DEST cp [OPTION]... SOURCE... DIRECTORY Cancella le 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 le.

Comando cat less tail head

Signicato e sintassi Concatena i le stampandoli sullo stadanrd output. cat [OPTION] [FILE]... Visualizza i le stampandoli sullo stadanrd output. less [FILE]... Visualizza lultima parte di un le. tail [OPTION] [FILE]... Visualizza la prima parte di un le. head [OPTION] [FILE]...

Tabella A.2: Principali comandi per il contenuto dei le.

339

340

APPENDICE A. SINOSSI DEI COMANDI PRINCIPALI

A.2

Comandi per la gestione dei processi


Comando ps top kill killall nice Signicato e sintassi Riporta una fotograa dei processi in corso. ps [OPTIONS] Mostra i processi in corso sul sistema. top [OPTIONS]... Manda un segnale ad un process. kill [ -signal | -s signal ] pid ... Uccide i processi per nome. killall [OPTIONS] process Lancia un programma con priorit` modicata. a nice [OPTION] [COMMAND [ARG]...

Tabella A.3: Principali comandi per la gestione dei processi.

A.3

I permessi dei le
Nome u g o r w x Signicato 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 exexute

Tabella A.4: I permessi dei le.

Comando chmod chown chgrp

Signicato e sintassi Cambia i permessi di accesso ai le. chmod [OPTIONS] Cambia proprietari e gruppi ai le. chown [OPTIONS] Cambia il gruppo proprietario ai le. chgrp [OPTIONS]

Tabella A.5: Principali comandi per la gestione dei permessi dei le.

A.4

Comandi per la localizzazione dei le

A.5. COMANDI PER LA DOCUMENTAZIONE


Comando locate whereis which find updatedb Signicato e sintassi Elenca i le del database che si adattano col nome cercato. locate [OPTIONS] file Cerca i le di tipo binario, sorgente e pagina di manuale per un comando. whereis [OPTIONS] file Individua la posizione di un comando. which [OPTION] file Cerca le in una gerarchia di directory. find [PATH] espressione Aggiorna il database con lelenco dei le presenti sul sistema. updatedb [OPTIONS] Tabella A.6: Principali comandi per la localizzazione dei le.

341

A.5

Comandi per la documentazione


Comando man whatis apropos find comando -help Signicato e sintassi ` E uninterfaccia ai manuali di riferimento in linea. 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] parol chiave Cerca le in una gerarchia di directory. find [PATH] espressione 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 Signicato e sintassi Mostra o congura data e orario. date [OPTION]... [FORMAT] Mostra e congura 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 Signicato e sintassi Programma di archiviazione. tar [OPTION] file1 file2 .. Comprime e scomprime le. gzip [OPTIONS] file Programma di archiviazione. bzip2 [OPTION] file1 file2 ..

Tabella A.9: Principali comandi per di archiviazione.

342

APPENDICE A. SINOSSI DEI COMANDI PRINCIPALI

A.8

Gestione dei pacchetti


Comando apt-get rpm Signicato e sintassi Gestore di pacchetti di Debian GNU/Linux. apt-get [OPTIONS] Gestore di pacchetti di RedHat. rpm [OPTIONS]

Tabella A.10: Principali comandi per di archiviazione.

A.9

I comandi diagnostici
Comando ping traceroute netstat Signicato e sintassi Invia ICMP ECHO REQUEST agli host sulla rete . ping [OPTIONS] host Mostra i passaggi da un host ad un altor. traceroute [OPTIONS] host Mostra le connessioni sulla ret. netstat [OPTIONS]

Tabella A.11: Principali comandi diagnostici.

A.10

I client dei servizi base


Comando telnet ftp finger whois Signicato 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 LPI 101
Topic 1.101.1 1.101.3 1.101.4 1.101.5 1.101.6 1.101.7 1.102.1 1.102.2 1.102.3 1.102.4 1.102.5 1.102.6 1.103.1 1.103.2 1.103.3 1.103.4 1.103.5 1.103.6 1.103.7 1.103.8 1.104.1 1.104.2 1.104.3 1.104.4 1.104.5 1.104.6 1.104.7 1.104.8 1.110.1 1.110.2 1.110.4 Titolo Congure Fundamental BIOS Settings Congure Modem and Sound cards Setup SCSI Devices Congure dierent PC expansion cards Congure Communication Devices Congure USB devices Design hard disk layout Install a boot manager Make and install programs from source Manage shared libraries Use Debian package management Use Red Hat Package Manager (RPM) Work on the command line Process text streams using lters Perform basic le management Use streams, pipes, and redirects Create, monitor, and kill processes Modify process execution priorities Search text les using regular expressions Perform basic le editing operations using vi Create partitions and lesystems Maintain the integrity of lesystems Control mounting and unmounting lesystems Managing disk quota Use le permissions to control access to les Manage le ownership Create and change hard and symbolic links Find system les and place les in the correct location Install e Congure XFree86 Setup a display manager Install e Customize a Window Manager Environment 343 Riferimento sez. 5.2.1 e 5.4.1 sez. 5.4.1 sez. 5.4.2 sez. 5.4.1 sez. 5.4.3 sez. 5.4.4 sez. 1.2.3 sez. 5.3.2 e 5.3.3 sez. 4.2.1 sez. 3.1.2 sez. 4.2 e 4.2.3 sez. 4.2.2 sez. 2 sez. 2.2.5 e 2.3 sez. 2.2 sez. 2.1.5 sez. 1.3 sez. 1.3.1 sez. 2.2.2 sez. 2.4.3 sez. 5.2.2, 5.2.3 e 5.2.3 sez. 5.2 sez. 5.2.2 sez. 6.3 sez. 1.4.2, 1.4.3 e 1.4.4 sez. 1.4.2, 1.4.3 e 1.4.4 sez. 1.2.2 sez. 2.2.2 sez. 3.4.2 sez. 3.4.3 sez. 3.4.4

344

APPENDICE B. INDICE DEGLI ARGOMENTI PER LPI

B.2

Argomenti LPI 102


Topic 1.105.1 1.105.2 1.106.1 1.106.2 1.107.2 1.107.3 1.107.4 1.108.1 1.108.2 1.108.5 1.109.1 1.109.2 1.111.1 1.111.2 1.111.3 1.111.4 1.111.5 1.111.6 1.112.1 1.112.3 1.112.4 1.113.1 1.113.2 1.113.3 1.113.4 1.113.5 1.113.7 1.114.1 1.114.2 1.114.3 Titolo Manage/Query kernel and kernel modules at runtime Recongure, build, and install a custom kernel and kernel modules Boot the system Change runlevels and shutdown or reboot system Manage printers and print queues Print les Install and congure local and remote printers Use and manage local system documentation Find Linux documentation on the Internet Notify users on system-related issues Customize and use the shell environment Customize or write simple scripts Manage users and group accounts and related system Tune the user environment and system environment variables Congure and use system log les to meet administrative and security needs Automate system administration tasks by scheduling jobs to run in the future Maintain an eective data backup strategy Maintain system time Fundamentals of TCP/IP TCP/IP conguration and troubleshooting Congure Linux as a PPP client Congure and manage inetd, xinetd, and related services Operate and perform basic conguration of sendmail Operate and perform basic conguration of Apache Properly manage the NFS, smb, and nmb daemons Setup and congure basic DNS services Set up secure shell (OpenSSH) Perform security administration tasks Setup host security Setup user level security Riferimento sez. 5.1 e 5.1.4 sez. 5.1.1, 5.1.2 e 5.1.3 sez. 5.3 e 5.3.1 sez. 5.3.4 sez. 3.5.2 sez. 3.5.4 sez. 3.5.3 sez. 2.3.1 e 3.1.5 sez. 2.3.1 sez. 3.1.4 pag. 72 e ss. sez. 2.1.6 sez. 1.4.1 sez. 3.2.2 sez. 3.3.3 e 3.3.4 sez. 3.3.1 sez. sez. sez. sez. sez. sez. 4.1 2.3.2 7.2.1 7.3 e 7.6 7.7.2 8.1

sez. ?? sez. ?? sez. 8.4 e 8.5 sez. 7.6.2, 7.6.5, 3.1.3, 9.2.2 e 9.3 sez. 8.3 sez. ?? sez. 4.3.2 e 4.3.3 sez. 6.3

Appendice C

GNU Free Documentation License


Version 1.1, March 2000 Copyright c 2000 Free Software Foundation, Inc. 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 eective 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 modications 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.

C.1

Applicability and Denitions

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 Modied Version of the Document means any work containing the Document or a portion of it, either copied verbatim, or with modications 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 345

346

APPENDICE C. 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 specication 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 le format whose markup has been designed to thwart or discourage subsequent modication 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, A Texinfo input format, L TEX input format, SGML or XML using a publicly available DTD, and standard-conforming simple HTML designed for human modication. 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.

C.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.

C.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.

C.4. MODIFICATIONS

347

If the required texts for either cover are too voluminous to t legibly, you should put the rst ones listed (as many as t 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.

C.4

Modications

You may copy and distribute a Modied Version of the Document under the conditions of sections 2 and 3 above, provided that you release the Modied Version under precisely this License, with the Modied Version lling the role of the Document, thus licensing distribution and modication of the Modied Version to whoever possesses a copy of it. In addition, you must do these things in the Modied 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 modications in the Modied Version, together with at least ve of the principal authors of the Document (all of its principal authors, if it has less than ve). State on the Title page the name of the publisher of the Modied Version, as the publisher. Preserve all the copyright notices of the Document. Add an appropriate copyright notice for your modications adjacent to the other copyright notices. Include, immediately after the copyright notices, a license notice giving the public permission to use the Modied 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 Modied 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 Modied Version as stated in the previous sentence.

348

APPENDICE C. 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 Modied Version. Do not retitle any existing section as Endorsements or to conict in title with any Invariant Section. If the Modied 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 Modied 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 Modied Version by various parties for example, statements of peer review or that the text has been approved by an organization as the authoritative denition of a standard. You may add a passage of up to ve 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 Modied 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 Modied Version.

C.5

Combining Documents

You may combine the Document with other documents released under this License, under the terms dened in section 4 above for modied versions, provided that you include in the combination all of the Invariant Sections of all of the original documents, unmodied, 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 dierent 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.

C.6. COLLECTIONS OF DOCUMENTS

349

C.6

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.

C.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 Modied 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.

C.8

Translation

Translation is considered a kind of modication, 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.

C.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.

C.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 dier 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 species 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 specied version or of any

350

APPENDICE C. 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
broadcast, 265 arithmetic expansion, 62 broadcast, 262, 265, 284 command expansion, 62 fo, 6, 7, 46, 47 lename globbing, 6062, 76, 80, 81, 135, 152 hash, 89, 163, 195 history, 62 kmod, 183 login manager, 129 mount point, 17, 20, 23, 24 multicast, 262, 265, 273, 283 path search, 59 pipelining, 66 pipe, 66, 95 prompt, 55 standard error, 63, 65 standard input, 6365, 75 standard output, 63, 65, 75 swap, 2, 23, 44, 192, 193, 202204 system call, 2, 3, 7, 28 window manager, 131 backup, 147149 canale DMA, 217 comando addgroup, 162 adduser, 162 apropos, 90 apt-get, 159 atq, 117 atrm, 117 at, 117 badblocks, 198 batch, 117 cancel, 144 cat, 64 cfdisk, 193 chattr, 48 chfn, 163 chgrp, 46 chmod, 45 351 chown, 46 chroot, 32 chsh, 163 cksum, 89 cpio, 152 cp, 12 crontab, 116 cut, 84 date, 93 delgroup, 162 deluser, 162 depmod, 185 diff, 171 dig, 328 dpkg, 158 dump, 153 e2fsck, 201 e2image, 200 echo, 57 edquota, 252 env, 58 expand, 86 exportfs, 318 false, 71 fdformat, 194 fdisk, 191 find, 76 finger, 288 fmt, 86 fold, 86 free, 34 fsck, 201 ftp, 287 getent, 167 getty, 39 gpasswd, 163 grep, 79 groupadd, 161 groupmod, 161 groups, 41 grpconv, 166 grpunconv, 167

352 grub-install, 211 head, 83 history, 63 hostname, 291 host, 326 hwclock, 94 id, 41 ifconfig, 270 info, 91 init, 212 insmod, 183 isapnp, 219 killall, 36 kill, 34 ldconfig, 107 ldd, 106 less, 83 lilo, 207 ln, 10 locate, 75 login, 39 logrotate, 120 lpadmin, 142 lpc, 135 lpd, 135 lpinfo, 144 lpq, 134 lprm, 135 lpr, 134 lpstat, 144 lp, 143 lsaddr, 47 lsmod, 188 lspci, 222 lsusb, 233 ls, 7 lvcreate, 247 lvdisplay, 248 lvextend, 248 lvreduce, 248 lvremove, 249 lvresize, 249 lvscan, 248 make, 156 mandb, 111 manpath, 112 man, 90 md5sum, 89 mkdir, 14 mke2fs, 195

INDICE ANALITICO mkfifo, 47 mkfs.msdos, 195 mkfs, 195 mknod, 46 mkreiserfs, 195 modinfo, 188 modprobe, 184 more, 82 mount, 20 mtr, 282 mv, 12 netstat, 283 newgrp, 163 nice, 37 nl, 86 parted, 193 passwd, 162 paste, 85 patch, 172 ping, 280 pnpdump, 220 pr, 85 pstree, 25 ps, 26 pvcreate, 244 pvdisplay, 244 pvmove, 245 pvscan, 244 pwconv, 166 pwd, 14 pwunconv, 167 quotacheck, 251 quotaoff, 252 quotaon, 252 quota, 253 raidhotadd, 241 raidhotremove, 241 raidstart, 241 raidstop, 241 rdev, 206 renice, 37 repquota, 254 resize2fs, 249 resize_reiserfs, 250 restore, 154 rmdir, 14 rmmod, 186 rm, 11 route, 273 rpm, 157

INDICE ANALITICO run-parts, 116 scp, 313 scsiinfo, 228 sed, 86 seq, 71 setserial, 228 sg, 163 smbclient, 322 smbmount, 323 sort, 88 source, 72 split, 84 ssh-add, 316 ssh-copy-id, 315 ssh-keygen, 314 ssh, 313 startx, 129 su, 163 swapoff, 204 swapon, 204 syslinux, 206 tac, 88 tail, 83 tar, 149 tcpdchk, 307 tcpdmatch, 307 tcpd, 306 tee, 95 telinit, 214 telnet, 286 test, 71 time, 92 top, 32 touch, 88 traceroute, 281 tree, 14 true, 71 tr, 85 tune2fs, 198 umount, 24 unexpand, 86 uniq, 88 update-grub, 212 updatedb, 114 useradd, 161 usermod, 161 vgchange, 246 vgcreate, 245 vgdisplay, 246 vgextend, 245 vgmerge, 247 vgreduce, 245 vgscan, 246 vgsplit, 247 vidmode, 206 wc, 89 whatis, 90 which, 60 whoami, 41 whois, 288 xargs, 94 xf86cfg, 124 xf86config, 124 xinit, 129 xrdb, 131 xterm, 129 yes, 95 congurazione .bash_login, 73 .bash_profile, 73 .bashrc, 73 .profile, 73 .xinitrc, 129 /etc/X11/XF86Config-4, 124 /etc/X11/xdm/xdm-config, 130 /etc/X11/xdm/xdm.options, 130 /etc/apt/sources.list, 159 /etc/bootptab, 309 /etc/cron.allow, 116 /etc/cron.deny, 116 /etc/crontab, 115 /etc/cups/cupsd.conf, 140 /etc/dhcpd.conf, 309 /etc/ethers, 285 /etc/exports, 317 /etc/fstab, 22 /etc/gdm/gdm.conf, 130 /etc/group, 164 /etc/gshadow, 166 /etc/host.conf, 295 /etc/hostname, 291 /etc/hosts.allow, 306 /etc/hosts.deny, 306 /etc/hosts, 290 /etc/inetd.conf, 299 /etc/inittab, 213 /etc/isapnp.conf, 219 /etc/issue.net, 110 /etc/issue, 110 /etc/kde3/kdm/kdmrc, 130

353

354 /etc/ld.so.cache, 107 /etc/ld.so.conf, 107 /etc/lilo.conf, 207 /etc/login.defs, 110 /etc/logrotate.conf, 120 /etc/lprng/lpd.conf, 137 /etc/lprng/lpd.perms, 137 /etc/manpath.config, 111 /etc/modules.conf, 186 /etc/modules, 187 /etc/motd, 110 /etc/mtab, 24 /etc/networks, 292 /etc/pam.conf, 168 /etc/pam.d, 167 /etc/passwd, 163 /etc/printcap, 136 /etc/profile, 73 /etc/protocols, 292 /etc/raidtab, 238 /etc/rc.local, 113 /etc/resolv.conf, 294 /etc/samba/smb.conf, 319 /etc/securetty, 110 /etc/services, 291 /etc/shadow, 165 /etc/shells, 113 /etc/skel, 113 /etc/ssh/ssh_config, 313 /etc/ssh/sshd_config, 311 /etc/syslog.conf, 117 /etc/updatedb.conf, 114 /etc/xinetd.conf, 302 menu.lst, 211 named.conf, 329 demone anacron, 116 atd, 117 bootpd, 308 crond, 115 dhcpd, 309 gdm, 130 inetd, 299 kdm, 130 lpd, 137 named, 328 nmbd, 319 portmap, 317 smbd, 319 ssh-agent, 315

INDICE ANALITICO sshd, 311 syslogd, 117 xdm, 130 xinetd, 301 directory radice, 3, 1324, 32, 174, 201, 206, 212, 213 editor emacs, 96 jed, 102 joe, 101 nano, 103 pico, 103 vi, 99 espressioni regolari, 7981, 87 lesystem /proc /proc/dma, 217 /proc/interrupts, 217 inode, 712, 196, 197 interrupt, 217 istruzione case, 70 elif, 69 else, 69 fi, 69 for, 70 function, 71 if, 69 then, 69 until, 70 while, 70 memoria virtuale, 2, 33, 35, 203 shell ash, 53 bash, 52 csh, 53 ksh, 53 sh, 52 tcsh, 53 zsh, 53 built-in alias, 60 bg, 40 cd, 13 declare, 57 export, 57 fg, 40 jobs, 40

INDICE ANALITICO set, 56 type, 60 umask, 45 unalias, 60 unset, 56 di login, 72, 73 interattiva, 64, 72 socket, 7 variabili di ambiente, 57 EDITOR, 58, 82 HOME, 58 LD_LIBRARY_PATH, 108 MANPATH, 112 PAGER, 82 PATH, 5860 SSH_AUTH_SOCK, 316 TERM, 58 USER, 57 di shell, 5657 HISTFILESIZE, 63 HISTFILE, 63 HISTSIZE, 63 IFS, 54 PS1, 55 speciali, 69 zombie, 2829, 31, 35

355

356

INDICE ANALITICO

Bibliograa
[1] S. Piccardi, Guida alla Programmazione in Linux, vol. 1. http://gapil.truelite.it, 2001. [2] M. Cooper, Advanced Bash-Scripting Guide. http://www.tldp.org/LDP/abs/, 2000. [3] J. E. F. Friedl, Mastering regular expression. OReilly, 1997. [4] W. R. Stevens, TCP/IP Illustrated, Volume 1, the protocols. Addison Wesley, 1994.

357

Potrebbero piacerti anche