Questa è solo una cattiva idea, in quanto non esiste alcun modo per distinguere tra un collegamento reale e un nome originale.
Consentire collegamenti rigidi alle directory spezzerebbe la struttura grafica aciclica diretta del filesystem, creando possibilmente loop di directory e sottotitoli di directory penzolanti, il che renderebbe fsck
privi di errori qualsiasi altro walker dell'albero dei file.
Innanzitutto, per capirlo, parliamo di inode. I dati nel filesystem sono mantenuti in blocchi sul disco e quei blocchi sono raccolti insieme da un inode. Puoi pensare all'inode come al file. Gli Inodi mancano di nomi di file, però. Ecco dove entrano i collegamenti.
Un collegamento è solo un puntatore a un inode. Una directory è un inode che contiene collegamenti. Ogni nome file in una directory è solo un collegamento a un inode. L'apertura di un file in Unix crea anche un collegamento, ma è un diverso tipo di collegamento (non è un collegamento denominato).
Un hard link è solo una voce di directory aggiuntiva che punta a quell'inode. Quando si ls -l
, il numero dopo le autorizzazioni è il conteggio dei collegamenti denominato. La maggior parte dei file regolari avrà un link. La creazione di un nuovo collegamento reale a un file farà in modo che entrambi i nomi dei file puntino allo stesso inode. Nota:
% ls -l test
ls: test: No such file or directory
% touch test
% ls -l test
-rw-r--r-- 1 danny staff 0 Oct 13 17:58 test
% ln test test2
% ls -l test*
-rw-r--r-- 2 danny staff 0 Oct 13 17:58 test
-rw-r--r-- 2 danny staff 0 Oct 13 17:58 test2
% touch test3
% ls -l test*
-rw-r--r-- 2 danny staff 0 Oct 13 17:58 test
-rw-r--r-- 2 danny staff 0 Oct 13 17:58 test2
-rw-r--r-- 1 danny staff 0 Oct 13 17:59 test3
^
^ this is the link count
Ora puoi vedere chiaramente che non esiste un collegamento reale. Un collegamento reale è uguale a un nome normale. Nell'esempio precedente, test
oppure test2
, qual è il file originale e qual è il collegamento reale? Alla fine, non puoi davvero dirlo (anche per i timestamp) perché entrambi i nomi indicano lo stesso contenuto, lo stesso inode:
% ls -li test*
14445750 -rw-r--r-- 2 danny staff 0 Oct 13 17:58 test
14445750 -rw-r--r-- 2 danny staff 0 Oct 13 17:58 test2
14445892 -rw-r--r-- 1 danny staff 0 Oct 13 17:59 test3
Il -i
flag per ls
mostrare i numeri di inode all'inizio della riga. Nota come test
e test2
ha lo stesso numero di inode, ma ne test3
ha uno diverso.
Ora, se ti fosse permesso di farlo per le directory, due diverse directory in punti diversi nel filesystem potrebbero puntare alla stessa cosa. In effetti, un sottodir potrebbe indicare il nonno, creando un ciclo.
Perché questo loop è un problema? Perché quando attraversi, non c'è modo di rilevare che stai eseguendo un ciclo (senza tenere traccia dei numeri di inode mentre attraversi). Immagina di scrivere il du
comando, che deve ricorrere ai sottodirectory per scoprire l'utilizzo del disco. Come farebbe a du
sapere quando ha colpito un ciclo? È soggetto a errori e molta contabilità che du
dovrebbe fare, solo per svolgere questo semplice compito.
I link simbolici sono una bestia completamente diversa, in quanto sono un tipo speciale di "file" che molte API del filesystem tendono a seguire automaticamente. Nota, un collegamento simbolico può puntare a una destinazione inesistente, perché puntano per nome e non direttamente a un inode. Questo concetto non ha senso con i collegamenti reali, poiché la semplice esistenza di un "collegamento reale" significa che il file esiste.
Quindi perché du
gestire facilmente i collegamenti simbolici e non i collegamenti reali? Abbiamo potuto vedere sopra che i collegamenti reali sono indistinguibili dalle normali voci della directory. I collegamenti simbolici, tuttavia, sono speciali, rilevabili e ignorabili!
du
nota che il collegamento simbolico è un collegamento simbolico e lo salta completamente!
% ls -l
total 4
drwxr-xr-x 3 danny staff 102 Oct 13 18:14 test1/
lrwxr-xr-x 1 danny staff 5 Oct 13 18:13 test2@ -> test1
% du -ah
242M ./test1/bigfile
242M ./test1
4.0K ./test2
242M .
..
puntare a? Soprattutto dopo aver rimosso il collegamento reale a questa directory, nella directory indicata da..
? Deve puntare da qualche parte.