apt-pinning: Controlar desde qué repositorio se instalan nuestros paquetes | Algo de Linux

jueves, 5 de septiembre de 2013

apt-pinning: Controlar desde qué repositorio se instalan nuestros paquetes

En ocasiones nos interesa forzar la instalación de paquetes desde un repositorio determinado, como por ejemplo, backports o un repositorio local.  Para ello, podemos hacer apt-pinning en Debian y derivados.

Para configurar el apt-pinning podemos usar dos ubicaciones:
  • El fichero /etc/apt/preferences
  • El directorio /etc/apt/preferences.d/
Personalmente, prefiero usar el directorio /etc/apt/preferences.d/, más que nada por organización y tener claro de un vistazo lo que estoy forzando. Si os decantáis por esta opción, lo único que tenéis es que hacer es crear un fichero dentro del directorio con las preferencias que queráis establecer. Por ejemplo, puedo tener un fichero /etc/apt/preferences.d/iceweasel en el que configuro las opciones de apt para que los paquetes de iceweasel se instalen desde squeeze-backports.

Cada vez que quiero definir unas determinadas preferencias, uso la siguiente estructura básica en el archivo de configuración:

Package: 
Pin:
Pin-Priority:

Mediante Package indicamos la lista de paquetes a instalar.
Mediante Pin indicamos la rama, versión o repositorio desde el que queremos instalar los paquetes.
Mediante Pin-Priority especificamos la prioridad que tendrán los paquetes a la hora de actualizar.

Veamos un fichero de ejemplo:
sprofesores-pro:~# cat /etc/apt/preferences/iceweasel 
Package: iceweasel iceweasel-l10n-es-es libnss3 libnss3-1d
Pin: release a=squeeze-backports
Pin-Priority: 600

En el fichero anterior, estoy indicando a apt que los paquetes iceweasel, iceweasel-l10n-es-es, libnss y libnss3-1d deben instalarse desde squeeze-backports siempre que la versión instalada sea más antigüa y no exista una versión más reciente en la rama principal.

Otro ejemplo:
sprofesores-pro:~# cat /etc/apt/preferences/repositorio-local 
Package: *
Pin: origin recursos.valledeljerte3
Pin-Priority: 1000

En este ejemplo le estoy diciendo a apt que se debe instalar cualquier paquete (*) del repositorio recursos.valledeljerte3 (que es mi repositorio local) salvo que la versión ya instalada sea más reciente, aunque dicho paquete no provenga de la rama principal.
Si os fijáis en el ejemplo anterior, he usado un comodín (*) para representar cualquier paquete.

También podría especificar lo siguiente: 

Package: iceweasel*

Y estaría indicando que las condiciones se apliquen a cualquier paquete que comience por la cadena iceweasel. 

Diferentes opciones para especificar en Pin:
  • Pin: release a=stable (Indicamos la rama del repositorio a usar: stable, unstable, testing)
  • Pin: release n=wheezy (Indicamos el nombre de la versión de Debian: squeeze, wheezy, ...)
  • Pin: release v=6.0 (Indicamos la versión de Debian: 5.0, 6.0, 7.0, ...)
  • Pin: release c=main (Indicamos el componente del repositorio: main, contrib, non-free )
  • Pin: origin recursos.valledeljerte3 (Indicamos el servidor de los paquetes)

Definición de prioridades con Pin-Priority:
Las prioridades pueden ser números enteros positivos o negativos. Veamos cómo se interpretan los valores de prioridad:
  • Prioridad > 1000: La versión se instalará desde el repositorio indicado, incluso si es una versión anterior a la instalada en el sistema.
  • 990 < Prioridad <= 1000: Se instalará la versión aunque no provenga de la distribución objetivo, a menos que la versión instalada sea más reciente.
  • 500 < Prioridad <= 990: Se instalará el paquete siempre que la versión instalada sea más antigua y no exista una versión más reciente en la rama principal.
  • 100 < Prioridad <= 500: Se instalará el paquete siempre que la versión instalada sea más antigua y no exista una versión más reciente en cualquiera de los repositorios.
  • 0 < Prioridad <= 100: La versión sólo se instala si no hay ninguna versión del paquete ya instalada.
  • Prioridad <= 0: Evita la instalación del paquete especificado en las condiciones.