¿Cuál es la diferencia entre un enlace simbólico y un enlace físico?

Resuelto Nick Stinemates asked hace 16 años • 23 respuestas

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.

Nick Stinemates avatar Oct 09 '08 11:10 Nick Stinemates
Aceptado

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.

Martin York avatar Oct 09 '2008 04:10 Martin York

Como dice el refrán, una imagen vale más que mil palabras. Así es como lo visualizo:

ingrese la descripción de la imagen aquí

Así es como llegamos a esa imagen:

  1. Cree un nombre myfile.txten 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
    
  2. Cree un enlace físico my-hard-linkal archivo myfile.txt, lo que significa "crear un archivo que debería apuntar al mismo inodo que myfile.txtapunta a":

    $ ln myfile.txt my-hard-link
    
  3. Cree un enlace suave my-soft-linkal archivo myfile.txt, que significa "crear un archivo que debería apuntar al archivo myfile.txt":

    $ ln -s myfile.txt my-soft-link
    

Mire lo que sucederá ahora si myfile.txtse elimina (o mueve): my-hard-linktodavía apunta al mismo contenido y, por lo tanto, no se ve afectado, mientras que my-soft-linkahora no apunta a nada. Otras respuestas analizan los pros y los contras de cada una.

akivajgordon avatar Apr 22 '2015 01:04 akivajgordon

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
    • 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
  • 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 foose elimina, foo-hardaún conserva el contenido; si barse elimina, bar-softes sólo un enlace a un archivo no existente.

Adam Matan avatar Oct 07 '2009 13:10 Adam Matan

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.

Tanktalus avatar Oct 09 '2008 05:10 Tanktalus