Como retener paquetes con apt-get en Debian y Ubuntu

¡Hola! Actualizando paquetes, en ocasiones puedes tener problemas si se actualizan algunos paquetes. Puede que quieras evitar que se actualice cierto paquete, pero ¿Cómo retener los paquetes en un Linux Debian y Ubuntu para evitar la actualización de un paquete especifico?  Es posible que queramos bloquear actualizaciones de paquetes para que estos no se actalicen mediante apt/apt-get.

En Debian o Ubuntu Linux podemos retener o bloquear paquetes usando las opciones de los comandos apt, apt-mark, aptitude, dpkg y dselect. Tenemos multiples opciones, vamos a ver, a mi parecer las mas utiles.

Retención de paquetes al usar apt-get/apt (método 1)

Normalmente ejecutamos los dos siguientes comandos para actualizar todos los paquetes:

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

O también:

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

Paso 1 – Lista de actualizaciones disponibles

Ejecuta el comando apt:

root@host# sudo apt list --upgradable

Paso 2 – Forzar a apt-get a retener el paquete llamado php7.4 usando el apt-mark

Pasa la opción hold al comando apt-mark de la siguiente manera para marcar un paquete como retenido, lo que impedirá que el paquete se instale, actualice o elimine automáticamente:

root@host# apt-mark hold PACKAGE

En este caso:

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

Paso 3 – Mostrar una lista de paquetes en espera

Ahora para imprimir la lista de paquetes bloqueados:

apt-mark showhold

Paso 4 – Cancelar la retención

¿Quieres cancelar una retención que has hecho en un paquete anteriormente? Puedes hacerlo así:

root@host# apt-mark unhold PACKAGE

En nuestro caso:

root@host# apt-mark unhold php7.4

Cómo impedir la actualización de un paquete con el comando dpkg

(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

O quizás:

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

Podemos poner un paquete en espera de la siguiente manera:

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

Utilizando para el ejemplo el mismo paquete de php7.4:

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

 

Obtener el estado de los paquetes

dpkg --set-selections PACKAGE_NAME

O también:

dpkg --set-selections | grep PACKAGE_NAME

Quitar el bloqueo de un paquete

Para quitar el bloqueo sobre un paquete:

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

Utilizando para el ejemplo el mismo paquete de php7.4:

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

Bloquear las actualizaciones de paquetes con el comando aptitude (método 3)

A diferencia del anterior, este método funciona tanto con los paquetes instalados como con los desinstalados.

Para poner en lista negra un paquete debemos ejecutar el siguiente comando:

aptitude hold PACKAGE

Siguiendo los ejemplos anteriores, con el paquete php7.4 sería:

root@host# aptitude hold php7.4

También podemos impedir que un paquete se actualice a una versión determinada, permitiendo al mismo tiempo las actualizaciones automáticas a versiones futuras. Esto es útil, por ejemplo, para evitar una versión que no queramos utilizar de un paquete se instale. Imagina que tenemos php=7.4.2 y no queremos pasar a php=7.4.4 porque tiene un bug de seguridad (es inventado, no he comprobado si es así). Podemos evitar que se actualice así:

aptitude forbid-version PACKAGE=VERSION

En decir (es una versión inventada del paquete:

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

Después de bloquear un paquete de las formas anteriores, si se ejecuta el comando aptitude upgrade y se detectan actualizaciones para el paquete retenido se verá algo similar a esto:

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

 

Deja una respuesta