“Os seguintes pacotes foram mantidos em sigilo:” Por que e como resolvo isso?

877

Acabei de adicionar um repositório PPA para a versão de desenvolvimento do GIMP, mas recebo este erro:

$ apt-get update && apt-get upgrade
...
The following packages have been kept back:
  gimp gimp-data libgegl-0.0-0 libgimp2.0

Por que e como posso resolvê-lo para que eu possa usar a versão mais recente em vez da que tenho agora?

jfoucher
fonte
17
A rigor, eu diria que isso é um aviso, não um erro.
Kazark 16/11/11

Respostas:

905

De acordo com um artigo no debian-administration.org ,

Se as dependências foram alteradas em um dos pacotes que você instalou para que um novo pacote seja instalado para executar a atualização, isso será listado como "retido".

Solução cautelosa 1:

De acordo com a resposta de Pablo , você pode executar sudo apt-get --with-new-pkgs upgradee ele instalará os pacotes ocultos.

Isso tem o benefício de não marcar os pacotes ocultos como "instalados manualmente", o que poderia forçar mais intervenção do usuário na linha (consulte os comentários).

Se a solução de Pablo funcionar para você, faça um voto positivo. Caso contrário, comente o que deu errado.

Solução cautelosa 2:

A solução cautelosa é executar sudo apt-get install <list of packages kept back>. Na maioria dos casos, isso dará aos pacotes ocultos o que eles precisam para atualizar com êxito.

Solução agressiva:

Uma solução mais agressiva é executar sudo apt-get dist-upgrade, o que forçará a instalação dessas novas dependências.

Mas dist-upgrade pode ser bastante perigoso . Ao contrário da atualização, ele pode remover pacotes para resolver situações complexas de dependência. Diferentemente de você, o APT nem sempre é inteligente o suficiente para saber se essas adições e remoções podem causar estragos.

Portanto, se você se encontra em um lugar onde a "solução cautelosa" não funciona, dist-upgrade pode funcionar ... mas é melhor você aprender um pouco mais sobre o APT e resolver os problemas de dependência "manualmente" instalando e removendo pacotes caso a caso.

Pense nisso como consertar um carro ... se você tiver tempo e for útil com uma chave inglesa, ficará tranqüilo lendo e fazendo o reparo sozinho. Se você estiver com sorte, pode deixar seu carro com sua prima dist-upgradee torcer para que ela saiba tudo.

Michael Crenshaw
fonte
180
Como essa é uma resposta aceita, ela realmente precisa ser atualizada para avisar sobre o uso dist-upgradeem um sistema estável, como muitas das outras respostas abaixo indicaram. Pessoalmente acho que há uma resposta simples / mais seguro que precisa promovido: apt-get install <lista de pkgs>
Cas
7
Cas, devo apenas acrescentar que poderia ser perigoso executar uma dist-upgrade em um sistema estável? Por que exatamente isso é perigoso? (Eu honestamente não sei apt muito bem.)
Michael Crenshaw
17
Há uma resposta de falha do servidor que explica a dist-upgrade com mais detalhes. Eu acho que vale a pena esclarecer (não é perigoso como tal) que ele pode atualizar todo o sistema, o que pode estar além do que o usuário espera / quer, ou seja, no exemplo do OP, eles estão se perguntando por que o gimp está sendo retido.
Cas
19
Observe que sudo apt-get dist-upgradetambém pode remover pacotes. Consequentemente, é melhor sempre inspecionar a lista de alterações que serão feitas antes de concordar com elas, durante a execução sudo apt-get dist-upgrade.
Elias Kagan
6
@EliahKagan Posso acrescentar que até apt-get upgradeposso remover pacotes? Ele sempre fará isso quando houver um conflito de versão caso contrário. Pense em llvm3.6vs. llvm3.6v5(com o "v5" significa que ele foi compilado gcc 5). Esses dois não podem coexistir , apenas um dos dois pode ser mantido no sistema. Então sim dist-upgradepode remover alguns pacotes também, mas não é só dist-upgradeisso que faria isso; sob certas circunstâncias, upgradetambém.
Syntaxerror 12/12/15
500

Sempre que você receber do comando apt-get upgradea mensagem

The following packages have been kept back:

então, atualizar um ou todos os pacotes mantidos em sigilo, sem fazer uma atualização de distribuição (é isso que dist-upgradefaz, se bem me lembro) é emitir o comando:

apt-get install <list of packages kept back>

isso resolverá os problemas ocultos e solicitará a instalação de pacotes adicionais etc., conforme explicado por outras respostas.

user88285
fonte
3
Quando os pacotes são retidos dessa maneira e eu manualmente apt-get upgrade <list of packages>, se refizer apt-get upgrade, ele listará os pacotes em questão como não mais necessários e que eu posso usar apt autoremovepara removê-los, o que faço, e então um último apt-get upgradee eles não serão mais listados como retido ... Muito estranho. Alguma ideia?
Cram2208
Será apt-get installtambém remover pacotes quando necessário para resolver situações de dependência retorcidas, ou você teria que executar um separado apt-get removede comando para realizar essa parte do processo de upgrade?
Michael Crenshaw
@ cram2208 Acredito que esse seja o comportamento esperado. Os pacotes que foram "instalados automaticamente e não são mais [...] necessários" são as versões anteriores dos pacotes atualizados, que agora não são mais necessários. apt autoremoveremove essas dependências não utilizadas.
Alex
3
Se a atualização exigir que um novo pacote seja instalado, o pacote será "retido". Primeiro considerar o uso: sudo apt-get --with-new-pkgs upgradeo que não tem lado afeta de causar pacotes para ser marcado como instalado manualmente
l --marc l
@ mac9416 sim, sim.
Jarno
174

apt-get dist-upgrade é perigoso para ambiente estável,

  1. configuração source.list errada e você acaba com o ubuntu quebrado.
  2. você pode atualizar todo o aplicativo para a versão que não deseja.

Caso de uso: atualização do kernel retida, você apenas deseja atualizar o kernel, não deseja atualizar a distribuição inteira.

Melhor maneira de lidar com pacotes retidos:

sudo aptitude

Se você reteve o pacote, deverá ver Pacotes Atualizáveis ​​no topo da lista.

  • Hit + nessa lista
  • Aperte g duas vezes
  • Responda debconf stuff se solicitado
  • Pressione retornar para continuar
  • Pressione Q
  • Pressione sim

Seu pacote mantido de volta instalado.

Michael Crenshaw
fonte
34
apt-get dist-upgradesó é perigoso se você tiver repositórios ruins no /etc/apt/sources.list*. É bom estar ciente de que dist-upgradeatualiza todos os pacotes, mas com os repositórios padrão, isso deve ser bom. Não usar dist-upgradepode ser perigoso, pois você pode perder as atualizações de segurança.
Flimm
6
apt-get dist-upgradepode remover e adicionar pacotes, mas não é realmente perigoso. Qualquer comando de instalação de pacote pode causar sérios danos se você tiver problemas no seu sources.listarquivo ! Um apt-get upgradecomando regular instalará qualquer pacote de qualquer fonte de software ativada; dist-upgradenão é único dessa maneira. Além disso, usar aptitudepara executar qualquer operação, pelo menos no amd64, é muito mais perigoso do que executar apt-get dist-upgrade, em uma versão em que o bug 831768 não foi corrigido.
Eliah Kagan 22/03
Para mim, foi mais fácil (máquina local com o X em execução) abrir o synaptic e forçar a atualização do pacote. Por alguma razão, não pareceu aparecer em tudo o que você descreveu em sináptico.
djvs
3
Tambémsudo aptitude safe-upgrade
msanford 19/16
146

Por que você não tenta esta resposta do Unix SE :

sudo apt-get --with-new-pkgs upgrade

Isso permite que novos pacotes sejam instalados. Isso permitirá que você saiba quais pacotes serão instalados e avise você antes de realmente fazer a instalação.

aptcomando ( alternativa amigável a apt-get) compartilhe esta opção.

Usar em apt install <pkg>vez disso marcará o pkg como "instalado manualmente" !! Para marcá-lo novamente como uso "instalado automaticamente" apt-mark auto <pkg>(consulte também o subcomando showmanual). Mais informações sobre esta resposta .

Pablo A
fonte
20
+1 porque não tem efeito colateral de fazer com que os pacotes sejam marcados como instalados manualmente.
ctrl-alt-Delor
1
Observe para quem já leu meu comentário acima: não é bom ter o efeito colateral de marcar como instalado manualmente. Eu gosto desta resposta.
Ctrl-alt-delor
1
Sim. apt-mark auto <pkg>só deve ser necessário marcar um pacote como sendo instalado automaticamente ( aqui a página de manual ).
Pablo A
11
Por algum motivo, sudo apt-get --with-new-pkgs upgradeainda mostra os pacotes como "retidos". Nenhuma mensagem de erro.
Franklin Yu
2
Só quero acrescentar que, para muitas instâncias atualizadas do servidor debian 9.6, essa foi a solução mais segura sem quebrar as coisas. Obrigado por isso, Pablo, como eu já havia testado outras opções em ambientes de teste com sorte e pude administrar muitos servidores com padrões de segurança, graças à inclusão --with-new-pkgs com resultados muito mais limpos para o gerenciamento geral de pacotes futuros. Realmente, esta resposta do UNIX SE deve ser votada!
Julius
34

Normalmente, existem dois motivos pelos quais você pode ver esta mensagem.

Se a atualização do programa (via sudo apt-get upgrade) causar a adição ou remoção de pacotes, o programa será retido. Você pode usar sudo apt-get dist-upgradeneste caso, que oferecerá adicionar ou remover os programas adicionais.

Isso é bastante comum e geralmente não é um problema. Ocasionalmente (particularmente durante um alfa do Ubuntu), uma dist-upgradeoferta é para remover muitos outros programas, caso em que você provavelmente deseja cancelá-lo.

Se o programa depender de pacotes ou versões que não estão disponíveis, o programa será retido. Você realmente não pode fazer nada além de esperar nessa circunstância, pois o pacote é basicamente desinstalável. Isso pode acontecer quando os pacotes são adicionados ao repositório fora de ordem, quando um pacote é renomeado ou quando um pacote para de fornecer um pacote virtual.

jbowtie
fonte
5
Existe uma maneira de determinar se o pacote retido precisa de uma dependência que não pode ser instalada ou se está sendo retido porque outros pacotes dependem dele. Eu tenho muitos pacotes retidos e acredito que ambos os casos possam ser aplicados no meu sistema.
Jake
Obrigado, o segundo motivo foi o problema para mim. Até se apt-get dist-upgraderecusou a instalá-lo. A inspeção do pacote com o aptitude mostrou que depende de um pacote que não está disponível. Acho que vou ter que esperar.
jlh
23

Você também pode tentar:

sudo aptitude safe-upgrade.

É mais seguro do que full-upgrade(originalmente chamado dist-upgrade) porque "os pacotes não serão removidos a menos que não sejam utilizados".

De man aptitude:

atualização segura

Atualiza os pacotes instalados para a versão mais recente. Pacotes instalados não serão removidos, a menos que não sejam utilizados /.../ Pacotes que não estão instalados no momento podem ser instalados para resolver dependências, a menos que a opção de linha de comando --no-new-installs seja fornecida.

Afilu
fonte
21

Muito provavelmente, esses pacotes são retidos porque sua instalação criaria inconsistências de dependência. Isso pode acontecer porque você está usando arquivos em desenvolvimento ativo, ppas ou porque o espelho que você usa não está totalmente atualizado.

No último caso, aguarde, quando as dependências forem resolvidas, elas serão instaladas na próxima vez.

Editar:

Há outra possibilidade: os pacotes podem ser retidos se houver uma retenção neles ou se forem fixados.

txwikinger
fonte
Em que você baseia essa probabilidade, sem saber o que ele executou no apt-get upgrade ou no apt-get dist-upgrade (alt. Os equivalentes do aptitude)?
andol 31/07
este é o problema mais ocorrendo em questões de suporte e bugs
txwikinger
Acordado. Você provavelmente deve esperar e checar suas apt_preferences. Isso geralmente é causado por arquivos de desenvolvimento em que as dependências dos pacotes e disponíveis estão mudando muito rapidamente. Espere que eles se acalmem e talvez você não precise dist-upgrade. Se você ainda desejar dist-upgrade, observe os NOVOS pacotes a serem instalados e os pacotes a serem removidos antes de prosseguir.
Umang
Este é o meu caso porque eu obter o "retido" mensagem usando dist-upgrade
Postadelmaga
Nos casos em que este problema é devido a uma messup com preferências do APT (pinagem), eu encontrei reinstalação dos pacotes mantidos me ajudou: apt-get install --reinstall <packages>.
tanius
9

Isso geralmente ocorre porque o pacote adicionou uma dependência e a atualização não deseja adicioná-lo para você sem permissão.

Se você executar:

sudo apt-get install gimp gimp-data libgegl-0.0-0 libgimp2.0

Em seguida, as novas versões devem ser instaladas juntamente com sua nova dependência.

John Lawrence Aspden
fonte
Atualiza pacotes específicos (e suas dependências) sem o comprometimento (riscos) de um dist-upgrade.
John Mee
8

Isso funcionou para mim

sudo aptitude full-upgrade
Singh
fonte
Até aptitude upgradetrabalhou para mim.
Bibhas
Estou usando Ubuntu 14.04e não tenho aptitudelinha de comando
ahmed hamdy 31/03
apt-get dist-upgrademe deu a mesma mensagem, mas isso resolveu para mim. Eu tinha um pacote que estava quebrando a atualização de outro pacote. Eu não precisava do que instalei, então aptitude full-upgrademe deu a opção de removê-lo para que ele pudesse atualizar todo o resto.
precisa saber é o seguinte
6

Eu descobri que o aptitude faz um trabalho melhor na atualização de pacotes se as versões diferirem apenas um pouco. Eu tive uma situação como esta:

me@compy:/etc/apt$ apt-cache policy gzip
gzip:
  Installed: 1.3.5-15
  Candidate: 1.3.5-15+etch1
  Version table:
     1.3.5-15+etch1 0
        500 http://archive.debian.org etch/main Packages
 *** 1.3.5-15 0
        100 /var/lib/dpkg/status

Isso fez com que o apt-get retivesse a atualização, mas o aptitude a atualizou muito bem. Não tenho certeza de qual algoritmo é usado para determinar se um pacote deve ser atualizado ou não. Eu acho que esses dois tinham a mesma versão, apenas um 'qualificador' diferente. Mas, em qualquer caso, o apt-get não o atualizaria, mas o aptitude o faria.

Alexander Torstling
fonte
4

No meu caso, os pacotes retidos eram aqueles relacionados a linux-headers e kernel. Cheguei a isso tentando resolver um problema com um ponto de exclamação vermelho na área de notificação e não conseguindo atualizar pacotes.

Para resolvê-lo, não precisei usar o dist-upgrade nem o manual apt-get install xxx .

O que fiz e ajudou foi simples e limpo :

sudo apt-get update
sudo apt-get autoremove
sudo apt-get autoclean
sudo apt-get upgrade

Eu tive que confirmar manualmente a atualização do Grub e sua configuração.

Depois, trabalhei com o computador por um tempo e, em seguida, o diálogo de atualização padrão apareceu novamente, finalmente, incluindo a seção "Ubuntu base" com o kernel e afins. A atualização foi realizada sem problemas e não vejo mais nenhum pacote retido.

Além disso, é muito importante manter em mente que essas atualizações * buntu incluindo atualizações do kernel são sensíveis à hibernação - Eu tenho esse problema várias vezes e eu sempre obtê-lo resolvido reiniciando a máquina e executar as etapas acima.

Então, talvez isso seja suficiente ?!

(a situação descrita aqui está relacionada ao meu Xubuntu 15.10 no final de dezembro de 2015)

Crysman
fonte
3

Encontrei este problema quando um novo kernel foi lançado. (Possivelmente porque tenho atualizações instáveis ​​ativadas.) Encontrei a maneira mais simples de fazer a instalação através do instalador gráfico do Ubuntu ( update-manager).

Kazark
fonte
2

Corri para esse problema usando o sináptico porque parecia travar e, para tentar corrigir isso, reinicializei e tentei novamente.

Descobri uma mensagem informativa como parte do pacote com algumas instruções pós-instalação para mim.

Eu tive que clicar em " detalhes " e, em seguida, ' q ' para sair depois de ler a mensagem, e as coisas prosseguiram normalmente.

Vista elíptica
fonte
2

Parece a maneira correta de reinstalar o pacote mantido de volta:

apt-get install --reinstall libjpeg-progs

Pelo menos isso funcionou para mim quando fiquei libjpeg-progspreso após a atualização do Ubuntu 14.04 para 16.04. Tenho certeza de que você pode fazer o mesmo com qualquer outro aplicativo escondido, por exemplo gimp.

Fonte: https://ubuntuforums.org/showthread.php?t=2321702&p=13476183#post13476183

Stephan Henningsen
fonte
1
Você poderia fazê-lo sem --reinstalltambém.
jarno 26/01
O engraçado é que ele remove o pacote libjpeg-turbo-progs.
Jarno
1

De fato, a opção que você precisa é dselect-upgradeque instala / remove dependências para o conjunto de pacotes específico envolvido.

Johnny
fonte
1

Eu li todos os posts e descobri que existem muitas explicações interessantes. Eu estava tentando todos eles, mas não obtive nenhum resultado completamente. Eu tenho um problema com o mysql-utilities que não consegui atualizar. A atualização foi proposta pelo sistema. Então, eu quero mostrar algumas etapas para fazê-lo. Obviamente, repetirei em alguns momentos todas as postagens mencionadas acima. Aqui está o meu erro, sim, eu o encontrei por postagens já existentes, mas o que devo fazer a seguir? insira a descrição da imagem aqui

O próximo passo é:

sudo apt-get --purge remove mysql-utilities

Os resultados que podemos ver na imagem abaixo. Eu removo o pacote e verifico isso por comando:

sudo apt-get -f install

Resultados - Tudo bem! Mais tarde, instalei esta nova versão do pacote corretamente. insira a descrição da imagem aqui

Dessa forma, acho que pode ajudar mais pessoas novas, porque, com outros pacotes, podemos executar os mesmos passos.

Uma vez, me desculpe, quando repeti em alguns lugares outras postagens.

Vasyl Lyashkevych
fonte
5
Não use capturas de tela para o texto do terminal, pois isso o torna inacessível pelo Google e ilegível para algumas pessoas. Em vez disso, cole o texto do terminal na sua resposta, selecione esse texto e pressione o {}botão no editor para formatá-lo corretamente.
Chai T. Rex
@ ChaiT.Rex Obrigado pelas observações, vou levá-lo em opinião para o futuro.
Vasyl Lyashkevych
1

O Ubuntu 18.04 fornece uma sintaxe mais recente e simplificada, através da aptqual pode ser usado em vez de apt-get.

sudo apt full-upgrade

sudo apt upgradeé usado para instalar atualizações disponíveis de todos os pacotes atualmente instalados no sistema a partir das fontes configuradas via sources.list (5). Novos pacotes serão instalados, se necessário, para satisfazer dependências, mas os pacotes existentes nunca serão removidos. Se uma atualização para um pacote exigir a remoção de um pacote instalado, a atualização para este pacote não será executada.

sudo apt full-upgrade executa a função de atualização, mas remove os pacotes atualmente instalados, se necessário para atualizar o sistema como um todo.

l --marc l
fonte