Curso de Linux / Enlaces duros y simbólicos: diferencias y práctica con ln
En Linux, un enlace duro es otro nombre que apunta al mismo inode que un archivo existente, y un enlace simbólico es un archivo separado que contiene otra ruta. Ambos métodos permiten acceder a un archivo con un nombre diferente, pero los resultados son distintos si se cambia el nombre original o se cruza la frontera del sistema de archivos. En este curso, se crearán archivos de práctica para comprobar directamente las diferencias.
Si los significados de inode y número de enlaces son desconocidos, consulte también la explicación de la salida en Leer atributos de archivos con file·stat.
Dos conceptos necesarios para entender los enlaces
Los nombres como report.txt forman parte de una ruta. Un inode o nodo índice es la estructura con la que el sistema de archivos identifica un archivo y mantiene sus metadatos. Un enlace duro añade otro nombre al mismo inode; eliminar uno de los nombres no impide acceder mediante el otro.
Un enlace simbólico es un elemento separado que contiene la cadena de ruta del objetivo. Al abrir el objetivo, se sigue esa ruta. Si el nombre al que apunta el enlace desaparece o cambia de ubicación, el enlace puede seguir existiendo, pero no se podrá acceder al objetivo. Esto se llama enlace roto.
| Criterios de comparación | Enlace duro | Enlace simbólico |
|---|---|---|
| El objetivo es | inode del mismo archivo | Cadena de ruta de destino |
| inode | Igual que el nombre original | El inode del propio enlace es separado |
| Eliminación o cambio del nombre original | Se puede seguir accediendo con otro nombre | Si la ruta registrada desaparece, puede romperse |
| Otros sistemas de archivos | No se puede cruzar la frontera | Puede apuntar a rutas de otros sistemas de archivos |
| Enlace de directorio | Generalmente no se puede crear | Se puede crear |
Crear un archivo de práctica y dos enlaces
Realice la práctica en un directorio nuevo dentro de su directorio personal. Si ~/linux-course-09-practice ya existe, elija otro nombre para el nuevo directorio y úselo en todos los pasos; conserve el directorio existente. Si mkdir o cd falla, deténgase antes de ejecutar el resto de los comandos.
mkdir ~/linux-course-09-practice
cd ~/linux-course-09-practice
pwd
Asegúrese de crear el archivo solo después de verificar que pwd apunta a la carpeta de práctica que acaba de crear. El printf a continuación escribe una línea en original.txt.
printf 'version 1\n' > original.txt
ln original.txt hard.txt
ln -s original.txt shortcut.txt
El primer ln crea un enlace duro por defecto, y el segundo comando adjuntado con -s crea un enlace simbólico. En shortcut.txt se registra una ruta relativa llamada original.txt. Esta ruta se interpreta con base en el directorio donde se coloca el enlace, no en la ubicación actual del shell.
Verificar inode y destino del enlace
Con GNU stat, verifique el número de inode (%i) y el número de enlaces duros (%h). readlink muestra la ruta registrada en el enlace simbólico.
stat -c '%i %h %n' original.txt hard.txt shortcut.txt
readlink shortcut.txt
El número de inode en sí varía según el sistema, pero como se muestra a continuación, los números de inode de original.txt y hard.txt son iguales y el número de enlaces aparece como 2. shortcut.txt usa un inode diferente.
123456 2 original.txt
123456 2 hard.txt
789012 1 shortcut.txt
original.txt
Los números de ejemplo son solo para ilustración. Los valores reales dependen del sistema de archivos y del entorno. La ruta relativa original.txt que muestra readlink se interpreta dentro de la carpeta que contiene el enlace, por lo que los tres nombres ahora pueden leer el mismo contenido.
cat original.txt
cat hard.txt
cat shortcut.txt
Cada comando imprime version 1. Pero el hecho de que muestren el mismo contenido no significa que la estructura de los tres nombres sea idéntica.
¿Qué pasará si cambiamos el nombre original?
En el directorio de práctica, cambie el nombre de original.txt. hard.txt conserva el acceso al mismo inode. En cambio, shortcut.txt sigue almacenando la ruta anterior y queda roto.
mv original.txt renamed.txt
cat hard.txt
readlink shortcut.txt
cat hard.txt muestra version 1 y readlink shortcut.txt continúa mostrando original.txt. Leer shortcut.txt ahora produce un error porque su destino no existe. Puede crear un enlace distinto al nombre nuevo mediante ln -s renamed.txt new-shortcut.txt.
Con una ruta sin barra final, rm shortcut.txt elimina el enlace simbólico, conservando su destino. Una barra final o una ruta que desciende al interior de un directorio enlazado puede cambiar el objeto sobre el que actúa un comando; compruebe la ruta exacta antes de eliminar.
¿Qué enlace conviene elegir?
Dentro del mismo sistema de archivos, si desea darle otro nombre a un archivo existente y seguir accediendo a él con el otro nombre incluso si uno desaparece, un enlace duro es adecuado. Si desea apuntar a rutas o directorios de otros directorios o sistemas de archivos, y quiere que el enlace muestre la ruta hacia dónde apunta, un enlace simbólico es más flexible. Si planea mover un enlace simbólico o cambiar el nombre del destino, primero debe verificar que la ruta relativa se interpreta en función de la ubicación del enlace.
La opción de ln y la interpretación del destino al crear un enlace se pueden ver más en Explicación detallada del comando ln, y la ruta almacenada del enlace y el resultado de la interpretación se pueden consultar en Explicación detallada del comando readlink.
Para volver al nombre original después de la comparación, ejecute lo siguiente en la misma carpeta de práctica. Si mientras tanto ha creado un nuevo original.txt, no lo sobrescriba y verifíquelo primero. new-shortcut.txt que hizo adicionalmente todavía apunta a renamed.txt, por lo que debe limpiarlo por separado o recrearlo.
mv -i renamed.txt original.txt
cat shortcut.txt
stat -c '%i %h %n' original.txt hard.txt
Ahora puede leer version 1 con shortcut.txt y los inodos de ambos enlaces duros siguen siendo los mismos.
Documentación oficial
El funcionamiento de los enlaces duros y los enlaces simbólicos se consultó en la documentación de ln de GNU Coreutils, y la forma de salida de readlink se consultó en la documentación de readlink de GNU.




