Home / Indice sezione
 www.icosaedro.it 

 Ripasso Unix - Lezione 1 - File system

Indice

1. Login
2. Eventi conseguenti al login:
3. Info telegrafiche su Bash
4. File di testo ASCII
5. File di testo ASCII-esteso
6. File di testo Unicode e UTF-8
7. Creare, editare e visualizzare file di testo
8. File System
9. Directory
10. Impostare i permessi e le altre proprietà degli inode dei file e delle directory
11. Navigare nel file system
12. Orientarsi nel file system
13. Trovare file e comandi
14. Esercizio riepilogativo
Bibliografia

1. Login

Lo scopo del login è di autenticare l'utente attraverso un certo dispositivo di accesso (terminale) e di metterlo in condizioni di interagire con il sistema (shell a linea di comando o shell grafica).

Tipi di terminali:

Tipo Descrizione Periodo storico di utilizzo
Pannello di controllo Interruttori, bottoni e lucette varie Anni '50 e primi anni '60
Perforatore di schede Sistema per la perforazione di schede di Hollerith a 80 colonne, una riga per scheda Dalla fine dell'800 al 1986 (visto coi miei occhi)
Console del computer Solo i primi mini e personal computer degli anni '70 disponevano di una scheda video e di un monitor, con un formato che poteva andare da 40x24 fino a 80x25 Dagli anni '70 ad oggi
Telescrivente Tastiera + stampante collegati via seriale a 300 b/s al computer Anni '60 e '70
Videoterminale Tastiera + schermo CRT collegati via seriale 300-19200 b/s al computer; il più famoso è il "VT100" di DEC (Data Equipment Corp.): molti programmi terminale di oggi ne supportano l'emulazione Dagli anni '70 ad oggi
Workstation grafica Ovvero, costoso computer dotato di costoso monitor grafico, sacrificato alla sola funzione di terminale grafico di un computer centrale. Solo alla fine degli anni '80, con l'affermazione del protocollo X Window, sui sistemi Unix è diventato disponibile un sistema per terminale grafico accessibile via rete Dalla fine degli anni '80 ad oggi
Telnet ed emulatore terminale Console, videoterminale o finestra (xterm) utilizzati per emulare un terminale di un computer remoto accessibile via protocollo IP, più modernamente sostituito dal protocollo SSH crittato Dai primi anni `60 ad oggi

2. Eventi conseguenti al login:

- il nome utente e la password vengono confrontati con i dati memorizzati dal computer (per l'esattezza, in /etc/passwd e in /etc/shadow) e, se non corrispondo (nome o password errati) l'accesso viene negato;

- il processo che gestisce il login richiama lo shell scelto dall'utente (con chsh) e riportato in /etc/passwd, ultimo campo;

- la directory corrente viene impostata su /home/pippo, che è lo spazio di lavoro normale dell'utente pippo; nel caso di root, la home dir. è invece /root.

- lo shell (facciamo contro che sia bash) esegue /home/pippo/.bash_profile e /home/pippo/.bashrc in questo ordine (se presenti) e quindi presenta il prompt "$" in attesa di comandi;

- l'utente termina la sessione con il comando "logout" oppure "exit".

3. Info telegrafiche su Bash

- Opera per linee: fintanto che non si preme Return o Enter, nulla viene eseguito.

- Si possono usare i tasti delle frecce sx/dx per posizionare il cursore, Del o CTRL-H per cancellare.

- I tasti freccia-su e freccia-giù per navigare nello storico dei comandi.

- Il tasto "Tab" per l'auto-completamento di comandi e nomi di file.

- Una volta premuto Enter, lo shell scompone la riga in parole: i caratteri separatori validi sono lo spazio e il tabulatore. Due o più spazi valgono come un separatore.

- La prima parola viene considerata come nome di comando, le eventuali altre parole come parametri da passare al comando.

- Per inserire spazi o altri caratteri strani nei parametri, delimitare tali parametri con le virgolette doppie ".

- Sequenze lunghe di comandi si possono mettere in un file di testo esattamente come le si batterebbe da tastiera ed eseguite con il comando

source nomefile
- Come fa Bash a trovare il comando? Si possono usare pathfile assoluti o relativi, altrimenti Bash si basa sul contenuto della variabile d'ambiente PATH (echo $PATH per vederne il valore corrente).

- E' possibile creare propri comandi e metterli ad esempio in /home/pippo/bin; poi conviene aggiungere questo path a quelli predefiniti mettendo in .bashrc:

export PATH=/home/pippo/bin:$PATH
Per vedere subito l'effetto di questo comando, impartirlo anche da prompt, oppure eseguire .bashrc, oppure ri-eseguire il login.

Per una panoramica sul linguaggio Bash, vedi anche l'articolo Bash.

4. File di testo ASCII

Usa 7 bit per byte, quindi l'ottavo bit viene sprecato.
  0 16 32 48 64 80 96 112
0 NUL DLE SP 0 @ P ` p
1 SOH DC1 ! 1 A Q a q
2 STX DC2 " 2 B R b r
3 ETX DC3 # 3 C S c s
4 EOT DC4 $ 4 D T d t
5 ENQ NAK % 5 E U e u
6 ACK SYN & 6 F V f v
7 BEL ETB ' 7 G W g w
8 BS CAN ( 8 H X h x
9 HT EM ) 9 I Y i y
10 LF SUB * : J Z j z
11 VT ESC + ; K [ k {
12 FF FS , < L \ l |
13 CR GS - = M ] m }
14 SO RS . > N ^ n ~
15 SI US / ? O _ o DEL
Tabella 1. Codici ASCII.

Osserviamo che la tabella ha 8 colonne per 16 righe, per un totale di 128 caselle e altrettanti simboli: è esattamente quello che ci dobbiamo aspettare con un codice ad 7 bit: infatti 27=128. Il codice decimale di un simbolo si ottiene sommando i numeri in grigio al cui incrocio si trova il simbolo. Ad esempio, il codice ASCII decimale della lettera A è 1+64=65.

Non tutti i simboli producono la scrittura di un carattere sulla carta (o sullo schermo): alcuni codici sono speciali e sono detti codici di controllo. I codici di controllo sono indicati con una sigla a due o tre lettere in corsivo. I codici di controllo occupano le prime 32 posizioni e l'ultima. Non tutti questi codici hanno conservato il significato originario che avevano nelle telescriventi, ma alcuni di essi sì: vediamo i principali usati ancora oggi:

NUL (0) - Il codice di controllo nullo non aveva effetto sulle telescriventi. La libreria standard del C, a fondamento del sistema UNIX e quindi anche di GNU/Linux, lo usa per marcare la fine delle stringhe nella loro rappresentazione in memoria.

BEL (7) - Il codice di controllo che nelle telescriventi azionava il campanello per produrre un sonoro "diiiinnnng". Oggi produce uno stridulo bip emesso dal buzzer piezoelettrico incorporato nei cabinet dei computer. In entrambi i casi serve per attirare l'attenzione dell'operatore su qualche evento inconsueto.

BS (8) - Il back space produceva lo spostamento della testina di stampa della telescrivente a sinistra di un carattere; spesso veniva utilizzato per eseguire il grassetto stampando una lettera, il BS, e quindi di nuovo la stessa lettera sopra la stampata precedente. Incredibile ma vero, viene usato ancora oggi con lo stesso significato: prova a dare il comando man ls | cat -vt: tutti quei ^H sono i caratteri BS usati per rendere il grassetto della man page!

HT (9) - L'horizontal tabulation comandava lo spostamento della testina di stampa all'inizio del successivo campo, esattamente quello che fa oggi sui nostri terminali. La larghezza dei campi è di solito 8 caratteri.

FF (12) - Il form feed produceva lo scorrimento della carta in modulo continuo fino a portare la testina di stampa sulla prima riga del foglio seguente. Oggi produce la cancellazione dello schermo e il posizionamento del cursore in alto a sinistra.

CR (13) - Il carriage return forzava la testina di stampa a scorrere fino al margine sinistro, posizionandosi quindi in corrispondenza del primo carattere della riga. Idem sui videoterminali moderni.

ESC (27) - Il codice di escape ha un pò il ruolo di jolly, e precede tipicamente una sequenza di caratteri che vengono interpretati in modo speciale dalla telescrivente piuttosto che essere stampati. Le sequenze di escape, così come vengono chiamate ancora oggi, sono largamente utilizzate per comandare terminali, stampanti, e come codici generati dalla pressione di certi tasti speciali.

SP (32) - Lo space non è un carattere di controllo, ma semplicemente lo spazio. Si tratta di un carattere "stampabile" come gli altri, con la particolarità che non lascia alcuna traccia sulla carta o sullo schermo, ma ha il solo effetto di spostare la testina di stampa o il cursore.

Per completare questa rapida carrellata sull'ASCII, ricordo le denominazioni più accreditate di alcuni caratteri che si incontrano meno frequentemente ma che appaiono spesso nella documentazione:

# - cancelletto, diesis, number.
& - "e" commerciale, ampersand.
' - accento acuto.
- - meno, minus, hypen.
/ - barra obliqua, slash.
: - duepunti, colon.
; - puntoevirgola, semicolon.
< - minore di, less than.
> - maggiore di, greater than.
@ - chiocciola, chiocciolina, at.
[ - parentesi quadra aperta, left square bracket.
] - parentesi quadra chiusa, right square bracket.
\ - barra obliqua inversa, back slash.
^ - accento circonflesso.
_ - sottolinea, underscore.
` - accento grave.
{ - parentesi graffa aperta, left curly brace.
} - parentesi graffa chiusa, right curly brace.
| - barra verticale, vertical bar.
~ - tilde.

5. File di testo ASCII-esteso

Sono quelli dove almeno un byte contiene l'ottavo bit "acceso". In questo caso l'associazione tra il codice binario e la rappresentazione grafica del carattere è dato dalle tabelle ISO, la più comunemente usata essendo l'ISO-8859-1; l'ISO-8859-15 prevede anche il carattere Euro. Il file di testo in sè di norma non contiene l'indicazione della tabella ISO da usare, che pertanto deve essere estrapolata per altra via a seconda del tipo di documento (email, HTML, ecc.).

6. File di testo Unicode e UTF-8

L'Unicode prevede 2 byte per carattere, e così può codificare tutti gli alfabeti del mondo, compreso il cinese. Si può visualizzare solo con appositi programmi che prevedono questo formato.

L'UTF-8 usa 7 bit per carattere per codificare l'ASCII, e attiva l'ottavo bit solo quando serve la codifica Unicode. Ogni carattere Unicode viene quindi codificato con un numero variabile di byte che va da 1 a 3. Il vantaggio è che il testo è visualizzabile con un normale text editor, anche se naturalmente i caratteri diversi dall'ASCII potrebbero apparire a casaccio. Per i testi comuni utilizzati in occidente è più compatto perché la maggior parte dei caratteri sono ASCII. Inoltre, l'UTF-8 attraversa indenne come se fosse un normale testo anche i sistemi e i programmi che non supportano Unicode. Per questi motivi l'UTF-8 è molto usato nella posta Internet e nei sistemi Unix.

7. Creare, editare e visualizzare file di testo

Il file di testo è la forma principale di file in Unix: documentazione, file di configurazione, log, sorgenti, script e altri tipi di file sono dei semplici file di testo. Anche PostScript, HTML, XML, DDT, TeX/LaTeX sono testi. Esistono una varietà di text editor, più o meno sofisticati o specializzati: Per visualizzare (senza modificare) un testo ci sono vari modi: Il più sofisticato è "less": avanzamento pagina (spazio), indietro pagina (b = back), inizio (g = go), fine (G), ricerca (/), quit (q).

8. File System

Ogni dispositivo a blocchi formattato, viene visto come una raccolta di inode, ciascuno con un numero che lo individua all'interno di quel dispositivo. Ogni inode contiene questi dati: Esempio:
$ echo ciao > unfile
$ ls -l unfile
-rw-r--r--    1 pippo    users           5 Jul 24 15:27 unfile
$ ln unfile lostesso
$ ls -l unfile lostesso
-rw-r--r--    2 pippo    users           5 Jul 24 15:27 lostesso
-rw-r--r--    2 pippo    users           5 Jul 24 15:27 unfile

Albero dei file. Gli inode sono rappresentati dagli ovali, mentre i rettangoli rappresentano i file e le directory. Le frecce indicano che l'entrata di una certa directory contiene il numero di inode che corrisponde a un certo inode. Si nota che tutte le dir., eccetto la root, contengono i file "." e ".." che puntano a se stessa e al genitore, rispettivamente. I file unfile e lostesso contengono l'inode dello stesso file: si tratta di due hard link.

9. Directory

Ogni partizione ha una sua dir. radice individuata da un inode, e da cui ramifica il file system. Ogni directory contiene una tabella a due colonne che riporta il numero dell'inode e il nome del file. Esempio:
$ ls -i /
 128351 bin
  16101 boot
  32065 dev
 224449 etc
      2 home
 128354 lib
      1 proc
 288577 root
 288670 sbin
 208417 tmp
 304609 usr
 160321 var

$ stat /usr
  File: "/usr"
  Size: 4096      	Blocks: 8          IO Block: -4611694058606161920 Directory
Device: 302h/770d	Inode: 304609      Links: 18   
Access: (0755/drwxr-xr-x)  Uid: (    0/    root)   Gid: (    0/    root)
Access: Wed Jul 24 19:50:23 2002
Modify: Sat Jul 13 11:35:08 2002
Change: Sat Jul 13 11:35:08 2002
Senza opzioni, il comando ls mostra solo i nomi (la seconda colonna). Con l'opzione -i mostra anche i numeri degli inode. Le altre opzioni del comando ls (v. man ls) fanno stampare tante altre informazioni che vengono estratte dall'inode di ciascun file listato (e quindi ciò comporta un certo lavorio del disco).

Da tutto ciò segue che il nome del file non è una proprietà del file ma è solo un sinonimo del numero di inode e sta scritto nella directory.

Siccome lo stesso inode può avere riferimenti in più dir., ne segue che lo stesso file può assumere nomi diversi.

Non esiste differenza sostanziale tra file e directory: una dir. non è altro che un file di tipo "d" al quale si può accedere in rwx come a ogni altro file. Il significato dei permessi nel caso delle dir. merita un approfondimento:

10. Impostare i permessi e le altre proprietà degli inode dei file e delle directory

Per ogni proprietà di un file, cioè di un inode, esiste un comando apposito per impostarne il contenuto:

Proprietà. Si usa il comando chown (change owner). Esempio:

$ chown pippo:users unfile
In realtà un utente può solo cambiare il gruppo, non l'user, e può farlo solo scegliendo tra i gruppi cui appartiene (v. /etc/group). Naturalmente l'utente root non ha questa limitazione.

Impostare i bit dei permessi. Si usa il comando chmod (change mode). I bit dei permessi voluti si possono impostare usando la base ottale, oppure, in modo più leggibile, usando le lettere u g o (user, group, other) e le lettere r w x s S t (read, write, execution, suid/user, suid/group, sticky). Supponiamo di voler rendere un file leggibile ma non modificabile, al gruppo di utenti cui apparteniamo:

$ chmod u=rw,g=r,o=  bollettino-aggiornato-ottobre

Impostare le date. E' possibile modificare ad arbitrio le date di accesso / modifica inode / modifica file usando il comando touch. L'uso più frequente di questo comando è quello di usare questo comando senza parametri: in questo caso cambia tutte le date del file a quella corrente.

Numero di link. Lo si incrementa creando degli hard link al file con il comando ln (link) (v. esempio precedente). Lo si riduce con rm (remove) o con rmdir, che tolgono l'entrata del file dalla directory: dunque rm cancella di sicuro il nome del file, ma non necessariamente cancella anche il file stesso.

Lunghezza del file. Si modifica solo modificando il file stesso.

Tabella dei blocchi del file. Ovviamente, anche questa non è modificabile, pena corruzione del file system!

Cambiare nome al file/dir. Sappiamo che il nome del file non è una proprietà del file, ma un riferimento "letterario" al suo inode presente nella dir. Per cambiare un nome si usa il comando mv (move), che in generale serve anche per spostare i file e le dir. Esempio:

$ mv brutto.nome bel.nome

Copiare un file. Si usa il comando cp (copy). Esempio:

$ cp originale copia
Ovviamente, il file da copiare deve essere leggibile dall'utente, mentre il file di destinazione assumerà proprietà, permessi e dati corrispondenti all'utente che lo ha copiato. Il comando cp ha una infinità di altre opzioni, forse la più importante è -a che preserva invece tutte queste info.

11. Navigare nel file system

Si può usare mc, oppure i tradizionali comandi:

12. Orientarsi nel file system

13. Trovare file e comandi

$ locate pass
$ which chmod
Esiste un demone di sistema di nome updatedb, che con una certa periodicità cataloga tutti i file del sistema: il db che esso produce è consultabile con il comando locate.

Il comando which fornisce il pathfile completo del comando indicato seguendo lo stesso algoritmo di bash.

14. Esercizio riepilogativo

Spiegare cosa fanno questi comandi (per quelli che non sono stati descritti qui, come potresti fare?):
bash
cat
cd
chmod
chown
cp
date
exit
less
ln
locate
logout
ls
man
man ascii
mc
more
mv
rm
rmdir
stat
which
Quali dei seguenti pathfile sono dei file? e quali sono delle directory? a cosa servono?
/etc
/etc/passwd
/etc/shadow
/etc/group
/home/pippo
/root

Bibliografia

Argomenti correlati


Umberto Salsi
Commenti
Contatto
Mappa
Home / Indice sezione
Still no comments to this page. Use the Comments link above to add your contribute.