Microsoft's Internet Explorer browser has no built-in vector graphics machinery required for "loss-free" gradient background themes.

Please upgrade to a better browser such as Firefox, Opera, Safari or others with built-in vector graphics machinery and much more. (Learn more or post questions or comments at the Slide Show (S9) project site. Thanks!)

Server GNU/Linux

Filesystem e devices

Master "Tecnologie OpenSource"

Supporti di memorizzazione e device

In un sistema GNU/Linux, l’accesso ai supporti di memorizzazione di massa (harddisk, cdrom/dvrom, usbpen, etc.) è gestito attraverso i cosidetti device.

I device sono veri e propri file attraverso i quali è possibile gestire la lettura/scrittura da/su i supporti di memorizzazione di massa.

I file di tipo device sono collocati per convenzione in una precisa posizione del sistema: la cartella /dev/.

Il sistema GNU/Linux è in grado di gestire molti tipi di supporti tra cui:

Questi supporti possono essere inizializzati con differenti tipi di filesystem, anche con quelli che non appartenentono propriamente al mondo UNIX (ad esempio: FAT16, FAT32, NTFS).

Questo rende possibile la convivenza e interoperabilità tra il sistema operativo GNU/Linux e gli altri sistemi all’interno della stessa macchina.

Convenzioni sui nomi dei device

Il supporto di memorizzazione di massa principale del sistema è il disco rigido (harddisk o hd per il seguito). Il canale hardware di comunicazione tra il sistema e l’harddisk si dice interfaccia.

Le interfacce di comunicazione più diffuse sono di tipo:

Il sistema GNU/Linux utilizza una convenzione sui nomi dei device per distinguere tra i vari tipi di supporti di memorizzazione. In particolare:

Il filesystem 1/2

Il termine filesystem (fs) si riferisce a due aspetti differenti del processo di memorizzazione su supporto.

Si può intendere per filesystem il modo con cui i dati vengono fisicamente registrati all’interno del supporto oppure l’organizzazione dei file all’interno del supporto.

Un filesystem è normalmente associato ad un supporto di memorizzazione.

Tale supporto di memorizzazione può essere un normale hd collegato direttamente alla macchina ma non solo.

La forza di un sistema GNU/Linux (e Unix in generale) consiste nella capacità di gestire filesystem anche non fisicamente vicini alla macchina in uso. Questi filesystem si dicono di rete.

Il filesystem 2/2

Nel gergo di Unix i fs possono essere montati e smontati.

I due termini si riferiscono al processo di collegamento/scollegamento del fs da montare all’interno della struttura del fs in uso.

Ad esempio, quando si inserisce un cd-rom all’interno di una macchina Ubuntu Desktop GNU/Linux, il supporto viene automaticamente montato. Cioè, il contenuto del supporto viene innestato all’interno di una particolare cartella del fs in uso (/media/).

A quel punto, per navigare all’interno del cd-rom basterà spostarsi nella cartella /media/cdrom utilizzando il consueto comando cd.

Il supporto di filesystem differenti è trasparente per l’utente.

Cioè, è possibile navigare ed effettuare operazioni all’interno di diversi fs utilizzando sempre gli stessi comandi di shell, con l’illusione di operare all’interno di una struttura con delle caratteristiche omogenee.

Analogamente, se si monta un fs di rete, non ci si preoccuperà della posizione fisica del supporto o delle sue caratteristiche hardware. Ci si comporterà come se il fs montanto fosse relativo ad un supporto installato sulla macchina in uso (locale).

Tipi di filesystem

Il sistema GNU/Linux è in grado di operare su una grande varietà di fs, locali e di rete.

Alcuni dei fs supportati sono:

Un fs journaled ha la caratteristica di essere particolarmente stabile rispetto a malfunzionamenti improvvisi della macchina.

I filesystem ext2, ext3, ext4

Il filesystem ext2 è uno dei più diffusi fs del mondo GNU/Linux.

Questa diffusione è dovuta alle sue buone prestazioni e alla sua grande stabilità.

Tuttavia, il filesystem ext2 non è dotato di journaling.

Il filesystem ext3 rappresenta la naturale evoluzione di ext2.

Rispetto a questo ext3 aggiunge le caratteristiche di

L’11 Ottobre 2008 è stata rilasciata la versione 4 (stabile) di ext: ext4.

Il filesystem ext4 presenta varie innovazioni tra cui:

Convenzioni generali sui nomi dei file

A differenza dei sistemi Microsoft, i sistemi GNU/Linux (e Unix) non si servono delle estensioni dei file per identificare il contenuto e la tipologia dello stesso. Per questo motivo, un file di testo non necessariamente deve avere un estensione txt (come in Windows) per essere interpretato come tale.

I file nascosti sono identificati da un punto prefisso al nome del file.

I file nascosti non sono visibili nell’output del comando ls a meno che non si utilizzi l’opzione -a (--all):

andrea@ganimoide:~/cartella$ touch .nascosto
andrea@ganimoide:~/cartella$ ls -l
totale 0
andrea@ganimoide:~/cartella$ ls -la
totale 8
drwxr-xr-x  2 andrea andrea 4096 2009-01-28 08:24 .
drwxr-xr-x 59 andrea andrea 4096 2009-01-28 08:24 ..
-rw-r--r--  1 andrea andrea    0 2009-01-28 08:25 .nascosto

Il comando touch crea un file vuoto di nome .nascosto. Questo file .nascosto non compare nell’output del comando ls -l. Quando al comando ls si aggiunge l’opzione -a ecco comparire tutti i file nascosti.

Notare che sono considerati nascosti anche i file .. e .

Inizializzare un fs: mkfs

Al fine di inizializzare un filesystem su una partizione esistente è presente un tool (o meglio un gruppo di tool) chiamato mkfs :

andrea@ganimoide:~$ mkfs       
Usage: mkfs [-V] [-t fstype] [fs-options] device [size]

L’ fstype se non specificato sarà ext2/ext3, in altre parole mkfs senza parametri, mke2fs e mkfs.ext2/mkfs.ext3 sono sinonimi.

Esempio di inizializzazione di un filesystem ext3 su un file in loop

andrea@ganimoide:~$ dd if=/dev/zero of=TEST.img bs=1k count=10000
andrea@ganimoide:~$ sudo losetup -a
andrea@ganimoide:~$ sudo losetup /dev/loop0 TEST.img 
andrea@ganimoide:~$ sudo losetup -a
andrea@ganimoide:~$ sudo mkfs -t ext3 -j -L MYDISK /dev/loop0 
[....]
andrea@ganimoide:~$ sudo mount /dev/loop0 /mnt/tmp/
andrea@ganimoide:~$ mount
andrea@ganimoide:~$ df -h
[...]
andrea@ganimoide:~$ sudo umount /mnt/tmp/
andrea@ganimoide:~$ sudo losetup -d /dev/loop0

Inizializzare un fs di tipo swap

Anche lo swap, essendo organizzato secondo un particolare tipo di filesystem, richiede l’inizializzazione mediante un apposito tool: mkswap.

rpl@ubik:~/Projects/ALCA/MasterOpenSource$ mkswap
mkswap: error: Nowhere to set up swap on?
Usage: mkswap [-c] [-v0|-v1] [-pPAGESZ] [-L label] [-U UUID] /dev/name [blocks]

I comandi swapon e swapoff consentono poi l’abilitazione e disabilitazione di uno spazio di swap inizializzato.

Esempio di inizializzazione di una partizione swap su un file in loop

andrea@ganimoide:~$ dd if=/dev/zero of=TEST.img bs=1k count=10000
andrea@ganimoide:~$ sudo losetup /dev/loop0 TEST.img 
andrea@ganimoide:~$ sudo mkswap /dev/loop0 
[...]
andrea@ganimoide:~$ sudo swapon /dev/loop0
andrea@ganimoide:~$ cat /proc/swaps
[...]
andrea@ganimoide:~$ sudo swapoff /dev/loop0
andrea@ganimoide:~$ sudo losetup -d /dev/loop0

Spazio disponibile in un fs: df e du

I comandi df e du mostrano rispettivamente lo spazio disponibile e lo spazio utilizzato sul supporto.

Il comando sotto mostra le informazioni relative allo spazio libero sul fs in uso.

andrea@ganimoide:~$ df . -h
File system            Dimens. Usati Disp. Uso% Montato su
/dev/sda3              90G  6,3G   79G   8% /

Il comando du permette di conoscere lo spazio utilizzato da file e cartelle.

andrea@ganimoide:~$ du -sh src/
275M	src/

Nell’esempio sopra il comando du viene istruito per visualizzare in formato leggibile (-h) lo spazio utilizzato dalla cartella src/ e dalle cartelle in essa contenute. Inoltre, non viene visualizzata la dimensione di ogni sottocartella (-s).

Esercizio:

Ipotizza l’output del comando du -h | sort -nr | less

Inviare comandi con privilegi di amministratore

Nel seguito della lezione sarà necessario inviare comandi che interagiscono con le componenti hardware del sistema (interazione a basso livello).

Affinchè il sistema consenta l’esecuzione di questo tipo di operazioni, l’utente deve essere accreditato come amministratore.

L’utente amministratore (o superuser, o root ) ha il controllo completo del sistema e può eseguire qualuque tipo di operazione su di esso.

Il sistema Ubuntu GNU/Linux permette di inviare comandi con privilegi di amministratore anche ad utenti che hanno avuto accesso al sistema non accreditandosi con tale privilegio.

Naturalmente, questi utenti devono risultare all’interno di una lista di ‘privilegiati’ e devono essere dotati di una password di amministrazione.

Il comando attualmente più utilizzato allo scopo di eseguire un comando come amministratore è sudo:

andrea@ganimoide:~$ sudo cat /etc/shadow

Il comando visualizza le informazioni relative alle password degli utenti.

Verificare e mantenere l’integrità di un fs: fsck

fsck è un tool di fondamentale importanza per verificare l’integrità del fs.

In un sistema Ubuntu GNU/Linux il comando fsck è declinato per tutti i tipi di fs supportati dal sistema. Cioè, esiste un comando fsck specifico per ogni tipo di fs (analogamentente a mkfs ).

Ad esempio, per effettuare un controllo di un fs di tipo FAT32 corrispondente device /dev/sdb1 si invia il seguente comando:

andrea@ganimoide:~$ sudo fsck.vfat /dev/sdb1
dosfsck 2.11, 12 Mar 2005, FAT32, LFN
/dev/sdb1: 76796 files, 1511010/1951740 clusters

Il comando fsck.vfat esegue un controllo sui fs di tipo FAT32.

Poichè il comando deve interagire con le componenti hardware del sistema è necessario lanciarlo con permessi di amministratore ( sudo ).

Nota che è consigliabile non eseguire il controllo su un fs montato.

Partizioni

Un supporto di memorizzazione può essere suddiviso in partizioni.

Le partizioni sono aree (volumi logici) che suddividono virtualmente lo spazio fisico del supporto.

Ad ogni partizione può essere associato un filesystem.

Il sistema GNU/Linux utilizza una particolare convenzione per identificare le differenti partizioni presenti sul supporto.

Ad esempio, le prime 3 partizioni presenti sul disco /dev/hda sono identificate con un numero progressivo postposto al nome del device:

Notare che /dev/hda1, /dev/hda2, /dev/hda3 sono essi stessi device.

Su di essi, quindi, possono essere eseguite le normali operazioni di controllo.

Gestire le partizioni: fdisk 1/2

fdisk è un software che permette di gestire (creare, cancellare, modificare) le partizioni in un sistema GNU/Linux.

Il comando fdisk opera a livello di periferiche hardware (supporti di memorizzazione) per questo motivo è necessario lanciarlo con privilegi di amministratore ( sudo ).

andrea@ganimoide:~$ sudo fdisk /dev/sdb

The number of cylinders for this disk is set to 30560.
There is nothing wrong with that, but this is larger than 1024,
and could in certain setups cause problems with:
1) software that runs at boot time (e.g., old versions of LILO)
2) booting and partitioning software from other OSs
   (e.g., DOS FDISK, OS/2 FDISK)

Comando (m per richiamare la guida): 

L’argomento passato al comando fdisk è il nome del device sul quale si vogliono effettuare le operazioni di partizionamento.

Il software fdisk interagisce con l’utente attraverso i comandi che esso gli impartisce da tastiera.

Per visualizzare l’elenco dei comandi disponibili l’utente può premere il tasto m seguito da invio.

Gestire le partizioni: fdisk 2/2

Per visualizzare l’elenco delle partizioni disponibili sul device si preme il tasto p seguito da invio:

Comando (m per richiamare la guida): p

Disco /dev/sdb: 8011 MB, 8011120640 byte
16 testine, 32 settori/tracce, 30560 cilindri
Unità = cilindri di 512 * 512 = 262144 byte
Identificativo disco: 0x00000000

Dispositivo Boot      Start         End      Blocks   Id  System
/dev/sdb1   *           1       30560     7823344    c  W95 FAT32 (LBA)

L’output visualizza la tabella delle partizioni con le relative informazioni.

Come si vede, tra le informazioni riportate compare:

I comandi n e d aggiungono e rimuovono una partizione. fdisk non registra immediatamente i cambiamenti sulla tabella delle partizioni. La modifica effettiva avviene inviando il comando w.

Montare i filesystem al boot: fstab 1/2

Essendo le informazioni contenute nei supporti di memorizzazione indispensabili nella fase di avvio del sistema, è necessario che quest’ultimo conosca quali device montare durante questa fase.

Tali informazioni sono contenute nel file di testo /etc/fstab :

/dev/sda1      /                ext3    defaults        1 1
/dev/sda5      /boot            ext3    defaults        1 2 
/dev/sda9      /home            ext3    defaults        1 2 
/dev/sda6      /root            ext3    defaults        1 2 
/dev/sda10     /tmp             ext3    defaults        1 2 
/dev/sda8      /usr             ext3    defaults        1 2 
/dev/sda7      /var             ext3    defaults        1 2 
/dev/sda11     swap             swap    defaults        0 0 
/dev/fd0       /mnt/floppy      ext3    noauto,users    0 0 
/dev/hdc       /mnt/cdrom       iso9660 noauto,ro,users 0 0 
/dev/hdd       /mnt/zip         vfat    noauto,users    0 0 
fs1.domain.org:/share     /fs1             nfs     defaults        0 0 

Come si vede, il file presenta una struttura tabulare composta da sei colonne e da tante righe quanti sono i supporti da inizializzare.

Montare i filesystem al boot: fstab 2/2

Le informazioni registrate nelle colonne di fstab sono:

Montare un filesystem al volo: mount

I filesystem possono essere anche montati “a caldo” tramite il comando mount.

Il comando mount innesta il fs presente sul device all’interno del fs di root. In questo modo l’utente può operare su unica struttura di file e cartelle senza preoccuparsi della posizione fisica degli stessi.

Ad esempio, per montare un CD-ROM, dopo averlo inserito nel drive, si utilizza il seguente comando:

andrea@ganimoide:~$ mount /dev/scd0

Notare che il comando eseguito con 1 solo parametro consulta automaticamente il file fstab del sistema per ricavarne i restanti. Infatti, senza che l’utente l’abbia specificato esplicitamente, mount innesterà il fs del CD-ROM nella cartella /media/cdrom, così come indicato da fstab.

Notare come il comando mount normalmente richiederebbe privilegi di amministratore. Eppure, nell’esempio sopra, il comando è stato inviato senza utilizzare sudo. Questo è dovuto all’opzione user presente nel file fstab in corrispondenza del device /dev/scd0.

Per chiarezza riportiamo l’estratto del file fstab:

/dev/scd0       /media/cdrom0   udf,iso9660 user,noauto,exec,utf8 0       0

Device Files: Major e Minor Number

Come si è verificato i device file sono particolari file che identificano molte delle periferiche hardware a cui ha accesso il sistema (ma anche altre periferiche virtuali , come loop ad esempio ).

Ma cosa mette in relazione tra loro il device file e il particolare driver che lo dovrà gestire?

brw-rw---- 1 root disk 8, 0 Feb  9 17:53 /dev/sda
brw-rw---- 1 root disk 8, 1 Feb  9 17:54 /dev/sda1
brw-rw---- 1 root disk 8, 2 Feb  9 17:53 /dev/sda2
brw-rw---- 1 root disk 8, 3 Feb  9 17:53 /dev/sda3
brw-rw---- 1 root disk 8, 5 Feb  9 17:54 /dev/sda5
crw-rw----+ 1 root audio 116, 10 Feb  9 17:54 /dev/snd/controlC0
crw-rw----+ 1 root audio 116,  9 Feb 10 19:36 /dev/snd/pcmC0D0c
crw-rw----+ 1 root audio 116,  8 Feb 10 20:29 /dev/snd/pcmC0D0p
crw-rw----+ 1 root audio 116,  7 Feb  9 17:54 /dev/snd/pcmC0D1c

Ad ogni device file vengono associati due codici identificatifi:

Inoltre i device file possono essere di 2 tipi:

Gestire i permessi su file

I sistemi Unix sono i sistemi multiutente per eccellenza.

Il sistema GNU/Linux eredità pienamente questa caratteristica.

Un sistema multiutente può essere condiviso, simultaneamente, da più utenti, fisici e no (anche un processo può essere utente del sistema).

In un sistema multiutente è possibile attribuire a ciascun utilizzatore particolari privilegi.

Ad esempio, in un sistema utilizzato da più persone fisiche:

Non solo. Potrebbero verificarsi situazioni in cui un documento può essere letto da tutti ma modificato solo dall’utente che ne è proprietario.

Un sistema multiutente come GNU/Linux permette di gestire queste e altre situazioni.

Access mode bits

Le informazioni relative ai privilegi assegnati ad ogni utente sono codificate all’interno del filesystem.

Per avere immediatamente un primo riscontro, osserviamo l’esempio che segue:

andrea@ganimoide:~/cartella$ touch documento
andrea@ganimoide:~/cartella$ ls -l
totale 0
-rw-r--r-- 1 andrea andrea 0 2009-01-28 15:23 documento

Il comando touch crea un file vuoto di nome documento.

Tramite il comando ls -l si verifica che effettivamente il file sia stato creato e si visualizzano alcune informazioni su di esso.

In particolare, siamo interessati alla stringa -rw-r--r-- che va sotto il nome di access mode bits.

Gli access mode bits rappresentano i permessi associati al file documento.

Notare le due colonne contenenti la stringa andrea andrea.

Come vedremo nella prossima slide esse rappresentano rispettivamente il nome del proprietario del file e il gruppo al quale il file appartiene.

Access mode bits: classi di utenti

-rw-r--r-- 1 andrea andrea 0 2009-01-28 15:23 documento

Gli access mode bits del file documento fanno riferimento a tre categorie: owner, group, all.

owner rappresenta il proprietario del file. Nell’esempio, poichè a creare il file documento è stato l’utente andrea è logico che egli risulti, per il sistema, il proprietario del file.

group rappresenta il gruppo che possiede il file. Nell’esempio, il nome del gruppo corrisponde con il nome del proprietario. Infatti, ad ogni utente del sistema corrisponde un gruppo con lo stesso nome.

all rappresenta tutti gli utenti diversi da owner. Ovviamente, questa informazione non viene riportata esplicitamente dall’output di ls poichè non avrebbe senso elencare tutti gli utenti diversi da andrea.

Ricordiamo che per ottenere la lista di tutti gli utenti accreditati sul sistema si può eseguire il comando:

andrea@ganimoide:~$ cat /etc/passwd | cut -d: -f1

Esercizio:

Visualizza sul terminale l’elenco di tutti i gruppi presenti sul sistema accedendo al file /etc/group

Access mode bits: permessi 1/3

-rw-r--r-- 1 andrea andrea 0 2009-01-28 15:23 documento

Gli access mode bits associati al file documento individuano i privilegi delle categorie owner, group e all sul file.

Questi privilegi consistono nella possibilitò data a ciascuna categoria di leggere ( r ), modificare ( w ) ed eseguire ( x ) il file.

Nell’esempio, il proprietario del file può leggerlo e modificarlo ma non può eseguirlo. Gli access mode bits contengono, infatti, le lettere r e w (le prime a partire da sinistra) in corrispondenza della categoria owner. D’altra parte, il simbolo x non è presente, per cui andrea non può eseguire il file.

Il gruppo a cui è associato il file ( andrea ), può solo leggerlo. Non sono presenti, infatti, i simboli di modifica/scrittura ( w ) e di esecuzione ( x ).

Infine, tutti gli altri utenti ( categoria all ) possono solo leggere il file. Infatti, neanche in corrispondenza di questa categoria sono presenti i simboli w e x.

Gli access mode bits sono in tutto 12. Nove di questi gestiscono la lettura, modifica ed esecuzione dei file in relazione alla categorie owner, group e all.

I rimanenti 3 bit (suid, guid e sticky) sono utili, come vedremo in seguito, in alcuni casi particolari.

Access mode bits: permessi 2/3

Nella slide precedente abbiamo visto come si associano i privilegi ad un file. Come si ragiona nella gestione dei permessi sulle cartelle?

andrea@ganimoide:~/cartella$ mkdir sottocartella
andrea@ganimoide:~/cartella$ ls -l
totale 4
drwxr-xr-x 2 andrea andrea 4096 2009-01-28 15:58 sottocartella

Nell’esempio sopra, l’utente andrea ha creato una cartella sottocartella all’interno di cartella. Il comando ls mostra i permessi sulla cartella.

Innanzitutto, notiamo la lettera d prefissa agli access mode bits. Essa sta per directory e serve ad indicare che il file sottocartella è un file di tipo directory.

Per quanto riguarda i permessi, valgono le stesse considerazioni fatte nella slide precedente con qualche differenza nell’interpretazione delle lettere. La lettera x sta ad indicare la possibilità di attraversare la sottocartella. Possibilità che, come si vede, è data a tutti gli utenti.

I file contenuti in una directory per cui non si possiere il permesso di esecuzione ( x ) non saranno accessibili (anche se abbiamo i permessi di lettura sul file in particolare), mentre mancando il permesso di lettura ( r ) sulla cartella sarà possibile accedere ai file solo conoscendone il nome.

Access mode bits: permessi 3/3

Gli access mode bits contengono altre informazioni utili in alcuni casi particolari. Queste informazioni sono contenute nei bit SUID, GUID, Sticky.

Il bit SUID si applica esclusivamente ai file eseguibili e non alle cartelle. Quando è associato ad un file eseguibile il cui proprietario è root, esso consente a qualunque utente di eseguire il file pur non avendone i privilegi. Questo consente ad un utente senza privilegi da amministratore di acquisire tali permessi seppur limitati all’esecuzione di un particolare comando.

Il bit GUID si comporta come SUID nel caso dei file eseguibili. Esso si applica anche alle cartelle, modificando il criterio con il quale viene stabilita la proprietà dei file creati all’interno di esse. In particolare, quando il bit GUID è acceso per una particolare cartella, tutti i file che verrano creati in essa apparterranno automaticamente al gruppo proprietario della cartella e non al gruppo dell’utente che crea i file.

Il bit Sticky, quando applicato ad una cartella, limita la possibilità di eliminare i file in essa contenuti al solo utente che li ha creati (restricted deletion flag: utilizzato sulle directory world-writable come /tmp ).

Access mode bits: chown, chgrp

I comandi chown e chgrp consentono, rispettivamente, di modificare proprietario ( owner ) e gruppo ( group ) di file e cartelle.

Ad esempio, il comando:

andrea@ganimoide:~$ chgrp luca documento

cambia il gruppo che possiede il file documento

Se usato insieme all’opzione -R, chgrp modifica ricorsivamente il gruppo di tutti i file e cartelle contenuti nella cartella in cui viene eseguito il comando.

La sintassi di chown è simile a quella di chgrp.

Per completezza, riportiamo un esempio:

andrea@ganimoide:~$ chown luca documento

Esercizio:

Quale risultato vi aspettate dall’esecuzione del precedente esempio?

Access mode bits: chmod

Il comando chmod consente di modificare gli access mode bits. In questo modo è possibile impostare i permessi di lettura, scrittura ed esecuzione dei file.

andrea@ganimoide:~/cartella$ chmod a+w documento 
andrea@ganimoide:~/cartella$ ls -l
totale 4
-rw-rw-rw- 1 andrea andrea    0 2009-01-28 18:50 documento

L’esempio sopra mostra come utilizzare il comando chmod per concedere a tutti gli utenti del sistema il permesso di scrittura sul file documento. Poichè il permesso di lettura era già presente, in totale il file risulta leggibile e modificabile da tutti.

Altri esempi sono:

Come per i comandi chown e chgrp, anche chmod consente la modifica ricorsiva dei permessi tramite l’opzione -R.

Access mode bits: numerazione ottale

Oltre alla sintassi mnemonica che fa uso degli operatori +/- e r, w, x, u, g, a. etc. chmod prevede l’uso di una sintassi compatta basata sulla numerazione ottale.

In pratica, l’argomento che viene passato a chmod è un numero di 4 cifre che rappresenta in maniera sintetica i permessi da associare al file.

La prima cifra rappresenta i bit SUID, GID, sticky.

La seconda cifra rappresenta i bit relativi a owner.

La terza cifra rappresenta i bit relativi a group.

La quarta cifra rappresenta i bit relativi a all.

Ciascuna delle 4 cifre può assumere solo i valori da 0 a 7. Al valore 4 corrisponde il permesso di lettura; al valore 2 il permesso di scrittura; al valore 1 il permesso di esecuzione; al valore 0 alcun permesso. Questi permessi si possono combinare sommando i rispettivi valori.

Vediamo qualche esempio:

Link

I file di tipo link costituiscono un aspetto molto importante dei fs Unix in generale e GNU/Linux in particolare.

Un link permette di collegare un file ad un altro file o a una cartella.

Si dice che un link punta ad un file o ad una cartella.

Per mezzo dei link è possibile:

I link si suddividono di solito in due tipologie:

Link simbolici: esempio di utilizzo

Supponiamo di amministrare un server accessibile mediante SSH e basato su GNU/Linux.

SFTP è un servizio fornito dal demone sshd che permette a più utenti di prelevare e immettere file da una posizione centralizzata.

Nel caso in esame, ogni utente del sistema possiede una sua cartella personale (es: /home/utente), all’interno della quale egli può trasferire i propri file ( upload ).

Il sistema può essere configurato in maniera tale che esista una cartella condivisa da tutti gli utenti. Supponiamo che questa cartella sia posizionata in /srv/ftp.

Al fine di consentire ad ogni utente un veloce accesso alla cartella condivisa, l’uso dei link diventa fondamentale.

Infatti, si può pensare di realizzare un link all’interno della cartella dell’utente che punti alla cartella /srv/ftp.

In questo modo, ogni utente può scaricare i file condivisi mediante un path più facilmente raggiungibile e memorizzabile.

Link simbolici: ln

Il comando per creare link simbolici e hard link è ln.

andrea@ganimoide:~/cartella$ ln -s /var/log/messages messages
andrea@ganimoide:~/cartella$ ls -l
totale 4
-rw------- 1 andrea andrea    0 2009-01-28 19:14 documento
lrwxrwxrwx 1 andrea andrea   17 2009-01-29 10:51 messages -> /var/log/messages
drwxr-xr-x 2 andrea andrea 4096 2009-01-28 15:58 sottocartella

Il comando ln utilizzato con l’opzione -s crea un link simbolico. Il nome del link è il secondo argomento del comando. Il file o la cartella a cui il link punta è il primo argomento del comando.

Notare l’output del comando ls -l. La presenza del link è esplicitamente indicata dal simbolo -> a sinistra del nome del link.

Nell’esempio, il comando crea un link “locale” al file di log /var/log/messages.

In questo modo l’utente può visualizzare il contenuto di messages senza preoccuparsi di immettere il percorso completo del file:

andrea@ganimoide:~/cartella$ tail messages

Hard link 1/2

Un hard link è un puntatore ad un file già presente su un filesystem.

L’ hard link si differenzia dal soft link in quanto continua a puntare verso lo stesso file anche quando il file originale viene rimosso.

andrea@ganimoide:~$ echo "test" > file
andrea@ganimoide:~$ ls -l
total 4
-rw-r--r-- 1 rpl rpl 5 Jan 30 01:12 file
andrea@ganimoide:~$ ln file hardlink1
andrea@ganimoide:~$ ln file hardlink2
andrea@ganimoide:~$ ls -l
total 12
-rw-r--r-- 3 rpl rpl 5 Jan 30 01:12 file
-rw-r--r-- 3 rpl rpl 5 Jan 30 01:12 hardlink1
-rw-r--r-- 3 rpl rpl 5 Jan 30 01:12 hardlink2
andrea@ganimoide:~$ stat hardlink1
  File: `hardlink1'
  Size: 5         	Blocks: 8          IO Block: 4096   regular file
Device: 809h/2057d	Inode: 313967      Links: 3
Access: (0644/-rw-r--r--)  Uid: ( 1002/     rpl)   Gid: ( 1003/     rpl)
Access: 2009-01-30 01:12:35.000000000 +0100
Modify: 2009-01-30 01:12:35.000000000 +0100
Change: 2009-01-30 01:12:46.000000000 +0100

Hard link 2/2

Bisogna notare come la seconda colonna dell’output di ls -l ci indichi il numero di hard link che puntano verso il file, il comando stat esplicità tale informazione.

Lo spazio occupato da tale file non viene considerato libero fino a quando l’ultimo hard link non è stato rimosso.

La stragrande maggioranza delle implementazioni dello standard Posix non consentono la creazione di hard link di directory, ne di file presenti su filesystem diversi da quelli su cui si intende creare un hard link.

In questi casi si possono al contrario utilizzare i soft link (o link simbolici).

Preservare i link

I comandi come cp a tar possono essere istruiti, tramite specifiche opzioni, a seguire o meno i link.

Nell’ambito delle operazioni sui file, Seguire un link significa sostituirla con i file a cui esso punta.

andrea@ganimoide:~$ ls -l dir1 
total 13 
lrwxrwxrwx 1 andrea andrea      19 Jan  4 02:43 file1 -> /file1 
-rw-r--r-- 1 andrea andrea   10240 Dec 12 17:12 file2 
andrea@ganimoide:~$ cp -r dir1 dir2 
andrea@ganimoide:~$ ls -l dir2 
total 3117 
-rw-r--r-- 1 andrea andrea 3164160 Jan  4 02:43 file1 
-rw-r--r-- 1 andrea andrea   10240 Jan  4 02:43 file2 
andrea@ganimoide:~$ cp -rd dir1 dir3 
andrea@ganimoide:~$ ls -l dir3 
total 13 
lrwxrwxrwx 1 andrea andrea      19 Jan  4 02:43 file1 -> /file1 
-rw-r--r-- 1 andrea andrea   10240 Jan  4 02:43 file2

Nell’esempio sono riportati due utilizzi di cp.

Nel primo caso viene effettuata una copia ricorsiva del contenuto della cartella dir1 su dir2. Come si vede, il comando segue il link copiando in dir2 il file a cui esso punta.

Nel secondo caso, invece, viene usata l’opzione -d. Questa opzione segnala a cp di non seguire il link. Infatti, nella cartella di destinazione viene copiato il link e non il file a cui esso punta.

Ottenere informazioni sui link

Come abbiamo visto, il comando ls -l ci consente di avere un riscontro visivo sui file puntati da un link.

andrea@ganimoide:~/cartella$ ls -l | grep ^l
lrwxrwxrwx 1 andrea andrea    9 2009-01-29 17:59 link_a_documento -> documento

L’operazione inversa, cioè scoprire quali link puntano ad un determinato file, si esegue utilizzando il comando find:

andrea@ganimoide:~/cartella$ ls -l
totale 4
lrwxrwxrwx 1 andrea andrea    9 2009-01-29 18:04 altro_link_a_documento -> documento
-rw------- 1 andrea andrea    0 2009-01-28 19:14 documento
lrwxrwxrwx 1 andrea andrea    9 2009-01-29 17:59 link_a_documento -> documento
drwxr-xr-x 2 andrea andrea 4096 2009-01-29 17:45 sottocartella
andrea@ganimoide:~/cartella$ find -lname documento
./altro_link_a_documento
./link_a_documento

Esercizio:

Spiegate il funzionamento del comando dato nel primo esempio (ls -l | grep ^l).

Organizzazione del filesystem: FHS 1/2

Esiste uno standard che definisce la struttura del filesystem di un sistema GNU/Linux. Questo standard prende il nome di Filesystem Hierarchy Standard (FHS).

Lo standard prevede un’organizzazione delle cartelle di questo tipo:

Organizzazione del filesystem: FHS 2/2

Nell’esempio sotto viene riportata la struttura delle cartelle montate su / di un sistema Ubuntu GNU/Linux:

andrea@ganimoide:~$ ls /
bin   cdrom  etc   initrd.img      lib         media  opt   root  srv  tmp  var      vmlinuz.old
boot  dev    home  initrd.img.old  lost+found  mnt    proc  sbin  sys  usr  vmlinuz

Cercare file nel filesystem

Come più volte abbiamo visto nel corso delle lezioni precedenti, find è il comando che di solito si utilizza per ricercare file all’interno del fs.

Un altro comando utile in questo senso è locate:

andrea@ganimoide:~$ locate documento
/home/andrea/cartella/documento

Come si vede, l’utilizzo di locate è molto semplice: si fa seguire al comando la parola chiave da ricercare.

Il comando locate ricerca le informazioni all’interno di un database che viene aggiornato periodicamente per mezzo del comando updatedb.

Il vantaggio di usare locate al posto di find consiste nella maggiore velocità del primo.

Il comando, infatti, non effettua una ricerca in tempo reale sul filesystem bensì all’interno del database.

Ovviamente, lo svantaggio è che il comando locate non registra immediatamente le modifiche al filesystem.

Copyright (C) 2008 - Alca Societa' Cooperativa

http://alca.le.it - info@alca.le.it

released under CreativeCommons 2.5 by-nc-sa

NOTA: le immagini dei software e dei device contenuti
nella presentazione sono proprieta' dei relativi detentori
del copyright e sono state riprodotte a scopo esclusivamente didattico.