Il sistema Linux: principi di progettazione Linux è un sistema multiutente, multitasking dotato di una serie completa di strumenti compatibili con UNIX. Il suo file system concorda con la tradizionale semantica UNIX, e implementa completamente il modello standard di networking di UNIX. I principali obiettivi della progettazione sono la velocità, l’efficienza, la flessibilità e la standardizzazione. Linux è progettato per essere conforme ai documenti POSIX più importanti; alcune distribuzioni di Linux hanno ottenuto la certificazione ufficiale POSIX. L’interfaccia di programmazione di Linux concorda con la semantica UNIX di SVR4, piuttosto che con i dettami della BSD. 1.1 I livelli di un sistema UNIX User Interface 1.2 Componenti di un sistema UNIX Come la maggior parte delle implementazioni di UNIX, Linux è composto da tre blocchi di codice principali: Programmi di utilità standard Libreria standard Kernel I programmi di utilità standard realizzano specifici compiti di gestione. Shell Comandi per la gestione di files e cartelle Filtri Compilatori Editors Comandi per l’amministrazione del sistema … 1.3 La shell di un sistema UNIX I sistemi UNIX hanno una Graphical User Interface (Linux usa KDE, GNOME …), ma i programmatori preferiscono scrivere direttamente i comandi. Shell: il processo utente che esegue i programmi (interprete dei comandi). L’utente digita i comandi. La shell legge i comandi (li legge dallo standard input) e li traduce al sistema operativo. Si possono eseguire programmi esterni (es. netscape) o comandi interni alla shell (es. cd). Sono disponibili vari tipi diversi di shell: Bourne shell (sh), C shell (csh), Korn shell (ksh), TC shell (tcsh), Bourne Again shell (bash). L’amministratore del sistema fornisce all’utente una shell di default, ma l’utente può cambiare tipo di shell. 1.4 La shell di un sistema UNIX Esempi di comandi: $ cd /usr/src/linux $ more COPYING $ cp file1 file2 $ head –20 file $ head 20 file $ ls *.c $ ls [abc]* $ sort < file1 > file2 Stringhe di comandi multipli in uno script di shell: $ sort < file1 > file2; head –30 < file2 ; rm temp $ sort < file | head –30 $ grep org CREDITS | sort | head –20 | tail –5 > file 1.5 La shell è qualcosa di più ... La shell è programmabile, cioè è possibile realizzare degli scripts di shell. Uno shell script è un file contenente una sequenza di comandi indirizzati al sistema operativo che facilita l’esecuzione ripetuta dei comandi contenuti senza bisogno che siano faticosamente riscritti ogni volta che devono essere eseguiti. Se c’è una ben precisa lista ordinata di comandi del sistema operativo che l’utente deve eseguire ripetutamente, ad esempio, subito dopo ogni login o subito prima di ogni logout, allora la maggior parte dei sistemi operativi ha la possibilità di registrare la lista dei comandi in un file, che poi può essere eseguito automaticamente ad ogni login o logout, oppure può essere invocato dall’utente tramite l’esecuzione di un singolo comando che dà luogo all’esecuzione dell’intero contenuto del file, il quale può contenere tanto un solo comando del sistema operativo quanto migliaia. 1.6 Gli scripts di shell Esempio: #!/bin/csh clear echo Menuset stop=1 while ($stop>0) cat << ENDOFMENU 1: stampa data 2: stampa la directory corrente 3: esci ENDOFMENU echo -n Scegli il comando set reply=$< switch ($reply) case 1 : date breaksw case 2 : pwd breaksw case 3 : set stop=0 breaksw default: echo scelta sbagliata riprova breaksw endsw end exit 0 1.7 Programmi di utilità UNIX Alcuni dei più comuni programmi di utilità di UNIX richiesti dallo standard POSIX. 1.8 La libreria standard Una chiamata di sistema (o system call) è il metodo che il processo utente usa per richiedere un’azione al SO. I programmi realizzano le chiamate di sistema per mezzo delle trap. Istruzioni trap: Passa dalla modalità utente alla modalità kernel. Controlla la correttezza dei parametri della chiamata. I comandi sono eseguiti come se fossero direttamente invocati dal sistema operativo. Torna in modalità utente. Poichè è impossibile scrivere una trap in C, viene fornita una libreria standard con una procedura per ogni system call. Queste procedure sono scritte in assembler e vengono richiamate utilizzando codice scritto in C. Ad esempio, un programma C per realizzare la chiamata di sistema read, si appoggia sulla procedura read della libreria standard. Pertanto, la standard library definisce un insieme standard di funzioni tramite le quali le applicazioni interagiscono col kernel; tale insieme di funzioni implementa gran parte delle funzionalità del sistema operativo che così non hanno bisogno di essere richiamate direttamente dal kernel. POSIX stabilisce quali sono le procedure delle librerie che il sistema deve fornire, i loro parametri e i loro compiti. 1.9 Il Kernel Il kernel è responsabile del mantenimento della visione astratta del sistema operativo. Fornisce le principali funzioni della macchina virtuale (system calls, interrupt e traps). Struttura approssimativa di un generico kernel UNIX. 1.10 Il Kernel Il kernel di Linux utilizza un modello monolitico. Non si serve del “più nuovo” modello client-server (cioè micro-kernel). La principale ragione di questa scelta è il miglioramento delle prestazioni. Il codice del kernel viene eseguito in modalità kernel con pieno accesso a tutte le risorse fisiche del calcolatore. Tutto il codice del kernel e i dati sono contenuti in un unico indirizzo di memoria. Sebbene il kernel venga eseguito come un singolo processo con un singolo indirizzo, il kernel di Linux usa la modularità. 1.11 File System I files di Linux sono organizzati secondo una gerarchia di etichette, generalmente nota come una struttura a directories. I files referenziati da queste etichette possono essere di tre tipi: Files ordinari, contenenti una sequenza di bytes che generalmente corrispondono a codice (programmi) o a dati. Files directory, che sono immagazzinati su disco in un formato speciale e costituiscono l’ossatura del file system. Files speciali, che corrispondono a periferiche quali stampanti o dischi. Agli utenti, il file system di Linux appare come un albero di directories gerarchico soddisfacente la semantica UNIX. 1.12 File System / è la directory root; punto di riferimento per tutte le directories. Ogni file possiede un pathname non ambiguo: /home/user1/papers. 1.13 Alcune directories che si trovano nei sistemi UNIX /bin Programmi di sistema essenziali per Linux. /boot Tutti i files richiesti per avviare Linux. /dev Tutti i devices hanno qui i propri files corrispondenti. /etc Tutti i files di configurazione per il diverso software sono immagazzinati qui. E’ quantomai opportuno non mettersi a giocare con questa cartella! /home Tutti gli utenti avranno una directory personale in questa directory. Se la tua id è rossi, la tua directory personale (detta home) sarà probabilmente /home/rossi. /lib Le librerie richieste dalle applicazioni di sistema. (Esattamente come DLL in Windows). /lost+found Quando il controllo del disco trova files che sono danneggiati o che non sono legati ad alcuna directory, essi vengono ripristinati in questa directory. Questi danni sono in gran parte dovuti a uno shutdown non corretto. 1.14 Alcune directories che si trovano nei sistemi UNIX /mnt La directory in cui periferiche e altri file systems vengono montati. /opt La directory in cui è installato software aggiuntivo (optional). /proc proc alloggia uno pseudo-file system. Il suo contenuto in realtà non esiste in alcuna parte del disco, ed è reso disponibile solo quando si entra in questa directory e si consulta qualche file. /root La home per l’amministratore: root. /sbin La directory contenente i programmi dell’amministratore di sistema. /tmp La directory in cui i files temporanei vengono creati e conservati. Tutti gli utenti possono salvare files qui. /usr Tutto ciò che è collegato agli utenti. /var Files il cui contenuto varia frequentemente si trovano in questa directory. 1.15 Alcune directories che si trovano nei sistemi UNIX /usr Tutto ciò che è collegato agli utenti. /usr/bin Contiene programmi degli utenti. /usr/include I files di intestazione richiesti dai programmi per la compilazione. /usr/lib Le librerie richieste dalle applicazioni dell’utente. /usr/local Files specifici di questa particolare macchina. /usr/sbin I programmi dell’utente amministratore. /usr/share Informazioni che possono essere condivise dalla maggior parte degli utenti. /usr/src Il codice sorgente per il kernel di Linux. /usr/X11R6 Files necessari per il sistema X Window. /var Files il cui contenuto varia frequentemente si trovano in questa directory. /var/log I log-files del sistema. /var/spool Directories per mail, news, stampe e altro. 1.16 Montare un file system Separate file systems After mounting Prima del montaggio Dopo il montaggio 1.17