Perché i collegamenti fisici sembrano occupare lo stesso spazio degli originali?


14

Grazie ad alcune buone domande e risposte qui e in questa pagina , ora capisco i collegamenti. Vedo che i collegamenti reali fanno riferimento allo stesso inode con un nome diverso e le copie sono nodi "diversi, con nomi diversi. Inoltre i collegamenti software hanno il nome e il percorso del file originale come inode, quindi se il file viene spostato, il collegamento si interrompe.

Quindi, ho testato ciò che ho appreso con alcuni file ("saluton_mondo.cpp" di seguito), creato un collegamento rigido, un soft e una copia.

jmcf125@VMUbuntu:~$ ls -lh soft hard copy s*.cpp
-rw-rw-r-- 1 jmcf125 jmcf125 205 Aŭg 27 16:10 copy
-rw-rw-r-- 2 jmcf125 jmcf125 205 Aŭg 25 13:34 hard
-rw-rw-r-- 2 jmcf125 jmcf125 205 Aŭg 25 13:34 saluton_mondo.cpp
lrwxrwxrwx 1 jmcf125 jmcf125  17 Aŭg 27 16:09 soft -> saluton_mondo.cpp

Ho trovato imbarazzante che il collegamento fisico, tuttavia, abbia le stesse dimensioni dell'originale e, logicamente, della copia. Se l'hard link e l'originale condividono lo stesso inode, che ha i dati e differiscono solo per il nome file, l'hard link non dovrebbe occupare solo lo spazio del suo nome, anziché 205 byte? O è la dimensione del file originale che ls -lhritorna? Ma allora come posso sapere quale spazio occupa il nome del file? Qui dice che i collegamenti reali non hanno dimensioni. Il nome del loro file è conservato accanto al nome del file originale? Dove viene archiviato il nome file dei collegamenti fisici?

Risposte:


16

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 ( lstatchiamata 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).


Ahh ... Ora capisco. Quindi un file chiamato "ciao" e la sua copia esatta chiamata "ajhĝjdmjefsjmksgskgjkmŝŭna" occupano esattamente lo stesso ammasso di spazio; perché i loro nomi non contano per quella lstatchiamata di sistema che ottiene la loro dimensione.
JMCF125,

@ JMCF125, sì, la dimensione presa dai loro nomi è la voce nelle directory corrispondenti, è contabilizzata nella dimensione del file delle directory.
Stéphane Chazelas,

Grazie. Puoi includerlo nella tua risposta? Aspetta, chiarirò prima la mia domanda.
JMCF125,

5

Il collegamento fisico è essenzialmente il file originale. Quindi, la dimensione che vedi riportata è la dimensione del file a cui sei collegato. Sono i soft 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.


Ma il nome del collegamento fisico deve occupare spazio, giusto?
JMCF125,

Vedi la risposta di @ stephan di seguito, la spiega meglio.
terdon

2
@ JMCF125 Sì, ma quello spazio è all'interno della directory. Se crei abbastanza file, noterai che le dimensioni della directory aumentano. La dimensione di un file non include i suoi metadati come il suo nome.
Gilles 'SO- smetti di essere malvagio' il

@Gilles, grazie, ma @Stephane ha già aggiornato la sua risposta con quelle informazioni. Inoltre, ora ci penso meglio, il nome di /deve essere memorizzato in se stesso, come se lo fai cd ..dentro di /te /.
JMCF125,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.