O que é "dist-upgrade" e por que atualiza mais do que "upgrade"?

395

Fiquei me perguntando por que upgradeàs vezes não quer atualizar certas partes do sistema, enquanto o dist-upgradefaz. Aqui está um exemplo após a execução 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]?

Em outras palavras, por que isso não pode ser realizado upgrade?

Richard Rodriguez
fonte

Respostas:

328

Desde apt-geto manual :

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.

E com a aptferramenta mais recente disponível a partir do 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.

No seu caso particular, eu vejo, por exemplo, que linux-headersé um pacote virtual que é fornecido por ambos linux-headers-3.0.0-12e linux-headers-3.0.0-13e isso soa como o tipo de instalação e remoção do pacote tratado por dist-upgrade, mas não por upgrade.

jcollado
fonte
4
Não vejo full-upgradecomo opção apt-getno 14.04.1.
Nobar
Eu não sabia sobre aptquer, mas parece ser um comando completamente diferente e foi decorado de acordo com a página de homem que ele ligados
BlueWizard
18
@nobar Você não vê, porque é uma opção apte não de apt-get... :-) Tente man apt.
Hastur
Ok, pesquisei e o primeiro link que encontrei foi para o Ubuntu 15.10 (que foi lançado no final de 2014 e que é razoável com os testes de Jessie) manpages.ubuntu.com/manpages/wily/en/man8/apt.8.html
Z boson
6
@Zboson Sim, e 14.04 saiu não em 2011, mas em abril de 2014 ... veja o padrão?
tgies
137

apt-get upgradeé restrito ao caso em que os pacotes devem ser substituídos por versões mais recentes, mas nenhum pacote precisa ser adicionado ou removido. Uma nova versão do Firefox, por exemplo, deve ser instalada com apt-get upgrade.

No entanto, apt-get upgradese recusará a trabalhar quando houver adições ou remoções exigidas pelas versões atualizadas. Por exemplo, quando você tem o kernel linux-image-3.2.0-10-genericinstalado e linux-image-3.2.0-11-genericaparece, o linux-image-genericpacote é atualizado para depender da versão mais recente. Para instalar o novo kernel, você precisa executar apt-get dist-upgrade.

Observe como apt-get upgradealguém dirá que os pacotes do kernel foram held back. Essa é a dica para usar apt-get dist-upgrade.

pablomme
fonte
2
Perfeito! : D Mais duas perguntas ... o que é usado pelo gerenciador de atualizações gráficas no Ubuntu? Qual é o recomendado?
THPubs
11
O utilitário gráfico,, update-managernão usa apt-getdiretamente; em vez disso, trabalha com um back-end chamado aptdaemon. As habilidades padrão de update-managersão uma mistura dos modos upgradee dist-upgradede apt-get: ele pode adicionar, mas não remover pacotes - ele invoca a ferramenta "Atualização parcial" quando as remoções são necessárias. Ao usar a linha de comando, use apt-get upgrade. Se você vir que os pacotes foram "retidos", corra apt-get dist-upgradepara pegar as atualizações restantes.
Pablomme
33

Basicamente, a atualização atualizará apenas os pacotes existentes de uma versão para outra. Ele não instalará ou removerá pacotes, mesmo que isso seja necessário para atualizar outros. No caso de atualizações do kernel, atualizar o pacote linux-generic exige a instalação do novo pacote linux-3.0.0-13-generic, e como o upgrade se recusa a instalar ou remover pacotes, ele se recusa a atualizar o linux-generic.

Às vezes, várias incompatibilidades entre pacotes exigirão a remoção de alguns pacotes para atualizar outros, e isso também exigirá dist-upgrade. As atualizações do kernel sempre exigirão dist-upgrade por causa de como elas são tratadas. Em vez de ter um pacote de kernel atualizado, um pacote de kernel totalmente novo é criado a cada vez, e o metapacote do kernel é atualizado para depender do novo pacote de kernel e não do antigo. Isso foi feito para manter as versões antigas do kernel atualizadas, para que, caso haja um problema na inicialização do novo kernel, você possa escolher o antigo no menu de inicialização e se recuperar.

psusi
fonte
2
Melhor essência. Ainda assim, como manter um determinado pacote?
0xC0000022L 15/11
11

O apt-get upgradecomando normalmente instalará apenas atualizações (ou correções) nos pacotes atualmente instalados. Normalmente, uma nova versão do Mozilla Firefox , por exemplo, seria instalada com este comando.

No entanto apt-get upgrade, geralmente não instalará novos lançamentos, onde grandes alterações (incluindo remoção de pacotes ou atualização do GRUB são necessárias). Por exemplo, quando um novo kernel Linux (linux-image-3.xx-xx-generic, etc.) estiver disponível, o pacote não será instalado.

Para instalar o novo kernel, você precisará executar apt-get dist-upgrade. Você será notificado quando executar apt-get upgrade, pois dirá que certos pacotes foram retidos. Essa é a sua sugestão de usar: apt-get dist-upgrade.

david6
fonte
12
Isso é enganoso. dist-upgradenão atualizará para uma nova versão, a menos que sources.listtenha sido modificado de acordo (e mesmo assim, essa não é uma maneira suportada de atualização no Ubuntu). Quando um novo kernel é instalado dist-upgrade, essa não é uma nova versão do Ubuntu . É apenas um novo pacote. Além disso, a reivindicação "ou atualização do GRUB é necessária" é falsa. sudo apt-get upgradeé perfeitamente capaz de atualizar pacotes em uma situação em que o GRUB deve ser atualizado, desde que nenhum pacote seja removido e novos pacotes sejam instalados. update-grubé executado automaticamente, como sempre.
Elias Kagan #
2
Você deve escrever sua própria resposta, pois isso não adiciona clareza à minha.
David6 #
2
Além do que Eliah mencionou, o ponto essencial é que apt-get upgradenão irá remover ou adicionar pacotes. Se uma correção para um pacote exigir um novo pacote, a atualização será retida. A resposta de pablomme , que você revisou para ser menos precisa, é melhor e eu aconselho os leitores a irem a essa.
Chan-Ho Suh
1
Correção: apt-get upgradenunca instalará ou removerá nenhum pacote. As atualizações do kernel são empacotadas como novos pacotes e, como resultado, apt-get upgradenunca atualizarão o kernel. O fato de a atualização do kernel fazer alterações "importantes", como a configuração do GRUB, não é o motivo da diferença entre upgradee dist-upgrade.
Mikko Rantalainen 19/09/16
1

Sua melhor opção é:

apt full-upgrade

-que manipula automaticamente as dependências ao atualizar pacotes; enquanto que:

apt upgrade

NÃO manipula dependências automaticamente ao atualizar pacotes.

- duBtrotterS

Brett Maddox-Stroud
fonte