File system
Nella pagina dedicata alla memoria virtuale abbiamo visto come il sistema operativo regali a ogni processo uno spazio di indirizzi tutto suo, un palazzo privato dove nessun altro può bussare, e abbiamo seguito il gioco delle tabelle che traducono gli indirizzi di scena in indirizzi veri della memoria fisica. C'è però un difetto in quel palazzo, e lo avverti ogni volta che spegni la macchina, perché la memoria, virtuale o meno che sia, vive soltanto finché la corrente scorre, e quando il processo muore o il computer si chiude ogni numero che custodiva svanisce nel silenzio. Le cose che contano davvero, la lettera che hai scritto, la fotografia del tuo gatto, il programma a cui hai dedicato un anno, devono sopravvivere allo spegnimento, devono poter essere condivise fra processi diversi e fra persone diverse, e devono poter crescere ben oltre la capienza della memoria installata. Per questo, subito dopo averci raccontato processi e memoria, il libro di Tanenbaum apre il capitolo più quotidiano di tutti, quello dedicato ai file system, e noi lo attraversiamo con calma, promettendoti che alla fine saprai come la macchina custodisce le tue carte e come potrai un giorno costruire quell'archivio con le tue mani.
Il file è per definizione un meccanismo di astrazione, come scrive Tanenbaum in una frase da scolpire nella mente, e il suo mestiere è conservare informazioni sul disco e restituirtele più tardi nascondendoti ogni dettaglio su come e dove quelle informazioni dormano davvero. Per fartelo immaginare pensa all'archivio di un vecchio ufficio, dove ogni pratica viaggia in un faldone con un'etichetta sul dorso, tu chiedi al commesso una certa pratica chiamandola per nome e te la vedi consegnata per intero, senza sapere in quale stanza, su quale scaffale e in quale cassetto quel faldone passa le notti. Il file è esattamente questo, una sequenza di byte con un nome, dove per byte intendiamo il mattone di otto bit incontrato nella pagina sull'architettura del calcolatore, e sequenza significa che i byte stanno in fila con un ordine preciso, dal primo all'ultimo, come i fogli infilati nel faldone. Il sistema operativo, in questa visione che accomuna Unix e Windows, guarda dentro il file e vede soltanto una sfilza di byte privi di significato, lascia a te e ai tuoi programmi il compito di dare un senso a quella sfilza, e questa rinuncia volontaria a capire è la sua forza segreta, perché le stesse scaffalature custodiscono una lettera, una fotografia o un programma eseguibile senza cambiare di una vite.
Anche il modo di battezzare i faldoni segue regole che cambiano da archivio ad archivio, e conviene conoscerle perché ti accompagneranno a lungo. I nomi possono arrivare a duecentocinquantacinque caratteri in quasi tutti i sistemi moderni, alcuni distinguono le maiuscole dalle minuscole e altri le ignorano del tutto, così che Unix riconosce maria, Maria e MARIA come tre pratiche distinte mentre il vecchio MS-DOS le impila sotto la stessa etichetta. Molti nomi portano in coda una seconda etichetta attaccata dopo un punto, come in relazione.pdf, e questa parte si chiama estensione e racconta la natura del contenuto, secondo la convenzione per cui in Unix resta un gentile promemoria per il proprietario mentre in Windows il sistema la legge davvero e sa quale programma deve svegliarsi quando fai doppio clic sopra quel nome. I programmi obbediscono a questa abitudine senza saperne la storia, il compilatore del linguaggio C degna appena di uno sguardo un file che non finisca in .c, e la buona educazione dei nomi è il primo ordine che regali al tuo archivio personale.
Accanto al contenuto, ogni faldone viaggia con una scheda che ne racconta la storia, e nel mestiere dei file questa scheda si chiama insieme di attributi, che alcuni chiamano metadati, cioè dati che parlano di altri dati. La scheda custodisce il nome, la dimensione in byte, tre date distinte di creazione, ultimo accesso e ultima modifica, il proprietario e le regole di protezione che decidono chi può aprire quel faldone e chi resta fuori dalla stanza, più spie minuscole che segnalano se il file è nascosto, se è marcato per la cancellazione automatica oppure se è stato toccato dopo l'ultimo backup e merita di essere copiato di nuovo. I vecchi mainframe pretendevano persino che dichiarassi in anticipo la dimensione massima che il file avrebbe raggiunto, una seccatura che oggi ci fa sorridere, e ogni attributo che ti ho elencato esiste per rispondere a un'esigenza concreta, le date servono per esempio al programma make che ricompila soltanto ciò che è cambiato, e la spia di archivio risparmia al programma di backup il lavoro di copiare file che sono già al sicuro.
Sull'archivio si possono compiere gesti, e il sistema operativo li espone come operazioni, dove operazione significa chiamata di sistema, cioè il comando preciso con cui un processo si rivolge al sistema per farsi servire. Puoi creare un file annunciando che sta per nascere e predisponendo i suoi attributi, leggerlo ricevendone una parte nel tuo spazio di memoria, scriverlo depositando byte alla posizione corrente e facendolo crescere, cancellarlo restituendo al magazzino i blocchi che occupava, rinominarlo senza toccarne il contenuto, e poi ci sono due gesti da capire bene, aprire e chiudere. Aprire un file è il momento in cui il commesso va a prendere la scheda e la lista dei blocchi e li porta dalla lenta stanza del disco alla tua scrivania in memoria, così ogni lettura successiva trova tutto pronto e veloce, e chiudere è il gesto cortese di rispedire il faldone all'archivio, magari dopo aver scarabocchiato l'ultimo foglio mezzo vuoto, perché il disco scrive a blocchi e solo la chiusura garantisce che l'ultimo blocchetto sia davvero consegnato.
I primi archivi, quelli a nastro magnetico, permettevano un solo modo di sfogliare, leggendo i byte in ordine dal principio come si srotola un nastro, e questo accesso sequenziale andava benissimo finché i file erano nastri veri. Quando arrivarono i dischi, con la testina che salta da un punto all'altro in un soffio, nacque l'accesso casuale, e con esso la possibilità di chiedere un punto preciso della sequenza senza aver letto tutto il resto, esattamente come quando il commesso apre il faldone a metà e ti mostra direttamente la pagina che ti serve. Il meccanismo che rende possibile questa magia si chiama seek, ricerca, un'operazione che sposta un segnalibro invisibile dentro il file, e dopo di essa le letture ripartono da quel punto, così un database che custodisce centomila prenotazioni può trovare la tua in un lampo anziché sfogliare tutte le altre una per una.
Finora abbiamo parlato dei faldoni, ma un ufficio con mille faldoni accatastati in un unico corridoio diventerebbe inutilizzabile in una settimana, e infatti i sistemi operativi organizzano i file dentro le directory, che sono a loro volta file particolari il cui contenuto è un elenco di nomi. La forma più ingenua è la directory unica, un solo scaffale per tutti i faldoni del mondo, e perfino un mostro storico come il supercomputer CDC 6600 si accontentò di questo disegno per non complicarsi la vita, mentre i primi personal computer, con un solo utente al comando, ci stavano comodissimi. Quando però gli utenti diventano migliaia e i file decine di migliaia, l'unico scaffale esplode, e la soluzione che i sistemi moderni condividono è la gerarchia, cioè directory dentro directory come scaffali dentro stanze, così ogni professore del libro può tenere in stanze separate il manoscritto del suo libro, i compiti degli studenti, le proposte di finanziamento e la posta elettronica, ritrovando tutto in pochi passi senza pestarsi i piedi.
Per trovare un faldone in un edificio così grande serve un indirizzo, e i file system ne offrono due specie. Il percorso assoluto descrive la strada intera partendo dal portone d'ingresso dell'edificio, la directory radice, e scendendo corridoio dopo corridoio fino alla stanza del faldone, e in Unix si scrive con le barre come in /usr/ast/cassetta, dove ogni nome è una soglia attraversata. Il percorso relativo descrive invece la strada partendo dalla stanza in cui ti trovi in questo momento, che il sistema chiama directory di lavoro corrente, e conviene immaginare che in ogni stanza esistano due porte speciali, la porta scritta punto che riporta nella stanza stessa e la porta scritta punto punto che sale di un piano verso il corridoio da cui sei entrato, tranne al pianterreno dove la porta punto punto, per gentilezza dell'architetto, torna nel pianterreno stesso. Così, se la tua stanza corrente è /usr/ast, la scrittura cassetta indica lo stesso faldone dell'indirizzo assoluto intero, e la scrittura ../lib/dizionario significa salire al piano usr, entrare nella stanza lib e prendere il faldone dizionario, un viaggio che ogni processo compie tenendo nella propria testolina la stanza in cui si trova, senza disturbare gli altri ospiti della macchina.
Anche sulle directory il sistema offre i suoi gesti, crearne una vuota tranne che per le due porte speciali, cancellarla quando è vuota, aprirla per leggerne le etichette una a una, rinominarla, e poi due gesti affascinanti, collegare e scollegare, di cui ti racconterò presto la magia. Quando chiedi di aprire un percorso, il file system fa il portiere con pazienza metodica, leggendo la radice, scoprendo dove vive il primo nome della strada, entrando in quella directory, cercando il nome successivo, e così via fino all'ultimo nome, porta per porta. Il libro fa l'esempio del percorso /usr/ast/mbox e ti invito a rileggerlo con gli occhi del portiere, prima si cerca usr nella radice e dal suo numero di scheda si raggiunge la stanza, poi dentro quella stanza si cerca ast e si scende ancora, infine dentro la stanza di ast si trova mbox e la sua scheda viene portata in memoria, dove resta comoda finché non decidi di chiudere il file.
Un edificio così ben organizzato ha però un problema, e cioè che la carta finisce, i faldoni crescono, e a un certo punto arrivano scatoloni da un altro archivio, che nel nostro mestiere corrispondono a dischi nuovi, chiavette e memorie esterne. I due grandi mondi hanno inventato risposte opposte e vale la pena conoscerle entrambe. Windows assegna a ogni archivio una lettera d'unità propria, così il nuovo scatolone vive in un edificio separato con entrata indipendente, e quando scrivi un indirizzo devi dichiarare esplicitamente in quale edificio stai entrando. Unix compie invece il gesto del montaggio, attacca cioè la radice del nuovo archivio sopra una directory dell'albero esistente, come se impilassi gli scatoloni di un secondo archivio dentro un armadio di una stanza del primo, e da quel momento chi entra in quella stanza trova dentro l'altro archivio intero senza accorgersi che le pareti sono cambiate. Per chi usa la macchina l'albero resta un albero solo, e questo artificio, raffinato con il tempo nell'idea di un file system virtuale, permette di mescolare sotto un unico cielo dischi locali, chiavette portatili e persino archivi che vivono su macchine lontane in rete.
È giunto il momento di scendere dalle stanze ai sotterranei e chiederci come è organizzato tutto questo sul disco vero, perché finora abbiamo parlato del registro che vede l'utente e ora vogliamo vedere il magazzino che lo regge. Il disco grezzo, visto dal sistema operativo, è un lungo corridoio di settori numerati, e il primo settore, chiamato master boot record, custodisce una piccola tavoletta con la pianta delle partizioni, cioè dei recinti indipendenti in cui il corridoio è diviso, di cui uno solo è marcato come attivo. All'accensione il firmware legge quel primo settore e lo esegue, il programmino si affida alla pianta per trovare il recinto attivo, ne carica il primo blocco, detto blocco di avvio, e questa catena di consegne è quella che alla fine sveglia il sistema operativo addormentato. Dentro ogni partizione la disposizione cambia da file system a file system, ma il disegno tipico comprende un superblocco con i numeri fondamentali, poi le strutture che tengono il conto dello spazio libero, poi le schede dei file, poi la directory radice, e infine la distesa dove dormono i file veri e propri, come una planimetria che indichi città, quartiere, via e stanza dei faldoni.
Il primo problema da risolvere nei sotterranei è come tagliare la carta, e la scelta universale è spezzare ogni file in blocchi di dimensione fissa, tipicamente quattro kilobyte, perché gestire pezzi uguali è infinitamente più semplice che misurare fogli su misura, con un compromesso da assaporare, dato che blocchi grandi sprecano carta nei file piccoli e blocchi piccoli moltiplicano gli spostamenti della testina nei file grandi. Per sapere quali blocchi sono liberi il sistema tiene una mappa di bit, una lavagna dove ogni casella corrisponde a un blocco e vale uno se occupato e zero se libero, e la vecchia FAT raggiunge lo stesso risultato per altra via segnando nella sua tabella i blocchi liberi con un codice speciale. Quando un file cresce, il sistema scorre la lavagna, raccoglie blocchi liberi sparsi qua e là nel magazzino e li assegna al faldone, e questo spargimento controllato è il prezzo della flessibilità che stiamo per esaminare da vicino.
Resta il cuore del mestiere, e cioè come il sistema ricordi quali blocchi appartengano a quale faldone, problema al quale la storia ha dato tre risposte. La prima è l'allocazione contigua, che stipa ogni file in una fila ininterrotta di blocchi, semplice come due soli numeri da ricordare, l'inizio e la lunghezza, e velocissima da leggere in un fiato solo, ma destinata a degradarsi in un brulicare di buche man mano che file muoiono e nascono, e costretta a chiederti la dimensione finale prima che tu sappia cosa vorrai scrivere, ragion per cui sopravvive soltanto dove i contenuti sono congelati per sempre, come nei compact disc. La seconda è la lista concatenata, dove ogni blocco custodisce in testa il numero del successivo, senza sprechi e senza buche, ma con l'accesso casuale ridotto a una tortura, perché per arrivare al blocco numero n devi passare di mano in mano tutti i precedenti. La terza è la scorciatoia della tabella di allocazione dei file, la FAT storica di MS-DOS, che sposta tutti quei puntatori dalla carta alla memoria centrale dentro un unico registro dove la riga numero sei dice dove sta il blocco sei e chi lo segue, così seguire la catena di un file diventa un gioco da tavolino, ed è qui che il registro dell'archivio mostra il suo cuore, con ogni faldone che sa dove sono i suoi fogli grazie alle annotazioni centrali dell'impiegato diligente.
La terza via moderna si chiama nodo indice, o i-node, e la troverai ovunque, da Unix a molte altre famiglie, con parenti stretti persino nell'NTFS di Windows, perché risolve il difetto fatale della FAT con un ragionamento elegante. Invece di un registro grande quanto l'intero disco, ogni file possiede una sua scheda personale che raccoglie gli attributi e gli indirizzi dei suoi blocchi, e questa scheda viene portata in memoria soltanto mentre il file è aperto, così lo spazio occupato dipende dal numero di file in uso e resta identico che il disco sia piccolo, enorme o colossale. Perché la scheda non cresca all'infinito, gli indirizzi che non ci stanno trovano posto in blocchi di secondo livello puntati da un indirizzo speciale, e se anche questo non basta esistono blocchi di terzo livello, una scala a chiocciola che permette a un file di crescere quanto serve senza perdere il filo. Quando incontrerai questa idea nei sistemi veri scoprirai che i primi dieci indirizzi stanno direttamente nella scheda del vecchio Unix, così i file piccoli, che sono la stragrande maggioranza, trovano tutto in un solo colpo di testina.
La FAT merita una visita più lunga, perché è la nonna di quasi tutte le memorie che tocchi ogni giorno. Nata con i primi personal computer come FAT-12, con dodici bit per indirizzo e nomi corti di otto caratteri più tre di estensione, divenne FAT-16 quando i dischi superarono i suoi limiti, poi FAT-32 con ventotto bit effettivi fino a due terabyte per partizione, e oggi la ritrovi dentro fotocamere digitali, lettori musicali e chiavette di ogni specie, più viva che mai. La sua scheda di directory misura esattamente trentadue byte e custodisce il nome, gli attributi che Windows interpreta davvero, la data e l'ora con una precisione di due secondi scarsi, il numero del primo blocco e la dimensione esatta del contenuto, con un tic del calendario ereditato, perché contando gli anni da una base fissata nel 1980 esprime come anno massimo il 2107 e gli esperti scherzano sul rischio anno duemila centootto. Il suo punto debole concettuale resta il registro intero da tenere sempre in memoria, che sui dischi di oggi peserebbe gigabyte, e per questo i sistemi seri l'hanno lasciata alle memorie piccole e portatili, dove la sua semplicità resta una virtù.
Ogni disegno deve però sopravvivere a un nemico che dimentichiamo sempre, la corrente elettrica che se ne va nel momento peggiore, ed è qui che i file system si giocano la loro reputazione. Prendi l'operazione più banale del mondo, cancellare un file, che in Unix è in realtà una piccola cerimonia in tre atti, togliere il nome dalla sua directory, restituire la scheda al mucchio delle schede libere e consegnare i blocchi al magazzino dello spazio libero, e rifletti sul disordine che un blackout può seminare a metà cerimonia. Se la luce muore dopo il primo atto, scheda e blocchi restano appesi nel nulla, assegnati a nessuno e recuperabili da nessuno, se muore dopo il secondo la scheda potrebbe essere regalata a un altro file mentre qualche nome continua a puntarla, e se muore dopo il terzo due file finiscono per condividere gli stessi blocchi come coinquilini sgraditi. Per questo esiste il controllo di coerenza, il programma che all'accensione successiva scorre tutto l'archivio contando blocchi e nomi come un inventario dopo un furto, ma un inventario dell'intero disco richiede ore, e quell'attesa è il prezzo che nessun utente accetta di pagare.
La soluzione che i sistemi moderni hanno adottato si chiama file system con giornale, o journaling se preferisci la parola straniera, e l'idea è così sana che ti chiederai perché non la usiamo anche in cucina. Prima di compiere la cerimonia in tre atti, il sistema scrive sul giornale, un quaderno dedicato, l'elenco degli atti che sta per fare, lo scarabocchia sul disco e si accura che ci sia davvero, e solo allora comincia il lavoro vero, barrando la pagina a cerimonia compiuta. Se la corrente se ne va in qualunque punto, all'accensione il sistema apre il quaderno, trova gli atti sospesi e li riesegue con calma, e questa ripetizione è sicura perché gli atti sono scelti apposta per essere idempotent, parola che significa che farli due o cento volte produce lo stesso risultato, come l'annotazione che dice che il blocco cinque è libero e che puoi riscrivere quante volte vuoi. Il giornale trasforma un controllo di ore in una rilettura di pochi secondi, lo ritrovi dentro NTFS fin dai tempi di Windows NT del 1993 e dentro ext3 e ReiserFS nel mondo Linux, ed è la ragione per cui oggi uno spegnimento brusco è una scocciatura anziché una tragedia dei propri dati.
Torniamo su per un attimo negli uffici, perché c'è una domanda che gli archivisti si pongono da sempre, e cioè come far comparire la stessa pratica in due stanze diverse senza fotocopiarla, dato che la fotocopia significa versioni che prima o poi divergono. Il collegamento vero, detto hard link per abitudine consolidata, risponde così, la pratica resta una sola, con una sola scheda personale, ma il suo nome compare in più di una directory, e nella scheda un contatore tiene il numero dei nomi che puntano a quella pratica. Creare il collegamento significa aggiungere un nome nello scaffale e alzare il contatore di uno, e cancellare un nome significa abbassarlo, con la regola che la pratica muore davvero, scheda e blocchi restituiti al magazzino, soltanto quando l'ultimo nome è sparito e il contatore tocca lo zero. Il disegno ha una conseguenza curiosa che il libro racconta con chiarezza, se il proprietario originario cancella il suo nome mentre un collegamento vive altrove, il file sopravvive di proprietà del fantasma dell'ex proprietario, che continua a pagarne lo spazio finché l'ultimo collegamento non viene tolto, e l'archivio intero smette di essere un albero puro per diventare un grafo, con tutti i problemi di contabilità e di inventario che questa forma più libera si porta dietro.
Il secondo modo di condividere le pratiche usa il cartellino, ed è il collegamento simbolico, che il libro presenta come una piccola pratica speciale il cui intero contenuto è un indirizzo scritto a mano, l'indirizzo di un'altra pratica, magari custodita in un archivio completamente diverso. Quando chiedi il cartellino, il sistema legge l'indirizzo, lo capisce e riparte alla ricerca della pratica vera, esattamente come quando entri in una stanza e trovi appeso al muro un biglietto che dice questa pratica si trova nell'archivio di via Verdi, al piano due, armadio sette. Il vantaggio è enorme, il cartellino può attraversare i confini fra dischi diversi e persino puntare a pratiche su macchine lontane in rete, cose vietate al collegamento vero, ma il prezzo è un doppio giro più lento e il rischio di restare orfano, perché se la pratica vera viene distrutta il cartellino resta appeso al muro indicando il vuoto, e chi lo segue trova soltanto un errore gentile. Rimuovere il cartellino non tocca affatto la pratica vera, e questa asimmetria fra i due tipi di legame ti sarà chiarissima dopo gli esperimenti con cui chiuderemo la pagina.
Chi può entrare nelle stanze e aprire i faldoni è l'ultima grande questione, e Unix l'ha risolta con un disegno che imita alla perfezione l'armadietto con le chiavi. Ogni file ha un proprietario, cioè un utente della macchina, e un gruppo, cioè una squadra di utenti riuniti per lavoro, e le persone del mondo si dividono in tre cerchi concentrici, il proprietario stesso, i membri del gruppo e tutti gli altri, e per ciascun cerchio la scheda del file definisce tre diritti, lettura, scrittura ed esecuzione, che combinati fanno nove piccole porte da aprire o chiudere, scritte nella famosa sequenza rwx ripetuta tre volte come una filastrocca. Immagina tre mazzi di chiavi appesi all'armadietto, il primo con tre chiavi tue personali, il secondo consegnato alla tua squadra, il terzo lasciato su un chiodo per chiunque passi, dove la chiave di lettura permette di guardare dentro il faldone, quella di scrittura di aggiungere e strappare fogli, e quella di esecuzione, per i file che sono programmi, permette di farli girare, mentre sulle directory la stessa chiave vale come permesso di attraversare la soglia della stanza. I programmi che usi rispettano queste serrature senza discutere, e nei sistemi veri troverai combinazioni bizzarre, come schede che negano ogni diritto al proprietario mentre regalano tutto agli estranei, segnalate dai controlli come sospette.
Per vedere come queste idee prendono corpo nei sistemi veri, il libro ci fa visitare due archivi storici che valgono come modelli di tutti gli altri, e il primo è Unix versione 7, quello della mitica macchina PDP-11, nato già multiutente perché ereditato dal progetto MULTICS. La sua scheda di directory è minimale al punto giusto, quattordici byte per il nome e due soli per il numero di scheda, e tutto il resto della storia vive nell'i-node, dimensione, tre date, proprietario, gruppo, protezione e il contatore dei collegamenti. Per i blocchi dei file la scheda custodisce dieci indirizzi diretti e poi la scala a chiocciola dei blocchi indiretti di primo, secondo e terzo livello, un disegno da cui i file system moderni di Linux e degli altri Unix discendono quasi senza aver cambiato una virgola. Anche la ricerca di un percorso segue l'itinerario del portiere che abbiamo praticato insieme, e le due porte speciali, che nella radice puntano alla radice stessa, bastano a rendere possibile ogni viaggio relativo, con una parsimonia che fa onore ai suoi inventori.
Dall'altra parte della barricata si allunga la famiglia Windows, dove il NTFS nativo dei sistemi moderni riprende le idee migliori con accenti propri, schede grandi che possono contenere file piccoli interi, e soprattutto il giornale esteso che lo rende quasi immune agli incidenti di corrente, mentre le estensioni Rock Ridge e Joliet fecero viaggiare i nomi lunghi di Unix e di Windows perfino sui compact disc congelati dello standard ISO 9660, dimostrando che perfino un archivio intoccabile deve preoccuparsi di farsi capire da tutti. E quando una stessa macchina ospita archivi di specie diverse, dischi locali di un tipo, chiavette di un altro, compact disc di un terzo, i sistemi Unix moderni interpongono fra te e i sotterranei il file system virtuale, uno strato traduttore che presenta a tutti la stessa faccia gentile mentre sotto chiama il disegno giusto per ogni archivio, il che spiega come mai montare una chiavetta in Linux non richieda lingue nuove.
Mettiamo in fila il viaggio intero, perché vale la pena capire perché ogni tappa esiste e da quale bisogno nasce. Siamo partiti dal faldone con un nome, abbiamo scoperto attributi che ne raccontano la storia e operazioni che ne permettono ogni gesto, abbiamo imparato che le directory sono stanze e corridoi attraversati da indirizzi assoluti e relativi, abbiamo visto come il montaggio attacchi archivi nuovi a quello vecchio senza scosse, siamo scesi nei sotterranei dove blocchi, mappa di bit, registri e schede si dividono il disco secondo regole precise, abbiamo capito perché la nonna FAT lavora ancora nelle nostre tasche e perché il giornale protegge i nervi di chi lavora al buio, abbiamo imparato a far comparire una pratica in due stanze e a chiudere le porte con tre mazzi di chiavi. Ogni scelta di progetto che hai incontrato risponde a una domanda onesta, come conservo, come ritrovo, come condivido, come sopravvivo, e queste domande torneranno identiche il giorno in cui compilerai da solo il tuo primo sistema operativo, come il MINIX dello stesso Tanenbaum che ti aspetta nella pagina dedicata al kernel. Quando guarderai la tua macchina da quel giorno, saprai che dentro di essa alberga un archivio organizzato con cura da un commesso paziente, lontano da ogni idea di magia, e questa consapevolezza è il primo mattone per costruire qualcosa di tuo.
Adesso appoggia la spiegazione sulla mensola e vieni a provare tutto questo con le
mani, perché il tuo computer nasconde già l'intero archivio che ti ho descritto, e ogni
esperimento che segue si fa dal terminale, che su Linux e Mac trovi cercando la parola
terminale nel menu delle applicazioni, mentre su Windows puoi usare il prompt dei
comandi oppure il terminale Linux che Windows stesso offre come componente facoltativa.
Il primo passo è guardarsi intorno con attenzione, quindi digita pwd e il
terminale ti risponde con la tua stanza corrente scritta come percorso assoluto che
parte dalla radice, poi digita ls per vedere l'elenco dei faldoni nella
stanza, e infine ls -l per la lista lunga, dove ogni riga comincia con una
stringa di dieci simboli come -rwxr-xr-x che è proprio la serratura a nove
porte di cui abbiamo parlato, seguita dal proprietario, dal gruppo, dalla dimensione in
byte e dalla data dell'ultima modifica.
Per il secondo esperimento mettiti nei panni del viandante e attraversa la casa
stanza per stanza, con cd / sali al pianterreno assoluto, la radice
dell'albero intero, e lì ls ti mostra le stanze fondamentali del sistema,
poi con cd /usr entri in una di esse usando un percorso assoluto, con
cd .. risali un piano usando la porta speciale, e con cd da
solo torni alla tua stanza personale. Gioca ancora qualche minuto creando e spostando
cose, con mkdir prova costruisci una stanza nuova dentro la tua,
cd prova la attraversi, touch appunti.txt fabbrichi un faldone
vuoto con quell'etichetta, e osserva che in ogni stanza che visiti ls -a
rivela le due porte speciali punto e punto punto accanto ai faldoni veri.
Il terzo esperimento riguarda la scheda che accompagna ogni faldone, e il comando che
la espone intera si chiama stat appunti.txt, che ti mostra una lista di
attributi fedele alla teoria, numero di scheda, dimensione, tre date distinte,
proprietario, gruppo e la serratura a porte, e se ripeti il comando dopo aver dato
echo ciao >> appunti.txt per aggiungere una riga al file noterai che
la dimensione e l'ora di modifica sono cambiate sotto i tuoi occhi. Con cp appunti.txt copia.txt fabbrichi un secondo faldone identico e con mv copia.txt rinominato.txt gli cambi etichetta senza toccarne il contenuto, mentre
rm rinominato.txt lo cancella consegnandone i blocchi al magazzino dello
spazio libero, così hai eseguito a mano la cerimonia in tre atti di cui il giornale tiene
gelosamente memoria.
Il quarto esperimento è il mio preferito, perché rende visibile la differenza fra la
pratica vera e il cartellino. Crea un faldone con echo origine > lettera.txt,
poi con ln lettera.txt clone.txt gli aggiungi un secondo nome nello stesso
archivio, cioè un collegamento vero, e con ls -li osserva le due righe,
perché il numero di scheda iniziale è identico per entrambe ed è quel contatore a dirti
che i due nomi abbracciano un unico contenuto. Adesso prova ln -s lettera.txt cartellino.txt per creare il collegamento simbolico e riesamina con ls -li, dove noterai che il cartellino ha una scheda tutta sua e che la lista lunga
lo tradisce mostrandoti l'indirizzo a cui punta, e il colpo di scena arriva quando
cancelli l'originale con rm lettera.txt, perché il collegamento vero
continua a mostrarti il contenuto mentre il cartellino resta appeso al muro indicando
il vuoto, cosa che ls cartellino.txt ti segnala con un errore gentile.
Il quinto esperimento ti fa stringere tra le dita i tre mazzi di chiavi dell'armadietto,
sempre dentro la tua stanza prova, e comincia con echo date > segreto.txt
per fabbricare un nuovo faldone. Con chmod u-r segreto.txt togli a te
stesso la chiave di lettura e con cat segreto.txt prova a guardare dentro,
ricevendo un permesso negato che ti lascia basito la prima volta, perché il proprietario
che si chiude fuori dalla propria stanza sembra uno scherzo, e invece è il sistema che
fa esattamente ciò che gli hai ordinato. Riconsegnati la chiave con chmod u+r segreto.txt, poi gioca con la notazione dei numeri che trovi nei libri, chmod 640 segreto.txt significa leggere e scrivere per te, sola lettura per la tua
squadra e porta chiusa per tutti gli altri, e puoi verificare la nuova serratura con un
altro ls -l che traduce i numeri nella stringa familiare di lettere.
Il sesto esperimento ti porta a osservare il montaggio senza rischi, con i comandi che
mostrano gli archivi attaccati all'albero senza toccare nulla. findmnt
elenca i dispositivi montati e le directory sopra cui poggiano le loro radici,
lsblk disegna la carta dei dischi presenti nella macchina, e df -T
aggiunge il tipo di ciascun file system, così puoi riconoscere i nomi che hai imparato,
gli ext con il giornale nel mondo Linux, i numeri della famiglia FAT sulle memorie
portatili, NTFS sui dischi di Windows. Se hai una chiavetta a portata di mano,
inseriscila e riesegui findmnt, e vedrai comparire una nuova riga dove la
radice della chiavetta è stata attaccata sopra una directory del tuo sistema, il gesto del montaggio che hai appena studiato, e
sullo schermo la chiavetta appare come se fosse sempre stata una stanza dell'edificio.
Il settimo e ultimo esperimento funziona quasi allo stesso modo su Windows, se è
quello il sistema che hai sotto le dita, aprendo il prompt dei comandi e usando
dir al posto di ls per elencare i faldoni, cd per
spostarti fra le stanze, e type al posto di cat per guardare
dentro un file di testo, senza dimenticare il cestino dove i faldoni cancellati
sopravvivono per un po' prima di morire davvero, e il comando mklink per
fabbricare cartellini. Qualunque sia la tua bandiera, dopo questi sette giri di pista
possiedi gli occhi giusti per riconoscere il faldone, la scheda, la stanza, la serratura
e il cartellino dentro ogni finestra che apri.
Il modulo attinge al capitolo 4, File systems, del libro Modern Operating Systems di Andrew S. Tanenbaum e Herbert Bos, custodito dal progetto nel percorso books/Modern Operating Systems 4th Edition--Andrew Tanenbaum.pdf, dalle sezioni sui file e sulle directory fino all'implementazione del file system con blocchi, mappe di bit, tabelle di allocazione e nodi indice, al giornale, ai collegamenti e agli esempi storici di MS-DOS con la FAT e di Unix V7 con i suoi nodi indice.
Ora che sai dove la macchina custodisce le tue carte e come le ritrova anche dopo anni, resta un mistero da svelare prima di poterti sedere alla scrivania del costruttore, e cioè come il sistema operativo parli con i dispositivi stessi, quelli che abbiamo sfiorato scendendo nei sotterranei del magazzino. Le testine che leggono i blocchi, i controllori che le muovono e i driver che li guidano sono il prossimo gradino del percorso, quindi prosegui verso la pagina successiva, dove scopriremo insieme chi muove davvero le braccia della macchina mentre tu chiedi un file per nome.