¿Por qué los enlaces duros no están permitidos para los directorios?

97

Estoy usando Ubuntu 12.04. Cuando intento crear un enlace fijo para cualquier directorio, falla. Puedo crear enlaces duros para archivos dentro del límite del sistema de archivos. Sé por qué no podemos crear enlaces duros para archivos más allá del sistema de archivos.

Intenté estos comandos:

$ ln /Some/Direcoty /home/nischay/Hard-Directory
hard link not allowed for directory
$ sudo ln /Some/Direcoty /home/nischay/Hard-Directory
[sudo] password for nischay: 
hard link not allowed for directory

Solo quiero saber el motivo detrás de esto. ¿Es lo mismo para todas las distribuciones de GNU / Linux y los sabores de Unix (BSD, Solaris, HP-UX, IBM AIX) o solo en Ubuntu o Linux?

    
pregunta Nischay 01.11.2012 - 22:18

4 respuestas

124

Los enlaces físicos de directorio rompen el sistema de archivos de múltiples maneras

Te permiten crear bucles

Un enlace fijo a un directorio puede vincular a uno de sus padres, lo que crea un bucle de sistema de archivos. Por ejemplo, estos comandos podrían crear un bucle con el enlace posterior l :

mkdir -p /tmp/a/b
cd /tmp/a/b
ln -d /tmp/a l

Un sistema de archivos con un bucle de directorio tiene una profundidad infinita:

cd /tmp/a/b/l/b/l/b/l/b/l/b

Cualquier comando find sin el predicado -maxdepth se ejecutará en un bucle infinito. Eso significa que ya no puede usar find , que es un comando importante, de una manera consistente. Similar para el igualmente importante comando locate .

Un árbol, por definición, no tiene bucles, por lo que el sistema de archivos ya no es un árbol.

Rompen la falta de ambigüedad de los directorios principales

Con un bucle del sistema de archivos, existen múltiples directorios principales:

cd /tmp/a/b
cd /tmp/a/b/l/b

En el primer caso, /tmp/a es el directorio principal de /tmp/a/b .
En el segundo caso, /tmp/a/b/l es el directorio principal de /tmp/a/b/l/b , que es lo mismo que /tmp/a/b .
Por lo tanto, tiene dos directorios principales.

Multiplican archivos

Los archivos se identifican por rutas, después de resolver enlaces simbólicos. Entonces,

/tmp/a/b/foo.txt
/tmp/a/b/l/b/foo.txt

son archivos diferentes.
Hay infinitos caminos adicionales del archivo. Son los mismos en términos de su número de inodo, por supuesto. Pero si no esperas explícitamente bucles, no hay ninguna razón para verificarlo.

Un enlace fijo de directorio también puede apuntar a un directorio secundario, o un directorio que no sea ni secundario ni primario de ninguna profundidad. En este caso, un archivo que es un elemento secundario del enlace se replicará en dos archivos, identificados por dos rutas.

Su ejemplo

$ ln /Some/Direcoty /home/nischay/Hard-Directory
$ echo foo > /home/nischay/Hard-Directory/foobar.txt
$ diff -s /Some/Direcoty/foobar.txt /home/nischay/Hard-Directory/foobar.txt
$ echo bar >> /Some/Direcoty/foobar.txt
$ diff -s /Some/Direcoty/foobar.txt /home/nischay/Hard-Directory/foobar.txt
$ cat /Some/Direcoty/foobar.txt
foo
bar

¿Cómo pueden funcionar los enlaces suaves a los directorios?

Una ruta que puede contener softlinks e incluso bucles de directorio enlazado blando a menudo se usa solo para identificar y abrir un archivo. Se puede usar como una ruta lineal normal.

Pero hay otras situaciones en las que los caminos se usan para comparar archivos. En este caso, los enlaces simbólicos en la ruta se pueden resolver primero, convirtiéndolo en mínimo , y una representación acordada comúnmente que crea una ruta canónica :

Esto es posible, porque todos los enlaces suaves se pueden expandir a rutas sin el enlace. Después de hacer eso con todos los enlaces suaves en una ruta, la ruta restante es parte de un árbol, donde una ruta siempre es inequívoca.

El comando readlink puede resolver una ruta a su ruta canónica:

$ readlink -f /some/symlinked/path

Los enlaces suaves son diferentes de los que usa el sistema de archivos

Un enlace suave no puede causar todos los problemas porque es diferente de los enlaces dentro del sistema de archivos. Puede distinguirse de los enlaces duros y resolverse en una ruta sin enlaces simbólicos si es necesario.
En cierto sentido, agregar enlaces simbólicos no altera la estructura básica del sistema de archivos, sino que lo mantiene, pero agrega más estructura, como una capa de aplicación.

De man readlink :

 NAME
        readlink - print resolved symbolic links or canonical
        file names

 SYNOPSIS
        readlink [OPTION]... FILE...

 DESCRIPTION
        Print value of a symbolic link or canonical file name

        -f, --canonicalize
               canonicalize by  following  every  symlink  in
               every component of the given name recursively;
               all but the last component must exist
        [  ...  ]
    
respondido por el Volker Siegel 17.09.2014 - 13:06
72

"Generalmente, no deberías usar enlaces duros de todos modos" es demasiado amplio. Debe comprender la diferencia entre los enlaces duros y los enlaces simbólicos, y usar cada uno según corresponda. Cada uno viene con su propio conjunto de ventajas y desventajas:

Los enlaces simbólicos pueden:

  • Señalar directorios
  • Señalar objetos inexistentes
  • Señale los archivos y directorios fuera del mismo sistema de archivos

Los enlaces duros pueden:

  • Mantiene eliminado el archivo del que hacen referencia

Los enlaces duros son especialmente útiles para realizar aplicaciones de "copia en escritura". Le permiten mantener una copia de seguridad de una estructura de directorio, mientras que solo usa espacio para los archivos que cambian entre dos versiones.

El comando cp -al es especialmente útil a este respecto. Hace una copia completa de una estructura de directorio, donde todos los archivos están representados por enlaces duros a los archivos originales. A continuación, puede continuar con la actualización de archivos en la estructura, y solo los archivos que actualice ocuparán espacio adicional. Esto es especialmente útil cuando se realizan copias de seguridad multigeneracionales.

    
respondido por el user133232 18.02.2013 - 16:06
37

Para tu información, puedes lograr lo mismo que los enlaces duros para directorios usando mount:

mount -t bind /var/www /home/user/workspace/www

Esto es muy peligroso porque la mayoría de las herramientas y programas no conocen el enlace . Una vez hice algo como en el ejemplo anterior y luego procedí a rm -rf /home/user . Afortunadamente, no había nada relevante en /var/www .

    
respondido por el stackount 07.11.2013 - 18:39
18

La razón por la que no se permiten los directorios de enlace rígido es un poco técnico. Esencialmente, rompen la estructura del sistema de archivos . Por lo general, no debe usar enlaces duros de todos modos. Los enlaces simbólicos permiten la mayoría de la misma funcionalidad sin causar problemas (por ejemplo, ln -s target link ).

    
respondido por el astex 01.11.2012 - 22:25

Lea otras preguntas en las etiquetas