Un file è un inode con meta dati tra i quali un elenco di puntatori a dove trovare i dati.
Per poter accedere a un file, devi collegare inserirlo in una directory (si pensi alle directory come elenchi telefonici, non cartelle), ovvero aggiungere una o più voci a una o più directory per associare un nome con quel file.
Tutti quei collegamenti, quei nomi di file puntano allo stesso file. Non ce n'è uno che sia originale e gli altri che siano link. Sono tutti punti di accesso allo stesso file (stesso inode) nell'albero delle directory. Quando ottieni la dimensione del file (lstat
chiamata di sistema), stai recuperando le informazioni (quei metadati di cui sopra) memorizzate nell'inode, non importa quale nome di file, quale link stai usando per fare riferimento a quel file.
Al contrario, i collegamenti simbolici sono un altro file (un altro inode) il cui contenuto è un percorso al file di destinazione. Come qualsiasi altro file, questi collegamenti simbolici devono essere collegati a una directory (devono avere un nome) in modo che tu possa accedervi. Puoi anche avere diversi collegamenti a un collegamento simbolico o, in altre parole, ai collegamenti simbolici possono essere assegnati diversi 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 c'è un file normale. Due voci nella directory corrente (una con nome a
, uno con nome b
) si collega ad esso. Perché il conteggio dei link è 2, sappiamo che non c'è nessun altro nome di quel file nella directory corrente o in qualsiasi altra directory. Il file numero 10502404 è un altro file, questa volta di tipo collegamento simbolico collegato due volte alla directory corrente. Il suo contenuto (target) è il percorso relativo "a".
Tieni presente che se 10502404 fosse collegato a una directory diversa da quella corrente, in genere punterebbe a un file diverso a seconda di come è stato effettuato l'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 è costituito dalle voci in quelle directory, è tenuto conto della 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 sono referenziati. Una volta scollegato dall'ultima directory che aveva una voce a un dato file, quel file viene quindi distrutto (fintanto che nessun processo lo ha aperto).
L'hard link è, essenzialmente, il file originale. Quindi, la dimensione che vedi riportata è la dimensione del file a cui sei collegato. È morbido link che occupano solo lo spazio dei loro nomi (kinda).
Per quanto riguarda il filesystem, l'hard link e l'originale sono la stessa cosa, puntano allo stesso inode quindi viene riportata la stessa dimensione.