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).
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.
Muy buen artículo, enhorabuena compañero
Exelente artículo, muchas gracias.
Muy útil la información!
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!!!!
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!!!
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.
Gracias y suerte con el LPIC-1!
> 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».
Entonces, podría decirse que un hardlink es una «copia de seguridad» ? O estoy diciendo una barbaridad?
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.
¡Gracias por la info! Bastante útil :D
Muchas gracias.
Muy bien explicado: sencillo pero contundente.
Enhorabuena!
Es posible crear un enlace simbòlico desde una carpeta que ya existe (suponiendo que estè vacia), apuntando a otra carpeta?
La mejor que he encontrado por la web.
Mil gracias friend
el último punto lo explica todo en una línea.
Saludos.
Me uno a las enhorabuenas. No es fácil transmitir la información de manera sencilla y clara. Un artículo brillante.
Sigue así !
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.
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!