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 fueron la única razón por la que no se permitieron los enlaces duros, ¿por qué se permiten los enlaces blandos a los directorios?
Respuesta aceptada:
Esta es solo 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 árbol de archivos propenso a errores.
Primero, para entender esto, hablemos de los inodos. Los datos en el sistema de archivos se mantienen en bloques en el disco, y esos bloques se recopilan mediante 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 diferente de enlace (no es un enlace con nombre).
Un enlace fijo 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 regulares tendrán un enlace. La creación de un nuevo enlace fijo 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 tal cosa como un enlace duro. Un enlace duro 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 enlace duro? Al final, realmente no se puede saber (ni siquiera 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
El -i
marcar a ls
muestra los números de inodo al comienzo 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 este bucle una preocupación? 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). Imagina que estás escribiendo el du
comando, que debe repetirse a través de subdirectorios para averiguar sobre el uso del disco. ¿Cómo du
saber cuándo golpeó un bucle? Es propenso a errores y mucha contabilidad que du
tendría que hacer, solo para llevar a cabo esta simple tarea.
Los enlaces simbólicos son una bestia completamente diferente, ya que son un tipo especial de "archivo" que muchas API de sistemas de archivos de archivos tienden a seguir automáticamente. Tenga en cuenta que un enlace simbólico puede apuntar a un destino inexistente, porque apuntan por nombre y no directamente a un inodo. Ese concepto no tiene sentido con los enlaces duros, porque la mera existencia de un "enlace duro" significa que el archivo existe.
Entonces, ¿por qué du
lidiar con enlaces simbólicos fácilmente y no con enlaces duros? Pudimos ver arriba que los enlaces duros son indistinguibles de las entradas normales del directorio. Los enlaces simbólicos, sin embargo, son especiales, detectables y saltables. du
se 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 [email protected] -> test1
% du -ah
242M ./test1/bigfile
242M ./test1
4.0K ./test2
242M .