Storia di GNU Linux
La lampadina a incandescenza di un lampione illumina con la luce calda del tungsteno il marciapiede ancora umido per la pioggia che ha smesso da poco, in una fredda notte a Cambridge, nel Massachussets. Il marciapiede corre lungo Main Street, interrompendosi sullo scivolo d’ingresso del Tech Square. Immediatamente dentro l’edificio c’è un portiere che legge un ormai vecchio quotidiano guardando distrattamente l’orologio che ha sul polso: manca qualche minuto a mezzanotte. Nove piani più in alto, una stanza tra le altre spicca nel buio per la luce accesa che filtra da sotto la porta. Il rumore di molle arrugginite è un po’ attutito da quello delle ventole dei computer che si trovano nella stanza. Un uomo sulla trentina, dai capelli lunghi e la barba incolta, si sta svegliando: è seduto su di un letto pieghevole, ed ogni minimo movimento del suo corpo fa cigolare le molle che sostengono la rete su cui poggia il materasso. Allunga la mano verso una scrivania per prendere una lattina di Pepsi Cola, già aperta, e ne beve un sorso per facilitare il risveglio. Dopo essersi strofinato gli occhi, l’uomo può finalmente alzarsi in piedi e percorrere un paio di metri, per sedersi davanti alla postazione di un terminale sorseggiando la cola rimasta nella lattina. Il terminale non mostra altro che una riga di comando in attesa di istruzioni, preceduta dalla riga “JOB 7 on TTY43 16-Dec-1983 11:52 PM”. È il minimale messaggio di benvenuto di un sistema operativo TOPS-20, che sta girando su un mainframe modello DEC-20 presente in quello stesso edificio. Non sono molti i luoghi nel mondo che possono permettersi un calcolatore di questo tipo, nel 1983, ma quell’edificio è la sede del laboratorio di intelligenza artificiale del Massachussets Institute of Technology.
L’uomo non utilizza password, anzi: è anche riuscito a convincere un quinto degli altri utenti a non utilizzarla, in modo da permettere un libero accesso ai codici che scrivono. Il suo nickname da programmatore, invece, è “rms”. Un semplice acronimo del suo nome, Richard Matthew Stallman, ma anche un doppio senso: può indicare il root mean square, la radice della media dei quadrati, una operazione che si usa spesso in fisica. Stallman è infatti laureato in fisica ad Harvard, ma la sua passione è la programmazione ed è per questo che ormai vive dentro il laboratorio di intelligenza artificiale dell’MIT. Da alcuni anni si è fatto un nome creando un editor di testi molto evoluto, al quale ha dato il nome di EMACS: questo programma diventa in breve il più diffuso editor del mondo universitario statunitense, anche grazie alla licenza che Stallman decide di usare per pubblicarlo. Infatti EMACS è disponibile a tutti come codice sorgente, a condizione che chi vi apporta delle modifiche deve pubblicarle. Questo permette al programma di crescere molto velocemente, perché chiunque può migliorarlo e tutti beneficiano delle nuove caratteristiche. Negli ultimi due anni l’hacker, come egli stesso ama definirsi, ha compiuto del reverse engineering per creare una alternativa ad una macchina LISP prodotta dalla azienda Symbolics. Ha passato le notti a provare il programma della Symbolics e sviluppare un altro programma, che avrebbe poi ceduto all’azienda LMI, con le stesse funzioni ma scrivendo di proprio pugno tutto il codice. Perché? Per una sorta di vendetta: a suo avviso la Symbolics aveva danneggiato l’MIT, portando via dal laboratorio alcuni tra i migliori programmatori proprio per evitare che potessero condividere liberamente il proprio codice. Con questo reverse engineering, Stallman voleva colpire gli affari della Symbolics e contemporaneamente evitare che l’azienda potesse avere un monopolio assoluto della tecnologia. Mentre lavorava a questo progetto, tuttavia, aveva deciso di intraprendere anche un altro progetto, molto più grande: replicare un vero e proprio sistema Unix, pubblicando il codice in modo libero, come aveva fatto per EMACS. Un sistema operativo completamente libero dalle restrizioni d’uso dei vari sistemi dell’epoca avrebbe potuto far esplodere la vera potenzialità dei computer e permettere agli altri hacker, appassionati di programmazione, la creazione di programmi davvero innovativi.
In particolare, Stallman ha in mente un utilizzo quasi fantascientifico di questa libertà: modificare i driver della stampante del laboratorio per far si che, quando la carta si inceppa, l’utente venga avvisato. Il laboratorio dispone infatti di un prototipo della Xerox che è, fondamentalmente, una delle prime stampanti di rete mai prodotte. Tutti gli utenti possono inviare documenti in stampa dalla loro postazione, ed è una funzione particolarmente apprezzata visto che per studiare spesso è utile poter leggere da un foglio di carta. Il problema è che in questa stampante i fogli si incastrano molto spesso, e quando ciò avviene nessuno se ne accorge, col risultato che gli utenti danno per scontato che i loro documenti siano stati stampati, mentre in realtà non lo sono, e finiscano col perdere tutti i dati.
Basterebbe un sistema di notifica che avvisi immediatamente l’utente che la propria stampa si è inceppata, e che deve rimuovere manualmente i fogli per evitare che tutti i prossimi documenti in stampa vengano persi. Tuttavia, Stallman ha un problema: i driver della stampante sono stati forniti all’MIT soltanto come codice binario, non come codice sorgente. Nonostante vari tentativi, Stallman non riesce a procurarsi il codice sorgente di questa stampante, ma solo una versione precedente, e scopre che l’azienda sta di fatto proibendo le modifiche al proprio software. Siccome il codice è chiuso, ed è di proprietà della Xerox, Stallman non può modificarlo per apportare la miglioria che desidera. A meno, naturalmente, di scrivere da capo un nuovo driver per la stampante, adatto per il sistema operativo TOPS-20 che fa funzionare il mainframe del laboratorio. Ma si rende anche conto che questo è un nuovo tipo di comportamento da parte delle aziende, che fino a prima non si facevano problemi a rilasciare il codice, e che inevitabilmente si diffonderà ad altri produttori. La prospettiva fa paura: nel giro di qualche anno potrebbe diventare impossibile modificare il software di un qualsiasi dispositivo, a meno di riscriverselo da capo. A quel punto, tanto vale scriversi un intero sistema operativo dal principio, rilasciandolo con una licenza libera, per risolvere il problema una volta per tutte.
Aveva anche già pensato ad un acronimo per il suo progetto: GNU, che significa GNU’s Not Unix. Insomma, un metodo ricorsivo per stabilire che GNU voleva assomigliare ad Unix, ma non era davvero Unix. In quel momento, alla fine del 1983, Stallman aveva deciso che il mondo aveva bisogno di libertà, il mondo aveva bisogno di GNU.
GNU è l’uomo di latta
Non serve molto tempo perché il progetto GNU guadagni una certa visibilità nel mondo della programmazione: in molti desiderano un sistema operativo che sia facilmente adattabile alle proprie esigenze, e sono ben contenti di dare una mano alla sua realizzazione. Stallman compila, assieme ad altri collaboratori, una lista di tutti i componenti necessari per il sistema operativo, per stabilire un piano di lavoro. Alcuni di questi, come la shell ed il compilatore per il linguaggio C vennero scritti con una certa facilità. Nel 1986 cominciò il lavoro sul kernel, letteralmente il cuore del sistema. Si tratta di quel componente che gestisce le varie interazioni con l’hardware e fa dialogare tra loro programmi diversi. È un componente difficile da scrivere, perché lavora a basso livello, quindi bisogna studiare il funzionamento dei processori, dei dischi rigidi, eccetera. Il kernel viene battezzato GNU Hurd, e per scriverlo ci si ispira a Mach, un esperimento della Carnegie Mellon University. Mach era stato rilasciato un anno prima ed è stato uno dei primi esempi del concetto di microkernel: in poche parole, si tratta di un kernel estremamente piccolo e leggero che demanda buona parte dei compiti ad altri programmi, in confronto ai kernel monolitici prodotti fino a quel momento che cercavano di racchiudere quante più funzioni possibili.
Il problema è che realizzare un kernel non è affatto facile, soprattutto non è facile realizzare un microkernel che sia davvero stabile. Il risultato è che al 1989, tre anni dopo l’inizio del lavoro, Hurd non è ancora pronto, e non si riesce nemmeno a stabilire quando lo sarà. Quasi tutto il resto del sistema operativo, invece, è pronto. Non solo: è pronta anche la licenza GPL, la General Public Licence: la prima licenza standard per rilasciare del software libero, che garantisce agli utenti la libertà di modificare e redistribuire il codice di ogni programma. Sembrerebbe tutto perfetto, tutto come deve stare, tranne per il fatto che manca un kernel funzionante ed ufficiale: vengono fatti alcuni tentativi per integrare in un sistema GNU vari kernel già esistenti, ma siccome non sono stati rilasciati dagli autori come software libero, non possono comunque essere redistribuiti ufficialmente. GNU diventa quindi l’uomo di latta alla ricerca di un cuore.
Un acquisto importante
Sono passati 7 anni dall’inizio di GNU, è la fine del 1990. Nel Vecchio Mondo, nell’europea Finlandia, un ragazzo ventunenne sta frequentando l’università di Helsinki. Nel giro di pochi giorni acquisterà un nuovo computer, con architettura 386, sperando di poterci installare il sistema operativo Minix. Sta infatti seguendo un corso su Unix ed il linguaggio C per il suo corso di laurea, e vorrebbe avere a casa un computer simile a quelli che usa all’università per potersi esercitare. È quasi un mese che la temperatura è stabilmente sotto lo zero, ed è pure nevicato da poco. Naturalmente, per i finlandesi questa patina di gelo che ricopre la città è normale, e nessuno ci fa particolarmente caso. Il ragazzo, in particolare, probabilmente non ci sta pensando anche perché è riscaldato da una emozione quasi febbrile appena pensa che tra qualche giorno otterrà il proprio computer 386, una grande novità per l’epoca, grazie ad un pagamento a rate. È pur sempre un universitario, non ha messo da parte molto denaro. Studiare informatica, però, gli piace: ha appena finito gli 11 mesi di servizio militare, ed è molto felice di avere ripreso gli studi. Tanto felice che, per l’appunto, nulla potrà raffreddare la sua impazienza. Nemmeno la consapevolezza che su questo nuovo computer non potrà installare il sistema operativo che desidera: Minix, infatti, non è rilasciato con una licenza libera e non è nemmeno tanto facile da trovare, almeno in Finlandia. Sa già che ci vorranno dei mesi per riuscire ad avere i dischi di installazione del sistema operativo, quindi per il momento dovrà accontentarsi del sistema DOS. Potrà però impiegare quei primi mesi studiando il funzionamento del calcolatore e giocando a Prince of Persia. Linus Torvalds, lo studente universitario, ha conosciuto Minix leggendo il libro “Operating Systems, Design and implementation” scritto dal professor Tanenbaum. Il libro descrive la costruzione di un sistema operativo, e per fare degli esempi pratici l’autore ha inventato un proprio sistema, che ha per l’appunto chiamato Minix. Il nome deriva dal fatto che si basa su un microkernel.
Si tratta di un sistema operativo molto piccolo e semplice, con poche funzioni, ma proprio per questo utile per capire i principi di base. Il kernel, il gestore della memoria RAM, ed il filesystem per il disco rigido costituiscono un totale di circa 12000 righe di codice: davvero poche, considerando gli altri sistemi operativi. Certo, i limiti di Minix sono comunque notevoli. Torvalds se ne accorge alla fine di febbraio del 1991, quando riesce ad installare Minix sul suo nuovo computer. Innanzitutto la sua tastiera finlandese non viene riconosciuta correttamente, i tasti appaiono tutti sbagliati, e ci sono pochi programmi funzionanti. In particolare, c’è la Bourne Shell invece di bash (la shell che tutti noi conosciamo oggi). Torvalds comincia a compilare vari programmi tra quelli già pubblicati dal progetto GNU per migliorare il sistema, eseguendo modifiche nel loro codice per farli funzionare con il kernel di Minix. Tuttavia, si accorge man mano di una serie di pecche strutturali del sistema operativo di Tanenbaum, e comincia a modificarlo. Partendo da un semplice “Hello world” che appare sullo schermo utilizzando il kernel Minix, pian piano Torvalds decide di riscrivere da capo il kernel. Per semplificare il lavoro decide di tenere alcune delle porzioni di codice di Minix, in particolare quella relativa al filesystem: questo gli permette di procedere molto velocemente, perché non deve più preoccuparsi dell’accesso al disco rigido. Prende la decisione di non limitarsi a modificare il kernel ma di scriverne uno tutto suo non solo per fare pratica, ma anche perché non è convinto dalla struttura a microkernel di Minix. Torvalds ha infatti in mente una struttura diversa: quella monolitica modulare. Il futuro darà ragione a Linus Torvalds, ma alla fine degli anni ‘80 l’idea che i microkernel siano migliori, e che i monolitici debbano essere considerati obsoleti, è molto diffusa. La differenza tra i due modelli è che i kernel monolitici sono di fatto un unico (o quasi) programma, che si occupa di gestire tutte le attività principali del computer. I microkernel sono invece semplicemente dei gestori di memoria, che si occupano di far comunicare tra loro i vari programmi che poi gestiscono davvero le varie risorse (il filesystem, i driver, eccetera). Sulla carta, il problema dei kernel monolitici è che se c’è un intoppo nel programma, anche in una parte apparentemente irrilevante per il funzionamento del computer, è l’intero kernel a bloccarsi e dunque non c’è altra soluzione che riavviare il computer. Invece i microkernel, essendo costituiti da diversi programmi, non dovrebbero mai bloccarsi del tutto: se uno dei programmi ha un intoppo e va in crash, sarà sufficiente riavviare soltanto quel programma, mentre tutti gli altri continueranno a funzionare. Questo in teoria. Tuttavia, i microkernel hanno un difetto notevole che, in quel periodo, quasi nessuno aveva davvero tenuto in considerazione. Nessuno tranne Torvalds. Infatti, essendo costituiti da tanti piccoli programmi, i microkernel sono in realtà molto più difficili da scrivere, è facile che nascano incompatibilità varie tra le componenti del kernel e che si finisca in una sorta di ciclo continuo in cui qualcosa va in crash e si cerca di riattivarla solo per mandarla nuovamente in crash.
Anche la comunicazione tra i vari componenti del kernel è macchinosa, perché il microkernel si comporta come una sorta di server al quale si connettono gli altri programmi in funzione di client, ma la comunicazione può essere difettosa per vari motivi spesso non prevedibili in fase di programmazione. Torvalds pensa ad una soluzione per salvare sia la capra che i cavoli: vuole realizzare un kernel monolitico, ma modulare: i vari aspetti della vita del computer sono gestiti da moduli del kernel, che possono essere caricati o dismessi anche durante l’esecuzione del sistema operativo. Questo permette di ridurre i danni, perché un eventuale modulo difettoso può essere rimosso dal kernel in qualsiasi momento senza che vi siano gravi conseguenze per gli altri componenti, ma è comunque molto più semplice da scrivere, perché nel complesso è comunque una struttura unica. Un paio di anni fa avevamo parlato con lo stesso Torvalds, in una intervista esclusiva, e ci aveva detto: “io penso che i microkernels siano fondamentalmente una idea sbagliata, perché pongono la complessità del progetto nel punto sbagliato (la comunicazione tra diverse entità) e ti limitano troppo dal punto di vista tecnico, mettendo da parte quel tipo di condivisione che è invece standard nei sistemi operativi tradizionali”.
Migliorare Minix, solo per hobby
Nell’agosto del 1991 una prima versione del sistema operativo scritto da Torvalds è in grado di fornire una shell ed il filesystem di Minix, ed è il momento di condividerlo col resto del mondo. Torvalds descrive il proprio progetto su un newsgroup dedicato a Minix: “Sto programmando un sistema operativo (gratuito e solo per hobby, non vuole essere grande e professionale come GNU) per cloni di AT 386(486). È in preparazione da aprile, e sta iniziando a funzionare”. Aggiunge, allo stesso messaggio, la domanda “mi piacerebbe sapere cosa vi piace e non vi piace in Minix” rivolta agli altri partecipanti al gruppo. Linus non ha infatti ancora pensato di costruire un completo sistema operativo a se stante, ma soltanto una versione di Minix migliore di quella ufficiale. Nel giro di un paio di mesi, diversi programmatori sembrano interessati al progetto, in particolare Ari Lemmke offre a Torvalds il proprio spazio su un server FTP per pubblicare il codice, inserendolo in una cartella col nome “linux”, come contrazione di Linus e Unix. Questo gli fornisce uno stimolo a continuare il progetto e all’inizio di ottobre la versione 0.02 di Linux è pronta. Conteneva già una serie di programmi del progetto GNU abbastanza funzionanti: GCC, per esempio, non poteva compilare file molto grandi, ma poteva comunque essere usato per compilare piccoli programmi. A questo punto Torvalds non ha ancora deciso cosa dovrà essere di questo progetto, se portarlo avanti ancora o se lasciare tutto dopo qualche mese di altri esperimenti, ma prende una decisione che si rivelerà fondamentale: per non correre il rischio di fare qualche errore di cui pentirsi in futuro, nel caso volesse utilizzare seriamente Linux, decide di seguire gli standard POSIX. Questi standard non sono facili da reperire: il consorzio vende le specifiche, e Torvalds non si può permettere di comprarle.
Tuttavia, all’interno del progetto GNU trova la libreria glibc, una implementazione delle librerie standard C per il sistema GNU. In quel momento la libreria glibc è ancora in una versione instabile, però è stata progettata seguendo gli standard POSIX, ed è corredata da una buona documentazione: Torvalds decide di utilizzarla come punto di riferimento per il suo kernel. Lavorando praticamente da solo, escluse un paio di patch suggerite da utenti che si erano interessati al progetto tramite l’annuncio in newsgroup, continua ad aggiungere nuove funzionalità al kernel rilasciando nuove versioni del codice sorgente. Esattamente un anno dopo avere acquistato il suo computer, il 5 gennaio del 1992 Torvalds pubblica la versione 0.12. Questo è il momento della svolta: finalmente, il sistema costituito dal kernel Linux ed il set di programmi GNU non deve più rincorrere Minix. Anzi: ora è una valida alternativa allo stesso Minix, e l’interesse degli altri programmatori cresce esponenzialmente. È a questo punto che le gente comincia davvero ad utilizzare il progetto e a diffonderlo. Fino a qualche mese prima, le giornate di Linus trascorrevano tra un riavvio e l’altro, spegnendo e riaccendendo il computer per provare le nuove modifiche che aveva apportato al kernel. Ora la fase in cui procedeva per tentativi ed errori nella speranza di ottenere qualcosa di funzionante si è conclusa, e passa buona parte del proprio tempo a progettare con attenzione le nuove funzioni da aggiungere, per assicurarsi che il codice sia quanto più efficiente possibile senza precludere alcuna altra modifica anche radicale in futuro. È anche a questo punto che Torvalds decide di rilasciare Linux con la licenza GNU GPL: le versioni precedenti erano rilasciate con una licenza che aveva scritto lui stesso e che era molto simile alla GPL, anche se specificava chiaramente che la redistribuzione di Linux avrebbe sempre dovuto essere non solo libera ma anche gratuita, e vista la popolarità del progetto e le continue richieste di chiarimenti sulla licenza ha deciso di adottare direttamente la licenza del progetto GNU perché era scritta meglio e tutti la apprezzavano.
Comunque, probabilmente proprio a causa del fatto di non essere madrelingua inglese, a Torvalds non è mai piaciuto parlare di “free software”. Nell’intervista che ci aveva rilasciato ammetteva, pur continuando ad utilizzare le licenze del progetto GNU e della Free Software Foundation, di non usare nemmeno più il termine “free software” perché, spiegava, “penso che sia un punto di partenza sbagliato”. Sbagliato non soltanto per l’ambiguità lessicale inglese del termine, cui abbiamo già accennato (free significa sia libero che gratuito), ma anche “perchè la parola “free” è talmente piena di carico emotivo (soprattutto negli Stati Uniti, “Land of the Free, rah, rah, USA USA USA!”) che chiunque la fa significare qualsiasi cosa voglia”. Torvalds preferirebbe anche mantenere il dibattito tra software libero e proprietario nell’ambito pratico, ovvero ragionando su quale dei due funzioni meglio alla fine dei conti, tralasciando il discorso sulla morale (cioè sul fatto che sia moralmente sbagliato impedire l’accesso al codice sorgente per gli utenti).
“Io penso che la morale sia qualcosa di privato”, ci diceva “e chiunque la utilizzi per fare una discussione qualunque stia sbagliando. Io posso avere le mie personali ragioni per preferire l’open source, ma sono le mie motivazioni personali, e non hanno nulla a che vedere con i motivi per i quali suggerisco agli altri di adottare l’open source. Quindi io (ed anche altre persone) uso il termine open source software, e non mi disturbo a fare alcun ragionamento moralistico. L’open source tende ad essere semplicemente migliore dal punto vista tecnico, ed è molto più divertente partecipare al processo creativo quando questo è open e tutti possono collaborare”.
Dal terminale alla grafica
Poco dopo la pubblicazione della versione 0.12 di Linux, il sistema fece un enorme passo avanti: il supporto al server grafico X. Nell’entusiasmo dovuto alla possibilità di realizzare applicazioni con interfaccia grafica, Torvalds decise di saltare direttamente al numero di versione 0.95. Il problema è che nonostante il sistema avesse ora molte funzioni utili al grande pubblico, non era affatto stabile. Il risultato è che prima di arrivare alla versione 1.0, cioè quella stabile, era necessario ancora del tempo e nel giro di poco i numeri a disposizione per le versioni finirono: è per questo motivo che, guardando i nomi delle vecchie versioni di Linux, si nota che sono state aggiunte delle lettere. Per esempio, la prima versione con un supporto stabile ad X era chiamata 0.96a. Pur non essendo ancora stabile, è subito chiaro a tutti che Linux è il kernel più adatto per il progetto GNU, e viene adottato dalla maggioranza dei programmatori. Grazie alle patch ed ai suggerimenti degli appassionati, Torvalds riesce a correggere i principali bug ed a realizzare una versione del sistema operativo GNU/Linux sufficientemente stabile nel 1994, pubblicando Linux 1.0. Da quel momento, sempre più persone hanno contribuito allo sviluppo del sistema, e diverse aziende hanno deciso di basare le loro attività sul binomio GNU/Linux e sono nati centinaia di progetti che sfruttano la portabilità del sistema in tutti gli ambiti in cui oggi possiamo immaginare un computer: da desktop e server ai telefonini e gli elettrodomestici. Nel frattempo, Linus Torvalds si è laureato con una tesi intitolata “Linux: a portable operating system” ed ora coordina lo sviluppo del suo kernel. Richard Stallman continua a lavorare su EMACS e segue gli sviluppi del progetto GNU, passando comunque la maggioranza del tempo viaggiando in tutto il mondo per spiegare a tutti l’importanza di vivere in una società libera. Il laboratorio di intelligenza artificiale dell’MIT è stato spostato in un altro edificio, e non hanno più il DEC-20. In compenso, hanno ancora, come tutti noi, delle stampanti che ogni tanto si inceppano.