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