filesystems – ¿Por qué no se permiten enlaces físicos a directorios en UNIX / Linux?

Pregunta:

Leí en libros de texto que Unix / Linux no permite enlaces duros a directorios, pero sí permite enlaces blandos. ¿Es porque, cuando tenemos ciclos y si creamos enlaces duros, y después de un tiempo borramos el archivo original, apuntará a algún valor basura?

Si los ciclos fueran la única razón por la que no se permiten enlaces físicos, ¿por qué se permiten enlaces flexibles a directorios?

Respuesta:

Esto es simplemente una mala idea, ya que no hay forma de diferenciar entre un enlace físico y un nombre original.

Permitir enlaces duros a directorios rompería la estructura gráfica acíclica dirigida del sistema de archivos, posiblemente creando bucles de directorio y subárboles de directorio colgantes, lo que haría que fsck y cualquier otro caminante del árbol de archivos sea propenso a errores.

Primero, para entender esto, hablemos de inodos. Los datos en el sistema de archivos se mantienen en bloques en el disco, y esos bloques se recopilan juntos por un inodo. Puede pensar en el inodo como EL archivo. Sin embargo, los inodos carecen de nombres de archivo. Ahí es donde entran los enlaces.

Un enlace es solo un puntero a un inodo. Un directorio es un inodo que contiene enlaces. Cada nombre de archivo en un directorio es solo un enlace a un inodo. Abrir un archivo en Unix también crea un enlace, pero es un tipo de enlace diferente (no es un enlace con nombre).

Un enlace físico es solo una entrada de directorio adicional que apunta a ese inodo. Cuando ls -l , el número después de los permisos es el recuento de enlaces con nombre. La mayoría de los archivos normales tendrán un enlace. La creación de un nuevo vínculo físico a un archivo hará que ambos nombres de archivo apunten al mismo inodo. 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

Ahora, puede ver claramente que no existe un vínculo físico. Un vínculo físico es lo mismo que un nombre normal. En el ejemplo anterior, test o test2 , ¿cuál es el archivo original y cuál es el vínculo físico? Al final, realmente no se puede saber (incluso por marcas de tiempo) porque ambos nombres apuntan al mismo contenido, el mismo inodo:

% 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

La bandera -i a ls muestra los números de inodo al principio de la línea. Observe cómo test y test2 tienen el mismo número de inodo, pero test3 tiene uno diferente.

Ahora, si se le permitiera hacer esto para los directorios, dos directorios diferentes en diferentes puntos del sistema de archivos podrían apuntar a lo mismo. De hecho, un subdirectorio podría apuntar a su abuelo, creando un bucle.

¿Por qué es preocupante este bucle? Porque cuando está atravesando, no hay forma de detectar que está haciendo un bucle (sin realizar un seguimiento de los números de inodo a medida que atraviesa). Imagine que está escribiendo el comando du , que debe repetirse a través de subdirectorios para averiguar sobre el uso del disco. ¿Cómo du saber cuando se alcanzó un bucle? Es propenso a errores y una gran cantidad de contabilidad que du tendría que hacer, sólo de lograr esta tarea sencilla.

Los enlaces simbólicos son una bestia completamente diferente, ya que son un tipo especial de "archivo" que muchas API de sistemas de archivos tienden a seguir automáticamente. Tenga en cuenta que un enlace simbólico puede apuntar a un destino inexistente, porque apuntan por su nombre y no directamente a un inodo. Ese concepto no tiene sentido con los vínculos físicos, porque la mera existencia de un "vínculo físico" significa que el archivo existe.

Así que ¿por qué du trato con enlaces simbólicos fácilmente y no es difícil enlaces? Pudimos ver arriba que los enlaces duros son indistinguibles de las entradas normales del directorio. Sin embargo, los enlaces simbólicos son especiales, detectables y saltables. du da cuenta de que el enlace simbólico es un enlace simbólico y lo omite por completo.

% 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 test2@ -> test1
% du -ah
242M    ./test1/bigfile
242M    ./test1
4.0K    ./test2
242M    .

Leave a Comment

Your email address will not be published.

Scroll to Top

istanbul avukat

-

web tasarım