Guida per principianti a GNU/Linux: ecco come è fatto il nostro sistema operativo preferito

Avatar utente
Etabeta
Messaggi: 945

Guida per principianti a GNU/Linux: ecco come è fatto il nostro sistema operativo preferito

Messaggio #1 »

domenica, 1. gennaio 2012, 14:31

Guida per principianti a GNU/Linux: ecco come è fatto il nostro sistema operativo preferito

Lo gnu è un bovino africano, il pinguino è un uccello polare... eppure vanno d'accordo

Abbiamo visto cosa fa un sistema operativo. Abbiamo accennato anche a qualche suo componente. Ora vediamo, in concreto, come è fatto “dentro” un sistema operativo e in particolare GNU/Linux.

Abbiamo detto che il sistema operativo gestisce il nostro hardware. In particolare i dispositivi di Input/Output (tastiera, schermo, mouse, webcam, ecc.) e le memorie di massa. Per ciascuno di questi dispositivi il sistema operativo ha bisogno di un programma, chiamato driver. Driver in inglese vuol dire “pilota” e in effetti il driver “pilota” è il dispositivo.

Abbiamo anche bisogno, come accennato nella puntata precedente, di qualcosa che permetta l’esecuzione di più programmi “contemporaneamente”, o meglio attraverso il multitasking. Questo componente è il kernel (nucleo). In sostanza il kernel è quella parte del sistema operativo che si occupa di gestire i processi (programmi) assegnando loro delle risorse (un po’ di tempo di esecuzione e un po’ di memoria) nonché di gestire il passaggio da un programma a un altro tantissime volte al secondo. Ma il kernel contiene anche i driver, perché deve permettere ai programmi di accedere a risorse aggiuntive (la tastiera, il mouse, lo schermo, ecc.). Per svolgere le sue funzioni il kernel mette inoltre a disposizione dei programmi delle “chiamate di sistema”.

Vediamo un po’ come funziona:

Poniamo questo caso: stiamo usando OpenOffice e a un certo punto vogliamo salvare la nostra lettera. Clickiamo sull’icona “salva”. OpenOffice a questo punto “chiama” il sistema operativo e gli dice:

Ehi, tu, crea un nuovo file e scrivici dentro i dati che adesso ti mando, poi chiudilo.

Detta così sembra una battuta, ma è davvero ciò che fa il programma.
In particolare farà almeno tre richieste:

crea un file
scrivi i dati
chiudi il file


In termini tecnici queste si chiamano davvero “chiamate al sistema operativo” o, in inglese, “system calls“.

Si potrebbe pensare quindi che i programmi parlano con il kernel e chiedono queste funzioni. E invece no. I programmi, di norma, non accedono direttamente al kernel. Essi si servono invece delle librerie.

C’è una libreria particolare che si occupa di svolgere la funzione di interfaccia tra i programmi e il kernel. Nei sistemi operativi di tipo Unix, come GNU/Linux, essa è chiamata “libreria standard del C” e in particolare in GNU/Linux essa è la GNU C Library (glibc). E’ attraverso di essa che tutti i programmi dialogano con il resto del sistema operativo.

Per renderci conto dell’importanza delle librerie in un sistema operativo, facciamo un esempio che molti conoscono: Wine.

Wine fa credere ai programmi per Windows di essere in esecuzione su un sistema Windows, mentre invece stanno girando su un sistema GNU/Linux.
Come fa?

Esso intercetta le chiamate dei programmi al sistema operativo (i programmi credono di "girare" sotto Windows) e le dirotta alle proprie librerie e poi da queste alle librerie del sistema operativo. Il tutto è talmente perfetto che Wine riesce a passare persino il test Windows Genuine Advantage!

Un esempio simile è la possibilità di eseguire programmi per GNU/Linux su un altro sistema operativo simile, ma diverso: FreeBSD. Attraverso l’aggiunta in FreeBSD della libreria C di GNU, possiamo eseguire praticamente qualsiasi programma GNU/Linux su di esso, anche se non è GNU/Linux. Ma esso possiede una delle sue parti fondamentali, ovvero la GNU C Library (oltre, chiaramente, alla libreria C di FreeBSD stesso).

A questo punto qualcuno chiederà:

Ok, a quanto ho capito i programmi scritti con il linguaggio C usano la libreria C. Ma gli altri? So che esistono altri linguaggi come Java….

In realtà, tutti i programmi, a prescindere dal linguaggio in cui sono scritti, dovranno ad un certo punto interagire con il sistema operativo. E lo faranno sempre attraverso la libreria C. Questo perché GNU/Linux è scritto con tale linguaggio. Ma lo stesso vale anche per Windows, le cui librerie fondamentali sono scritte in C (o nella sua variante C++).

Vediamo di spiegare con un esempio questo concetto. Supponiamo che andiate a spedire una raccomandata alle poste. Vi recherete allo sportello e compilerete la richiesta. Tale richiesta verrà poi “lavorata” in parte davanti a voi, in parte “dietro” lo sportello. Lo stesso accade per la comunicazione tra programmi e kernel. La Libreria C si occupa di fornire certe funzioni non comprese nel kernel (come la printf che abbiamo visto), funzioni di livello più alto, ma anche di rendere facile, uniforme e rispondente allo standard di Unix (chiamato POSIX) l’accesso alle funzioni stesse del kernel, cioè le chiamate di sistema.

Immagine
La comunicazione tra programma e kernel

Ecco, il disegno spiega anche un’altra cosa. Il kernel di GNU/Linux è Linux. “Linux”, difatti, non è il nome dell’intero sistema operativo, ma del nucleo, il kernel appunto.

Facciamo un esperimento: proviamo a togliere Glibc. Per farlo, se usiamo Debian o Ubuntu, andiamo su Synaptic e cerchiamo “libc6″. Proviamo a disinstallarla. Come potrete notare, viene giù tutto il sistema operativo. Difatti tutti i programmi chiedono la presenza di Glibc. Ovviamente, annulliamo l’operazione.

Riassumendo, in sostanza, i programmi di norma non “vedono” né “parlano” con il kernel Linux, ma con GNU. E lo stesso facciamo noi utenti. Vediamo perché.

Abbiamo detto che il sistema operativo deve in qualche modo comunicare con l’utente. Il programma che si occupa di questo si chiama shell. In sostanza quando apriamo il terminale, oppure accediamo alla console testuale con ctrl+alt+f1, e vediamo qualcosa che alcuni erroneamente chiamano “dos” perché somiglia al vecchio MS Dos, stiamo usando la shell. La shell dei sistemi GNU/Linux è GNU Bash. Essa ci permette di lanciare i programmi, di vedere il loro output, di fornire degli input al programma (ad esempio la password che ci viene richiesta da sudo).

Infine, abbiamo detto che per poter usare il sistema operativo abbiamo anche bisogno di programmi di utilità, ad esempio per spostare o cancellare i file. Nel caso di GNU/Linux tali programmi sono le utility GNU.

Ok, bello, ma non hai spiegato cosa cavolo è questo GNU!

Eh già, devi scusarmi. In estrema sintesi, GNU (che sta per “GNU is Not Unix) è il nome del sistema operativo iniziato da Richard Stallman nel 1984. Esso nasce con il preciso intento di creare un “clone” di Unix, il sistema operativo usato da università, banche, esercito, per gestire i grandi computer e su cui è nato Internet. All’epoca non esisteva nessun sistema operativo libero (o come si disse in seguito “open source”) e Stallman voleva colmare questa lacuna prendendo a modello il sistema operativo per eccellenza: Unix. Unix è stato il primo sistema operativo moderno. La nascita risale al 1970. Tutti i libri di informatica, quando cercano di definire un sistema operativo, partono sempre da ciò che c’è in Unix. E’ un sistema talmente importante che è stato standardizzato internazionalmente dall’ISO, ma il nome dello standard (POSIX) lo ha dato Stallman. Questo fa capire quanto è importante GNU nella storia dell’informatica.

Agli inizi degli anni ’90 GNU era quasi pronto. Mancava all’appello solo il kernel. Il progetto GNU ci stava lavorando (il loro kernel si chiamava Hurd) ma qualcuno arrivò prima. Questo qualcuno era Linus Torvalds, all’epoca uno studente. Linus aveva un problema: all’università usava Unix (precisamente lo Unix della SUN, che adesso si chiama Solaris), ma a casa non poteva lavorarci perché il suo computer (un allora nuovo 386) non supportava tale sistema. Pensò quindi che ne dovesse creare uno, per divertimento e per studio, e prese a modello una versione didattica di Unix chiamata Minix, scritta da un professore come supporto al suo libro di testo (ancora oggi in uso nelle università: il famoso Tanenbaum). Torvalds creò il suo "mini-sistema", usando il compilatore GNU, la shell GNU e altri pezzi di GNU e scrivendo un kernel da zero per il processore Intel 386. Chiamò il sistema Linux. In quel periodo all’università di Helsinki ascoltò una conferenza sul software libero e GNU e decise che il suo sistema operativo ancora in embrione doveva essere libero. Così rilasciò Linux sotto la stessa licenza di GNU (la General Public License, GPL).

Da quel momento la storia dell’informatica ha avuto una grande accelerazione. Il kernel di Linux, la parte “nuova” che Torvalds aveva creato, venne fusa a GNU, creando un sistema operativo libero, GNU/Linux, che poteva girare sui pc più diffusi dell’epoca, i 386 e 486.

La storia non finisce qui, perché ci sono anche tanti altri pezzi in un sistema operativo GNU/Linux. Ma i pezzi fondamentali sono due: GNU e il kernel Linux. Qualsiasi distribuzione li contiene perché sono la base di tutto. Per questo, che tu stia usando Ubuntu, Debian, Slackware, Red Hat, Suse, o qualsiasi delle centinaia di distribuzioni esistenti, stai sempre usando un sistema GNU con il kernel Linux. GNU/Linux, appunto.

Nei prossimi post parleremo di alcune importanti aggiunte a questo sistema di base: Xorg e gli ambienti desktop come Gnome, kde e xfce.

Domande?

Posso usare GNU senza Linux?

Puoi usare GNU con il kernel Hurd e avrai GNU/Hurd (o semplicemente GNU). Puoi usare GNU con il kernel del sistema Solaris, e avrai GNU/Solaris. Puoi usare GNU con il kernel di FreeBSD e avrai GNU/kFreeBSD. Puoi usare GNU con il kernel di NetBSD e avrai GNU/Netbsd. Il progetto Debian distribuisce alcune versioni di questi sistemi operativi. A parte GNU/Solaris, che è già abbastanza stabile (OpenSolaris e Nexenta sono due esempi), gli altri sono ancora instabili, ma comunque funzionanti, a condizione di aver un hardware compatibile (questi kernel infatti non hanno tutti i driver di cui dispone Linux). Esiste anche GNU/Darwin, una fusione tra GNU e il kernel di Mac Os X, ma è fermo.

E Linux senza GNU?

Anche, ma avrai bisogno di qualcosa che sostituisca GNU. Di solito questo qualcosa è una libreria C ridotta e una shell semplificata con all’interno i comandi basilari. Se hai un router sicuramente esso possiede un sistema del genere.

E se volessi provare Unix?

Ormai da molto tempo non esiste più un solo Unix, ma tanti. Ad esempio Solaris è uno degli Unix. Non ti accorgeresti di grandi differenze rispetto a GNU/Linux. Difatti i comandi sono gli stessi e a volte anche l’interfaccia grafica è la stessa. Ad esempio Solaris usa una versione modificata di Gnome chiamata Java Desktop Enviroment. Ma la versione Open Source (OpenSolaris) usa proprio Gnome. Nexenta, di cui ho parlato prima, è in sostanza Ubuntu ma con il kernel di Solaris invece che con il Kernel Linux.

Ma come è possibile tutto ciò? Ad esempio mica posso mischiare insieme Windows con il Mac… come si fanno a mischiare sistemi operativi diversi?

Ci sono due motivi, uno tecnico l’altro legale. Il motivo tecnico è che tutti questi sistemi sono compatibili tra loro, in quanto appartengono alla famiglia di Unix. Mentre Windows è un sistema a parte, molto diverso. Quindi tecnicamente non è difficile – anzi, in molti casi proprio banale – portare un programma da un sistema all’altro, ed anche interi pezzi del sistema operativo. Il secondo motivo è legale: con il software libero puoi fare quello che vuoi. Prendi un programma e lo metti su un altro sistema operativo. Prendi la shell di GNU e la metti su Solaris, ad esempio. Non ci sono grandi limiti come nel caso delle licenze proprietarie.

Quindi mi stai dicendo che in un certo senso GNU/Linux è Unix anche se GNU vuol dire “Gnu non è Unix”?

Sì, esatto. Il nome è scherzoso: GNU non è Unix ma è comunque un sistema che rispetta lo standard POSIX. I programmi scritti seguendo le regole devinite dallo standard gireranno su tutti i sistemi operativi di tipo Unix. C’è da dire però che UNIX (scritto con le lettere maiuscole) è un marchio registrato, gestito da un consorzio chiamato Opengroup. Per diventare uno UNIX “ufficiale” bisogna pagare la certificazione. Ma questo è davvero poco importante. GNU/Linux, pur senza tale certificazione, è il sistema di tipo Unix di gran lunga più usato di tutti.

Ho sentito dire che Linux è un "kernel monolitico", cosa vuol dire?

E’ un argomento un po’ complesso, ma ne parlerò prima o poi. Per ora basta sapere che un kernel monolitico è fatto da un programma unico, mentre altri tipi di kernel (detti “a microkernel”) sono costruiti “a pezzi” ognuno dei quali si occupa di un problema specifico.
E’ più semplice capire invece perché Linux è un" kernel modulare": in pratica, mentre il sistema funziona, possiamo caricare dei “moduli”. I moduli sono pezzi del kernel che possono essere inseriti mentre il sistema è in esecuzione. Un modulo può essere un driver per una periferica, oppure ad esempio un pezzo che aggiunge una funzione particolare al kernel. Nonostante questo però il kernel rimane un unico programma perché questi moduli vanno ad inserirsi nel kernel mentre è in esecuzione e non sono programmi separati. Un po’ come dire che mentre guidi puoi aggiungere un cilindro al motore, ma il motore è sempre uno solo. ;)

Crescia
Etabeta