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

395

Me preguntaba por qué a upgradeveces no quiere actualizar ciertas partes del sistema, mientras que dist-upgradesí. Aquí hay un ejemplo después de correr 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.

versus 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 esto upgrade?

Richard Rodriguez
fuente

Respuestas:

328

Del apt-getmanual :

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 aptherramienta más nueva disponible desde 14.04 en adelante:

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 su caso particular, veo, por ejemplo, que linux-headerses un paquete virtual que se proporciona por tanto linux-headers-3.0.0-12y linux-headers-3.0.0-13y que suena como el tipo de instalación y eliminación de paquetes manipulados por dist-upgrade, pero no por upgrade.

jcollado
fuente
44
No veo full-upgradecomo una opción por apt-getdebajo de 14.04.1.
nobar
Yo tampoco lo sabía apt, pero parece ser un comando completamente diferente según la página del manual que vinculó
BlueWizard
18
@nobar No ves porque es una opción de apty no de apt-get... :-) Intenta man apt.
Hastur
Bien, busqué y el primer enlace que encontré es para Ubuntu 15.10 (que salió a finales de 2014 y parece razonable con las pruebas de Jessie) manpages.ubuntu.com/manpages/wily/en/man8/apt.8.html
Z boson
66
@Zboson Yeah, y el 14.04 salió no en 2011, sino en abril de 2014 ... ¿ves el patrón?
Tgies
137

apt-get upgradeestá restringido al caso en que los paquetes deben ser reemplazados por versiones más nuevas, pero no es necesario agregar o eliminar paquetes. Una nueva versión de Firefox, por ejemplo, debería ser instalable con apt-get upgrade.

Sin embargo, apt-get upgradese negará a trabajar cuando las versiones actualizadas requieran adiciones o eliminaciones. Por ejemplo, cuando tiene linux-image-3.2.0-10-genericinstalado el núcleo y linux-image-3.2.0-11-genericaparece, el linux-image-genericpaquete se actualiza para depender de la versión más nueva. Para instalar el nuevo kernel, debe ejecutar apt-get dist-upgrade.

Observe cómo un apt-get upgradedirá que los paquetes del núcleo han sido held back. Esa es la señal para usar apt-get dist-upgrade.

pablomme
fuente
2
¡Perfecto! : D Dos preguntas más ... ¿qué utiliza el administrador de actualizaciones gráficas en Ubuntu? ¿Cuál es el recomendado?
THpubs
11
La utilidad gráfica update-manager, no se usa apt-getdirectamente; en su lugar, funciona con un backend llamado aptdaemon. Las capacidades estándar de update-managerson una combinación de los modos upgradey dist-upgradede apt-get: puede agregar pero no eliminar paquetes; invoca la herramienta "Actualización parcial" cuando se requieren eliminaciones. Cuando use la línea de comando, use apt-get upgrade. Si ve que informa que los paquetes han sido "retenidos", ejecute apt-get dist-upgradepara recoger las actualizaciones restantes.
pablomme
33

Básicamente, la actualización solo actualizará los paquetes existentes de una versión a otra. No instalará ni eliminará paquetes, incluso si se requiere hacerlo para actualizar otros. En el caso de las actualizaciones del kernel, la actualización del paquete linux-generic requiere la instalación del nuevo paquete linux-3.0.0-13-generic, y dado que la actualización 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 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 de kernel que se actualice, cada vez se crea un paquete de kernel completamente nuevo, y el metapaquete del kernel se actualiza para depender del nuevo paquete de kernel en lugar del antiguo. Esto se hizo para mantener las versiones antiguas del kernel para que, en caso de que haya un problema al arrancar el nuevo kernel, pueda elegir el antiguo del menú de arranque y recuperarlo.

psusi
fuente
2
La mejor esencia. Aún así, ¿cómo mantener un determinado paquete?
0xC0000022L
11

El apt-get upgradecomando normalmente solo instalará actualizaciones (o correcciones) en los paquetes instalados actualmente. Normalmente, una nueva versión de Mozilla Firefox , por ejemplo, se instalaría con este comando.

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

Para instalar el nuevo kernel, deberá ejecutarlo apt-get dist-upgrade. Se le notificará cuando ejecute apt-get upgrade, ya que dirá que ciertos paquetes han sido retenidos. Esa es su señal de empleo: apt-get dist-upgrade.

david6
fuente
12
Esto es engañoso. dist-upgradeno se actualizará a una nueva versión a menos que sources.listse haya modificado en consecuencia (e incluso entonces, esa no es una forma compatible de actualizar en Ubuntu). Cuando se instala un nuevo kernel con dist-upgrade, esa no es una nueva versión de Ubuntu . Es solo un nuevo paquete. Además, el reclamo "o se requiere la actualización de GRUB" es falso. sudo apt-get upgradees perfectamente capaz de actualizar paquetes en una situación en la que GRUB debe actualizarse, siempre que no se eliminen paquetes y se instalen paquetes nuevos. update-grubse ejecuta automáticamente, como siempre.
Eliah Kagan
2
Deberías escribir tu propia respuesta, ya que eso no agrega claridad a la mía.
david6
2
Además de lo que mencionó Eliah, el punto esencial es que apt-get upgradeno eliminará ni agregará paquetes. Si una solución a un paquete requiere un nuevo paquete, la actualización se retrasará. La respuesta de pablomme , que usted revisó para que sea menos precisa, es mejor y les aconsejaría a los lectores que se dirijan a esa.
Chan-Ho Suh
1
Corrección: apt-get upgradenunca instalará ni eliminará ningún paquete. Las actualizaciones del kernel se empaquetan como paquetes nuevos y, como resultado, apt-get upgradenunca actualizarán el kernel. El hecho de que la actualización del núcleo haga cambios "importantes" como la configuración de GRUB no es la razón de la diferencia entre upgradey dist-upgrade.
Mikko Rantalainen
1

Tu mejor opción es:

apt full-upgrade

-que maneja automáticamente las dependencias al actualizar paquetes; mientras:

apt upgrade

-NO maneja automáticamente las dependencias al actualizar paquetes.

- duBtrotterS

Brett Maddox-Stroud
fuente