Prima di iniziare il nostro viaggio, è fondamentale chiarire sin da subito che Linux è “solo” il Kernel del sistema operativo, mentre il nome corretto di quello che comunemente chiamiamo “Linux” è invece GNU/Linux.
La storia inizia nel 1991 in Finlandia, dove il giovane studente universitario Linus Torvalds, insoddisfatto di MINIX, il sistema operativo sviluppato da Andrew Tanenbaum per insegnare UNIX al corso di Sistemi di Rete all’università di Amsterdam, decide di realizzare una propria soluzione che gli consenta di esplorare tutte le potenzialità offerte dall’hardware a sua disposizione.
Linus Torvalds nei primi anni ‘90
MINIX ha un supporto decisamente carente alla nuova architettura i386 a 32 bit, soprattutto per quel che riguarda le periferiche di input-output, ed ha inoltre una politica di licensing particolarmente limitativa che ne impedisce le modifiche.
Così Torvalds si mette al lavoro per realizzare un emulatore di terminale (scritto in C e Assembly) eseguibile senza alcun sistema operativo e finalizzato, principalmente, a due operazioni: mandare e ricevere segnali alla/dalla porta seriale attraverso due processi separati (thread, per la precisione).
Per farsi supportare nello sviluppo, Torvalds rende pubblico il progetto proprio sul newsgroup dedicato a MINIX, comp.os.minix, scrivendo il famoso messaggio del 25 agosto 1991 che segna ufficialmente la nascita di Linux:
La mail che annuncia la nascita di Linux
La prima versione (v. 0.01) viene resa disponibile il 17 settembre 1991, insieme alla shell GNU Bash che consente di impartire i pochi comandi a disposizione. Il tutto è sviluppato su MINIX e compilabile grazie al compilatore GNU C. MINIX è quindi ancora indispensabile per configurare, compilare, installare e avviare Linux anche a causa dell’utilizzo diretto del relativo file system.
Il giovane Torvalds si appassiona al progetto e presto sviluppa un primo embrione di file system (per compatibilità similare a quello di MINIX) consentendo di spezzare le ultime dipendenze da MINIX (v. 0.11) e avviare la trasformazione del “terminale” in un vero e proprio Kernel basato su specifiche POSIX. Bisognerà comunque aspettare ancora quasi un anno finché Rémy Card progetti l’Extended File Sytem (ext), il primo specificamente pensato per Linux ed esente dai vincoli di compatibilità con MINIX.
Con i differenti rilasci arriva anche il nome ufficiale “Linux” (LINus UniX). La scelta è da attribuire ad Ari Lemke, assistente alla Helsinki University of Technology, che lo utilizza come nome della directory messa a disposizione per il progetto (su ftp.funet.fi). Il nome originariamente scelto da Torvalds era invece Freax, una combinazione tra “free”, “freak” e “x”, ad indicare le caratteristiche Unix-like del sistema.
Il progetto riscuote un interesse crescente e Linus decide di associargli la licenza GPL (GNU General Public License), trasformandolo nella soluzione “libera ed aperta” che tutti conosciamo. Probabilmente nessuno all’epoca poteva prevedere che questa caratteristica sarebbe diventata la premessa per il grande successo negli anni a venire.
A febbraio del 1992, l’hacker Orest Zborowski riesce a far girare il server X (Window) sulla versione 0.12, implementando una patch che introduce l’indispensabile struttura degli Unix Domain Socket: viene così a strutturarsi il primo livello di socket, alla base di quella che diventerà l’infrastruttura di supporto alle reti di Linux. Ad onore del vero, questa prima implementazione è poco efficiente e mal integrata nel resto del sistema, ma Linus valida la patch e promuove Linux dalla versione 0.13 alla 0.95 rendendo ufficiale il supporto sia ad X che alle Reti.
La scelta di Torvalds è decisamente affrettata, probabilmente spinta dall’euforia di rendere Linux il cuore di un “vero” sistema operativo, sottovalutando tutti i problemi di sicurezza che il supporto e l’apertura alle Reti avrebbe comportato. Il progetto paga cara questa superficialità, e, per rimediare a tutti i problemi annessi, occorrono addirittura due anni, costringendo persino ad utilizzare una numerazione modificata per indicare il livello di patch: viene sfruttato un ulteriore livello numerico unitamente alle lettere dell’alfabeto (es: v. 0.99.15Z, v.0.99/15° livello di patch/revisione Z).