5.4 Lezione 1
Certificazione: |
Linux Essentials |
---|---|
Versione: |
1.6 |
Argomento: |
5 Sicurezza e Permessi sui File |
Obiettivo: |
5.4 Directory e File Speciali |
Lezione: |
1 di 1 |
Introduzione
In Linux, tutto viene trattato come un file. Tuttavia alcuni file ricevono un trattamento speciale, sia per dove sono memorizzati, come nel caso dei file temporanei, sia per il modo in cui interagiscono con il filesystem, come nel caso dei link. In questa lezione impareremo posizione, funzionamento e gestione di tali file.
File Temporanei
I file temporanei sono file utilizzati dai programmi per archiviare dati necessari solo per un periodo di tempo limitato: per esempio dati dei processi in esecuzione, log di guasti (crash logs), file scratch di un salvataggio automatico, file intermedi utilizzati durante una conversione di file, file di cache e così via.
Posizione dei File Temporanei
La versione 3.0 del Filesystem Hierarchy Standard (FHS) definisce le posizioni standard per i file temporanei sui sistemi Linux. Ogni posizione ha uno scopo e un comportamento diverso: è consigliato agli sviluppatori seguire le convenzioni impostate dal FHS quando scrivono dati temporanei sul disco.
/tmp
-
Secondo il FHS, i programmi non dovrebbero supporre che i file scritti qui vengano conservati tra invocazioni di un programma. Il consiglio è di pulire questa directory (tutti i file cancellati) durante l’avvio del sistema, sebbene questo non sia obbligatorio.
/var/tmp
-
Un’altra posizione per i file temporanei, ma questa non dovrebbe essere pulita durante l’avvio del sistema, ovvero i file archiviati qui di solito persistono tra i riavvii.
/run
-
Questa directory contiene dati variabili di run-time utilizzati dai processi in esecuzione, come i file di identificativo di processo (
.pid
). I programmi che richiedono più di un file di run-time possono creare sottodirectory qui. Questa posizione deve essere pulita durante l’avvio del sistema. In passato la funzione di questa directory era assolta da/var/run
, e su alcuni sistemi/var/run
potrebbe essere un link simbolico a/run
.
Nota che nulla impedisce a un programma di creare file temporanei altrove nel sistema, ma è buona norma rispettare le convenzioni stabilite dal FHS.
Permessi sui File Temporanei
L’esistenza di directory temporanee a livello di sistema su un sistema multiutente presenta alcune criticità in relazione ai permessi di accesso. Di primo acchito si potrebbe pensare che tali directory siano “scrivibili da chiunque” (“world-writable”), cioè che qualsiasi utente possa scrivere o cancellare dati al loro interno. Ma se fosse vero, come potremmo impedire a un utente di cancellare o modificare file creati da un altro utente?
La soluzione è un permesso speciale chiamato sticky bit, che si applica sia alle directory sia ai file. Tuttavia, per motivi di sicurezza, il kernel Linux ignora lo sticky bit quando viene applicato ai file. Quando questo bit speciale è impostato su una directory, impedisce agli utenti di rimuovere o rinominare un file all’interno di quella directory a meno che non siano i proprietari del file stesso.
Le directory con impostato lo sticky bit mostrano una t
che sostituisce la x
nei permessi per gli altri nell’output di ls -l
. Per esempio, controlliamo i permessi per le directory /tmp
e /var/tmp
:
$ ls -ldh /tmp/ /var/tmp/ drwxrwxrwt 25 root root 4,0K Jun 7 18:52 /tmp/ drwxrwxrwt 16 root root 4,0K Jun 7 09:15 /var/tmp/
Come puoi vedere dalla t
che sostituisce la x
nei permessi per gli altri, entrambe le directory hanno impostato lo sticky bit.
Per impostare lo sticky bit su una directory utilizzando chmod
in modalità numerica, utilizza la notazione a quattro cifre e 1
come prima cifra. Per esempio:
$ chmod 1755 temp
Questo comando imposta lo sticky bit sulla directory temp
e i imposta permessi a rwxr-xr-t
.
Quando si utilizza la modalità simbolica, è necessario utilizzare il parametro t
. Quindi utilizza +t
per impostare lo sticky bit e -t
per rimuoverlo, nel seguente modo:
$ chmod +t temp
Comprendere i Link
Abbiamo già detto che su Linux tutto viene trattato come un file, ma ne esiste un tipo speciale, chiamato link. Ci sono due tipi di link su un sistema Linux:
- Link Simbolici
-
Chiamati anche soft link, puntano al percorso di un altro file. Se elimini il file a cui punta il link (chiamato target) il link esisterà ancora, ma “smetterà di funzionare”, poiché adesso punta al “nulla”.
- Hard link
-
Pensa un hard link come un secondo nome del file originale. Non sono duplicati, ma voci aggiuntive nel file system che puntano alla stessa posizione (inode) sul disco.
Tip
|
Un inode è una struttura dati che memorizza gli attributi di un oggetto (come un file o una directory) su un filesystem. Tra questi attributi ci sono il nome del file, i permessi, l’ownership e su quali blocchi del disco sono memorizzati i dati dell’oggetto. Pensalo come una voce in un indice: da qui il nome, che deriva da “index node”. |
Lavorare con gli Hard Link
Creare Hard Link
Il comando per creare un hard link su Linux è ln
. La sintassi base è:
$ ln TARGET LINK_NAME
Il TARGET
deve già esistere (questo è il file a cui punta il link), e, se il target non si trova nella directory corrente, o se si desidera creare il link altrove, è necessario specificarne il percorso completo. Per esempio, il comando
$ ln target.txt /home/carol/Documents/hardlink
crea un file chiamato hardlink
nella directory /home/carol/Documents/
, collegato al file target.txt
nella directory corrente.
Se tralasci l’ultimo parametro (LINK_NAME
), viene creato un link con lo stesso nome del target nella directory corrente.
Gestire gli Hard Link
Gli hard link sono voci nel filesystem che hanno nomi diversi, ma che puntano agli stessi dati sul disco. Tutti questi nomi sono equivalenti e possono essere utilizzati per fare riferimento a un file. Se si modifica il contenuto di uno dei nomi, viene modificato il contenuto di tutti gli altri nomi che puntano a quel file, poiché tutti questi nomi puntano agli stessi dati. Se elimini uno dei nomi, gli altri continueranno a funzionare.
Ciò accade perché quando si “elimina” un file i dati non vengono effettivamente cancellati dal disco. Il sistema cancella semplicemente la voce nella tabella del filesystem che punta all’inode corrispondente ai dati sul disco. Ma se c’è una seconda voce che punta allo stesso inode, sarà comunque possibile accedere ai dati. Pensa a questo come a due strade che convergono nello stesso punto. Anche se blocchi o devii una delle strade, puoi comunque raggiungere la destinazione utilizzando l’altra.
Puoi verificarlo utilizzando l’opzione -i
di ls
. Considera il seguente contenuto di una directory:
$ ls -li total 224 3806696 -r--r--r-- 2 carol carol 111702 Jun 7 10:13 hardlink 3806696 -r--r--r-- 2 carol carol 111702 Jun 7 10:13 target.txt
Il numero prima dei permessi è il numero di inode. Hai notato che sia il file hardlink
sia il file target.txt
hanno lo stesso numero (3806696
)? Questo perché uno è un hard link dell’altro.
Ma qual è l’originale e qual è il link? Non si può davvero dire, poiché, a tutti gli effetti, sono la stessa cosa.
Nota che ogni hard link che punta a un file incrementa il contatore di link (link count) del file. Questo è il numero subito dopo i permessi nell’output di ls -l
. Per impostazione predefinita, ogni file ha un link count pari a 1
(2
per le directory) e ogni hard link a esso aumenta il conteggio di uno. Quindi, questo è il motivo per cui nei file dell’elenco sopra riportato il link count è pari a 2
.
A differenza dei link simbolici, è possibile creare solo hard link ai file; sia il link sia il target devono risiedere nello stesso file system.
Spostare e Rimuovere Hard Link
Poiché gli hard link sono trattati come file normali, possono essere cancellati con rm
e rinominati o spostati nel filesystem con mv
. E poiché un hard link punta allo stesso inode del target, può essere spostato liberamente, senza timore di “rompere” il collegamento.
Link Simbolici
Creare Link Simbolici
Anche il comando usato per creare un link simbolico è ln
, ma con l’aggiunta dell’opzione -s
, nel seguente modo:
$ ln -s target.txt /home/carol/Documents/softlink
Questo comando crea un file chiamato softlink
nella directory /home/carol/Documents/
che punta al file target.txt
nella directory corrente.
Come per gli hard link è possibile omettere il nome del link per creare un link con lo stesso nome del target nella directory corrente.
Gestire i Link Simbolici
I link simbolici puntano a un altro percorso nel filesystem. È possibile creare soft link di file e directory, anche su partizioni diverse. È abbastanza facile individuare un link simbolico dall’output di ls
:
$ ls -lh total 112K -rw-r--r-- 1 carol carol 110K Jun 7 10:13 target.txt lrwxrwxrwx 1 carol carol 12 Jun 7 10:14 softlink -> target.txt
Nell’esempio sopra riportato, il primo carattere nei permessi del file softlink
è l
, che indica un link simbolico. Inoltre, subito dopo il nome del file possiamo notare il nome del target a cui punta il link: il file target.txt
.
Nota che negli elenchi di file e directory, i soft link mostrano sempre i permessi rwx
per l’utente, il gruppo e gli altri, ma in pratica i loro permessi di accesso sono gli stessi di quelli del target.
Spostare e Rimuovere Link Simbolici
Come per gli hard link, i link simbolici possono essere rimossi usando rm
e possono essere spostati o rinominati usando mv
. Tuttavia, è necessario prestare particolare attenzione durante la loro creazione per evitare di “rompere” il link nel caso in cui venga spostato dalla sua posizione originale.
Quando si creano link simbolici è necessario essere consapevoli del fatto che, a meno che un percorso non sia completamente specificato, la posizione del target viene interpretata come relativa alla posizione del link. Ciò potrebbe creare problemi se il link o il file a cui punta viene spostato.
È più facile capirlo con un esempio: supponiamo di avere un file chiamato original.txt
nella directory corrente e di voler creare un link simbolico a esso chiamato softlink
. Possiamo usare:
$ ln -s original.txt softlink
E a quanto pare tutto è andato per il verso giusto. Controlliamo con ls
:
$ ls -lh total 112K -r--r--r-- 1 carol carol 110K Jun 7 10:13 original.txt lrwxrwxrwx 1 carol carol 12 Jun 7 19:23 softlink -> original.txt
Guarda come è costruito il link: softlink
punta a (→
) original.txt
. Tuttavia, vediamo cosa succede se spostiamo il link nella directory padre e proviamo a visualizzarne il contenuto utilizzando il comando less
:
$ mv softlink ../ $ less ../softlink ../softlink: No such file or directory
Poiché il percorso di original.txt
non è stato specificato, il sistema presume che si trovi nella stessa directory del link. Quando questo non è più vero, il link smette di funzionare.
Per evitare ciò è necessario specificare sempre il percorso completo del target durante la creazione del link:
$ ln -s /home/carol/Documents/original.txt softlink
In questo modo, indipendentemente da dove sposti il link, questo continuerà a funzionare, perché punta alla posizione assoluta del target. Controlla con ls
:
$ ls -lh total 112K lrwxrwxrwx 1 carol carol 40 Jun 7 19:34 softlink -> /home/carol/Documents/original.txt
Esercizi Guidati
-
Immagina che un programma debba creare un file temporaneo monouso che non sarà mai più necessario dopo la chiusura del programma. Qual è la directory corretta in cui creare questo file?
-
Qual è la directory temporanea che deve essere cancellata durante il processo di avvio?
-
Qual è il parametro di
chmod
per abilitare, in modalità simbolica, lo sticky bit su una directory? -
Immagina che ci sia un file chiamato
document.txt
nella directory/home/carol/Documents
. Qual è il comando per creare un link simbolico, chiamatotext.txt
, a tale file nella directory corrente? -
Spiega la differenza tra un hard link e una copia di un file.
Esercizi Esplorativi
-
Immagina di creare un file chiamato
recipes.txt
all’interno di una directory . All’interno di questa directory, crei anche un hard link a questo file, chiamatoreceitas.txt
, e un link simbolico (o soft) a questo chiamatorezepte.txt
.$ touch recipes.txt $ ln recipes.txt receitas.txt $ ln -s receitas.txt rezepte.txt
Il contenuto della directory dovrebbe apparire così:
$ ls -lhi total 160K 5388833 -rw-r--r-- 4 carol carol 77K jun 17 17:25 receitas.txt 5388833 -rw-r--r-- 4 carol carol 77K jun 17 17:25 recipes.txt 5388837 lrwxrwxrwx 1 carol carol 12 jun 24 10:12 rezepte.txt -> receitas.txt
Ricorda che, in quanto hard link,
receitas.txt
punta allo stesso inode direcipes.txt
. Che cosa succede al soft linkrezepte.txt
sereceitas.txt
venisse cancellato? Per quale motivo? -
Immagina di avere una chiavetta USB collegata al tuo sistema montata su
/media/youruser/FlashA
. Vuoi creare nella tua directory home un link chiamatoschematics.pdf
che punti al fileesquema.pdf
nella directory principale della chiavetta. Digiti quindi il comando:$ ln /media/youruser/FlashA/esquema.pdf ~/schematics.pdf
Che cosa succede? Per quale motivo?
-
Considera il seguente output di
ls -lah
:$ ls -lah total 3,1M drwxr-xr-x 2 carol carol 4,0K jun 17 17:27 . drwxr-xr-x 5 carol carol 4,0K jun 17 17:29 .. -rw-rw-r-- 1 carol carol 2,8M jun 17 15:45 compressed.zip -rw-r--r-- 4 carol carol 77K jun 17 17:25 document.txt -rw-rw-r-- 1 carol carol 216K jun 17 17:25 image.png -rw-r--r-- 4 carol carol 77K jun 17 17:25 text.txt
-
Quanti link puntano al file
document.txt
? -
Sono soft o hard link?
-
Quale parametro devi passare a
ls
per vedere quale inode occupa ogni file?
-
-
Immagina di avere nella tua directory
~/Documents
un file chiamatoclients.txt
contenente alcuni nomi di client e una directory chiamatasomedir
. All’interno di essa c’è un altro file anch’esso chiamatoclients.txt
con nomi differenti. Per replicare questa struttura utilizza i seguenti comandi.$ cd ~/Documents $ echo "John, Michael, Bob" > clients.txt $ mkdir somedir $ echo "Bill, Luke, Karl" > somedir/clients.txt
Crea poi un link all’interno di
somedir
chiamatopartners.txt
che punta a questo file, utilizzando i seguenti comandi:$ cd somedir/ $ ln -s clients.txt partners.txt
Quindi la struttura della directory è:
Documents |-- clients.txt `-- somedir |-- clients.txt `-- partners.txt -> clients.txt
Ora, sposta
partners.txt
dasomedir
a~/Documents
ed elencane il contenuto.$ cd ~/Documents/ $ mv somedir/partners.txt . $ less partners.txt
Il link funziona ancora? In tal caso, quale file avrà il suo contenuto elencato? Per quale motivo?
-
Considera i seguenti file:
-rw-r--r-- 1 carol carol 19 Jun 24 11:12 clients.txt lrwxrwxrwx 1 carol carol 11 Jun 24 11:13 partners.txt -> clients.txt
Quali sono i permessi di accesso per
partners.txt
? Per quale motivo?
Sommario
In questa lezione hai imparato:
-
Dove vengono memorizzati i file temporanei;
-
Qual è il permesso speciale che viene loro applicato;
-
Cosa sono i link;
-
La differenza tra link simbolici e hard link;
-
Come creare i link;
-
Come spostarli, rinominarli o rimuoverli.
In questa lezione sono stati discussi i seguenti comandi:
-
ln
-
Il parametro
-i
dils
Risposte agli Esercizi Guidati
-
Immagina che un programma debba creare un file temporaneo monouso che non sarà mai più necessario dopo la chiusura del programma. Qual è la directory corretta in cui creare questo file?
Poichè, dopo che il programma ha terminato l’esecuzione, non ci interessa più il file, la directory corretta è
/tmp
. -
Qual è la directory temporanea che deve essere cancellata durante il processo di avvio?
La directory è
/run
o, su alcuni sistemi,/var/run
. -
Qual è il parametro di
chmod
per abilitare, in modalità simbolica, lo sticky bit su una directory?Il simbolo dello sticky bit in modalità simbolica è
t
. Dato che vogliamo abilitare (aggiungere) questo permesso alla directory, il parametro è+t
. -
Immagina che ci sia un file chiamato
document.txt
nella directory/home/carol/Documents
. Qual è il comando per creare un link simbolico, chiamatotext.txt
, a tale file nella directory corrente?ln -s
è il comando per creare un link simbolico. Poiché è necessario specificare il percorso completo del file del quale stai creando il link, il comando è:$ ln -s /home/carol/Documents/document.txt text.txt
-
Spiega la differenza tra un hard link e una copia di un file.
Un hard link è solo un altro nome per un file. Anche se sembra un duplicato del file originale, a tutti gli effetti sia il link sia il file originale sono la stessa cosa, poiché puntano agli stessi dati sul disco. Le modifiche apportate al contenuto del link si riflettono sul file originale e viceversa. Una copia è un’entità completamente indipendente, che occupa un posto diverso sul disco. Le modifiche alla copia non si riflettono sull’originale e viceversa.
Risposte agli Esercizi Esplorativi
-
Immagina di creare un file chiamato
recipes.txt
all’interno di una directory . All’interno di questa directory, crei anche un hard link a questo file, chiamatoreceitas.txt
, e un link simbolico (o soft) a questo chiamatorezepte.txt
.$ touch recipes.txt $ ln recipes.txt receitas.txt $ ln -s receitas.txt rezepte.txt
Il contenuto della directory dovrebbe apparire così:
$ ls -lhi total 160K 5388833 -rw-r--r-- 4 carol carol 77K jun 17 17:25 receitas.txt 5388833 -rw-r--r-- 4 carol carol 77K jun 17 17:25 recipes.txt 5388837 lrwxrwxrwx 1 carol carol 12 jun 24 10:12 rezepte.txt -> receitas.txt
Ricorda che, in quanto hard link,
receitas.txt
punta allo stesso inode direcipes.txt
. Che cosa succede al soft linkrezepte.txt
sereceitas.txt
venisse cancellato? Per quale motivo?Il soft link
rezepte.txt
smetterebbe di funzionare. Questo perché i soft link puntano ai nomi, non agli inode, e il nomereceitas.txt
non esiste più, anche se i dati sono ancora sul disco con il nomerecipes.txt
. -
Immagina di avere una chiavetta USB collegata al tuo sistema montata su
/media/youruser/FlashA
. Vuoi creare nella tua directory home un link chiamatoschematics.pdf
che punti al fileesquema.pdf
nella directory principale della chiavetta. Digiti quindi il comando:$ ln /media/youruser/FlashA/esquema.pdf ~/schematics.pdf
Che cosa succede? Per quale motivo?
Il comando non viene eseguito correttamente. Il messaggio di errore è
Invalid cross-device link
facendoti capire il motivo: gli hard link non possono puntare a un target in una diversa partizione o in un diverso dispositivo. L’unico modo per creare un link come questo è usare un link simbolico o soft, aggiungendo il parametro-s
aln
. -
Considera il seguente output di
ls -lah
:$ ls -lah total 3,1M drwxr-xr-x 2 carol carol 4,0K jun 17 17:27 . drwxr-xr-x 5 carol carol 4,0K jun 17 17:29 .. -rw-rw-r-- 1 carol carol 2,8M jun 17 15:45 compressed.zip -rw-r--r-- 4 carol carol 77K jun 17 17:25 document.txt -rw-rw-r-- 1 carol carol 216K jun 17 17:25 image.png -rw-r--r-- 4 carol carol 77K jun 17 17:25 text.txt
-
Quanti link puntano al file
document.txt
?Ogni file inizia con un link count pari a
1
. Poiché il link count del file è4
, ci sono tre link che puntano a quel file. -
Sono soft o hard link?
Sono hard link, poiché i soft link non incrementano il link count di un file.
-
Quale parametro devi passare a
ls
per vedere quale inode occupa ogni file?Il parametro è
-i
. L’inode viene mostrato come prima colonna nell’output dils
, come puoi vedere nel seguente esempio:$ ls -lahi total 3,1M 5388773 drwxr-xr-x 2 rigues rigues 4,0K jun 17 17:27 . 5245554 drwxr-xr-x 5 rigues rigues 4,0K jun 17 17:29 .. 5388840 -rw-rw-r-- 1 rigues rigues 2,8M jun 17 15:45 compressed.zip 5388833 -rw-r--r-- 4 rigues rigues 77K jun 17 17:25 document.txt 5388837 -rw-rw-r-- 1 rigues rigues 216K jun 17 17:25 image.png 5388833 -rw-r--r-- 4 rigues rigues 77K jun 17 17:25 text.txt
-
-
Immagina di avere nella tua directory
~/Documents
un file chiamatoclients.txt
contenente alcuni nomi di client e una directory chiamatasomedir
. All’interno di essa c’è un altro file anch’esso chiamatoclients.txt
con nomi differenti. Per replicare questa struttura utilizza i seguenti comandi.$ cd ~/Documents $ echo "John, Michael, Bob" > clients.txt $ mkdir somedir $ echo "Bill, Luke, Karl" > somedir/clients.txt
Crea poi un link all’interno di
somedir
chiamatopartners.txt
che punta a questo file, utilizzando i seguenti comandi:$ cd somedir/ $ ln -s clients.txt partners.txt
Quindi la struttura della directory è:
Documents |-- clients.txt `-- somedir |-- clients.txt `-- partners.txt -> clients.txt
Ora, sposta
partners.txt
dasomedir
a~/Documents
ed elencane il contenuto.$ cd ~/Documents/ $ mv somedir/partners.txt . $ less partners.txt
Il link funziona ancora? In tal caso, quale file avrà il suo contenuto elencato? Per quale motivo?
È “ingannevole”, ma il link funziona e il file elencato sarà quello in
~/Documents
, contenente i nomiJohn
,Michael
,Bob
.Ricorda che poiché non hai specificato il percorso completo del target
clients.txt
durante la creazione del soft linkpartners.txt
, il percorso del target viene interpretato come relativo alla posizione del link, che in questo caso è la directory corrente.Quando il link viene spostato da
~/Documents/somedir
a~/Documents
, dovrebbe smettere di funzionare, poiché il target non è più nella stessa directory del link. Tuttavia, per coincidenza, c’è un file chiamatoclients.txt
in~/Documents
: quindi il link punterà a questo file, invece che al target originale all’interno di~/somedir
.Per evitare ciò, specifica sempre il percorso completo del target quando crei un link simbolico.
-
Considera i seguenti file:
-rw-r--r-- 1 rigues rigues 19 Jun 24 11:12 clients.txt lrwxrwxrwx 1 rigues rigues 11 Jun 24 11:13 partners.txt -> clients.txt
Quali sono i permessi di accesso per
partners.txt
? Per quale motivo?I permessi di accesso di
partners.txt
sonorw-r—r--
, poiché i link ereditano sempre gli stessi permessi di accesso del target.