GNU/Linux >> Linux Esercitazione >  >> Linux

Perché i collegamenti fisici alle directory non sono consentiti in Unix/linux?

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.

Correlati:trovare file per i quali esistono più variazioni su quel nome file insieme nella stessa directory?

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    .

Linux
  1. Linux – Perché usiamo Su – e non solo Su?

  2. Linux – Perché Setuid non funziona??

  3. Linux:directory standard e/o comuni su OS Unix/linux?

  4. Linux:fare un duplicato di un percorso in Unix?

  5. Linux – I diversi kernel Linux/unix sono intercambiabili?

Comando Ln:come creare collegamenti simbolici in Linux

Comando Ln in Linux (Crea collegamenti simbolici)

Guida all'aggiunta di collegamenti simbolici Linux

Il comando ln in Linux:crea collegamenti soft e hard

Soft Links in Linux:il riferimento completo

Perché non vedo MSG_EOR per SOCK_SEQPACKET su Linux?