Solución:
La respuesta muy corta es:
- un archivo es una masa anónima de datos
- un enlace fijo es el nombre de un archivo
- un enlace simbólico es un archivo especial cuyo contenido es un nombre de ruta
Los archivos y directorios de Unix funcionan exactamente como archivos y directorios en el mundo real (y no igual que carpetas en el mundo real); Los sistemas de archivos Unix están (conceptualmente) estructurados así:
- un archivo es una masa anónima de datos; no tiene un 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 recursividad (tenga en cuenta que cuando se introdujeron los sistemas de archivos Unix, esto fue no en absoluto obvio, muchos sistemas operativos no permitían que los directorios contuvieran directorios en ese entonces)
- estas entradas del directorio se llaman 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 teniendo en cuenta específicamente que los directorios de Unix funcionan como directorios del mundo real y no como las carpetas del mundo real explica muchas de las “rarezas” que los recién llegados encuentran a menudo, como: ¿por qué puedo eliminar un archivo al que no tengo 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 hacer eso, solo necesita acceso de escritura al directorio, no al archivo. Como en el mundo real.
O, ¿por qué puedo tener enlaces simbólicos colgando? Bueno, el enlace simbólico simplemente contiene un nombre de ruta. No hay nada que diga que realmente tiene que haber un archivo con ese nombre.
Mi pregunta es simplemente ¿cuál es la diferencia entre un archivo y un enlace físico?
La diferencia entre un archivo y un vínculo físico 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 todo. Un archivo no es un inodo, un archivo tiene un inodo, al igual que no es un número de seguro social, tengo un SSN.
Un enlace físico es el nombre de un archivo. Un archivo puede tener muchos nombres.
Digamos, creo un archivo con toque, luego se crea una entrada Inode en el Mesa Inode.
Si.
Y creo un enlace duro, que tiene el mismo número de Inode que el archivo.
No. Un enlace físico no tiene un número de inodo, ya que no es un archivo. Solo los archivos tienen números de inodo.
El enlace físico asocia un nombre con un número de inodo.
Entonces, ¿creé un nuevo archivo?
Si.
¿O el archivo simplemente se define como un Inode?
No. El archivo tiene un inodo, no es un inodo.
Un enlace físico es una entrada de directorio. Un archivo puede tener varias entradas de directorio, si está presente con diferentes nombres o en diferentes directorios. Una entrada de directorio se denomina “enlace fijo” cuando se relaciona con otras entradas de directorio para el mismo archivo.
El inodo contiene los metadatos del archivo distintos 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 claramente identificable en el disco 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 “vínculo”. Dicho enlace se denomina “enlace duro” en oposición a los “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 salas y las entradas de directorio como puertas. “Abre el archivo /foo/bar
“Significa” ir al pasillo /foo
y ve a la habitación bar
”. “Ir a la habitación bar
“Realmente significa” abrir la puerta marcada bar
y entrar en la habitación “pero” ir a la habitación bar
”Es una forma corriente 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 vínculo físico 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 enlaza con el archivo ya existente. Después de la creación, las dos entradas del directorio tienen el mismo estado: no hay una que sea “primaria” y otra que sea “secundaria”, son solo 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 las entradas de su directorio) mientras un programa aún tiene el archivo abierto. El archivo permanece en el sistema de archivos, solo se elimina realmente cuando el último proceso que tuvo el archivo abierto lo cierra. En la metáfora de la habitación y las puertas, una habitación que no tiene puertas todavía ocupa espacio.
Además de todas las demás respuestas, quiero señalar las siguientes propiedades importantes:
Un softlink es una verdadera referencia, es decir, es un archivo pequeño que contiene un nombre de ruta. La resolución de un enlace suave ocurre de forma transparente para la aplicación: si un proceso abre un archivo, diga /this/path/here
que es un enlace simbólico que apunta a /that/other/path
luego todo el manejo de apertura /that/other/path
lo hace el sistema operativo. Además, si /that/other/path
pasa a ser un enlace simbólico en sí mismo, entonces esto también está siendo tratado por el sistema operativo. 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 llega SYMLOOP_MAX
(ver sysconf(3)
) muchas entradas, en cuyo caso el sistema operativo (más precisamente: la llamada al sistema correspondiente) devuelve un error y establece errno
para ELOOP
. Por tanto, una referencia circular como xyz -> xyz
no detendrá el proceso. (Para sistemas Linux, consulte path_resolution(7)
para obtener todos los detalles.)
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 (ver symlink(7)
para toda la historia.)
Ahora, en términos de permisos, notará que los enlaces simbólicos siempre tienen permisos 777 (rwxrwxrwx
en notación simbólica). Esto se debe al hecho de que, de todos modos, se puede omitir cualquier otro permiso 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 era accesible en primer lugar. Por ejemplo, un enlace simbólico con permisos 777 que apunta a un archivo con permisos 640 el archivo no lo hace accesible para “otros” (el público en general). En otras palabras, un archivo xyz
es accesible a través de un enlace simbólico si y solo si es directamente accesible, es decir, sin indirección. 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 físicos y los enlaces simbólicos (también conocidos como enlaces suaves) es que los enlaces simbólicos funcionan en todos los sistemas de archivos, mientras que los enlaces físicos se limitan a un 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 se desprende del hecho de que un enlace físico es en realidad una entrada en un directorio, que consta de 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 hardlink es en realidad algo engañoso. Mientras que para los enlaces simbólicos el origen y el destino se distinguen claramente (el enlace simbólico tiene su propia entrada en la tabla de inodo), esto no es cierto para los enlaces físicos. Si crea un enlace fijo para un archivo, la entrada original y el enlace fijo son indistinguibles 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 fijo, y que vincular un archivo solo significa crear un segundo ( o tercero, o cuarto …) hardlink. De hecho, cada inodo almacena un contador para el número de enlaces físicos a ese inodo.
Por último, tenga en cuenta que los usuarios normales no pueden vincular directorios de forma rígida. Esto se debe a que debe hacerse con la máxima precaución: un usuario desprevenido puede introducir ciclos en el árbol de archivos, que de otro modo sería estrictamente jerárquico, que todas las herramientas habituales (como fsck
) y el sistema operativo en sí no están preparados para lidiar con ellos.