Generalità
Un disco può essere interamente utilizzato da un unico file system, oppure essere diviso in diverse parti. Queste parti sono dette partizioni, ras o minidischi a seconda dell'architettura. E' possibile unire più partizioni in parti di disco più ampie dette volumi. Ogni volume deve contenere al suo interno un indice del volume, che registra le informazioni riguardanti il nome, la posizione, la dimensione e il tipo dei file del volume stesso. Per organizzare i file all'interno di un file system è necessario avere delle strutture in grado di contenerli: le directory.
Ogni directory si può considerare come una tabella di simboli che ha il compito di tradurre i nomi dei file in indirizzi fisici a cui accedere ai file in essa contenuti.
Operazioni su directory
Le principali azioni che una directory deve poter essere in grado di eseguire sono:
-ricerca di un file. La directory deve dare la possibilità di individuare i file associati ad un determinato nome o data una particolare espressione.
-creazione di un file.
-cancellazione di un file.
-elencazione di una directory. La directory deve poter elencare tutti i file e il loro contenuto.
-ridenominazione di un file.
-attraversamento del file system.
Struttura logica delle directory
In ogni file system è possibile organizzare le directory in modo diverso:
-directory a livello singolo. Questa è la struttura più semplice, in quanto tutti i file del file system sono raccolti nella stessa directory. Per questo motivo tutti i file devono essere riconoscibili univocamente mediante il loro nome. Questo tipo di struttura non è molto funzionale, in quanto è difficile da gestire sia per sistemi multiutenti, sia per sistemi con un solo utente, in quanto con l'aumentare del numero dei file diventa molto difficile ricordare tutti i nomi.
-directory a due livelli. Per risolvere parzialmente i problemi della struttura precedente si è pensato di utilizzare l'organizzazione a due livelli, in cui la directory principale non è altro che un elenco di puntatori alle directory secondarie (una per ogni utente). Ogni utente ha quindi a disposizione la propria UFD. In questo modo utenti diversi possono avere file con lo stesso nome. Le directory devono essere create o cancellate da uno speciale programma di sistema. La struttura a due livelli presenta però un problema logico non indifferente: tutti gli utenti sono isolati tra loro. E' per questo motivo che viene introdotto il concetto di percorso di un file, nato come l'accoppiata tra il nome utente del file e il nome del file stesso. Un caso particolare, che applica il concetto di percorso, è dato dai file di sistema: essi sono contenuti in una cartella speciale (normalmente contrassegnata con utente 0). Nel caso in cui un utente abbia bisogno di uno di questi file, il SO guarda se nella cartella utente è presente una nuova versione del file di sistema definita dall'utente stesso, se no prende i dati dalla cartella speciale.
-struttura ad albero. Da un'evoluzione della struttura a due livelli si ha la struttura ad albero. In questo caso gli utenti lavorano su una stessa struttura di directory. Essi sono in grado di aggiungere sottodirectory e accedere a determinate parti dell'albero, mediante i percorsi. Ogni directory può contenere sia file che directory. Le directory non sono altro che file trattati in modo speciale. Normalmente ogni utente ha una propria directory corrente, definita all'avvio della sessione, modificabile dall'utente. I nomi di percorso possono essere assoluti oppure relativi alla directory corrente. Questo tipo di struttura necessita di definire metodi di cancellazione ricorsivi, nel caso in cui si stabilisca che è possibile cancellare intere directory anche non vuote. Il sistema di accesso ad un sistema ad albero è molto semplice.
-struttura a grafo aciclico. E' possibile che si abbia bisogno di condividere più sottodirectory tra più utenti. Per consentire questa opzione è necessario un nuovo tipo di struttura, quella a grafo. Viene introdotto il concetto di collegamento, che non è altro che un puntatore ad un altro file o directory. I percorsi in questo tipo di struttura non sono più assoluti. E' necessario stabilire una politica di cancellazione delle directory, nel senso che bisogna stabilire se la cancellazione di un collegamento, comporti anche la cancellazione del file originale e viceversa. Normalmente la cancellazione di un collegamento non influisce sul file originale, mentre la cancellazione dell'originale comporta al fatto che il collegamento diventi inutilizzabile. Un tipo di approccio diverso prevede che un file originale venga cancellato solo nel momento in cui tutti i collegamenti vengono cancellati. I sistemi UNIX prevedono questo tipo di approccio per gli hard link.
-struttura a grafo generale. E' una generalizzazione del caso precedente, che consente la generazione di loop tra i collegamenti. Questa struttura complica di molto gli algoritmi di ricerca e di gestione dei collegamenti, in quanto le directory possono autoriferirsi.
Montaggio di un file system
Come detto un insieme di directory forma un'unità logica chiamata file system. Affinchè un OS lavori sui file presenti in un file system è necessario che esso sia "montato" sul sistema operativo stesso. La procedura di montaggio consiste nel dare al dispositivo collegato un nome e una posizione, detta punto di montaggio. A questo punto il sistema operativo verifica che il dispositivo contenga le directory nella struttura corretta per il file system annunciato. Questa operazione viene eseguita attraversando l'albero delle directory.
Il montaggio di un file sistem può avvenire in diversi punti di un albero di directory esistente. E' possibile che l'OS vieti il montaggio di un file system in una directory che contenga altri file, oppure nascondendo i file in esso contenuti fino a che il file system non venga smontato, oppure è anche possibile che non venga adottata nessuna limitazione.
Nei sistemi Macintosh, ogni volta che viene rilevato un nuovo file system viene montato automaticamente a livello della radice e viene creato un collegamento ad esso sulla scrivania.
Nel caso di sistemi Windows, invece, viene mantenuta la struttura a 2 livelli estesa, secondo cui ad ogni file system viene attribuita una lettera di unità. Nelle ultime versioni di Windows è possibile montare un file system in un qualunque punto dell'albero delle directory, come nei sistemi UNIX.
Nei sistemi UNIX spesso l'operazione di montaggio non è automatica, ma deve essere dichiarata esplicitamente mediante un apposito comando. E' possibile impostare il montaggio automatico per alcuni file system modificando un file apposito.
Condivisione di file e directory
Gli OS orientati agli utenti devono prevedere meccanismi di condivisione di file e directory tra più utenti. Una volta che i file possono essere condivisi è necessario offrire i mezzi per condividere interi file system. L'OS può permettere che tutti gli utenti accedano automaticamente a tutti i file degli altri utenti, oppure regoli gli accessi tramite permessi di accesso ai file.
Negli OS moderni i permessi sono gestiti tramite tre classi di utenti: il proprietario, che ha tutti i poteri sul file, il gruppo, che è formato da un certo numero di utenti che hanno alcuni poteri sul file e gli altri, che invece non hanno alcun permesso sul file stesso. Gli utenti e i gruppi sono identificati mediante un ID.
Con l'avvento delle reti, non è più sufficiente condividere file tra più utenti su uno stesso sistema, ma è necessario condividere file tra più sistemi. Esistono diverse tecniche per arrivare a questo risultato.
Il metodo più semplice è dato dal modello basato sul client-server. In questo caso un calcolatore mette a disposizione di vari utenti i file che ha a disposizione. In un sistema client-server l'autenticazione certa, basata su identificatori, è inapplicabile. Una possibile soluzione è quella di utilizzare sistemi di autenticazione reciproca tra client e server, che però creano grossi problemi di compatibilità. E' per questo motivo che spesso si usano metodi di autenticazione non sicura. Ad esempio nei sistemi UNIX, l'autenticazione avviene mediante le informazioni fornite dal client al server (id e password).
Per aggirare i problemi precedenti sono stati introdotti i sistemi informativi distribuiti (DFS), che permettono la condivisione di informazioni in modo molto più completo rispetto ai sistemi client-server. Alcuni esempi sono:
-DNS, che permette la traduzione dei nomi dei calcolatori in indirizzi di rete
-NIS o yellow page id Sun Microsystem prevede mediante identificazione di condividere informazioni degli utenti, dei calcolatori, delle stampanti…
-CIFS di Microsoft ha il compito di creare nomi utenti di rete, in modo da fornire uno spazio unico di nomi per gli utenti. In passato venivano usati i domini, ora l'active directory.
-LDAP di Sun crea un meccanismo sicuro per la nominazione distribuita.
Quando si utilizzano sistemi distribuiti è molto probabile che parti del sistema risultino temporaneamente non disponibili o inutilizzabili. E' per questo che è necessario prevedere come comportarsi in caso di malfunzionamenti, durante la trasmissione di informazioni. La maggior parte dei DFS prevede la posticipazione delle operazioni che si stavano eseguendo sul file system, mediante l'utilizzo di informazioni di stato.
Un altro importante problema da considerare è dato dalla coerenza delle informazioni condivise: è necessaria una semantica che indichi quando le modifiche apportate da un utente possano essere osservate dagli altri utenti:
-semantica UNIX prevede che le scritture in un file aperto siano immediatamente visibili a tutti gli utenti che abbiano aperto quel file. Esiste inoltre la possibilità di condividere il puntatore di locazione corrente del file.
-semantica Andrew (AFS) prevede che le scritture non siano immediatamente visibili agli altri utenti e che, una volta che il file viene chiuso, le modifiche vengano memorizzate nel file originale: in questo modo tutti gli utenti che apriranno il file dopo il salvataggio vedranno le modifiche.
-semantica immutabile prevede che i file condivisi non possano essere modificati
Protezione
Per sistema di protezione si intende un meccanismo che permetta la regolamentazione degli accessi ad un file. Si pone il problema della protezione dei file in tutti i sistemi in cui l'accesso ad un file è consentito a più di un utente. Normalmente è necessario controllare che alcuni utenti non eseguano alcune le operazioni relative ad un file o ad una directory:
-lettura.
-scrittura.
-esecuzione.
-aggiunta.
-cancellazione.
-elencazione.
Dal controllo di queste operazioni primarie è possibile controllare anche le funzioni di accesso superiore (stampa, …). Esistono diversi metodi per la gestione della protezione:
-lista di controllo degli accessi prevede di specificare per ciascun utente le operazioni eseguibili per ogni file. In questo modo è possibile stabilire metodi di accesso molto specializzati, anche se il lavoro risulta essere molto lungo e comporta liste di controllo a dimensione variabile.
-protezione a classi prevede di condensare più utenti in gruppi. In questo modo è possibile consentire per ogni file operazioni diverse a seconda se l'utente che ne fa richiesta è il proprietario, appartiene al gruppo del proprietario, oppure è esterno. Per definire la protezione, è sufficiente gestire tre campi da tre bit ciascuno (in UNIX si usa la stringa "rwx").
-protezione mediante parole d'ordine, che prevede l'utilizzo di una password per ogni file. Se essa è sempre diversa è molto difficile da applicare, in quanto il numero di password diventerebbe cospicuo, nel caso in cui sia sempre la stessa, risulta molto vulnerabile.
In una struttura a directory è necessario proteggere anche le directory. Le operazioni sulle directory sono:
-creazione.
-cancellazione.
-attraversamento.
| < Prec. | Succ. > |
|---|






