Introduzione a Unix / Linux - Prima puntata
Questo corso ha un approccio molto pratico e che mira al risultato: saper usare Unix. La maggiorparte delle lezioni sono dunque focalizzate sull’utilizzo pratico del sistema Linux e sul raggiungimento di una certa familiarità con i comandi fondamentali. Per la particolare impostazione del sistema operativo Unix, è però necessaria, anche per un semplice utilizzo pratico, una conoscenza di alcuni concetti fondamentali. Lo studio delle origini di Unix e del movimento open-source ha inoltre la funzione di inserire lo studio del sistema in un contesto reale di mercato. Si consiglia dunque di leggere attentamente quanto segue.
Il sistema operativo
Un sistema operativo è un insieme di istruzioni che consente al computer di caricare i programmi in memoria e di eseguirli, di registrare, leggere, e modificare i dati sui dischi rigidi o sui floppy, gestire la memoria del computer, le periferiche etc.
Queste funzioni solo raramente vengono richieste in modo esplicito dall’utilizzatore del computer. Il più delle volte questi lavora con un programma, ad esempio di contabilità o di elaborazione testi, che prevede la lettura di dati dal disco, la visualizzazione sul monitor, la digitazione sulla tastiera, la registrazione del lavoro effettuato, la stampa su carta.
Apparentemente è il programma ad effettuare tutte queste operazioni, in realtà il nostro software si limita all’elaborazione dei dati in memoria, per tutto il resto si deve affidare al sistema operativo. Ogni singola attività ha origine da una richiesta del programma al sistema operativo, che provvede ad eseguirla ed a restituirne i risultati.
La pressione di un tasto sulla tastiera viene percepita dal sistema operativo, che provvede a notificarla al programma. Questi decide se tenerne conto, eventualmente la elabora e, se è il caso, visualizza sul monitor un segnale che può essere la semplice lettera corrispondente al tasto, oppure un altro messaggio, o il risultato dell’elaborazione. Il programma può anche non tener conto della pressione del tasto e continuare indisturbato nel suo lavoro.
Se l’utente vuole operare con un file registrato su disco, egli impartisce un comando al suo programma, il quale deve passare la richiesta al sistema operativo che provvede ad azionare il disk drive, a muovere la testina, a cercare il file nel disco, a leggerlo, a collocarlo in RAM ed infine a metterlo a disposizione del programma. Eventuali errori in questa successione di azioni, ad esempio l’assenza del dischetto dal drive o la mancanza del file sul dischetto, vengono gestiti dal sistema operativo. Tranne in caso di errori di questo tipo, il lavoro del sistema operativo e la sua interazione con il programma sono del tutto invisibili per l’utente.
Ciascun programma è strettamente legato al sistema operativo con cui deve essere eseguito. Un programma realizzato per funzionare in coppia con un sistema operativo, può funzionare solo se è presente quel determinato sistema operativo.
Molte funzioni del programma, come abbiamo visto, sono demandate al sistema operativo, al quale il programma si limita ad impartire le dovute istruzioni. Un diverso sistema operativo non riuscirebbe ad interpretare correttamente queste istruzioni, ed una volta caricato in memoria il programma, il computer si bloccherebbe.
L’importanza del sistema operativo è evidente. Qualsiasi programma vi debba convivere, ne mutua la velocità, il funzionamento, la logica, ed anche l’aspetto estetico.
Unix e le sue origini
Unix è un sistema operativo moderno e versatile. Le sue caratteristiche principali sono la alta affidabilità, stabilità e sicurezza dei dati. Per questo viene spesso usato nelle aziende come sistema operativo per i server di medie-grandi dimensioni.
E' inoltre un sistema multiutente, cioè che gestisce l'accesso di più utenti contemporaneamente. Viene data anche la possibile di creare per ogni utente un "profilo" dove è possibile specificare molti paramentri, come per esempio la directory di lavoro, i permessi di accesso ai dati, il tipo di utente etc.
E' anche un sistema multitasking e cioè che è in grado di gestire più processi contemporaneamente come ormai è prassi nei sistemi operativi moderni.
Si riporta di seguito una breve ed essenziale cronologia delle tappe fondamentali che il sistema Unix ha attraversato:
- 1965, La AT&T, il MIT e la General Elettrics si uniscono nel progetto di un s.o. multiutente, multitasking, e multiprocessore: il Multics
- 1969, il progetto fallisce, ma presso i Bell Labs della AT&T dalle ceneri di Multics nasce Unix, sviluppato da Ken Thompson e Dennis Richie. Il nome Unix (inizialmente Unics) e’ scelto in opposizione a Multics.
- 1973, dalla collaborazione con Dennis Ritchie, creatore del Linguaggio C, nasce la terza versione di Unix scritta in C anziche in Assembler.
- Fine anni ‘70, un decreto Antitrust americano impone all’AT&T la scelta fra telecomunicazioni e informatica, in seguito alla quale Unix viene offerto a basso costo alle Università. Il basso costo comporta però l’assenza di supporto il che favorisce la cooperazione fra i semplici utenti, mettendo così le basi della filosofia open source.
- 1983, Richard Stallman (MIT) inizia una re-implementazione “free” di Unix denominata GNU (acronimo ricorsivo di “Gnu is Not Unix”) che arricchirà Unix con nuovi e iportanti tools come emacs, gcc e gdb.
- 1984, presso Università di Berkeley nasce la Berkeley Software Distribution BSD introducendo in Unix molte nuove caratteristiche.
Il resto della storia di Unix vede l’introduzione nel mercato di centinaia di dialetti dai costi e dalle prestazioni molto diverse tra loro ma tutti accomunati dalla compatibilità quasi totale a livello di comandi e API (Application Programming Interface). Il primo di questi fatti rende prezioso lo studio dei comandi base di Unix: una volta imparati si ha la certezza di poterli riutilizzare in una qualunque implementazione. Si può parlare in questo senso di portabilità degli utenti.
L’uniformità della API permette invece la portabilità dei sorgenti: un programma (tipicamente in liguaggio C) scritto per un certo ambiente Unix che gira su una piattaforma hardware X avrà un’altissima probabilità di poter essere ricompilato senza (o quasi) modifiche su di un’altro ambiente Unix che gira su una piattaforma hardware Y.
Un altro grande vantaggio di Unix rispetto ad al s.o. è la coerenza e l’eleganza del suo progetto derivanti dalla sua origine in ambiente scientifico / universitario.
Oggi Unix, con tutte le sue varianti, rappresenta il s.o. più usato in ambiente server con una base di installazione di milioni di calcolatori in tutto il mondo. Esistono alcuni tentativi di stadardizzazione di Unix (POSIX etc) ma Unix rimane essenzialmente uno standard de facto.
Free Software Foundation, Opensource
Nel 1985 Richard Stallman, ex ricercatore del MIT, fondò la Free Software Foundation (FSF), finanziata per donazioni, alla cui base c'era il progetto GNU, che ambiva alla realizzazione di un sistemaa operativo free, nel senso più esteso del termine.
Il software free, rilasciato con la GNU General Public Licence (GPL), in questo contesto, implica:
- Ridistribuzione libera del software e del codice sorgente
- Il codice sorgente è aperto e disponibile per lettura, modifiche, analisi, controllo.
- Prodotti derivati da prodotti GPL devono avere licenza GPL
- Il Copyright è comuqnue dell'autore
Spesso associato al concetto di free software è quello di open source le differenze sono sottili, sotto certi aspetti inafferabili. Semplificando si può dire che l'open source si basa su principi pragmatici ed economici, mentre il free software (così come descitto nella GPL) ha radici più etiche e filosofiche.
Per l'OSI (Open Source Initiative) si dovrebbe rilasciare il codice del proprio software, perchè è una scelta commercialmente sostenibile e valida, per la FSF il codice dovrebbe essere aperto per rispettare la libertà degli autori e degli utenti.
Fra i fondatori dell'OSI figura Eric Raymond noto fra l'altro per aver scritto il libro/manifesto "The Cathedral and the bazaar" il cui percorso editoriale è emblematico su cosa può essere un modello di business basato sull'open source: il libro è liberamente disponibile, nella sua interezza, in rete e chiunque può leggerlo ma l'autore ha venduto i diritti di pubblicazione su carta alla O'Reilly (che ne vende parecchie copie). Lasciando da parte considerazioni politiche o ideologiche, in questo corso si fa riferimento alla licenza GPL come licenza open source e i concetti di open source e free software hanno la stessa valenza pratica.
La nascita di Linux
Linux è un moderno sistema operativo gratuito compatibile con moltissime architetture hardware tra le quali Intel x86. Linux è utilizzato in tutto il mondo da milioni di computer e altrettanti utenti. Di seguito si ripercorre la storia che ha portato alla sua nascita."
Minix
Alla fine degli anni 1980, il professor Andrew S. Tanenbaum sviluppa , un sistema operativo Unix per elaboratori con processore Intel i386, realizzato specificamente per uso didattico. Era sufficiente acquistare il libro a cui era abbinato e si otteneva un sistema completo di sorgenti.
Linus Torvalds
Linux è nato come un progetto personale di studio delle funzionalità di multiprogrammazione dei microprocessori i386 da parte di Linus Torvalds, all’epoca uno studente all’università di Helsinki, in Finlandia.
Linus Torvalds decise di trasferire il suo studio dei microprocessori i386 su Minix, con l’idea di realizzare qualcosa di simile a Minix, anzi, qualcosa di migliore (a better Minix than Minix), cominciando da quel sistema operativo, per poi staccarsene completamente. Dopo molto lavoro, Linus Torvalds riuscì ad arrivare a un sistema minimo e soprattutto autonomo da Minix.
L’anno di nascita del sistema operativo Linux è il 1991 quando Linus (con un celebre messaggio sul newsgroup comp.os.minix) annuncia il suo progetto e cerca di coinvolegere altre persone.
Linux non è rimasto il progetto personale di una persona; in breve tempo ha coinvolto un numero molto grande di persone, unite dal fatto che si trattava di un progetto libero da qualunque restrizione legale al suo utilizzo, alla sua diffusione, alla possibilità di modificarlo ecc.
In pratica, la fortuna di Linux rispetto a Minix, è stata quella di avere scelto subito la licenza GNU-GPL che lo ha reso in breve tempo molto diffuso. Tuttavia non bisogna trascurare l’importanza del progetto GNU, che ha dato al kernel Linux tutto quello che serve per arrivare a un sistema operativo completo.
Linux è oggi il più famoso progetto GNU-GPL, di fatto è composto dal kernel di Linus Torvalds e da molte altre utility e programmi di base, ispirate agli equivalenti Unix e realizzate all’interno del progetto GNU.
Le distribuzioni
Una distribuzione (anche detta distro) è un confezionamento (packaging) di Linux, con procedure che rendono comoda e semplice l'installazione.
Si consideri che il "Linux di Linus" non è veramente un s.o. ma un semplice kernel. A questo ogni distribuzione aggiunge tutto il software necessario per avere un sistema operativo completo di software applicativo e di servizio. Tutte le utility di base, dal gcc (compilatore) alle utility di gestione file fanno parte del progetto GNU.
Le distribuzioni differiscono per:
- numero e versioni dei programmi installabili;
- versione del kernel utilizzata;
- procedura di installazione (interfaccia utente e possibilità di definire opzioni e scegliere quale software installare);
- organizzazione di file di configurazione, programmi, etc.
Le distribuzioni sono ormai centinai ma le più comuni sono:
Red Hat |
Red Hat è la più popolare distribuzione Linux e si adatta bene ad usi diversi (desktop, server, laptop). |
Debian |
Distribuzione completamente sviluppata da una comunità che consta di centinaia di persone in tutto il mondo; viene considerata per puristi ed esperti e risulta generalmente meno user-friendly delle altre. |
S.U.S.E. |
Distribuzione più diffusa in Europa, solida e ben accessoriata. |
|
|
Mandrake |
In crescente diffusione, E' molto user friendly e probabilmente è la più adeguata per un sistema desktop. |
Slackware |
Slackware è una delle prime distribuzioni. Viene generalmente considerata più ostica da installare. Per puristi. |
Figura 1‑1 . TUX: la mascotte del progetto Linux
Architettura di Linux
Linux come molti sistemi operativi moderni è strutturato come seqgue:
- il kernel
- la shell
- i programmi di servizio
Figura 1‑2 - Architettura di Linux
Il kernel
Il kernel è il nucleo del sistema. Idealmente, è una sorta di astrazione nei confronti delle caratteristiche fisiche della macchina ed è il livello a cui i programmi si rivolgono per qualunque operazione. Ciò significa, per esempio, che i programmi non devono (non dovrebbero) accedere direttamente ai dispositivi fisici, ma possono utilizzare dispositivi logici definiti dal kernel.
Questa è la base su cui si fonda la portabilità di un sistema operativo ovvero la possibilità di trasferire dei programmi su piattaforme hardware / software differenti; questo è reso possibile dalla presenza di kernel che forniscono funzionalità compatibili.
Figura 1‑3 - Il kernel
La shell
Affinchè l’utente possa accedere ai servizi del sistema occorre un programma particolare che si ponga come intermediario tra l’utente (attraverso il terminale) e il kernel. Questo tipo di programma è detto shell (conchiglia).
Un programma shell può essere qualunque cosa, purché in grado di permettere all’utente di avviare e possibilmente di controllare i programmi. La forma più semplice, che è anche la più vecchia, è la riga di comando presentata da un invito, o prompt. Questo sistema ha il vantaggio di poter essere utilizzato in qualunque tipo di terminale, compresa la telescrivente. Tipicamente una shell testuale incorpora una serie di comandi detti comandi interni.
Nella sua forma più evoluta, la shell può arrivare a un sistema grafico di icone o di oggetti grafici simili, oppure ancora a un sistema di riconoscimento di comandi in forma vocale. In questo corso si fa riferimento alla shell bash che propone un prompt.
I programmi di servizio
Teoricamente, tutte le funzionalità amministrative per la gestione del sistema potrebbero essere incorporate in una shell sotto forma di comandi interni; in pratica questo non avviene: i programmi di servizio sono un insieme di piccole applicazioni utili per la gestione del sistema (file, cartelle, zippare etc..) che vengono mantenuti esterni per semplificare e alleggerire la shell.