Sophie

Sophie

distrib > Mandriva > 9.1 > i586 > by-pkgid > f1098342ec4a2b28475e34123ce17201 > files > 1237

howto-html-it-9.1-0.5mdk.noarch.rpm

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<HTML>
<HEAD>
 <META NAME="GENERATOR" CONTENT="SGML-Tools 1.0.9">
 <TITLE>The Unix and Internet Fundamentals HOWTO: Come fa il computer a immagazzinare le cose su disco?</TITLE>
 <LINK HREF="Unix-Internet-Fundamentals-HOWTO-12.html" REL=next>
 <LINK HREF="Unix-Internet-Fundamentals-HOWTO-10.html" REL=previous>
 <LINK HREF="Unix-Internet-Fundamentals-HOWTO.html#toc11" REL=contents>
</HEAD>
<BODY>
<A HREF="Unix-Internet-Fundamentals-HOWTO-12.html">Avanti</A>
<A HREF="Unix-Internet-Fundamentals-HOWTO-10.html">Indietro</A>
<A HREF="Unix-Internet-Fundamentals-HOWTO.html#toc11">Indice</A>
<HR>
<H2><A NAME="s11">11. Come fa il computer a immagazzinare le cose su disco?</A></H2>

<P>Quando leggete un disco fisso su Unix vedete un albero di nomi di file
e directory. Normalmente non avrete bisogno di andare oltre, ma pu&ograve;
essere utile avere maggiori dettagli se vi capita un crash del disco e
dovete cercare di salvare dei file. Sfortunatamente non c'&egrave; un buon
modo per descrivere l'organizzazione del disco dal livello dei file in
gi&ugrave;, quindi dovr&ograve; partire dall'hardware e risalire.
<P>
<H2><A NAME="ss11.1">11.1 Struttura di basso livello del disco e del file system</A>
</H2>

<P>La superficie del vostro disco, dove vengono immagazzinati i dati, si
divide in una sorta di bersaglio per il tiro a freccette: in tracce
circolari che sono poi `affettate' in settori. Dal momento che le
tracce vicino al bordo esterno hanno area maggiore di quelle vicino al
centro, le tracce esterne hanno pi&ugrave; settori rispetto a quelle
interne. Ogni settore (o <EM>blocco del disco</EM>) ha la
stessa dimensione, che sui moderni Unix &egrave; generalmente pari a 1K
binario (1024 parole da 8 bit). Ogni blocco &egrave; individuato da un
indirizzo univoco, il <EM>numero di blocco del disco</EM>.
<P>Unix divide il disco in <EM>partizioni del disco</EM>. Ogni
partizione &egrave; formata da una serie continua di blocchi che vengono
usati separatamente da quelli delle altre partizioni, come file system
oppure come spazio swap. La partizione con numero pi&ugrave; basso viene
spesso trattata in modo speciale, come <EM>partizione di
avvio</EM> dove si pu&ograve; mettere un kernel da far partire.
<P>Ogni partizione &egrave; alternativamente uno <EM>spazio
swap</EM>,
usato per implementare 
<A HREF="Unix-Internet-Fundamentals-HOWTO-9.html#vm">memoria virtuale</A>, oppure
un 
<A NAME="file systems"></A> <EM>file system</EM>, usato per
contenere i file. Le partizioni swap sono trattate proprio come una
sequenza lineare di blocchi. I file system, invece, hanno bisogno di
un modo per associare i nomi dei file alle sequenze di blocchi
disco. Dal momento che la dimensione dei file aumenta, diminuisce, si
modifica nel tempo, i blocchi dati di un file non saranno una sequenza
lineare ma potranno essere disseminati su tutta la sua partizione
(dipende da dove il sistema operativo riesce a trovare un blocco
libero quando gliene serve uno).
<P>
<H2><A NAME="ss11.2">11.2 Nomi dei file e delle directory</A>
</H2>

<P>All'interno di ciascun file system la corrispondenza tra i nomi e i
blocchi viene assicurata da una struttura chiamata
<EM>i-node</EM>. C'&egrave; un gruppo di questi elementi vicino al
``fondo'' (i blocchi a numerazione pi&ugrave; bassa) di ciascun file system
(quelli pi&ugrave; bassi in assoluto sono usati a fini di manutenzione e di
etichettatura, non ne parleremo qui). Ogni i-node individua un file. I
blocchi dati dei file si trovano sotto gli i-node.
<P>Ciascun i-node contiene una lista dei numeri di blocco disco relativi
al file che individua. (Questa &egrave; una mezza verit&agrave;, corretta solo per i
file piccoli, ma il resto dei dettagli non &egrave; importante qui.)
Notate che l'i-node <EM>non</EM> contiene il nome del file.
<P>I nomi dei file si trovano nelle <EM>strutture delle
directory</EM>. Una struttura della directory associa i nomi ai
numeri i-node. Ecco perch&eacute;, su Unix, un file pu&ograve; avere pi&ugrave; nomi reali
(o <EM>hard link</EM>); sono soltanto diverse voci di
directory che puntano allo stesso i-node.
<P>
<H2><A NAME="ss11.3">11.3 Mount point</A>
</H2>

<P>Nel caso pi&ugrave; semplice, tutto il vostro file system Unix si trova su di
una sola partizione disco. Anche se questa situazione si ritrova in
qualche piccolo sistema Unix personale, &egrave; inusuale. Pi&ugrave; generalmente
esso &egrave; suddiviso tra pi&ugrave; partizioni disco, magari su diversi dischi
fisici. Cos&igrave;, per esempio, il vostro sistema pu&ograve; avere una piccola
partizione dove alloggia il kernel, una un po' pi&ugrave; grande dove si
trovano i programmi di utilit&agrave; del SO e una molto pi&ugrave; grande dove ci
sono le directory personali degli utenti.
<P>La sola partizione alla quale avrete accesso subito dopo l'avvio del
sistema &egrave; la <EM>partizione root</EM>, che &egrave; (quasi sempre)
quella dalla quale avete fatto il boot. Essa contiene la root
directory del file system, il nodo superiore dal quale dipende tutto
il
resto.
<P>Le altre partizioni del sistema devono collegarsi a questa root
affinch&eacute; tutto il vostro file system multipartizione sia
accessibile. Circa a met&agrave; del processo di avvio, il vostro Unix
render&agrave; accessibili queste partizioni non root. Dovr&agrave;
<EM>montare</EM> ciascuna di esse su una directory della
partizione root.
<P>Per esempio, se avete una directory chiamata `/usr', si tratta
probabilmente di un mount point per una partizione che contiene molti
programmi che fanno parte della distribuzione standard del vostro Unix
ma che non sono necessari durante l'avvio iniziale.
<P>
<H2><A NAME="ss11.4">11.4 Come viene cercato un file</A>
</H2>

<P>Ora possiamo guardare al file system dall'alto al basso. Ecco cosa
succede quando aprite un file (quale, ad esempio,
/home/esr/WWW/ldp/fundamentals.sgml):
<P>Il kernel parte dalla radice del vostro file system Unix (dalla
partizione root). Cerca una directory chiamata `home'. Di solito
`home' &egrave; un mount point per una grande partizione utente da qualche
altra parte, cos&igrave; va di l&agrave;. Nella struttura della directory di livello
pi&ugrave; alto di quella partizione utente cerca poi una voce chiamata
`esr' e ne estrae un numero di i-node. Va a quell'i-node, vede che si
tratta di una struttura di directory e cerca `WWW'. Estraendo
<EM>quell</EM>'i-node, va alla corrispondente sottodirectory e cerca
`ldp'. Questo lo porta a un altro i-node di directory
ancora. Aprendolo, trova il numero i-node di
`fundamentals.sgml'. Questo i-node non &egrave; una directory, ma contiene
invece l'elenco dei blocchi disco associati al file.
<P>
<H2><A NAME="ss11.5">11.5 Proprietari dei file, autorizzazioni e sicurezza</A>
</H2>

<P>
<A NAME="permissions"></A> Per impedire ai programmi di intervenire
accidentalmente o maliziosamente su dati su cui non dovrebbero, Unix
usa le <EM>autorizzazioni</EM>. Queste vennero
originariamente pensate per supportare il timesharing, proteggendo gli
uni dagli altri utenti diversi sulla stessa macchina, quando ancora
Unix veniva usato su costosi minicomputer condivisi.
<P>Per comprendere le autorizzazioni sui file, occorre richiamare la
descrizione di utenti e gruppi nella sezione 
<A HREF="Unix-Internet-Fundamentals-HOWTO-5.html#login">Che cosa accade con il log in?</A>. Ciascun file ha un utente
proprietario e un gruppo proprietario. Inizialmente sono quelli del
creatore del file; possono poi essere modificati con i programmi chown(1) e chgrp(1).
<P>Le autorizzazioni fondamentali che possono essere associate a un file
sono `read' (autorizzazione a leggere i dati contenuti), `write'
(autorizzazione a modificarli) e `execute' (autorizzazione a eseguirli
come programma). Ciascun file ha tre set di autorizzazioni; uno per
l'utente proprietario, uno per tutti gli utenti nel gruppo
proprietario e uno per tutti gli altri. I `privilegi' che si ottengono
al momento del log in sono la possibilit&agrave; di leggere, modificare ed
eseguire quei file i cui bit di autorizzazione coincidono la propria
ID utente o quella di un gruppo a cui si appartiene.
<P>Per vedere come queste possono interagire e come le visualizza Unix,
osserviamo alcuni elenchi di file su un sistema Unix ipotetico. Ecco
un esempio:
<P>
<BLOCKQUOTE><CODE>
<PRE>
snark:~$ ls -l notes
-rw-r--r--   1 esr      users         2993 Jun 17 11:00 notes
</PRE>
</CODE></BLOCKQUOTE>
<P>Si tratta di un file di dati ordinario. Il listato ci dice che il
proprietario &egrave; l'utente `esr', creato con il gruppo proprietario
`users'. Probabilmente la macchina su cui si trova mette per
definizione tutti gli utenti ordinari in questo gruppo; altri gruppi
che si vedranno comunemente su macchine con timesharing sono `staff',
`admin', o `wheel' (per ovvie ragioni, i gruppi non sono molto
importanti su workstation a singolo utente o PC). Il vostro Unix
potrebbe usare un gruppo di default differente, magari derivato dal
vostro nome utente.
<P>La stringa `-rw-r--r--' rappresenta i bit di autorizzazione per il
file. Il primo trattino &egrave; la posizione del bit directory; se il file
fosse stato una directory il bit sarebbe stato `d'. Dopo di questo, le
prime tre posizioni successive sono le autorizzazioni utente, le
seconde tre le autorizzazioni del gruppo e le terze tre le
autorizzazioni per gli altri (spesso chiamate autorizzazioni `world').
Su questo file l'utente proprietario `esr' pu&ograve; leggere e modificare il
file, gli altri appartenenti al gruppo `users' possono leggerlo e cos&igrave;
tutti gli altri utenti. Si tratta di un set di autorizzazioni
piuttosto tipiche per un file di dati ordinario.
<P>Ora osserviamo un file con autorizzazioni molto diverse. Tale file &egrave;
GCC, il compilatore C GNU.
<P>
<BLOCKQUOTE><CODE>
<PRE>
snark:~$ ls -l /usr/bin/gcc
-rwxr-xr-x   3 root     bin         64796 Mar 21 16:41 /usr/bin/gcc
</PRE>
</CODE></BLOCKQUOTE>
<P>Questo file appartiene a un utente chiamato `root' e ad un gruppo
chiamato `bin'; pu&ograve; essere modificato solo da root, ma letto ed
eseguito da tutti. Si tratta di un proprietario e un set di
autorizzazioni tipiche per un comando di sistema pre-installato. Il
gruppo `bin' esiste su alcuni Unix per raggruppare i comandi di
sistema (il nome &egrave; una reliquia storica, abbreviazione di `binary').
Il vostro Unix potrebbe usare invece un gruppo `root' (non esattamente
la stessa cosa dell'utente `root'!).
<P>L'utente `root' &egrave; il nome convenzionale per l'ID utente con numero 0,
un account speciale privilegiato che pu&ograve; scavalcare tutti i privilegi.
L'accesso root &egrave; utile ma pericoloso; un errore di battitura quando si
&egrave; collegati come root potrebbe rovinare file critici del sistema, cosa
che non pu&ograve; avvenire con un account utente ordinario.
<P>Poich&eacute; l'account root &egrave; cos&igrave; potente, il suo accesso dovrebbe essere
sorvegliato attentamente. La password di root &egrave; il componente pi&ugrave;
critico nelle informazioni di sicurezza del sistema, e sar&agrave; quello che
cercheranno di ottenere tutti i cracker e gli intrusi che verranno
dopo di voi.
<P>(Per quanto riguarda le password: non scrivetele su carta -- e non
scegliete password che possano essere indovinate facilmente, come il
nome della/o vostra/o ragazza/o. &Egrave; una pratica sorprendentemente
comune che aiuta continuamente i cracker...)
<P>Osserviamo ora un terzo caso:
<P>
<BLOCKQUOTE><CODE>
<PRE>
snark:~$ ls -ld ~
drwxr-xr-x  89 esr      users          9216 Jun 27 11:29 /home2/esr
snark:~$
</PRE>
</CODE></BLOCKQUOTE>
<P>Questo file &egrave; una directory (osserviamo la `d' in prima posizione).
Vediamo che pu&ograve; essere modificata solo da esr, ma letta ed eseguita da
tutti gli altri. Le autorizzazioni vengono interpretate in modo
speciale sulle directory; esse controllano l'accesso ai file contenuti
all'interno della directory.
<P>Autorizzazione in lettura su una directory &egrave; semplice; significa
semplicemente che potete esplorare la directory e aprire i file e le
directory che contiene. L'autorizzazione in scrittura (modifica) da la
possibilit&agrave; di creare e cancellare file nella directory.
Autorizzazione di esecuzione consente di effettuare <EM>ricerche</EM>
nella directory -- ovvero elencare il suo contenuto e vedere i nomi
dei file e delle directory che contiene. A volte troverete directory
che sono leggibili da tutti ma non eseguibili; questo significa che un
utente qualunque pu&ograve; accedere a file e directory al suo interno, ma
solamente se ne conosce il nome esatto.
<P>Infine, osserviamo le autorizzazioni del programma login stesso.
<P>
<BLOCKQUOTE><CODE>
<PRE>
snark:~$ ls -l /bin/login
-rwsr-xr-x   1 root     bin         20164 Apr 17 12:57 /bin/login
</PRE>
</CODE></BLOCKQUOTE>
<P>Possiede le autorizzazioni che ci aspetteremmo per un comando di
sistema -- tranne la `s' dove dovrebbe esserci il bit per
l'autorizzazione in esecuzione del proprietario. Si tratta della
manifestazione visibile di un tipo speciale di autorizzazione chiamata
`set-user-id' o <EM>bit setuid</EM>.
<P>Il bit setuid &egrave; normalmente legato a programmi che hanno la necessit&agrave;
di dare agli utenti ordinari i privilegi di root, ma in modo
controllato. Quando &egrave; impostato su un programma eseguibile, si
acquistano i privilegi del proprietario di quel file finch&eacute; si esegue
quel programma, sia che essi coincidano con i nostri oppure no.
<P>Come l'account root stesso, i programmi setuid sono utili ma
pericolosi. Chiunque sia in grado di sovvertire o modificare un
programma setuid che ha root come proprietario, pu&ograve; utilizzarlo per
accedere alla shell con privilegi di root. Per questa ragione sulla
maggior parte dei sistemi Unix, aprendo un file in scrittura
automaticamente il suo bit setuid viene disattivato. Molti attacchi
alla sicurezza su Unix tentano di scoprire bug nei programmi setuid,
con lo scopo di sovvertirli. Amministratori di sistema attenti alla
sicurezza sono quindi molto prudenti con questi programmi e riluttanti
alla installazione di nuovi.
<P>Ci sono un paio di importati dettagli che abbiamo sorvolato durante la
discussione precedente sulle autorizzazioni; in particolare, come
vengono assegnati l'utente e il gruppo proprietario quando viene
creato un file per la prima volta. Il gruppo &egrave; importante poich&eacute; gli
utenti possono essere membri di pi&ugrave; gruppi, ma uno di essi
(specificato nella voce dell'utente in <CODE>/etc/passwd</CODE>) &egrave; il <EM>gruppo di default</EM> dell'utente e normalmente possieder&agrave;
i file creati dall'utente.
<P>Per quanto riguarda i bit iniziali di autorizzazione, la faccenda &egrave;
leggermente pi&ugrave; complicata. Un programma che crea un file normalmente
specificher&agrave; le autorizzazioni con cui dovr&agrave; partire. Queste, per&ograve;,
verranno modificate da una variabile nell'ambiente dell'utente
chiamata <EM>umask</EM>. Umask speciica quali bit di
autorizzazione <EM>disattivare</EM> quando crea un file; il valore pi&ugrave;
comune, e il default sulla maggior parte dei sistemi, &egrave; -------w- o
002, che disattiva il bit di modifica per tutti gli utenti. Vedere la
documentazione per il comando umask nella pagina di manuale della
shell per maggiori dettagli.
<P>
<H2><A NAME="ss11.6">11.6 Come le cose possono andare male</A>
</H2>

<P>
<A NAME="fsck"></A> Prima accennavamo al fatto che i file system possono
essere delicati. Ora sappiamo che per raggiungere un file dobbiamo
fare il gioco della campana attraverso quella che pu&ograve; essere una
catena arbitrariamente lunga di riferimenti i-node e
directory. Supponiamo ora che sul vostro disco fisso si formi un punto
danneggiato.
<P>Se siete fortunati ci&ograve; vi far&agrave; perdere solo qualche file di dati. Se
invece siete sfortunati, si potrebbe danneggiare una struttura di
directory o un numero i-node e un intero sottoalbero del vostro
sistema
potrebbe rimanere pendente nel limbo. Oppure, peggio ancora, si
potrebbe originare una struttura rovinata che punta in pi&ugrave; modi allo
stesso blocco disco o i-node. Un danneggiamento di questo tipo si pu&ograve;
propagare a partire da una normale operazione sui file, facendo
perdere tutti i dati collegati al punto danneggiato di origine.
<P>Fortunatamente questo tipo di eventualit&agrave; &egrave; divenuto abbastanza
infrequente perch&eacute; l'hardware dei dischi &egrave; pi&ugrave; affidabile. Tuttavia,
questo comporta che il vostro Unix voglia controllare periodicamente
l'integrit&agrave; del file system per assicurarsi che non ci sia nulla fuori
posto. Gli Unix moderni compiono un rapido controllo dell'integrit&agrave; di
ciascuna partizione nella fase di avvio, giusto prima di
montarle. Ogni tot riavvii fanno un controllo molto pi&ugrave; approfondito
che impiega qualche minuto in pi&ugrave;.
<P>Se tutto questo pu&ograve; far sembrare che Unix sia terribilmente complesso
e incline a malfunzionamenti, pu&ograve; essere rassicurante sapere che
questi controlli nella fase d'avvio tipicamente intercettano e
correggono i problemi normali <EM>prima</EM> che diventino veramente
disastrosi. Altri sistemi operativi non hanno questi strumenti, cosa
che velocizza un po' l'avvio ma pu&ograve; mettervi molto di pi&ugrave; nei pasticci
quando cercate di fare un salvataggio a mano (e sempre assumendo che
abbiate una copia delle Norton Utilities o simili, tanto per
cominciare...).
<P>
<HR>
<A HREF="Unix-Internet-Fundamentals-HOWTO-12.html">Avanti</A>
<A HREF="Unix-Internet-Fundamentals-HOWTO-10.html">Indietro</A>
<A HREF="Unix-Internet-Fundamentals-HOWTO.html#toc11">Indice</A>
</BODY>
</HTML>