Diferencias entre soft (symbolic) y hard links

Hoy vamos a tratar de comprender las diferencias que existen en Unix / Linux entre los enlaces simbólicos (soft o symbolic links) y los enlaces duros (hard links).

Symbolic Link Hard links Unix
Esquema: tldp.org

 

Enlaces simbólicos (soft / symbolic links)

La manera más sencilla de comprender que es un enlace simbólico en Linux es compararlo con el “enlace directo” o “shortcut” en Windows. El fichero o directorio se encuentra en un único punto del disco y los enlaces son un puntero contra él. Cada enlace simbólico tiene su propio número de inodo lo que permite hacer enlaces simbólicos entre distintos sistemas de ficheros.

Para crear enlaces (tanto simbólicos como duros) usamos el comando ln. En este caso vamos a crear un enlace simbólico (parámetro -s) del fichero test:

$ ln -s test enlace-a-test

Si listamos ambos veremos que el enlace tiene el carácter l que lo identifica como enlace simbólico:

$ ls -l
lrwxrwxrwx 1 alex alex 4 2011-04-27 18:59 enlace-a-test -> test
-rw-r--r-- 1 alex alex 0 2011-04-27 18:58 test

Para confirmar que el enlace simbólico tiene un inodo distinto usamos el comando stat:

$ stat test
  File: «test»
  Size: 0         	Blocks: 0          IO Block: 4096   archivo regular vacío
Device: 804h/2052d	Inode: 73793       Links: 1
Access: (0644/-rw-r--r--)  Uid: ( 1000/    alex)   Gid: ( 1000/    alex)
Access: 2011-04-27 18:58:53.124142406 +0200
Modify: 2011-04-27 18:58:53.124142406 +0200
Change: 2011-04-27 18:58:53.124142406 +0200

$ stat enlace-a-test 
  File: «enlace-a-test» -> «test»
  Size: 4         	Blocks: 0          IO Block: 4096   vínculo simbólico
Device: 804h/2052d	Inode: 77212       Links: 1
Access: (0777/lrwxrwxrwx)  Uid: ( 1000/    alex)   Gid: ( 1000/    alex)
Access: 2011-04-27 18:59:07.812139890 +0200
Modify: 2011-04-27 18:59:06.460112888 +0200
Change: 2011-04-27 18:59:06.460112888 +0200

También lo podemos verificar sacando el inodo en el ls (-i):

$ ls -li
77212 lrwxrwxrwx 1 alex alex 4 2011-04-27 18:59 enlace-a-test -> test
73793 -rw-r--r-- 1 alex alex 0 2011-04-27 18:58 test

Hay que tener en cuenta, que en Linux / Unix (al igual que con los accesos directos de Windows), si borramos el fichero o directorio origen, el enlace simbólico permanece pero los datos desaparecen para siempre.
 

Enlaces duros (hard links)

Los enlaces duros lo que hacen es asociar dos o más ficheros compartiendo el mismo inodo. Esto hace que cada enlace duro es una copia exacta del resto de ficheros asociados, tanto de datos como de permisos, propietario, etc. Esto implica también que cuando se realicen cambios en uno de los enlaces o en el fichero este también se realizará en el resto de enlaces.

Los enlaces duros no pueden hacerse contra directorios y tampoco fuera del propio sistema de ficheros.

Vamos a crear un hard link contra el fichero “test” de antes y veremos que efectivamente comparten inodo y que los datos se sincronizan entre ambos:

$ ln test enlace-duro-test
$ ls -li
73793 -rw-r--r-- 2 alex alex 5 2011-04-27 19:09 enlace-duro-test
73793 -rw-r--r-- 2 alex alex 5 2011-04-27 19:09 test

En la primera columna verificamos que tienen el mismo número de inodo y en la tercera se especifica cuando enlaces duros tiene el fichero. Si hacéis cambios en uno de ellos veréis que también se hacen en el resto. Si por ejemplo cambiamos los permisos al fichero test:

$ chmod 0755 test
$ ls -li
73793 -rwxr-xr-x 2 alex alex 5 2011-04-27 19:09 enlace-duro-test
73793 -rwxr-xr-x 2 alex alex 5 2011-04-27 19:09 test

Y finalmente el stat de cada uno verifica todo lo que comentamos:

$ stat test 
  File: «test»
  Size: 5         	Blocks: 8          IO Block: 4096   archivo regular
Device: 804h/2052d	Inode: 73793       Links: 2
Access: (0755/-rwxr-xr-x)  Uid: ( 1000/    alex)   Gid: ( 1000/    alex)
Access: 2011-04-27 19:09:51.528132995 +0200
Modify: 2011-04-27 19:09:53.640114896 +0200
Change: 2011-04-27 19:11:42.516138726 +0200

$ stat enlace-duro-test 
  File: «enlace-duro-test»
  Size: 5         	Blocks: 8          IO Block: 4096   archivo regular
Device: 804h/2052d	Inode: 73793       Links: 2
Access: (0755/-rwxr-xr-x)  Uid: ( 1000/    alex)   Gid: ( 1000/    alex)
Access: 2011-04-27 19:09:51.528132995 +0200
Modify: 2011-04-27 19:09:53.640114896 +0200
Change: 2011-04-27 19:11:42.516138726 +0200

 

Diferencias entre soft y hard links

  • Los enlaces simbólicos se pueden hacer con ficheros y directorios mientras que los duros solo entre ficheros.
  • Los enlaces simbólicos se pueden hacer entre distintos sistemas de ficheros, los duros no.
  • Los enlaces duros comparten el número de inodo, los simbólicos no.
  • En los enlaces simbólicos si se borra el fichero o directorio original, la información se pierde, en los duros no.
  • Los enlaces duros son copias exactas del fichero mientras que los simbólicos son meros punteros o “accesos directos”.

Si se os ocurre alguna diferencia o apunte más no dudéis en comentarlo.

18 comentarios en “Diferencias entre soft (symbolic) y hard links

  1. Me has salvado la vida, tengo examen de Sistemas Operativos y una gran duda que tenia era el tema de los hardlinks y los softlinks.

    Muchas gracias!!!!

  2. Añadir también que el tamaño del symbolic link es el correspondiente al que se necesite para almacenar la ruta del directorio/fichero al que “apunta”.
    Excelente artículo!!!

  3. Me eh metido, a mi edad (casi 37 años ya) a estudiar algo de todo ésto, no por necesidad, si no por placer… Estoy mirándome LPIC-1, y la verdad, resulta apasionate.
    Mi enhorabuena por los artículos que publicas: cuando tengo dudas en algo lo consulto en san google, y cuando los resultados arrojan rm -rf no dudo en caerme por aquí a echar un vistazo.
    No es el primer artículo que me saca de dudas: explicas las cosas fabulosamente bien, de manera muy clara y concisa.
    Saludos y gracias.

  4. > Los enlaces duros son copias exactas del fichero

    Yo no diría “copias”, ya que si cambias uno, cambia el otro. Yo diría “Un enlace duro es otro nombre para un fichero”.

    • una copia de seguridad dinámica. ya se una estática no varía cuando la original varía. Y sigue siendo “copia de seguridad” útil xk si se va una, queda la otra.

  5. Me uno a las enhorabuenas. No es fácil transmitir la información de manera sencilla y clara. Un artículo brillante.
    Sigue así !

  6. La estructura de un fichero en un sistema de ficheros tipo unix/linux (ext2, ext3,…) de forma muy simplificada es:
    – un inodo (descriptor del fichero, que incluye los apuntadores a los datos)
    – un conjunto de bloques de datos que almacenan el contenido del fichero, apuntados desde el inodo
    – al menos un nombre de fichero (hardlink) almacenado como una entrada de directorio (una entrada de la lista que sale al hacer ls) y que apunta al inodo.
    Cuando se crea otro hardlink ($> ln destino nombre_del_link) lo que se está haciendo es crear otro nombre (nombre_del_link), en el directorio correspondiente, apuntando al mismo inodo que apunta el nombre “destino”. Es decir, se está creando un nombre nuevo para un fichero que ya existia: son dos nombres que apuntan al mismo inodo físico y, por ende, a los mismos datos físicos (es decir, dos nombres asociados al mismo fichero, al mismo contenido). Por tanto, un hardlink no es una copia de un fichero ni es una copia de seguridad (ni estática ni dinámica) de un fichero.
    Como mucho un segundo nombre para un fichero os puede prevenir de borrar accidentalmente su contenido. Al borrar un fichero (lo que realmente se borra es el nombre, la entrada de directorio) se decrementa en el inodo correspondiente el contador de nombres (hardlinks); si despues de decrementar el resultado es 0 en ese contador, entonces se elimina además el inodo y se liberan los bloques de datos.

    Sí que existen los hardlinks entre directorios, pero solo los puede crear el propio sistema de ficheros para su gestión interna (y en algun caso excepcional tambien lo puede hacer el superusuario). Por ejemplo: el directorio “..” (dentro de cualquier directorio) es un hardlink al directorio padre del directorio en que cual estamos trabajando, y que nos permite la gestión de rutas relativas para navegar por el espacio de nombres del sistema de ficheros.

  7. Buenas,
    Tengo un servidor en el cual exíste un enlace duro entre directorios y diferentes sistemas de ficheros en diferentes dispositivos. Hay algo que se me escapa?

    # stat /var/lib/mysql/
    File: «/var/lib/mysql/»
    Size: 12288 Blocks: 24 IO Block: 4096 directorio
    Device: fd04h/64772d Inode: 1048705 Links: 157
    Access: (0751/drwxr-x–x) Uid: ( ***/ mysql) Gid: ( ***/ mysql)
    Access: 2015-03-12 00:30:02.006999987 +0100
    Modify: 2016-06-06 23:46:18.696394222 +0200
    Change: 2016-06-06 23:46:18.696394222 +0200

    # stat /usr/share/cagefs-skeleton/var/lib/mysql
    File: «/usr/share/cagefs-skeleton/var/lib/mysql»
    Size: 12288 Blocks: 24 IO Block: 4096 directorio
    Device: fd04h/64772d Inode: 1048705 Links: 157
    Access: (0751/drwxr-x–x) Uid: ( ***/ mysql) Gid: ( ***/ mysql)
    Access: 2015-03-12 00:30:02.006999987 +0100
    Modify: 2016-06-06 23:46:18.696394222 +0200
    Change: 2016-06-06 23:46:18.696394222 +0200

    Gracias!

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *