220 likes | 394 Views
Implementazione del file system. Una possibile visualizzazione del file system di un sistema Unix. Implementazione dei files. Allocazione di un file come lista concatenata di blocchi di memoria. Non è il metodo usato in un sistema UNIX. Index Node (inode).
E N D
Implementazione del file system Una possibile visualizzazione del file system di un sistema Unix.
Implementazione dei files Allocazione di un file come lista concatenata di blocchi di memoria. Non è il metodo usato in un sistema UNIX
Index Node (inode) • A ciascun file di qualunque tipo, memorizzato in una partizione del disco, viene associato un numero (detto il suo inumber) che è di fatto l’indice di un elemento di un array memorizzato sul disco. • Ciascun elemento dell’array è un inode che memorizza le informazioni di tipo amministrativo riguardanti un singolo file (come ad esempio, nel momento in cui il file viene creato, chi è l’autore e dove sono memorizzati i blocchi di dati di questo file sulla partizione del disco). Queste informazioni possono essere visualizzate usando il comando stat: • $ stat file1 File: `file1' Size: 123 Blocks: 8 IO Block: 4096 Regular File Device: 306h/774d Inode: 32787 Links: 2 Access:(0644/-rw-r--r--)Uid:(501/lferrari)Gid:(501/docenti) Access: 2003-03-31 12:58:37.000000000 +0200 Modify: 2003-03-31 12:58:25.000000000 +0200 Change: 2003-04-04 19:05:14.000000000 +0200
Implementazione dei files Un esempio di inode: contiene soltanto i primi n indirizzi dei blocchi del file.
Implementazione delle directories • È in realtà l’inode di un file che viene memorizzato in una directory accanto al nome del file. Quindi, essenzialmente, le directories sono semplici tabelle che associano i nomi dei files con gli inode. Ogni coppia costituita da file name e inode in una directory viene chiamata un link. inode inode inode inode
Collegamenti ai files • Un link è un puntatore a un altro file. Si ricordi che una directory non è altro che una lista di nomi e inode di files. • Un elemento di una directory può essere un hard link, nel quale l’inode punta direttamente a un altro file. Quando viene creato un hard link, questo acquista lo stesso inumber del file linkato. • L’utility ln crea un link tra files. • $ cat > file Hello ! ^D $ ls -l file -rw-rw-r-- 1 lferrari lferrari 8 apr 7 14:22 file $ ln file fileln $ ls -li file* 12004 -rw-rw-r-- 2 lferrari lferrari 8 apr 7 14:22 file 12004 -rw-rw-r-- 2 lferrari lferrari 8 apr 7 14:22 fileln $ rm file $ ls -l fileln -rw-rw-r-- 1 lferrari lferrari 8 apr 7 14:22 fileln
Collegamenti ai files • Se l’ultimo argomento è il nome di una directory, allora l’hard link viene creato nella directory a tutti i filenames specificati. $ mkdir ~/didattica/corsi $ ln file* ~/didattica/corsi $ ls -l -rw-rw-r-- 2 lferrari lferrari 8 apr 7 14:22 fileln $ cd $ rm fileln $ ls -l ~/didattica/corsi/ -rw-rw-r-- 1 lferrari lferrari 8 apr 7 14:22 fileln • Non si può creare un hard link da un file su un file system ad un file su un altro (diverso) file system. Per aggirare questo problema, si può invece creare un link simbolico.
Collegamenti ai files • Di default, ln crea hard links; usando l’opzione “-s”, crea invece links simbolici (o “soft”). • $ ln -s /usr/include/stdio.h stdio.h $ ls -l stdio.h lrwxrwxrwx 1 lferrari lferrari 20 apr 7 14:46 stdio.h -> /usr/include/stdio.h • $ ln -s ~/didattica/corsi/fileln file $ ls -l file lrwxrwxrwx 1 lferrari lferrari 37 apr 7 14:50 file -> /home/lferrari/didattica/corsi/fileln $ rm ~/didattica/corsi/fileln $ ls –l file lrwxrwxrwx 1 lferrari lferrari 37 apr 7 14:50 file -> /home/lferrari/didattica/corsi/fileln $ cat file cat: file: No such file or directory
Attributi di un file • I timestamp: a ciascun file sono associate tre date: • La data di creazione • La data dell’ultima modifica • La data dell’ultimo accesso • Il proprietario: ogni file è di proprietà di un utente del sistema. • Il gruppo: a ogni file è anche associato un gruppo di utenti. Il gruppo di utenti più comune si chiama “users”, ed è spesso condiviso da tutti gli utenti del sistema. • I permessi: a ogni file sono associati dei permessi, che stabiliscono chi può accedere a quel file, o cambiarlo, o, nel caso di programmi, eseguirlo. Ciascuno di questi permessi può essere assegnato separatamente al proprietario, al gruppo e a tutti gli altri utenti.
Attributi di un file • Le informazioni riguardanti un file possono essere ottenute utilizzando il comandols –l. $ ls -l totale 28 drwxrwxr-x 4lferrari lferrari4096 mar 27 16:52 Desktop/ drwxrwxr-x 2lferrarilferrari4096 mar 21 17:35 didattica/ drwxr-xr-x 2lferrarilferrari4096 mar 14 19:21 Documents/ -rwx------ 1lferrarilferrari1999 mar 31 13:25 file* -rw-r--r-- 1lferrarilferrari 123 mar 31 12:58 file1 drwxrwxr-x 2lferrarilferrari4096 mar 21 17:35 ricerca/ drwx------ 2lferrarilferrari4096 mar 14 18:50 tmp/ • In aggiunta al nome di ciascun file, mostra il tipo di file, i permessi, il numero di hard links, il nome del proprietario, il nome del gruppo, la dimensione in bytes, e un timestamp, di solito la data dell’ultima modifica.
Permessi • Tutto in UNIX è gestito tramite files, perfino l’accesso alle periferiche (tramite i files in '/dev') quali stampanti, modem, schede audio ecc. Se non si hanno i permessi relativi a un file che rappresenta una periferica, non si può utilizzare quella periferica. • Il primo concetto riguardante i permessi è quello di possesso. Il comando chown imposta il proprietario di files e directories (che, di default, è colui che ha creato il file o la directories). Di solito, quando si possiede un file, si può fare ciò che si desidera con quel file. • Spesso più di un account necessita di accedere a un file o a una periferica. Cambiare il possesso di tale file ogni volta che qualcun’altro ha bisogno di accedervi sarebbe perlomeno molto spiacevole. Questo è il motivo per cui il possesso è fornito non solo per singoli accounts ma anche per gruppi. I gruppi sono definiti in /etc/group, un elemento di questo file si presenta così: • group_name:x:group_ID:group_member
Permessi • Per vedere la lista dei gruppi dei quali il proprio account corrente è membro, si usa il comando • $ groups • Quindi, se si è membri di un gruppo e quel gruppo possiede dei permessi riguardanti un file, si può lavorare su quel file, anche se non se ne è proprietari. • In media un sistema UNIX ha qualcosa come 60.000 files, e spesso di più. La maggioranza di essi deve poter essere accessibile a tutti gli utenti del sistema, in un modo o nell’altro. Un modo per ottenere ciò potrebbe essere quello di creare un gruppo 'catch-all' che contenga tutti gli accounts del sistema e assegni tutti i file da condividere a questo gruppo. • Pertanto, possiamo dividere i permessi sui files in 3 categorie: • Permessi del proprietario • Permessi di gruppo • Permessi per tutti gli altri
Permessi • L’output del comando ls -l mostra i permessi per un file/directory $ ls -l drwxrwxr-x 4 lferrari lferrari 4096 mar 27 16:52 Desktop/ drwxr-xr-x 2 lferrari lferrari 4096 mar 14 19:21 Documents/ -rwx------ 1 lferrari lferrari 1999 mar 31 13:25 file* -rw-r--r-- 1 lferrari lferrari 123 mar 31 12:58 file1 drwxrwxr-x 2 lferrari lferrari 4096 mar 21 17:35 ricerca/ drwx------ 2 lferrari lferrari 4096 mar 14 18:50 tmp/ dove l’etichetta 'r' sta per lettura, 'w' per scrittura e 'x' per esecuzione. • Il primo campo ha tre opzioni, d, l o -, ove d indica una directory, l un link simbolico, e - un file. Gli altri nove campi indicano i permessi per il proprietario, i permessi di gruppo e i permessi per tutti gli altri. • Owner | Group | Others = rw- | r-- | r-- (file1)
Permessi per le directories • I permessi per le directories sono diversi dai permessi per i files. Nelle righe seguenti: drwxrwxr-x 4 lferrari lferrari 4096 mar 27 16:52 Desktop/ drwxr-xr-x 2 lferrari lferrari 4096 mar 14 19:21 Documents/ drwx------ 2 lferrari lferrari 4096 mar 14 18:50 tmp/ • r indica che il contenuto della directory può essere elencato • w indica che il contenuto della directory può essere cambiato (copiare, spostare, creare nuovi files) • x indica che gli utenti possono eseguire il comando "cd" relativamente a quella directory, nonchè leggere, scrivere, eseguire programmi e fare ricerche nella directory.
Cambiare le impostazioni dei permessi • Il comando chmod permette di cambiare le impostazioni dei permessi di un file/directory. Occorre specificare 3 cifre col comando chmod. Tali cifre stabiliscono su quali permessi si andrà ad agire. La prima cifra determina i permessi per il proprietario, la seconda cifra determina i permessi per il gruppo, e la terza per gli altri. • Per cambiare i permessi relativi al file “file1” digitare: • chmod XYZ file1 ove XYZ rappresenta una terna di cifre, ad es. 666 • Ciascuna cifra è la somma di 4 per il permesso di lettura, 2 per il permesso di scrittura e 1 per il permesso di esecuzione. user group others • chmod 640 file1 rw- r-- --- • chmod 754 file1 rwx r-x r-- • chmod 664 file1 rw- rw- r--
Cambiare le impostazioni dei permessi • chmod a+rw hello.c • chmod o-w hello.c • chmod og+rx prog* • chmod g=rw rep* • chmod +w * • L’opzione -R cambia uno dopo l’altro i permessi di una directory e dei suoi contenuti.
Cambiare i gruppi • Se si è membri di parecchi gruppi e si crea un file, qual è il gruppo di appartenenza del file? Sebbene si possa essere membri di più gruppi, soltanto uno di essi è il proprio gruppo effettivo in ogni ben preciso istante. Quando un processo crea un file, tale file viene immediatamente assegnato al proprio gruppo effettivo. • L’amministratore del sistema sceglie quale dei gruppi di ciascuno verrà usato come gruppo effettivo della propria shell di login. In ogni caso, ognuno può creare una shell con un gruppo effettivo diverso usando l’utility newgrp. $ date > ~/test1… crea “test1” da una shell del gruppo “lferrari” $ newgrp informatica $ date > ~/test2… crea “test2” da una shell del gruppo “informatica” ^D $ ls –lg test* -rw-r--r-- 1 lferrari 30 mar 27 16:52 test1 -rw-r--r-- 1 informatica 30 mar 27 16:52 test2
Il file system proc di Linux • Il file system proc non memorizza dati, piuttosto esso crea una directory per ogni processo. Il nome della directory è il PID del processo. • $ cd /proc ; ls 1/ 1023/ 1089/ 1111/ … 1839/ … 2289/ … $ ps PID TTY TIME CMD 1839 pst/2 00.00.00 bash 2289 pst/2 00.00.00 ps • Una directory di proc raggruppa le informazioni appropriate riguardanti quel processo (command line, environ strings, status, …). • $ cd 1839 ; ls cmdline cwd environ exe fd maps mem mounts stat statm status • Pertanto, le directory di proc contengono molte informazioni sulla CPU, sulle partizioni del disco, sulle periferiche, ... In molti casi, i file di proc sono utilizzati nei programmi. • pstree: mostra le dipendenze fra tutti i processi attivi. • kill: termina un processo.
Mounting • Il sistema operativo attacca un file system fisico al proprio file system virtuale tramite il comando mount. Questa operazione è detta mounting e la sintassi del comando relativo è: • $ mount –t type device mount-point • Esempi: $ mount –t ext2 /dev/hda6 / La partizione di tipo ext2 viene chiamata hda6. (hd per hard drive, a per il primo di questi, e 6 per la sesta partizione). La documentazione delle periferiche è in /usr/src/linux/Documentation/devices.txt. • $ mount –t vfat /dev/hda1 /mnt/windows • $ mount –t msdos /dev/fd0 /mnt/floppy • $ mount –t iso9660 /dev/hdc /mnt/cdrom • Il comando mountè usato dal superutente (root). Il sistema operativo esegue mount –a durante il boot. Questo comando monta i file systems elencati in /etc/fstab. • Si può smontare un file system usando umount. • umount /mnt/floppy
Comprimere i files • I tipi di file compresso in Linux sono: • file.Z – compressi con compress: • $ compress file1 • $ uncompress file1.Z • file.z, file.gz – compressi col programma zip di GNU: zip, gzip. • $ gzip huge_file • $ gunzip huge_file.gz • file.bz2 – compressi con bzip2 • $ bzip2 huge_file • $ bunzip2 huge_file.bz2 • Si può visionare un file in un archivio compresso senza estrarlo, tramite zcat o bzcat. • $ zcat huge_file.gz • $ bzcat huge_file.bz2
Archiviare i files • Si può usare tar per immagazzinare i files in un archivio, per estrarli da un archivio e per fare altre manipolazioni. La sintassi di tar è: • $ tar options tarfilename filelists • Alcune opzioni sono: • -c creare un archivio • -x estrarre da un archivio • -t elencare i contenuti di un archivio • -v visualizza informazioni aggiuntive • -u aggiunge i files nuovi o modificati a un archivio esistente • -f usa “tarfilename” come filename dell’archivio (il nome di “tarfilename” è /dev/rmt0 di default) • Esempio: • tar -cvf logfile.tar logs.* • tar -tvf logfile.tar • tar -xvf logfile.tar • tar -cvzf logfile.tar.gz logs.*