Tabla de contenido
¡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.