Como reter pacotes com apt-get em Debian e Ubuntu

Olá! a actualizar os pacotes, por vezes pode ter problemas se alguns pacotes forem actualizados. Pode querer impedir que um determinado pacote seja actualizado, mas como é que mantém pacotes no Debian e Ubuntu Linux para impedir que um pacote específico seja actualizado?  Poderá querer bloquear actualizações de pacotes para que os pacotes não sejam actualizados através do apt/apt-get.

Em Debian ou Ubuntu Linux podemos reter ou bloquear pacotes usando as opções de comando apt, apt-mark, aptitude, dpkg e dselect. Temos múltiplas opções, vejamos, na minha opinião, as mais úteis.

Retenção de pacotes ao usar o apt-get/apt (método 1)

Normalmente executamos os dois comandos seguintes para actualizar todos os pacotes:

root@host# sudo apt update && sudo apt upgrade

Ou também:

root@host# sudo apt-get update && sudo apt-get upgrade

Passo 1 – Lista de actualizações disponíveis

Executar o comando apt:

root@host# sudo apt list --upgradable

Passo 2 – Forçar o apt-get a reter o pacote chamado php7.4 usando a marca apt

Passar a opção de hold ao comando apt-mark como se segue para marcar um pacote como retido, o que impedirá que o pacote seja instalado, actualizado ou removido automaticamente:

root@host# apt-mark hold PACKAGE

Neste caso:

root@host# apt-mark hold php7.4
php7.4 set on hold.
root@host# 

Passo 3 – Mostrar uma lista de pacotes de espera

Agora para imprimir a lista de pacotes bloqueados:

apt-mark showhold

Passo 4 – Cancelar a retenção

Quer cancelar um adiamento que já tenha feito num pacote? Pode fazê-lo desta forma:

root@host# apt-mark unhold PACKAGE

No nosso caso:

root@host# apt-mark unhold php7.4

Como evitar uma actualização do pacote com o comando dpkg
comando (método 2)

El paquete debe estar instalado para ponerlo en espera cuando se utiliza el método dpkg. De lo contrario, obtendrá un error como el siguiente:

dpkg: warning: package not in status nor available database at line 1: PACKAGE

Ou talvez:

dpkg: warning: found unknown packages; this might mean the available database
is outdated, and needs to be updated through a frontend method;

Podemos colocar um pacote em espera da seguinte forma:

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

Usando o mesmo pacote php7.4 para o exemplo:

root@host#  echo "php7.4 hold" | dpkg --set-selections

 

Obter o estado dos pacotes

dpkg --set-selections PACKAGE_NAME

Ou também:

dpkg --set-selections | grep PACKAGE_NAME

Desbloqueio de um pacote

Para remover a fechadura de um pacote:

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

Usando o mesmo pacote php7.4 para o exemplo:

root@host#  echo "php7.4 install" | dpkg --set-selections

Bloqueio de actualização do pacote com o comando de aptitude (método 3)

Ao contrário do anterior, este método funciona tanto com pacotes instalados como com pacotes desinstalados.

Para colocar um pacote na lista negra, é necessário executar o seguinte comando:

aptitude hold PACKAGE

Seguindo os exemplos acima, com o pacote php7.4 seria:

root@host# aptitude hold php7.4

Podemos também impedir que um pacote seja actualizado para uma determinada versão, ao mesmo tempo que permitimos actualizações automáticas para versões futuras. Isto é útil, por exemplo, para evitar que uma versão indesejada de um pacote seja instalada. Imagine que temos php=7.4.2 e não queremos actualizar para php=7.4.4.4 porque tem um bug de segurança (é inventado, não verifiquei se é verdade). Podemos impedi-lo de se actualizar desta forma:

aptitude forbid-version PACKAGE=VERSION

Por outras palavras (é uma versão inventada do pacote:

aptitude forbid-version php7.4=7.4.4-0ubuntu2.10

Depois de bloquear um pacote das formas acima referidas, se executar o comando de actualização de aptitude e detectar actualizações para o pacote retido, verá algo semelhante a isto:

30 packages upgraded, 0 newly installed, 0 to remove and 1 not upgraded.

 

Deixe uma resposta