UNIX: introduzione elementare

Organizzazione del sistema

In questo primo capitolo voglio cercare di dare una brevissima infarinatura generale sulla struttura teorica di un sistema Unix, volendo esagerare potrei anche dire sulla "filosofia di un sistema Unix". Una macchina che opera con questo sistema operativo è infatti concepita in modo del tutto diverso da un computer per uso personale; non voglio essere frainteso: oggi esistono numerose versioni del sistema operativo Unix anche per PC o per i computer Apple Macintosh, ma è difficile parlare di personal computing in presenza di Unix, visto che ben poco spazio lascia a ciò che siamo soliti fare con il nostro PC. Soprattutto è diverso il modo di usare il sistema da parte dell'utente.

Di sicuro Unix è molto più potente, più robusto e più efficiente di Windows, è anche più versatile e forse anche più divertente, ma di conseguenza è più difficile da apprendere; tuttavia lavorare con questo potente strumento può dare enormi soddisfazioni: una volta che avrete imparato ad operare su un sistema Unix sarà ben difficile accettare le anguste ristrettezze a cui ci costringono altri sistemi operativi.

Introduzione al sistema operativo Unix

In termini assai riduttivi possiamo dire che un sistema operativo è il software che, caricato in memoria ed eseguito al momento dell'accensione del calcolatore (bootstrap), permette ai programmi applicativi di girare e di sfruttare le risorse hardware della macchina. Il sistema operativo in un certo senso impone anche all'utente il modo di operare sulla macchina, stabilendo ciò che l'utente può fare e ciò che invece non può fare, stabilendo l'ordine con cui devono essere eseguite certe operazioni e così via.

Di questi aspetti ci si accorge poco utilizzando su un personal computer con vecchi sistemi operativi mono-utente come MS-DOS, le prime versioni di Windows e le vecchie versioni del System della Apple: in questi ambienti infatti poche cose è consentito fare, ma l'utente le può eseguire tutte, senza alcuna restrizione.

D'altra parte tali sistemi operativi sono stati appositamente progettati per girare su un personal computer, su una macchina che quindi sarebbe stata utilizzata da un unico utente per volta e spesso da un solo utente in assoluto. MS-DOS e le prime versioni di Microsoft Windows, ad esempio, erano anche concepiti per poter eseguire un unico programma (task) per volta(1): mentre si utilizzava un editor, non era possibile contemporaneamente utilizzare un programma di comunicazione o eseguire un programma di utilità. Oggi queste limitazioni sono superate praticamente da tutti i sistemi operativi in circolazione, ma le caratteristiche di multiutenza e di multitasking su macchine accessibili ad una vasta fascia di utenti (i personal computer, ad esempio) per molti anni sono state dominio esclusivo dei sistemi operativi Unix.

Unix nasce intorno ai primi anni '70 contemporaneamente all'introduzione dei mini computer, nuove macchine più compatte ed agili dei grandi mainframe prodotti fino ad allora. Le prerogative di Unix che ne determinarono subito un grande successo sono sostanzialmente quelle di essere un sistema operativo compatto e modulare, facilmente adattabile alle risorse hardware ed alle esigenze operative dell'ambiente in cui viene installato. Con l'introduzione di Unix e dei mini computer si diffonde l'uso dei terminali alfanumerici che consentono una comunicazione più facile ed efficiente tra l'utente ed il sistema (fino ad allora si erano usate quasi esclusivamente le schede perforate). Si fa largo anche il concetto di sistema aperto e di elaborazione distribuita: Unix è predisposto per comunicare facilmente con altri sistemi e ad essere interconnesso con altre macchine per operare su risorse non più centralizzate su un unico grosso sistema, ma distribuite su più macchine di media potenza; la configurazione del sistema e i formati utilizzati per i suoi file sono aspetti noti e documentati (in gergo si dice "aperti") e dunque chiunque viene messo nelle condizioni di poter intervenire su di essi adattando il funzionamento e la configurazione del sistema alle proprie specifiche esigenze.(2)

Entrando solo per un attimo in dettagli più tecnici, possiamo accennare al fatto che Unix è basato su un nucleo (il kernel) che gestisce la comunicazione di basso livello con la macchina, l'esecuzione dei programmi e l'uso e la condivisione o la protezione delle risorse del sistema. Questa è la parte del sistema operativo più strettamente legata all'hardware del computer. Il resto del sistema è costituito da una serie di moduli aggiuntivi finalizzati alla gestione dei vari sottosistemi che completano l'ambiente operativo (il riconoscimento degli utenti, la visualizzazione a video, l'input da tastiera, l'esecuzione dei comandi impostati dall'utente, la posta elettronica, la stampa, ecc.); questi moduli sono spesso "portabili", cioè è possibile adattarli quasi senza nessuna modifica sostanziale per poterli utilizzare su macchine completamente diverse, corredate del loro specifico kernel. Questo fatto contribuisce a rendere Unix un sistema operativo aperto e facilmente trasportabile su hardware diversi. È proprio per questa grande lungimiranza dei suoi progettisti iniziali che oggi possiamo disporre di una grande varietà di Unix differenti, utilizzabili su piattaforme diverse. D'altra parte la possibilità da parte di chiunque di sviluppare moduli aggiuntivi per il sistema operativo ha fatto sì che oggi non esista uno Unix, ma ne esistano diverse versioni che hanno finito per essere anche parzialmente incompatibili tra di loro.

Le nozioni che esporremo in questa breve guida sono talmente generali che non andranno a scontrarsi con queste sottili differenze. Basti sapere che oggi esistono due standard di riferimento per gli sviluppatori di sistemi Unix: BSD, Berkeley System Distribution, e UNIX System V; quest'ultimo (noto anche come SVR4) è probabilmente più diffuso del BSD. Per ognuna di queste due versioni fondamentali del sistema esistono numerose implementazioni, alcune molto note e diffuse, altre conosciute ed utilizzate solo da una ristretta cerchia di utenti. A titolo di esempio possiamo dire che i sistemi Unix di tipo BSD più noti sono i sistemi operativi open source FreeBSD (http://www.freebsd.org), NetBSD (http://www.netbsd.org), Open BSD (http://www.openbsd.org), Darwin (la base Unix su cui si fonda il sistema operativo della Apple, Mac OS X; http://www.opendarwin.org, http://www.gnu-darwin.org, http://developer. apple.com/darwin/); sulla versione UNIX System V sono basati invece il sistema operativo Linux (http://www.linux.org/), IBM AIX (http://www.ibm.com/aix), Sun Solaris (http://www.sun.com/solaris), HP UX di Hewlett Packard (http:// www.hp.com/products1/unix/operating/) e molti altri ancora.

Ci accorgeremo presto che Unix è in un certo senso un sistema operativo assai sobrio ed elegante: tutto ciò che fa di Windows un sistema coloratissimo e di grande effetto visivo, in ambiente Unix è guardato con sospetto. Qui regna la sintesi, tutto ciò che è inutile o ridondante è bandito. I messaggi del sistema vengono visualizzati solo quando è strettamente necessario: spesso un programma viene eseguito senza che l'utente legga sullo schermo nessuna comunicazione da parte della macchina; se l'esecuzione termina senza che sia stato visualizzato alcun messaggio vorrà dire che l'esecuzione del programma è andata a buon fine, mentre nel caso contrario il sistema visualizzerà un breve messaggio di errore. I comandi della shell sono compatti, spesso costituiti di soli due caratteri, ma hanno un'infinità di opzioni perché l'utente si deve sentire libero di modificare a proprio piacimento la modalità operativa del software che utilizza. Questo fa di Unix un sistema operativo estremamente duttile e versatile.

Come vedremo meglio nella prossima sezione, una delle caratteristiche fondamentali di Unix è quella di essere un sistema operativo multiutente: più persone possono usare il sistema contemporaneamente o in tempi diversi. Questo fa sì che sia necessario imparare anche un certo "galateo" che deve contraddistinguere gli utenti di un sistema multiutente, in cui le risorse sono condivise tra più persone. Il fatto stesso che lo scambio di messaggi dalla macchina all'utente sia ridotto al minimo indispensabile è un segno dell'idea che ogni operazione che possa in qualche modo appesantire il sistema, rallentando il lavoro di un altro utente, è evitata accuratamente, in modo da lasciare libere quante più risorse è possibile all'elaborazione vera e propria dei programmi.

Multiutenza e multitasking

Un sistema operativo multitasking permette di eseguire più programmi (task) contemporaneamente: se ad esempio viene chiesto al sistema di eseguire contemporaneamente due processi, A e B, la CPU eseguirà per qualche istante il processo A, poi per qualche istante il processo B, poi tornerà ad eseguire il processo A e così via. È il sistema operativo a controllare che la CPU ripartisca equamente le sue prestazioni tra tutti i processi attivi; è sempre il sistema operativo a far sì che quando un processo va in crash, quando si blocca in seguito al verificarsi di un errore, i restanti processi e l'intero sistema non subiscano alcun danneggiamento e possano proseguire senza conseguenze i compiti loro assegnati.

Un sistema multiutente può essere utilizzato contemporaneamente da utenti diversi. Sotto Unix ad ogni utente del sistema viene assegnato uno username che lo identifica univocamente: quando si inizia una sessione di lavoro si deve "entrare" nel sistema tramite una procedura di login durante la quale dovremo farci riconoscere dal sistema mediante l'introduzione del nostro username pubblico e della nostra password segreta.

Dopo essere entrati nel sistema potremo lanciare i nostri processi (le applicazioni, i programmi) che verranno eseguiti in multitasking insieme ai processi lanciati dagli altri utenti collegati in quel momento sulla nostra stessa macchina o che hanno lasciato che il sistema proseguisse autonomamente l'esecuzione di determinati task anche dopo il termine della loro connessione da un terminale.

Console, terminali e terminali grafici

Può essere utile imparare a distinguere il sistema hardware mediante cui si accede alla macchina Unix su cui operiamo. Infatti, mentre quando lavoriamo con il nostro personal in ambiente Windows, siamo gli unici utenti di quel sistema, ed il computer che stiamo usando è quello che abbiamo fisicamente davanti a noi,(3) la situazione può essere molto diversa nel caso in cui si stia utilizzando un sistema Unix.

La console è la coppia tastiera/video collegata direttamente alla macchina. In ambiente Windows la tastiera ed il monitor del nostro PC sono in un certo senso la console del PC stesso. Visto che però ad una stessa macchina Unix possono accedere contemporaneamente più utenti, deve essere possibile il collegamento di più tastiere e video allo stesso computer. Ed infatti di solito ad una macchina Unix sono collegati numerosi terminali.

Un terminale è costituito da una tastiera, un video, ed una piccolissima unità di elaborazione locale, che si occupa esclusivamente di gestire la comunicazione tra il terminale stesso e l'elaboratore a cui è collegato. In sostanza il terminale si limita a visualizzare sullo schermo i messaggi del sistema e ad inviare i comandi digitati dall'utente sulla tastiera. Generalmente i terminali alfanumerici (ossia quelli che non possono visualizzare schermate grafiche, ma soltanto testuali) sono collegati al computer attraverso linee seriali, ma spesso come terminali vengono usati dei normali personal computer, dotati di un opportuno software di emulazione di terminale. In questo caso è del tutto ininfluente la potenza del computer e del sistema operativo della macchina utilizzata come terminale, visto che questa verrà usata esclusivamente per introdurre l'input mediante la sua tastiera e visualizzare l'output sul suo monitor, mentre ogni elaborazione vera e propria verrà eseguita dal computer (la macchina Unix) a cui il terminale è collegato.

Esistono dei terminali più evoluti, i cosiddetti terminali grafici che permettono di utilizzare un'interfaccia grafica (GUI) per eseguire le operazioni di input/output e quindi consentono anche di visualizzare un output di tipo grafico (immagini, disegni, grafici). I terminali grafici possono essere costituiti da apparati hardware appositamente progettati (gli X Terminal), dotati di un'unità di elaborazione grafica, anche molto potente, un monitor ad alta risoluzione, una tastiera ed un mouse; gli X Terminal sono generalmente connessi in rete TCP/IP mediante una interfaccia Ethernet con il sistema Unix; in questo modo possono essere utilizzati per accedere in modalità grafica a tutti i server che in rete accettano una connessione da tale terminale grafico. Una alternativa agli X Terminal veri e propri è costituita dai software denominati X Window Server che possono essere eseguiti su un personal computer (anche in un ambiente non Unix, come Windows), che sfruttando le potenzialità del personal computer, consentono di accedere in modalità grafica ad alta risoluzione alle applicazioni grafiche presenti sul sistema Unix. Infine è possibile utilizzare come terminale grafico la console grafica del sistema stesso (se presente) o quella di altre workstation Unix connesse in rete. Approfonodiremo meglio questi aspetti nel Capitolo 4.

Diritti ed attributi

Gli utenti di un sistema Unix non sono tutti uguali e soprattutto non hanno tutti gli stessi diritti. Questa affermazione un po' perentoria potrebbe suonare male per qualche sincero democratico e far pensare che Unix sia un sistema operativo illiberale. Naturalmente nulla potrebbe essere più falso: Unix garantisce la libertà di azione di tutti gli utenti facendo in modo che nessun altro utente non autorizzato possa in qualche modo violare la nostra privacy o distruggere o manomettere le nostre informazioni. In questo modo viene anche garantita una certa sicurezza dell'intero sistema: nessun utente "normale" potrà manometterlo compromettendone il corretto funzionamento; ma non solo: nessun utente "normale" potrà commettere errori talmente gravi nell'uso del sistema tanto da danneggiare altri utenti o il sistema stesso.

Cosa vuol dire più esattamente tutto questo? Abbiamo visto che ogni utente è identificato univocamente all'interno del sistema mediante uno username. Gli utenti del sistema sono distribuiti in più gruppi; ogni utente fa parte almeno di un gruppo. Ad esempio nel sistema Unix del Dipartimento di Matematica dell'Università "La Sapienza" di Roma, gli utenti sono stati divisi in diversi gruppi, denominati ad esempio "teograf", che raccoglie coloro che si occupano di Teoria dei Grafi, "algegeo", che raccoglie coloro che si occupano di Algebra e Geometria, e così via. Gli utenti possono essere raggruppati in modo tale da attribuire solo ad alcuni di loro (quelli facenti parte di un gruppo specifico) la capacità di effettuare determinate operazioni sul sistema stesso (ad esempio controllare la coda dei messaggi di posta elettronica in uscita dal sistema o compiere altre attività di gestione del sistema stesso).

Esiste poi un utente privilegiato, il cui username è root, che viene assegnato all'amministratore del sistema, il cosiddetto system manager. Questi è una figura assai importante nella gestione di un sistema Unix. È colui che può modificare la configurazione dell'intero sistema e che ha la possibilità di verificare ogni cosa all'interno del sistema stesso. È il caso di dire che è anche l'unico utente che possa combinare dei guai seri su una macchina Unix!(4)

Come si traduce tutto questo in pratica? Innanzi tutto ad ogni utente viene assegnata una propria home directory nel filesystem della macchina. Ad utenti differenti corrispondono home directory diverse; tali directory sono di proprietà degli utenti a cui sono assegnate e di solito hanno lo stesso nome dell'utente. Anche ogni altro file o directory nel filesystem ha un proprietario che, mediante un apposito comando, ne stabilisce le modalità d'uso (i diritti di accesso) per se stesso e per gli altri utenti del sistema. È possibile, ad esempio, fare in modo che un certo file possa essere modificato solo dal proprietario, che possano leggerlo tutti gli utenti del gruppo del proprietario e che gli altri utenti non possano né leggerlo, né modificarlo o cancellarlo. Lo stesso è possibile fare con le directory, di cui si possono stabilire i diritti di lettura, scrittura ed accesso, e per i file binari contenenti le applicazioni (i programmi), di cui è possibile stabilire i diritti di lettura, scrittura ed esecuzione.

L'utente root non ha questi vincoli, ma può accedere in qualsiasi modo a qualunque file o directory presente nel filesystem, a prescindere dagli attributi di protezione attivati dagli utenti.

È bene tenere presente che, come vedremo meglio in seguito, ogni operazione eseguita su una macchina Unix viene effettuata a nome e per conto di un determinato utente. Non esistono task o programmi che girano in modalità anonima: ogni programma viene eseguito per conto di un determinato utente e pertanto ne acquisisce tutti i permessi ed i vincoli.

Uno sguardo al filesystem

Abbiamo usato più volte il termine filesystem, ma cosa significa esattamente? Con questa parola si indica l'insieme dei supporti di memorizzazione, fisici o virtuali, collegati al sistema (in gergo: montati sul sistema). Chi ha avuto modo di usare un PC in ambiente Windows sa bene che ogni unità a disco è identificata da una lettera dell'alfabeto: A è il dischetto magnetico, C è il primo disco rigido, D è il secondo disco rigido e così via. In ambiente Unix la situazione cambia radicalmente. Esiste una unità (un disco) principale (root, radice, da non confondersi però con lo username del system manager) a cui vengono "agganciate" come sottodirectory tutte le altre unità, siano esse diversi tipi di hard disk o di unità di memorizzazione di massa presenti sul computer stesso, o "volumi" messi in condivisione via rete da altri computer attraverso appositi protocolli. L'insieme di tutte le unità di memorizzazione (chiamate "volumi"), accorpate in un'unica grande struttura ad albero, costituiscono il filesystem.

Generalmente, su quasi ogni sistema Unix, sono presenti alcune directory che rivestono una certa importanza all'interno del sistema e che hanno quasi sempre lo stesso nome. A titolo di esempio consideriamo la struttura ad albero riportata nella figura seguente che rappresenta parte di un ipotetico filesystem (assai ridotto, per la verità).

 \ --+-- bin
     |
     +-- dev
     |
     +-- etc
     |
     +-- home --+-- marco
     |          |
     |          +-- marina
     |          |
     |          +-- root
     +-- lib
     |
     +-- proc
     |
     +-- sbin
     |
     +-- tmp
     |
     +-- usr --+-- X11
     |         | 
     |         +-- bin
     |         |
     |         +-- include
     |         |
     |         +-- lib
     |         |
     |         +-- local --+-- bin
     |         |           |
     |         |           +-- etc
     |         |           |
     |         |           +-- lib
     |         +-- man
     |
     +-- var --+-- log
               |
               +-- mail
               |
               +-- spool
Un esempio di struttura del filesystem di un sistema Unix

Diamo una rapidissima scorsa al contenuto delle directory elencate in figura:

/bin
Contiene molti dei file binari (eseguibili) presenti sul sistema.
/dev
È una directory molto importante che contiene i puntatori ai device driver delle unità hardware installate sul sistema. Sono alcune di quelle estensioni del kernel di cui parlavamo nelle pagine precedenti, che permettono al sistema di gestire le unità ad esso collegate. Ad esempio il file /dev/ttyS0 gestisce l'input/output attraverso il primo terminale collegato al sistema, mentre /dev/console gestisce la console del sistema. /dev/null è l'unità "nulla", che risulta assai utile in alcune situazioni, come vedremo in seguito.
/etc
Contiene una serie di file che non trovano collocazione migliore in altre directory; sono per lo più file di configurazione generale del sistema.
/home
Contiene le home directory degli utenti.
/lib
Contiene le "librerie" di sistema, dei file che contengono parte di codice eseguibile e che vengono utilizzati per la compilazione di applicazioni. Questo consente di ridurre la dimensione dei programmi, inserendo nelle librerie parti di codice comuni a più applicazioni.
/proc
È una directory piuttosto particolare: i file che contiene non sono memorizzati su disco, ma direttamente nella memoria dell'elaboratore; contengono i riferimenti ai vari processi attivi nel sistema e le informazioni utili per potervi accedere.
/sbin
Contiene i file eseguibili ("binari") riservati all'amministratore del sistema.
/tmp
È la directory temporanea di default. Spesso le applicazioni devono scrivere dei dati su un file temporaneo, che al termine dell'esecuzione verrà cancellato; in questi casi spesso usano la directory /tmp, che è sempre presente sui sistemi Unix.
/usr
Contiene numerose sottodirectory molto importanti per il sistema: nulla di ciò che è contenuto sotto la directory /usr è di vitale importanza per il funzionamento della macchina, ma spesso è proprio sotto /usr che vengono collocate tutte quelle cose che rendono utile il sistema.
/usr/X11
Contiene ciò che riguarda l'interfaccia grafica X Window.
/usr/bin
Altri eseguibili (file binari).
/usr/include
Contiene i file include per i programmi in linguaggio C relativi alle librerie installate sul sistema.
/usr/lib
Altre librerie di sistema.
/usr/local
Contiene file tipici della nostra macchina; tipicamente applicazioni installate successivamente al sistema operativo.
/usr/man
Contiene le pagine di manuale (l'help on-line del sistema operativo Unix).
/var
Contiene diversi tipi di file il cui contenuto varia con una frequenza elevata; i file presenti in queste directory vengono gestiti da altri programmi attivi sul sistema.
/var/log
Contiene il "registro storico" (i file di log) degli eventi accaduti sul sistema e tracciati da alcuni dei programmi attivi sul sistema stesso.
/var/mail
Contiene i file con le mailbox di posta elettronica degli utenti del sistema, con i messaggi di posta elettronica giacenti e non ancora letti dai rispettivi destinatari.
/var/spool
Contiene i file in attesa di essere elaborati da altri programmi, come ad esempio la coda di stampa e la coda dei messaggi di posta elettronica in uscita.
Figura: img/sgi_indy
Silicon Graphics Indy

NOTE:

1. Le prime versioni di Windows non erano un vero e proprio sistema operativo, ma una interfaccia utente grafica che si appoggiava sul sistema operativo mono-utente e mono-tasking MS-DOS.

2. Per maggiori dettagli sulla storia della nascita e dell'evoluzione del sistema operativo Unix si vedano, ad esempio, le pagine del sito dell'Open Group, disponibili all'indirizzo http://www.unix.org/what_is_unix/history_timeline.html, oppure quelle disponibili sul sito dei Bell Labs, all'indirizzo https://www.bell-labs.com/usr/dmr/www/hist.html, o infine quelle, in italiano, presenti sul sito del Pluto, un gruppo di sostenitori italiani dei progetti open source, all'indirizzo http://www.pluto.it/files/journal/pj9812/storia-unix.html. Qualche riferimento alla programmazione in ambiente UNIX è presente in questa pagina: http://wiht.link/unix_programming.

3. Trascuriamo per semplicità la possibilità che più utenti contemporanei possano accedere tramite i terminal services ad uno stesso sistema in ambiente Microsoft Windows Server.

4. Forse è bene precisare che sebbene i file di sistema e le directory degli altri utenti siano generalmente ben protette, è difficile mettere al riparo l'utente dalla possibilità di compiere danni sui propri file. Lavorando con la shell Unix non esistono possibilità di annullare l'effetto dei comandi impartiti al sistema (undo) o di recuperare file temporaneamente spostati nel "cestino"...

Home page

Indice

Introduzione

Organizzazione del sistema

Comandi fondamentali

Editing di file di testo

L'interfaccia grafica X Window

Alcuni strumenti per l'uso della rete Internet

Sintesi dei comandi principali

Elenco alfabetico delle sigle

Bibliografia

HOME

Valid HTML 4.01! Valid CSS!
Author: Marco Liverani - Last modified: Sunday November 20, 2011 - URI: http://www.aquilante.net/unix/2.shtml