2475bcbe7cfdc1da68562f52ce4e2b6540f121ae
[gapil.git] / fileintro.tex
1 %% fileintro.tex
2 %%
3 %% Copyright (C) 2000-2011 Simone Piccardi.  Permission is granted to
4 %% copy, distribute and/or modify this document under the terms of the GNU Free
5 %% Documentation License, Version 1.1 or any later version published by the
6 %% Free Software Foundation; with the Invariant Sections being "Prefazione",
7 %% with no Front-Cover Texts, and with no Back-Cover Texts.  A copy of the
8 %% license is included in the section entitled "GNU Free Documentation
9 %% License".
10 %%
11
12 \chapter{L'architettura dei file}
13 \label{cha:file_intro}
14
15 Uno dei concetti fondamentali dell'architettura di un sistema Unix è il
16 cosiddetto \textit{everything is a file}, cioè il fatto che l'accesso ai vari
17 dispositivi di input/output del computer viene effettuato attraverso
18 un'interfaccia astratta che tratta le periferiche allo stesso modo dei normali
19 file di dati.
20
21 Questo significa che si può accedere a qualunque periferica del computer,
22 dalla seriale, alla parallela, alla console, e agli stessi dischi attraverso i
23 cosiddetti \index{file!di~dispositivo} file di dispositivo (i cosiddetti
24 \textit{device file}). Questi sono dei file speciali agendo sui quali i
25 programmi possono leggere, scrivere e compiere operazioni direttamente sulle
26 periferiche, usando le stesse funzioni che si usano per i normali file di
27 dati.
28
29 In questo capitolo forniremo una descrizione dell'architettura dei file in
30 Linux, iniziando da una panoramica sulle caratteristiche principali delle
31 interfacce con cui i processi accedono ai file (che tratteremo in dettaglio
32 nei capitoli seguenti), per poi passare ad una descrizione più dettagliata
33 delle modalità con cui detto accesso viene realizzato dal sistema.
34
35
36
37 \section{L'architettura generale}
38 \label{sec:file_access_arch}
39
40 Per poter accedere ai file, il kernel deve mettere a disposizione dei
41 programmi le opportune interfacce che consentano di leggerne il contenuto; il
42 sistema cioè deve provvedere ad organizzare e rendere accessibile in maniera
43 opportuna l'informazione tenuta sullo spazio grezzo disponibile sui dischi.
44 Questo viene fatto strutturando l'informazione sul disco attraverso quello che
45 si chiama un \textit{filesystem} (vedi sez.~\ref{sec:file_arch_func}), essa
46 poi viene resa disponibile ai processi attraverso quello che viene chiamato il
47 \textsl{montaggio} del \textit{filesystem}.
48
49 In questa sezione faremo una panoramica generica su come il sistema presenta
50 i file ai processi, trattando l'organizzazione di file e directory, i tipi di
51 file ed introducendo le interfacce disponibili e le loro caratteristiche.
52
53
54 \subsection{L'organizzazione di file e directory}
55 \label{sec:file_organization}
56
57 \itindbeg{pathname}
58 In Unix, a differenza di quanto avviene in altri sistemi operativi, tutti i
59 file vengono tenuti all'interno di un unico albero la cui radice (quella che
60 viene chiamata \textit{root directory}) viene montata all'avvio.  Un file
61 viene identificato dall'utente usando quello che viene chiamato
62 \textit{pathname}\footnote{il manuale della \acr{glibc} depreca questa
63   nomenclatura, che genererebbe confusione poiché \textit{path} indica anche
64   un insieme di directory su cui effettuare una ricerca (come quello in cui si
65   cercano i comandi). Al suo posto viene proposto l'uso di \textit{filename} e
66   di componente per il nome del file all'interno della directory. Non
67   seguiremo questa scelta dato che l'uso della parola \textit{pathname} è
68   ormai così comune che mantenerne l'uso è senz'altro più chiaro
69   dell'alternativa proposta.}, cioè il percorso che si deve fare per accedere
70 al file a partire dalla \textit{root directory}, che è composto da una serie
71 di nomi separati da una ``\file{/}''.
72
73 All'avvio del sistema, completata la fase di inizializzazione, il kernel
74 riceve dal bootloader l'indicazione di quale dispositivo contiene il
75 filesystem da usare come punto di partenza e questo viene montato come radice
76 dell'albero (cioè nella directory \file{/}); tutti gli ulteriori filesystem
77 che possono essere su altri dispositivi dovranno poi essere inseriti
78 nell'albero montandoli su opportune directory del filesystem montato come
79 radice.
80
81 Alcuni filesystem speciali (come \file{/proc} che contiene un'interfaccia ad
82 alcune strutture interne del kernel) sono generati automaticamente dal kernel
83 stesso, ma anche essi devono essere montati all'interno dell'albero dei file.
84
85 Una directory, come vedremo in maggior dettaglio in
86 sez.~\ref{sec:file_vfs_work}, è anch'essa un file, solo che è un file
87 particolare che il kernel riconosce come tale. Il suo scopo è quello di
88 contenere una lista di nomi di file e le informazioni che associano ciascun
89 nome al contenuto. Dato che questi nomi possono corrispondere ad un qualunque
90 oggetto del filesystem, compresa un'altra directory, si ottiene naturalmente
91 un'organizzazione ad albero inserendo nomi di directory in altre directory.
92
93 Un file può essere indicato rispetto alla directory corrente semplicemente
94 specificandone il nome\footnote{il manuale delle \acr{glibc} chiama i nomi
95   contenuti nelle directory \textsl{componenti} (in inglese \textit{file name
96     components}), noi li chiameremo più semplicemente \textsl{nomi} o
97   \textsl{voci}.}  da essa contenuto.  All'interno dello stesso albero si
98 potranno poi inserire anche tutti gli altri oggetti visti attraverso
99 l'interfaccia che manipola i file come le fifo, i link, i socket e gli stessi
100 \index{file!di~dispositivo} file di dispositivo (questi ultimi, per
101 convenzione, sono inseriti nella directory \file{/dev}).
102
103 Il nome completo di un file viene chiamato \textit{pathname} ed il
104 procedimento con cui si individua il file a cui esso fa riferimento è chiamato
105 risoluzione del nome (\textit{filename resolution} o \textit{pathname
106   resolution}).  La risoluzione viene fatta esaminando il \textit{pathname} da
107 sinistra a destra e localizzando ogni nome nella directory indicata dal nome
108 precedente usando il carattere ``\texttt{/}'' come separatore\footnote{nel
109   caso di nome vuoto, il costrutto \file{//} viene considerato equivalente a
110   \file{/}.}: ovviamente, perché il procedimento funzioni, occorre che i nomi
111 indicati come directory esistano e siano effettivamente directory, inoltre i
112 permessi (si veda sez.~\ref{sec:file_access_control}) devono consentire
113 l'accesso all'intero \textit{pathname}.
114
115 Se il \textit{pathname} comincia con il carattere ``\texttt{/}'' la ricerca
116 parte dalla directory radice del processo; questa, a meno di un \func{chroot}
117 (su cui torneremo in sez.~\ref{sec:file_chroot}) è la stessa per tutti i
118 processi ed equivale alla directory radice dell'albero dei file: in questo
119 caso si parla di un \textsl{pathname assoluto} \itindsub{pathname}{assoluto}.
120 Altrimenti la ricerca parte dalla directory corrente (su cui torneremo in
121 sez.~\ref{sec:file_work_dir}) ed il pathname è detto
122 \itindsub{pathname}{relativo} \textsl{pathname relativo}.
123
124 I nomi ``\file{.}'' e ``\file{..}'' hanno un significato speciale e vengono
125 inseriti in ogni directory: il primo fa riferimento alla directory corrente e
126 il secondo alla directory \textsl{genitrice} (o \textit{parent directory})
127 cioè la directory che contiene il riferimento alla directory corrente; nel
128 caso la directory corrente coincida con la directory radice, allora il
129 riferimento è a se stessa.  
130
131 \itindend{pathname}
132
133
134 \subsection{I tipi di file}
135 \label{sec:file_file_types}
136
137 Come detto in precedenza, in Unix esistono vari tipi di file; in Linux questi
138 sono implementati come oggetti del \textit{Virtual File System} (vedi
139 sez.~\ref{sec:file_vfs_work}) e sono presenti in tutti i filesystem unix-like
140 utilizzabili con Linux. L'elenco dei vari tipi di file definiti dal
141 \itindex{Virtual~File~System} \textit{Virtual File System} è riportato in
142 tab.~\ref{tab:file_file_types}.
143
144 Si tenga ben presente che questa classificazione non ha nulla a che fare con
145 la classificazione dei file (che in questo caso sono sempre file di dati) in
146 base al loro contenuto, o tipo di accesso. Essa riguarda invece il tipo di
147 oggetti; in particolare è da notare la presenza dei cosiddetti file speciali.
148 Alcuni di essi, come le \textit{fifo} (che tratteremo in
149 sez.~\ref{sec:ipc_named_pipe}) ed i \textit{socket} (che tratteremo in
150 cap.~\ref{cha:socket_intro}) non sono altro che dei riferimenti per utilizzare
151 delle funzionalità di comunicazione fornite dal kernel. Gli altri sono i
152 \index{file!di~dispositivo} \textsl{file di dispositivo} (o \textit{device
153   file}) che costituiscono una interfaccia diretta per leggere e scrivere sui
154 dispositivi fisici; essi vengono suddivisi in due grandi categorie, \textsl{a
155   blocchi} e \textsl{a caratteri} a seconda delle modalità in cui il
156 dispositivo sottostante effettua le operazioni di I/O.\footnote{in sostanza i
157   dispositivi a blocchi (ad esempio i dischi) corrispondono a periferiche per
158   le quali è richiesto che l'I/O venga effettuato per blocchi di dati di
159   dimensioni fissate (ad esempio le dimensioni di un settore), mentre nei
160   dispositivi a caratteri l'I/O viene effettuato senza nessuna particolare
161   struttura.}
162
163 \begin{table}[htb]
164   \footnotesize
165   \centering
166     \begin{tabular}[c]{|l|l|p{7cm}|}
167     \hline
168     \multicolumn{2}{|c|}{\textbf{Tipo di file}} & \textbf{Descrizione} \\
169     \hline
170     \hline
171       \textit{regular file} & \textsl{file regolare} &
172       Un file che contiene dei dati (l'accezione normale di file).\\
173       \textit{directory} & \textsl{cartella o direttorio} &
174       Un file che contiene una lista di nomi associati a degli
175       \index{inode} \textit{inode} (vedi sez.~\ref{sec:file_vfs}).\\
176       \textit{symbolic link} & \textsl{collegamento simbolico} &
177       Un file che contiene un riferimento ad un altro file/directory.\\
178       \textit{char device} & \textsl{dispositivo a caratteri} &
179       Un file che identifica una periferica ad accesso a caratteri.\\
180       \textit{block device} & \textsl{dispositivo a blocchi} &
181       Un file che identifica una periferica ad accesso a blocchi.\\
182       \textit{fifo} & ``\textsl{coda}'' &
183       Un file speciale che identifica una linea di comunicazione software
184       unidirezionale (vedi sez.~\ref{sec:ipc_named_pipe}).\\
185       \textit{socket} & ``\textsl{presa}''&
186       Un file speciale che identifica una linea di comunicazione software
187       bidirezionale (vedi cap.~\ref{cha:socket_intro}).\\
188     \hline
189     \end{tabular}
190     \caption{Tipologia dei file definiti nel VFS}
191     \label{tab:file_file_types}
192 \end{table}
193
194 Una delle differenze principali con altri sistemi operativi (come il VMS o
195 Windows) è che per Unix tutti i file di dati sono identici e contengono un
196 flusso continuo di byte. Non esiste cioè differenza per come vengono visti dal
197 sistema file di diverso contenuto o formato (come nel caso di quella fra file
198 di testo e binari che c'è in Windows) né c'è una strutturazione a record per
199 il cosiddetto ``\textsl{accesso diretto}'' come nel caso del
200 VMS.\footnote{questo vale anche per i dispositivi a blocchi: la strutturazione
201   dell'I/O in blocchi di dimensione fissa avviene solo all'interno del kernel,
202   ed è completamente trasparente all'utente. Inoltre talvolta si parla di
203   \textsl{accesso diretto} riferendosi alla capacità, che non ha niente a che
204   fare con tutto ciò, di effettuare, attraverso degli appositi
205   \index{file!di~dispositivo} file di dispositivo, operazioni di I/O
206   direttamente sui dischi senza passare attraverso un filesystem, il
207   cosiddetto \textit{raw access}, introdotto coi kernel della serie 2.4.x ed
208   in sostanziale disuso.}
209
210 Una seconda differenza è nel formato dei file di testo: in Unix la fine riga è
211 codificata in maniera diversa da Windows o dal vecchio MacOS, in particolare
212 il fine riga è il carattere \texttt{LF} (o \verb|\n|) al posto del \texttt{CR}
213 (\verb|\r|) del vecchio MacOS e del \texttt{CR LF} di Windows.\footnote{per
214   questo esistono in Linux dei programmi come \cmd{unix2dos} e \cmd{dos2unix}
215   che effettuano una conversione fra questi due formati di testo.} Questo può
216 causare alcuni problemi qualora nei programmi si facciano assunzioni sul
217 terminatore della riga.
218
219 Si ricordi infine che un kernel Unix non fornisce nessun supporto per la
220 tipizzazione dei file di dati e che non c'è nessun supporto del sistema per le
221 estensioni come parte del filesystem.\footnote{non è così ad esempio nel
222   filesystem HFS dei Mac, che supporta delle risorse associate ad ogni file,
223   che specificano fra l'altro il contenuto ed il programma da usare per
224   leggerlo. In realtà per alcuni filesystem esiste la possibilità di
225   associare delle risorse ai file con gli \textit{extended attributes} (vedi
226   sez.~\ref{sec:file_xattr}), ma è una caratteristica tutt'ora poco
227   utilizzata, dato che non corrisponde al modello classico dei file in un
228   sistema Unix.} Ciò nonostante molti programmi adottano delle convenzioni per
229 i nomi dei file, ad esempio il codice C normalmente si mette in file con
230 l'estensione \file{.c}; un'altra tecnica molto usata è quella di utilizzare i
231 primi 4 byte del file per memorizzare un \textit{magic number} che classifichi
232 il contenuto; entrambe queste tecniche, per quanto usate ed accettate in
233 maniera diffusa, restano solo delle convenzioni il cui rispetto è demandato
234 alle applicazioni stesse.
235
236
237 \subsection{Le due interfacce ai file}
238 \label{sec:file_io_api}
239
240 In Linux le modalità di accesso ai file e le relative interfacce di
241 programmazione sono due, basate su due diversi meccanismi con cui è possibile
242 accedere al loro contenuto.
243
244 La prima è l'interfaccia standard di Unix, quella che il manuale delle
245 \textsl{glibc} chiama interfaccia dei descrittori di file (o \textit{file
246   descriptor}).  È un'interfaccia specifica dei sistemi unix-like e fornisce
247 un accesso non bufferizzato; la tratteremo in dettaglio in
248 cap.~\ref{cha:file_unix_interface}.
249
250 L'interfaccia è primitiva ed essenziale, l'accesso viene detto non
251 bufferizzato in quanto la lettura e la scrittura vengono eseguite chiamando
252 direttamente le system call del kernel (in realtà il kernel effettua al suo
253 interno alcune bufferizzazioni per aumentare l'efficienza nell'accesso ai
254 dispositivi); i \index{file!descriptor} \textit{file descriptor} sono
255 rappresentati da numeri interi (cioè semplici variabili di tipo \ctyp{int}).
256 L'interfaccia è definita nell'header \file{unistd.h}.
257
258 La seconda interfaccia è quella che il manuale della \acr{glibc} chiama degli
259 \index{file!stream} \textit{stream}.\footnote{in realtà una interfaccia con lo
260   stesso nome è stata introdotta a livello di kernel negli Unix derivati da
261   \textit{System V}, come strato di astrazione per file e socket; in Linux
262   questa interfaccia, che comunque ha avuto poco successo, non esiste, per cui
263   facendo riferimento agli \index{file!stream} \textit{stream} useremo il
264   significato adottato dal manuale delle \acr{glibc}.} Essa fornisce funzioni
265 più evolute e un accesso bufferizzato (controllato dalla implementazione fatta
266 dalle \acr{glibc}), la tratteremo in dettaglio nel
267 cap.~\ref{cha:files_std_interface}.
268
269 Questa è l'interfaccia standard specificata dall'ANSI C e perciò si trova
270 anche su tutti i sistemi non Unix. Gli \index{file!stream} \textit{stream}
271 sono oggetti complessi e sono rappresentati da puntatori ad un opportuna
272 struttura definita dalle librerie del C; si accede ad essi sempre in maniera
273 indiretta utilizzando il tipo \ctyp{FILE *}.  L'interfaccia è definita
274 nell'header \file{stdio.h}.
275
276 Entrambe le interfacce possono essere usate per l'accesso ai file come agli
277 altri oggetti del VFS (fifo, socket, dispositivi, sui quali torneremo in
278 dettaglio a tempo opportuno), ma per poter accedere alle operazioni di
279 controllo (descritte in sez.~\ref{sec:file_fcntl} e sez.~\ref{sec:file_ioctl})
280 su un qualunque tipo di oggetto del VFS occorre usare l'interfaccia standard
281 di Unix con i \textit{file descriptor}. Allo stesso modo devono essere usati i
282 \index{file!descriptor} \textit{file descriptor} se si vuole ricorrere a
283 modalità speciali di I/O come il \index{file!locking} \textit{file locking} o
284 l'I/O non-bloccante (vedi cap.~\ref{cha:file_advanced}).
285
286 Gli \textit{stream} forniscono un'interfaccia di alto livello costruita sopra
287 quella dei \textit{file descriptor}, che permette di poter scegliere tra
288 diversi stili di bufferizzazione.  Il maggior vantaggio degli \textit{stream}
289 è che l'interfaccia per le operazioni di input/output è enormemente più ricca
290 di quella dei \textit{file descriptor}, che forniscono solo funzioni
291 elementari per la lettura/scrittura diretta di blocchi di byte.  In
292 particolare gli \index{file!stream} \textit{stream} dispongono di tutte le
293 funzioni di formattazione per l'input e l'output adatte per manipolare anche i
294 dati in forma di linee o singoli caratteri.
295
296 In ogni caso, dato che gli stream sono implementati sopra l'interfaccia
297 standard di Unix, è sempre possibile estrarre il \textit{file descriptor} da
298 uno stream ed eseguirvi operazioni di basso livello, o associare in un secondo
299 tempo uno \index{file!stream} \textit{stream} ad un \index{file!descriptor}
300 \textit{file descriptor}.
301
302 In generale, se non necessitano specificatamente le funzionalità di basso
303 livello, è opportuno usare sempre gli \index{file!stream} \textit{stream} per
304 la loro maggiore portabilità, essendo questi ultimi definiti nello standard
305 ANSI C; l'interfaccia con i \index{file!descriptor} \textit{file descriptor}
306 infatti segue solo lo standard POSIX.1 dei sistemi Unix, ed è pertanto di
307 portabilità più limitata.
308
309
310
311 \section{L'architettura della gestione dei file}
312 \label{sec:file_arch_func}
313
314 In questa sezione esamineremo come viene implementato l'accesso ai file in
315 Linux, come il kernel può gestire diversi tipi di filesystem, descrivendo
316 prima le caratteristiche generali di un filesystem di un sistema unix-like,
317 per poi trattare in maniera un po' più dettagliata il filesystem più usato con
318 Linux, l'\acr{ext2} (e derivati).
319
320
321 \subsection{Il \textit{Virtual File System} di Linux}
322 \label{sec:file_vfs}
323
324 % articolo interessante:
325 % http://www.ibm.com/developerworks/linux/library/l-virtual-filesystem-switch/index.html?ca=dgr-lnxw97Linux-VFSdth-LXdW&S_TACT=105AGX59&S_CMP=GRlnxw97
326
327 \itindbeg{Virtual~File~System}
328
329 In Linux il concetto di \textit{everything is a file} è stato implementato
330 attraverso il \textit{Virtual File System} (da qui in avanti VFS) che è uno
331 strato intermedio che il kernel usa per accedere ai più svariati filesystem
332 mantenendo la stessa interfaccia per i programmi in user space. Esso fornisce
333 un livello di indirezione che permette di collegare le operazioni di
334 manipolazione sui file alle operazioni di I/O, e gestisce l'organizzazione di
335 queste ultime nei vari modi in cui i diversi filesystem le effettuano,
336 permettendo la coesistenza di filesystem differenti all'interno dello stesso
337 albero delle directory.
338
339 Quando un processo esegue una system call che opera su un file, il kernel
340 chiama sempre una funzione implementata nel VFS; la funzione eseguirà le
341 manipolazioni sulle strutture generiche e utilizzerà poi la chiamata alle
342 opportune funzioni del filesystem specifico a cui si fa riferimento. Saranno
343 queste a chiamare le funzioni di più basso livello che eseguono le operazioni
344 di I/O sul dispositivo fisico, secondo lo schema riportato in
345 fig.~\ref{fig:file_VFS_scheme}.
346
347 \begin{figure}[!htb]
348   \centering
349   \includegraphics[width=7cm]{img/vfs}
350   \caption{Schema delle operazioni del VFS.}
351   \label{fig:file_VFS_scheme}
352 \end{figure}
353
354 Il VFS definisce un insieme di funzioni che tutti i filesystem devono
355 implementare. L'interfaccia comprende tutte le funzioni che riguardano i file;
356 le operazioni sono suddivise su tre tipi di oggetti: \textit{filesystem},
357 \index{inode} \textit{inode} e \textit{file}, corrispondenti a tre apposite
358 strutture definite nel kernel.
359
360 Il VFS usa una tabella mantenuta dal kernel che contiene il nome di ciascun
361 filesystem supportato: quando si vuole inserire il supporto di un nuovo
362 filesystem tutto quello che occorre è chiamare la funzione
363 \code{register\_filesystem} passandole un'apposita struttura
364 \code{file\_system\_type} che contiene i dettagli per il riferimento
365 all'implementazione del medesimo, che sarà aggiunta alla citata tabella.
366
367 In questo modo quando viene effettuata la richiesta di montare un nuovo disco
368 (o qualunque altro \textit{block device} che può contenere un filesystem), il
369 VFS può ricavare dalla citata tabella il puntatore alle funzioni da chiamare
370 nelle operazioni di montaggio. Quest'ultima è responsabile di leggere da disco
371 il superblock (vedi sez.~\ref{sec:file_ext2}), inizializzare tutte le variabili
372 interne e restituire uno speciale descrittore dei filesystem montati al VFS;
373 attraverso quest'ultimo diventa possibile accedere alle funzioni specifiche per
374 l'uso di quel filesystem.
375
376 Il primo oggetto usato dal VFS è il descrittore di filesystem, un puntatore ad
377 una apposita struttura che contiene vari dati come le informazioni comuni ad
378 ogni filesystem, i dati privati relativi a quel filesystem specifico, e i
379 puntatori alle funzioni del kernel relative al filesystem. Il VFS può così
380 usare le funzioni contenute nel \textit{filesystem descriptor} per accedere
381 alle funzioni specifiche di quel filesystem.
382
383 Gli altri due descrittori usati dal VFS sono relativi agli altri due oggetti
384 su cui è strutturata l'interfaccia. Ciascuno di essi contiene le informazioni
385 relative al file in uso, insieme ai puntatori alle funzioni dello specifico
386 filesystem usate per l'accesso dal VFS; in particolare il descrittore
387 \index{inode} dell'inode contiene i puntatori alle funzioni che possono essere
388 usate su qualunque file (come \func{link}, \func{stat} e \func{open}), mentre
389 il descrittore di file contiene i puntatori alle funzioni che vengono usate
390 sui file già aperti.
391
392
393 \subsection{Il funzionamento del \textit{Virtual File System}}
394 \label{sec:file_vfs_work}
395
396 La funzione più importante implementata dal VFS è la system call \func{open}
397 che permette di aprire un file. Dato un \itindex{pathname} \textit{pathname}
398 viene eseguita una ricerca dentro la \textit{directory entry cache} (in breve
399 \textit{dcache}), una tabella che contiene tutte le \textit{directory entry}
400 (in breve \textit{dentry}) che permette di associare in maniera rapida ed
401 efficiente il \textit{pathname} a una specifica \textit{dentry}.
402
403 Una singola \textit{dentry} contiene in genere il puntatore ad un
404 \index{inode} \textit{inode}; quest'ultimo è la struttura base che sta sul
405 disco e che identifica un singolo oggetto del VFS sia esso un file ordinario,
406 una directory, un link simbolico, una FIFO, un file di
407 \index{file!di~dispositivo} dispositivo, o una qualsiasi altra cosa che possa
408 essere rappresentata dal VFS (i tipi di file riportati in
409 tab.~\ref{tab:file_file_types}). A ciascuno di essi è associata pure una
410 struttura che sta in memoria, e che, oltre alle informazioni sullo specifico
411 file, contiene anche il riferimento alle funzioni (i \textsl{metodi} del VFS)
412 da usare per poterlo manipolare.
413
414 Le \textit{dentry} ``vivono'' in memoria e non vengono mai salvate su disco,
415 vengono usate per motivi di velocità, gli \index{inode} \textit{inode} invece
416 stanno su disco e vengono copiati in memoria quando serve, ed ogni cambiamento
417 viene copiato all'indietro sul disco (aggiornando i cosiddetti
418 \textsl{metadati} del file), gli \index{inode} inode che stanno in memoria
419 sono \index{inode} inode del VFS ed è ad essi che puntano le singole
420 \textit{dentry}.
421
422 La \textit{dcache} costituisce perciò una sorta di vista completa di tutto
423 l'albero dei file, ovviamente per non riempire tutta la memoria questa vista è
424 parziale (la \textit{dcache} cioè contiene solo le \textit{dentry} per i file
425 per i quali è stato richiesto l'accesso), quando si vuole risolvere un nuovo
426 \itindex{pathname} \textit{pathname} il VFS deve creare una nuova
427 \textit{dentry} e caricare \index{inode} l'inode corrispondente in memoria.
428
429 Questo procedimento viene eseguito dal metodo \code{lookup()} \index{inode}
430 dell'inode della directory che contiene il file; questo viene installato nelle
431 relative strutture in memoria quando si effettua il montaggio lo specifico
432 filesystem su cui l'inode va a vivere.
433
434 Una volta che il VFS ha a disposizione la \textit{dentry} (ed il relativo
435 \textit{inode}) diventa possibile accedere alle varie operazioni sul file come
436 la \func{open} per aprire il file o la \func{stat} per leggere i dati
437 \index{inode} dell'inode e passarli in user space.
438
439 L'apertura di un file richiede comunque un'altra operazione, l'allocazione di
440 una struttura di tipo \struct{file} in cui viene inserito un puntatore alla
441 \textit{dentry} e una struttura \struct{f\_ops} che contiene i puntatori ai
442 metodi che implementano le operazioni disponibili sul file. In questo modo i
443 processi in user space possono accedere alle operazioni attraverso detti
444 metodi, che saranno diversi a seconda del tipo di file (o dispositivo) aperto
445 (su questo torneremo in dettaglio in sez.~\ref{sec:file_fd}). Un elenco delle
446 operazioni previste dal kernel è riportato in
447 tab.~\ref{tab:file_file_operations}.
448
449 \begin{table}[htb]
450   \centering
451   \footnotesize
452   \begin{tabular}[c]{|l|p{8cm}|}
453     \hline
454     \textbf{Funzione} & \textbf{Operazione} \\
455     \hline
456     \hline
457     \textsl{\code{open}}   & Apre il file (vedi sez.~\ref{sec:file_open}).\\
458     \textsl{\code{read}}   & Legge dal file (vedi sez.~\ref{sec:file_read}).\\
459     \textsl{\code{write}}  & Scrive sul file (vedi 
460                              sez.~\ref{sec:file_write}).\\
461     \textsl{\code{llseek}} & Sposta la posizione corrente sul file (vedi
462                              sez.~\ref{sec:file_lseek}).\\
463     \textsl{\code{ioctl}}  & Accede alle operazioni di controllo 
464                              (vedi sez.~\ref{sec:file_ioctl}).\\
465     \textsl{\code{readdir}}& Legge il contenuto di una directory (vedi 
466                              sez.~\ref{sec:file_dir_read}).\\
467     \textsl{\code{poll}}   & Usata nell'I/O multiplexing (vedi
468                              sez.~\ref{sec:file_multiplexing}).\\
469     \textsl{\code{mmap}}   & Mappa il file in memoria (vedi 
470                              sez.~\ref{sec:file_memory_map}).\\
471     \textsl{\code{release}}& Chiamata quando l'ultimo riferimento a un file 
472                              aperto è chiuso.\\
473     \textsl{\code{fsync}}  & Sincronizza il contenuto del file (vedi
474                              sez.~\ref{sec:file_sync}).\\
475     \textsl{\code{fasync}} & Abilita l'I/O asincrono (vedi
476                              sez.~\ref{sec:file_asyncronous_io}) sul file.\\
477     \hline
478   \end{tabular}
479   \caption{Operazioni sui file definite nel VFS.}
480   \label{tab:file_file_operations}
481 \end{table}
482
483 In questo modo per ciascun file diventano possibili una serie di operazioni
484 (non è detto che tutte siano disponibili), che costituiscono l'interfaccia
485 astratta del VFS.  Qualora se ne voglia eseguire una, il kernel andrà ad
486 utilizzare l'opportuna funzione dichiarata in \struct{f\_ops} appropriata al
487 tipo di file in questione.
488
489 Pertanto è possibile scrivere allo stesso modo sulla porta seriale come su un
490 normale file di dati; ovviamente certe operazioni (nel caso della seriale ad
491 esempio la \code{seek}) non saranno disponibili, però con questo sistema
492 l'utilizzo di diversi filesystem (come quelli usati da Windows o MacOS) è
493 immediato e (relativamente) trasparente per l'utente ed il programmatore.
494 \itindend{Virtual~File~System}
495
496
497 \subsection{Il funzionamento di un filesystem Unix}
498 \label{sec:file_filesystem}
499
500 Come già accennato in sez.~\ref{sec:file_organization} Linux (ed ogni sistema
501 unix-like) organizza i dati che tiene su disco attraverso l'uso di un
502 filesystem. Una delle caratteristiche di Linux rispetto agli altri Unix è
503 quella di poter supportare, grazie al VFS, una enorme quantità di filesystem
504 diversi, ognuno dei quali ha una sua particolare struttura e funzionalità
505 proprie.  Per questo per il momento non entreremo nei dettagli di un
506 filesystem specifico, ma daremo una descrizione a grandi linee che si adatta
507 alle caratteristiche comuni di qualunque filesystem di sistema unix-like.
508
509 Lo spazio fisico di un disco viene usualmente diviso in partizioni; ogni
510 partizione può contenere un filesystem. La strutturazione tipica
511 dell'informazione su un disco è riportata in fig.~\ref{fig:file_disk_filesys};
512 in essa si fa riferimento alla struttura del filesystem \acr{ext2}, che
513 prevede una separazione dei dati in \textit{block group} che replicano il
514 superblock (ma sulle caratteristiche di \acr{ext2} e derivati torneremo in
515 sez.~\ref{sec:file_ext2}). È comunque caratteristica comune di tutti i
516 filesystem per Unix, indipendentemente da come poi viene strutturata nei
517 dettagli questa informazione, prevedere una divisione fra la lista degli
518 \index{inode} inode e lo spazio a disposizione per i dati e le directory.
519
520 \begin{figure}[!htb]
521   \centering
522   \includegraphics[width=14cm]{img/disk_struct}
523   \caption{Organizzazione dello spazio su un disco in partizioni e
524   filesystem.}
525   \label{fig:file_disk_filesys}
526 \end{figure}
527
528 Se si va ad esaminare con maggiore dettaglio la strutturazione
529 dell'informazione all'interno del singolo filesystem (tralasciando i dettagli
530 relativi al funzionamento del filesystem stesso come la strutturazione in
531 gruppi dei blocchi, il superblock e tutti i dati di gestione) possiamo
532 esemplificare la situazione con uno schema come quello esposto in
533 fig.~\ref{fig:file_filesys_detail}.
534
535 \begin{figure}[!htb]
536   \centering
537   \includegraphics[width=14cm]{img/filesys_struct}
538   \caption{Strutturazione dei dati all'interno di un filesystem.}
539   \label{fig:file_filesys_detail}
540 \end{figure}
541
542 Da fig.~\ref{fig:file_filesys_detail} si evidenziano alcune delle
543 caratteristiche di base di un filesystem, sulle quali è bene porre attenzione
544 visto che sono fondamentali per capire il funzionamento delle funzioni che
545 manipolano i file e le directory che tratteremo nel prossimo capitolo; in
546 particolare è opportuno ricordare sempre che:
547
548 \begin{enumerate}
549   
550 \item L'\textit{inode} \index{inode} contiene tutte le informazioni (i
551   cosiddetti \textsl{metadati}) riguardanti il file: il tipo di file, i
552   permessi di accesso, le dimensioni, i puntatori ai blocchi fisici che
553   contengono i dati e così via. Le informazioni che la funzione \func{stat}
554   fornisce provengono dall'\textit{inode}; dentro una directory si troverà
555   solo il nome del file e il numero \index{inode} dell'\textit{inode} ad esso
556   associato, cioè quella che da qui in poi chiameremo una \textsl{voce} (come
557   traduzione dell'inglese \textit{directory entry}, che non useremo anche per
558   evitare confusione con le \textit{dentry} del kernel di cui si parlava in
559   sez.~\ref{sec:file_vfs}).
560   
561 \item Come mostrato in fig.~\ref{fig:file_filesys_detail} si possono avere più
562   voci che puntano allo stesso \textit{inode}. Ogni \textit{inode} ha un
563   contatore che contiene il numero di riferimenti che sono stati fatti ad esso
564   (il cosiddetto \textit{link count}); solo quando questo contatore si annulla
565   i dati del file vengono effettivamente rimossi dal disco. Per questo la
566   funzione per cancellare un file si chiama \func{unlink}, ed in realtà non
567   cancella affatto i dati del file, ma si limita ad eliminare la relativa voce
568   da una directory e decrementare il numero di riferimenti \index{inode}
569   nell'\textit{inode}.
570   
571 \item Il numero di \textit{inode} nella voce si riferisce ad un \textit{inode}
572   nello stesso filesystem e non ci può essere una directory che contiene
573   riferimenti ad \index{inode} \textit{inode} relativi ad altri filesystem.
574   Questo limita l'uso del comando \cmd{ln} (che crea una nuova voce per un
575   file esistente con la funzione \func{link}) al filesystem corrente.
576   
577 \item Quando si cambia nome ad un file senza cambiare filesystem, il contenuto
578   del file non viene spostato fisicamente, viene semplicemente creata una
579   nuova voce per \index{inode} l'\textit{inode} in questione e rimossa la
580   vecchia (questa è la modalità in cui opera normalmente il comando \cmd{mv}
581   attraverso la funzione \func{rename}). Questa operazione non modifica
582   minimamente neanche l'\textit{inode} del file dato che non si opera su
583   questo ma sulla directory che lo contiene.
584
585 \item Gli \textit{inode} dei file, che contengono i \textsl{metadati} ed i
586   blocchi di spazio disco, che contengono i dati, sono risorse indipendenti ed
587   in genere vengono gestite come tali anche dai diversi filesystem; è pertanto
588   possibile sia esaurire lo spazio disco (caso più comune) che lo spazio per
589   gli \textit{inode}, nel primo caso non sarà possibile allocare ulteriore
590   spazio, ma si potranno creare file (vuoti), nel secondo non si potranno
591   creare nuovi file, ma si potranno estendere quelli che ci sono.
592
593 \end{enumerate}
594
595 Infine si noti che, essendo file pure loro, il numero di riferimenti esiste
596 anche per le directory; per cui, se a partire dalla situazione mostrata in
597 fig.~\ref{fig:file_filesys_detail} creiamo una nuova directory \file{img}
598 nella directory \file{gapil}, avremo una situazione come quella in
599 fig.~\ref{fig:file_dirs_link}, dove per chiarezza abbiamo aggiunto dei numeri
600 di \index{inode} inode.
601
602 \begin{figure}[!htb]
603   \centering 
604   \includegraphics[width=14cm]{img/dir_links}
605   \caption{Organizzazione dei \textit{link} per le directory.}
606   \label{fig:file_dirs_link}
607 \end{figure}
608
609 La nuova directory avrà allora un numero di riferimenti pari a due, in quanto
610 è referenziata dalla directory da cui si era partiti (in cui è inserita la
611 nuova voce che fa riferimento a \texttt{img}) e dalla voce ``\texttt{.}''  che
612 è sempre inserita in ogni directory; questo vale sempre per ogni directory che
613 non contenga a sua volta altre directory. Al contempo, la directory da cui si
614 era partiti avrà un numero di riferimenti di almeno tre, in quanto adesso sarà
615 referenziata anche dalla voce ``\texttt{..}'' di \texttt{img}.
616
617
618 \subsection{I filesystem di uso comune}
619 \label{sec:file_ext2}
620
621 Il filesystem standard più usato con Linux è il cosiddetto \textit{third
622   extended filesystem}, identificato dalla sigla \acr{ext3}.\footnote{si fa
623   riferimento al momento della stesura di questo paragrafo, l'inizio del
624   2010.} Esso nasce come evoluzione del precedente \textit{second extended
625   filesystem}, o \acr{ext2}, di cui eredita gran parte delle caratteristiche
626 di base, per questo motivo parleremo anzitutto di questo, dato che molto di
627 quanto diremo si applica anche ad \acr{ext3}. A partire dal kernel 2.6.XX è
628 stato dichiarato stabile il nuovo filsesystem \textit{ext4}, ulteriore
629 evoluzione di \textit{ext3} dotato di molte caratteristiche avanzate, che sta
630 iniziando a sostituirlo gradualmente.
631
632 Il filesystem \acr{ext2} nasce come filesystem nativo di Linux a partire dalle
633 prime versioni del kernel e supporta tutte le caratteristiche di un filesystem
634 standard Unix: è in grado di gestire nomi di file lunghi (256 caratteri,
635 estensibili a 1012) e supporta una dimensione massima dei file fino a 4~Tb. I
636 successivi filesystem \acr{ext3} ed \acr{ext4} sono evoluzioni di questo
637 filesystem, e sia pure con molti miglioramenti ed estensioni significative ne
638 mantengono in sostanza le caratteristiche fondamentali.
639
640 Oltre alle caratteristiche standard, \acr{ext2} fornisce alcune estensioni che
641 non sono presenti su un classico filesystem di tipo Unix; le principali sono
642 le seguenti:
643 \begin{itemize}
644 \item i \textit{file attributes} consentono di modificare il comportamento del
645   kernel quando agisce su gruppi di file. Possono essere impostati su file e
646   directory e in quest'ultimo caso i nuovi file creati nella directory
647   ereditano i suoi attributi.
648 \item sono supportate entrambe le semantiche di BSD e SVr4 come opzioni di
649   montaggio. La semantica BSD comporta che i file in una directory sono creati
650   con lo stesso identificatore di gruppo della directory che li contiene. La
651   semantica SVr4 comporta che i file vengono creati con l'identificatore del
652   gruppo primario del processo, eccetto il caso in cui la directory ha il bit
653   di \acr{sgid} impostato (per una descrizione dettagliata del significato di
654   questi termini si veda sez.~\ref{sec:file_access_control}), nel qual caso
655   file e subdirectory ereditano sia il \acr{gid} che lo \acr{sgid}.
656 \item l'amministratore può scegliere la dimensione dei blocchi del filesystem
657   in fase di creazione, a seconda delle sue esigenze (blocchi più grandi
658   permettono un accesso più veloce, ma sprecano più spazio disco).
659 \item il filesystem implementa link simbolici veloci, in cui il nome del file
660   non è salvato su un blocco, ma tenuto all'interno \index{inode} dell'inode
661   (evitando letture multiple e spreco di spazio), non tutti i nomi però
662   possono essere gestiti così per limiti di spazio (il limite è 60 caratteri).
663 \item vengono supportati i file immutabili (che possono solo essere letti) per
664   la protezione di file di configurazione sensibili, o file
665   \textit{append-only} che possono essere aperti in scrittura solo per
666   aggiungere dati (caratteristica utilizzabile per la protezione dei file di
667   log).
668 \end{itemize}
669
670 La struttura di \acr{ext2} è stata ispirata a quella del filesystem di BSD: un
671 filesystem è composto da un insieme di blocchi, la struttura generale è quella
672 riportata in fig.~\ref{fig:file_filesys_detail}, in cui la partizione è divisa
673 in gruppi di blocchi.\footnote{non si confonda questa definizione con
674   quella riportata in fig.~\ref{fig:file_dirent_struct}; in quel caso si fa
675   riferimento alla struttura usata in user space per riportare i dati
676   contenuti in una directory generica, questa fa riferimento alla struttura
677   usata dal kernel per un filesystem \acr{ext2}, definita nel file
678   \texttt{ext2\_fs.h} nella directory \texttt{include/linux} dei sorgenti del
679   kernel.}
680
681 Ciascun gruppo di blocchi contiene una copia delle informazioni essenziali del
682 filesystem (superblock e descrittore del filesystem sono quindi ridondati) per
683 una maggiore affidabilità e possibilità di recupero in caso di corruzione del
684 superblock principale. L'utilizzo di raggruppamenti di blocchi ha inoltre
685 degli effetti positivi nelle prestazioni dato che viene ridotta la distanza
686 fra i dati e la tabella degli \index{inode} inode.
687
688 \begin{figure}[!htb]
689   \centering
690   \includegraphics[width=9cm]{img/dir_struct}  
691   \caption{Struttura delle directory nel \textit{second extented filesystem}.}
692   \label{fig:file_ext2_dirs}
693 \end{figure}
694
695 Le directory sono implementate come una \itindex{linked~list} \textit{linked
696   list} con voci di dimensione variabile. Ciascuna voce della lista contiene
697 il numero di inode \index{inode}, la sua lunghezza, il nome del file e la sua
698 lunghezza, secondo lo schema in fig.~\ref{fig:file_ext2_dirs}; in questo modo
699 è possibile implementare nomi per i file anche molto lunghi (fino a 1024
700 caratteri) senza sprecare spazio disco.
701
702 Con l'introduzione del filesystem \textit{ext3} sono state introdotte anche
703 alcune modifiche strutturali, la principale di queste è quella che
704 \textit{ext3} è un filesystem \textit{jounrnaled}, è cioè in grado di eseguire
705 una registrazione delle operazioni di scrittura su un giornale (uno speciale
706 file interno) in modo da poter garantire il ripristino della coerenza dei dati
707 del filesystem\footnote{si noti bene che si è parlato di dati \textsl{del}
708   filesystem, non di dati \textsl{nel} filesystem, quello di cui viene
709   garantito un veloce ripristino è relativo ai dati della struttura interna
710   del filesystem, non di eventuali dati contenuti nei file che potrebbero
711   essere stati persi.} in brevissimo tempo in caso di interruzione improvvisa
712 della corrente o di crollo del sistema che abbia causato una interruzione
713 della scrittura dei dati sul disco.
714
715 Oltre a questo \textit{ext3} introduce ulteriori modifiche volte a migliorare
716 sia le prestazioni che la semplicità di gestione del filesystem, in
717 particolare per le directory si è passato all'uso di alberi binari con
718 indicizzazione tramite hash al posto delle \textit{linked list}, ottenendo un
719 forte guadagno di prestazioni in caso di directory contenenti un gran numero
720 di file. 
721
722 % TODO portare a ext3, ext4 e btrfs ed illustrare le problematiche che si
723 % possono incontrare (in particolare quelle relative alla perdita di contenuti
724 % in caso di crash del sistema)
725
726
727 % LocalWords:  everything is device kernel filesystem sez pathname root glibc
728 % LocalWords:  path filename bootloader proc name components fifo socket dev LF
729 % LocalWords:  resolution chroot parent Virtual System like tab cap l'I regular
730 % LocalWords:  inode symbolic char block VFS VMS Windows dell'I raw access Mac
731 % LocalWords:  CR dos HFS l'XFS SGI magic number descriptor system call int ext
732 % LocalWords:  nell'header unistd stream dall'ANSI stdio locking POSIX fig type
733 % LocalWords:  register superblock dell'inode stat entry cache dcache dentry ln
734 % LocalWords:  l'inode lookup ops read write llseek ioctl readdir poll nell'I
735 % LocalWords:  multiplexing mmap fsync fasync seek group dall' dell' img
736 % LocalWords:  count unlink nell' rename gapil second Tb attributes BSD SVr gid
737 % LocalWords:  sgid append only log fs linux extented linked list third MacOS
738
739
740 %%% Local Variables: 
741 %%% mode: latex
742 %%% TeX-master: "gapil"
743 %%% End: