Enlaces en Linux
Table of Contents
ToggleIntroducción
Los enlaces son aquellos «conectores» que nos ayudan a realizar varios trabajos, por ejemplo ahorrar espacio en memoria, ejecutar y actualizar más de un archivo a la vez, cambiar versiones, etc.. A continuación, en este apartado estaremos explicando los tipos de enlaces en Linux, como asi también, su funcionamiento.
¿Cómo se conforman los enlaces?
Los enlaces en Linux se dividen en dos categorías: duros (hardlink) y simbólicos o blandos (symlink). Los de tipo simbólicos son los más utilizados debido a su flexibilidad y la capacidad para trabajar a través de diferentes particiones. En cambio, los duros, son indistinguibles del original y tienen sus propias restricciones. Veamos algunos ejemplos.
Enlaces Duros (Hardlinks)
Estos enlaces comparten el inodo del fichero original. De hecho, un hard link es indistinguible del original, por eso, los cambios en el link afectan al fichero, excepto en el borrado. Borrar el link no elimina al original ni a la inversa. Este tipo de enlace conserva los permisos del original y marcas de tiempo. Por el contrario, no se pueden usar para hacer enlaces a directorios ni pueden extenderse a otros sistemas de ficheros.
Su sintaxis es la siguiente:
#ln /ruta/completa/fichero nombre_enlace
Los enlaces duros son implementados en los sistemas de archivos estilo Unix (ext2/3/4, xfs, etc), como diferentes entradas en bloques de directorio que apuntan al mismo inodo. Cambiando de nombre o borrando una de esas entradas, no borramos los datos, solamente disminuye la cuenta del enlace. Dado que las entradas en el directorio comparten el mismo inodo, todos los metadatos del archivo son los mismos, excluyendo el nombre.
Los nombres de los enlaces se mantienen en la entrada del directorio y no en el inodo. Los enlaces duros no pueden atravesar particiones. Además, el usuario no puede crear enlaces duros a directorios, solamente existen los enlaces especiales, que refieren a sí mismo y al padre respectivamente.
Creando un enlace duro:
#ln ejemplo hard_archivo
Como vemos, el archivo /tmp/hard_ejemplo apunta a ejemplo. Ambos, poseen el mismo número de inodo.
Uso de Inodos
Además, a diferencia de los enlaces simbólicos, los enlaces duros nunca se pueden romper moviendo uno de los archivos (entradas de directorio) a otra ubicación. Con estos tipos de enlaces, se mantiene un contador en el inodo de cada archivo. Es decir, cuando el contador de enlaces cae a 0, se borra el inodo y los bloques de datos son liberados para reusarlos. De esta manera, una vez que un archivo es “enlazado duramente”, cualquier “copia” del archivo se puede borrar, y los otros quedarán intactos. Generalmente, los archivos tienen un único enlace. Los directorios tienen tantos enlaces como subdirectorios tengan.
Conclusión
Los enlaces duros son muy útiles cuando se necesita acceder a un mismo inodo, por ejemplo, podría ser un programa, un archivo multimedia como una foto o sonido, soluciones de backup, etc.
Supongamos que tenemos la siguiente carpeta con fotos:
# ls -l /Imágenes
-rw-r—– 2 usuario usuario 4323234 Jun 15 2022 foto1.jpg
-rw-r—– 2 usuario usuario 4349067 Sep 12 2022 foto2.jpg
(…)
Si queremos crear una carpeta para almacenar las fotos favoritas podríamos copiarlas, pero eso duplicaría el espacio usado por cada uno de los archivos. En cambio, podemos crear enlaces duros, de modo que ahorramos espacio y, el inodo permanecerá hasta que se borren dichos enlaces. Por ejemplo:
#mkdir Favoritas
#ln foto21.jpg Favoritas/foto1.jpg
#ln foto2.jpg Favoritas/foto2.jpg
(…)
Enlaces simbólicos (Symlinks)
Estos enlaces pueden extenderse a otros sistemas de ficheros. También pueden hacer referencia a directorios, de hecho, pueden referenciar hasta ficheros inexistentes. La lectura y escritura, así como la copia del enlace, afectan al archivo al que apuntan, mientras que el borrado afecta al propio enlace. Borrar el archivo apuntado tampoco elimina el enlace automáticamente.
Su sintaxis es la siguiente:
# ln -s /ruta/completa/fichero nombre_enlace
Los enlaces simbólicos, (frecuentemente referidos simplemente como “symlinks”), son implementados en Linux como un archivo separado conteniendo una referencia en el archivo al archivo original, en términos más técnicos, un inodo conteniendo la ubicación “real” del archivo.
Crear un enlace simbólico:
#ln -s file sfile
#ls -li sym_file
A diferencia de los enlaces duros, el archivo /tmp/sym_file tiene un número diferente de inodo,pero apunta al archivo file.
Características esenciales
Este tipo de enlace usa una ruta que puede ser, o absoluta (comenzando con /), o bien relativa a la ubicación del enlace. Si un enlace relativo se crea y luego se mueve, se romperá, mientras que los enlaces absolutos generalmente no. A causa de su diseño, un enlace simbólico puede apuntar a cualquier directorio o archivo, o aún, apuntar a una ubicación inexistente (en cuyo caso es llamado “roto”).
Vemos otro ejemplo:
Un programa llamado symlinks se escribió para hacer el proceso de ubicar y limpiar los enlaces simbólicos rotos. A diferencia de un enlace duro, borrar el archivo original provocará que el archivo sea borrado y los enlaces simbólicos apuntando a él se convierten en «colgantes».
# symlinks -v /etc
Los enlaces simbólicos no tienen permisos o estado por su cuenta. En su lugar, usan los permisos del archivo al que apuntan, aunque los permisos del enlace mismo son rwxrwxrwx . El tamaño de un enlace simbólico es informado como la longitud de la ruta que posee (más el caracter nulo al final).
Tareas administrativas con enlaces simbólicos
Por lo general, el uso que se les da a los enlaces simbólicos es la de archivo pivote, por ejemplo, podemos mantener más de una versión de un programa o archivo y cambiar con facilidad de una versión a otra por medio del enlace simbólico:
Por lo tanto, si queremos cambiar a la versión 4 simplemente debemos hacer lo siguiente:
En los sistemas de arranque de Linux, estos enlaces también se usan ampliamente, por ejemplo, para habilitar o deshabilitar servicios.
Localizar enlaces
Localizar un enlace duro es un poco más difícil que un enlace simbólico. Cuando ejecutamos el comando ls -l , el número que sigue a los permisos, antes del dueño, es el número de enlaces a ese archivo. Para archivos normales, si ese número es mayor a 1, entonces ese archivo tiene un enlace duro en algún otro lugar. En el caso de los directorios la columna de enlaces duros indica la cantidad de subdirectorios que posee en su primer nivel:
Localizar enlaces duros:
Podemos identificar si dos archivos comparten el mismo inodo ejecutando:
#stat file
De igual manera, utilizando el comando «ls -i» podemos obtener el inodo de un archivo en particular.
En el caso de querer buscar todos los archivos en el sistema de archivos con un inodo en particular, podríamos usar:
#find <file_system_root> -inum <inode>
Localizar enlaces simbólicos:
En cada archivo hay un campo Inodo, el cual da el número de inodo único. Ahora bien, para buscar todos los enlaces simbólicos del sistemas podríamos hacer:
#find ./ -type l -ls 2>/dev/null
En el caso de querer buscar a través de un directorio en especial, podríamos usar el comando sed:
#find ./ -type l -ls | sed -r «s/.*(\.\/)/\1/g»