Ir al contenido principal
¿Te ayudamos?
oposiciones · informática

Enlaces duros y simbólicos en Linux: 8 ejercicios

11 min de lectura

Resuelve ocho casos de enlaces duros y simbólicos en Linux: inodos, escrituras, borrado, rutas relativas y archivos abiertos, con comandos y soluciones.

Un enlace duro añade un nombre al mismo archivo. Un enlace simbólico guarda una ruta. Esa diferencia explica por qué puedes borrar un nombre sin perder el acceso por otro, o mover un enlace y acabar leyendo un contenido diferente.

Estos ocho ejercicios originales de Linux trabajan con archivos propios, nombres y rutas concretas. Cada solución incluye el resultado esperado y el dato que lo decide. No son preguntas oficiales ni una predicción de examen.

El material de Técnico Auxiliar de Informática de Zaragoza desarrolla archivos, directorios e inodos en su tema de GNU/Linux. Esta práctica complementa esa materia. Si estás estudiando permisos, puedes combinarla con los diez ejercicios de chmod y umask, centrados en otras operaciones.

Cuatro datos para interpretar las pruebas

DatoQué observa
Nombre o rutaCómo intentas localizar el objeto
Dispositivo e inodoIdentidad del archivo en las consultas de estos casos
Número de enlaces durosCuántos nombres de ese tipo conserva el archivo
Texto de un enlace simbólicoQué ruta se intentará resolver

No compares únicamente el número de inodo entre sistemas de archivos distintos: puede repetirse. La documentación inode(7) distingue dispositivo, inodo y contador de enlaces. Para enlaces duros de archivos regulares, las condiciones y límites se explican en link(2): no permiten cruzar sistemas de archivos montados.

Usamos ln origen nombre para crear un enlace duro y ln -s ruta nombre para uno simbólico. Puedes consultar ln(1), de GNU coreutils. En esta colección, los destinos nuevos no existen previamente y las operaciones están permitidas sobre objetos propios.

Preparar el laboratorio

Utiliza una terminal de Linux con herramientas GNU; el último caso necesita Python 3. Crea una carpeta temporal con laboratorio=$(mktemp -d) y entra con cd "$laboratorio". Ejecuta los bloques de shell dentro de esa carpeta y el último con Python 3: cada uno crea su propio subdirectorio caso1, caso2 y así sucesivamente. Para repetirlos, empieza en otra carpeta temporal vacía.

Los comandos modifican y eliminan exclusivamente los archivos de práctica que crean. No necesitan sudo. Suponemos un sistema de archivos local que admite enlaces, permisos suficientes y ausencia de restricciones adicionales que impidan las operaciones.

No debes obtener los mismos números de dispositivo o inodo que otra persona. Lo que importa es su igualdad o diferencia dentro de cada caso. En GNU stat, %d muestra dispositivo, %i inodo y %h enlaces duros; -L sigue enlaces simbólicos. El comportamiento se documenta en stat(1).

1. Dos nombres y un mismo archivo

Predice cuántos inodos de archivo regular y cuántos enlaces duros se observan después de estas órdenes:

mkdir caso1
printf 'ACTA\n' > caso1/base.txt
ln caso1/base.txt caso1/alternativo.txt
stat -c '%n %d %i %h' caso1/base.txt caso1/alternativo.txt
Ver solución del ejercicio 1

Los dos nombres muestran el mismo dispositivo e inodo y un contador de 2. No se han creado dos archivos independientes con contenidos que deban sincronizarse: las dos entradas se refieren al mismo archivo.

El primer nombre no tiene un rango superior al añadido después. Llamarlo «original» ayuda a contar la secuencia, pero no lo convierte en propietario del otro nombre. Si una pregunta presenta el contador 2, tampoco debes sumar los dos renglones de stat y responder 4: ambos consultan el mismo contador.

2. El enlace simbólico y su destino

Ahora solo se añade un enlace simbólico. ¿Aumentará a 2 el contador del archivo de datos? ¿Por qué pueden diferir las dos consultas al enlace?

mkdir caso2
printf 'ACTA\n' > caso2/base.txt
ln -s base.txt caso2/acceso.txt
readlink caso2/acceso.txt
stat -c '%n %d %i %h' caso2/base.txt caso2/acceso.txt
stat -L -c '%n %d %i %h' caso2/acceso.txt
Ver solución del ejercicio 2

El contador de base.txt sigue siendo 1. readlink imprime base.txt: esa es la cadena almacenada. La consulta sin -L informa de un objeto simbólico con inodo distinto del archivo de datos. La consulta con -L llega al archivo de datos y muestra su identidad y contador 1.

Se consulta el mismo nombre acceso.txt, pero con una decisión diferente sobre seguirlo. La etiqueta del nombre en la salida no basta para saber qué objeto se ha examinado: debes leer también las opciones. Crear el simbólico no añade otro enlace duro al destino.

3. Escribir por un enlace duro frente a escribir una copia

Compara el contenido final de los tres nombres. La copia se crea cuando base.txt contiene únicamente la primera línea.

mkdir caso3
printf 'UNO\n' > caso3/base.txt
ln caso3/base.txt caso3/duro.txt
cp caso3/base.txt caso3/copia.txt
printf 'DOS\n' | tee -a caso3/duro.txt > /dev/null
cat caso3/base.txt
cat caso3/copia.txt
stat -c '%n %d %i %h' caso3/base.txt caso3/duro.txt caso3/copia.txt
Ver solución del ejercicio 3

base.txt y duro.txt contienen las líneas UNO y DOS; copia.txt, solo UNO. La orden tee -a añade datos al archivo abierto mediante duro.txt, que es el mismo al que lleva base.txt. La opción -a conserva las líneas anteriores y añade la nueva; la salida de tee se dirige aquí a /dev/null para mostrar después los archivos por separado. Puedes contrastar esa opción en tee(1).

La copia tiene otra identidad y no recibe esa escritura. En este caso, los dos nombres enlazados muestran contador 2 y la copia, contador 1. Coincidir en el contenido inicial no demuestra identidad: precisamente por eso se observa qué cambia al escribir y se comparan dispositivo e inodo.

4. Borrar el nombre usado para crear los enlaces

¿Qué acceso conserva el enlace duro y qué sucede con el simbólico?

mkdir caso4
printf 'ACTA\n' > caso4/base.txt
ln caso4/base.txt caso4/duro.txt
ln -s base.txt caso4/acceso.txt
rm caso4/base.txt
cat caso4/duro.txt
stat -c '%h' caso4/duro.txt
readlink caso4/acceso.txt
if test -e caso4/acceso.txt; then echo resuelve; else echo no-resuelve; fi
if test -L caso4/acceso.txt; then echo sigue-siendo-enlace; fi
Ver solución del ejercicio 4

El duro permite leer ACTA y su contador baja a 1. El simbólico conserva el texto base.txt, pero esa ruta ya no encuentra un destino en caso4. Las comprobaciones imprimen no-resuelve y sigue-siendo-enlace.

Que la comprobación -e falle no significa que el propio enlace haya desaparecido. Aquí queda un enlace colgante. Tampoco existe una búsqueda automática del «archivo más parecido»: el simbólico no cambia su texto a duro.txt por compartir antes destino. symlink(7) explica esa referencia a una ruta.

5. La base de una ruta relativa

Los dos simbólicos se crean desde el directorio del laboratorio. ¿Cuál llega al archivo de datos?

mkdir -p caso5/accesos
printf 'DATOS\n' > caso5/datos.txt
ln -s datos.txt caso5/accesos/mal.txt
ln -s ../datos.txt caso5/accesos/bien.txt
if test -e caso5/accesos/mal.txt; then echo mal-resuelve; else echo mal-no-resuelve; fi
cat caso5/accesos/bien.txt
readlink caso5/accesos/bien.txt
Ver solución del ejercicio 5

mal.txt no resuelve; bien.txt permite leer DATOS. El primero intenta encontrar datos.txt dentro de caso5/accesos, porque allí vive el enlace. El segundo sube un nivel con .. y llega a caso5/datos.txt.

readlink imprime ../datos.txt; no sustituye la cadena por el contenido del archivo. El lugar desde el que ejecutaste ln no se convierte en una base oculta que acompañe al enlace. Para revisar el caso, escribe primero el directorio del enlace y después aplica la ruta que contiene.

6. Mover un simbólico puede cambiar lo que abre

Ambas carpetas contienen un archivo llamado datos.txt, pero con distinto contenido. Solo se mueve el enlace.

mkdir -p caso6/a caso6/b
printf 'UNO\n' > caso6/a/datos.txt
printf 'DOS\n' > caso6/b/datos.txt
ln -s datos.txt caso6/a/acceso.txt
cat caso6/a/acceso.txt
mv caso6/a/acceso.txt caso6/b/acceso.txt
readlink caso6/b/acceso.txt
cat caso6/b/acceso.txt
Ver solución del ejercicio 6

La primera lectura muestra UNO y la segunda, DOS. Entre ellas, readlink sigue mostrando datos.txt. La cadena no ha cambiado; lo que cambia es el directorio que sirve de base para interpretarla.

Por tanto, mover un enlace relativo no siempre lo rompe: también puede hacer que alcance otro archivo existente. Ninguno de los dos archivos de datos se ha movido ni se ha modificado. Si solo comprobaras que «todavía abre», pasarías por alto el cambio de destino; comprueba también qué identidad o contenido alcanza.

7. Eliminar el simbólico conserva el destino

¿Queda disponible base.txt después de eliminar el nombre del enlace?

mkdir caso7
printf 'ACTA\n' > caso7/base.txt
ln -s base.txt caso7/acceso.txt
rm caso7/acceso.txt
cat caso7/base.txt
stat -c '%h' caso7/base.txt
Ver solución del ejercicio 7

Sí: se lee ACTA y el contador del archivo de datos es 1. La orden usa el nombre del simbólico como argumento de rm, sin barra final ni recorrido de un directorio. Elimina ese enlace, no el archivo al que apuntaba.

Este caso es el inverso práctico del 4: allí desaparecía el destino nombrado en la cadena; aquí desaparece el propio objeto simbólico. Describe siempre qué nombre recibe la operación. Decir simplemente «se borra el enlace» puede ocultar cuál de las dos situaciones estás analizando.

8. Sin nombres, pero todavía abierto

Un programa abre un archivo y después elimina su único nombre. ¿Puede leer mediante el descriptor que ya tenía abierto? Ejecuta este bloque con Python 3 desde el directorio del laboratorio para observar esa distinción.

import os
from pathlib import Path
Path('caso8').mkdir()
ruta = Path('caso8/abierto.txt')
ruta.write_bytes(b'ACTA\n')
with ruta.open('rb') as archivo:
    ruta.unlink()
    print('nombre-existe', ruta.exists())
    print('enlaces', os.fstat(archivo.fileno()).st_nlink)
    print('lectura', archivo.read().decode('ascii').strip())
Ver solución del ejercicio 8

Se imprimen nombre-existe False, enlaces 0 y lectura ACTA. Ya no puedes abrir ese archivo por la ruta eliminada, pero el programa conserva una referencia abierta y puede leer a través de ella. fstat consulta el archivo asociado al descriptor.

Al salir del bloque with, ese descriptor se cierra. La distinción entre quitar el último nombre y cerrar la última referencia abierta está descrita en unlink(2). No se está midiendo el espacio libre del disco ni prometiendo un instante concreto para su actualización.

Clave de revisión

CasoResultado que debes explicar
1Dos nombres, misma identidad y contador 2
2Objeto simbólico distinto; el destino conserva contador 1
3La escritura llega al mismo archivo, pero no a la copia
4Duro legible; simbólico colgante
5La ruta relativa parte del directorio del enlace
6El mismo texto relativo alcanza otro archivo tras moverlo
7Quitar el simbólico deja el destino disponible
8Cero enlaces duros no invalida un descriptor ya abierto

Al corregir, escribe tres cosas: qué nombre recibe la orden, si se sigue un simbólico y qué objeto cambia. No generalices «todas las herramientas siguen enlaces» ni «borrar siempre destruye el contenido». Tampoco extrapoles estos casos a enlaces duros de directorios, montajes distintos o comportamientos de otras plataformas.

Continúa con los ejercicios de permisos Linux para separar acceso al contenido y modificación del directorio. Para estudiar los demás apartados del curso, revisa el material de Informática de Zaragoza.

Preguntas frecuentes

¿Un enlace duro es una copia del archivo?

No. Es otro nombre para el mismo archivo dentro del mismo sistema de archivos. Las escrituras sobre ese archivo se ven desde ambos nombres; una copia independiente puede cambiar sin modificar el original.

¿Borrar el nombre original rompe todos los enlaces?

No. Los enlaces duros restantes conservan el acceso al mismo archivo. Un enlace simbólico que guardaba la ruta eliminada queda colgante mientras esa ruta no resuelva a un destino.

¿Desde dónde se interpreta un enlace simbólico relativo?

Desde el directorio que contiene el enlace, no desde el directorio actual de quien lo abre. Al mover solo el enlace a otra carpeta, la misma cadena puede resolver a otro archivo o dejar de resolver.

¿Por qué stat y stat -L pueden mostrar datos distintos?

Con GNU stat, la consulta sin -L informa del enlace simbólico; con -L sigue el enlace y consulta su destino. Un enlace duro no introduce ese objeto simbólico intermedio.

¿Son ejercicios oficiales de Informática de Zaragoza o TAI?

No. Son ocho casos originales comprobados en Linux para estudiar archivos y directorios. No anuncian preguntas, ponderaciones ni el formato de una convocatoria.

Artículos relacionados

Permisos Linux para TAI: 10 ejercicios de chmod y umask

Resuelve diez ejercicios de permisos Linux para TAI: modos octales, chmod, umask, directorios y borrado. Soluciones comprobadas en un sistema Linux.

DNS para TAI: registros y 8 ejercicios resueltos

Practica A, AAAA, CNAME, MX, PTR y NS con ocho ejercicios DNS para TAI. Resuelve TTL, NODATA y transporte TCP con soluciones explicadas y fuentes RFC.

Binario y hexadecimal: 12 ejercicios de oposiciones

Practica binario, decimal y hexadecimal con 12 ejercicios resueltos: conversiones, ceros iniciales, rango sin signo y suma de ocho bits.

oposiciones informática