(Puoi scaricare tutti i lucidi di questa pagina in postscript qui e in formato PDF qui)
In questa chiacchierata viene presentato il sistema operativo Unix in quanto il sistema operativo GNU/Linux è progettato secondo il modello di Unix.
Download lucido1.ps
Innanzitutto, cos'è Unix? Unix è un progetto nato nel 1969, che nasce dall'esperienza che alcuni programmatori si erano fatti sul sistema Multics. Multics ("Multiprogrammed Computer System") era un sistema che doveva essere "tutto per tutti", e si è rivelato un fallimento; conteneva però al suo interno alcune buone idee che sono state riutilizzate in seguito nel sistema Unics (Uniprogrammed Computer System). Tale sistema, in seguito ribattezzato Unix, è stato scritto per gioco da tre programmatori di AT&T che volevano utilizzare un vecchio calcolatore abbandonato in un angolo, una macchina con 16 kilobyte di memoria. Le stesse persone hanno scritto anche il linguaggio C, uno dei linguaggi oggi più usati. Il linguaggio C è stato inventato apposta per scrivere Unix: il sistema Unix è scritto in C e anche il compilatore C è scritto in C (come d'altronde il compilatore Java è scrtto in Java: questo tipo di cose che si appoggiano su se stesse piacciono molto agli informatici). A causa delle sue lontane origini, Unix viene a volte definito come tecnologia arcaica, come se le cose vecchie fossero per forza sbagliate. Personalmente mi fido di più di strumenti che si sono affinati e perfezionati nel tempo piuttosto che strumenti scritti da zero che non hanno avuto una verifica sperimentale di affidabilità. Val la pena di ricordare che anche le auto più moderne si basano sul motore a scoppio, una tecnologia di cento anni fa.
Download:lucido2.ps
Il sistema Unix è nato per essere semplice. Questo in parte è una conseguenza della sua origine ludica: un sistema che deve funzionare su un vecchio elaboratore e che sia divertente da scrivere e usare deve per forza essere semplice. Ma la sua semplicità dipende anche dal fatto che le idee migliori sono sempre quelle più semplici. La "semplicità" di Unix sta principalmente nella sua elevata modularità: il sistema operativo contiene centinaia di piccoli mattoncini che svolgono operazioni elementari sui dati e tali mattoncini possono essere composti a discrezione dell'utente per svolgere i compiti più disparati. Questa modularità di base del progetto di Unix permette una flessibilità estrema nell'utilizzo del sistema. Alla base della modularità di Unix sta il concetto di file: un file è un canale di comunicazione dati, praticamente un "tubo" attraverso cui scorrono i dati. Il caso più noto, quello del file su disco, è solo un caso particolare di un concetto più astratto: il file su disco può essere usato come sorgente o destinazione del flusso di dati, ma il programma vede comunque quasi sempre i dati come un flusso. Nei sistemi Unix quasi ogni risorsa viene messa a disposizione come un file: la tastiera è un file di ingresso, la stampante è un file di uscita, un dischetto è come un file su disco, con l'unica particolarità che la sua lunghezza è costante (1.44MB, per esempio). Quando viene eseguito un programma, il sistema gli predispone il collegamento con tre file, chiamati "stdin", "stdout", "stderr". Durante l'esecuzione il programma legge i dati di ingresso da "stdin", scrive i risultati su "stdout" e manda eventuali errori su "stderr", senza bisogno di sapere a cosa corrispondono "fisicamente" i tre file che vengono visto come "tubi" dove scorrono i dati. Di solito, quando un utente digita i comandi al terminale, tutti i tre "tubi" sono collegati al terminate (tastiera e video). É possibile però concatenare l'elaborazione di più programmi, in modo che i dati prodotti da uno siano visti come dati di ingresso dal programma successivo. Questa situazione di solito viene chiamata "pipe", cioè "tubo", e gli errori di tutti i programmi della catena di solito rimangono diretti verso il terminale. É possibile anche collegare ingressi e uscite dei programmi verso una connessione di rete, senza che i programmi stessi se ne accorgano.
Download:lucido3.ps
Naturalmente ai canali di comunicazione, ai "file", si possono anche collegare dei file su disco. La struttura dati che ospita i "file" convenzionali si chiama filesystem, e in ambiente Unix il filesystem ospita anche oggetti che non corrispondono ai file cosiddetti "regolari", quelli che contengono dati. Il filesystem ospita anche i punti di accesso alle periferiche, alle connessioni di rete e a strutture di comunicazione di tipo "FIFO", in pratica una "pipe" simile a quella descritta precedentemente. L'utilizzo tutte queste risorse è uniforme, in quanto le applicazioni (o gli utenti) possono accedere a qualunque entità ospitata nel filesystem con gli stessi meccanismi: le funzioni open(), read(), write(), close().
Download:lucido4.ps
Poiché i programmi hanno a disposizione molteplici modalità di comnunicazione con il mondo esterno e con altri programmi, i singoli programmi messi a disposizione dal sistema sono solitamente molto semplici e predisposti per l'utilizzo di standard-input e standard-output. Questo permette all'utente di avere la più ampia libertà nell'utilizzo di questi programmi, componendoli secondo le sue esigenze. Nonostante sia effettivamente più facile usare il mouse per agire su menu predefiniti per scegliere tra opzioni predisposte dagli autori dell'applicazione, quello che occorre per esprimere nuove idee e risolvere nuovi problemi è una sintassi. Nel caso di Unix troviamo la sintassi della linea di comando, ormai sconosciuta alla maggior parte degli utenti di calcolatore. La disponibilità della linea di comando offre una potenzialità enorme all'utente, senza per questo pregiudicare l'utilizzo di ambienti grafici e interfaccie a menu. In figura ho riportato un esempio di linea di comando: sort data | a2ps | bold | rsh prozio "cat > /dev/lp0" Questo comando dice: metti in ordine il contenuto del file "data" e manda il risultato al comando "a2ps" (ascii to postcript: converte il testo puro in linguaggio postscript, un linguaggio di definizione della pagina usato dalle stampanti di qualità e altri sistemi). Il risultato di questa conversione viene mandato al programma "bold", un programma di due righe che ho scritto per utilizzare i caratteri courier-bold invece che courier. L'uscita del coamndo "bold" spediscila attraverso la rete al calcolatore chiamato "prozio" e lì indirizzalo verso la stampante. Un altro programma che ho scritto utilizza la linea di comando per cercare il numero di telefono di una persona dalla mia rubrica personale e stamparlo sulla scheda audio, così basta appoggiare la cornetta del telefono sull'altoparlante per fare il numero. Nonostante la sintassi di una linea di comando richieda una fase di apprendimento da parte dell'utente, nessuno strumento grafico permette questa flessibilità. Unix, in questo senso, è una "cultura di condivisione", perché ogni piccolo pezzetto della struttura del sistema è progettato per la massima integrazione con il resto del sistema e, tramite la rete, con il resto del mondo.
Download:lucido5.ps
Proprio su un modello di questo tipo, incentrato sulla modularità e sulla facilità di condivisione dei dati, è stata progettata la rete Internet. La rete è stata "scritta" su macchine Unix adottando un modello di comunicazione client-server: in una comunicazione via rete una delle due macchine svolge il ruolo di chi offre un servizio mentre l'altra macchina opera da cliente. Dicevo che Internel è stata scritta perché in pratica la rete è definita da un insieme di protocolli di comunicazione. Questi protocolli sono liberamente accessibili a chiunque, per cui chiunque può creare una nuova implementazione di un servizio, che risulterà compatibile con le altre implementazioni. I progettisti della rete hanno sempre avuto la massima cura nella differenziazione dei ruoli tra protocollo e implementazione, che ha un parallelo nella separazione tra meccanismi offerti e politiche d'uso associate a questi meccanismi: in genere in ambiene Unix e in ambiente Internet i protocolli di comunicazione non fanno alcuna assunzione su quale sia il loro utilizzo. Per questo si può spedire posta elettronica da una vasta gamma di programmi, grafici e testuali, come pure da sistemi completamente automatici, come quelli di gestione delle liste di posta: la politica d'uso rimane scorrelata dal meccanismo di spedizione dei messaggi.
Download:lucido6.ps
I protocolli che definiscono Internet sono ratificati dall'IETF (Internet Engineering Task Force), un organismo internazionale composto da ricercatori. I documenti dell'IETF si chiamano RFC (Request For Comments) e definiscono ogni singolo aspetto dei meccanismi di comunicazione (ma non le politiche associate). La comunicazione tra calcolatori viene gestita, tramite questi protocolli, attraverso diversi livelli logici. Siccome i meccanismi di consegna dei dati operano solo ai livelli più bassi, è possibile estendere le funzionalità della rete senza modificare i macchinari (i "router") che si occupano della consegna dei dati tra i calcolatori remoti.
Download:lucido7.ps
É interessante notare come le tecnologie di rete non richiedono grosse potenze di calcolo, proprio perché tutto è nato per la massima semplicità e modularità, unito al fatto che la rete è nata negli anni 70-80, quando la potenza di calcolo a disposizione era molto minore di quella attuale. Scrivere un programma server non è affatto una cosa complicata: come si diceva un server è semplicemente un programma che legge da standard-input e scrive su standard-output, spesso senza nemmeno sapere che è collegato ad una rete. In figura sono rappresentati un semplice server "ad uso scolastico" e altri due programmi, un server e un client per la trasmissione dei log di sistema attraverso la rete (a differenza del primo, questi due sono programmi che uso realmente per l'amministrazione della mia rete). Anche la "tecnologia web", spesso spacciata come "tecnologia del terzo millennio" è di una semplicità estrema: in una delle mie attività, per esempio, ho realizzato un server web che gira su un 386-SX con 2MB di memoria e 2 di disco, una macchina che già da alcuni anni è considerata obsoleta. Un altro esempio interessante è lrp.org (Linux Router Project), software per utilizzare vecchi elaboratori di scarto come router, i macchinari che collegano le varie tratte della rete Internet.
Download:lucido8.ps
Ovviamente anche Unix è dotato di un ambiente di lavoro grafico (chiamato X-Windows o semplicemente X) nonostante la maggior parte dei programmatori Unix prediligano la linea di comando per i motivi esposti prima. Come nel caso della rete Internet, l'ambiente grafico Unix è estremamente modulare e flessibile, oltre ad essere perfettamente integrato con la rete stessa. Tutto il sistema grafico è, per definizione, trasparente rispetto alla rete e neutrale rispetto alla architettura di sistema. "Trasparente rispetto alla rete" vuol dire che le applicazioni possono girare su una macchina e usare il display di un'altra macchina; "neutrale rispestto all'archiettura" vuol dire che tutto il sistema non dipende in alcun modo dal tipo di calcolatore e di processore che si sta usando. Persiò, se per avere un ambiente grafico Windows devo comprare un PC e per avere un ambiente grafico Mac devo comprare un Mac, X funziona su una varietà incredibile di macchine diverse. Per esempio per disegnare i lucidi delle mie applicazioni uso un programma che gira su processori Sparc ma lo faccio visualizzare sul monitor del mio PC o del portatile.
Download:lucido9.ps
Unix, Internet, X, sono cose che sono state scritte negli anni '80 da programmatori entusiasti del loro lavoro; tutti avevano libero accesso al codice sorgente (il programma nella forma in cui è stato scritto dal programmatore e quindi nella forma in cui può essere modificato e migliorato) e ciò permetteva un continuo arricchimento del patrimonio informatico. Con gli anni però le cose sono cambiate e molte aziende hanno iniziato a realizzare versioni proprietarie dei programmi, di cui non è accessibile il codice sorgente. Il mondo Unix quindi si è ramificato in decine di versioni del sistema, tutte in qualche modo simili ma tutte in qualche modo diverse. C'è quindi un sistema distribuito da Sun che è leggermente incompatibile con quello distribuito da IBM, entrambi sono leggermente incompatibili con il sistema HP, eccetera. Ma come è potuto succedere che un sistema si ramificasse in tanti sistemi diversi? Il motivo principale è a causa della licenza d'uso adottata per il codice di Unix. Unix è stato sviluppato in parte da AT&T (quindi sotto licenza proprietaria) e in parte dalle università americane, in particolare Berkeley (quindi sotto licenza libera); la ramificazione è potuta avvenire perché AT&T dopo aver fatto circolare liberamente il codice ha venduto i diritti a varie aziende, ma anche le parti "libere" permettevano di venire incorporate in prodotti non-liberi. La licenza d'uso dei programmi delle università permette di prendere senza restituire; è permesso cioè derivare un nuovo programma proprietario da un programma libero. Perciò, anche se gli Unix sono tutti simili, ci sono delle forti incompatibilità interne perché ogni azienda ha sviluppato il sistema in una direzione diversa dalle altre e quello che è stato aggiunto non è stato restituito alla comunità di programmatori. Il risultato è un gran guazzabuglio di versioni diverse dello stesso sistema che in pratica ha danneggiato la diffusione del sistema stesso.
Download:lucido10.ps
Nel 1983, Richard Stallman, amante del software libero e disgustato dalla proliferazione di sistemi operativi proprietari, ha lanciato il progetto GNU ("GNU's Not Unix: GNU non è Unix). I fini del progetto GNU sono la realizzazione di un sistema operativo completo che sia anche libero. Un programma è libero quando tutti possono avere accesso al codice sorgente, modificarlo, anche rivenderlo. GNU è simile a Unix a causa dell'elevata modularità di Unix, che permette di sostituire le parti proprietarie del sistema una per volta. GNU non è Unix perché è un sistema libero e perché risponde a standard qualitativi più elevati. Nel lucido sono riportate le parole di Stallman stesso che riporta come è nato il progetto GNU.
Download:lucido11.ps
E finalmente arriviamo a Linux. Linux è un progetto del '91, sviluppato da Linus Torvalds dopo aver lavorato su Minix. Minix è uno dei tanti Unix disponibili sul mercato, scritto da un professore universitario come strumento didattico: il codice sorgente completo del nucleo di Minix è disponibile per essere studiato e capito. Ma non è permesso modificarlo e ridistribuirlo. Linus aveva apportato dei miglioramenti alla sua versione di Minix, ma non era autorizzato a distribuirle. Per questo motivo decise di fare il suo kernel Minix, che doveva essere migliore di Minix e completamente libero per tutti gli utenti. Nel lucido ho riportato un brano scritto da Linus nell'ambito di uno scambio epistolare con Tanenbaum (scambio avvenuto in rete e disponibile in rete). É interessante notare come Linus stesso sottolinei che Linux, il kernel, è una minima parte del sistema completo; un sistema operativo infatti contiene anche molte applicazioni, il compilatore, il debugger, l'editor di testi, l'ambiente grafico. Quasi tutte queste componenti erano già disponibili come software libero, in gran parte grazie al lavoro del progetto GNU, quello che mancava era solo il kernel. Nonstante Linus abbia iniziato da solo, ha presto trovato molti altri programmatori che lo hanno aiutato in questa grannde avventura che in pochi anni ha portato al Linux che conosciamo oggi.
Download:lucido12.ps
Il termine "Linux" quindi si riferisce propriamente solo al nucleo del sistema, il kernel. Il nucleo è quello che si occupa della gestione del calcolatore: processore, memoria, connessioni in rete, periferiche di ingresso e uscita. Il ruolo del nucleo è quello di rendere disponibili tutte le risorse fisiche della macchina tramite un'interfaccia ben definita, le "chiamate di sistema", attarverso cui le applicazioni possono usare la macchina da calcolo sottostante. Quando si installa "Linux" su un calcolatore in pratica si installa un sistema GNU che usa Linux come kernel. La differenza è sostanziale e va ricordata, anche se spesso si usa comunque il termine "Linux" per indicare tutto il sistema operativo. Per realizzare tale sistema operativo hanno lavorato migliaia di persone, ciascuna mettendo il proprio piccolo contributo. Nello stesso kernel Linux c'è il lavoro di centinaia di persone, spesso contributi molto piccoli ma importanti all'interno del progetto nel suo complesso.
Download:lucido13.ps
Volevo introdurre le licenze d'uso, vediamo che differenza c'è tra le licenze d'uso utilizzate per il software libero, esistono due tipi principali di licenze, la licenza di Berkeley e la licenza del Massachussets Institute of Technology e c'è molto software che è distribuito sia con la licenza di Berkeley che con la licenza del MIT. Ad esempio l'ambiente grafico è distribuito sotto la licenza MIT e sendmail è distribuito con la licenza Berkeley. Le licenze dicono: questo software è libero, però a condizione che si mantenga la nota di copyright chiunque può fare qualcosa di non-libero. Questo è più o meno la licenza che si è usata per la maggior parte dello Unix dell'inizio. Esistono dei sistemi operativi, citiamo FreeBSD o OpenBSD che sono distribuiti con questo tipo di licenza. Per esempio il nuovo sistema operativo della Apple contiene al suo interno pezzi dello Unix di BSD, Apple non rilascia le sorgenti perché è autorizzata ad appropriarsi di questo codice. In certi casi è una buona scelta in certi casi non lo è. Ad esempio per l'ambiente grafico Linux abbiamo il problema che alcuni produttori di schede non vogliono produrre le specifiche di programmazione della scheda. Come se uno sapendo i segnali elettrici che girano sui fili elettrici esterni potesse trovare come sono connessi i milioni di transistor che ci stanno dentro, è assurdo. Però i produttori dicono, questo è un segreto industriale. Allora è possibile utilizzare le schede grafiche di questi produttori "più stupidi" con degli ambienti grafici a cui viene aggiunto il supporto a queste schede permettendo al costruttore di non rivelare le informazioni sulla scheda, per cui uno ha un prodotto che è proprietario , che costa 100 dollari per ciascuna copia, che non si è autorizzati a copiare, ma che però perlomeno c'è, e la licenza del prodotto base permette questo. In certi casi invece è sconveniente.
Download:lucido14.ps
Download:lucido15.ps
La licenza d'uso adottata per i programmi sviluppati nell'ambito di questo progetto è la "GNU GPL", una licenze che non permette di appropriarsi dei programmi e renderli proprietari: ogni modifica ad un programma coperto dalla GPL deve essere refistribuita secondo la stessa licenza.
La General Licence del progetto GNU invece è fatta apposta per dire "ogni programma che deriva da questo programma deve essere ancora libero". Quindi se una ditta prende il nucleo di Linux che viene distribuito con questo tipo di licenza e ne fa uno suo un po' diverso per un computer nuovo è obbligata a distribuire il sorgente in modo che tutti ci lavorino. Di conseguenza Linux gira su una decina di prodotti diversi assolutamente incompatibili: io ho un Macintosh che monta Linux, uno Sparc, dei 386 mi hanno prestato anche un palmare Casio e ci gira Linux, appunto perché questo tipo di licenza obbliga comunque chi fa qualcosa a renderlo alla comunità.
Download:lucido16.ps
Download:lucido17.ps
Download:lucido18.ps
Download:lucido19.ps