¿Cómo actualizar la biblioteca compartida sin fallas?

¿Cómo actualizar la biblioteca compartida sin fallas?

Aquídice que puede reescribir un archivo ejecutable y el proceso se ejecutará correctamente; se volverá a leer cuando se reinicie el proceso.

Sin embargo, cuando intento reemplazar un archivo binario mientras el proceso se está ejecutando (con scp, desde el desarrollador hasta el servidor de prueba), aparece "archivo ocupado". Y si reemplazo un archivo de biblioteca compartida (*.so), todos los procesos que lo vinculan fallan.

¿Porque? ¿Me estoy perdiendo de algo? ¿Cómo puedo reemplazar los archivos binarios sin detener/bloquear un proceso?

Respuesta1

Como se menciona en¿Por qué un paquete de software funciona bien incluso cuando se actualiza?, el bloqueo se coloca en el inodo, no en el nombre del archivo. Cuando carga y ejecuta un binario, el archivo se marca como ocupado, razón por la cual aparece el error ETXTBSY (archivo ocupado) cuando intenta escribir en él.

Ahora, para las bibliotecas compartidas es ligeramente diferente: las bibliotecas obtienen la memoria asignada al espacio de direcciones del proceso con mmap(). Aunque MAP_DENYWRITEse puede especificar, al menos Glibc en Linux lo ignora silenciosamente (según la página de manual, no dude en consultar las fuentes): consulte estohilo. Por lo tanto, se le permite escribir el archivo y, como está asignado en memoria, cualquier cambio es visible casi de inmediato, lo que significa que si se esfuerza lo suficiente podrá lograrlo. ladrillosu máquina sobrescribiendo la biblioteca.

Por lo tanto, la forma correcta de actualizar es:

  1. eliminar el archivo, lo que elimina la referencia a los datos del sistema de archivos, de modo que no sea accesible para ninguna aplicación recién generada que quiera usarlo, manteniendo los datos accesibles para cualquiera que ya los tenga abiertos (o mapeados). ;

  2. creando un nuevo archivo con contenidos actualizados.

Los procesos recién creados utilizarán los contenidos actualizados, las aplicaciones en ejecución accederán a la versión anterior. Esto es lo que hace cualquier utilidad de administración de paquetes sensata. Sin embargo, tenga en cuenta que no está completamente exento de peligro; por ejemplo, las aplicaciones que cargan código dinámicamente (usando dlsym()y amigos) experimentarán problemas si la API de la biblioteca cambia silenciosamente.

Si quieres estar en verdad,en realidadPor lo seguro, apague el sistema, monte el sistema de archivos desde otra instancia del sistema operativo, actualice y vuelva a abrir el sistema actualizado.

Respuesta2

Una actualización de rpm hace lo mismo: ejecuta archivos binarios y bibliotecas mientras nada falla.

Entonces cuál es la diferencia:

  1. desvincular archivo
  2. escribe un nuevo archivo con el mismo nombre

Esto NO reemplazará el archivo in situ: el inodo que hace referencia al binario en uso todavía está "ocupado" hasta que finalice el último objeto que lo mantuvo abierto. El nuevo archivo se creará con un nuevo número de inodo.

Ahora scpintentaremos cpreemplazar el archivo en el lugar, lo que cambiaría el contenido al que se refiere el inodo. Esto no funciona, como lo describiste.

información relacionada