¿Qué es un enlace duro? — Definición de The Linux Information Project (LINFO)

Un enlace duro es simplemente un nombre adicional para un archivo existente en Linux u otros sistemas operativos tipo Unix.

Se puede crear cualquier número de enlaces duros, y por lo tanto cualquier número de nombres, para cualquier archivo. También se pueden crear enlaces duros a otros enlaces duros. Sin embargo, no pueden crearse para directorios, y no pueden cruzar los límites del sistema de archivos o atravesar particiones.

El sistema operativo no hace ninguna distinción entre el nombre que se asignó originalmente a un archivo cuando se creó por primera vez y cualquier enlace duro que se cree posteriormente a ese archivo, aparte de que son simplemente varios nombres para el mismo archivo. Esto se debe a que tanto el nombre original como los enlaces duros apuntan al mismo inodo. Un inodo es una estructura de datos (es decir, una forma optimizada de almacenar información) que almacena toda la información sobre un archivo (por ejemplo, su tamaño, sus permisos de acceso, cuándo se creó y dónde se encuentra en el sistema) excepto su(s) nombre(s) y sus datos reales. El hecho de que los números de inodo son únicos sólo dentro de cualquier sistema de archivos es la razón por la que no funcionan a través de sistemas de archivos y particiones.

Los enlaces duros se crean con el comando ln. Por ejemplo, lo siguiente crearía un enlace duro llamado hlink1 a un archivo llamado file1, ambos en el directorio actual (es decir, el directorio en el que el usuario está trabajando actualmente):

ln file1 hlink1

Cuando se crea un enlace duro, no hay ninguna indicación obvia de que sea diferente de cualquier otro archivo. Es decir, los enlaces duros parecen ser archivos del mismo tipo que sus archivos de destino (es decir, los archivos a los que están vinculados) cuando se ven con comandos como ls (es decir, lista) y file (que se utiliza para determinar el tipo de cualquier archivo especificado). Del mismo modo, cuando se ven en una GUI (interfaz gráfica de usuario), los iconos de los enlaces duros son idénticos a los de sus archivos de destino.

Que el nombre inicial de un archivo y todos los enlaces duros a ese archivo comparten el mismo inodo puede verse claramente utilizando el comando ls con su opción -i (es decir, inodo). Así, por ejemplo, lo siguiente mostraría que los números de inodo de archivo1 y hlink1 del ejemplo anterior son idénticos:

ls -i file1 hlink1

El número de enlaces duros a cualquier archivo se muestra en la segunda columna de la salida producida al usar ls con su opción -l (es decir, larga). Se puede ver que el número es la suma del archivo de destino y cualquier enlace duro a él (es decir, la suma del nombre inicial y cualquier nombre añadido posteriormente) y que es el mismo para el objetivo y para cada uno de esos enlaces.

Los archivos con enlaces duros también pueden encontrarse utilizando el comando find con su opción -type f (para seleccionar sólo archivos regulares) seguida de su opción -links +1 (para mostrar todos los archivos regulares con más de un enlace duro a ellos) como sigue:

find -type f -links +1

Cuando se realiza un cambio en el contenido de un archivo, se conserva la vinculación a todos los enlaces duros. Sin embargo, algunos editores de texto pueden romper el enlace creando un nuevo inodo para los contenidos revisados,1 y por lo tanto puede ser prudente comprobar los enlaces importantes después de modificar los archivos.

El comando rm superficialmente parece eliminar o borrar archivos. Sin embargo, lo que realmente hace es reducir la cuenta de enlaces duros de un archivo (es decir, el número de nombres que tiene el archivo) en uno, y no afecta directamente al inodo o a los datos del archivo. Cuando el recuento llega a cero, el archivo parece haber desaparecido porque ya no hay ninguna forma fácil de referenciarlo. Sin embargo, los datos del archivo sólo se eliminan realmente cuando la(s) ubicación(es) de la unidad de disco duro (HDD) u otro medio de almacenamiento que lo contiene es sobrescrita por un nuevo archivo.

Así, por ejemplo, lo siguiente eliminaría el enlace duro hlink1 que se creó en el ejemplo anterior:

rm hlink1

Usando rm de nuevo con el único nombre restante de la siguiente manera haría que los datos del archivo fueran prácticamente inaccesibles:

rm file1

Tal vez la aplicación más útil para los enlaces duros es permitir que los archivos, programas y scripts (i.es decir, programas cortos) para acceder fácilmente en un directorio diferente del archivo original o archivo ejecutable (es decir, la versión lista para ser ejecutada de un programa). Al escribir el nombre del enlace duro, el programa o script se ejecutará de la misma manera que si se utilizara su nombre original.

Los enlaces simbólicos, también llamados enlaces blandos, son más útiles que los enlaces duros porque pueden hacerse a directorios así como a archivos en diferentes sistemas de archivos y en diferentes particiones. Además, cuando se utiliza una interfaz gráfica de usuario, los enlaces simbólicos tienen iconos especiales que los identifican inmediatamente como enlaces y no como archivos ordinarios. Sin embargo, tienen la desventaja de que se vuelven inutilizables si su archivo de destino es eliminado.

Los alias se parecen superficialmente a los enlaces duros en el sentido de que son otra forma de proporcionar múltiples nombres para cualquier archivo. Sin embargo, el comando de alias está integrado en el shell (es decir, el programa que proporciona la interfaz de usuario de sólo texto) en lugar de ser un programa separado y el mecanismo es muy diferente al de los enlaces duros. Al igual que los enlaces simbólicos, los alias pueden usarse no sólo para archivos sino también para directorios y pueden cruzar los límites del sistema de archivos y de las particiones. Además, un alias puede usarse como un nombre corto para cualquier texto del shell (es decir, un comando o una serie de comandos enlazados, incluyendo sus opciones y/o argumentos).

________
1Las pruebas en Red Hat Linux 9 encontraron que los enlaces duros se rompían cuando se modificaban archivos usando el editor de texto gedit. Sin embargo, no se rompían al utilizar los editores de texto vi y Abiword, así como el editor hexadecimal KHexEdit en la misma versión de Linux. El fracaso de gedit para preservar los enlaces duros se debió al hecho de que en realidad crea una copia del archivo modificado que guarda (y por lo tanto el nuevo número de inodo) en lugar de hacer los cambios en el archivo original, pero esta copia recibe el nombre del archivo original. Sin embargo, una prueba similar utilizando una versión más reciente de gedit (2.14.0) en Fedora Core 5 mostró que el problema se había corregido y que no había rotura de enlaces.