Ho letto nei libri di testo che Unix/Linux non consente i collegamenti fisici alle directory ma consente i collegamenti software. È perché, quando abbiamo cicli e se creiamo collegamenti reali, e dopo un po' di tempo eliminiamo il file originale, punterà a un valore spazzatura?
Se i cicli sono stati l'unico motivo per non consentire i collegamenti fisici, allora perché sono consentiti i collegamenti software alle directory?
Risposta accettata:
Questa è solo una cattiva idea, poiché non c'è modo di distinguere tra un collegamento reale e un nome originale.
Consentire collegamenti fisici alle directory interromperebbe la struttura del grafico aciclico diretto del filesystem, creando eventualmente loop di directory e sottostrutture di directory penzolanti, il che renderebbe fsck
e qualsiasi altro file tree walker soggetto a errori.
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 inode mancano di nomi di file, però. È qui che entrano in gioco i link.
Un collegamento è solo un puntatore a un inode. Una directory è un inode che contiene collegamenti. Ogni nome di file in una directory è solo un collegamento a un inode. Anche l'apertura di un file in Unix crea un collegamento, ma è un tipo diverso di collegamento (non è un collegamento denominato).
Un collegamento fisico è solo una voce di directory aggiuntiva che punta a quell'inode. Quando ls -l
, il numero dopo le autorizzazioni è il conteggio dei collegamenti denominati. La maggior parte dei file normali avrà un collegamento. La creazione di un nuovo collegamento fisico a un file farà in modo che entrambi i nomi di 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 fisico. Un hard link è lo stesso di un nome normale. Nell'esempio sopra, test
o test2
, qual è il file originale e qual è l'hard link? Alla fine, non puoi davvero dirlo (nemmeno per timestamp) perché entrambi i nomi puntano allo stesso contenuto, allo 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
segnala a ls
mostra i numeri di inode all'inizio della riga. Nota come test
e test2
hanno lo stesso numero di inode,
ma test3
ne ha uno diverso.
Ora, se ti fosse permesso farlo per le directory, due directory diverse in punti diversi del filesystem potrebbero puntare alla stessa cosa. In effetti, una sottodirectory potrebbe puntare al suo nonno, creando un loop.
Perché questo ciclo è una preoccupazione? Perché quando stai attraversando, non c'è modo di rilevare che stai eseguendo un loop (senza tenere traccia dei numeri di inode mentre attraversi). Immagina di scrivere il du
comando, che deve essere ricorsivo tramite sottodirectory per scoprire l'utilizzo del disco. Come sarebbe du
sai quando ha colpito un loop? È soggetto a errori e fa molta contabilità che du
avrebbe dovuto fare, solo per portare a termine questo semplice compito.
I collegamenti 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 gli hard link, perché la semplice esistenza di un "hard link" significa che il file esiste.
Allora perché può du
gestire facilmente i collegamenti simbolici e non i collegamenti reali? Siamo stati in grado di vedere sopra che i collegamenti fisici sono indistinguibili dalle normali voci di 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 [email protected] -> test1
% du -ah
242M ./test1/bigfile
242M ./test1
4.0K ./test2
242M .