¿Cuál es la diferencia entre enlaces simbólicos y enlaces duros?

Respuestas:

40

La diferente semántica entre enlaces duros y blandos los hace adecuados para diferentes cosas.

Enlaces duros:

  • indistinguible de otras entradas de directorio, porque cada entrada de directorio es un enlace duro
  • "original" se puede mover o eliminar sin romper otros enlaces duros al mismo inodo
  • solo es posible dentro del mismo sistema de archivos
  • los permisos deben ser los mismos que los del "original" (los permisos se almacenan en el inodo, no en la entrada del directorio)
  • solo se puede hacer a archivos, no a directorios

Enlaces simbólicos (enlaces blandos)

  • simplemente registra ese punto a otra ruta de archivo. ( ls -lmostrará a qué ruta apunta un enlace simbólico)
  • se romperá si el original se mueve o se elimina. (En algunos casos, es realmente deseable que un enlace apunte al archivo que actualmente ocupa una ubicación en particular)
  • puede apuntar a un archivo en un sistema de archivos diferente
  • puede apuntar a un directorio
  • en algunos formatos del sistema de archivos, es posible que el enlace simbólico tenga permisos diferentes al archivo al que apunta (esto es poco común)
daxelrod
fuente
1
Buena lista Solo quería agregar que también puede romper un enlace simbólico de ruta relativa moviendo el enlace simbólico mismo.
jw013
44
"[E] la entrada del directorio es un enlace duro". Ese es un excelente punto que nunca he visto expresado antes, pero me preocupa que alguien que recién comienza a comprender sus enlaces no lo entienda. Para aquellos en esta situación, aquí hay una pista: el diseño de los archivos y directorios que ves al ejecutar el comando ls no es exactamente lo mismo que el sistema de almacenamiento que representa. Los enlaces duros son referencias a un archivo individual en el sistema de almacenamiento. Un archivo se almacena una vez. Lea sobre "inodes".
Mario
@ Mario: sí. Cada entrada de directorio vincula un nombre a un inodo. Incluso se llama a la llamada del sistema para eliminar un nombre de archivo unlink(2). Los archivos "normales" (con un recuento de enlaces de 1) son solo un caso especial. Si ayuda, puede pensar en los inodes como objetos, y los nombres como punteros contados de nuevo (el recuento de enlaces del inodo es el recuento de referencia).
Peter Cordes
1
Podría pensar en un enlace simbólico como un archivo de texto con un nombre. Se interpreta como un enlace simbólico debido a un indicador especial al archivo. Ejemplos de enlaces duros que sabes son ..y ..
Ned64
Aquí hay otra respuesta que explica por qué no se pueden hacer enlaces duros a los directorios . Encuentro útil esta respuesta porque es más concisa y más fácil de leer.
Trevor Boyd Smith
18

El objetivo de ambos tipos de enlaces es proporcionar una forma de hacer que un archivo aparezca en dos ubicaciones al mismo tiempo. Esto tiene muchos usos. 9 de cada 10 veces que desea utilizar enlaces simbólicos.

Los enlaces simbólicos o "enlaces simbólicos" funcionan un poco como los accesos directos de Windows. El contenido de un enlace simbólico es un puntero a la ubicación real del archivo / directorio. Si elimina el archivo real, el enlace simbólico se "colgará" y no funcionará. Eliminar el enlace simbólico no elimina el archivo real. Puede tener tantos enlaces simbólicos a un solo archivo (o incluso otros enlaces simbólicos) como desee.

Sin embargo, a diferencia de Windows, funcionan en el nivel del sistema de archivos, no en el nivel de shell o de aplicación, por lo que prácticamente cualquier aplicación "seguirá" los enlaces simbólicos como se esperaba. ls -alse puede usar como una forma rápida de ver hacia dónde "apuntan" los enlaces simbólicos.

Los enlaces duros funcionan incluso en un nivel inferior. Un enlace duro es una entrada de directorio real, física en el nivel del sistema de archivos del archivo. Técnicamente, una entrada de directorio es un enlace duro, por lo que cada archivo tiene al menos un enlace duro en un directorio en algún lugar. Los enlaces duros no están separados del archivo al que apuntan; si un archivo tiene múltiples enlaces duros en diferentes directorios, eliminar el enlace duro con utilidades como rmno eliminará realmente el archivo, hasta que todos los enlaces duros hayan desaparecido.

No puedo pensar en una situación en la que el uso de enlaces duros sea común, o incluso necesario, a menos que intencionalmente desee evitar que los archivos se eliminen o esté haciendo un trabajo extraño de bajo nivel con particiones u otras cosas relacionadas con el sistema de archivos. EDITAR: ¡Sin embargo, hay buenas ideas en las otras respuestas a esta pregunta!

LawrenceC
fuente
Además, los enlaces simbólicos tienen permisos como los archivos normales, pero el sistema operativo no los consulta, sino que consulta el archivo objetivo de permisos para decidir el comportamiento. Y no hagas cadenas circulares de enlaces simbólicos. Muy mal.
LawrenceC
3
¿Es realmente muy malo? ¿Lo que sucederá? La mayor emoción que puedo recrear es el mensaje de error "Demasiados niveles de enlaces simbólicos".
mattdm
1
ls -les suficiente para ver lo que se vincula mediante un enlace simbólico, los asoportes --all, ver la página de manual. E incluso si los enlaces simbólicos funcionan en el sistema de archivos, existen funciones alternativas para usar enlaces simbólicos como archivos en lugar de seguir.
D4RIO
44
Los accesos directos de Windows son en realidad bastante diferentes de los enlaces simbólicos: siguen su objetivo y también son archivos normales. (Windows también tiene enlaces simbólicos, pero no se usan mucho). Los enlaces simbólicos son puramente textuales, el texto de destino se lee cada vez que accede al archivo. La importancia de los permisos de enlace simbólico depende del sistema operativo y del sistema de archivos.
Gilles 'SO- deja de ser malo'
AFAIK, el contenido de un archivo de enlace simbólico es la ruta a la que apunta el enlace simbólico, que se puede ver al mirar el tamaño del archivo de enlace simbólico: ln -s /home 1; ls -l 1muestra que el enlace simbólico 1 tiene 5 bytes de largo, mientras ln -s /usr/share/ 2; ls -l 2que muestra que 2 tiene 11 bytes de largo.
daniel kullmann
13

Los enlaces duros son muy útiles para los mecanismos de copia de seguridad basados ​​en disco, ya que puede tener un árbol de directorios completo para cada copia de seguridad mientras comparte el espacio para los archivos que no han cambiado, y el sistema de archivos realiza un seguimiento del recuento de referencias, así que cuando la última referencia a una versión dada desaparece porque la copia de seguridad caducó / eliminó por razones de espacio, el espacio que utilizó se recupera automáticamente. Algunos clientes de correo también lo usan para mensajes archivados en múltiples carpetas, por la misma razón.

geekosaur
fuente
55
¿Quizás mecanismos de control de versiones basados ​​en disco? Si enlaza algo, entonces no es una copia de seguridad. Si el archivo original se corrompe, todos los enlaces a él también se corrompen.
D4RIO
1
Piense en sistemas de respaldo incrementales como Time Machine de Apple. (Debería ser obvio que no se trata de copias de seguridad del tipo de recuperación ante desastres, sino de "Ups, eliminé ese archivo por accidente"). Todos los archivos sin cambios en una copia de seguridad incremental están unidos entre sí; cuando se cambia el archivo, el siguiente incremental lo copia en lugar de vincularlo a la versión anterior.
geekosaur
Gracias, los sistemas de copia de seguridad incrementales son bastante similares a los sistemas de control de versiones de esta manera = D
D4RIO
Pero, ¿cómo preserva el mecanismo de copia de seguridad incremental la versión "antigua" de un archivo? 1) Se creó una copia de seguridad A, se vinculó el archivo F; 2) Archivo F modificado; 3) al día siguiente se creó la Copia de seguridad B ... Parece que no consigo algo
Dmitry Pashkevich
3

Los enlaces duros son solo referencias a los mismos espacios de disco, ese es el "por qué" no se puede vincular algo en otro sistema de archivos.

Los enlaces simbólicos son archivos que enlazan otros archivos (como accesos directos de Windows), tal vez en el mismo sistema de archivos, tal vez no.

EDITAR: Explicaré algo más. Cada archivo que existe tiene un mínimo de 1 enlace duro. Los enlaces duros son la forma de acceder al contenido de un inodo del sistema de archivos. Puede obtener el número de inodo de un archivo con ls -i, y obtener el número de enlaces duros con statlo siguiente en este ejemplo:

$ stat plantilla-disenos.odt 
  File: «plantilla-disenos.odt»
  Size: 12367       Blocks: 32         IO Block: 4096   fichero regular
Device: 803h/2051d  Inode: 319875      Links: 1
Access: (0644/-rw-r--r--)  Uid: ( 1000/   d4rio)   Gid: ( 1000/   d4rio)
Access: 2011-02-11 21:36:19.000000000 -0300
Modify: 2010-03-02 23:27:28.000000000 -0300
Change: 2010-04-10 17:46:27.000000000 -0300

Gracias @geekosaur por esta referencia:

El núcleo tiene que reiniciar la traducción de ruta a inodo (atravesando el árbol de directorios) para expandir los enlaces simbólicos, mientras que los enlaces duros usan el mismo inodo. (A menudo verás esto denominado namei, por el nombre de la función del núcleo que hizo esto en Unix tradicional).

y esto (editado):

Los enlaces duros son muy útiles para los mecanismos de copia de seguridad incremental basados ​​en disco como Time Machine de Apple , porque puede tener un árbol de directorios completo para cada copia de seguridad mientras comparte el espacio para los archivos que no han cambiado, y el sistema de archivos realiza un seguimiento del recuento de referencias, por lo que cuando la última referencia a una versión dada desaparece porque la copia de seguridad caducó / eliminó por razones de espacio, el espacio que utilizó se recupera automáticamente. Algunos clientes de correo también lo usan para mensajes archivados en múltiples carpetas, por la misma razón.

Salud

D4RIO
fuente
¿Son los beneficios de rendimiento al usar enlaces duros? O, ¿por qué usarías un enlace duro en lugar de un enlace simbólico?
ripper234
El núcleo tiene que reiniciar la traducción de ruta a inodo (atravesando el árbol de directorios) para expandir los enlaces simbólicos, mientras que los enlaces duros usan el mismo inodo. (A menudo verás esto referido como namei, por el nombre de la función del núcleo que hizo esto en Unix tradicional.)
geekosaur
@ ripper234: los enlaces duros son soluciones que ahorran espacio en disco. No necesita saber sobre el sistema de archivos para hacer un enlace simbólico, pero debe pensar antes de crear enlaces simbólicos porque puede crear un bucle o una ruta de resolución larga, por lo que las funciones como statfallarán.
D4RIO
@geekosaur: estoy agregando tu respuesta a la mía ya que es muy útil
D4RIO
No hay problema. De hecho, comencé a escribirlo como un comentario para los suyos, pero los comentarios son demasiado cortos.
geekosaur
3

Un enlace suave apunta a otro nombre de ruta. Ese nombre de ruta puede o no existir realmente. La ruta no se busca hasta que accede al enlace simbólico. Si la ruta no existe cuando intentas acceder a ella, tienes un enlace simbólico roto.

Con un enlace rígido, tiene un archivo con varios nombres. No se puede decir que uno de esos es el archivo "real" y los otros son solo un enlace a él. Todos son iguales No hay tal cosa como un enlace duro roto de la misma manera que hay enlaces simbólicos rotos.

Los enlaces duros solo funcionan dentro de un único sistema de archivos. Si desea vincular a un archivo en un sistema de archivos diferente (por ejemplo, una partición diferente o un recurso compartido de red), debe utilizar un enlace suave.

Otra gran diferencia es lo que sucede cuando elimina un archivo vinculado. Si elimina uno de un par de archivos vinculados, luego crea un nuevo archivo con el mismo nombre, tendrá dos archivos separados (el enlace se ha ido). Si elimina el destino de un enlace simbólico y crea un nuevo archivo con el mismo nombre, el enlace apuntará al nuevo archivo.

cjm
fuente
3

los enlaces "duros" comparten el mismo inodo

$ touch foo
$ ln foo foolink # Creates a hard  link
$ ls -li foo foolink
54996 -rw-r--r-- 2 bsd users 0 2011-12-11 09:06 foo
54996 -rw-r--r-- 2 bsd users 0 2011-12-11 09:06 foolink

Si edito foo o foolink, solo hay un archivo y se actualizará. Si elimino solo uno de los nombres de archivo, el inodo y los datos persistirán, el tonto sobrevivirá.

$ rm foo
$ ls -li foo foolink
ls: cannot access foo: No such file or directory
54996 -rw-r--r-- 1 bsd users 0 2011-12-11 09:06 foolink

Si tuviera que crear lo mismo, pero con un enlace "suave" o simbólico, entonces hay un archivo, un inodo y un nuevo archivo con su propio inodo apuntando al primero.

$ touch foo
$ ln -s foo foolink # Create symlink
$ ls -li foo foolink
55029 -rw-r--r-- 1 bsd users 0 2011-12-11 09:11 foo
55033 lrwxrwxrwx 1 bsd users 3 2011-12-11 09:11 foolink -> foo

Si edito foo o foolink, solo hay un archivo y se actualizará.

Si elimino solo el enlace simbólico, el inodo y los datos persistirán. Si elimino foo, los datos desaparecerán, el enlace simbólico persistirá pero apuntará a un archivo inexistente.

$ rm foo
removed `foo'
$ ls -l foo foolink 
ls: cannot access foo: No such file or directory
lrwxrwxrwx 1 bsd bsd 3 2011-12-11 09:11 foolink -> foo
bsd
fuente
1
Pero, ¿cuál es un caso de uso práctico para esto?
ewwhite
1
Un uso, lo mismo que un "atajo" Otro uso, tener múltiples versiones de una aplicación en un sistema permite instalar, probar una nueva versión, especificar la aplicación por ruta completa, mientras que el enlace simbólico en los puntos bin a la producción. Después de completar la prueba, cambie el enlace simbólico a la nueva versión, deje la versión anterior en su lugar para cualquier usuario que tenga un código dependiente de la versión. Piense en Perl, Python, etc.
bsd
1
Práctico caso de uso para enlaces duros. Actualmente en mi sistema de archivos encontré una gran cantidad de enlaces en / usr / share / zoneinfo Piense en todos los archivos nombrados que representan zonas horarias, que son todos idénticos a EST. Ahorramos espacio en el sistema de archivos al no tener copias redundantes y permitimos una administración de paquetes más fácil sin que la sobrecarga de administración de enlaces simbólicos se instale / elimine a medida que los paquetes se instalan / eliminan. Incluso si se elimina uno, se conservan los datos originales. Lo siento, no tuve tiempo para una explicación más pedante.
bsd
1

Los enlaces duros son entradas de directorio adicionales para el mismo archivo. Eso significa

  • Todos los enlaces duros a un archivo deben estar en el mismo sistema de archivos (porque una entrada de directorio no puede apuntar a un archivo en un sistema de archivos diferente), pero no necesariamente en el mismo directorio.
  • No hay diferencia entre la entrada del directorio original y el nuevo enlace duro; desde el punto de vista del sistema operativo, son solo dos entradas de directorio en el mismo archivo. Un archivo solo se elimina si se eliminan todos los enlaces duros (y además, no queda ningún proceso que tenga ese archivo todavía abierto).
  • Si mueve / cambia el nombre del "original", siempre que no lo mueva a otro sistema de archivos, los otros enlaces duros no se verán afectados; todavía apuntan al mismo archivo.
  • Muchos editores no escriben el nuevo contenido en el mismo archivo al guardar, sino que realizan el siguiente procedimiento:

    1. Escriba el nuevo contenido en un nuevo archivo.
    2. Cambie el nombre del archivo antiguo a un nombre de copia de seguridad (o, si no mantiene las copias de seguridad de la versión anterior del archivo, simplemente elimínelo).
    3. Cambie el nombre del archivo recién escrito al nombre del archivo anterior.

    Este esquema significa que cualquier otro enlace duro al mismo archivo ya no apuntará al archivo actual, sino a la versión anterior (esto es cierto incluso en el caso de que el editor elimine el archivo anterior, porque en Unix, "eliminar" un archivo solo significa eliminar su enlace; solo si el enlace eliminado es el único enlace, el archivo real se elimina).

  • Dado que el enlace duro va directamente al archivo, puede acceder a ese archivo incluso si no tiene acceso a la ubicación original de ese archivo (por ejemplo, porque no tiene ningún permiso en el directorio en el que se encuentra la entrada original) . Los únicos derechos que determinan su acceso son los derechos de acceso del archivo en sí (que están asociados con el archivo, no con el enlace; no puede hacer enlaces duros con diferentes permisos para el mismo archivo) y los derechos de acceso para la ruta del enlace duro está contenido (básicamente, los derechos de ejecución en el directorio en el que se encuentra el enlace y cualquier directorio padre directo e indirecto).

Los enlaces simbólicos, por otro lado, almacenan el nombre de ruta (el nombre del archivo, o más bien su entrada de directorio, que puede incluir su ruta, como /bin/sho subdir/foo.bar) de otro archivo. Si el nombre de ruta es relativo, siempre se interpreta en relación con el directorio en el que está contenido el enlace. Eso significa:

  • Un enlace simbólico puede referirse a archivos en un sistema de archivos diferente (incluso a un sistema de archivos que no admite enlaces duros o blandos, como FAT).

  • Si se elimina el archivo original, el enlace simbólico no conserva el contenido del archivo. A menos que haya otros enlaces duros al mismo archivo, el contenido del archivo desaparecerá. El enlace simbólico se dejará colgando (es decir, haciendo referencia a un nombre de ruta que no corresponde a una entrada de directorio). Por otro lado, eliminar el enlace simbólico no afecta el archivo original, ya que solo se refiere a su nombre de ruta.

  • Si el archivo original se mueve o cambia de nombre, el enlace simbólico no se actualiza, sino que se cuelga. Si mueve el enlace simbólico, solo se rompe si contiene una ruta relativa, y la ruta ya no es válida desde la nueva posición.

  • Si el archivo original se reemplaza por un nuevo archivo con el mismo nombre (como en el escenario del editor descrito anteriormente), el enlace hace referencia al nuevo archivo.

La mayoría de los usos de los enlaces duros son básicamente una forma de tener una copia de un archivo sin tener que almacenar el contenido del archivo dos veces. Esto funciona mejor si los archivos nunca se vuelven a cambiar, ya que de lo contrario es fácil romper accidentalmente el enlace (ver el escenario del editor arriba). Por supuesto, hay casos en los que desea que se rompa el enlace, como en el caso de mantener varias copias de seguridad: para los archivos que han cambiado en copias de seguridad más recientes, no desea que la copia en las copias de seguridad anteriores también cambie.

Normalmente, si desea un enlace, usará un enlace simbólico. Un ejemplo es cuando mueve un directorio a otra partición (porque la que está llena), puede establecer un enlace suave desde la posición anterior a la nueva, de modo que cualquier programa que intente acceder al directorio en el lugar anterior acceda a él en su lugar nuevo. Esto no sería posible con enlaces duros. Sin embargo, tenga en cuenta que los enlaces simbólicos en el directorio movido pueden romperse si contienen rutas relativas que salen del directorio movido.

celtschk
fuente
1

HARD LINK (solo archivos) vs SOFT LINK (archivos o directorios) vs BIND (HARD LINK para directorios)

VER ESTA IMAGEN ANTES DE LEER LA PUBLICACIÓN
(fuente: freesoftwareservers.com )

Si bien la respuesta de daxelrod explica bien la pregunta, pensé que la imagen en este caso hizo una gran diferencia, especialmente para los principiantes que aún no entienden los inodos y la jerga complicada de Linux.

Piense en esto, si "eliminó" todo de su unidad, podría ejecutar un software para restaurar los datos, porque los 1 y 0 todavía están allí, simplemente eliminó todos los enlaces duros. El propósito del software de recuperación es reconstruir los enlaces duros para que tengan sentido los 0 y 1

¡Leí un gran "one liner" que hizo que todo esto tuviera sentido y quería compartirlo!

Todos los archivos en Linux son "enlaces duros" a los 0 y 1 del disco. Cuando crea datos (0 y 1), el sistema operativo crea un enlace duro en el árbol de archivos para hacer referencia a ese punto en el disco duro.

Cree HARD LINK 2 y elimine el archivo original HARD LINK 1 :

Puede crear otro enlace duro y eliminar el archivo original, y aún tiene acceso al enlace duro recién creado.

Eliminar ARCHIVO (HARD LINK 1) que está SOFT LINK para:

Si eliminó HARD LINK 1, ¿cree que SOFT LINK funcionaría? No, el sistema operativo informará que HARD LINK 1 no existe.

Eliminar SOFT LINK para HARD LINK:

A la inversa, si elimina SOFT LINK, ¿funcionará HARD LINK? Si. Mientras el sistema operativo tenga un archivo HARD LINK , informará que el relleno no se ha eliminado.

- También vale la pena investigar / señalar BIND, una forma de vincular dos directorios, como simular enlaces de dos directorios, pero es transparente para el sistema operativo (los sistemas operativos pueden indicar cuándo se hace un enlace simbólico y algunos tienen reglas sobre el clima que pueden seguir enlaces simbólicos). Utiliza Mount, no LS y se puede configurar a través de FSTAB.

¿Qué es un montaje BIND?

FreeSoftwareServers
fuente
1
Es un esfuerzo bastante ambicioso, especialmente para una primera publicación. Desafortunadamente, creo que agregar el material en "vincular" (que no se solicitó) simplemente confunde las cosas; especialmente porque no parece haber hecho un gran esfuerzo para explicar el montaje "atado". Además, entiendo muy bien los enlaces duros y blandos / simbólicos, y apenas entiendo tu imagen. Me sorprendería mucho si un principiante pudiera aprender algo de él.
G-Man dice 'reinstalar a Mónica' el
Si bien puede enlazar directorios, se muestra en el sistema de archivos como un enlace simbólico, si lo vincula, es transparente para el sistema operativo. Aparece como un archivo.
FreeSoftwareServers
1
(1) En realidad, al menos en algunas versiones de Linux, puede enlazar montar un archivo. (2) Si bien los montajes de enlace se parecen mucho a los enlaces duros, decir "Bind es simplemente lo mismo que los enlaces duros (excepto que no se puede vincular un directorio)" simplemente está mal.
G-Man dice 'Restablecer a Monica' el
@ G-Man, de acuerdo y eliminado, con solo una nota mencionando BIND
FreeSoftwareServers
@Free en realidad el enlace suave apunta a un nombre de archivo (enlace duro 1); los esquemas, deberían hacer esto obvio.
JB.
0

Un enlace duro mantendrá un archivo en el disco hasta que se hayan eliminado todos los enlaces duros, incluso el primero (un "nombre de archivo" es técnicamente un enlace duro). Se puede dejar un enlace suave "colgando" hasta que se reemplace el archivo al que apunta (s / ed).

Ignacio Vazquez-Abrams
fuente
0

Esta es una pregunta muy antigua, pero tengo un caso de uso que me obliga a usar enlaces duros.

Soy músico y tengo muchísimos archivos de audio de varios tipos en varios discos duros conectados a mi Mac. Terabytes vale la pena. En general, los tengo muy bien organizados con directorios de enlaces simbólicos para poder encontrarlos por editor de contenido, estilo / sonido y otros criterios basados ​​en cómo estoy pensando en ese momento. Lamentablemente, un programa que uso, Ableton Live, es completamente incapaz de ver alias o enlaces simbólicos desde su navegador de archivos. La única solución que he encontrado es crear enlaces duros de los directorios que quiero que puedan ver, y luego todo funciona muy bien.

Por lo tanto, este es otro caso en el que es posible que necesite usar enlaces duros, que tal vez no se les haya ocurrido a otros.

Jonathan van Clute
fuente
Presentaría un informe de error para Ableton Live. Quizás puedan arreglar esto.
aventurin
Sí, ya hay muchas quejas sobre este tema en los foros de abletons durante años ... Parece que no están haciendo ningún intento de abordarlo, aunque no puedo entender por qué no.
Jonathan van Clute