Un file è un inode con metadati tra cui un elenco di puntatori a dove trovare i dati.
Per poter accedere a un file, è necessario collegarlo a una directory (pensare alle rubriche come rubriche telefoniche, non cartelle), ovvero aggiungere una o più voci a una o più rubriche per associare un nome a quel file.
Tutti quei collegamenti, quei nomi di file puntano allo stesso file. Non ce n'è uno che è l'originale e gli altri che sono collegamenti. Sono tutti punti di accesso allo stesso file (stesso inode) nella struttura di directory. Quando ottieni la dimensione del file ( lstat
chiamata di sistema), stai recuperando le informazioni (quei metadati di cui sopra) memorizzati nell'inode, non importa quale nome di file, quale link stai usando per fare riferimento a quel file .
Al contrario, i symlink sono un altro file (un altro inode) il cui contenuto è un percorso del file di destinazione. Come qualsiasi altro file, tali collegamenti simbolici devono essere collegati a una directory (deve avere un nome) in modo che sia possibile accedervi. È inoltre possibile disporre di più collegamenti a un collegamento simbolico o, in altre parole, ai collegamenti simbolici possono essere assegnati più nomi (in una o più directory).
$ touch a
$ ln a b
$ ln -s a c
$ ln c d
$ ls -li [a-d]
10486707 -rw-r--r-- 2 stephane stephane 0 Aug 27 17:05 a
10486707 -rw-r--r-- 2 stephane stephane 0 Aug 27 17:05 b
10502404 lrwxrwxrwx 2 stephane stephane 1 Aug 27 17:05 c -> a
10502404 lrwxrwxrwx 2 stephane stephane 1 Aug 27 17:05 d -> a
Sopra il numero di file 10486707 è presente un file normale. Due voci nella directory corrente (una con nome a
, una con nome b
) si collegano ad essa. Poiché il conteggio dei collegamenti è 2, sappiamo che non c'è nessun altro nome di quel file nella directory corrente o in qualsiasi altra directory. Il numero di file 10502404 è un altro file, questa volta di tipo symlink collegato due volte alla directory corrente. Il suo contenuto (target) è il percorso relativo "a".
Si noti che se 10502404 fosse collegato a una directory diversa da quella corrente, in genere farebbe riferimento a un file diverso a seconda della modalità di accesso.
$ mkdir 1 2
$ echo foo > 1/a
$ echo bar > 2/a
$ ln -s a 1/b
$ ln 1/b 2/b
$ ls -lia 1 2
1:
total 92
10608644 drwxr-xr-x 2 stephane stephane 4096 Aug 27 17:26 ./
10485761 drwxrwxr-x 443 stephane stephane 81920 Aug 27 17:26 ../
10504186 -rw-r--r-- 1 stephane stephane 4 Aug 27 17:24 a
10539259 lrwxrwxrwx 2 stephane stephane 1 Aug 27 17:26 b -> a
2:
total 92
10608674 drwxr-xr-x 2 stephane stephane 4096 Aug 27 17:26 ./
10485761 drwxrwxr-x 443 stephane stephane 81920 Aug 27 17:26 ../
10539044 -rw-r--r-- 1 stephane stephane 4 Aug 27 17:24 a
10539259 lrwxrwxrwx 2 stephane stephane 1 Aug 27 17:26 b -> a
$ cat 1/b
foo
$ cat 2/b
bar
I file non hanno nomi associati ad essi se non nelle directory che li collegano. Lo spazio occupato dai loro nomi è la voce in quelle directory, è contabilizzato nella dimensione del file / utilizzo del disco delle directory.
Noterai che la chiamata di sistema per rimuovere un file è unlink
. Cioè, non rimuovi i file, li scolleghi dalle directory in cui fanno riferimento. Una volta scollegato dall'ultima directory che aveva una voce in un dato file, quel file viene quindi distrutto (a condizione che nessun processo lo abbia ha aperto).
lstat
chiamata di sistema che ottiene la loro dimensione.