Acabo de actualizar mi ubuntu lucid a natty, durante la actualización reemplazó la mayoría de las aplicaciones en ejecución con una versión más nueva.
¿Como funciona esto? (¿No se bloquearán las aplicaciones?) ¿Qué sucederá con la aplicación si se actualiza un archivo lib y una aplicación en ejecución que está buscando una lib más antigua intenta cargarlo?
Respuestas:
Linux (y otros UNIX) establece una distinción entre el nombre de un archivo (el enlace ), el archivo en sí (a menudo identificado con el inodo ) y los identificadores abiertos del archivo. Cuando va a eliminar un archivo, llama a la
unlink()
llamada; esto borra el enlace al archivo (también puede usarrename()
para sobrescribirlo con un inodo diferente). Sin embargo, si permanecen los identificadores abiertos del archivo (u otros enlaces, los archivos pueden tener múltiples enlaces rígidos ), el inodo permanece, y también el contenido del archivo, hasta que todos los vínculos y identificadores desaparezcan.Por lo tanto, ejecutar programas utilizando la biblioteca o lo que sea que mantenga un control de la versión anterior (a menudo implícitamente a través de un mapeo de memoria), para que permanezca en el disco. Simplemente ya no tiene un nombre de archivo, y se limpiará cuando todos los programas que lo usan se apaguen (o en el próximo reinicio, durante la verificación del sistema de archivos o la reproducción del diario).
Además, tenga en cuenta que los programas que esperan la 'biblioteca antigua' funcionarán bien con las versiones más recientes de la biblioteca. A las bibliotecas de Linux se les asigna un nombre de archivo ('soname') que refleja la versión de la ABI (interfaz binaria de aplicación) que ofrece la biblioteca. Por ejemplo, la biblioteca C en mi sistema es
libc.so.6
. Cualquier programa compilado contra una versión anterior de libc, pero aún una versión de libc que implementa la versión 6 ABI, funcionará bien con él. Muy viejos programas buscarán unalibc.so.5
olibc.so.4
o algo en su lugar; en este caso, también necesitaría mantener la versión anterior, pero como el nombre de archivo es diferente, esto no es un problema.fuente
A diferencia de Windows, puede eliminar o reemplazar un archivo abierto; Para dar una explicación simplificada , las nuevas solicitudes de los archivos abren el nuevo archivo, los identificadores existentes utilizan el archivo que existía cuando se crearon. En otras palabras, en Linux puede tener archivos / versiones de archivo que todavía existen, aunque ya no hay un puntero en la estructura del directorio; aquellos que dejan de existir no hay ningún puntero para ellos (cerrado y todo).
Por lo general, una aplicación en ejecución carga las bibliotecas necesarias por adelantado, por lo que el problema que describe solo ocurriría en situaciones de tiempo muy específicas mientras se instala el paquete: las aplicaciones en ejecución todavía usan la versión anterior de la biblioteca, las aplicaciones recién iniciadas usan la nueva uno.
Esto se usa no solo en las actualizaciones de distribución, sino que ocurre en cada actualización de paquete (la actualización de dist solo agrega un par de pasos más automáticos a ese proceso).
fuente
Muchos procesos de Linux continúan funcionando después de que se hayan actualizado los paquetes de los que provienen, pero algunos no. En mi experiencia, KDE nunca funciona correctamente si lo actualiza mientras se está ejecutando. Es probable que experimente bloqueos y / o fallas al cerrar sesión.
fuente