Como impedir a atualização de um pacote específico?

374

Por causa do bug # 693758, eu gostaria de impedir que o apt-get upgradeUpdate Manager atualize o pacote "libgtk2.0-0".

Como isso pode ser alcançado?

Ivan
fonte
@ hhlp: Mas esta pergunta está perguntando sobre um pacote que nunca foi instalado.
Nathan Osman
1
@ George Edison - Também existe um pacote que permite que você não atualize o pacote. Portanto, manter um pacote significa basicamente que você está dizendo ao gerenciador de pacotes para manter a versão atual, não importa o quê. Isso é útil se a versão mais recente de um programa atualmente em funcionamento for interrompida após uma atualização. (você não pode segurar um pacote que nunca foi instalado também ver a minha pergunta é a mesma) .... Eu testei isso agora - ver ele dissedisable packages from the auto-update
hhlp

Respostas:

554

Segurando

Existem quatro maneiras de reter pacotes: com dpkg, apt, aptitude ou dselect.

dpkg

Coloque um pacote em espera:

echo "<package-name> hold" | sudo dpkg --set-selections

Remova a retenção:

echo "<package-name> install" | sudo dpkg --set-selections

Exiba o status dos seus pacotes:

dpkg --get-selections

Exiba o status de um único pacote:

dpkg --get-selections | grep "<package-name>"

apto

Segure um pacote:

sudo apt-mark hold <package-name>

Remova a retenção:

sudo apt-mark unhold <package-name>

Mostrar todos os pacotes em espera:

sudo apt-mark showhold

dselect

Com o dselect, entre na tela [S] elect, encontre o pacote que deseja manter no estado atual e pressione =ou H. As alterações entrarão em vigor imediatamente após sair da tela [S] elect.


As abordagens a seguir são limitadas, pois o bloqueio / retenção de um pacote no aptitude ou no synaptic não afeta o apt-get / apt.

aptidão

Segure um pacote:

sudo aptitude hold <package-name>

Remova a retenção:

sudo aptitude unhold <package-name>

Bloqueando com o Synaptic Package Manager

Vá para Synaptic Package Manager (Sistema> Administração> Synaptic Package Manager).

Clique no botão de pesquisa e digite o nome do pacote.

Quando você encontrar o pacote, selecione-o e vá para o menu Package e selecione Lock Version .

Menu sináptico

Esse pacote agora não será exibido no gerenciador de atualizações e não será atualizado.

hhlp
fonte
4
Isso também funciona para impedir que um pacote seja instalado. Ao instalar devscripts, muitos pacotes são extraídos como pacotes recomendados. Como não preciso de um servidor de correio (postfix), eu poderia desativar a instalação executando echo postfix hold | sudo dpkg --set-selectionsantes de executar sudo apt-get install devscripts. Essa ação de retenção persiste apenas para esta instalação, após a instalação as seleções são redefinidas.
Lekensteyn
3
Também vale ressaltar, as retenções de pacotes quebram atualizações e patches às vezes criando uma situação em que não há solução legal que o apt possa calcular para uma dependência. Se o pacote foo tem uma dependência == <ou <= da libbar, o apt recusará a atualização da libbar, assim como da foo. Com o tempo, essas dependências em cascata podem crescer para bloquear um grande número de atualizações, incluindo importantes atualizações de segurança. Você precisará remover a retenção e permitir que a atualização ocorra ou reconstruir os pacotes que você está mantendo com versões mais recentes de suas dependências, se isso acontecer.
Stephanie
2
Apenas uma nota: apt-marknão suporta holdna versão 0.7.25 (Ubuntu Lucid)
Joril
1
Isso é especialmente útil ao tentar conter os drivers gráficos. Para usuários da ATI apt-mark hold fglrx fglrx-amdcccle fglrx-dev && aptitude hold fglrx fglrx-amdcccle fglrx-dev,.
earthmeLon
8
Atualmente, o synaptic e o aptitude apenas bloqueiam pacotes dentro desses programas. "Qualquer outra coisa que faça atualizações de pacotes (leia-se: Update Manager, apt-get, aptitude, etc) ignora isso." A partir desta pergunta .
Holocronweaver
44

Para colocar um pacote "foo" em espera:

echo "foo hold" | dpkg --set-selections

No seu caso, vamos colocar o vinho em espera:

sudo -i
echo "wine hold" | dpkg --set-selections

Para remover a retenção:

sudo -i
echo "wine install" | dpkg --set-selections
Pantera
fonte
Observe também que, enquanto um pacote está em espera, você pode instalar uma versão específica via apt-get install wine=1.2.3. Estar em espera impede que apt-get (dist-)upgradeseja alterado.
Rcoup 6/01/15
@rcoup Se você tem uma versão antiga em espera e depois atualiza manualmente para uma nova versão sem remover a espera conforme descreve, a versão antiga será mantida no cache para que você possa voltar a ela?
Cxrodgers
1
@cxrodgers o cache local (tipicamente /var/cache/apt/archives) é independente detém e atualizações e coisas, então todas as versões que você baixou estará lá até que seja executadoapt-get [auto]clean
rcoup
35

Eu estava procurando a mesma coisa e, depois de muita pesquisa, descobri que, usando a seguinte sintaxe, você pode proibir uma versão específica, mas permitir a próxima atualização:

Pacote: compiz-plugins-main
Pin: versão 1: 0.9.7.0 ~ bzr19-0ubuntu10.1
Prioridade de pinos: -1

Isso vai para o arquivo / etc / apt / preferências.

soger
fonte
9
Esta é uma maneira muito melhor do que impedir atualizações indefinidamente
Eero Aaltonen
Com este método, eu acho, as chances são maiores para evitar ubuntu 'adware' como Ubuntu One ou o ícone amazon de ser reinstalado com o upgrade próxima versão ...
Daniel Alder
19

Instale synapticusando sudo apt-get install synaptic.

Execute usando gksudo synaptice, na caixa de pesquisa, localize o pacote que você deseja bloquear, ou seja:gedit

insira a descrição da imagem aqui

No menu do pacote, selecione Bloquear versão :

insira a descrição da imagem aqui

E isso é tudo, a versão atualmente instalada no momento do bloqueio permanecerá instalada mesmo durante as atualizações.

Bruno Pereira
fonte
7
Por favor, olhe "A versão de bloqueio não é tão inteligente quanto parece. Deveria fazer o que diz na lata, bloquear a versão ... Mas ele só a trava no Synaptic. Qualquer outra coisa que faça atualizações de pacotes (leia-se: Gerenciador de Atualizações , apt-get, aptitude, etc) ignora isso. Esse é provavelmente um comportamento de buggy, portanto, espero que isso seja corrigido no tempo. " em askubuntu.com/questions/9607/what-does-lock-version-do . Qual é o estado atual? Se algo estiver bloqueado no Synaptic, outros gerenciadores de pacotes "honram" o bloqueio?
2
vasa1: A partir da versão 0.75.13, ainda não :( O mesmo problema com o aptitude. #
syockit 17/11/2012
16

Impedir a instalação de um pacote é chamado de "retenção de pacotes" e é muito simples:

eco package_name hold | dpkg --set-selections

... onde * package_name * é o nome do pacote que você deseja impedir a instalação.

Nota: o comando acima assume privilégios de root. Em outras palavras, você provavelmente precisará digitar sudo suantes de executá-lo.

RobotHumans
fonte
Perfeito, essa foi a resposta. Obrigado.
asoundmove
s/sudo su/sudo -s/g(ou sudo -i) ( -idará um shell de login, -snão).
11265 derobert
6

Como algum tempo apt-geté substituído por apt, por exemplo, quero impedir que o Firefox atualize para a versão acima de 56, porque muitos complementos, como "Grupos de guias " , não funcionam mais com o novo Firefox 57 (consulte "Extensões da Web" Atualizar").

É possível armazenar mais de um pacote com um comando e usar caracteres curinga.

Impedir a atualização do Firefox

sudo apt-mark hold firefox firefox-locale-*

Se você desejar desestabilizá-los mais tarde, esse seria o comando:

sudo apt-mark unhold firefox firefox-locale-*
rubo77
fonte
4

Eu acho que você pode congelar a versão de um pacote específico. Não tenho 100% de certeza se isso irá alterar o apt-get, mas definitivamente interromperá o gerenciador de atualizações.

Para congelar um pacote, selecione-o no synaptic, abra o menu do pacote e selecione congelar versão.

Espero que isto ajude

edit: Esta questão 16668 trata de uma situação semelhante

Allan
fonte
3

Veja os erros # 75332 , # 158981 e # 72806 .

O resumo é que a retenção no nível apt-get / aptitude não está ativando o status de espera no dpkg (consulte o bug 72806 especialmente) e o update-manager lê o status no dpkg.

solução alternativa é executada como raiz: echo "package hold" | dpkg --set-selections

jaspe
fonte
2

Você pode usar no aptitude a "substituição específica", assim:

aptitude reinstall ~i oracle-java8-jre:

Este é um uso único de (não armazenado para futuras reinstalações), mantenha substituição específica, para reinstalar todos os pacotes em seu sistema, mas não o oracle-java8-jre.

Se você usar uma substituição específica do keep, o pacote ficará momentaneamente em um estado de keep que o aptitude não tentará instalá-lo.

Uma coisa muito boa se você acha que seu sistema foi comprometido de alguma forma.

cabonamigo
fonte
1

Se você tiver o Synaptic instalado, poderá selecionar o pacote e usar o menu Pacote -> Bloquear versão para impedir que ele seja atualizado.

Você pode instalar o Synaptic com o sudo apt-get install synaptic. Pessoalmente, acho mais útil do que o Centro de Software ... então, sou bastante velho. :)

dinchamion
fonte
0

Ocasionalmente, pode-se querer reter todos os pacotes atualmente instalados. Aqui está como.

Primeiro salve o estado atual, para que você possa desfazer:

dpkg --get-selections > current_selections.txt

Então, para reter todos os pacotes:

dpkg --get-selections | sed -r "s/\tinstall/hold/" |dpkg --set-selections

Por fim, quando você quiser voltar ao estado anterior:

dpkg --set-selections < current_selections.txt

Um caso de uso para isso pode ser ao criar um instantâneo de VM ou Amazon AMI para migrar de um QA para um ambiente de produção.

JVW
fonte
0

Adicionando detalhes aos comentários de @ soger em relação ao Ubuntu 16.04.

O Ubuntu 16.04 não possui um arquivo / etc / apt / preferências existente por padrão. Se você não possui um atualmente, basta criar um novo arquivo e preenchê-lo com uma sub-rotina como o @soger descreve acima para excluir o pacote fornecido e suas dependências das atualizações.

Depois, corra apt updatee você é GTG. : 0)

Por exemplo, eu tenho um servidor Ubuntu 16.04.5 LTS com placa de vídeo Intel incorporada e uma placa NVidia. A placa NVidia é a única usada. O servidor também usa drivers CUDA. Eu tive um problema em que aptinsistia

va-driver-all

(Drivers Intel) exigiu uma atualização, mas não foi possível determinar qual versão instalar. Isso estava me deixando louco, e eu não precisava dos drivers da Intel. Digitei este texto no arquivo de preferências e liberado o apt, problema resolvido.

Package: va-driver-all
Pin: release *
Pin-Priority: -1
Sr Cabeça de Batata
fonte