Un archivo es un inodo con metadatos entre los cuales hay una lista de punteros a dónde encontrar los datos.
Para poder acceder a un archivo, debe vincularlo a un directorio (piense en los directorios como directorios telefónicos, no carpetas), es decir, agregue una o más entradas a uno o más directorios para asociar un nombre con ese archivo.
Todos esos enlaces, esos nombres de archivo apuntan al mismo archivo. No hay uno que sea original y otros que sean enlaces. Todos son puntos de acceso al mismo archivo (mismo inodo) en el árbol de directorios. Cuando obtiene el tamaño del archivo ( lstat
llamada al sistema), está recuperando información (los metadatos mencionados anteriormente) almacenados en el inodo, no importa qué nombre de archivo, qué enlace esté utilizando para referirse a ese archivo .
Por el contrario, los enlaces simbólicos son otro archivo (otro inodo) cuyo contenido es una ruta al archivo de destino. Al igual que cualquier otro archivo, esos enlaces simbólicos deben estar vinculados a un directorio (debe tener un nombre) para que pueda acceder a ellos. También puede tener varios enlaces a enlaces simbólicos, o en otras palabras, los enlaces simbólicos pueden recibir varios nombres (en uno o más directorios).
$ 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
Sobre el número de archivo 10486707 hay un archivo normal. Dos entradas en el directorio actual (una con nombre a
y otra con nombre b
) se vinculan a él. Debido a que el recuento de enlaces es 2, sabemos que no hay otro nombre de ese archivo en el directorio actual ni en ningún otro directorio. El número de archivo 10502404 es otro archivo, esta vez de tipo enlace simbólico vinculado dos veces al directorio actual. Su contenido (objetivo) es la ruta relativa "a".
Tenga en cuenta que si 10502404 estaba vinculado a otro directorio que el actual, normalmente apuntaría a un archivo diferente dependiendo de cómo se accedió.
$ 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
Los archivos no tienen nombres asociados a ellos que no sean en los directorios que los vinculan. El espacio ocupado por sus nombres son las entradas en esos directorios, se tiene en cuenta en el tamaño del archivo / uso del disco de los directorios.
Notarás que la llamada al sistema para eliminar un archivo es unlink
. Es decir, no elimina archivos, los desvincula de los directorios a los que se hace referencia. Una vez desvinculados del último directorio que tenía una entrada en un archivo determinado, ese archivo se destruye (siempre que no haya ningún proceso) abrió).
lstat
llamada al sistema que obtiene su tamaño.