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.