¿Cuándo usarías uno sobre el otro?
¿Cuándo usarías uno sobre el otro?
Respuestas:
La diferente semántica entre enlaces duros y blandos los hace adecuados para diferentes cosas.
Enlaces duros:
Enlaces simbólicos (enlaces blandos)
ls -l
mostrará a qué ruta apunta un enlace simbólico)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).
..
y .
.
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 -al
se 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 rm
no 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!
ls -l
es suficiente para ver lo que se vincula mediante un enlace simbólico, los a
soportes --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.
ln -s /home 1; ls -l 1
muestra que el enlace simbólico 1 tiene 5 bytes de largo, mientras ln -s /usr/share/ 2; ls -l 2
que muestra que 2 tiene 11 bytes de largo.
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.
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 stat
lo 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
namei
, por el nombre de la función del núcleo que hizo esto en Unix tradicional.)
stat
fallarán.
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.
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
Los enlaces duros son entradas de directorio adicionales para el mismo archivo. Eso significa
Muchos editores no escriben el nuevo contenido en el mismo archivo al guardar, sino que realizan el siguiente procedimiento:
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/sh
o 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.
HARD LINK (solo archivos) vs SOFT LINK (archivos o directorios) vs BIND (HARD LINK para directorios)
(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.
Puede crear otro enlace duro y eliminar el archivo original, y aún tiene acceso al enlace duro recién creado.
Si eliminó HARD LINK 1, ¿cree que SOFT LINK funcionaría? No, el sistema operativo informará que HARD LINK 1 no existe.
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.
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).
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.