¿Cuál es la diferencia entre un enlace simbólico y un enlace físico?
Hace poco me preguntaron esto durante una entrevista de trabajo. Fui honesto y dije que sabía cómo se comporta un vínculo simbólico y cómo crear uno, pero no entiendo el uso de un vínculo físico y en qué se diferencia de uno simbólico.
Debajo del sistema de archivos, los archivos están representados por inodos. (¿O son múltiples inodos? No estoy seguro).
Un archivo en el sistema de archivos es básicamente un enlace a un inodo.
Entonces, un enlace físico simplemente crea otro archivo con un enlace al mismo inodo subyacente.
Cuando elimina un archivo, elimina un enlace al inodo subyacente. El inodo sólo se elimina (o se puede eliminar/sobreescribir) cuando se han eliminado todos los enlaces al inodo.
Un enlace simbólico es un enlace a otro nombre en el sistema de archivos.
Una vez que se ha realizado un enlace físico, el enlace es al inodo. Eliminar, cambiar el nombre o mover el archivo original no afectará el enlace físico, ya que se vincula al inodo subyacente. Cualquier cambio en los datos del inodo se refleja en todos los archivos que hacen referencia a ese inodo.
Nota: Los enlaces físicos solo son válidos dentro del mismo sistema de archivos. Los enlaces simbólicos pueden abarcar sistemas de archivos, ya que son simplemente el nombre de otro archivo.
Como dice el refrán, una imagen vale más que mil palabras. Así es como lo visualizo:
Así es como llegamos a esa imagen:
Cree un nombre
myfile.txt
en el sistema de archivos que apunte a un nuevo inodo (que contiene los metadatos del archivo y apunta a los bloques de datos que contienen su contenido, es decir, el texto "¡Hola, mundo!":$ echo 'Hello, World!' > myfile.txt
Cree un enlace físico
my-hard-link
al archivomyfile.txt
, lo que significa "crear un archivo que debería apuntar al mismo inodo quemyfile.txt
apunta a":$ ln myfile.txt my-hard-link
Cree un enlace suave
my-soft-link
al archivomyfile.txt
, que significa "crear un archivo que debería apuntar al archivomyfile.txt
":$ ln -s myfile.txt my-soft-link
Mire lo que sucederá ahora si myfile.txt
se elimina (o mueve): my-hard-link
todavía apunta al mismo contenido y, por lo tanto, no se ve afectado, mientras que my-soft-link
ahora no apunta a nada. Otras respuestas analizan los pros y los contras de cada una.
Algunos ejemplos que podrían ayudar.
Cree dos archivos con datos en ellos:
$ printf Cat > foo
$ printf Dog > bar
Cree un enlace duro y blando (también conocido como simbólico):
$ ln foo foo-hard
$ ln -s bar bar-soft
Enumere el contenido del directorio en formato largo aumentando el tamaño:
ls -lrS
lrwxr-xr-x 1 user staff 3 3 Apr 15:25 bar-soft -> bar
-rw-r--r-- 2 user staff 4 3 Apr 15:25 foo-hard
-rw-r--r-- 2 user staff 4 3 Apr 15:25 foo
-rw-r--r-- 1 user staff 4 3 Apr 15:25 bar
Esto nos dice que
Primera columna: el modo de archivo para los enlaces físicos y físicos difiere
- enlace suave:
lrwxr-xr-x
- tipo de archivo:
l
= enlace simbólico - permisos del propietario:
rwx
= legible, escribible, ejecutable - permisos de grupo:
r-x
= legible, no escribible, ejecutable - otros permisos:
r-x
= legible, no escribible, ejecutable
- tipo de archivo:
- enlace duro:
-rw-r--r--
- tipo de archivo:
-
= archivo normal - permisos del propietario:
rw-
= legible, escribible, no ejecutable - permisos de grupo:
r--
= legible, no escribible, no ejecutable - otros permisos:
r--
= legible, no escribible, no ejecutable
- tipo de archivo:
- enlace suave:
2da columna: el número de enlaces es mayor para los archivos con enlaces físicos
Quinta columna: el tamaño del enlace suave es más pequeño, porque es una referencia y no una copia.
última columna: el enlace simbólico muestra el archivo vinculado a través de
->
Cambiar el nombre del archivo de foo no afecta a foo-hard:
$ mv foo foo-new
$ cat foo-hard
Cat
Cambiar el contenido de foo se refleja en foo-hard:
$ printf Dog >> foo
$ cat foo-hard
CatDog
Los enlaces duros como foo-hard apuntan al inodo, el contenido, del archivo.
Este no es el caso de enlaces blandos como bar-soft:
$ mv bar bar-new
$ ls bar-soft
bar-soft
$ cat bar-soft
cat: bar-soft: No such file or directory
No se pudo encontrar el contenido del archivo porque el enlace suave apunta al nombre que se cambió y no al contenido.
Asimismo, si foo
se elimina, foo-hard
aún conserva el contenido; si bar
se elimina, bar-soft
es sólo un enlace a un archivo no existente.
Los enlaces duros son útiles cuando el archivo original se mueve. Por ejemplo, mover un archivo de /bin a /usr/bin o a /usr/local/bin. Esto rompería cualquier enlace simbólico al archivo en /bin, pero a un enlace físico, que es un enlace directo al inodo del archivo, no le importaría.
Los enlaces duros pueden ocupar menos espacio en disco ya que sólo ocupan una entrada de directorio, mientras que un enlace simbólico necesita su propio inodo para almacenar el nombre al que apunta.
Los enlaces físicos también tardan menos en resolverse: los enlaces simbólicos pueden apuntar a otros enlaces simbólicos que se encuentran en directorios enlazados simbólicamente. Y algunos de estos podrían estar en NFS u otros sistemas de archivos de alta latencia, lo que podría provocar que el tráfico de red se resuelva. Los enlaces físicos, al estar siempre en el mismo sistema de archivos, siempre se resuelven en una sola búsqueda y nunca involucran latencia de red (si es un enlace físico en un sistema de archivos NFS, el servidor NFS haría la resolución y sería invisible para el sistema cliente). A veces esto es importante. Para mí no, pero puedo imaginar sistemas de alto rendimiento en los que esto podría ser importante.
También creo que cosas como mmap(2) e incluso open(2) usan la misma funcionalidad que los enlaces físicos para mantener activo el inodo de un archivo, de modo que incluso si el archivo se desvincula(2), el inodo permanece para permitir el acceso continuo al proceso. y sólo una vez que se cierra el proceso, el archivo realmente desaparece. Esto permite archivos temporales mucho más seguros (si puede abrir y desvincular de forma atómica, para lo cual puede haber una API POSIX que no recuerdo, entonces realmente tiene un archivo temporal seguro) donde puede leer/escribir tus datos sin que nadie pueda acceder a ellos. Bueno, eso era cierto antes de que /proc le diera a todos la posibilidad de ver los descriptores de sus archivos, pero esa es otra historia.
Hablando de eso, recuperar un archivo que está abierto en el proceso A, pero desvinculado en el sistema de archivos gira en torno al uso de enlaces duros para recrear los enlaces de inodo para que el archivo no desaparezca cuando el proceso que lo tiene abierto lo cierre o desaparezca.