GNU/Linux >> Tutoriales Linux >  >> Linux

¿Por qué no se permiten enlaces físicos a directorios en Unix/linux?

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.

Relacionado:¿Encontrar archivos para los que existen múltiples variaciones en ese nombre de archivo juntos en el mismo directorio?

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    .

Linux
  1. ¿Crear por la fuerza enlaces duros de directorio?

  2. Linux:¿por qué no funciona Setuid?

  3. Linux:¿directorios estándar y/o comunes en sistemas operativos Unix/linux?

  4. Linux:¿los diferentes kernels de Linux/unix son intercambiables?

  5. Cómo crear enlaces blandos y duros en Linux

Comando Ln:Cómo crear enlaces simbólicos en Linux

Comando Ln en Linux (Crear enlaces simbólicos)

Guía para agregar enlaces simbólicos de Linux

El comando ln en Linux:crear enlaces blandos y duros

Vínculos blandos en Linux:la referencia completa

Nombres de archivo de Linux/Windows/Unix/...:¿Qué caracteres están permitidos? ¿Cuáles no tienen escapatoria?