Linux è il celebre sistema operativo open source che ad agosto 2016 ha festeggiato il 25imo compleanno. Il successo ottenuto dall’OS concepito da Linus Torvald è indiscutibile e ad oggi sono vari i settori dell’industria in cui è possibile constatarne l’impiego: dal mobile (è Android a dominare il mercato ed è un OS che si appoggia al kernel Linux) fino a quello dei server (il vostro sito potrebbe essere ospitato su un’istanza Linux), solo per citarne alcuni.
L’approfondimento di oggi è dedicato al filesystem, un elemento importante per ogni sistema operativo e del quale anche Linux non può fare a meno: vedremo nel dettaglio che cosa è esattamente, quali sono le sue funzioni e come è organizzato. Buona lettura.
Definizioni
La parola filesystem, è bene chiarirlo fin da subito, può assumere diversi significati in base al contesto in cui viene utilizzata ovvero:
- l’intera struttura di directory Linux a partire dalla directory principale “root” (figura in cima alla pagina);
- una specifico formato per l’archiviazione dei dati. Gli utenti Linux ed Android avranno probabilmente sentito parlare dei filesystem EXT3, EXT4, FAT32. In generale l’OS supporta oltre un centinaio di filesystem: ciascuno di essi determina le modalità attraverso cui i dati saranno memorizzati nello storage locale e resi disponibili all’OS ed all’utente;
- una partizione o un volume logico formattato in uno specifico filesystem che può essere montato in uno specifico punto (mount point) del filesystem Linux.
Funzioni del filesystem
I dati prodotti dai dispositivi moderni, che si tratti di computer o cellulari, necessitano di essere memorizzati su hard disk o supporto equivalente (memorie USB etc.). I motivi dietro a tale scelta sono essenzialmente due: il primo è che la RAM, una volta spento il computer o il dispositivo, non è in grado di mantenere i dati in memoria. Certo, esistono memorie “non volatili” (come quelle utilizzate negli SSD) in grado di superare i limiti delle classiche RAM ma sono ancora troppo costose. Il secondo è che il prezzo degli hard disk è inferiore a quello delle RAM standard.
Il filesystem ha il compito di fornire spazio per la memorizzazione dei dati e definire vari aspetti che regolano le procedure di archiviazione e gestione. Un filesystem deve fornire un namespace, una metodologia ben precisa da adottare per operazioni di designazione dei nomi dei file e la loro organizzazione. Il namespace determina la struttura logica dei dati sul disco, la lunghezza massima del nome dei file ed i caratteri utilizzabili per nominare questi ultimi.
La struttura metadati fornisce invece la “base di fondazione logica” del namespace perchè determina ad esempio la struttura dati richiesta per supportare la struttura d’organizzazione gerarchica delle directory, distinguere i blocchi del disco utilizzati da quelli disponibili, reperire e mostrare all’utente informazioni varie sui file (data di creazione, ultimo accesso etc.), lo posizione su disco dei dati appartenenti ad un file e via dicendo.
Bisogna poi ricordare che sono presenti anche altri metadati, separati da quelli del filesystem, che archiviano informazioni di alto livello come la suddivisione interna dei dischi (partizioni, volumi logici) e la descrizione dello stesso filesystem adottato dalla partizione. Il filesystem necessita anche di API (Application Programming Interface): le API forniscono accesso alle system function call che modificano (rinomina, copia, cancellazione) gli oggetti (file, directory etc.) del filesystem.
A completare la panoramica è il software richiesto per implementare tutte le funzioni elencate. Nel caso di Linux abbiamo a che fare con una implementazione software in due parti: la prima è rappresentata dal Linux virtual filesystem (VFS) mentre la seconda dai device driver del filesystem, il cui scopo è quello di interpretare i set di comandi filesystem standard in comandi specifici per la tipologia di filesystem adottato nella partizione o volume logico di riferimento.
Struttura
Le directory sono definibili come delle classiche cartelle perchè al loro interno è possibile archiviare varie tipologie di file. Le directory adottano una struttura gerarchica ad albero (come mostra anche l’immagine in cima alla pagina) che ha lo scopo di offrire una “mappa” chiara all’utente grazie alla quale organizzare il posizionamento dei file ma non solo: alcune directory sono destinate a determinate funzioni e file (ad esempio di sistema). Per navigare tra una directory è possibile utilizzare direttamente il mouse o digitare il cosiddetto “percorso” (path), una sorta di link che ci porta direttamente alla directory desiderata. La struttura del percorso, sicuramente familiare a molti utenti, è la seguente: “(nome directory)/(nome directory)/(nome directory) etc. Il simbolo “/” o slash funge da elemento di raccordo tra le varie directory.
A differenza di altri OS, Linux non assegna una lettera alle varie unità disco/partizioni presenti nel computer (come in Windows dove C è normalmente assegnata al disco locale dove risiede l’OS) ma adotta bensì una struttura a directory unificate. La directory root comprende quindi tutte le unità disco/partizioni presenti e relativi file.
Linux dipone di numerose directory, di seguito ricordiamo le principali (fornendo una breve descrizione), ovvero quelle che sono considerabili parte integrante del root filesystem e devono essere presenti al boot per consentire il corretto avvio dell’OS:
- /root filesystem – è la directory principale del filesystem e dentro la quale devono essere presenti tutti i file necessari al boot del sistema operativo, oltre alle librerie e file eseguibili necessari per avviare i filesystem rimanenti.
- /bin – destinata ai file eseguibili dell’utente;
- /boot – contiene il bootloader statico, i file eseguibili del kernel ed i file di configurazioni necessari all’avvio;
- /dev – contiene i file di ciascun dispositivo collegato al computer. I file (non si tratta di driver) hanno lo scopo di rappresentare ogni singolo dispositivo nell’OS facilitando l’accesso a questi ultimi.
- /etc – destinato ai file di configurazione del sistema locale della macchina host;
- /lib – cartella in cui sono presenti le librerie condivise necessarie all’avvio dell’OS;
- /root – da non confondere con la prima dell’elenco. Si tratta della directory home dell’utente root.
- /sbin – cartella nella quale troviamo i system binary file, eseguibili utilizzati per l’amministrazione del sistema