¿Qué es "dist-upgrade" y por qué se actualiza más que "upgrade"?

Me preguntaba por qué upgrade a veces no quiere actualizar ciertas partes del sistema, mientras que dist-upgrade sí lo hace. Aquí'hay un ejemplo después de ejecutar apt-get upgrade:

apt-get upgrade:

rimmer@rimmer-Lenovo-IdeaPad-S10-2:~$ sudo apt-get upgrade
Reading package lists... Done
Building dependency tree       
Reading state information... Done
The following packages have been kept back:
  linux-generic linux-headers-generic linux-image-generic
0 upgraded, 0 newly installed, 0 to remove and 3 not upgraded.

frente a apt-get dist-upgrade:

rimmer@rimmer-Lenovo-IdeaPad-S10-2:~$ sudo apt-get dist-upgrade
Reading package lists... Done
Building dependency tree       
Reading state information... Done
Calculating upgrade... Done
The following NEW packages will be installed:
  linux-headers-3.0.0-13 linux-headers-3.0.0-13-generic
  linux-image-3.0.0-13-generic
The following packages will be upgraded:
  linux-generic linux-headers-generic linux-image-generic
3 upgraded, 3 newly installed, 0 to remove and 0 not upgraded.
Need to get 48.5 MB of archives.
After this operation, 215 MB of additional disk space will be used.
Do you want to continue [Y/n]?

En otras palabras, ¿por qué no se puede realizar con upgrade?

Solución

Del manual de apt-get:

upgrade
   upgrade is used to install the newest versions of all packages
   currently installed on the system from the sources enumerated in
   /etc/apt/sources.list. Packages currently installed with new
   versions available are retrieved and upgraded; under no
   circumstances are currently installed packages removed, or packages
   not already installed retrieved and installed. New versions of
   currently installed packages that cannot be upgraded without
   changing the install status of another package will be left at
   their current version. An update must be performed first so that
   apt-get knows that new versions of packages are available.

dist-upgrade
   dist-upgrade in addition to performing the function of upgrade,
   also intelligently handles changing dependencies with new versions
   of packages; apt-get has a "smart" conflict resolution system, and
   it will attempt to upgrade the most important packages at the
   expense of less important ones if necessary. So, dist-upgrade
   command may remove some packages. The /etc/apt/sources.list file
   contains a list of locations from which to retrieve desired package
   files. See also apt_preferences(5) for a mechanism for overriding
   the general settings for individual packages.

Y con la nueva herramienta apt disponible a partir de 14.04:

full-upgrade
   full-upgrade performs the function of upgrade but may also remove
   installed packages if that is required in order to resolve a
   package conflict.

En tu caso particular, veo, por ejemplo, que linux-headers es un paquete virtual que es proporcionado tanto por linux-headers-3.0.0-12 como por linux-headers-3.0.0-13 y eso suena como el tipo de instalación y eliminación de paquetes manejado por dist-upgrade, pero no por upgrade.

Comentarios (7)

apt-get upgrade está restringido al caso en el que los paquetes deben ser reemplazados por versiones más nuevas, pero no es necesario añadir o eliminar ningún paquete. Una nueva versión de Firefox, por ejemplo, debería poder instalarse con apt-get upgrade.

Sin embargo, apt-get upgrade se negará a funcionar cuando haya adiciones o eliminaciones requeridas por las versiones actualizadas. Por ejemplo, cuando tiene instalado el kernel linux-image-3.2.0-10-generic y aparece linux-image-3.2.0-11-generic, el paquete linux-image-generic se actualiza para depender de la nueva versión. Para instalar el nuevo kernel, es necesario ejecutar apt-get dist-upgrade.

Fíjese en que un apt-get upgrade dirá que los paquetes del kernel han sido retenidos. Esa es la clave para usar apt-get dist-upgrade.

Comentarios (2)

Básicamente, upgrade sólo actualizará los paquetes existentes de una versión a otra. No instalará ni eliminará paquetes, aunque sea necesario hacerlo para actualizar otros. En el caso de las actualizaciones del kernel, actualizar el paquete linux-generic requiere instalar el nuevo paquete linux-3.0.0-13-generic, y como upgrade se niega a instalar o eliminar paquetes, se niega a actualizar linux-generic.

A veces, varias incompatibilidades entre paquetes requerirán que se eliminen algunos paquetes para poder actualizar otros, y eso también requerirá dist-upgrade. Las actualizaciones del kernel siempre requerirán dist-upgrade debido a cómo se manejan. En lugar de tener un paquete del kernel que se actualiza, se crea un paquete del kernel completamente nuevo cada vez, y el metapaquete del kernel se actualiza para depender del nuevo paquete del kernel en lugar del antiguo. Esto se hizo para que se mantengan las versiones antiguas del kernel para que, en caso de que haya un problema con el arranque del nuevo kernel, se pueda elegir el antiguo desde el menú de arranque y recuperarlo.

Comentarios (1)

El comando apt-get upgrade normalmente sólo instalará actualizaciones (o correcciones) de los paquetes actualmente instalados. Típicamente una nueva versión de Mozilla Firefox, por ejemplo, se instalaría con este comando.

Sin embargo, el comando apt-get upgrade generalmente NO instalará nuevas versiones, donde se requieran cambios importantes (incluyendo la eliminación de paquetes o la actualización de GRUB). Por ejemplo, cuando un nuevo núcleo de Linux (linux-image-3.x.x-xx-generic, etc.) está disponible, el paquete no se instalará.

Para instalar el nuevo kernel, necesitarás ejecutar apt-get dist-upgrade. Se te notificará cuando ejecutes apt-get upgrade, ya que dirá que ciertos paquetes han sido retenidos. Esa es tu señal para usar: "apt-get dist-upgrade".

Comentarios (4)

Tu mejor opción es:

"actualizar por completo

-que se encarga de las dependencias cuando se actualizan los paquetes; mientras que:

apt upgrade

-no se encarga de las dependencias al actualizar los paquetes.

-duBtrotterS

Comentarios (0)