¿Cómo funciona la actualización de los archivos binarios de aplicaciones en ejecución durante una actualización?

23

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?

srinathhs
fuente
Buena pregunta, pero probablemente sea mejor hacerla aquí: unix.stackexchange.com (¡Sé que la URL dice Unix pero también responden preguntas de Linux!)
La comprensión de la funcionalidad reemplace mientras está abierta de Linux parece que todavía está programando (pero por poco :)
bdonlan
2
@bdonlan: si está cargando bibliotecas dinámicamente durante la vida útil de su proceso, debe ser muy consciente de esto, de lo contrario puede morderlo. Esto es especialmente importante si está tratando de hacer algo inusual, por ejemplo, un código auto modificable, etc. Pero sí, está en el límite.
Piskvor
1
No es realmente relevante para el código de auto modificación, pero ciertamente es algo que alguien que escribe bibliotecas para Linux debería saber, sí. :)
bdonlan
1
@Piskvor, suena un poco como el proceso de compilación de múltiples etapas para gcc :) Pero básicamente solo los compiladores hacen algo así, y normalmente no actualizarías el sistema mientras lo haces (incluso si lo haces, siempre que no lo hagas) no rebajes nada mientras está en proceso, estás bien, ya que usará sus copias compiladas de forma privada de todo lo que importa)
bdonlan

Respuestas:

31

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 usar rename()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 una libc.so.5o libc.so.4o 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.

bdonlan
fuente
9

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).

Piskvor
fuente
0

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.

Robin Green
fuente