Antes de ver enlaces duros, le aconsejo que aprenda sobre los inodos en Linux. Un sistema de archivos de Linux tiene dos componentes principales:un grupo de bloques de datos donde se almacenan los datos y un sistema de base de datos para administrar este grupo de datos. El inodo es como un índice para este sistema de base de datos.
¿Que es un enlace duro en Linux?
Un enlace fijo a un archivo apunta al inodo del archivo en lugar de apuntar al archivo en sí. De esta forma, el vínculo físico obtiene todos los atributos del archivo original y apunta al mismo bloque de datos que el archivo original.
Si recuerda el enlace simbólico o el enlace suave, sabrá que apunta al archivo. Un enlace fijo es una entrada creada manualmente en un directorio que apunta a un inodo ya existente.
Te lo voy a explicar con diagramas adecuados. Tomemos esta estructura de directorios por ejemplo:
Básicamente, el directorio raíz contiene los directorios dir_1 y dir_2. El directorio dir_1 tiene archivos file_1 y file_2, mientras que dir_2 contiene file_3 y un enlace fijo al archivo 2.
Veamos cómo se ven las cosas en el sistema de archivos. Todo es representacional. En realidad, el directorio raíz tendrá miles de archivos. Aquí, asumimos que solo tiene dos directorios.
¿Recuerdas la estructura de directorios de Linux? Comienzas con la raíz (/). El directorio raíz siempre tiene el inodo 2.
Si tiene que acceder al archivo 3, la ruta absoluta sería /dir_2/file_3. Aquí, puede leerlo así:comienza en el inodo 2 (la raíz siempre es el indoe 2) y sigue la flecha hasta su bloque de datos. Este bloque de datos tiene la información sobre el inodo de dir_2 (inodo 27 en nuestro ejemplo).
Ahora mira el inodo 27. Su tipo es directorio. Sigue hasta su bloque de datos que tiene información sobre el inodo de file_3 (inodo 88). Buscas en el inodo 88. Su tipo es archivo y si sigues hasta su bloque de datos, accedes al contenido del archivo.
¿Notó que el directorio en sí no contiene los datos de su archivo? Los directorios son esencialmente un archivo que contiene información sobre los inodos de sus archivos y subdirectorios.
Debes estar preguntándote sobre el recuento de enlaces en la imagen de arriba. Eso es muy importante, especialmente cuando se trata de un enlace duro. El recuento de enlaces es el número de entradas de directorio que apuntan a un inodo. Tome el inodo 27 para dir_2 por ejemplo. El inodo 27 está una vez en el bloque de datos del directorio raíz y una vez en su propio bloque de datos (el directorio especial). Y, por lo tanto, tiene un recuento de enlaces de 2.
¿Observa que todos los archivos tienen un recuento de enlaces 1 excepto el archivo_2? Si un archivo tiene un recuento de enlaces superior a 1, significa que hay enlaces duros "a este archivo". Dado que los enlaces duros apuntan al mismo inodo (inodo 17 en nuestro ejemplo) que el archivo de destino, obtiene 2 listas de directorios para el inodo 17 (en el bloque de datos de dir_1 y dir_2).
Cómo crear enlaces duros en Linux
Puede usar el comando ln para crear un vínculo físico:
ln target_file link_name
Esto creará un enlace duro llamado link_name al target_file. Verá que link_name parece un archivo normal y sus atributos son los mismos que los del archivo de destino.
Si usa el comando ls -li (la opción -i muestra el número de inodo), verá que el recuento de enlaces es 2. El recuento de enlaces se encuentra después del campo de permiso del archivo.
134195 -rw-r--r-- 2 abhishek abhishek 0 Jul 17 19:49 target_file
134195 -rw-r--r-- 2 abhishek abhishek 0 Jul 17 19:49 link_target_file
Ambos tienen el mismo número de inodo 134195, obviamente.
Cosas para tener en cuenta sobre los enlaces duros
Ahora que tiene una buena idea sobre los enlaces duros en Linux, avancemos un poco más.
Eliminar el archivo de destino ya no eliminará sus datos si tiene enlace duro
Si elimina el archivo de destino, aún puede acceder a su contenido a través del enlace físico. Es porque tanto el archivo de destino como el enlace físico tienen el mismo inodo y, por lo tanto, apuntan al mismo bloque de datos.
Eliminar archivos en Linux es básicamente desvincular. Suponga que elimina el archivo_1 usando el comando rm. El kernel de Linux encontrará que el archivo_1 corresponde al inodo 16. Eliminará la entrada del archivo_1 de la lista de dir_1 y reducirá el recuento de enlaces del inodo 16 en 1. Ahora que el recuento de enlaces del inodo 16 es 0, el kernel sabe que no hay nadie enlazando a este inodo por lo que es seguro eliminar el inodo y eliminar el bloque de datos asociado con él.
Ahora diga que elimina el archivo_2. Kernel eliminará el archivo_2 de la lista de dir_1 e irá al inodo 17. Reducirá el conteo de enlaces del inodo 17 y lo reducirá a 1. Dado que el conteo de enlaces no es cero, el kernel no eliminará el inodo o los datos asociados con eso. Y por lo tanto, si accede al enlace físico, aún puede acceder a los datos aunque el archivo original haya sido eliminado.
No deberías crear un enlace duro a un directorio
Puede crear un enlace suave a un directorio, pero cuando intenta crear un enlace fijo a un directorio, verá un error como este:
ln: newdir/test_dir: hard link not allowed for directory
¿Por qué no se permiten enlaces duros para el directorio? Es porque el uso de enlaces duros para el directorio puede romper el sistema de archivos. Teóricamente, puede crear enlaces duros a directorios usando la opción -d o -F. Pero la mayoría de las distribuciones de Linux no lo permitirán, incluso si es un usuario root.
Es casi imposible distinguir entre los enlaces duros y el archivo original
Echemos otro vistazo al vínculo físico que creé anteriormente:
134195 -rw-r--r-- 2 abhishek abhishek 0 Jul 17 19:49 target_file
134195 -rw-r--r-- 2 abhishek abhishek 0 Jul 17 19:49 link_target_file
Tienen atributos idénticos, pero puede adivinar cuál es el enlace según el nombre en el ejemplo anterior, pero ¿y si el nombre no fuera obvio? ¿Cómo sabrías si sus nombres fueran target_1 y target_2?
Si el archivo y los enlaces están en un directorio diferente, puede intentar verificar mtime y otros parámetros para saber cuándo se cambió el contenido del directorio, pero incluso eso no es una certeza. Si el archivo y el enlace fijo están en el mismo directorio y el historial se ha borrado, no estoy seguro de cómo puede averiguar cuál es el archivo original y cuál es el enlace fijo.
Consejo adicional:cómo encontrar todos los enlaces físicos a un archivo determinado
Si ve que un archivo tiene más de un recuento de enlaces, es posible que sienta curiosidad por los otros enlaces físicos asociados con él.
Una forma de encontrar eso es usando el número de inodo del archivo. Puede usar el comando ls -i o el comando stat para obtener el número de inodo.
Una vez que tenga el número de inodo, puede ver todos los enlaces asociados usando el comando de búsqueda.
find . -inum inode_number
¿Fue difícil entender los enlaces duros?
Espero que no haya sido demasiado "difícil" y que tenga una mejor comprensión del concepto de enlace duro en Linux. Si tiene dudas o sugerencias sobre este tema, por favor deje un comentario a continuación.