X-Git-Url: https://gapil.gnulinux.it/gitweb/?p=gapil.git;a=blobdiff_plain;f=fileintro.tex;h=794d61159b96fe74cb463c39be53c3697fbdc405;hp=15e2fd82fbd77d9004b4fccd7973c75d691d57c7;hb=65a5b6a82bdcfeefa6ebc270fe759f3a38560d33;hpb=9aeb46d93d970f26f1939d3853e4a9e62b2eb5b9 diff --git a/fileintro.tex b/fileintro.tex index 15e2fd8..794d611 100644 --- a/fileintro.tex +++ b/fileintro.tex @@ -25,13 +25,13 @@ delle modalit \section{L'architettura generale} \label{sec:file_access_arch} -Per poter accedere ai file il kernel deve mettere a disposizione dei programmi -le opportune interfacce che consentano di leggerne il contenuto; il sistema -cioè deve provvedere ad organizzare e rendere accessibile in maniera opportuna -l'informazione tenuta sullo spazio grezzo disponibile sui dischi. Questo viene -fatto strutturando l'informazione sul disco attraverso quello che si chiama un -\textit{filesystem} (vedi \ref{sec:file_arch_func}), essa poi viene resa -disponibile ai processi attraverso quello che viene chiamato il +Per poter accedere ai file, il kernel deve mettere a disposizione dei +programmi le opportune interfacce che consentano di leggerne il contenuto; il +sistema cioè deve provvedere ad organizzare e rendere accessibile in maniera +opportuna l'informazione tenuta sullo spazio grezzo disponibile sui dischi. +Questo viene fatto strutturando l'informazione sul disco attraverso quello che +si chiama un \textit{filesystem} (vedi \ref{sec:file_arch_func}), essa poi +viene resa disponibile ai processi attraverso quello che viene chiamato il \textsl{montaggio} del \textit{filesystem}. % (approfondiremo tutto ciò in \secref{sec:file_arch_func}). @@ -47,21 +47,24 @@ In Unix, a differenza di quanto avviene in altri sistemi operativi, tutti i file vengono tenuti all'interno di un unico albero la cui radice (quella che viene chiamata \textit{root directory}) viene montata all'avvio. Un file viene identificato dall'utente usando quello che viene chiamato -\textit{pathname}\footnote{anche se il manuale della \acr{glibc} depreca - questa nomenclatura, poiché genererebbe confusione, dato che con - \textit{path} si indica anche un insieme di directory su cui effettuare una - ricerca (come quello in cui si cercano i comandi) non seguiremo questa - scelta dato che l'uso della parola \textit{pathname} è ormai così comune che - mantenerne l'uso è senz'altro più chiaro dell'alternativa proposta.}, cioè -il percorso che si deve fare per accedere al file a partire dalla \textit{root - directory}, che è composto da una serie di nomi separati da una \file{/}. - -All'avvio del sistema, comletata la fase di inizializzazione il kernel riceve -dal boot loader l'indicazione di quale dispositivo contiene il filesystem da -usare come punto di partenza e questo viene montato come radice dell'albero -(cioè nella directory \file{/}); tutti gli ulteriori filesystem che possono -essere su altri dispositivi dovranno poi essere inseriti nell'albero -montandoli su opportune directory del filesystem montato come radice. +\textit{pathname}\footnote{il manuale della \acr{glibc} depreca questa + nomenclatura, che genererebbe confusione poiché \textit{path} indica anche + un insieme di directory su cui effettuare una ricerca (come quello in cui si + cercano i comandi). Al suo posto viene proposto l'uso di \textit{filename} e + di componente per il nome del file all'interno della directory. Non + seguiremo questa scelta dato che l'uso della parola \textit{pathname} è + ormai così comune che mantenerne l'uso è senz'altro più chiaro + dell'alternativa proposta.}, cioè il percorso che si deve fare per accedere +al file a partire dalla \textit{root directory}, che è composto da una serie +di nomi separati da una \file{/}. + +All'avvio del sistema, completata la fase di inizializzazione, il kernel +riceve dal boot loader l'indicazione di quale dispositivo contiene il +filesystem da usare come punto di partenza e questo viene montato come radice +dell'albero (cioè nella directory \file{/}); tutti gli ulteriori filesystem +che possono essere su altri dispositivi dovranno poi essere inseriti +nell'albero montandoli su opportune directory del filesystem montato come +radice. Alcuni filesystem speciali (come \file{/proc} che contiene un'interfaccia ad alcune strutture interne del kernel) sono generati automaticamente dal kernel @@ -115,15 +118,30 @@ questa sia la directory radice, allora il riferimento \subsection{I tipi di file} \label{sec:file_file_types} -Come detto in precedenza in Unix esistono vari tipi di file; in Linux questi +Come detto in precedenza, in Unix esistono vari tipi di file; in Linux questi sono implementati come oggetti del \textit{Virtual File System} (vedi \secref{sec:file_vfs_work}) e sono presenti in tutti i filesystem unix-like utilizzabili con Linux. L'elenco dei vari tipi di file definiti dal -\textit{Virtual File System}\index{Virtual File System} è riportato in \ntab. +\textit{Virtual File System}\index{Virtual File System} è riportato in +\tabref{tab:file_file_types}. Si tenga ben presente che questa classificazione non ha nulla a che fare con -la classificazione sui tipi di file (che in questo caso sono sempre file di -dati) in base al loro contenuto, o tipo di accesso. +la classificazione dei file (che in questo caso sono sempre file di dati) in +base al loro contenuto, o tipo di accesso. Essa riguarda invece il tipo di +oggetti; in particolare è da notare la presenza dei cosiddetti file speciali. +Alcuni di essi, come le \textit{fifo} (che tratteremo in +\secref{sec:ipc_named_pipe}) ed i \textit{socket} (che tratteremo in +\capref{cha:socket_intro}) non sono altro che dei riferimenti per utilizzare +delle funzionalità di comunicazione fornite dal kernel. Gli altri sono i +\textsl{file di dispositivo} (o \textit{device file}) che costituiscono una +interfaccia diretta per leggere e scrivere sui dispositivi fisici; essi +vengono suddivisi in due grandi categorie, \textsl{a blocchi} e \textsl{a + caratteri} a seconda delle modalità in cui il dispositivo sottostante +effettua le operazioni di I/O.\footnote{in sostanza i dispositivi a blocchi + (ad esempio i dischi) corrispondono a periferiche per le quali è richiesto + che l'I/O venga effettuato per blocchi di dati di dimensioni fissate (ad + esempio le dimensioni di un settore), mentre nei dispositivi a caratteri + l'I/O viene effettuato senza nessuna particolare struttura.} \begin{table}[htb] \footnotesize @@ -133,7 +151,7 @@ dati) in base al loro contenuto, o tipo di accesso. \multicolumn{2}{|c|}{\textbf{Tipo di file}} & \textbf{Descrizione} \\ \hline \hline - \textit{regular file} & \textsl{file normale} & + \textit{regular file} & \textsl{file regolare} & un file che contiene dei dati (l'accezione normale di file) \\ \textit{directory} & \textsl{cartella o direttorio} & un file che contiene una lista di nomi associati a degli \textit{inodes} @@ -141,9 +159,9 @@ dati) in base al loro contenuto, o tipo di accesso. \textit{symbolic link} & \textsl{collegamento simbolico} & un file che contiene un riferimento ad un altro file/directory \\ \textit{char device} & \textsl{dispositivo a caratteri} & - un file che identifica una periferica ad accesso sequenziale \\ + un file che identifica una periferica ad accesso a caratteri \\ \textit{block device} & \textsl{dispositivo a blocchi} & - un file che identifica una periferica ad accesso diretto \\ + un file che identifica una periferica ad accesso a blocchi \\ \textit{fifo} & \textsl{``coda''} & un file speciale che identifica una linea di comunicazione software (unidirezionale) \\ @@ -156,17 +174,22 @@ dati) in base al loro contenuto, o tipo di accesso. \label{tab:file_file_types} \end{table} -Infatti una delle differenze principali con altri sistemi operativi (come il -VMS o Windows) è che per Unix tutti i file di dati sono identici e contengono -un flusso continuo di byte. Non esiste cioè differenza per come vengono visti -dal sistema file di diverso contenuto o formato (come nel caso di quella fra -file di testo e binari che c'è in Windows) né c'è una strutturazione a record -per il cosiddetto ``accesso diretto'' come nel caso del VMS.\footnote{con i - kernel della serie 2.4 è disponibile una forma di accesso diretto ai dischi - (il \textit{raw access}) attraverso dei device file appositi, che però non - ha nulla a che fare con questo.} - -Una seconda differenza è nel formato dei file ASCII; in Unix la fine riga è +Una delle differenze principali con altri sistemi operativi (come il VMS o +Windows) è che per Unix tutti i file di dati sono identici e contengono un +flusso continuo di byte. Non esiste cioè differenza per come vengono visti dal +sistema file di diverso contenuto o formato (come nel caso di quella fra file +di testo e binari che c'è in Windows) né c'è una strutturazione a record per +il cosiddetto ``accesso diretto'' come nel caso del VMS.\footnote{questo vale + anche per i dispositivi a blocchi: la strutturazione dell'I/O in blocchi di + dimensione fissa avviene solo all'interno del kernel, ed è completamente + trasparente all'utente. Inoltre talvolta si parla di \textsl{accesso + diretto} riferendosi alla capacità, che non ha niente a che fare con tutto + ciò, di effettuare, attraverso degli appositi file di dispositivo, + operazioni di I/O direttamente sui dischi senza passare attraverso un + filesystem (il cosiddetto \textit{raw access}, introdotto coi kernel della + serie 2.4.x).} + +Una seconda differenza è nel formato dei file ASCII: in Unix la fine riga è codificata in maniera diversa da Windows o Mac, in particolare il fine riga è il carattere \texttt{LF} (o \verb|\n|) al posto del \texttt{CR} (\verb|\r|) del Mac e del \texttt{CR LF} di Windows.\footnote{per questo esistono in Linux @@ -175,12 +198,21 @@ del Mac e del \texttt{CR LF} di Windows.\footnote{per questo esistono in Linux problemi qualora nei programmi si facciano assunzioni sul terminatore della riga. -Si ricordi infine che in ambiente Unix non esistono tipizzazioni dei file di -dati e che non c'è nessun supporto del sistema per le estensioni come parte -del filesystem. Ciò nonostante molti programmi adottano delle convenzioni per -i nomi dei file, ad esempio il codice C normalmente si mette in file con -l'estensione \file{.c}, ma questa è, per quanto usata ed accettata in maniera -universale, solo una convenzione. +Si ricordi infine che un kernel Unix non fornisce nessun supporto per la +tipizzazione dei file di dati e che non c'è nessun supporto del sistema per le +estensioni come parte del filesystem.\footnote{non è così ad esempio nel + filesystem HFS dei Mac, che supporta delle risorse associate ad ogni file, + che specificano fra l'altro il contenuto ed il programma da usare per + leggerlo. In realtà per alcuni filesystem, come l'XFS della SGI, esiste la + possibilità di associare delle risorse ai file, ma è una caratteristica + tutt'ora poco utilizzata, dato che non corrisponde al modello classico dei + file in un sistema Unix.} Ciò nonostante molti programmi adottano delle +convenzioni per i nomi dei file, ad esempio il codice C normalmente si mette +in file con l'estensione \file{.c}; un'altra tecnica molto usata è quella di +utilizzare i primi 4 byte del file per memorizzare un \textit{magic number} +che classifichi il contenuto; entrambe queste tecniche, per quanto usate ed +accettate in maniera diffusa, restano solo delle convenzioni il cui rispetto è +demandato alle applicazioni stesse. \subsection{Le due interfacce ai file} @@ -192,7 +224,7 @@ accedere al loro contenuto. La prima è l'interfaccia standard di Unix, quella che il manuale delle \acr{glibc} chiama interfaccia dei descrittori di file (o \textit{file - descriptor}). È un'interfaccia specifica dei sistemi unix-like e provvede + descriptor}). È un'interfaccia specifica dei sistemi unix-like e fornisce un accesso non bufferizzato; la tratteremo in dettaglio in \capref{cha:file_unix_interface}. @@ -201,11 +233,11 @@ bufferizzato in quanto la lettura e la scrittura vengono eseguite chiamando direttamente le system call del kernel (in realtà il kernel effettua al suo interno alcune bufferizzazioni per aumentare l'efficienza nell'accesso ai dispositivi); i \textit{file descriptor}\index{file descriptor} sono -rappresentati da numeri interi (cioè semplici variabili di tipo \type{int}). +rappresentati da numeri interi (cioè semplici variabili di tipo \ctyp{int}). L'interfaccia è definita nell'header \file{unistd.h}. La seconda interfaccia è quella che il manuale della \acr{glibc} chiama degli -\textit{stream}\index{stream}. Essa provvede funzioni più evolute e un accesso +\textit{stream}\index{stream}. Essa fornisce funzioni più evolute e un accesso bufferizzato (controllato dalla implementazione fatta dalle \acr{glibc}), la tratteremo in dettaglio nel \capref{cha:files_std_interface}. @@ -213,21 +245,22 @@ Questa anche su tutti i sistemi non Unix. Gli \textit{stream} sono oggetti complessi e sono rappresentati da puntatori ad un opportuna struttura definita dalle librerie del C; si accede ad essi sempre in maniera indiretta utilizzando il -tipo \type{FILE *}. L'interfaccia è definita nell'header \type{stdio.h}. +tipo \ctyp{FILE *}. L'interfaccia è definita nell'header \file{stdio.h}. Entrambe le interfacce possono essere usate per l'accesso ai file come agli -altri oggetti del VFS (pipe, socket, device, sui quali torneremo in dettaglio -a tempo opportuno), ma per poter accedere alle operazioni di controllo su un -qualunque tipo di oggetto del VFS occorre usare l'interfaccia standard di Unix -con i \textit{file descriptor}. Allo stesso modo devono essere usati i -\textit{file descriptor} se si vuole ricorrere a modalità speciali di I/O come -il polling o il non-bloccante (vedi \capref{cha:file_advanced}). +altri oggetti del VFS (fifo, socket, device, sui quali torneremo in dettaglio +a tempo opportuno), ma per poter accedere alle operazioni di controllo +(descritte in \ref{sec:file_fcntl} e \ref{sec:file_ioctl}) su un qualunque +tipo di oggetto del VFS occorre usare l'interfaccia standard di Unix con i +\textit{file descriptor}. Allo stesso modo devono essere usati i \textit{file + descriptor} se si vuole ricorrere a modalità speciali di I/O come il polling +o il non-bloccante (vedi \capref{cha:file_advanced}). Gli \textit{stream} forniscono un'interfaccia di alto livello costruita sopra quella dei \textit{file descriptor}, che permette di poter scegliere tra diversi stili di bufferizzazione. Il maggior vantaggio degli \textit{stream} è che l'interfaccia per le operazioni di input/output è enormemente più ricca -di quella dei \textit{file descriptor}, che provvedono solo funzioni +di quella dei \textit{file descriptor}, che forniscono solo funzioni elementari per la lettura/scrittura diretta di blocchi di byte. In particolare gli \textit{stream} dispongono di tutte le funzioni di formattazione per l'input e l'output adatte per manipolare anche i dati in @@ -327,24 +360,25 @@ Linux, l'\acr{ext2}. In Linux il concetto di \textit{everything is a file} è stato implementato attraverso il \textit{Virtual Filesystem} (da qui in avanti VFS) che è uno strato intermedio che il kernel usa per accedere ai più svariati filesystem -mantenendo la stessa interfaccia per i programmi in user space. Esso provvede +mantenendo la stessa interfaccia per i programmi in user space. Esso fornisce un livello di indirezione che permette di collegare le operazioni di manipolazione sui file alle operazioni di I/O, e gestisce l'organizzazione di -queste ultime nei vari modi in cui diversi filesystem le effettuano, +queste ultime nei vari modi in cui i diversi filesystem le effettuano, permettendo la coesistenza di filesystem differenti all'interno dello stesso albero delle directory. -Quando un processo esegue una system call che opera su un file il kernel +Quando un processo esegue una system call che opera su un file, il kernel chiama sempre una funzione implementata nel VFS; la funzione eseguirà le -manipolazioni sulle strutture generiche e utilizzerà poi la chiamata alla +manipolazioni sulle strutture generiche e utilizzerà poi la chiamata alle opportune routine del filesystem specifico a cui si fa riferimento. Saranno queste a chiamare le funzioni di più basso livello che eseguono le operazioni -di I/O sul dispositivo fisico, secondo lo schema riportato in \nfig. +di I/O sul dispositivo fisico, secondo lo schema riportato in +\figref{fig:file_VFS_scheme}. \begin{figure}[htb] \centering \includegraphics[width=7cm]{img/vfs} - \caption{Schema delle operazioni del VFS} + \caption{Schema delle operazioni del VFS.} \label{fig:file_VFS_scheme} \end{figure} @@ -437,31 +471,35 @@ metodi che implementano le operazioni disponibili sul file. In questo modo i processi in user space possono accedere alle operazioni attraverso detti metodi, che saranno diversi a seconda del tipo di file (o dispositivo) aperto (su questo torneremo in dettaglio in \secref{sec:file_fd}). Un elenco delle -operazioni previste dal kernel è riportato in \ntab. +operazioni previste dal kernel è riportato in +\tabref{tab:file_file_operations}. \begin{table}[htb] \centering \footnotesize - \begin{tabular}[c]{|l|p{7cm}|} + \begin{tabular}[c]{|l|p{8cm}|} \hline \textbf{Funzione} & \textbf{Operazione} \\ \hline \hline - \textsl{\code{open}} & apre il file \\ - \textsl{\code{read}} & legge dal file \\ - \textsl{\code{write}} & scrive sul file \\ - \textsl{\code{llseek}} & sposta la posizione corrente sul file \\ + \textsl{\code{open}} & apre il file (vedi \secref{sec:file_open}). \\ + \textsl{\code{read}} & legge dal file (vedi \secref{sec:file_read}).\\ + \textsl{\code{write}} & scrive sul file (vedi \secref{sec:file_write}).\\ + \textsl{\code{llseek}} & sposta la posizione corrente sul file (vedi + \secref{sec:file_lseek}). \\ \textsl{\code{ioctl}} & accede alle operazioni di controllo - (tramite la \func{ioctl})\\ - \textsl{\code{readdir}}& per leggere il contenuto di una directory \\ - \textsl{\code{poll}} & \\ - \textsl{\code{mmap}} & chiamata dalla system call \func{mmap}. - mappa il file in memoria\\ + (vedi \secref{sec:file_ioctl}).\\ + \textsl{\code{readdir}}& legge il contenuto di una directory \\ + \textsl{\code{poll}} & usata nell'I/O multiplexing (vedi + \secref{sec:file_multiplexing}). \\ + \textsl{\code{mmap}} & mappa il file in memoria (vedi + \secref{sec:file_memory_map}). \\ \textsl{\code{release}}& chiamata quando l'ultima referenza a un file - aperto è chiusa\\ - \textsl{\code{fsync}} & chiamata dalla system call \func{fsync} \\ - \textsl{\code{fasync}} & chiamate da \func{fcntl} quando è abilitato - il modo asincrono per l'I/O su file. \\ + aperto è chiusa. \\ + \textsl{\code{fsync}} & sincronizza il contenuto del file (vedi + \secref{sec:file_sync}). \\ + \textsl{\code{fasync}} & abilita l'I/O asincrono (vedi + \secref{sec:file_asyncronous_io}) sul file. \\ \hline \end{tabular} \caption{Operazioni sui file definite nel VFS.} @@ -470,12 +508,12 @@ operazioni previste dal kernel In questo modo per ciascun file diventano possibili una serie di operazioni (non è detto che tutte siano disponibili), che costituiscono l'interfaccia -astratta del VFS. Qualora se ne voglia eseguire una il kernel andrà ad -utilizzare la opportuna routine dichiarata in \var{f\_ops} appropriata al tipo +astratta del VFS. Qualora se ne voglia eseguire una, il kernel andrà ad +utilizzare l'opportuna routine dichiarata in \var{f\_ops} appropriata al tipo di file in questione. In questo modo è possibile scrivere allo stesso modo sulla porta seriale come -su un file di dati normale; ovviamente certe operazioni (nel caso della +su normale un file di dati; ovviamente certe operazioni (nel caso della seriale ad esempio la \code{seek}) non saranno disponibili, però con questo sistema l'utilizzo di diversi filesystem (come quelli usati da Windows o MacOs) è immediato e (relativamente) trasparente per l'utente ed il @@ -488,26 +526,28 @@ programmatore. Come già accennato in \secref{sec:file_organization} Linux (ed ogni sistema unix-like) organizza i dati che tiene su disco attraverso l'uso di un filesystem. Una delle caratteristiche di Linux rispetto agli altri Unix è -quella di poter supportare grazie al VFS una enorme quantità di filesystem +quella di poter supportare, grazie al VFS, una enorme quantità di filesystem diversi, ognuno dei quali ha una sua particolare struttura e funzionalità -proprie. Per questo per il momento non entreremo nei dettagli di un +proprie. Per questo, per il momento non entreremo nei dettagli di un filesystem specifico, ma daremo una descrizione a grandi linee che si adatta alle caratteristiche comuni di qualunque filesystem di sistema unix-like. Lo spazio fisico di un disco viene usualmente diviso in partizioni; ogni partizione può contenere un filesystem. La strutturazione tipica -dell'informazione su un disco è riportata in \nfig; in essa si fa riferimento -alla struttura del filesystem \acr{ext2}, che prevede una separazione dei dati -in \textit{blocks group} che replicano il superblock (ma sulle caratteristiche -di \acr{ext2} torneremo in \secref{sec:file_ext2}). È comunque caratteristica -comune di tutti i filesystem per Unix, indipendentemente da come poi viene -strutturata nei dettagli questa informazione, prevedere una divisione fra la -lista degli inodes e lo spazio a disposizione per i dati e le directory. +dell'informazione su un disco è riportata in \figref{fig:file_disk_filesys}; +in essa si fa riferimento alla struttura del filesystem \acr{ext2}, che +prevede una separazione dei dati in \textit{blocks group} che replicano il +superblock (ma sulle caratteristiche di \acr{ext2} torneremo in +\secref{sec:file_ext2}). È comunque caratteristica comune di tutti i +filesystem per Unix, indipendentemente da come poi viene strutturata nei +dettagli questa informazione, prevedere una divisione fra la lista degli +inodes e lo spazio a disposizione per i dati e le directory. \begin{figure}[htb] \centering - \includegraphics[width=12cm]{img/disk_struct} - \caption{Organizzazione dello spazio su un disco in partizioni e filesystem} + \includegraphics[width=14cm]{img/disk_struct} + \caption{Organizzazione dello spazio su un disco in partizioni e + filesystem.} \label{fig:file_disk_filesys} \end{figure} @@ -515,20 +555,21 @@ Se si va ad esaminare con maggiore dettaglio la strutturazione dell'informazione all'interno del singolo filesystem (tralasciando i dettagli relativi al funzionamento del filesystem stesso come la strutturazione in gruppi dei blocchi, il superblock e tutti i dati di gestione) possiamo -esemplificare la situazione con uno schema come quello esposto in \nfig. +esemplificare la situazione con uno schema come quello esposto in +\figref{fig:file_filesys_detail}. \begin{figure}[htb] \centering - \includegraphics[width=12cm]{img/filesys_struct} - \caption{Strutturazione dei dati all'interno di un filesystem} + \includegraphics[width=14cm]{img/filesys_struct} + \caption{Strutturazione dei dati all'interno di un filesystem.} \label{fig:file_filesys_detail} \end{figure} -Da \curfig\ si evidenziano alcune delle caratteristiche di base di un -filesystem, sulle quali è bene porre attenzione visto che sono fondamentali -per capire il funzionamento delle funzioni che manipolano i file e le -directory che tratteremo nel prossimo capitolo; in particolare è opportuno -ricordare sempre che: +Da \figref{fig:file_filesys_detail} si evidenziano alcune delle +caratteristiche di base di un filesystem, sulle quali è bene porre attenzione +visto che sono fondamentali per capire il funzionamento delle funzioni che +manipolano i file e le directory che tratteremo nel prossimo capitolo; in +particolare è opportuno ricordare sempre che: \begin{enumerate} @@ -537,44 +578,45 @@ ricordare sempre che: fisici che contengono i dati e così via; le informazioni che la funzione \func{stat} fornisce provengono dall'\textit{inode}; dentro una directory si troverà solo il nome del file e il numero dell'\textit{inode} ad esso - associato, cioè quella che da qui in poi chiameremo una \textsl{voce} - (traduzione approssimata dell'inglese \textit{directory entry}, che non - useremo anche per evitare confusione con le \textit{dentry} del kernel di - cui si parlava in \secref{sec:file_vfs}). - -\item Come mostrato in \curfig\ si possono avere più voci che puntano allo - stesso \textit{inode}. Ogni \textit{inode} ha un contatore che contiene il - numero di riferimenti (\textit{link count}) che sono stati fatti ad esso; - solo quando questo contatore si annulla i dati del file vengono - effettivamente rimossi dal disco. Per questo la funzione per cancellare un - file si chiama \func{unlink}, ed in realtà non cancella affatto i dati del - file, ma si limita a eliminare la relativa voce da una directory e - decrementare il numero di riferimenti nell'\textit{inode}. + associato, cioè quella che da qui in poi chiameremo una \textsl{voce} (come + traduzione dell'inglese \textit{directory entry}, che non useremo anche per + evitare confusione con le \textit{dentry} del kernel di cui si parlava in + \secref{sec:file_vfs}). + +\item Come mostrato in \figref{fig:file_filesys_detail} si possono avere più + voci che puntano allo stesso \textit{inode}. Ogni \textit{inode} ha un + contatore che contiene il numero di riferimenti (\textit{link count}) che + sono stati fatti ad esso; solo quando questo contatore si annulla i dati del + file vengono effettivamente rimossi dal disco. Per questo la funzione per + cancellare un file si chiama \func{unlink}, ed in realtà non cancella + affatto i dati del file, ma si limita ad eliminare la relativa voce da una + directory e decrementare il numero di riferimenti nell'\textit{inode}. \item Il numero di \textit{inode} nella voce si riferisce ad un \textit{inode} nello stesso filesystem e non ci può essere una directory che contiene riferimenti ad \textit{inodes} relativi ad altri filesystem. Questo limita l'uso del comando \cmd{ln} (che crea una nuova voce per un file esistente, con la funzione \func{link}) al filesystem corrente. - -\item Quando si cambia nome ad un file senza cambiare filesystem il contenuto - del file non deve essere spostato, viene semplicemente creata una nuova voce - per l'\textit{inode} in questione e rimossa la vecchia (questa è la modalità - in cui opera normalmente il comando \cmd{mv} attraverso la funzione - \func{rename}). + +\item Quando si cambia nome ad un file senza cambiare filesystem, il contenuto + del file non viene spostato fisicamente, viene semplicemente creata una + nuova voce per l'\textit{inode} in questione e rimossa la vecchia (questa è + la modalità in cui opera normalmente il comando \cmd{mv} attraverso la + funzione \func{rename}). \end{enumerate} Infine è bene avere presente che, essendo file pure loro, esiste un numero di -riferimenti anche per le directory; per cui se a partire dalla situazione -mostrata in \curfig\ creiamo una nuova directory \file{img} nella directory -\file{gapil}: avremo una situazione come quella in \nfig, dove per chiarezza -abbiamo aggiunto dei numeri di inode. +riferimenti anche per le directory; per cui, se a partire dalla situazione +mostrata in \figref{fig:file_filesys_detail} creiamo una nuova directory +\file{img} nella directory \file{gapil}, avremo una situazione come quella in +\figref{fig:file_dirs_link}, dove per chiarezza abbiamo aggiunto dei numeri di +inode. \begin{figure}[htb] \centering - \includegraphics[width=12cm]{img/dir_links} - \caption{Organizzazione dei link per le directory} + \includegraphics[width=14cm]{img/dir_links} + \caption{Organizzazione dei link per le directory.} \label{fig:file_dirs_link} \end{figure} @@ -582,8 +624,8 @@ La nuova directory avr è referenziata dalla directory da cui si era partiti (in cui è inserita la nuova voce che fa riferimento a \file{img}) e dalla voce \file{.} che è sempre inserita in ogni directory; questo vale sempre per ogni directory -che non contenga a sua volta altre directory. Al contempo la directory da -cui si era partiti avrà un numero di riferiementi di almeno tre, in quanto +che non contenga a sua volta altre directory. Al contempo, la directory da +cui si era partiti avrà un numero di riferimenti di almeno tre, in quanto adesso sarà referenziata anche dalla voce \file{..} di \file{img}. @@ -593,14 +635,14 @@ adesso sar Il filesystem standard usato da Linux è il cosiddetto \textit{second extended filesystem}, identificato dalla sigla \acr{ext2}. Esso supporta tutte le caratteristiche di un filesystem standard Unix, è in grado di gestire nomi di -file lunghi (256 caratteri, estendibili a 1012), una dimensione fino a 4~Tb. +file lunghi (256 caratteri, estendibili a 1012) con una dimensione massima di +4~Tb. -Oltre alle caratteristiche standard \acr{ext2} fornisce alcune estensioni che -non sono presenti sugli altri filesystem Unix, le cui principali sono le -seguenti: +Oltre alle caratteristiche standard, \acr{ext2} fornisce alcune estensioni che +non sono presenti sugli altri filesystem Unix. Le principali sono le seguenti: \begin{itemize} \item i \textit{file attributes} consentono di modificare il comportamento del - kernel quando agisce su gruppi di file. Possono essere settati su file e + kernel quando agisce su gruppi di file. Possono essere impostati su file e directory e in quest'ultimo caso i nuovi file creati nella directory ereditano i suoi attributi. \item sono supportate entrambe le semantiche di BSD e SVr4 come opzioni di @@ -608,7 +650,7 @@ seguenti: con lo stesso identificatore di gruppo della directory che li contiene. La semantica SVr4 comporta che i file vengono creati con l'identificatore del gruppo primario del processo, eccetto il caso in cui la directory ha il bit - di \acr{sgid} settato (per una descrizione dettagliata del significato di + di \acr{sgid} impostato (per una descrizione dettagliata del significato di questi termini si veda \secref{sec:file_access_control}), nel qual caso file e subdirectory ereditano sia il \acr{gid} che lo \acr{sgid}. \item l'amministratore può scegliere la dimensione dei blocchi del filesystem @@ -648,9 +690,9 @@ inode. Le directory sono implementate come una linked list con voci di dimensione variabile. Ciascuna voce della lista contiene il numero di inode, la sua -lunghezza, il nome del file e la sua lunghezza, secondo lo schema in \curfig; -in questo modo è possibile implementare nomi per i file anche molto lunghi -(fino a 1024 caratteri) senza sprecare spazio disco. +lunghezza, il nome del file e la sua lunghezza, secondo lo schema in +\figref{fig:file_ext2_dirs}; in questo modo è possibile implementare nomi per +i file anche molto lunghi (fino a 1024 caratteri) senza sprecare spazio disco.