Un archivo es un inodo con metadatos entre los que se incluye una lista de indicadores sobre dónde encontrar los datos.
Para poder acceder a un archivo, debe vincular a un directorio (piense en los directorios como directorios telefónicos, no como 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 el original y los otros que sean enlaces. Todos son puntos de acceso al mismo archivo (mismo inodo) en el árbol de directorios. Cuando obtenga el tamaño del archivo (lstat
llamada del sistema), está recuperando información (esos metadatos a los que se hace referencia anteriormente) almacenada en el inodo, no importa qué nombre de archivo, qué enlace esté utilizando para hacer referencia a ese archivo.
Por el contrario, los enlaces simbólicos son otro archivo (otro inodo) cuyo contenido es una ruta al archivo de destino. Como cualquier otro archivo, esos enlaces simbólicos deben estar vinculados a un directorio (deben tener un nombre) para que pueda acceder a ellos. También puede tener varios enlaces a un enlace simbólico, o en otras palabras, los enlaces simbólicos pueden tener 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
Encima del número de archivo 10486707 hay un archivo normal. Dos entradas en el directorio actual (una con el nombre a
, uno con nombre b
) enlace a él. Porque el cuenta de enlaces es 2, sabemos que no hay otro nombre de ese archivo en el directorio actual o en cualquier otro directorio. El archivo número 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 estuviera vinculado a un directorio diferente al 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 con ellos, excepto en los directorios que los vinculan. El espacio ocupado por sus nombres son las entradas en esos directorios, se contabiliza en el tamaño de archivo/uso de 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 en los que se hace referencia. Una vez desvinculados del último directorio que tenía una entrada a un archivo determinado, ese archivo se destruye (siempre que ningún proceso lo tenga). abierto).
El enlace duro es, esencialmente, el archivo original. Por lo tanto, el tamaño que ve informado es el tamaño del archivo al que se vincula. Es suave enlaces que solo ocupan el espacio de sus nombres (más o menos).
En lo que respecta al sistema de archivos, el enlace duro y el original son lo mismo, apuntan al mismo inodo, por lo que se informa del mismo tamaño.