Aquí una descripción más detallada del proceso. Lo siento, el texto se hizo tan largo.
Mi experiencia proviene de Debian, para la cual se inventó originalmente todo el sistema de empaquetado y actualización utilizado en Ubuntu. Las actualizaciones diarias de seguridad de Ubuntu corresponden a la ejecución, apt-get upgrade
que normalmente no elimina ningún software. Las actualizaciones de gran lanzamiento corresponden a un apt-get dist-upgrade
período durante el cual los paquetes de software se pueden intercambiar por completo.
En realidad, los componentes de muy bajo nivel normalmente no se intercambian durante una actualización de lanzamiento. Inmediatamente después de la actualización, debe encontrar dos imágenes de kernel e initrd en su directorio / boot. Esto se debe a que, a diferencia de los programas, los componentes del núcleo no son intercambiables tan bien. Si surge la necesidad de cargar nuevos controladores de dispositivo durante la actualización, deben ser compatibles con el núcleo en ejecución. Después de que el sistema se inicie con el nuevo núcleo, se puede eliminar el antiguo. La última vez que verifiqué que esto debía hacerse manualmente, no sé cómo maneja esto el actualizador actual. Esto es por cierto. La razón principal es por qué la imagen del kernel lleva su número de versión en el nombre del archivo, por lo que puede tener diferentes versiones de kernel instaladas al mismo tiempo. Lo mismo para la ruta del módulo (/ lib / modules / ...)
Los paquetes de software se actualizan uno por uno, comenzando con los paquetes más bajos en la jerarquía de dependencias. Esas normalmente son bibliotecas de programas como libc y otras. Sin embargo, la secuencia en la que se actualizan los paquetes no está codificada, sino que se calcula dinámicamente a medida que se resuelven las dependencias del paquete. En la mayoría de los casos, los programas antiguos pueden funcionar con nuevas bibliotecas, por lo que no es tan problemático si esas bibliotecas se reemplazan primero.
Debe comprender aquí, que el sistema diferencia entre los paquetes instalados manualmente (es decir, los paquetes cuya instalación solicitó directamente, es decir, cromo) y los paquetes instalados automáticamente, que solo se instalaron para cumplir con las dependencias de los paquetes instalados manualmente (y las dependencias de esas dependencias )
Para cada programa instalado manualmente, el actualizador solo busca una versión más nueva. A menudo, esos programas son solo metapaquetes como "ubuntu-desktop", que no contiene datos y solo dependencias. Se incorporarán nuevas versiones de bibliotecas dependientes, ya que las solicitan los programas actualizados directamente (solicitados manualmente). El actualizador siempre intentará instalar la última versión utilizable de cualquier paquete dependiente (durante cualquier actualización, no solo actualizaciones).
Los programas que no pueden funcionar con las nuevas versiones de la biblioteca no pueden iniciarse durante el tiempo posterior a la actualización de la biblioteca, y antes de que el programa en sí también se actualice. Si esos programas ya deberían estar ejecutándose antes de la actualización de la biblioteca, continuarán ejecutándose, porque la versión anterior de la biblioteca permanece en la memoria mientras permanezca en uso. Lo mismo ocurre con los programas que se iniciaron antes de que se actualicen. Esos no proporcionarán nuevas funciones hasta que se terminen y reinicien.
Después de la actualización, algunas bibliotecas (o dependencias en general) quedarán huérfanas. Esas son bibliotecas que fueron requeridas por las versiones antiguas del programa, pero ya no son requeridas por las nuevas versiones. Dado que estos paquetes están marcados como instalados automáticamente, y dado que ningún programa instalado manualmente se relaciona con ellos, estos paquetes pueden ubicarse y eliminarse fácilmente. Incluso puede observar esto como el último paso del proceso de actualización (el actualizador dice "eliminar paquetes obsoletos" o algo similar).
Se instalarán algunos paquetes, que cuando no se instalaron antes, son simplemente nuevas dependencias, que se marcan como instaladas automáticamente y se pueden eliminar, si el requisito para ellas desaparece en el futuro.
Este mecanismo incluso permite el intercambio de programas de usuario completos. Como, por ejemplo, cambiar de Gnome2 a Unity. Dado que ambos son solo dependencias automáticas de ubuntu-desktop, que es uno de los pocos paquetes, para el cual se solicitan nuevas versiones en primer lugar.
Los programas normalmente no dependen de una versión específica del núcleo del sistema operativo, por lo que normalmente funcionarán bien con el núcleo en ejecución.
Además de todo esto, sospecho que el actualizador de Ubuntu arroja algunas soluciones y soluciones específicas en la mezcla, para evitar situaciones en las que esta teoría se rompe.
Como puede ver durante la actualización, hay muy buenas condiciones en las que el sistema solo se puede utilizar de forma limitada. Si algo sale mal durante la actualización, lo más probable es que te quedes con un sistema roto. A menudo, incluso uno que no puede repararse fácilmente, ya que el programa de actualización también puede verse afectado. Recuerde, los programas con dependencias rotas pueden continuar funcionando, pero no se pueden reiniciar, siempre y cuando las dependencias estén rotas, esto también se aplica al actualizador.
Puede usar el programa de línea de comandos apt-mark
para averiguar qué paquetes están marcados como instalados manualmente y cuáles se han instalado automáticamente. También puede cambiar esas marcas usando el mismo programa. Esto afectará directamente el proceso de actualización.
En una configuración de software más compleja, el Actualizador a veces le pedirá que resuelva una dependencia manualmente. Es decir, cuando un programa instalado manualmente se actualiza y solicita una nueva versión de una biblioteca, mientras que otro programa instalado manualmente depende de la versión anterior de la misma biblioteca y no puede funcionar con la nueva. Luego tendrá que elegir, ya sea renunciar a uno de esos programas o abstenerse de actualizar ambos. Dado que las dependencias son a menudo complejas, esto puede volverse muy desordenado muy rápido (es posible que haya oído hablar del término "infierno de dependencias").
Ahora a las preguntas específicas:
- Cuando se cambia la infraestructura de bajo nivel (bajo nivel como en kernel, controladores, bibliotecas, etc., cualquier cosa con la que un usuario no interactúa directamente), ¿qué sucede con los binarios en desuso?
- ¿Qué le sucede a una aplicación que ha quedado completamente en desuso? Por ejemplo, Unity 2D (o cualquier otro software abandonado / sin mantenedores cuyo paquete no esté en un nuevo repositorio).
- Si la aplicación se instaló manualmente una vez, permanecerá en el sistema, a menudo causando el infierno de dependencia que describí.
- ubuntu-desktop es un metapaquete que extrae las aplicaciones predeterminadas de Ubuntu como dependencias. Si eliminé Firefox e instalé Chrome, ¿Firefox seguirá siendo incluido como parte de las actualizaciones?
- Siempre que sea el navegador estándar de la nueva versión, sí. El cromo también se actualizará. No estoy seguro de si puede eliminar Firefox sin eliminar ubuntu-desktop. Tenga en cuenta que, aparte de las dependencias estrictas, el sistema de paquetes también conoce el concepto de recomendaciones, donde un software normalmente se instalará como una dependencia, pero se puede desinstalar más tarde sin afectar nada más que sus propias dependencias.
- Además, qué sucede si una sola aplicación solía depender de package-x y ya no lo hace en una nueva versión; ¿se actualizará package-x junto con el resto de los paquetes a pesar de estar huérfano?
Pregúntame si aún tienes más preguntas.