Vai alla Home Page About me Courseware Federica Living Library Federica Federica Podstudio Virtual Campus 3D Le Miniguide all'orientamento Gli eBook di Federica La Corte in Rete
 
I corsi di Scienze Matematiche Fisiche e Naturali
 
Il Corso Le lezioni del Corso La Cattedra
 
Materiali di approfondimento Risorse Web Il Podcast di questa lezione

Clemente Galdi » 1.Introduzione ai sistemi Unix


Struttura dei sistemi Unix

Le definizioni esistenti di sistema operativo sono diverse.

Per kernel del sistema operativo intendiamo la parte più “interna” del sistema operativo che, da un lato, controlla l’hardware su cui e’ in esecuzione e, dall’altro, fornisce ai processi che lo utilizzano servizi per accedere all’hardware sottostante. In senso stretto il sistema operativo coincide con in kernel.
L’accesso ai servizi del kernel avviene attraverso l’invocazione di system call, uno strato software di funzioni che forniscono una interfaccia tra le applicazioni ed il kernel. Le “librerie” di sistema sono basate sulle system call ma le applicazioni possono invocare le funzioni definite librerie o direttamente le system call.

La shell è una applicazione che consente l’interazione tra l’utente ed il sistema operativo.
Una definizione meno restrittiva definisce il sistema operativo l’insieme del kernel e delle applicazioni di “base”, quali compilatori, editor, interfacce utente, utility di sistema etc.
Sebbene sia ampiamente utilizzata la seconda definizione, è bene ricordare che il nome Linux identifica il Kernel del sistema operativo.

Architettura dei sistemi Unix.

Architettura dei sistemi Unix.


Identità ed identificazione

Essendo i sistemi Unix multi-utente, è necessario che forniscano strumenti per la protezione dei dati di un utente dall’accesso non autorizzato di altri utenti. Ad ogni utente è associata una username ed una password che consentono la sua identificazione in una fase iniziale di riconoscimento nota come fase di login.
Le informazioni su tutti gli utenti di un sistema sono contenute, tipicamente, nel file /etc/passwd che, per ogni utente, contiene un record in cui sono memorizzate:

  1. username
  2. password (cifrata)
  3. un id numerico
  4. un identificativo numerico per il gruppo
  5. un commento, utilizzato per il nome
  6. la home directory
  7. la shell utente
  • Una prima variante a questo schema memorizza le password cifrate nel file /etc/shadow pur mantenendo, al posto della password una “x” in passwd.
  • Con l’avvento dei sistemi distribuiti, sono stati sviluppati sistemi di autenticazione più flessibili che, ad esempio, possono non definire utenti “locali” alla macchina ma la gestione degli utenti è demandata ad un server remoto.

Identità ed identificazione (segue)

Dopo aver inserito username e password, il sistema operativo verifica che le informazioni corrispondano a quelle memorizzate (localmente o meno) nel file delle password ed, in caso affermativo, esegue la shell associata alla username presentata.
Una shell è un interprete di righe di comando che legge gli input dell’utente ed esegue comandi. Esistono diverse shell, che si differenziano sostanzialmente per l’interfaccia con l’utente. In molti casi, il sistema esegue una interfaccia grafica da cui è possibile eseguire una o più shell.
La quasi totalità dei sistemi Unix esistenti fornisce agli utenti una interfaccia grafica “user-friendly”. Per ottenere una finestra testuale è sufficiente eseguire una applicazione che prende nomi diversi a seconda del sistema, come ad esempio “Terminal Window” o “xterm”, o piu’ semplicemente “terminal”.

Il filesystem

Il file system di Unix è una disposizione gerarchica di file e directory il cui livello più alto, noto come directory root (o radice), è identificato dal carattere /.
Una directory è un file che contenente directory entries. Ogni entry è’ associata ad un file all’interno della directory e contiene, oltre al nome del file, altre informazioni come ad esempio il tipo di file, (regolare, directory, pipe, etc.), la sua dimensione, una specifica di quali utenti hanno accesso al file, e così via.
In linea di principio, i nomi di file possono essere composti da qualsiasi sequenza di caratteri che non contenga il carattere / od il carattere nullo. In realtà, si restringe in charset utilizzabile ad un sottoinsieme dei soli caratteri “visualizzabili”.
Quando viene creata una nuova directory, vengono automaticamente create al suo interno due “sottodirectory” speciali chiamate . (punto) e .. (punto-punto).
La prima è un riferimento alla directory corrente mentre la seconda è un puntatore alla directory padre. L’utilità di queste due directory speciali sta nel fatto che consentono di definire percorsi “relativi” all’interno del filesystem.
Ad ogni processo è sempre assegnata una “directory corrente”, che indica la directory in cui il processo opera di default.
Come abbiamo visto, il file passwd contiene la “home directory” di ogni utente che indica la directory corrente utilizzata dalla shell all’atto del login.
La directory corrente può essere modificata utilizzando il comando shell cd o la system call chdir.

Struttura del filesystem Unix

Tutte le varianti dei sistemi Unix, implementano I seguenti criteri per definire la topologia del proprio file system:
Per ogni processo esiste un’unica root directory. Tutte le altre directory sono discendenti dell’unica root presente. In genere tutti i processi condividono la stessa directory radice. La struttura definita dalle directory, quindi, è “simile” ad un albero.
È possibile, come vedremo, creare collegamenti tra diversi rami dell’albero. La struttura reale è, quindi, un grafo.
In Unix, a differenza di Windows, non esiste il concetto di “disco”. La radice del filesystem presente su un disco viene connessa all’unico filesystem presente sul sistema diventando sottodirectory di una directory presente.

Struttura di un file system di Unix.

Struttura di un file system di Unix.


Struttura del filesystem Unix (segue)

Esistono directory di sistema, sottodirectory della root, che si ritrovano in tutti i sistemi Unix-like:

  • bin: file eseguibili tipicamente da tutti gli utenti;
  • dev: file speciali associati ai device;
  • etc: file di configurazione;
  • home: Ogni sistema unix ha, in genere una directory che contiene le home directory degli utenti. In Linux il nome di questa directory è home;
  • sbin: file eseguibili tipicamente eseguibili dall’amministratore di sistema;
  • tmp: utilizzata per la memorizzazione di file temporanei dalla quasi totalità delle applicazioni di sistema;
  • var: utilizzata per il logging e lo spooling.

Pathname assoluti e relativi

Una sequenza di uno o più filename divisi da / definisce un pathname. Un pathname che inizia per / è detto assoluto, altrimenti è detto relativo.
Un pathname assoluto identifica il percorso per raggiungere il file, partendo dalla root del filesystem. Affinché il pathname corrisponda ad un file è necessario che i filename compresi tra il primo e l’ultimo “/” devono corrispondere a directory. Ad esempio: la stringa “/home/lso/lezione1.ppt” corrisponde ad un pathname corretto se:

  • home è una directory contenuta nella directory root;
  • lso è una directory contenuta della directory /home;
  • lezione1.ppt è un file (di qualsiasi tipo) contenuto all’interno della directory /home/lso

Un pathname relativo identifica il file a partire dalla directory corrente. Ad esempio, il pathname “lso/lezione1.ppt” corrisponde ad un file se:

  • lso è una directory contenuta nella directory corrente;
  • lezione1.ppt è contenuta nella directory lso.

Protezione di file e directory

I sistemi Unix consentono la protezione delle directory e dei file in esse contenuti attraverso il seguente sistema:

  • Ad ogni file (sia esso un file “regolare”, una directory, etc.), il sistema associa una serie di attributi tra cui:
    • Nome del proprietario
    • Nome del gruppo di appartenenza
    • Tipo di file
    • Dimensione
    • Permessi di accesso al file
    • Un indirizzo ai blocchi del disco su cui è memorizzato il contenuto del file.
  • I permessi di accesso al file sono descritti da tre triple di attributi di protezione. Ogni tripla consiste di tre flag:
      • Accesso in lettura, flag “r”
      • Accesso in scrittura, flag “w”
      • Accesso in esecuzione, flag “x”
    • La prima tripla descrive I permessi di accesso del proprietario del file;
    • La seconda tripla descrive I permessi di accesso degli utenti appartenenti allo stesso gruppo cui appartiene il file;
    • La terza tripla descrive I permessi di accesso degli utenti che non sono né proprietario né appartengono allo stesso gruppo del file. Quest’ultima categoria di utenti è indicata con il nome di “altri”.

Protezione di file e directory (segue)

Per visualizzare le informazioni associate ad un file od una directory è possibile utilizzare il comando “ls”, specificando l’opzione “-l”. Un esempio di output è riportato di seguito.

-rw-rw-r-- 1 lso users 591 2009-12-10 10:16 a.txt
-rwxr-xr-x 1 lso users 396 2009-12-12 18:07 b.sh
drwxr-xr-x 2 lso users 48 2009-11-22 16:22 TEST

L’esempio mostra l’elenco dei tre file contenuti “ls -l”.
Le informazioni riguardanti ogni singolo file vengono riportate sulla stessa riga.
La prima colonna identifica il tipo di file e le protezioni.
La seconda colonna indica il numero di link a quel file.
La terza colonna riporta il nome del proprietario del file (lso in tutti I casi).
La quarta colonna indica il nome del gruppo (users in tutti I casi).
La quinta colonna indica la dimensione del file.
La sesta e la settima colonna indicano, rispettivamente, la data e l’ora di ultima modifica del file.
L’ultima colonna riporta il nome del file.

Protezione di file e directory (segue)

Analizziamo in particolare la prima colonna:

-rwxrw-r-- 1 lso users 591 2009-12-10 10:16 a.txt
-rwxr-xr-x 1 lso users 396 2009-12-12 18:07 b.sh
drwxr-xr-x 2 lso users 48 2009-11-22 16:22 TEST

La prima colonna consiste di 10 caratteri.

  • Il primo carattere identifica il tipo di file attraverso la seguente convenzione: [d] directory; [-] file regolare; [l] link; [s] socket; [p] named pipe; [c] characted device; [b] block device.
    • Quindi, nell’esempio “TEST” è una sottodirectory della directory in cui è stato eseguito il comando ls, mentre “a.txt” e “b.sh” sono file detti “regolari”.

Protezione di file e directory (segue)

Analizziamo in particolare la prima colonna:

-rwxrw-r-- 1 lso users 591 2009-12-10 10:16 a.txt
-rwxr-xr-x 1 lso users 396 2009-12-12 18:07 b.sh
drwxr-xr-x 2 lso users 48 2009-11-22 16:22 TEST

I 9 caratteri successivi identificano le protezioni.

  • Come già accennato, vengono suddivisi in tre gruppi da tre caratteri, partendo dal carattere più a sinistra.
  • I primi 3 caratteri descrivono I flag di accesso del proprietario.
    • Nel caso del file a.txt la prima tripla (rwx) consente al proprietario, l’utente lso, l’accesso in lettura “r”, in scrittura “w” ed in esecuzione “x”.
  • I successivi 3 caratteri descrivono I flag di accesso per il gruppo..
    • Nel caso del file a.txt la seconda tripla (rw-) consente ai componenti del gruppo users l’accesso in lettura “r”, in scrittura “w”. Visto che il terzo carattere è “-”, questi utenti NON possono eseguire il file.
  • Gli ultimi 3 caratteri descrivono I flag di accesso per gli “altri”.
    • Nel caso del file a.txt la terza tripla (r–) consente agli utenti che non sono proprietario e che non appartengono al gruppo users il solo permessi di leggere il file.

Protezione di file e directory (segue)

Il significato del flag di protezione assumono un significato leggermente diverso per le directory.

  • Il flag “r” associato ad una directory consente di “leggere l’elenco dei nomi dei file in essa contenuto”.
    • L’assenza del flag “r” NON impedisce che sia possibile leggere l’elenco dei file in una sua sottodirectory. Ad esempio. Si assuma che
      • Le protezioni per la directory A sono d–x–x–x
      • Le protezioni per la directory B, sottodirectory di A, sono drwx——
      • In questo caso, sebbene non sia possibile elencare i nomi dei file nella directory A, il proprietario di B può elencare i nomi dei file in B (a condizione che conosca il pathname della directory B).
  • Il flag “w” associato ad una directory consente di “modificare l’elenco dei file in essa contenuti”.
    • È possibile, cioè, creare e/o cancellare file nella directory.
    • La protezione del contenuto dei file e’ demandata alle protezione associate ai singoli file.
      • È possibile, ad esempio, cancellare un file a cui non si ha accesso in scrittura.
    • Si noti che l’assenza della protezione in scrittura in una directory NON impedisce la modifica di una sua sottodirectory, I.e., non impedisce che vengano creati o cancellati file in una sottodirectory, se per quest’ultima è settato il flag “w” per l’utente che richiede la modifica.

Protezione di file e directory (segue)

Il flag “x” associato ad una directory consente di “accedere ai file in essa contenuti”.
Per “accedere” si intende qualsiasi tipo di accesso, I.e., lettura, scrittura ed esecuzione.

  • Si noti che ottenere informazioni sul file (proprietario, gruppo, dimensione etc.) richiede “l’accesso” al file.

L’assenza del flag “x”, ad una directory, quindi, rende l’accesso a tutti I file contenuti nell’intero “sotto-albero” in essa radicato in molti casi inutilizzabile.

  • Per comprendere l’impatto di questo flag sull’accessibilità, si tenga conto che per risolvere un pathname del tipo A/B/C… il sistema operativo:
    • “accede” alla directory A, ricercando il “file” B e verifica che sia una directory
    • “accede” alla directory B, ricercando il “file” C e verifica che sia una directory, e così via.
    • L’assenza del flag “x” in una delle directory nel path, impedisce la terminazione del processo di risoluzione.

È errore comune modificare le protezioni di una directory non settando il flag x almeno per il proprietario.
Si noti che è possibile impostare per una directory I permessi –x–x–x. In questo caso:

  • Il sistema operativo impedisce di leggere l’elenco dei file contenuti nella directory;
  • Consente di “accedere” ai file in essa contenuti (a patto di conoscere il nome del file).

Manipolazione di file e directory

Di seguito riportiamo alcuni comandi unix per la manipolazione di file e directory. Per ognuno dei comandi unix è sempre possibile ottenere un help attraverso il comando man, utilizzando la sintassi man comando.

  • cat: visualizza il contenuto di un file di testo
  • cd: modifica la directory corrente
  • chmod: modifica le protezioni per un file od una directory.
  • chown: modifica il proprietario di un file.
  • chgrp: modifica il gruppo di un file
  • cp: crea una copia di un file
  • file: visualizza il tipo di file
  • head: visualizza le prime righe di un file
  • ls: elenca I file in una directory
  • mkdir: crea una directory
  • mv: sposta un afile
  • pwd: visualizza la directory corrente
  • rm: cancella un file
  • rmdir: cancella una directory

Input/Output, programmi e processi

Le operazioni di I/O sono precedute dall’apertura di un canale di comunicazione.
Nei sistemi Unix tutto può essere visto come un file. Il sistema operativo fornisce una interfaccia uniforme per l’accesso ai file su disco, ai device, ai canali di comunicazione tra processi sullo stesso calcolatore/su calcolatori diversi.
Ad ogni “file” viene associato un file descriptor, un interno non negativo, che viene utilizzato dal processo per leggere e/o scrivere dal file.
Per convenzione tutte le shell aprono sempre tre canali di comunicazione noti come standard input, standard output e standard error, associati rispettivamente ai file descriptor 0, 1 e 2. Per default, questi tre canali sono sempre associati al terminale corrente, I.e. lo standard input corrisponde alla “tastiera”, gli standard output ed error alla “finestra” associata alla shell.
È possibile modificare l’associazione di questi file descriptor “redirigendoli” su altri file (siano essi file su disco, device o canali di comunicazione).\
Un programma è un file “eseguibile” su disco.
Un processo è un programma in esecuzione.
Ad ogni processo il kernel assegna un identificativo univoco noto come Processi Identifier o PID.

Processi interattivi ed in background

I processi possono essere eseguiti in due modalità:

  • Interattiva o foreground: Quando un processo viene eseguito prende il controllo del terminale in cui è stato lanciato.
    • I processi possono richiedere input all’utente e visualizzare l’output a video.
  • Background: Un processo può essere lanciato in modalità non interattiva. In questo caso, l’I/O viene effettuato da file.
    • Per eseguire un processo in background è sufficiente aggiungere il carattere “&” alla fine della riga di invocazione del comando.

Un processo in foreground può essere sospeso utilizzando la combinazione di tasti CTRL+Z.

  • La shell ritorna al prompt dei comandi.
  • È possibile far “ripartire” il processo:
    • In modalità interattiva utilizzando il comando “fg” (foreground)
    • In modalità non interattiva utilizzando il comando “bg” (background). In questo caso, il processo non può ricevere input dal terminale ma, se l’output non era stato “rediretto” in precedenza, continua a visualizzare messaggi a video.

Un processo In foreground può essere terminato utilizzando la combinazione di tasti CTRL-C

Visualizzazione e terminazione di processi

Per visualizzare I processi in esecuzione è possibile utilizzare il comando ps.

  • Senza opzioni, il comando visualizza l’elenco dei processi creati dal “terminale” in cui viene lanciato.
  • Tipicamente (e specialmente nei sistemi che forniscono all’utente una interfaccia grafica), un utente è proprietario di processi che NON sono stati generati dal terminale corrente.
  • Il comando ps consente di visualizzare TUTTI I processi di un utente utilizzando opportune opzioni. La sintassi del comando in questo caso può variare leggermente, a seconda dello specifico sistema unix su cui viene eseguito.

Il comando pstree consente di visualizzare tutti I processi dell’utente che lo esegue, sotto forma di “albero”. Un processo A è figlio di un processo B nell’albero se A è stato creato dal processo B.
Per terminare un processo in esecuzione è possibile utilizzare il comando kill specificando il pid del processo da terminare.

  • Il comando kill invia al processo indicato il “segnale” TERM che, come vedremo, se non intercettato, provoca la terminazione del processo.
  • Per essere certi che il processo venga terminato, è possibile inviare il segnale KILL utilizzando la seguente sintassi: kill -KILL pid.

I materiali di supporto della lezione

Introduction to linux: A hands on guide. Capitoli 1-4

  • Contenuti protetti da Creative Commons
  • Feed RSS
  • Condividi su FriendFeed
  • Condividi su Facebook
  • Segnala su Twitter
  • Condividi su LinkedIn
Progetto "Campus Virtuale" dell'Università degli Studi di Napoli Federico II, realizzato con il cofinanziamento dell'Unione europea. Asse V - Società dell'informazione - Obiettivo Operativo 5.1 e-Government ed e-Inclusion