¿Por qué no se permiten enlaces duros para directorios?

129

Estoy usando Ubuntu 12.04. Cuando intento crear un enlace duro para cualquier directorio, falla. Puedo crear enlaces duros para archivos dentro del límite del sistema de archivos. Sé la razón por la que 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 la razón detrás de esto. ¿Es lo mismo para todas las distribuciones de GNU / Linux y sabores de Unix (BSD, Solaris, HP-UX, IBM AIX) o solo en Ubuntu o Linux?

Nischay
fuente
2
Pruebe ln -F <src> <dst>y se puede trabajar. Ciertamente, solía funcionar para el superusuario en versiones anteriores de Unix. ¿Alguien recuerda si eso fue UCB o System V? Sí, podrían pasar cosas malas, pero generalmente no. Según recuerdo, rmdirsabía que no debía seguir eliminando más allá de un enlace duro. Sin embargo, los usuarios pueden confundirse y eliminar cosas por error.
Steve Pitchers
@StevePitchers ¿Cómo puede rmdirmanejar enlaces duros de una manera especial? Un enlace duro es solo un enlace normal, pero uno adicional. Ni siquiera es fácil averiguar si existen enlaces extra inusuales sin grabaciones adicionales.
Volker Siegel
1
Cada nodo almacena el número de enlaces duros que apuntan a él: el contenido solo se libera una vez que no quedan enlaces restantes. Entonces rmdirpuede decir si el directorio tiene enlaces desde otros lugares. La eliminación recursiva rm -r, debe codificarse con cuidado, para asegurarse de que actuará correctamente incluso si hay errores como "permiso denegado". Por cierto, UCB = BSD, doh!
Steve Pitchers
2
Lo he hecho ln -Fen directorios y lo tengo funcionando. Pero no te atreves a eliminar el directorio después por miedo a corromper el sistema de archivos.
Edward Falk

Respuestas:

159

Los enlaces duros del directorio rompen el sistema de archivos de múltiples maneras

Te permiten crear bucles

Un enlace rígido a un directorio puede vincularse a un padre de sí mismo, lo que crea un bucle del 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

Evitar un bucle infinito al atravesar dicha estructura de directorios es algo difícil (aunque, por ejemplo, POSIX requiere findevitar esto).

Un sistema de archivos con este tipo de enlace duro ya no es un árbol, porque un árbol no debe, por definición, contener un bucle.

Rompen la ambigüedad de los directorios principales

Con un bucle de sistema de archivos, existen varios directorios principales:

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

En el primer caso, /tmp/aes el directorio padre de /tmp/a/b.
En el segundo caso, /tmp/a/b/les el directorio padre de /tmp/a/b/l/b, que es el mismo que /tmp/a/b.
Entonces tiene dos directorios principales.

Multiplican archivos

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

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

Son archivos diferentes.
Hay infinitos caminos más del archivo. Son iguales en términos de su número de inodo, por supuesto. Pero si no espera explícitamente bucles, no hay razón para verificarlo.

Un directorio hardlink también puede apuntar a un directorio secundario, o un directorio que no es ni secundario ni primario de ninguna profundidad. En este caso, un archivo que es hijo del enlace se replicaría 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 a directorios?

Una ruta que puede contener enlaces suaves e incluso bucles de directorio vinculados a menudo se usa solo para identificar y abrir un archivo. Se puede utilizar como una ruta lineal normal.

Pero hay otras situaciones, cuando se utilizan rutas para comparar archivos. En este caso, los enlaces simbólicos en la ruta se pueden resolver primero, convirtiéndolo en una representación mínima y comúnmente acordada, creando una ruta canónica :

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

El comando readlinkpuede resolver una ruta a su ruta canónica:

$ readlink -f /some/symlinked/path

Los enlaces blandos 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, 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
        [  ...  ]
Volker Siegel
fuente
1
¿Por qué un enlace suave no puede hacer todo esto?
Tanay
1
@Tanay Correcto, podría ayudar a la expansión compararlo con casos similares con enlaces blandos. Lo intentaré.
Volker Siegel
Exactamente, ¿cómo se aplica esto solo a los directorios? Según tengo entendido, estos problemas también son un problema para los archivos enlazados. Además, veo el hardlinking como una manera fácil de cambiar el permiso de un directorio dado para permitir que otros entren, sin tener que permitirlos también dentro de la cadena principal. Suena muy útil si no tiene la capacidad de agregar / modificar grupos ...
inetknght
gran respuesta, pero entonces ... ¿cómo resolvió Apple estos problemas para Time Machine?
Damien
¡Suena muy interesante! Pero no sé nada sobre cuál es el problema: ¿puede darme una pista?
Volker Siegel
77

"En general, no debería usar enlaces duros de todos modos" es demasiado amplio. Debe comprender la diferencia entre enlaces duros y 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ñalar archivos y directorios fuera del mismo sistema de archivos

Los enlaces duros pueden:

  • Evite que el archivo al que hacen referencia se elimine

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

El comando cp -ales especialmente útil a este respecto. Realiza una copia completa de una estructura de directorio, donde todos los archivos están representados por enlaces duros a los archivos originales. Luego puede proceder a actualizar los archivos en la estructura, y solo los archivos que actualice ocuparán espacio adicional. Esto es especialmente útil cuando se mantienen copias de seguridad multigeneracionales.

usuario133232
fuente
41
con respecto al último párrafo, si edita el archivo enlazado
marcin
32
Esta descripción de enlaces duros es bastante engañosa. Es básicamente cierto que los enlaces duros "evitan que el archivo al que hacen referencia se elimine", pero eso es solo un efecto secundario de los enlaces duros. Ciertamente NO es cierto que pueda crear enlaces duros en un directorio, cambiar el archivo "original" y luego esperar que los enlaces duros apunten de alguna manera al contenido anterior. De hecho, la verdad que guía a los enlaces duros es el hecho de que no es un enlace, al menos no más que el "archivo" original, que es solo un nombre que apunta a un archivo. Un enlace duro es simplemente otro nombre que apunta al mismo archivo.
matty
77
La idea de la copia de seguridad es buena y en realidad la uso mucho, pero creo que los usuarios deben ser advertidos de que cambiar un archivo también cambiará la copia de seguridad.
Mark
3
Diablos, un enlace simbólico no necesita apuntar a nada en absoluto. ln -s "Don't use this directory" READMEes legítimo De hecho, si lo piensa, un directorio puede usarse como una base de datos relacional y no contener ningún archivo real.
Edward Falk
55
-1 Esto no responde la pregunta, y alguna información es simplemente incorrecta.
wjandrea
43

Para su información, puede lograr lo mismo que los enlaces duros para directorios utilizando mount:

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

Esto es muy peligroso porque la mayoría de las herramientas y programas no serán conscientes del 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.

stackount
fuente
66
He usado mount --bind <src> <dest>. Use con cuidado para no limpiar el src;)
kachar
1
Obtengo:mount: unknown filesystem type 'bind'
Wizek
44
en Busybox, esmount -o bind src dest
Mat M
@MatM lo mismo con Debian
hanshenrik
2
Si solo necesita montar para leer, puede establecer permisos en el punto de montaje y evitar el rm -rfproblema. superuser.com/questions/320415/...
zanerock
19

La razón por la cual no se permiten directorios de enlace rígido es un poco técnica. 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 parte de la misma funcionalidad sin causar problemas (p ln -s target link. Ej .).

astex
fuente
17
Los enlaces duros tienen buenos casos de uso. Decir que generalmente no debes usarlos es demasiado amplio.
Sander Steffann
44
+2 por proporcionar el enlace que realmente responde la pregunta del OP (y la mía), -1 por emitir una opinión ("En general, no debería usar enlaces duros de todos modos" - si tuviera enlaces para apoyarlo, estaría bien). Lo cual fue bueno, porque no puedo dar +2 de todos modos. ; D
msb
3
el enlace "rompen la estructura del sistema de archivos" no funciona.
Charlie Parker
55
Intente resumir el contenido del enlace en la respuesta y mantenga el enlace como referencia. Esta es una buena práctica de intercambio de pila para evitar la pudrición del enlace, gracias.
Oxwivi
3
bien hecho @CharlieParker; mejor comentario irónico no intencionado (?) de todos los tiempos :)
Eliran Malka