Pregunta

Recientemente me preguntaron esto durante una entrevista de trabajo. Fui honesto y dije que sabía cómo se comporta un enlace simbólico y cómo crear uno, pero no entiendo el uso de un enlace duro y cómo difiere de uno simbólico.

¿Fue útil?

Solución

Debajo del sistema de archivos, los archivos están representados por inodes (o no es seguro con múltiples inodes)

Un archivo en el sistema de archivos es básicamente un enlace a un inodo.
Un enlace duro simplemente crea otro archivo con un enlace al mismo inodo subyacente.

Cuando elimina un archivo, elimina un enlace al inodo subyacente. El inodo solo se elimina (o se puede eliminar / sobrescribir) 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 hecho un enlace duro, el enlace es al inodo. eliminar el cambio de nombre o mover el archivo original no afectará el enlace duro 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 duros 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.

Otros consejos

Alguna intuición agradable que podría ayudar, usando cualquier consola Linux (ish).

Cree dos archivos:

$ touch foo; touch bar

Ingrese algunos datos en ellos:

$ echo "Cat" > foo
$ echo "Dog" > bar

(En realidad, podría haber usado echo en primer lugar, ya que crea los archivos si no existen ... pero no importa eso).

Y como se esperaba:

$cat foo; cat bar
Cat
Dog

Creemos enlaces duros y blandos:

$ ln foo foo-hard
$ ln -s bar bar-soft

Veamos qué acaba de pasar:

$ ls -l

foo
foo-hard
bar
bar-soft -> bar

Cambiar el nombre de foo no importa:

$ mv foo foo-new
$ cat foo-hard
Cat

puntos foo-hard al inodo, el contenido, del archivo, eso no se cambió.

$ 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 fue cambiado, y no al contenido.

Del mismo modo, si se elimina foo , foo-hard aún conserva el contenido; si se elimina bar , bar-soft es solo un enlace a un archivo no existente.

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.txt en el sistema de archivos que apunta a un nuevo inodo (que contiene los metadatos para el archivo y apunta a los bloques de datos que contienen su contenido, es decir el texto "Hola, mundo":

    $ echo 'Hello, World!' > myfile.txt
    
  2. Crear un enlace duro my-hard-link al archivo myfile.txt , lo que significa "crear un archivo que debe apuntar al mismo inodo que myfile.txt apunta a " ;:

    $ ln myfile.txt my-hard-link
    
  3. Crear un enlace suave my-soft-link al archivo myfile.txt , lo que significa " crear un archivo que debe apuntar al archivo < code> myfile.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 apunta a nada. Otras respuestas discuten los pros / contras de cada uno.

Los enlaces duros son útiles cuando se mueve el archivo original. Por ejemplo, mover un archivo de / bin a / usr / bin o / usr / local / bin. Cualquier enlace simbólico al archivo en / bin se rompería por esto, pero un enlace duro, que es un enlace directo al inodo para el archivo, no importaría.

Los enlaces duros pueden ocupar menos espacio en el disco, ya que solo ocupan una entrada de directorio, mientras que un enlace simbólico necesita su propio inodo para almacenar el nombre al que apunta.

Los enlaces duros también tardan menos tiempo en resolverse: los enlaces simbólicos pueden apuntar a otros enlaces simbólicos que están en directorios enlazados. Y algunos de estos podrían estar en NFS u otros sistemas de archivos de alta latencia, y por lo tanto podría dar lugar a la resolución del tráfico de red. Los enlaces duros, que siempre están en el mismo sistema de archivos, siempre se resuelven en una sola búsqueda y nunca implican latencia de red (si se trata de un enlace duro en un sistema de archivos NFS, el servidor NFS haría la resolución, y sería invisible para El sistema del cliente). A veces esto es importante. No es para mí, pero puedo imaginar sistemas de alto rendimiento donde esto podría ser importante.

También creo que cosas como mmap (2) e incluso open (2) usan la misma funcionalidad que los enlaces duros para mantener activo el inodo de un archivo, de modo que incluso si el archivo se desvincula (2) ed, el inodo permanece para permitir el proceso acceso continuo, y solo una vez que el proceso se cierra, el archivo realmente desaparece. Esto permite archivos temporales mucho más seguros (si puede hacer que la apertura y desvinculación sucedan atómicamente, lo que puede haber una API POSIX para la que no recuerdo, entonces realmente tiene un archivo temporal seguro) donde puede leer / escribir sus datos sin que nadie pueda acceder a ellos. Bueno, eso era cierto antes de que / proc les diera a todos la posibilidad de ver los descriptores de sus archivos, pero esa es otra historia.

Hablando de eso, la recuperación de un archivo que está abierto en el proceso A, pero que no está vinculado 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 cierra o desaparece.

Una forma simple de ver la diferencia entre un enlace duro y un enlace simbólico es a través de un ejemplo simple. Un enlace fijo a un archivo apuntará al lugar donde está almacenado el archivo, o al inodo de ese archivo. Un enlace simbólico apuntará al archivo real en sí.

Entonces, si tenemos un archivo llamado " a " y crear un enlace duro '' b '' y un enlace simbólico '' c '' todos los cuales se refieren al archivo " a " :

echo "111" > a
ln a b
ln -s a c

La salida de " a " ;, " b " ;, y " c " será:

cat a --> 111
cat b --> 111
cat c --> 111

Ahora eliminemos el archivo " a " y vea qué sucede con la salida de " a " ;, " b " ;, y " c " ;:

rm a
cat a --> No such file or directory
cat b --> 111
cat c --> No such file or directory

Entonces, ¿qué pasó?

Porque el archivo " c " señala al archivo " a " en sí, si el archivo " a " se elimina y luego el archivo "c" no tendrá nada que señalar, de hecho, también se elimina.

Sin embargo, el archivo " b " señala el lugar de almacenamiento, o el inodo, del archivo " a " ;. Entonces, si el archivo " a " se elimina, entonces ya no apuntará al inodo, sino porque el archivo '' b '' lo hace, el inodo continuará almacenando cualquier contenido perteneciente a " a " hasta que ya no haya más enlaces duros que lo apunten.

Enlace suave :

suave o simbólico es más un atajo al archivo original ... si elimina el original, el acceso directo falla y si solo borra el atajo no pasa nada al original.

Sintaxis de enlace suave : ln -s Pathof_Target_file link

Salida: enlace - > ./Target_file

Prueba: readlink link También en la salida ls -l link verá la primera letra en lrwxrwxrwx como l , lo que indica que el archivo es un enlace suave.

Eliminar el enlace: desvincular enlace

Nota: si lo desea, su softlink puede funcionar incluso después de moverlo a otro lugar desde el directorio actual. Asegúrese de dar una ruta absoluta y no relativa al crear un enlace suave. es decir (a partir de / root / user / Target_file y no ./Target_file)

Enlace duro:

El enlace duro es más una copia espejo o múltiples rutas al mismo archivo. Haga algo en el archivo 1 y aparecerá en el archivo 2. Eliminar uno todavía mantiene el otro bien.

El inodo (o archivo) solo se elimina cuando se han eliminado todos los enlaces (duros) o todas las rutas al inodo (mismo archivo).

Una vez que se ha creado un enlace duro, el enlace tiene el inodo del archivo original. Eliminar el cambio de nombre o mover el archivo original no afectará el enlace duro 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.

Sintaxis de enlace duro : en el enlace Target_file

Salida: Se creará un archivo con un enlace de nombre con el mismo número de inodo que Targetfile.

Prueba: ls -i link Target_file (verifique sus inodes)

Eliminar el enlace: rm -f link (Eliminar el enlace como un archivo normal)

Nota : los enlaces simbólicos pueden abarcar sistemas de archivos, ya que son simplemente el nombre de otro archivo. Mientras que los enlaces duros solo son válidos dentro del mismo sistema de archivos.

Los enlaces simbólicos tienen algunas características. Faltan enlaces duros:

  • Punto de enlace duro al contenido del archivo. mientras que el enlace suave apunta a nombre de archivo.
  • mientras que el tamaño del enlace duro es el tamaño del contenido mientras que el enlace suave es teniendo el tamaño del nombre del archivo.
  • Los enlaces duros comparten el mismo inodo. Los enlaces blandos no lo hacen.
  • Los enlaces duros no pueden cruzar sistemas de archivos. Los enlaces blandos sí.
  • sabes de inmediato dónde apunta un enlace simbólico mientras que con enlaces, necesita explorar todo el sistema de archivos para encontrar archivos compartiendo el mismo inodo.

    # find / -inum 517333

    /home/bobbin/sync.sh
    /root/synchro
    
  • los enlaces duros no pueden apuntar a directorios.

Los enlaces duros tienen dos limitaciones:

  • Los directorios no pueden estar vinculados. Linux no permite que esto mantenga la estructura de árbol acíclica de los directorios.
  • No se puede crear un enlace duro en los sistemas de archivos. Ambos archivos deben estar en los mismos sistemas de archivos, porque los diferentes sistemas de archivos tienen diferentes tablas de inodo independientes (dos archivos en diferentes sistemas de archivos, pero con el mismo número de inodo serán diferentes).

Enlaces simbólicos enlazan a un nombre de ruta. Esto puede estar en cualquier parte del árbol de archivos de un sistema, y ??ni siquiera tiene que existir cuando se crea el enlace. La ruta de destino puede ser relativa o absoluta.

Los enlaces duros son punteros adicionales a un inodo, lo que significa que solo pueden existir en el mismo volumen que el objetivo. Los enlaces duros adicionales a un archivo no se pueden distinguir del " original " nombre utilizado para hacer referencia a un archivo.

Te diría a Wikipedia:

Algunos puntos:

  • Los enlaces simbólicos, a diferencia de los enlaces duros, pueden cruzar sistemas de archivos (la mayoría de las veces).
  • Los enlaces simbólicos pueden apuntar a directorios.
  • Los enlaces duros apuntan a un archivo y le permiten hacer referencia al mismo archivo con más de un nombre.
  • Mientras haya al menos un enlace, los datos seguirán disponibles.

Los enlaces duros son muy útiles cuando se realizan copias de seguridad incrementales. Consulte rsnapshot , por ejemplo. La idea es hacer una copia usando enlaces duros:

  • copia el número de copia de seguridad n a n + 1
  • copia de seguridad n - 1 a n
  • ...
  • copiar la copia de seguridad 0 a la copia de seguridad 1
  • actualice la copia de seguridad 0 con cualquier archivo modificado.

La nueva copia de seguridad no ocupará espacio adicional aparte de los cambios que haya realizado, ya que todas las copias de seguridad incrementales apuntarán al mismo conjunto de inodos para los archivos que no han cambiado.

Añado a la pregunta de Nick: ¿cuándo son útiles o necesarios los enlaces duros ? La única aplicación que me viene a la mente, en la que los enlaces simbólicos no harían el trabajo, es proporcionar una copia de un archivo del sistema en un entorno chrooteado.

 Enlace duro vs Enlace suave

Enlace duro Vs Enlace suave se puede explicar fácilmente por esta imagen.

También:

  1. El rendimiento de lectura de los enlaces duros es mejor que los enlaces simbólicos (micro-rendimiento)
  2. Los enlaces simbólicos se pueden copiar, controlar por versión, etc. En otras palabras, son un archivo real. En el otro extremo, un enlace duro es algo en un nivel ligeramente inferior y encontrará que, en comparación con los enlaces simbólicos, hay menos herramientas que proporcionan medios para trabajar con los enlaces duros como enlaces duros y no como archivos normales

Lo que piensas como un "archivo" ordinario en realidad son dos cosas separadas: los datos de un archivo y una entrada de directorio. Cuando crea un enlace duro para un archivo, en realidad crea una segunda entrada de directorio que se refiere a los mismos datos. Ambas entradas de directorio tienen exactamente la misma funcionalidad; cada uno se puede usar para abrir el archivo para leerlo. Por lo tanto, realmente no tiene "un archivo más un enlace duro", tiene "datos de archivo con dos entradas de directorio". Lo que usted considera como eliminar un archivo en realidad elimina una entrada de directorio, y cuando se elimina la última entrada de directorio para los datos, también se eliminan los datos en sí. Para los archivos normales que solo tienen una entrada de directorio, la eliminación de la entrada del directorio eliminará los datos como siempre. (Mientras se abre un archivo, el sistema operativo crea un enlace temporal al archivo, por lo que incluso cuando elimina todas las entradas del directorio, los datos permanecen pero desaparecen tan pronto como cierra el archivo).

Como ejemplo, cree un archivo A.txt, un enlace rígido B.txt y elimine A.txt. Cuando creó A.txt, se crearon algunos datos y una entrada de directorio A.txt. Cuando creó el enlace físico, se creó otra entrada de directorio B.txt, apuntando a los mismos datos exactos. Cuando elimina A.txt, todavía tiene todos los datos y una sola entrada de directorio B.txt, exactamente como si hubiera creado un archivo B.txt en primer lugar.

Un enlace suave es solo un archivo (casi) ordinario, excepto que no contiene datos, sino la ruta de otra entrada de directorio. Si elimina el archivo al que se refiere el enlace flexible, entonces el enlace flexible contendrá una ruta que ya no apuntará a una entrada de directorio; está roto. Si elimina el enlace suave, es como eliminar cualquier otro archivo, el archivo al que apunta no se ve afectado.

De MSDN ,

Enlace simbólico

  

Un enlace simbólico es un objeto del sistema de archivos que apunta a otro objeto del sistema de archivos. El objeto al que se apunta se llama objetivo.

     

Los enlaces simbólicos son transparentes para los usuarios; los enlaces aparecen normalmente   archivos o directorios, y el usuario o la aplicación pueden actuar sobre ellos   exactamente de la misma manera.

     

Los enlaces simbólicos están diseñados para ayudar en la migración y la aplicación   compatibilidad con sistemas operativos UNIX. Microsoft ha implementado   sus enlaces simbólicos para funcionar como enlaces UNIX.

     

Los enlaces simbólicos pueden ser enlaces absolutos o relativos. Absoluto   los enlaces son enlaces que especifican cada parte del nombre de la ruta; relativo   los enlaces se determinan en relación a dónde se encuentran los especificadores de enlaces relativos   una ruta especificada

Un ejemplo de enlace simbólico absoluto

X: "C:\alpha\beta\absLink\gamma\file"
Link: "absLink" maps to "\\machineB\share"
Modified Path: "\\machineB\share\gamma\file"

Un ejemplo de enlaces simbólicos relativos

X: C:\alpha\beta\link\gamma\file
Link: "link" maps to "..\..\theta"
Modified Path: "C:\alpha\beta\..\..\theta\gamma\file"
Final Path: "C:\theta\gamma\file"

Enlace duro

  

Un enlace duro es la representación del sistema de archivos de un archivo mediante el cual   más de una ruta hace referencia a un solo archivo en el mismo volumen .

Para crear un enlace duro en Windows, navegue hasta donde se creará el enlace e ingrese este comando:

mklink /H Link_name target_path

Tenga en cuenta que puede eliminar los enlaces duros en cualquier orden, independientemente del orden en que se crearon. Además, los enlaces duros no se pueden crear cuando

  • las referencias están en diferentes unidades locales
  • referencias incluyen unidad de red. En otras palabras, una de las referencias es una unidad de red
  • el enlace duro que se creará está en la misma ruta que el objetivo

Junction

NTFS admite otro tipo de enlace llamado unión. MSDN lo define de la siguiente manera:

  

Una unión (también llamada enlace suave) difiere de un enlace duro en que los objetos de almacenamiento a los que hace referencia son directorios separados, y una unión puede enlazar directorios ubicados en volúmenes locales diferentes en la misma computadora . De lo contrario, las uniones operan de manera idéntica a los enlaces duros.

Las partes en negrita en la sección de enlace duro y la sección de unión muestran la diferencia básica entre las dos.

Comando para crear un cruce en Windows, navegue hasta donde se creará el enlace y luego ingrese:

mklink /J link_name target_path

Simplemente, Enlace duro: es solo agregar un nuevo nombre a un archivo, es decir, un archivo puede tener muchos nombres al mismo tiempo, todos los nombres son iguales entre sí, nadie prefiere, el enlace duro no es malo para copiar todo el contenido del archivo y crear un nuevo archivo no es eso, solo crea un nombre alternativo para ser conocido ...

Enlace simbólico (enlace simbólico): es un puntero de archivo a otro archivo, si el enlace simbólico apunta a un archivo existente que luego se elimina, el enlace simbólico continúa apuntando al mismo nombre de archivo aunque el nombre ya no nombre archivo.

Una entrada de directorio es vincular una estructura:

struct dentry{
    ino_t ino;
    char  name[256];
}

el ino es el número de inodo, el nombre es el nombre del archivo, la estructura del inodo puede ser como & # 65306;

struct inode{
      link_t nlink; 
      ...
}

por ejemplo, crea un archivo / 1, la entrada del directorio puede ser como:

struct dentry{
     ino_t ino; /* such as 15 */
     char  name[256]; /* "1" */
} 

la estructura del inodo puede ser como:

   struct inode{ /* inode number 15 */
         link_t nlink; /* nlink = 1 */
         ...
    }

luego crea un enlace duro (puede ser / 100), la entrada del directorio puede ser como:

  struct dentry{
     ino_t ino; /* 15 */
     char  name[256]; /* 100 */
  }

la estructura del inodo puede ser como:

   struct inode{ /* inode numebr 15 */
         link_t nlink; /* nlink = 2 */
         ...
    }

luego crea un enlace simbólico (puede ser / 200) al archivo 1, la entrada del directorio puede ser así:

  struct dentry{
        ino_t ino; /* such as 16 */
        char  name[256]; /* "200" */
  }

la estructura del inodo puede ser como:

   struct inode{ /* inode number 15 */ 
         link_t nlink; /* nlink = 2 */
         ...
    }

   struct inode{ /* inode number 16 */
         link_t nlink; /* nlink = 1 */
         ...
    } /* the data of inode 16 maybe /1 or 1 */

Agregando a todas las respuestas anteriores, la diferencia en encontrar el archivo de enlace duro y softlink se puede entender de la siguiente manera:

Tengo un archivo f6 en mi directorio actual, así como un directorio llamado t2 .

El archivo llamado f1 y ./t2/f2 son enlaces simbólicos a f6 .

El archivo llamado f7 y ./t2/f8 son enlaces duros de f6 .

Para encontrar enlaces suaves y duros podemos usar:

$ find -L . -samefile f6 

> ./f1
> ./f6
> ./f7
> ./t2/f2
> ./t2/f8

Para encontrar solo el enlace duro podemos usar:

$ find . -xdev -samefile f6

> ./f6
> ./f7
> ./t2/f8

Dado que los enlaces duros se pueden crear en el mismo sistema de archivos, podemos buscar todos los enlaces duros sin la opción -L utilizada (con la opción -xdev ) en el mismo archivo- sistema / punto de montaje. Guarda la búsqueda innecesaria en diferentes puntos de montaje.

Por lo tanto, buscar en el enlace duro es algo más rápido que buscar en los enlaces suaves (rectifique si estoy equivocado o no claro).

Los enlaces simbólicos dan otro nombre a un archivo, de manera similar a los enlaces duros. Pero un archivo se puede eliminar incluso si quedan enlaces simbólicos restantes.

Acabo de encontrar una manera fácil de entender los enlaces duros en un escenario común, la instalación de software.

Un día descargué un software en la carpeta Descargas para instalarlo. Después de que hice sudo make install , algunos ejecutables fueron cp editados a la carpeta bin local. Aquí, cp crea enlace duro . Estaba contento con el software, pero pronto me di cuenta de que Downloads no es un buen lugar a largo plazo. Así que mv edité la carpeta del software al directorio source . Bueno, todavía puedo ejecutar el software como antes sin preocuparme por ningún enlace de destino, como en Windows. Esto significa que enlace duro encuentra el inodo directamente y otros archivos.

EN esta respuesta cuando digo un archivo me refiero a la ubicación en la memoria

Todos los datos que se guardan se almacenan en la memoria utilizando una estructura de datos llamada inodes. Cada inodo tiene un número de número. El número de inodo se utiliza para acceder al inodo. Todos los enlaces duros a un archivo pueden tener diferentes nombres pero compartir el mismo número de inodo. Dado que todos los enlaces duros tienen el mismo número de entrada (que tienen acceso al mismo inodo), todos apuntan a la misma memoria física.

Un enlace simbólico es un tipo especial de archivo. Dado que también es un archivo, tendrá un nombre de archivo y un número de inodo. Como se dijo anteriormente, el número de inodo accede a un inodo que apunta a datos. Ahora, lo que hace un enlace simbólico especial es que los inodenumbers en enlaces simbólicos acceden a esos inodes que apuntan a "un camino" a otro archivo. Más específicamente, el número de inodo en el enlace simbólico accede a esos inodes que apuntan a otro enlace duro.

cuando nos estamos moviendo, copiando, eliminando un archivo en la GUI, estamos jugando con los enlaces duros del archivo, no con la memoria física. Cuando eliminamos un archivo, estamos eliminando el enlace duro del archivo. no estamos borrando la memoria física. Si se eliminan todos los enlaces duros al archivo, entonces no será posible acceder a los datos almacenados, aunque todavía pueden estar presentes en la memoria

Mis dos centavos en uso:

Los enlaces

Soft pueden usarse para acortar nombres de rutas largas, es decir:

ln -s /long/folder/name/on/long/path/file.txt /short/file.txt

Los cambios realizados en /short/file.txt se aplicarán en el archivo original.

Los enlaces

Hard se pueden usar para mover archivos grandes:

$ ls -lh /myapp/dev/
total 10G
-rw-r--r-- 2 root root 10G May 22 12:09 application.bin

ln /myapp/dev/application.bin /myapp/prd/application.bin

Copia instantánea a una carpeta diferente, y el archivo original (en / myapp / dev ) puede moverse o eliminarse, sin tocar el archivo en / myapp / prd

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top