../../_images/Logo_OCW7.jpg

¿Cuántos nombres tiene un fichero?

Asumimos que el nombre (absoluto) de un fichero identifica unívocamente el fichero. Esto ha de ser así para evitar ambigüedades. Pero, ¿puede tener un fichero más de un nombre? Ya sabemos que el shell nos permite referirnos a un fichero de varias formas jugando con la ruta (por ejemplo fichero y ./fichero), pero este es un mecanismo puramente sintáctico. ¿Podemos tener un fichero con dos nombres absolutos diferentes?

A diferencia de otros sistemas, en Linux el nombre no es el identificador de un fichero, sino un identificador del fichero. El verdadero identificador de un fichero Linux es un número entero que identifica unívocamente una estructura llamada i-node. No vamos a entrar en el detalle de qué es un i-node, solo vamos a subrayar que en un sistema Linux existe una biyección entre i-nodes y ficheros. Crear un fichero implica crear un i-node, y eliminar un fichero implica eliminar el i-node.

Nota

El sistema de ficheros no es central a los objetivos del curso. Bastará saber que el i-node es la estructura que identifica unívocamente a un fichero y que contiene la información de atributos del fichero (esa que obtenemos con ls -l) y los apuntadores a los bloques donde se almacena el contenido del fichero en el dispositivo soporte (disco, memoria flash…).

Ahora ya podemos precisar qué es un directorio Linux: una lista de pares (nombre-de-fichero, número-de-i-node). Cuando se crea un fichero hay que asociarle forzosamente un nombre, por lo tanto se crea una entrada nueva en el directorio con el i-node y el nombre relativo, que debe ser único en ese directorio.

Con los conceptos anteriores, estás en condiciones de describir qué significa cp a b y qué significa mv a b en términos de qué ocurre con el directorio y los i-nodes.

¿Qué hace la orden ln a b? Para explicarlo hay que entrar en un detalle del i-node. Un i-node contiene un campo cuenta-de-referencias. Cuando se crea un i-node, su cuenta-de-referencias se pone a 1. Así, cuando se creó a se le asoció un i-nodo i y se añadió en el directorio la entrada (a, i). Lo que hace la orden ln a b es incrementar la cuenta-de-referencias de i e incluir una nueva entrada en el directorio (b, i).

Esta forma de dar un nuevo nombre a un fichero en los sistemas UNIX-Linux es muy diferente del concepto de acceso directo al fichero de muchos sistemas operativos. Puedes comprobarlo si después de hacer ln a b, haces rm a, es decir, eliminas el fichero “original”. En la jerga UNIX estos enlaces que se establecen con ln se denominan enlaces hardware.

En realidad también en Linux podemos establecer accesos directos. Para ello se utiliza ln -s. Estos enlaces se denominan enlaces software o simbólicos. Un enlace simbólico no es más que un fichero que contiene el nombre absoluto del fichero enlazado (el “original”). Los enlaces simbólicos son obligatorios para enlazar directorios (de hecho, no hay que poner siquiera la opción -s). ¿Por qué? Imagina que no fuese así y que hacemos ln .. b (es decir, damos un nombre b al directorio padre en el directorio actual), y a continuación ejecutamos ls -R .. (recuerda que con esta orden se recorren recursivamente todos los subdirectorios). Si ln estableciera un enlace hardware, ls -R no acabaría nunca.

../../_images/Licencia7.jpg