Como excluir um pacote específico do apt-get upgrade

Como excluir um pacote específico do apt-get upgrade

Ao trabalhar em alguns projetos, às vezes você precisa da estabilidade do seu ambiente. A atualização de um pacote pode fazer com que todo o projeto falhe. Às vezes, nós atualizamos acidentalmente esses pacotes e isso cria um problema grave no servidor. É por isso que pode ser importante manter uma versão específica de um pacote. Este artigo vai mostrar como excluir um pacote específico da atualização no Ubuntu 16.04.

1) Excluir pacotes com alguns comandos

Existem alguns métodos diferentes para excluir ou manter um pacote específico durante a atualização completa do sistema. É possível marcar um pacote como retido. Neste artigo, usaremos o pacote virtualbox para nossos exemplos. Você pode ver a versão instalada:

dpkg -l | grep virtualbox
ii  virtualbox    5.0.18-dfsg-2build1   amd64   x86  virtualization solution - base binaries

Agora você pode ver que temos uma versão atualizada disponível:

apt list --upgradable
Listing... Pronto
virtualbox/xenial-updates 5.0.40-dfsg-0ubuntu1.16.04.2 amd64 [upgradable from: 5.0.18-dfsg-2build1]

Você pode marcar os pacotes usando os comandos abaixo:

apt-mark

Você pode usar o comando apt-mark seguido da opção hold. Isso impedirá que o pacote seja automaticamente instalado, atualizado ou removido. A sintaxe é como esta:

apt-mark hold pacote

Na prática, é assim:

apt-mark hold virtualbox
virtualbox marcado para manter.

Você pode verificar com o apt upgrade:

apt upgrade
Lendo listas de pacotes... Pronto
Construindo árvore de dependências 
Lendo informação de estado... Pronto
Calculando atualização... Pronto
Os pacotes seguintes foram mantidos:
    virtualbox
0 pacotes atualizados, 0 pacotes novos instalados, 0 a serem removidos e 0 não atualizados.

Você pode ver que não é possível atualizar o pacote. Para desmarcar, use a sintaxe:

apt-mark unhold pacote

Na prática, é assim:

apt-mark unhold virtualbox
Cancelou manter em virtualbox.

dpkg

Você também pode usar o comando dpkg --set-selection para marcar o pacote. A sintaxe é esta:

echo " hold" | dpkg --set-selections

Na prática, é isto aqui:

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

Você não possui nenhum retorno que mostre o resultado. Então, verifique diretamente com uma atualização:

apt upgrade
Lendo listas de pacotes... Pronto 
Construindo árvore de dependências Lendo informação de estado... Pronto 
Calculando atualização... Pronto 
Os pacotes seguintes foram mantidos: 
    virtualbox 
0 pacotes atualizados, 0 pacotes novos instalados, 0 a serem removidos e 0 não atualizados.

Funcionou 🙂

Agora, para desmarcar, o comando é diferente e respeita a sintaxe:

echo "pacote instalado" | sudo dpkg --set-selections

Use-o assim:

echo "virtualbox install" | dpkg --set-selections

Novamente, você não terá nenhum retorno na tela. Como estamos utilizando usuário root, não estamos usando o sudo.

aptitude

Você ainda pode utilizar o comando aptitude. Por padrão, este comando não está presente no sistema, então você precisa instalar com o comando abaixo:

apt install aptitude

Para marcar um pacote com o aptitude, utilize a sintaxe:

aptitude hold pacote

Quando você marca um pacote com aptitude, assim como o dpkg, também não terá nenhum retorno na tela.

aptitude hold virtualbox
Nenhum pacote será instalado, atualizado ou removido.
0 pacotes atualizados, 0 novos instalados, 0 a serem removidos e 0 não atualizados.
É preciso obter 0 B de arquivos. Depois do desempacotamento, 0 B serão usados.

Se você verificar o resultado com um aptitude upgrade, você não terá nenhuma menção de um pacote marcado, mas terá se tentar pelo apt upgrade.

Você pode cancelar a marcação com a sintaxe:

aptitude pacote unhold

Assim:

aptitude unhold virtualbox
Nenhum pacote será instalado, atualizado ou removido.
0 pacotes atualizados, 0 novos instalados, 0 a serem removidos e 0 não atualizados.
É preciso obter 0 B de arquivos. Depois do desempacotamento, 0 B serão usados.

dselect

Você pode usar o comando dselect que é um front-end para dpkg, usado para gerenciar pacotes de software em distribuições Debian e baseadas em Debian. Não está presente por padrão, então você precisa instalá-lo:

apt install dselect

Inicie o comando:

dselect

Você terá no terminal o seguinte:

Interface do gerenciador de pacotes do Debian 'dselect' versão 1.18.4 (amd64).

 0. [A]cesso Escolher o método de acesso a usar. 
 1. [U]pdate Atualizar lista de pacotes disponíveis, se possível.
*2. [S]eleciona Solicita quais pacotes você quer em seu sistema.
 3. [I]nstalar Instalar e atualizar pacotes desejados.
 4. [C]onfigura Configurar quaisquer pacotes que estejam desconfigurados.
 5. [R]emover Remover programas indesejados.
 6. [Q]Sair Sair do dselect.

Mova-se com ^P e ^N, teclas direcionais, letras iniciais, ou dígitos;
Pressione <enter> para confirmar a seleção. ^L redesenha a tela.

Copyright (C) 1994-1996 Ian Jackson.
Copyright (C) 2000,2001 Wichert Akkerman.
Este é um software livre; veja a Licença Pública Geral GNU (GPL) versão 2 ou
superior para ver as condições de cópia. NÃO há garantias.

Marque a opção 2 apertando a tecla S ou o número 2, você será direcionado para a ajuda, leia e caso queira sair, aperte a tecla espaço.

Você pode consultar um pacote utilizando /. Após encontrar o pacote, aperte a tecla = ou H para manter o pacote.

Você pode conferir utilizando o comando apt upgrade:

apt upgrade 
Lendo listas de pacotes... Pronto 
Construindo árvore de dependências 
Lendo informação de estado... Pronto 
Calculando atualização... Pronto 
Os pacotes seguintes foram mantidos: 
    virtualbox 
0 pacotes atualizados, 0 pacotes novos instalados, 0 a serem removidos e 0 não atualizados.

Se quiser desmarcar um pacote, utilize o + ao invés de H ou =, fazendo com que apareçam 3 asteriscos no pacote.

2) Bloquear o pacote usando arquivos de configuração apt

Uma outra forma de marcar o pacote, é editar o arquivo /etc/apt/preferences. Para não atualizar um pacote ao atualizar todo o sistema, devemos definir uma prioridade para a apt < 0, se o arquivo não exisitr, você deve criá-lo. Você precisa respeitar a sintaxe abaixo:

Package: <nome-do-pacote> ('*' for all packages)

Pin: release * (o=Ubuntu para Origem do SO)

Pin-Priority: -1

Na linha Pin release, você pode adicionar o oiriginador dos pacotes e para os números em Pin-Priority, um número maior significa mais preferência e -1 é igual a ignorar esse pacote. Existem algumas outras opções que poder utilizadas.

Para bloquear o pacote do virtualbox, edite o arquivo conforme abaixo:

Package: virtualbox
Pin: release o=Ubuntu
Pin-Priority: -1

Salve e saia. Isso é tudo o que você precisa para bloquear o pacote. Para excluir o pacote, você pode comentar as linhas do arquivo ou simplesmente excluir o arquivo.

Você pode ver que é possível usar alguns métodos para bloquear um pacote. Isso pode ser útil para manter a versão estável do seu projeto. Você pode escolher o seu método preferido. Você não precisa usar dois ou mais métodos para o mesmo objetivo.