¿Cómo funciona Linux con enlaces simbólicos?

11

Quiero decir, ¿qué sucede cuando algún proceso quiere leer un enlace simbólico? ¿Qué sucede cuando algo cambia un enlace simbólico durante un proceso de lectura o incluso escritura?

Por ejemplo: Tengo 2 archivos, 100G similares enormes /mnt/1y /mnt/2. /mnt/1está disponible a través del enlace simbólico /home/user/file. Algún programa Acomienza a leer /home/user/file. Y después de un tiempo, algo cambia el enlace de /mnt/1a /mnt/2, pero Asigue leyendo el archivo.

¿El programa almacena en caché la ruta absoluta?

¿Fallará y se producirá un error, porque se cambió el enlace simbólico o funcionará bien, como si nada hubiera pasado?

¿Será diferente en caso de que /home/user/fileesté vinculado a un dispositivo de bloque (por ejemplo, 2 discos iscsi replicados)?

prisa
fuente

Respuestas:

9

El enlace simbólico apunta al nombre del archivo real ( inodo ) en el sistema de archivos. Cuando el sistema resuelve ese enlace simbólico para encontrar el archivo real y abrirlo, encuentra y usa el inodo del archivo. En ese punto, la ruta que solía llegar al archivo no importa. Lo que el sistema operativo no almacena en caché, lo lee del archivo por su inodo. Podría, según tengo entendido, comenzar a leer el archivo a través de un enlace rígido y eliminar ese enlace rígido (siempre y cuando el archivo todavía esté vinculado desde otro lugar) , y no causaría problemas mientras el archivo se haya resuelto ( nombre cadena-> inodo).

Kevin
fuente
44
Puede eliminar TODOS los enlaces al archivo y seguir leyendo una vez que lo tenga abierto. Es por eso que puede actualizar paquetes sin reiniciar como debe hacerlo en Windows; porque puede ejecutar el archivo ejecutable del programa aunque se esté ejecutando.
psusi
1
@psusi Sé que los datos y el inodo todavía están allí y simplemente no apuntan a más, pero una vez que el archivo ha sido eliminado, el sistema es libre de sobrescribir ese punto en el disco, ¿verdad? Entonces, si el archivo es demasiado grande para caber en la caché de archivos, como los archivos de 100GB en cuestión, ¿qué sucede si parte de ellos se sobrescribe antes de llegar al final? Esto no es una preocupación para los archivos críticos del sistema porque se cargan en la memoria caché y se guardan allí, pero 100 GB es lo suficientemente grande que creo que esto podría ser una preocupación.
Kevin
2
Kevin, los archivos no se eliminaron del disco hasta el último proceso que usa el archivo muere. Siempre puede encontrar todos los archivos que están en uso en este momento en proc. Pero su respuesta parece explicar mi pregunta. Gracias.
prisa
2
Esta respuesta pierde un punto crítico, que un enlace simbólico contiene el nombre del archivo de destino.
Keith Thompson, el
6

Un enlace simbólico es un pequeño archivo que contiene la ubicación (es decir, la ruta y el nombre de archivo) de un archivo de destino, con una bandera en la entrada del directorio que indica que es un enlace simbólico.

Cuando abre un enlace simbólico, el sistema operativo seguirá la ubicación para encontrar el archivo de destino. Si el objetivo en sí mismo es un enlace simbólico, también sigue su ubicación (1) (2) hasta que la ubicación apunte a un archivo que no es un enlace simbólico (llamémoslo FinalFile ). Luego, el sistema operativo obtiene el inodo del FinalFile (el inodo contiene metadatos como tiempo de modificación y también tiene un puntero a los datos del archivo). Finalmente se abre el inodo del FinalFile . De ahora en adelante, el proceso usa ese inodo para leer / escribir en el archivo. Como resultado, cambiar el nombre o la ruta del enlace simbólico, eliminar el enlace simbólico, cambiar la ruta o el nombre del FinalFile o incluso eliminar el FinalFile(3) no tiene ningún efecto en el proceso; sigue leyendo del mismo inodo.

En la mayoría de los casos, las operaciones de datos de archivos en el enlace simbólico afectarán al FinalFile (por ejemplo, leer y escribir en el enlace simbólico leerá / escribirá en el FinalFile ) pero hay excepciones: la readlink()llamada al sistema lee el contenido del enlace simbólico en sí.

Por otro lado, las operaciones de metadatos de archivos (como cambiar el nombre o eliminar) generalmente afectarán el enlace simbólico. Pero también hay excepciones aquí: la lstat()llamada al sistema es similar stat(), excepto que devuelve información sobre el enlace simbólico en lugar de sobre el FinalFile (2).


(1) Hay un límite en el número de niveles y las cosas se vuelven un poco más complejas si la ubicación en el enlace simbólico es una ruta relativa.

(2) Leer enlace simbólico (7): manejo de enlaces simbólicos para más detalles.man 7 symlink

(3) El rmcomando o la unlink()llamada al sistema no elimina físicamente un archivo. Elimina la entrada del directorio que apunta al inodo del archivo. El archivo en sí solo se elimina si tanto a) no hay más entradas de directorio (enlaces duros) que se refieren a su inodo yb) ningún proceso tiene el archivo abierto.

Keith Thompson
fuente
1

Eso es casi transparente para Linux, y está mucho más relacionado con el sistema de archivos que está utilizando que con el sistema operativo.

No es un archivo normal o un archivo muy pequeño porque no puede crear un enlace simbólico que funcione en una partición VFAT, por ejemplo, simplemente copiando el enlace simbólico en sí mismo, ya que el sistema de archivos lo registra directamente.

La diferencia en el enlace simbólico a un enlace duro es que la designación es a un enlace duro en lugar de apuntar a los sectores de datos como lo hace un enlace duro.

Ejemplo:

Prueba 1:

echo 'data' >file.txt

Esto creará el archivo de enlace duro.txt apuntando a los sectores 10 a 20 * (* números solo para explicar).

Prueba 2:

Ahora que si?

ln file.txt file_2.txt

Esto creó un hardlink file_2.txt que apunta a los sectores 10 a 20 (lo mismo que file.txt), por lo que si elimina file.txt, los sectores 10 a 20 aún están reservados, y puede ver los datos dentro de file_2.txt ... . (file.txt y file_2.txt son ambos como los originales)

Prueba 3:

ln -s file.txt file_sym.txt 

Enlace simbólico señalado file_sym.txt al enlace duro file.txt, por lo que cuando intente acceder a file_sym.txt verá file.txt, pero si elimina file.txt file_sym ya no encontrará el destino.

Estos son administrados por el sistema de archivos, por ejemplo, por los módulos ext4 para Linux (o si está compilado en el núcleo), no importa si está utilizando Linux u otro Unix.

Luciano Andress Martini
fuente