Una breve storia di Linux
Il termine Linux è comunemente usato per indicare l'intero sistema operativo simile a UNIX, di cui il kernel Linux è solo una parte. Tuttavia, si tratta di un po' di un'errata denominazione, poiché molti dei componenti chiave presenti in una tipica distribuzione Linux commerciale provengono da un progetto che precede l'avvio di Linux di diversi anni.
Il progetto GNU
Nel 1984, Richard Stallman, un programmatore eccezionalmente talentuoso che lavorava al MIT, iniziò a creare un'implementazione "free" di UNIX.
La visione di Stallman era di natura morale, e free era definito in senso legale, piuttosto che finanziario (vedi http://www.gnu.org/philosophy/free-sw.html).
Tuttavia, la libertà legale descritta da Stallman comportava implicitamente che software come i sistemi operativi fossero disponibili a costo zero o molto basso.
Stallman si oppose alle restrizioni legali imposte sui sistemi operativi proprietari dai produttori di computer. Tali restrizioni impedivano ai compratori di software di vedere il codice sorgente del programma acquistato, e certamente non potevano copiarlo, modificarlo o ridistribuirlo.
Egli sottolineò che questo quadro incoraggiava i programmatori a competere tra loro e a trattenere il proprio lavoro, anziché a collaborare e condividerlo.
In risposta, Stallman avviò il progetto GNU (un acronimo ricorsivo per "GNU's not UNIX") per sviluppare un intero sistema UNIX‑like, interamente disponibile gratuitamente, composto da un kernel e da tutti i pacchetti software associati, invitando altri a unirsi a lui.
Nel 1985 Stallman fondò la Free Software Foundation (FSF), un'organizzazione no‑profit per supportare il progetto GNU e lo sviluppo del software libero in generale.
Quando il progetto GNU fu avviato, BSD non era libero nel senso inteso da Stallman. L'uso di BSD richiedeva ancora una licenza da AT&T, e gli utenti non potevano modificare liberamente né ridistribuire il codice AT&T che faceva parte di BSD.
Uno dei risultati più importanti del progetto GNU fu lo sviluppo della GNU General Public License (GPL), l'incarnazione legale della nozione di software libero di Stallman.
Gran parte del software presente in una distribuzione Linux, incluso il kernel, è rilasciato sotto la GPL o licenze simili. Il software con licenza GPL deve essere distribuito in forma di codice sorgente e deve poter essere ridistribuito liberamente secondo i termini della GPL.
Le modifiche al software GPL‑licensed sono permesse, ma qualsiasi distribuzione di tale software modificato deve avvenire anch'essa sotto i termini della GPL. Se il software modificato viene distribuito in forma binaria, l'autore deve offrire ai destinatari la possibilità di ottenere il sorgente modificato a un costo non superiore a quello della distribuzione.
La prima versione della GPL fu rilasciata nel 1989; la versione corrente, la 3, è stata pubblicata nel 2007. La versione 2, rilasciata nel 1991, è ancora ampiamente usata ed è la licenza del kernel Linux.
Il progetto GNU non produsse inizialmente un kernel UNIX funzionante, ma realizzò una vasta gamma di altri programmi. Poiché questi programmi erano progettati per girare su un sistema operativo simile a UNIX, potevano essere usati su implementazioni UNIX esistenti e, in alcuni casi, persino portati su altri sistemi operativi.
Tra i programmi più noti prodotti dal progetto GNU vi sono l'editor di testo Emacs, GCC (originariamente il GNU C Compiler, ora rinominato GNU Compiler Collection, che comprende compilatori per C, C++ e altri linguaggi), la shell bash e glibc (la GNU C Library).
All'inizio degli anni '90, il progetto GNU aveva prodotto un sistema praticamente completo, eccetto un componente fondamentale: un kernel UNIX funzionante.
Il progetto GNU aveva avviato lo sviluppo di un kernel ambizioso, noto come GNU/HURD, basato sul microkernel Mach. Tuttavia, l'HURD era ancora lontano da una forma rilasciabile.
Poiché una parte significativa del codice che costituisce quello che comunemente si chiama sistema Linux deriva dal progetto GNU, Stallman preferisce usare il termine GNU/Linux per riferirsi all'intero sistema. La questione della denominazione (Linux vs GNU/Linux) è oggetto di dibattito nella comunità del software libero. Poiché questo libro si concentra principalmente sull'API del kernel Linux, useremo generalmente il termine Linux.
Il palcoscenico era pronto. Restava solo trovare un kernel funzionante da abbinare al sistema UNIX quasi completo già prodotto dal progetto GNU.
Le origini di Linux
Nel 1991 Linus Torvalds, studente finlandese all'Università di Helsinki, fu ispirato a scrivere un sistema operativo per il suo PC Intel 80386.
Durante gli studi, Torvalds entrò in contatto con Minix, un piccolo kernel UNIX‑like sviluppato a metà degli anni '80 da Andrew Tanenbaum, professore universitario olandese. Tanenbaum rese Minix, completo di codice sorgente, uno strumento per insegnare la progettazione dei sistemi operativi nei corsi universitari.
Il kernel Minix poteva essere compilato ed eseguito su un sistema 386, ma, poiché il suo scopo principale era didattico, era progettato per essere in gran parte indipendente dall'architettura hardware e non sfruttava appieno le capacità del processore 386. Torvalds quindi avviò un progetto per creare un kernel UNIX efficiente e completo da far girare sul 386.
In pochi mesi, Torvalds sviluppò un kernel di base che gli permise di compilare ed eseguire vari programmi GNU. Il 5 ottobre 1991 chiese l'aiuto di altri programmatori, pubblicando il seguente annuncio, ormai molto citato, della versione 0.02 del suo kernel nel newsgroup Usenet comp.os.minix:
Ti mancano i bei tempi di Minix‑1.1, quando gli uomini erano uomini e scrivevano i propri driver di dispositivo? Non hai un progetto interessante e vuoi solo metterti alla prova con un OS che puoi modificare a tuo piacimento? Ti frustra il fatto che tutto funzioni su Minix? Niente più notti in bianco per far funzionare un programma? Allora questo post potrebbe fare al caso tuo. Come ho detto un mese fa, sto lavorando a una versione libera di un clone di Minix per computer AT‑386. È finalmente arrivato al punto di essere utilizzabile (anche se dipende da cosa ti serve), e sono disposto a distribuire il codice sorgente. È solo la versione 0.02... ma sono riuscito a far girare bash, gcc, gnu‑make, gnu‑sed, compress, ecc. sotto di esso.
Seguendo la tradizione di dare ai clone UNIX nomi che terminano con la lettera X, il kernel fu (alla fine) battezzato Linux.
Inizialmente Linux fu rilasciato sotto una licenza più restrittiva, ma Torvalds lo rese presto disponibile sotto la GNU GPL. La chiamata a raccolta di supporto fu efficace. Altri programmatori si unirono a Torvalds nello sviluppo di Linux, aggiungendo varie funzionalità, come un file system migliorato, il supporto di rete, driver di dispositivo e il supporto multiprocessore.
A marzo 1994 gli sviluppatori poterono rilasciare la versione 1.0. Linux 1.2 apparve a marzo 1995, Linux 2.0 a giugno 1996, Linux 2.2 a gennaio 1999 e Linux 2.4 a gennaio 2001.
Lo sviluppo del kernel 2.5 iniziò a novembre 2001 e portò al rilascio di Linux 2.6 a dicembre 2003.
BSD
Vale la pena notare che un altro UNIX libero era già disponibile per l'architettura x86‑32 nei primi anni '90.
Bill e Lynne Jolitz avevano sviluppato un port del già maturo sistema BSD per x86‑32, noto come 386/BSD.
Questo port era basato sulla release BSD Net/2 (giugno 1991), una versione del codice sorgente 4.3BSD in cui tutto il codice proprietario AT&T residuo era stato sostituito o, nei sei file che non potevano essere riscritti facilmente, rimosso. I Jolitz portarono il codice Net/2 su x86‑32, riscrissero i file mancanti e pubblicarono la prima release (versione 0.0) di 386/BSD nel febbraio 1992.
Dopo un primo periodo di successo e popolarità, lo sviluppo di 386/BSD rallentò per vari motivi. Di fronte a un crescente arretrato di patch, comparvero due gruppi di sviluppo alternativi, creando le proprie release basate su 386/BSD: NetBSD, che enfatizza la portabilità su un'ampia gamma di piattaforme hardware, e FreeBSD, che punta alle prestazioni ed è il più diffuso tra i BSD moderni.
La prima release di NetBSD fu la 0.8, nell'aprile 1993. Il primo CD‑ROM di FreeBSD (versione 1.0) apparve a dicembre 1993.
Un altro BSD, OpenBSD, comparve nel 1996 (versione iniziale 2.0) dopo una fork dal progetto NetBSD; OpenBSD enfatizza la sicurezza.
A metà 2003 nacque DragonFly BSD, scaturito da una divisione di FreeBSD 4.x; DragonFly BSD adotta un approccio diverso rispetto a FreeBSD 5.x per la progettazione di architetture SMP.
Probabilmente nessuna discussione sui BSD dei primi anni '90 è completa senza menzionare le cause legali tra UNIX System Laboratories (USL, la filiale AT&T che sviluppava e commercializzava UNIX) e Berkeley. All'inizio del 1992 la società Berkeley Software Design, Incorporated (BSDi, oggi parte di Wind River) iniziò a distribuire un BSD UNIX commercialmente supportato, BSD/OS, basato sulla release Net/2 e sulle aggiunte di 386/BSD dei Jolitz.
BSDi distribuiva binari e sorgenti a 995$ (dollari USA) e consigliava ai potenziali clienti di chiamare il numero 1‑800‑ITS‑UNIX. Nel aprile 1992 USL intentò una causa contro BSDi per impedire la vendita di un prodotto che USL sosteneva fosse ancora gravato da codice proprietario USL e segreti commerciali. USL chiese anche a BSDi di cessare l'uso del numero di telefono ingannevole. La causa fu poi estesa includendo una rivendicazione contro l'Università della California.
Il tribunale respinse tutti i reclami di USL tranne due; ne seguì una contro-causa dell'Università della California contro USL, nella quale l'università affermò che USL non aveva dato il giusto credito all'uso del codice BSD in System V.
Mentre le cause erano pendenti, USL fu acquisita da Novell, il cui CEO, il defunto Ray Noorda, dichiarò pubblicamente di preferire la competizione sul mercato a quella in tribunale.
Il patto fu raggiunto a gennaio 1994: l'Università della California dovette rimuovere 3 dei 18000 file della release Net/2, apportare alcune modifiche minori a pochi altri file e aggiungere avvisi di copyright USL a circa 70 file, ma poté continuare a distribuirlo liberamente.
Questo sistema modificato fu rilasciato come 4.4BSD‑Lite nel giugno 1994 (l'ultima release dell'università fu 4.4BSD‑Lite, Release 2, giugno 1995).
A quel punto, il patto legale richiese a BSDi, FreeBSD e NetBSD di sostituire la base Net/2 con il codice sorgente modificato di 4.4BSD‑Lite.
Come osserva Marshall Kirk McKusick, sebbene ciò abbia causato qualche ritardo nello sviluppo dei derivati BSD, ha avuto l'effetto positivo di riallineare questi sistemi con i tre anni di lavoro svolto dal Computer Systems Research Group dell'università dalla release di Net/2.
Le versioni del Kernel di Linux
Come la maggior parte dei progetti di software libero, Linux segue un modello "release‑early, release‑often", così le nuove revisioni del kernel compaiono frequentemente (a volte anche quotidianamente).
Con l'aumento della base utenti, il modello di rilascio è stato adattato per ridurre le interruzioni per gli utenti esistenti. In particolare, dopo il rilascio di Linux 1.0, gli sviluppatori adottarono uno schema di numerazione x.y.z:
xindica la versione principale;yuna versione secondaria all'interno della principale;zuna revisione della versione secondaria (miglioramenti minori e correzioni di bug).
Con questo modello, due versioni del kernel erano sempre in sviluppo:
- un ramo stabile per i sistemi di produzione, con numero secondario pari;
- un ramo di sviluppo più volatile, con il successivo numero secondario dispari.
La teoria – non sempre seguita rigorosamente – era che tutte le nuove funzionalità fossero aggiunte nella serie di sviluppo corrente, mentre le revisioni della serie stabile fossero limitate a miglioramenti minori e correzioni di bug.
Quando il ramo di sviluppo veniva ritenuto pronto per il rilascio, diventava il nuovo ramo stabile e riceveva un numero secondario pari. Per esempio, il ramo di sviluppo 2.3.z portò al ramo stabile 2.4.
Dopo il rilascio del kernel 2.6, il modello di sviluppo fu cambiato.
La motivazione principale fu rappresentata dai problemi e dalle frustrazioni causate dagli lunghi intervalli tra i rilasci stabili (quasi tre anni tra Linux 2.4.0 e 2.6.0).
Si è discusso periodicamente di affinare questo modello, ma i dettagli essenziali sono rimasti:
- Non esiste più una separazione tra kernel stabile e di sviluppo. Ogni nuovo rilascio 2.6.z può contenere nuove funzionalità e attraversa un ciclo di vita che inizia con l'aggiunta di tali funzionalità, che vengono poi stabilizzate attraverso diverse versioni candidate. Quando una versione candidata è considerata sufficientemente stabile, viene rilasciata come kernel 2.6.z. I cicli di rilascio durano tipicamente circa tre mesi.
- Talvolta una versione stabile 2.6.z richiede patch minori per correggere bug o problemi di sicurezza. Se queste correzioni hanno priorità elevata e le patch sono ritenute semplici e “ovviamente” corrette, invece di attendere il prossimo 2.6.z, vengono applicate creando un rilascio del tipo 2.6.z.r, dove r è un numero sequenziale per la revisione minore di quel kernel 2.6.z.
- Una maggiore responsabilità è trasferita ai distributori per garantire la stabilità del kernel fornito con la loro distribuzione. Nei capitoli successivi a volte verrà indicata la versione del kernel in cui è avvenuto un cambiamento API (ad esempio una nuova o modificata system call).
Sebbene, prima della serie 2.6.z, la maggior parte dei cambiamenti avvenisse nei rami di sviluppo dispari, faremo riferimento alla versione stabile in cui il cambiamento è apparso, poiché la maggior parte degli sviluppatori di applicazioni utilizza tipicamente un kernel stabile. In molti casi le pagine di manuale indicano la versione di sviluppo precisa in cui una determinata funzionalità è comparsa o cambiata.
Per i cambiamenti introdotti nella serie 2.6.z, indichiamo la versione precisa del kernel. Quando diciamo che una funzionalità è nuova nel kernel 2.6, senza indicare il numero z, intendiamo una funzionalità implementata nella serie di sviluppo 2.5 e apparsa per la prima volta nel kernel stabile 2.6.0.
Al momento della stesura, il kernel Linux 2.4 stabile è ancora supportato da manutentori che incorporano patch essenziali e correzioni di bug, rilasciando periodicamente nuove revisioni. Questo permette ai sistemi installati di continuare a usare kernel 2.4, senza essere costretti ad aggiornare a una nuova serie di kernel, operazione che in alcuni casi richiederebbe lavori significativi.
Port su altre architetture
Durante lo sviluppo iniziale di Linux, l'obiettivo principale era un'implementazione efficiente sull'Intel 80386, piuttosto che la portabilità verso altre architetture.
Con la crescente popolarità di Linux, però, cominciarono ad apparire port per altre architetture, a partire da un primo port al chip Digital Alpha.
L'elenco delle architetture hardware su cui Linux è stato portato continua a crescere e comprende x86‑64, Motorola/IBM PowerPC e PowerPC64, Sun SPARC e SPARC64 (UltraSPARC), MIPS, ARM (Acorn), IBM zSeries (ex System/390), Intel IA‑64 (Itanium), Hitachi SuperH, HP PA‑RISC e Motorola 68000.
Distribuzioni Linux (Distro)
Precisamente parlando, il termine Linux indica solo il kernel sviluppato da Linus Torvalds e collaboratori.
Tuttavia, il termine è comunemente usato per indicare il kernel più un ampio insieme di software (strumenti e librerie) che insieme costituiscono un sistema operativo completo.
Nei primissimi giorni di Linux l'utente doveva assemblare tutti questi componenti, creare un file system e posizionare e configurare correttamente tutto il software.
Ciò richiedeva tempo e competenze notevoli. Di conseguenza nacque un mercato per i distributori di Linux, che crearono pacchetti (distribuzioni) per automatizzare la maggior parte del processo di installazione, creando un file system e installando il kernel e gli altri software necessari.
Le prime distribuzioni apparvero nel 1992 e includevano MCC Interim Linux (Manchester Computing Centre, UK), TAMU (Texas A&M University) e SLS (SoftLanding Linux System).
La più antica distribuzione commerciale ancora esistente, Slackware, comparve nel 1993.
La distribuzione non commerciale Debian apparve più o meno nello stesso periodo, seguita da SUSE e Red Hat.
L'attuale distribuzione molto popolare Ubuntu fece la sua comparsa nel 2004.
Oggi molte aziende distributrici impiegano programmatori che contribuiscono attivamente a progetti di software libero esistenti o avviano nuovi progetti.
In Sintesi
Linux nacque nel 1991 come progetto personale di Linus Torvalds, ispirato da Minix, e rapidamente divenne un kernel completo grazie al contributo della comunità. Parallelamente, i BSD si evolsero attraverso vari fork, affrontando anche dispute legali con AT&T. Il modello di numerazione delle versioni del kernel Linux è cambiato nel tempo, passando da rami stabili e di sviluppo a un ciclo di rilascio più continuo. Infine, Linux è stato portato su numerose architetture hardware e ha dato origine a una vasta gamma di distribuzioni che semplificano l'installazione di un sistema operativo completo.