Il disco durante la formattazione viene suddiviso in settori e tracce: possiamo immaginare le tracce come delle corone circolari concentriche di disco, mentre i settori sono degli spicchi di disco. Usando settore e traccia come coordinate è possibile individuare un blocco, l'unità più piccola indirizzabile su un disco. A questo tipo di suddivizione fanno eccezione i cdrom e i nastri: entrambi usano un tipo di organizzazione sequenziale, i nastri per ovvie ragioni, mentre i cdrom perché sono organizzati in una lunghissima spirale (veramente lo sono solo i cd-r e cd-rw, per facilitare il percorso del laser, per i cdrom normali è leggermente diverso). Nel caso dei cdrom però, la presenza di un filesystem (di solito iso9660, magari arricchito con estensioni joliet nei sistemi microsoft o rock-ridge nei sistemi linux, per gestire nomi e path lunghi, o i permessi) permette di accedervi in lettura in maniera diretta e casuale, come sui normali dischi magnetici. Un filesystem è un sistema per organizzare i file nei dispositivi in modo da avere un accesso diretto, senza il vincolo della sequenzialità.
Un filesystem quindi contiene file, mantenendo un elenco di essi e della loro posizione sul disco, eventualmente (quasi sempre...) suddivisi in più settori del dispositivo. L'organizzazione è gerarchica, specie in Unix, l'insieme di sistemi operativi di cui Linux fa parte: esiste un punto d'innesto principale ("/", root), a cui sono collegati altri punti di innesto secondari e così via. Questi punti di innesto si chiamano directory, e non necessariamente devono risiedere sullo stesso disco o addirittura sullo stesso computer. Infatti Unix permette di montare (agganciare o innestare) al filesystem principale altri filesystem, locali o remoti, che al termine devono essere smontati per poter essere eventualmente rimossi, ad esempio per floppy e cdrom. L'operazione di unmount (smontaggio) di un dispositivo effettua inoltre il sync (sincronizzazione) del suo contenuto, garantendo l'integrità dei dati. Infatti Unix non scrive immediatamente le modifiche effettuate, ma aspetta che altri processi più importanti rilascino risorse (tempo e % di occupazione della cpu) per effettuare il sync. Le directory possono contenere altre directory o file. Esiste quindi un'organizzazione ad albero, e per indicare un file se ne specifica il suo path (percorso) all'interno del filesystem principale, partendo da "/" e separando ogni nodo (directory) con il simbolo "/", ad esempio: /home/utente/testi/tesi.txt . Il filesystem Unix permette inoltre di avere informazioni aggiuntive sulla natura del file, tipo permessi di lettura, scrittura ed esecuzione, utente e gruppo proprietario, e genere del file in questione. Per sapere il tipo di file, basta dare ls -la e guardare il primo carattere della riga del file in questione, ad esempio:
.......... drwxr-xr-x 2 utente gruppo 1024 Mar 23 1999 docs -rw------- 2 utente gruppo 1024 Apr 12 2000 testo .......... |
Tabella 1-1. Elenco dei tipi di file (in base al primo carattere)
- | file regolare |
d | directory |
l | link (collegamento) |
b | periferica a blocchi con buffer |
c | periferica a caratteri con buffer |
u | periferica a caratteri senza buffer |
p | pipe FIFO |
s | socket |
Le periferiche o dispositivi a caratteri permettono di accedervi solo un carattere alla volta (es: console, porta seriale, ecc.), mentre quelle a blocchi permettono di accedervi solo a blocchi di dimensioni stabilite (es: dischi). Solo quest'ultimo tipo di periferiche o dispositivi possono contenere un filesystem.
Nota: I CD audio puri (o la sola parte audio di quelli Mixed-mode) NON contengono filesystem, quindi non si possono montare: per ascoltarli basta usare un lettore CD, sempre ammesso di avere i permessi di accesso in lettura al dispositivo!
Da notare che non necessariamente, per il solo fatto di essere un dispositivo a blocchi, un disco deve contenere un filesystem. Un disco può comunque essere usato alla vecchia maniera sequenziale: infatti un disco senza filesystem è solo una serie di settori a partire dalla prima testina del primo cilindro. In questo senso, a volte si utilizzano i dischi come se fossero nastri, registrando e rileggendo i dati nella stessa sequenza naturale di settori, testine e cilindri. Tipici esempi sono i dischetti di avvio con l'immagine del kernel o i dischi di archivio multivolume creati da tar. Ricordate che i dischi senza filesystem non possono essere montati normalmente, ma necessitano del cosiddetto loopback device, compilato insieme al kernel. Le partizioni di swap sono gestite a blocchi, senza filesystem.
La maggior parte delle distribuzioni Unix e Linux seguono il Filesystem Structure Standard (FSSTND, ora evolutosi in FHS, Filesystem Hierarchy Standard), in modo da garantire una certa uniformità o comparibilità. Il FSSTND parte dall'idea di separare i file locali alla macchina da quelli condivisi (in rete locale o altro), e quelli a sola lettura da quelli accessibili anche in scrittura. Vediamo alcuni punti del FSSTND:
/ - è la directory principale che contiene tutte le altre.
/boot - contiene i file statici usati durante l'avvio, compreso il kernel e i file di Lilo.
/home - è la directory che contiene quelle personali degli utenti.
/mnt - di solito contiene i punti di innesto dei dispositivi rimovibili (/mnt/floppy, /mnt/cdrom, /mnt/zip, ecc.).
/dev - contiene i file speciali dei dispositivi di sistema, a blocchi o a caratteri (ebbene sì, anche i dispositivi fisici sono visti come file: mai sentito il detto "In Unix tutto è un file"?).
/etc - contiene i file di configurazione generali del sistema. Eventuali sottodirectory raggruppano file di configurazione specifici di qualche programma o servizio, ad esempio /etc/X11 per il sistema grafico, /etc/ppp per il demone ppp, /etc/httpd per apache, ecc. (anzi, /etc /etc ;-) ).
/lib - contiene le librerie condivise, usate in link dinamico dai programmi contenuti in /bin e /usr/bin. /lib/modules contiene i moduli caricati dinamicamente dal kernel.
/proc - è il punto d'innesto del filesystem virtuale proc, che contiene informazioni varie sul sistema in attività (viene infatti generato a runtime dal kernel), oltre a possibili impostazioni da applicare ogni volta che si avvia il sistema.
/sbin - contiene i file principali per l'avvio del sistema e per l'amministrazione da parte dell'utente root. I programmi sono linkati staticamente, quindi non hanno bisogno di accedere a /lib.
/bin - contiene i file eseguibili che in genere possono essere usati localmente anche dai comuni utenti.
/usr - contiene i file condivisibili in rete tra più macchine, e dovrebbe essere possibile montarla in sola lettura, a sistema ormai stabilizzato, sempre nel caso che disponga di una partizione separata. Contiene un sotto-filesystem: /usr/bin per i file eseguibili anche dagli utenti comuni, /usr/sbin per quelli dell'utente root, /usr/doc e /usr/info per la documentazione, /usr/man per le pagine di manuale, /usr/X11R6 per il sistema grafico X11, /usr/include per gli header necessari per la compilazione di programmi C, /usr/lib per le librerie, /usr/src per i sorgenti (in particolare /usr/src/linux per i sorgenti del kernel), e /usr/local per programmi locali alla macchina, ma aggiunti in seguito alla stabilizzazione del sistema.
/var - contiene i file variabili del sistema (a differenza di /usr, che dovrebbe poter essere montata a sola lettura). Contiene le directory di spool del sistema (come /var/spool/lpd per la stampa, /var/spool/fax per i fax, /var/spool/mail per la posta, /var/spool/news per i newsgroup, ecc.), la directory dei log (registrazioni delle attività) del sistema (/var/log/...), la directory contenente i PID dei processi in esecuzione (/var/run/...), la directory delle cache (/var/cache), e altro.
/tmp - contiene i file temporanei generati dagli utenti e dai programmi in esecuzione, ed è accessibile in genere in lettura/scrittura/esecuzione a tutti gli utenti (può anche essere un link simbolico a /var/tmp).