Esta es solo una mala idea, ya que no hay forma de distinguir entre un enlace duro y un nombre original.
Permitir enlaces duros a directorios rompería la estructura gráfica gráfica acíclica del sistema de archivos, posiblemente creando bucles de directorio y colgando subárboles de directorio, lo que haría que fsck
cualquier otro caminante de árbol de archivos sea propenso a errores.
Primero, para entender esto, hablemos de inodes. Los datos en el sistema de archivos se mantienen en bloques en el disco, y esos bloques se recopilan juntos por un inodo. Puedes pensar en el inodo como EL archivo. Sin embargo, los Inodes 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 duro es solo una entrada de directorio adicional que apunta a ese inodo. Cuando usted ls -l
, el número después de los permisos es el número de enlaces con nombre. La mayoría de los archivos regulares tendrán un enlace. Crear un nuevo enlace duro 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 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 (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 -i
bandera a ls
muestra números de inodo al comienzo de la línea. Observe cómo test
y test2
tiene 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 señalar 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 hacer un seguimiento de los números de inodo mientras atraviesa). Imagine que está escribiendo el du
comando, que debe repetirse a través de subdirectorios para obtener información sobre el uso del disco. ¿Cómo du
sabría cuando golpeó un bucle? Es propenso a errores y una gran cantidad de contabilidad que du
tendría que hacer, solo para llevar a cabo esta sencilla tarea.
Los enlaces simbólicos son una bestia completamente diferente, ya que son un tipo especial de "archivo" que muchas API del sistema 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 enlaces duros, porque la mera existencia de un "enlace duro" significa que el archivo existe.
Entonces, ¿por qué puede du
lidiar con enlaces simbólicos fácilmente y no con enlaces duros? Pudimos ver arriba que los enlaces duros no se pueden distinguir de las entradas normales del directorio. Sin embargo, los enlaces simbólicos son especiales, detectables y omitibles.
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 test2@ -> test1
% du -ah
242M ./test1/bigfile
242M ./test1
4.0K ./test2
242M .
..
apuntar? Especialmente después de eliminar el enlace duro a este directorio, en el directorio señalado por..
? Necesita apuntar a alguna parte.