¿Cuál es la diferencia entre un enlace duro y un enlace simbólico?

488

Como dice el título, me gustaría saber la diferencia entre un enlace duro y un enlace suave creado por el comando ln. El comando man lnproporciona información, pero no responde suficientemente mi pregunta.

Además, sería bueno si alguien pudiera proporcionar una configuración donde el enlace duro podría ser preferible a un enlace simbólico.

ste_kwr
fuente
15
una de las diferencias ... tienes algún archivo, por ejemplo, prueba de archivo. Si realiza el enlace duro de prueba ln, cree el enlace simbólico ln -s test y luego mueva la prueba de archivo a otro directorio (o cambie el nombre), el enlace simbólico no funcionará. Hardlink funcionará. Ahora intente eliminar la prueba de archivo. Hardlink seguirá funcionando, de hecho, va a ser todavía capaz de acces archivo hasta que el número de enlaces duros para presentar isnt 0. Eso es porque de inodos, está escrito en el manual ...
Denwerko
55
He vuelto a abrir esto porque merece una buena respuesta genérica sobre este tema (a diferencia de la pregunta anterior que era un oscuro ejemplo de C).
Oli
44
Mejor respuesta: youtube.com/watch?v=aO0OkNxDJ3c
Abhishek Bhatia
1
También una respuesta bastante completa: stackoverflow.com/questions/185899/…
Elzo Valugi
@AbhishekBhatia el video no está disponible
Ooker

Respuestas:

59

En Linux / Unix, los atajos se conocen como enlaces


Los enlaces son de dos tipos: enlaces blandos (enlaces simbólicos) o enlaces duros.

  1. Enlaces blandos (enlaces simbólicos)

    Puede crear enlaces a archivos y directorios, y puede crear enlaces (accesos directos) en diferentes particiones y con un número de inodo diferente del original.

    Si se elimina la copia real , el enlace no funcionará .

  2. Enlaces duros

    Los enlaces duros son solo para archivos; no puede vincular a un archivo en una partición diferente con un número de inodo diferente.

    Si se elimina la copia real, el enlace funcionará , ya que accede a los datos subyacentes a los que estaba accediendo la copia real.


Pregunta: ¿Cómo hago un enlace suave?

Respuesta: Se puede hacer un enlace suave con ln -s; primero debe definir el origen y luego debe definir el destino. (Tenga en cuenta que debe definir las rutas completas de origen y destino; de lo contrario, no funcionará).

 sudo ln -s /usr/lib/i386-linux-gnu/mesa/libGL.so.1 /usr/lib32/libGL.so.1
             (----------Source-------)             ( Destination )

ingrese la descripción de la imagen aquí

Como puede ver, tiene un inodo diferente y se puede hacer en una partición diferente.


Pregunta: ¿Cómo hago el enlace duro?

Respuesta: Se puede hacer un enlace duro con ln; primero debe definir el origen y luego debe definir el destino. (Tenga en cuenta que debe definir la ruta completa de origen y destino; de lo contrario, no funcionará).

Digamos que tengo un script en el /scriptdirectorio llamado firefox.

 ls -i # Shows you the inode
 5898242 firefox

 ln /scripts/firefox /scripts/on-fire
       ( Source )    ( Destination )

ingrese la descripción de la imagen aquí

Como puede ver, tiene el mismo inodo. Si elimino el original, el enlace funcionará y actuará como el original.

ingrese la descripción de la imagen aquí

Arriba verifico que el enlace funciona y luego elimino el script original de Firefox.


Tu pregunta: Sería bueno si alguien pudiera proporcionar una configuración donde el enlace duro podría ser preferible a un enlace simbólico.

Respuesta : Dependiendo del diseño de la partición del disco, los enlaces duros tienen la limitación de que deben estar en la misma partición (-1 punto) y solo pueden vincularse a archivos (-1 punto) ), pero +1 punto si se elimina el enlace original funcionará y actúa como el original.

Por otro lado, un enlace suave puede apuntar a directorios o archivos (+1 punto) y no hay limitación de partición (+1 punto), pero (-1 punto) si se elimina la fuente, el enlace no funcionará.

Qasim
fuente
¿Puedo crear un enlace duro y proporcionar el inodo como fuente?
TMOTTM
324

Un enlace duro no es un puntero a un archivo, es una entrada de directorio (un archivo) que apunta al mismo inodo. Incluso si cambia el nombre del otro archivo, un enlace fijo todavía apunta al archivo. Si reemplaza el otro archivo con una nueva versión (copiándolo), un enlace duro no apuntará al nuevo archivo. Solo puede tener enlaces duros dentro del mismo sistema de archivos. Con los enlaces duros no tiene el concepto de los archivos y enlaces originales, todos son iguales (piense en ello como una referencia a un objeto). Es un concepto de muy bajo nivel.

Por otro lado, un enlace simbólico en realidad apunta a otra ruta (un nombre de archivo); resuelve el nombre del archivo cada vez que accede a él a través del enlace simbólico. Si mueve el archivo, el enlace simbólico no seguirá. Si reemplaza el archivo con otro, manteniendo el nombre, el enlace simbólico apuntará al nuevo archivo. Los enlaces simbólicos pueden abarcar sistemas de archivos. Con los enlaces simbólicos, tiene una distinción muy clara entre el archivo real y el enlace simbólico, que no almacena información junto a la ruta sobre el archivo al que apunta.

vartec
fuente
1
Una cosa que (con sus propias palabras) "apunta al archivo" puede llamarse un puntero (es trivialmente casi tautológicamente cierto). Si estamos haciendo trampa, entonces (en general) la noción de enlaces duros puede existir incluso si un sistema de archivos no usa inodes.
jfs
320

"Una imagen vale mas que mil palabras." Representación pictórica


Y, "Un ejemplo vale cien párrafos ..."

Crea dos archivos:

$ touch blah1   
$ touch blah2

Ingrese algunos datos en ellos:

$ echo "Cat" > blah1
$ echo "Dog" > blah2

Y como se esperaba:

$cat blah1; cat blah2
Cat
Dog

Creemos enlaces duros y blandos:

$ ln blah1 blah1-hard
$ ln -s blah2 blah2-soft

Veamos que acaba de pasar:

$ ls -l

blah1
blah1-hard
blah2
blah2-soft -> blah2

Cambiar el nombre de blah1 no importa:

$ mv blah1 blah1-new
$ cat blah1-hard
Cat

blah1-hard señala el inodo, el contenido del archivo, que no se modificó.

$ mv blah2 blah2-new
$ ls blah2-soft
blah2-soft
$ cat blah2-soft  
cat: blah2-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 se elimina blah1, blah1-hard aún conserva el contenido; si se elimina blah2, blah2-soft es solo un enlace a un archivo no existente.


fuente: ¡copiarlo descaradamente de StackOverflow!

ABcDexter
fuente
13
Para ser justos con usted, agregó la hermosa imagen en la parte superior ... ¡ah, también la copió! Combinar las dos respuestas es realmente muy útil :)
icc97
2
mejor explicado, en ninguna parte!
dennisbot
3
Seguí mirando la imagen durante 20 segundos y luego, de repente, lo descubrí. Esto es realmente brillante.
Mohammed Joraid
1
por cierto: Usar enlaces duros con git es una mala idea , en caso de que alguien (frustrado por los enlaces blandos) se pregunte ... podría aplicarse también a otros sistemas de versiones.
Frank Nocke
1
¿Es un inodo a sus enlaces duros similar a un archivo almacenado en la nube para que cualquier dispositivo acceda a él?
Ooker
89

Ambos son punteros a archivos; La diferencia es el tipo de puntero. Un enlace simbólico apunta a otro archivo por su nombre . Tiene un bit de modo especial que lo identifica como un enlace simbólico, y su contenido es el nombre del archivo real. Debido a que solo contiene un nombre, ese nombre en realidad no tiene que existir, o puede existir en un sistema de archivos diferente. Si reemplaza el archivo con nombre (cambie su contenido sin afectar su nombre), entonces el enlace aún contiene el mismo nombre, y ahora apunta al nuevo archivo. Puede identificar fácilmente un enlace simbólico y ver el nombre del archivo al que apunta.

Un enlace fijo apunta al archivo por número de inodo. Como tal, los enlaces duros no son diferentes al nombre de un archivo. No hay un nombre "real" frente al nombre del enlace duro; Todos los enlaces duros son nombres igualmente válidos para el archivo. Debido a esto, el archivo al que debe enlazar debe existir y estar en el mismo sistema de archivos donde está intentando crear el enlace. Si elimina el nombre original, el enlace físico aún señala el mismo archivo. Debido a que todos los enlaces duros son nombres igualmente válidos para el archivo, no puede mirar uno y ver los otros nombres para el archivo; Para encontrar esto, debe buscar en cada archivo y comparar su número de inodo para encontrar los otros nombres que tienen el mismo número de inodo.

Puede saber cuántos nombres tiene un archivo de la salida de ls -l. El primer número después del modo de archivo es el recuento de enlaces. Un archivo con más de 1 enlace tiene otro (s) nombre (s) en alguna parte y, por el contrario, un archivo con un recuento de enlaces de solo 1 no tiene (otros) enlaces duros.

psusi
fuente
If you replace the named file, then the link still contains the same name, and so now it points to the new file- Creo que esto no está bien explicado. ¿Quiere decir que si reemplazo el archivo donde obtuve un enlace simbólico, los enlaces que contienen el nombre permanecen intactos? Pero solo apuntaría al archivo reemplazado cuando su nombre de archivo (es decir, el nuevo archivo que reemplazó al anterior) es el mismo que el reemplazado (es decir, el archivo antiguo que fue reemplazado por el nuevo), ¿correcto?
Mike
@ Mike, sí: el enlace simbólico apunta al nombre del archivo original, por lo que reemplazar ese archivo significa que el enlace ahora apunta al nuevo archivo.
psusi
¿Pero solo si tiene el mismo nombre correcto? El enlace simbólico apuntaría a banana y reemplazaré el archivo con naranja, entonces el enlace sy ya no puede encontrar el archivo banana, es decir, no funcionará
Mike
@ Mike, el reemplazo del mundo significa que tiene el mismo nombre, de lo contrario, solo está eliminando un archivo y agregando otro;)
psusi
58

Un enlace duro solo puede funcionar en el mismo sistema de archivos, es simplemente un nombre diferente para el mismo inodo (los inodos hacen referencia internamente a los archivos). Un archivo solo se eliminará del disco cuando el último enlace a su inodo haya desaparecido (usted rmo unlinkel último enlace). Los enlaces duros generalmente solo funcionan para archivos, no directorios.

Un enlace simbólico (enlace simbólico) es un archivo especial que contiene una ruta a otro archivo. Este camino puede ser absoluto o relativo. los enlaces simbólicos pueden funcionar en todos los sistemas de archivos e incluso pueden apuntar a diferentes archivos, si por ejemplo desconecta un disco duro externo y lo reemplaza por otro, que tiene un archivo diferente en la misma ruta. Un enlace simbólico puede apuntar a archivos o directorios.

knittl
fuente
Gracias, esto me dice cómo funcionan, pero ¿qué hace exactamente el enlace duro? ¿Y por qué no funciona para directorios?
ste_kwr
@knittl: ¿estás seguro? Parece que en algunos sistemas de archivos se permiten enlaces duros a directorios, pero solo root puede crearlos. Ver los -d, -F, --directoryinterruptores. Y sí, yo he visto la nota en la ln(1)página :)
0xC0000022L
1
@kniwor: la forma más fácil de describir los enlaces duros es "simplemente otro nombre para el mismo archivo (es decir, datos en el disco)". Y, al menos en mi (s) sistema (s), lnno se puede usar para hacer enlaces duros a directorios. Sin embargo, existen enlaces a directorios, el ejemplo más destacado es .y ... No quería incluir eso en mi respuesta original, ya que eso solo complicaría las cosas.
knittl
2
@STATUS_ACCESS_DENIED: bueno, está bien ... pero generalmente no es una buena idea. Por eso escribí »generalmente« en mi respuesta original. También vea mi comentario anterior para ejemplos.
knittl
Entonces, ¿un enlace duro puede apuntar a la misma carpeta / archivo con diferentes nombres, es decir, tener diferentes nombres que enlacen al mismo inodo?
Charlie Parker
21

Una de las respuestas del otro hilo (ahora vinculado desde la parte superior de su publicación) menciona esta página, que creo que es una explicación bastante buena de nivel medio. Si te estás perdiendo en el arte ascii, aquí está la versión tl; dr:

  • Los archivos estándar son un puntero del sistema de archivos a un inodo que a su vez apunta a datos físicos. El componente de archivo almacena su enlace al sistema de archivos (esencialmente su ruta) y un enlace al inodo.
  • Los enlaces duros son como archivos. Son solo un puntero adicional directamente a un inodo.
  • Los enlaces simbólicos son archivos separados (incluidos inodo y datos separados) que almacenan una ruta del sistema de archivos a un archivo.

El kernel y los sistemas de archivos involucrados traducen todo de manera transparente.

Entonces, basado en eso:

  • Los enlaces duros solo permiten la vinculación del mismo sistema de archivos. Los enlaces simbólicos pueden apuntar a cualquier ruta.
  • Los enlaces duros (esencialmente) apuntan a datos absolutos. Los enlaces simbólicos pueden apuntar a rutas relativas (por ejemplo ../parent.file)
  • Por extensión, si mueve el puntero de destino de un enlace duro (que, recuerde, en sí mismo es esencialmente un enlace duro que apunta a un inodo), el enlace duro aún funciona. Mover el objetivo de un enlace simbólico generalmente rompería el enlace simbólico.
  • Resolver un enlace duro sería más rápido pero de manera inconmensurable. Esa porción insignificante de velocidad tiene el costo de un sistema de archivos inflexible.

Podría haberme confundido un poco, pero leyendo varias cosas, estoy luchando por encontrar la diferencia entre un archivo estándar y un enlace duro. La forma en que lo estoy leyendo es que cada archivo consta de un enlace duro (que almacena el nombre del archivo), que se vincula a un inodo que apunta a datos físicos.

Agregar un enlace duro solo proporciona un inodo con un puntero adicional basado en el sistema de archivos. ¿Está bien?

Oli
fuente
55
Creo que tiene razón, cada archivo es un nombre de ruta para un inodo, y un enlace duro es un nombre de ruta adicional para el mismo inodo. Por lo tanto, un enlace duro no es diferente de un archivo normal.
enzotib
Estoy tratando de entender esto ... pero usted dice:> "Los enlaces simbólicos son archivos separados (incluidos inodo y datos separados ) que almacenan una ruta del sistema de archivos a un archivo". ¿Un enlace simbólico realmente tiene datos separados? Entonces es como una copia del directorio al que se vincula, ¿verdad? ... y cada vez que se escribe algo en el enlace simbólico, ¿tiene que escribirse dos veces en el disco? No tiene sentido.
MiniGod
@MiniGod No, un enlace simbólico es un inodo a un bloque de datos que almacena una ruta a otro inodo (nombre de archivo). Sí, es confuso como Matrix, pero una vez que lo obtengas, nunca lo olvidarás :)
Oli
@Oli Podría estar confundido, pero cuando dices: "incluyendo inodo y datos separados ", ¿quieres decir que el enlace simbólico tiene datos separados?
MiniGod
1
@MiniGod Yeah. El enlace simbólico es un inodo que apunta a datos (como un archivo normal) y esos datos son una ruta. Es un poco más inteligente que eso, permitir un uso transparente a través de enlaces simbólicos, pero eso es esencialmente todo lo que son.
Oli
15

Cuándo usar Soft Link:

Enlace a través de sistemas de archivos: si desea vincular archivos a través de los sistemas de archivos, solo puede usar enlaces simbólicos / enlaces blandos.

Enlaces al directorio: si desea vincular directorios, debe estar utilizando enlaces suaves, ya que no puede crear un enlace fijo a un directorio.

Cuándo usar Hard Link:

Espacio de almacenamiento: los enlaces duros ocupan una cantidad muy pequeña de espacio, ya que no se crean nuevos inodos al crear enlaces duros. En enlaces blandos creamos un archivo que consume espacio (generalmente 4KB, dependiendo del sistema de archivos)

Rendimiento: el rendimiento será ligeramente mejor al acceder a un enlace duro, ya que está accediendo directamente al puntero del disco en lugar de pasar por otro archivo. Mover la ubicación del archivo: si mueve el archivo de origen a otra ubicación en el mismo sistema de archivos, el enlace físico seguirá funcionando, pero el enlace suave fallará.

Redundancia: si desea garantizar la seguridad de sus datos, debe usar un enlace duro, ya que en el enlace duro, los datos están seguros, hasta que se eliminen todos los enlaces a los archivos, en lugar de eso en el enlace suave, perderá los datos si se elimina la instancia maestra del archivo.

Osama
fuente
Tenga en cuenta que también hay un enlace simbólico rápido para el tamaño del nombre de ruta de hasta 64 bytes. Todavía ocupa un inodo, pero no consume el espacio de bloque de 4 kb.
syockit
8

La confusión se establece cuando intenta encontrar la diferencia entre "el nombre del archivo" y un enlace duro porque no hay ninguno.

Cada archivo que crea consta de datos en el disco y un enlace duro , que es un nombre de archivo en un directorio y un puntero a los datos en el disco. Fin de la historia. Cuando se elimina el último (o único) enlace duro, el sistema operativo sabe que los datos ya no son necesarios.

A partir de esto, puede ver que los datos reales nunca se eliminan, solo se eliminan los enlaces duros. Y cuando se llena lo suficiente en el disco, los datos pueden sobrescribirse con los datos de otro archivo. Hasta entonces, los datos del archivo eliminado podrían recuperarse, pero es un poco difícil de encontrar sin el enlace duro.

Los enlaces simbólicos, como se explicó anteriormente, simplemente le dicen "hay un archivo llamado <targetname>en una carpeta llamada <targetfolder>". Señalan el enlace duro. No saben dónde están los datos. El enlace duro lo sabe.

Gonesoft
fuente
0

Es muy sencillo. Los archivos (¡y directorios!) Se almacenan en direcciones en el dispositivo de bloque (HDD o lo que sea). Normalmente tiene un solo nombre asignado a una dirección, y así es como obtiene su archivo. Un enlace duro es un segundo, tercer, etc. nombre asignado a la misma dirección. En cambio, un enlace simbólico se refiere al símbolo (el nombre) y, por lo tanto, se asigna un segundo nombre al primer nombre. En lo que respecta al núcleo, una vez que lee el objetivo del enlace simbólico, se detiene y vuelve al principio con el valor del objetivo como el nombre del archivo (más o menos), por lo que los enlaces simbólicos relativos son posibles pero muy poco útiles. El nombre de destino no se usa por encima del nivel del sistema de archivos, excepto si se consulta explícitamente en el código del espacio de usuario.

Jim Driscoll
fuente