filesystem – ¿Por qué no se permiten enlaces físicos para directorios?

Pregunta:

Estoy usando Ubuntu 12.04. Cuando intento crear un vínculo físico para cualquier directorio, falla. Puedo crear vínculos físicos para archivos dentro de los límites del sistema de archivos. Sé la razón por la que no podemos crear vínculos físicos para archivos más allá del sistema de archivos.

Probé 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 GNU / Linux y versiones Unix (BSD, Solaris, HP-UX, IBM AIX) o solo en Ubuntu o Linux?

Respuesta:

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

Te permiten crear bucles

Un enlace fijo a un directorio puede enlazar 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 vínculo de retroceso 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 una estructura de directorios de este tipo es algo difícil (aunque, por ejemplo, POSIX requiere find para evitar esto).

Un sistema de archivos con este tipo de vínculo físico ya no es un árbol, porque un árbol no debe, por definición, contener un bucle.

Rompen la falta de 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/a es el directorio padre de /tmp/a/b .
En el segundo caso, /tmp/a/b/l es el directorio padre de /tmp/a/b/l/b , que es lo 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 infinitas rutas adicionales del archivo. Son los mismos en términos de su número de inodo, por supuesto. Pero si no espera bucles explícitamente, no hay razón para verificarlo.

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

Tu 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

Entonces, ¿cómo pueden funcionar los enlaces blandos a directorios?

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

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

Esto es posible, porque todos los enlaces blandos 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 flexible 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; la mantiene, pero agrega más estructura como una capa de aplicación.


Del 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
        [  ...  ]

Leave a Comment

Your email address will not be published.

Scroll to Top

istanbul avukat

-

web tasarım