¿Cuál es la diferencia entre un enlace duro y un archivo?


37

Un enlace duro se define como un puntero a un inodo. Un enlace suave , también conocido como enlace simbólico , se define como un archivo independiente que apunta a otro enlace sin las restricciones de los enlaces duros.

¿Cuál es la diferencia entre un archivo y un enlace duro? Un enlace duro apunta a un inodo, entonces, ¿qué es un archivo? La entrada de inodo en sí? ¿O un inodo con un enlace duro?

Digamos que creo un archivo con toque. Luego se crea una entrada de inodo en la tabla de inodo . Y creo un enlace duro, que tiene el mismo número de inodo que el archivo. Entonces, ¿creé un nuevo archivo? ¿O el archivo se define como un inodo?


Es casi seguro que es un duplicado de unix.stackexchange.com/questions/9575/…
infijo

77
@infixed Exactamente no, estoy preguntando la diferencia de un archivo y un enlace duro.
Levent Divilioglu

Así que he borrado mi respuesta original que creo que también se cubrió en las respuestas a esa pregunta vinculada. Entonces, ¿sigue siendo "exactamente no"?
fijado

77
La diferencia entre un archivo y un enlace duro es la misma que la diferencia entre usted y la línea con su nombre en la agenda.
Jörg W Mittag

Respuestas:


61

La respuesta muy corta es:

  • un archivo es un blob de datos anónimo
  • un enlace duro es un nombre para un archivo
  • un enlace simbólico es un archivo especial cuyo contenido es un nombre de ruta

Los archivos y directorios Unix funcionan exactamente como los archivos y directorios en el mundo real (y no como las carpetas en el mundo real); Los sistemas de archivos Unix están (conceptualmente) estructurados de esta manera:

  • un archivo es un blob de datos anónimo; no tiene nombre, solo un número (inodo)
  • un directorio es un tipo especial de archivo que contiene una asignación de nombres a archivos (más específicamente inodos); Dado que un directorio es solo un archivo, los directorios pueden tener entradas para directorios, así es como se implementa la recursión (tenga en cuenta que cuando se introdujeron los sistemas de archivos Unix, esto no era del todo obvio, muchos sistemas operativos no permitían que los directorios contuvieran directorios) luego)
  • estas entradas de directorio se denominan enlaces duros
  • un enlace simbólico es otro tipo especial de archivo, cuyo contenido es un nombre de ruta; este nombre de ruta se interpreta como el nombre de otro archivo
  • otros tipos de archivos especiales son: sockets, fifos, dispositivos de bloque, dispositivos de caracteres

Teniendo en cuenta esta metáfora, y específicamente teniendo en cuenta que los directorios de Unix funcionan como directorios del mundo real y no como carpetas del mundo real, explican muchas de las "rarezas" que los recién llegados suelen encontrar, como: ¿por qué puedo eliminar un archivo que no hago? No tiene acceso de escritura? Bueno, por un lado, no está eliminando el archivo, está eliminando uno de los muchos nombres posibles para el archivo, y para hacerlo, solo necesita acceso de escritura al directorio, no al archivo. Como en el mundo real.

O, ¿por qué puedo tener enlaces simbólicos colgantes? Bueno, el enlace simbólico simplemente contiene un nombre de ruta. No hay nada que diga que en realidad tiene que haber un archivo con ese nombre.

Mi pregunta es simplemente cuál es la diferencia de un archivo y un enlace duro.

La diferencia entre un archivo y un enlace duro es la misma que la diferencia entre usted y la línea con su nombre en la guía telefónica.

El enlace duro apunta a un inodo, entonces, ¿qué es un archivo? Inode entrada en sí? ¿O un Inode con un enlace duro?

Un archivo es un dato anónimo. Eso es. Un archivo no es un inodo, un archivo tiene un inodo, al igual que usted no es un Número de Seguro Social, tiene un SSN.

Un enlace duro es un nombre para un archivo. Un archivo puede tener muchos nombres.

Digamos que creo un archivo táctil, luego se crea una entrada de Inode en la Tabla de Inode .

Sí.

Y creo un enlace duro, que tiene el mismo número de Inode con el archivo.

No. Un enlace duro no tiene un número de inodo, ya que no es un archivo. Solo los archivos tienen números de inodo.

El enlace fijo asocia un nombre con un número de inodo.

Entonces, ¿creé un nuevo archivo?

Sí.

¿O el archivo se define como un Inode?

No. El archivo tiene un inodo, no es un inodo.


15
Nunca había entendido realmente (o pensado correctamente) qué metáfora estaba detrás de la palabra "directorio". El ejemplo de la guía telefónica es excelente; quizás deberías presentarlo antes (cuando mencionas por primera vez el mundo real). Del mismo modo, la mayoría de las personas rara vez se ocupan de "archivos" fuera de una computadora, por lo que quizás sería más claro decir "al igual que los archivos en papel y un directorio como una guía telefónica".
IMSoP

2
@IMSoP Es una brecha generacional. Antes de las computadoras, una guía telefónica era uno de los tipos de directorio. Diccionario de Cambridge dice: " directorio: un libro que contiene una lista de nombres, direcciones u otros hechos [... ejemplo] Busque su número en la guía telefónica. "
kubanczyk

2
@kubanczyk De hecho, para las personas que trabajaban en oficinas pre-digitales, creo que las metáforas parecen tan obvias que parece casi condescendiente explicarlas. Pero para aquellos de mi generación y de abajo, es tan oscuro como por qué el área de almacenamiento en la parte trasera de un automóvil se llama "maletero" o "maletero", por lo que realmente debe explicarlo.
IMSoP

La palabra "tener" en la frase "Un enlace duro no tiene un número de inodo" es posiblemente engañosa, porque entonces usted dice que "El enlace duro asocia un nombre con un número de inodo". La estructura de datos de la entrada de directorio "hardlink" en realidad contiene el inodo # - así es como el enlace está "asociado" con el inodo #. Por "no tiene" creo que quiere decir que el enlace duro no tiene un inodo # que indica dónde está almacenado el enlace en el disco.
Kelvin

2
Decir que un archivo tiene un inodo es algo al revés. El inodo es la estructura que contiene la información sobre dónde está el "blob de datos". Si no hay inodo, no hay archivo.
Barmar

18

Un enlace duro es una entrada de directorio. Un archivo puede tener múltiples entradas de directorio, si está presente bajo diferentes nombres o en diferentes directorios. Una entrada de directorio se denomina "enlace duro" cuando se relaciona con otras entradas de directorio para el mismo archivo.

El inodo contiene los metadatos del archivo además de su nombre y contenido (ubicación de los contenidos, permisos, marcas de tiempo, etc.). Hay un inodo por archivo. (No todos los sistemas de archivos colocan los metadatos en un espacio del disco claramente identificable al que podría llamar "inodo", pero es una arquitectura común). Una entrada de directorio vincula un nombre a un inodo. Es posible que más de una entrada de directorio se vincule al mismo inodo, de ahí el término "enlace". Dicho enlace se llama "enlace duro" por oposición a "enlaces blandos" o "enlaces simbólicos" que no dicen "para este nombre, use este inodo" sino "para este nombre, busque ese otro nombre".

Piense en los archivos como habitaciones y entradas de directorio como puertas. "Abrir el archivo /foo/bar" significa "ir al corredor /fooe ir a la habitación bar". "Ir a la habitación bar" realmente significa "abrir la puerta marcada bary entrar en la habitación", pero "ir a la habitación bar" es una manera sencilla de decir lo mismo de una manera más corta. Es posible tener más de una puerta que conduzca a la misma habitación.

Cuando crea un enlace rígido a un archivo existente ( ln existing new), está creando un segundo enlace al mismo archivo, es decir, está creando una nueva entrada de directorio que vincula al archivo ya existente. Después de la creación, las dos entradas de directorio tienen el mismo estado: no hay una que sea "primaria" y una que sea "secundaria", son solo dos enlaces al mismo archivo.

También puede eliminar todos los enlaces a un archivo sin eliminar el archivo en sí. Esto sucede si elimina un archivo (es decir, elimina todas sus entradas de directorio) mientras un programa todavía tiene el archivo abierto. El archivo permanece en el sistema de archivos, solo se elimina cuando el último proceso que tenía abierto el archivo lo cierra. En la metáfora de habitaciones y puertas, una habitación que no tiene puertas todavía ocupa espacio.


¿Cuándo se introdujeron los enlaces duros y blandos, respectivamente?
n611x007

2
@ n611x007: ¿Podría abrir una nueva pregunta si tiene una pregunta nueva o de seguimiento? La sección de comentarios no es adecuada ni está destinada a nuevas preguntas o discusiones extensas. Gracias.
David Foerster

1
@ n611x007 Los enlaces duros son más antiguos que Unix, v1 los tenía . Los enlaces simbólicos en Unix son un poco más nuevos; Wikipedia tiene algo de historia.
Gilles 'SO- deja de ser malvado'

¡Las habitaciones y las puertas son una gran analogía! Los enlaces simbólicos son como signos de las puertas.
curiousdannii

1
@curiousdannii: Los enlaces simbólicos son más como habitaciones con una persona sentada en ellas que dice "oi m8 oficina equivocada ir al # 234 en su lugar"
Lightness corre con Mónica

8

Además de todas las otras respuestas, quiero señalar las siguientes propiedades importantes:

Un softlink es una referencia verdadera, es decir, es un archivo pequeño que contiene un nombre de ruta. La resolución de un enlace suave ocurre de manera transparente para la aplicación: si un proceso abre un archivo, digamos /this/path/herecuál es un enlace simbólico que apunta, /that/other/pathentonces el sistema /that/other/pathoperativo realiza todo el manejo de la apertura . Además, si /that/other/pathresulta ser un enlace simbólico en sí mismo, el SO también se ocupa de esto. De hecho, el sistema operativo sigue la cadena de enlaces simbólicos hasta que encuentra algo más (por ejemplo, un archivo normal) o hasta que alcanza SYMLOOP_MAX(vea sysconf(3)) muchas entradas, en cuyo caso el sistema operativo (más precisamente: la llamada al sistema correspondiente) devuelve un error y establece errnoa ELOOP. Por lo tanto, una referencia circular como xyz -> xyzno detendrá el proceso. (Para sistemas Linux, ver path_resolution(7)detalles completos).

Tenga en cuenta que un proceso puede verificar si un nombre de ruta es un enlace simbólico o no mediante el uso de lstat(2)y puede modificar sus atributos de archivo (almacenados en la tabla de inodo) a través de lchown(2)y otros (consulte symlink(7)la historia completa).

Ahora, en términos de permiso, notará que los enlaces simbólicos siempre tienen permisos 777 ( rwxrwxrwxen notación simbólica). Esto se debe al hecho de que, de todos modos, se pueden omitir otros permisos accediendo al archivo real. Por el contrario, 777 para un enlace simbólico no hace que el archivo con enlace simbólico sea accesible si no estaba accesible en primer lugar. Por ejemplo, un enlace simbólico con permisos 777 que apunta a un archivo con permisos 640 hace que el archivo no sea accesible para "otros" (el público en general). En otras palabras, un archivo xyzes accesible a través de un enlace simbólico si y solo si es directamente accesible, es decir, sin direccionamiento indirecto. Por lo tanto, los permisos del enlace simbólico no tienen ningún efecto de seguridad.

Una de las principales diferencias visibles entre los enlaces duros y los enlaces simbólicos (también conocidos como enlaces blandos) es que los enlaces simbólicos funcionan en todos los sistemas de archivos, mientras que los enlaces duros están confinados a un solo sistema de archivos. Es decir, un archivo en la partición A se puede vincular simbólicamente desde la partición B, pero no se puede vincular desde allí. Esto queda claro por el hecho de que un enlace duro es en realidad una entrada en un directorio, que consiste en un nombre de archivo y un número de inodo, y que los números de inodo son únicos solo por sistema de archivos.

El término enlace duro es en realidad algo engañoso. Mientras que para los enlaces simbólicos, el origen y el destino son claramente distinguibles (el enlace simbólico tiene su propia entrada en la tabla de inodo), esto no es cierto para los enlaces duros. Si crea un enlace duro para un archivo, la entrada original y el enlace duro no se pueden distinguir en términos de lo que estaba allí primero. (Dado que se refieren al mismo inodo, comparten sus atributos de archivo como propietario, permisos, marcas de tiempo, etc.) Esto lleva a la afirmación de que cada entrada de directorio es en realidad un enlace rígido, y que vincular un archivo solo significa crear un segundo ( o tercero, o cuarto ...) enlace duro. De hecho, cada inodo almacena un contador para el número de enlaces duros a ese inodo.

Finalmente, tenga en cuenta que los usuarios comunes pueden no enlazar directorios. Esto se debe a que esto debe hacerse con la mayor precaución: un usuario incauto puede introducir ciclos en el árbol de archivos, por lo demás estrictamente jerárquico, que todas las herramientas habituales (como fsck) y el sistema operativo en sí no están preparados para manejar.


6

Una respuesta simple:

  • Una entrada de archivo en un directorio es un enlace duro a ese archivo.

  • Algunos archivos tienen más de uno de estos enlaces duros, ya que se permiten varios enlaces duros al mismo archivo.


3

En los primeros días de Unix, los archivos internos eran inodos en una unidad de disco particular. Los nombres de los archivos eran una forma más amigable de acceder a ellos.

Un enlace duro estaba asignando más de un nombre de archivo a un inodo. Podrías crear un archivo, vincularlo con un segundo nombre y borrar el primer nombre y no se podía distinguir de haber creado el archivo con el segundo nombre en primer lugar.

De hecho, la llamada al sistema que un programa necesita usar para eliminar un archivo es 'unlink (2)'. Los datos no desaparecen hasta que el apellido se desvincula del inodo. (y el inodo no está abierto por un proceso en alguna parte)

Esto es lo que facilita que Linux actualice las cosas mientras todavía ejecuta programas. Si un proceso ejecuta un ejecutable y se produce una actualización, el nombre del programa se reutiliza, pero el inodo que contiene la versión anterior todavía existe para que pueda continuar ejecutándose. Y cuando se detiene el último proceso que ejecuta esa versión anterior, se libera el almacenamiento de la versión anterior.

Los enlaces blandos surgieron porque cuando tienes un árbol de archivos unitario, con múltiples puntos de montaje, no puedes hacer un enlace duro de un disco duro a un inodo en otro. Entonces se inventaron los enlaces blandos.


Supongo que este es un duplicado de unix.stackexchange.com/questions/9575/…
infijo

2
early days¿Por qué es diferente ahora? su respuesta no parece reflejar esa opinión de todos modos?
n611x007

@ n611x007 Debido a que 'estos días', cosas como Linux pueden montar sistemas de archivos de tipo no Unix que no se ajustan al modelo de inodo. Como los derivados FAT e ISO-9660, por ejemplo. Es una ecología de sistema de archivos mucho más diversa en lugar de una talla única para todos
infijo

1

Un archivo son los datos escritos en el disco. Estos datos están referenciados por su inodo, que contiene metadatos sobre el archivo que le dice al sistema qué bloques en el disco utiliza este archivo, entre otras cosas. Un enlace fijo apunta al número de inodo de este archivo.

Entonces, técnicamente, sí, está creando un nuevo archivo, pero todo lo que contiene este archivo es el número de inodo para el archivo al que hace referencia y su nombre. Es mejor pensar que se trata de un puntero al inodo o un puntero al archivo.


1

Archivo es un concepto ampliamente utilizado sobre entradas en un sistema de archivos.

Por lo general, incluye Directorio , Archivo normal (enlace duro) y Enlace simbólico (enlace suave). E incluso puede incluir dispositivo y zócalo.

Mi pregunta es simplemente cuál es la diferencia de un archivo y un enlace duro. El enlace duro apunta a un inodo, entonces, ¿qué es un archivo? Inode entrada en sí? ¿O un Inode con un enlace duro?

Digamos que creo un archivo táctil, luego se crea una entrada de Inode en la Tabla de Inode. Y creo un enlace duro, que tiene el mismo número de Inode con el archivo. Entonces, ¿creé un nuevo archivo? ¿O el archivo se define como un Inode?

Dado que incluso el enlace simbólico generalmente se cuenta como un archivo, un enlace duro también se puede contar como un archivo. Puede decir que es un archivo independientemente de si se trata de un enlace rígido o suave.

El concepto es un poco ambiguo, por lo que también está bien decir que una entrada de inodo es un archivo, aunque es posible que desee hacer referencia a los datos.

Si es un programador de C ++ o Java, es posible que desee leer sobre std :: filesystem :: file_type , java.io.File y java.nio.file.Files .

Los detalles sobre las diferencias entre el enlace duro y el enlace blando se pueden encontrar en el enlace en el comentario infijo.


1

La diferencia entre un "archivo" con un nombre de pila y un "enlace duro" es uno de historia. Se crea un archivo (normal) con un nombre dado usando una llamada al sistema creat, se crea un enlace duro usando una llamada al sistema de enlace.

Sin embargo, mientras los humanos hablan y recuerdan el historial de entradas de directorio y los llaman archivos y enlaces duros en consecuencia, el sistema de archivos no lo hace. Las entradas de directorio de "archivo original" y "enlace duro" son totalmente indistinguibles en calidad: ambas establecen una referencia entre un nombre de archivo y el inodo de un archivo, y una vez que desaparece la última referencia (las referencias no son solo nombres de archivo para un archivo pero también descriptores de archivo con los que se puede acceder a un archivo abierto), el archivo para el inodo sin referencia se considera eliminado y se recuperan el inodo y el espacio de archivo asociado.

Entonces, cuando los humanos contrastan los "archivos" y los "enlaces duros", el primero surgió con un "conteo de enlaces de 1", y todos los demás surgieron con un conteo de enlaces más grande. La diferencia es académica, y de hecho cambiar el nombre de un archivo a la vez consistió en crear un enlace rígido para el nombre de destino y luego eliminar el enlace para el nombre de origen. Hoy en día, generalmente se usa una sola llamada al sistema que lo hace atómicamente.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.