Recientemente me preguntaron esto durante una entrevista de trabajo. Fui honesto y dije que sabía cómo se comporta un enlace simbólico y cómo crear uno, pero no entiendo el uso de un enlace duro y cómo difiere de uno simbólico.
Recientemente me preguntaron esto durante una entrevista de trabajo. Fui honesto y dije que sabía cómo se comporta un enlace simbólico y cómo crear uno, pero no entiendo el uso de un enlace duro y cómo difiere de uno simbólico.
Respuestas:
Debajo del sistema de archivos, los archivos están representados por inodos. (¿O son múltiples inodos? No estoy seguro).
Un archivo en el sistema de archivos es básicamente un enlace a un inodo.
Un enlace duro, entonces, simplemente crea otro archivo con un enlace al mismo inodo subyacente.
Cuando elimina un archivo, elimina un enlace al inodo subyacente. El inodo solo se elimina (o se puede eliminar / sobrescribir) cuando se han eliminado todos los enlaces al inodo.
Un enlace simbólico es un enlace a otro nombre en el sistema de archivos.
Una vez que se ha hecho un enlace duro, el enlace es al inodo. Eliminar, renombrar o mover el archivo original no afectará el enlace duro ya que se vincula al inodo subyacente. Cualquier cambio en los datos en el inodo se refleja en todos los archivos que se refieren a ese inodo.
Nota: Los enlaces duros solo son válidos dentro del mismo sistema de archivos. Los enlaces simbólicos pueden abarcar sistemas de archivos, ya que son simplemente el nombre de otro archivo.
Una buena intuición que podría ayudar, usando cualquier consola Linux (ish).
Crea dos archivos:
$ touch foo; touch bar
Ingrese algunos datos en ellos:
$ echo "Cat" > foo
$ echo "Dog" > bar
(En realidad, podría haber usado echo en primer lugar, ya que crea los archivos si no existen ... pero eso no importa).
Y como se esperaba:
$cat foo; cat bar
Cat
Dog
Creemos enlaces duros y blandos:
$ ln foo foo-hard
$ ln -s bar bar-soft
Veamos que acaba de pasar:
$ ls -l
foo
foo-hard
bar
bar-soft -> bar
Cambiar el nombre de foo no importa:
$ mv foo foo-new
$ cat foo-hard
Cat
foo-hard señala el inodo, el contenido del archivo, que no se modificó.
$ mv bar bar-new
$ ls bar-soft
bar-soft
$ cat bar-soft
cat: bar-soft: No such file or directory
No se pudo encontrar el contenido del archivo porque el enlace suave apunta al nombre, que fue cambiado, y no al contenido.
Del mismo modo, si foo
se elimina, foo-hard
aún conserva el contenido; si bar
se elimina, bar-soft
es solo un enlace a un archivo no existente.
touch blah1; touch blah2
se puede acortar atouch blah1 blah2
Como dice el refrán, una imagen vale más que mil palabras. Así es como lo visualizo:
Así es como llegamos a esa imagen:
Cree un nombre myfile.txt
en el sistema de archivos que apunte a un nuevo inodo (que contenga los metadatos del archivo y apunte a los bloques de datos que contienen su contenido, es decir, el texto "¡Hola, Mundo!":
$ echo 'Hello, World!' > myfile.txt
Cree un enlace duro my-hard-link
al archivo myfile.txt
, lo que significa "crear un archivo que debe apuntar al mismo inodo que myfile.txt
apunta a":
$ ln myfile.txt my-hard-link
Cree un enlace suave my-soft-link
al archivo myfile.txt
, que significa "crear un archivo que debe apuntar al archivo myfile.txt
":
$ ln -s myfile.txt my-soft-link
Mire lo que sucederá ahora si myfile.txt
se elimina (o se mueve): my-hard-link
todavía apunta al mismo contenido y, por lo tanto, no se ve afectado, mientras que my-soft-link
ahora apunta a nada. Otras respuestas discuten los pros / contras de cada uno.
myfile.txt
). Para el enlace suave, de referencia no es el nodo-i (que contiene los datos), sino más bien de referencia es la ruta del sistema de archivos a myfile.txt
(por ejemplo /home/Documents/myfile.txt
)
Los enlaces duros son útiles cuando el archivo original se mueve. Por ejemplo, mover un archivo de / bin a / usr / bin o / usr / local / bin. Cualquier enlace simbólico al archivo en / bin se rompería por esto, pero un enlace duro, que es un enlace directo al inodo para el archivo, no importaría.
Los enlaces duros pueden ocupar menos espacio en el disco, ya que solo ocupan una entrada de directorio, mientras que un enlace simbólico necesita su propio inodo para almacenar el nombre al que apunta.
Los enlaces duros también tardan menos tiempo en resolverse: los enlaces simbólicos pueden apuntar a otros enlaces simbólicos que están en directorios enlazados. Y algunos de estos podrían estar en NFS u otros sistemas de archivos de alta latencia y, por lo tanto, podrían resolver el tráfico de red. Los enlaces duros, estando siempre en el mismo sistema de archivos, siempre se resuelven en una sola búsqueda, y nunca implican latencia de red (si se trata de un enlace duro en un sistema de archivos NFS, el servidor NFS haría la resolución, y sería invisible para El sistema del cliente). A veces esto es importante. No para mí, pero puedo imaginar sistemas de alto rendimiento donde esto podría ser importante.
También creo que cosas como mmap (2) e incluso open (2) usan la misma funcionalidad que los enlaces duros para mantener activo el inodo de un archivo, de modo que incluso si el archivo se desvincula (2) ed, el inodo permanece para permitir el acceso continuo del proceso, y solo una vez que el proceso se cierra, el archivo realmente desaparece. Esto permite archivos temporales mucho más seguros (si puede hacer que la apertura y desvinculación sucedan atómicamente, lo que puede haber una API POSIX para la que no recuerdo, entonces realmente tiene un archivo temporal seguro) donde puede leer / escribir sus datos sin que nadie pueda acceder a ellos. Bueno, eso era cierto antes de que / proc les diera a todos la posibilidad de ver los descriptores de sus archivos, pero esa es otra historia.
Hablando de eso, la recuperación de un archivo que está abierto en el proceso A, pero que no está vinculado en el sistema de archivos gira en torno al uso de enlaces duros para recrear los enlaces de inodo para que el archivo no desaparezca cuando el proceso que lo tiene abierto lo cierra o desaparece.
Enlace suave :
suave o simbólico es más un atajo al archivo original ... si borra el original, el atajo falla y si solo borra el atajo no pasa nada al original.
Enlace suave Sintaxis :ln -s Pathof_Target_file link
Salida: link -> ./Target_file
Prueba: readlink link
también en la ls -l link
salida verá la primera letra lrwxrwxrwx
como l, lo que indica que el archivo es un enlace suave.
Eliminar el enlace: unlink link
Nota: Si lo desea, su softlink puede funcionar incluso después de moverlo a otro lugar desde el directorio actual. Asegúrese de dar una ruta absoluta y no relativa al crear un enlace suave. es decir (a partir de / root / user / Target_file y no ./Target_file)
Enlace duro:
El enlace duro es más una copia espejo o múltiples rutas al mismo archivo. Haga algo en el archivo1 y aparecerá en el archivo 2. Eliminar uno todavía mantiene el otro bien.
El inodo (o archivo) solo se elimina cuando se han eliminado todos los enlaces (rígidos) o todas las rutas al inodo (mismo archivo).
Una vez que se ha hecho un enlace duro, el enlace tiene el inodo del archivo original. Eliminar el cambio de nombre o mover el archivo original no afectará el enlace duro ya que se vincula al inodo subyacente. Cualquier cambio en los datos en el inodo se refleja en todos los archivos que se refieren a ese inodo.
Sintaxis de enlace duro :ln Target_file link
Salida: se creará un archivo con el enlace de nombre con el mismo número de inodo que Targetfile.
Prueba: ls -i link Target_file
(verifique sus inodos)
Eliminar el enlace: rm -f link
(Eliminar el enlace como un archivo normal)
Nota : Los enlaces simbólicos pueden abarcar sistemas de archivos, ya que son simplemente el nombre de otro archivo. Mientras que los enlaces duros solo son válidos dentro del mismo sistema de archivos.
Los enlaces simbólicos tienen algunas características. Faltan enlaces duros:
Si sabe de inmediato dónde apunta un enlace simbólico con enlaces duros, debe explorar todo el sistema de archivos para encontrar archivos que compartan el mismo inodo.
# find / -inum 517333
/home/bobbin/sync.sh /root/synchro
los enlaces duros no pueden apuntar a directorios.
Los enlaces duros tienen dos limitaciones:
Una manera simple de ver la diferencia entre un enlace duro y un enlace simbólico es a través de un ejemplo simple. Un enlace fijo a un archivo apuntará al lugar donde está almacenado el archivo, o al inodo de ese archivo. Un enlace simbólico apuntará al archivo en sí.
Entonces, si tenemos un archivo llamado "a" y creamos un enlace rígido "b" y un enlace simbólico "c" que se refieren al archivo "a":
echo "111" > a
ln a b
ln -s a c
La salida de "a", "b" y "c" será:
cat a --> 111
cat b --> 111
cat c --> 111
Ahora eliminemos el archivo "a" y veamos qué sucede con la salida de "a", "b" y "c":
rm a
cat a --> No such file or directory
cat b --> 111
cat c --> No such file or directory
¿Entonces qué pasó?
Debido a que el archivo "c" apunta al archivo "a" en sí, si el archivo "a" se elimina, el archivo "c" no tendrá nada que señalar, de hecho, también se eliminará.
Sin embargo, el archivo "b" apunta al lugar de almacenamiento, o al inodo, del archivo "a". Por lo tanto, si se elimina el archivo "a", ya no apuntará al inodo, pero debido a que el archivo "b" sí lo hace, el inodo continuará almacenando cualquier contenido que pertenezca a "a" hasta que no haya más enlaces duros.
Los enlaces simbólicos enlazan a un nombre de ruta. Esto puede estar en cualquier parte del árbol de archivos de un sistema, y ni siquiera tiene que existir cuando se crea el enlace. La ruta de destino puede ser relativa o absoluta.
Los enlaces duros son punteros adicionales a un inodo, lo que significa que solo pueden existir en el mismo volumen que el objetivo. Los enlaces duros adicionales a un archivo no se pueden distinguir del nombre "original" utilizado para hacer referencia a un archivo.
Te diría a Wikipedia:
Algunos puntos:
Los enlaces duros son muy útiles cuando se realizan copias de seguridad incrementales. Ver rsnapshot , por ejemplo. La idea es hacer una copia usando enlaces duros:
La nueva copia de seguridad no ocupará espacio adicional aparte de los cambios que haya realizado, ya que todas las copias de seguridad incrementales apuntarán al mismo conjunto de inodos para los archivos que no han cambiado.
Añado a la pregunta de Nick: ¿cuándo son útiles o necesarios los enlaces duros ? La única aplicación que me viene a la mente, en la que los enlaces simbólicos no funcionarían, es proporcionar una copia de un archivo del sistema en un entorno chrooteado.
Un enlace simbólico es un objeto del sistema de archivos que apunta a otro objeto del sistema de archivos. El objeto al que se apunta se llama objetivo.
Los enlaces simbólicos son transparentes para los usuarios; los enlaces aparecen como archivos o directorios normales, y el usuario o la aplicación pueden actuar sobre ellos de la misma manera.
Los enlaces simbólicos están diseñados para ayudar en la migración y la compatibilidad de aplicaciones con los sistemas operativos UNIX. Microsoft ha implementado sus enlaces simbólicos para funcionar igual que los enlaces UNIX.
Los enlaces simbólicos pueden ser enlaces absolutos o relativos. Los enlaces absolutos son enlaces que especifican cada parte del nombre de la ruta; los enlaces relativos se determinan en relación con el lugar donde los especificadores de enlaces relativos están en una ruta especificada
Un ejemplo de enlace simbólico absoluto
X: "C:\alpha\beta\absLink\gamma\file"
Link: "absLink" maps to "\\machineB\share"
Modified Path: "\\machineB\share\gamma\file"
Un ejemplo de enlaces simbólicos relativos
X: C:\alpha\beta\link\gamma\file
Link: "link" maps to "..\..\theta"
Modified Path: "C:\alpha\beta\..\..\theta\gamma\file"
Final Path: "C:\theta\gamma\file"
Un enlace duro es la representación del sistema de archivos de un archivo mediante el cual más de una ruta hace referencia a un solo archivo en el mismo volumen .
Para crear un enlace duro en Windows, navegue hasta donde se creará el enlace e ingrese este comando:
mklink /H Link_name target_path
Tenga en cuenta que puede eliminar los enlaces duros en cualquier orden, independientemente del orden en que se crearon. Además, los enlaces duros no se pueden crear cuando
NTFS admite otro tipo de enlace llamado unión. MSDN lo define de la siguiente manera:
Una unión (también llamada enlace flexible) difiere de un enlace duro en que los objetos de almacenamiento a los que hace referencia son directorios separados, y una unión puede enlazar directorios ubicados en diferentes volúmenes locales en la misma computadora . De lo contrario, las uniones operan de manera idéntica a los enlaces duros.
Las partes en negrita en la sección de enlace duro y la sección de unión muestran la diferencia básica entre las dos.
Comando para crear una unión en ventanas, navegue hasta donde se creará el enlace y luego ingrese:
mklink /J link_name target_path
También:
Simplemente, enlace duro: es solo agregar un nuevo nombre a un archivo, es decir, un archivo puede tener muchos nombres al mismo tiempo, todos los nombres son iguales entre sí, nadie lo prefiere, el enlace duro no significa copiar todo el contenido de archivo y crear un nuevo archivo no es eso, solo crea un nombre alternativo para ser conocido.
Enlace simbólico (enlace simbólico): es un puntero de archivo a otro archivo, si el enlace simbólico apunta a un archivo existente que luego se elimina, el enlace simbólico continúa apuntando al mismo nombre de archivo aunque el nombre ya no nombra ningún archivo.
Lo que usted considera un "archivo" ordinario es en realidad dos cosas separadas: los datos de un archivo y una entrada de directorio. Cuando crea un enlace duro para un archivo, en realidad crea una segunda entrada de directorio que se refiere a los mismos datos. Ambas entradas de directorio tienen exactamente la misma funcionalidad; cada uno se puede usar para abrir el archivo para leerlo. Entonces, realmente no tiene "un archivo más un enlace duro", tiene "datos de archivo con dos entradas de directorio". Lo que usted considera como eliminar un archivo en realidad elimina una entrada de directorio, y cuando se elimina la última entrada de directorio para los datos, también se eliminan los datos en sí. Para los archivos normales que solo tienen una entrada de directorio, la eliminación de la entrada del directorio eliminará los datos como siempre. (Mientras se abre un archivo, el sistema operativo crea un enlace temporal al archivo,
Como ejemplo, cree un archivo A.txt, un enlace duro B.txt y elimine A.txt. Cuando creó A.txt, se crearon algunos datos y una entrada de directorio A.txt. Cuando creó el enlace físico, se creó otra entrada de directorio B.txt, apuntando a los mismos datos exactos. Cuando elimina A.txt, todavía tiene todos los datos y una sola entrada de directorio B.txt, exactamente como si hubiera creado un archivo B.txt en primer lugar.
Un enlace suave es solo un archivo (casi) ordinario, excepto que no contiene datos, sino la ruta de otra entrada de directorio. Si elimina el archivo al que hace referencia el enlace flexible, entonces el enlace flexible contendrá una ruta que ya no apuntará a una entrada de directorio; está roto. Si elimina el enlace suave, es como eliminar cualquier otro archivo, el archivo al que apunta no se ve afectado.
Una entrada de directorio es vincular una estructura:
struct dentry{
ino_t ino;
char name[256];
}
el ino es el número de inodo, el nombre es el nombre del archivo, la estructura del inodo puede ser como:
struct inode{
link_t nlink;
...
}
por ejemplo, crea un archivo / 1, la entrada del directorio puede ser como:
struct dentry{
ino_t ino; /* such as 15 */
char name[256]; /* "1" */
}
la estructura del inodo puede ser como:
struct inode{ /* inode number 15 */
link_t nlink; /* nlink = 1 */
...
}
luego crea un enlace duro (puede ser / 100), la entrada del directorio puede ser como:
struct dentry{
ino_t ino; /* 15 */
char name[256]; /* 100 */
}
la estructura del inodo puede ser como:
struct inode{ /* inode numebr 15 */
link_t nlink; /* nlink = 2 */
...
}
luego crea un enlace simbólico (puede ser / 200) al archivo 1, la entrada del directorio puede ser así:
struct dentry{
ino_t ino; /* such as 16 */
char name[256]; /* "200" */
}
la estructura del inodo puede ser como:
struct inode{ /* inode number 15 */
link_t nlink; /* nlink = 2 */
...
}
struct inode{ /* inode number 16 */
link_t nlink; /* nlink = 1 */
...
} /* the data of inode 16 maybe /1 or 1 */
Además de todas las respuestas anteriores, la diferencia en la búsqueda del archivo de enlace duro y softlink se puede entender a continuación:
Tengo un archivo f6
en mi directorio actual, así como un directorio llamadot2
.
Archivo nombrado f1
y ./t2/f2
son enlaces simbólicos af6
.
Archivo nombrado f7
y ./t2/f8
son enlaces duros def6
.
Para encontrar enlaces suaves y duros podemos usar:
$ find -L . -samefile f6
> ./f1
> ./f6
> ./f7
> ./t2/f2
> ./t2/f8
Para encontrar solo hardlink podemos usar:
$ find . -xdev -samefile f6
> ./f6
> ./f7
> ./t2/f8
Dado que los enlaces duros se pueden crear en el mismo sistema de archivos, podemos buscar todos los enlaces duros sin -L
usar la opción (con-xdev
opción) en el mismo sistema de archivos / punto de montaje. Guarda la búsqueda innecesaria en diferentes puntos de montaje.
Por lo tanto, buscar en el enlace duro es algo más rápido que buscar en los enlaces suaves (rectifique si estoy equivocado o no claro).
Los enlaces simbólicos dan otro nombre a un archivo, de manera similar a los enlaces duros. Pero un archivo se puede eliminar incluso si quedan enlaces simbólicos restantes.
Mis dos centavos en uso:
Los enlaces blandos pueden usarse para acortar nombres de rutas largas, es decir:
ln -s /long/folder/name/on/long/path/file.txt /short/file.txt
Los cambios realizados a /short/file.txt
se aplicarán en el archivo original.
Los enlaces duros se pueden usar para mover archivos grandes:
$ ls -lh /myapp/dev/
total 10G
-rw-r--r-- 2 root root 10G May 22 12:09 application.bin
ln /myapp/dev/application.bin /myapp/prd/application.bin
Copia instantánea a una carpeta diferente, y el archivo original (activado /myapp/dev
) puede moverse o eliminarse, sin tocar el archivo/myapp/prd
Acabo de encontrar una manera fácil de entender los enlaces duros en un escenario común, la instalación de software.
Un día descargué un software a la carpeta Downloads
para instalarlo. Después de que lo hice sudo make install
, algunos ejecutables fueron cp
editados a la carpeta bin local. Aquí, cp
crea un enlace duro . Estaba contento con el software, pero pronto me di cuenta de que Downloads
no es un buen lugar a largo plazo. Así que mv
edité la carpeta del software al source
directorio. Bueno, todavía puedo ejecutar el software como antes sin preocuparme por ningún enlace de destino, como en Windows. Esto significa que el enlace duro encuentra el inodo directamente y otros archivos.
EN esta respuesta cuando digo un archivo me refiero a la ubicación en la memoria
Todos los datos que se guardan se almacenan en la memoria utilizando una estructura de datos llamada inodes. Cada inodo tiene un número de número. El número de inodo se utiliza para acceder al inodo. Todos los enlaces duros a un archivo pueden tener diferentes nombres pero compartir el mismo número de inodo. Como todos los enlaces duros tienen el mismo número de entrada (que tienen acceso al mismo inodo), todos apuntan a la misma memoria física.
Un enlace simbólico es un tipo especial de archivo. Dado que también es un archivo, tendrá un nombre de archivo y un número de inodo. Como se dijo anteriormente, el número de inodo accede a un inodo que apunta a datos. Ahora, lo que hace que un enlace simbólico sea especial es que los inodenumbers en enlaces simbólicos acceden a esos inodes que apuntan a "una ruta" a otro archivo. Más específicamente, el número de inodo en el enlace simbólico accede a esos inodes que apuntan a otro enlace duro.
cuando nos estamos moviendo, copiando, eliminando un archivo en la GUI, estamos jugando con los enlaces duros del archivo, no con la memoria física. Cuando eliminamos un archivo, estamos eliminando el enlace rígido del archivo. no estamos borrando la memoria física. Si se eliminan todos los enlaces duros al archivo, entonces no será posible acceder a los datos almacenados, aunque todavía puede estar presente en la memoria