Bloqueo y control de versiones de paquetes
Introducción
En entornos de producción a veces es necesario fijar la versión de un paquete para evitar que
una actualización automática rompa una aplicación. APT ofrece dos mecanismos complementarios:
apt-mark hold para bloqueo simple y el sistema de pinning mediante
/etc/apt/preferences para un control fino de versiones y prioridades.
apt-mark — Bloqueo de paquetes
apt-mark hold marca un paquete para que apt upgrade y apt full-upgrade
lo ignoren.
Bloquear un paquete:
# apt-mark hold nginx
# apt-mark hold nginx php8.3 mysql-server # varios a la vez
Desbloquear un paquete:
# apt-mark unhold nginx
Ver paquetes bloqueados:
$ apt-mark showhold
Equivalente con dpkg:
$ dpkg --get-selections | grep hold # ver paquetes en hold
# echo "nginx hold" | dpkg --set-selections # bloquear manualmente
# echo "nginx install" | dpkg --set-selections # desbloquear
Pinning — Control fino con /etc/apt/preferences
El pinning permite asignar prioridades a versiones o repositorios concretos. APT elige siempre el candidato con mayor prioridad.
Prioridades por defecto de APT:
- 100 → paquete instalado pero no disponible en ningún repositorio activo
- 500 → paquete disponible en un repositorio estándar
- 990 → paquete de la distribución objetivo (
-t) - >1000 → se instala aunque sea una versión anterior a la instalada
- <0 → el paquete nunca se instala automáticamente
Formato de /etc/apt/preferences:
Package: nginx
Pin: version 1.24.*
Pin-Priority: 1001
Fijar una versión exacta:
Package: nginx
Pin: version 1.24.0-2
Pin-Priority: 1001
Bloquear un paquete para que nunca se instale:
Package: paquete-no-deseado
Pin: release *
Pin-Priority: -1
Dar prioridad a un repositorio concreto:
Package: *
Pin: origin "download.docker.com"
Pin-Priority: 900
Verificar la política de un paquete:
$ apt-cache policy nginx
Instalar una versión específica manualmente
$ apt list --all-versions nginx # ver todas las versiones disponibles
# apt install nginx=1.24.0-2 # instalar versión concreta
# apt install nginx=1.24.0-2 --allow-downgrades # permitir bajar versión