Ho tradotto queste frasi da Linux.History, la traduzione non è letterale ma
tende a far capire il significato generale del discorso, chi fosse
interessato a leggere l'originale, può dare un occhiata sul primo cd
dell'infomagic (Slakware Novembre) al file
/docs/tsx11/Linux-history
In un messaggio del 30 Luglio 1992 Duperval Laurent scriveva a
Linus Torvalds:
DL> Nessuno ha ancora risposto: Quand'è il compleanno di Linux?
DL> Dobbiamo Fare una Festa!!!!!!!!!
LT> Sinceramente non mi ricordo, e non mantengo un diario, quindi
LT> Non ti so dire esattamente quando Linux è nato.
LT> Tuttavia la tua domanda mi ha incuriosito, così ho fatto un
LT> giro per gli archivi di comp.os.minix (Dove ho annunciato tempo
LT> fa la nascita di Linux) e questo è quanto ne è venuto fuori
LT> (Più ovviamente qualche linea di commento):
In un messaggio del 3 Luglio 1991 Linus Benedict Torvalds ha scritto
a proposito di Gcc-1.40 and a posix-question:
LT> Hello netlanders
LT> C'è un progetto su cui sto lavorando (in minix), sono interessato
LT> alla definizione dello standard Posix. Qualcuno potrebbe gentilmente
LT> darmi le coordinate di dove si possono reperire (preferibilmente in
LT> formato elettronico) le ultime informazioni riguardanti posix?
LT> Siti Ftp sarebbero graditi.
Il progetto era ovviamente Linux, così probabilmente il 3 Luglio 1991
ho cominciato a pensare di arrivare al livello attuale: qualche driver
era pronto e l'hard disk funzionava, non c'era molto altro.
[...........]
In un messaggio del 25 Agosto 1991 Linus Benedict Torvalds scriveva a
proposito di What would you like to see most in minix?
LT> Hello everybody out there using minix
LT> Sto costruendo un nuovo (free) sistema operativo, (lo sto facendo
LT> per hobby, non deve essere grande e professionale come gnu) per
LT> 386(486)AT clones. È stato messo in preparazione fin da Aprile,
LT> e adesso è pronto a comiciare a lavorare. Vorrei avere qualsiasi
LT> tipo di feedback su cosa la gente ama/non ama in minix, così che
LT> il mio OS gli assomigli in qualcosa e ne migliori alcuni aspetti
LT> Attualmente ho effettuato il porting della bash (1.08) e del
LT> gcc (1.40), e sembra che le cose funzionino...
Questi praticamente gli albori di Linux, il resto è abbastanza conosciuto, Linux si raffinò e continuò ad evolversi anche attraverso l'intervento di molti e molti sviluppatori, fino a raggiungere lo standard qualitativo attuale.
Eppure la filosofia e lo sviluppo quasi pionieristico di questo OS non è mutato, ancora oggi esso è free e viene sviluppato solo grazie alla passione, trovando il suo naturale ambiente di sviluppo nei meandri di internet.
Un po' come agli albori di UNIX quando un manipolo di progettisti fuori da ogni convenzione diede vita al C e UNIX, che poi dovevano diventare i pilastri dell'attuale mondo informatico.
(Molte di queste info sono reperibili su ``La grande Guida Unix'' della Jackson)
Linux è un clone di Unix e quindi esso riflette tutte le caratteristiche di un moderno unix, incluso multitasking, memoria virtuale, librerie condivise, paginazione su domanda, tcp-ip etc. etc., ma non sono attualmente queste caratteristiche interne al sistema che ci devono interessare quanto piuttosto, la filosofia e i concetti generali su cui Linux si basa.
Linux è stato sviluppato pensando innanzitutto che il tempo del computer è più economico del tempo delle persone, quindi naturalmente tutta le utility e/o i comandi e i programmi riflettono questa intenzione.
La filosofia di Linux è che è meglio spendere 5 minuti per far partire un programma che richiede 3 ore di esecuzione piuttosto che far eseguire il programma in un ora e mezza ma dover interagire con il sistema ogni 15 minuti.
Molti dei miei amici spesso rimangono sbigottiti di fronte alla lunghezza o alla complessita di una riga di comando Linux, spesso composta da molti comandi uniti tra loro da pipeline, o eseguiti in successione separati da punto e virgola e che prendono il loro input dall'output del precedente e cosi via, (non spaventatevi se non vi è tutto chiaro subito, ne parleremo da qui a breve), senza rendersi conto invece di questa intuizione dei suoi progettisti.
La natura non interattiva di molte utility, rende inoltre più semplici la creazione di programmi grandi e complessi come combinazione di numerose piccole utility. La maggior parte dei programmi possono essere richiamati a linea di comando specificando numerose opzioni di esecuzione, cosi che l'utente non debba poi rispondere a numerose domande (rendendo così minima l'interazione con il sistema). In alternativa, proprio questa caratteristica vi consentirà di creare interfacce semplici ed amichevoli, usando ad esempio la shell di Linux e connettendo i programmi fra di loro tramite semplici pipeline o redirezioni dell'I/O.
In altre parole da un lato si cerca la minima interazione dell'uomo in un processo macchina, dall'altro la possibilità per lo sviluppatore di riprogrammare il proprio sistema secondo la proprie caratteristiche, o le caratteristiche dell'utente.
La prima regola da osservare è proprio questa: sotto Linux tutto è riprogrammabile, riscrivibile, configurabile ed estremamente flessibile. Potete, volendo, riscrivere completamente il vostro OS adattandolo alle vostre necessità pur rimanendo conforme alle caratteristiche del sistema.
I programmi Linux sono silenziosi, finché non incontrano degli errori. Questo consente di non affollare il terminale dell'utente con messaggi di stato e commenti, che sarebbero comunque ignorati. Un dialogo noioso fa perdere tempo e non aiuta a costruire le pipeline.
Un buon programma Linux fa il massimo uso delle risorse disponibili. Sin dall'inizio la filosofia dei sistemi *nix fu quella di utilizzare macchine anche poco costose per più di un utente, e questo vale ancora di più per Linux che nasce apposta per lavorare anche su home computer.
Il sistema operativo è costituito da un sistema di base (kernel) e di un certo numero di estensioni. Il sistema di base comprende ad esempio il kernel, la shell e le utility di base. Le estensioni sono ad esempio l'estensione grafica, le librerie, il compilatore etc. etc.
In realtà distinguere fra sistema operativo e le sue estensioni non è un compito facile, perché tutto in Linux collabora così strettamente con il sistema di base che sembra essere messo lì apposta per sviluppare l'OS a proprio piacimento, in realtà una mia idea è che tutto Linux possa essere considerato come un enorme ambiente di sviluppo.
Il kernel è il cuore del sistema, tanto che la sua ricompilazione è fondamentale per il supporto delle periferiche. Anche il kernel come tutto in Linux può essere personalizzato ed adattato alle esigenze del proprio HardWare.
Inoltre essendo Linux un sistema operativo che sfrutta la protezione, tutte le operazioni di programmazione devono passare attraverso il kernel, non che non sia possibile anche fare programmazione di più basso livello, diciamo solo che non è consigliabile e che sfugge alle normali regole dell'OS.
Linux rappresenta un dispositivo fisico come un file speciale.
Come un qualsiasi altro file, un file speciale è rappresentato
tramite un elemento di una directory, tipicamente /dev
.
Allocando un elemento in una directory per rappresentare un file, Linux consente agli utenti di definire il nome che rappresenterà il dispositivo; al contrario di alcuni sistemi operativi, non ci sono nomi riservati, definiti nel sistema dedicati ai dispositivi.
I dispositivi, (e quindi i file speciali) sono divisi in due categorie principali; carattere e blocco. Come è naturale un dispositivo a carattere legge e scrive sequenze di caratteri. I terminali sono ovviamente dispositivi a carattere. Un dispositivo a blocchi legge e scrive dati in blocchi di dimensioni predefinite. Un drive o un disco fisso deve essere accessibile sia come dispositivo a caratteri che a blocchi.
Esistono poi dei dispositivi speciali, come ad esempio /dev/null
che funziona praticamente come un enorme buco nero, tutto ciò che viene
scritto in /dev/null
scompare immediatamente.
Faremo poi in seguito un elenco dei file speciali.
Il file system di Linux è gestito in maniera gerarchica,
La directory principale è /
, /
può contenere
delle directory figlio e dei file, a loro volta le directory
figlio possono contenere file o directory.
Ciascuna directory contiene almeno due elementi ``.
'' e ``..
''
L'elemento ``.
'' si riferisce alla dir corrente e ``..
'' invece si
riferisce alla directory precedente.
Ciascun file è identificato univocamente da un path (percorso),
il percorso può essere assoluto o relativo, se comincia con
``/
'' è un percorso assoluto (fa riferimento alla radice),
altrimenti è un percorso relativo, (fa riferimento alla
directory corrente).
Il simbolo ``/
'' funziona anche da separatore tra le dir. Ad
esempio, per indicare il file fabio.tmp
contenuto nella directory
spool
della directory var
che a sua volta è contenuta nella
radice, si indica con /var/spool/fabio.tmp
.
I nomi di file e delle directory possono avere una lunghezza
fino a 255 caratteri e una o più estensioni (fanno parte dei
255 caratteri). Ad esempio non c'e' niente di male ad indicare
un nome di file come segue: questo.file.contiene.un.esempio
si possono usare all'interno del nome praticamente tutti i caratteri
escluso il simbolo ``~
'' e ``/
''.
Esistono poi tre file speciali, stdin, stdout, stderr, ovvero standard input, standard output, standard error. Se nessun input o output è definito diversamente, per default lo standard input è associato alla tastiera, lo standard output e lo standard error al video. Prima che cominci l'esecuzione di qualsiasi programma, la shell apre questi tre file in ordine, prima lo standard input, poi lo standard output e infine lo standard error. Per questo motivo associato a stdin c'è lo 0, ad stdout l'1 a stderror il 2. Questi file sono lo standard ma il sistema fornisce la redirezione dell'input e dell'output in modo ad esempio che l'output di un programma corrisponda all'input per un altro.
La shell (le shell) possono essere assimilate al command.com
del
dos ma con funzioni estremamente potenziate e possibilità di
programmazione.
Una linea di comando prevede il nome del comando richiesto
seguito da una serie di opzioni o argomenti.
Più comandi possono essere eseguiti su un unica linea purché
separati da un ``;
'', i comandi così separati vengono eseguiti
nell'ordine in cui sono scritti.
Un secondo modo di usare la riga di comando è quello della pipeline, ovvero
il simbolo ``|
'' che ha la funziona di redirigere l'output del primo
comando come input del secondo. Ad esempio
``cat indice|grep fabio
'' compie le seguenti operazioni:
cat indice
ha come output il contenuto del file indice, tale
output è l'input per il comandogrep fabio
che ricerca all'interno del suo input la stringa fabio
e la stampa su stdoutesistono altri operatori di redirezione di cui ci occuperemo in seguito.
Gli script sono un insieme di comandi riuniti in unico file. ad esempio il file stampa.prova potrebbe contenere le seguenti istruzioni
echo "Questa è una prova di stampa"
ls -l
digitando ``sh stampa.prova
'' otterei come risultato
Questa è una prova di stampa
total 454
drwxr-xr-x 2 root bin 2048 Jan 8 11:32 bin/
drwxr-xr-x 2 root root 1024 Jan 4 21:36 boot/
drwxr-xr-x 15 root bin 4096 Nov 20 20:26 cdrom/
drwxr-xr-x 3 root root 11264 Jan 9 12:17 dev/
drwxr-xr-x 25 root root 16384 Jan 1 1970 dosd/
drwxr-xr-x 12 root root 2048 Jan 9 12:18 etc/
drwxr-xr-x 6 root root 1024 Jan 5 22:19 home/
drwxr-xr-x 2 root root 1024 Jan 4 21:47 lib/
drwxr-xr-x 2 root root 12288 Jan 4 21:33 lost+found/
drwxr-xr-x 2 root root 1024 Sep 4 20:32 mnt/
drwxr-xr-x 2 root wheel 1024 Jan 8 16:40 nls/
dr-xr-xr-x 4 root root 0 Jan 9 12:17 proc/
drwxr-x--x 4 root root 1024 Jan 8 16:56 root/
drwxr-xr-x 2 root bin 2048 Jan 4 21:54 sbin/
drwxr-xr-x 2 root root 1024 Jan 4 21:36 shlib/
drwxrwxrwt 2 root root 2048 Jan 9 15:16 tmp/
drwxr-xr-x 17 root root 1024 Jan 8 16:45 usr/
drwxr-xr-x 13 root root 1024 Jan 8 16:45 var/
-r-------- 1 root root 399388 Jan 4 21:36 vmlinuz
Un altro modo per eseguire stampa.prova
sarebbe renderlo eseguibile
cambiando i suoi permessi:
chmod 755 stampa.prova
Di come funzionano i permessi di un file ne parleremo in seguito.