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/1
y /mnt/2
. /mnt/1
está disponible a través del enlace simbólico /home/user/file
. Algún programa A
comienza a leer /home/user/file
. Y después de un tiempo, algo cambia el enlace de /mnt/1
a /mnt/2
, pero A
sigue 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/file
esté vinculado a un dispositivo de bloque (por ejemplo, 2 discos iscsi replicados)?
fuente
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 similarstat()
, 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
rm
comando o launlink()
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.fuente
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:
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?
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:
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.
fuente