¿Cómo funciona el proceso de actualización de Ubuntu?

11

¿Cómo se actualiza Ubuntu sin problemas a una distribución más nueva, mientras el sistema operativo aún se está ejecutando? Estoy actualizando de 10.10 a 11.04, y he actualizado varias veces antes, y es tan simple como ejecutar update-manager -d y descargarlos e instalarlos, luego reiniciar.

Sin embargo, ¿cómo funciona esto exactamente? ¿Cómo puede el administrador de actualizaciones actualizar el sistema operativo mientras todavía está en uso?

bbosak
fuente
Bien, agregar mi pregunta en el comentario de recompensa no fue una buena idea. Parece que tampoco puedo editarlo.
Oxwivi

Respuestas:

3

Según mi experiencia, supondría que mientras los paquetes y módulos se están ejecutando, se guardan en la memoria y no se refieren mucho a su copia en el disco duro. Puede ver esto si ejecuta un programa en ubuntu y luego elimina los paquetes relacionados mientras se ejecuta. Seguirá ejecutándose, pero si lo cierra, no podrá reiniciarlo.

Supongo que lo mismo sucede con una actualización de distribución. Todos los paquetes relacionados con la versión original de ubuntu todavía se están ejecutando a pesar de que se han eliminado y reemplazado con los nuevos, por lo que cuando finalmente se detienen en un reinicio del sistema, los nuevos paquetes se hacen cargo.

Slipstream
fuente
Eso también explicaría por qué noto que se agregan nuevas funciones a algunos menús a medida que avanza la actualización.
bbosak
15

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 upgradeque normalmente no elimina ningún software. Las actualizaciones de gran lanzamiento corresponden a un apt-get dist-upgradeperí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-markpara 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:

  1. 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?
    • OK ... ya cubrí este
  2. ¿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í.
  3. 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.
  4. 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?
    • No

Pregúntame si aún tienes más preguntas.

Paul Hänsch
fuente
¿Puedes vincular a más documentos relacionados con el infierno de dependencia (me recuerda el término infierno de DLL)? Utilizo instalaciones mínimas de Ubuntu y quiero descubrir cómo funcionará la actualización para mí.
Oxwivi
Creo que todo lo que encontrará en Internet sobre el infierno de la dependencia son quejas. Lea sus páginas de manual de apt, como man apt-get. Creo que a menudo es útil usar la sintaxis de comando que especifica la versión como apt-get -t intrepid install foo/jaunty bar/oneiricetc., solo ejemplos. En realidad, esto tiene más sentido con Debian, donde a veces se mezclan lanzamientos, en Ubuntu esto es menos habitual. Los temas interesantes también podrían ser apuntar y fijar paquetes en espera.
Paul Hänsch
3
Usted gana el premio por la respuesta sin código más larga que he visto en la red de Stack Exchange.
Patrick
3

A nivel del sistema de archivos, a diferencia de Windows, en un sistema Unix puede eliminar archivos que están abiertos. La eliminación simplemente elimina el nombre del archivo, no su contenido, por lo que cualquier programa que todavía tenga el archivo abierto puede acceder a él hasta que cierre el archivo, y solo entonces se liberan los datos.

Por lo tanto, el proceso de actualización simplemente elimina los archivos antiguos, los reemplaza por los nuevos y, para ciertos servicios del sistema, los reinicia para que se ejecute la nueva versión.

Hay uno o dos componentes que no se pueden reiniciar sin reiniciar toda la computadora, por lo que después de actualizarlos, se le solicitará que reinicie, por lo que utilizará la nueva versión.

psusi
fuente
2

¿Cómo se puede actualizar Linux mientras todavía está en uso?

Principalmente porque Linux (y con él, la mayoría de las distribuciones) simplemente está diseñado de esa manera. Poder actualizar un paquete en un sistema en ejecución es un objetivo para la mayoría de las distribuciones basadas en Linux.

Con Linux, no hay nada que impida que el proceso del administrador de paquetes escriba en un archivo en el disco, incluso si ese archivo está actualmente abierto por una aplicación o si el archivo es una biblioteca de código ejecutable o compartida que se está ejecutando actualmente . En un nivel muy bajo, hay bloqueos que protegen el acceso a un archivo durante una sola operación de escritura / lectura, pero nunca están diseñados para mantenerse durante más de una cuestión de milisegundos y cualquier otra aplicación que intente escribir en el mismo archivo simplemente esperará esos milisegundos.

Puede reemplazar un archivo ejecutable mientras se está ejecutando y en realidad no hará nada al proceso en ejecución, porque el proceso ya no necesita el archivo en el disco; todo su código ya se ha cargado en la memoria.

Es por eso que en Linux, aunque puede actualizar una aplicación mientras se está ejecutando, la actualización no tendrá efecto hasta que se reinicie la aplicación que actualizó. En el caso de actualizar un proceso en segundo plano, como un servicio del sistema, ese servicio debería reiniciarse. En el caso de que haya actualizado el kernel, esto significa un reinicio.

¿No reemplazará los archivos de un programa mientras se está ejecutando romper algunos programas?

Algunos de los paquetes en una distribución de Linux contendrán instrucciones de instalación que indican al administrador de paquetes que detenga ciertos servicios del sistema mientras el paquete se actualiza y reinicie esos servicios una vez que se complete la actualización. Esto evita situaciones en las que, por ejemplo, los archivos de configuración para un servicio en particular se actualizan y la versión en ejecución del servicio puede no ser capaz de hacer frente a la versión más reciente de los archivos de configuración.

En general, las aplicaciones de usuario normales no requieren la ejecución de archivos de configuración, excepto los archivos que genera y los ubica en ubicaciones como los directorios de inicio de los usuarios. Por lo tanto, estos no serán tocados por el administrador de paquetes al actualizar.

thomasrutter
fuente
Ya estoy al tanto de todos estos detalles, por favor lea el comentario que hice con mi recompensa. Quiero saber cómo exactamente Ubuntu, es decir apt, maneja ciertos paquetes y dependencias durante el proceso de actualización.
Oxwivi
-2

Esto es similar a otra característica. Espero que esto ayude a comprender el proceso básico.

Me refiero a la capacidad de "cambiar de raíz" cuando se inicia el sistema operativo.

Cuando el sistema operativo se inicia, el sistema de archivos raíz (léase: "/") está disponible inicialmente solo en RAM. Mientras se ejecuta este proceso de arranque, cambia / de la RAM al / sistema de archivos en el disco duro.

aparejado
fuente
1
No, el mecanismo chroot no se usa durante la actualización del sistema. La actualización se realiza en el sistema de archivos en vivo. Incluso puede ver cómo se reconstruyen los menús de su programa y los iconos del programa cambian a medida que se reemplazan. Pero el mecanismo chroot se usa en una instalación de sistema original, cuando un sistema nuevo se "destrabaja" en un entorno raíz de cambio en una partición de disco recién creada.
Paul Hänsch