Sistemas mixtos (APT-pinning)

Solapas principales

Sistemas mixtos

1. Introducción

Frecuentemente tenemos la necesidad de instalar una nueva versión de un paquete dado, pero dicho paquete no está disponible para la rama Debian que estamos usando.

El caso más frecuente es probablemente aquel en una instalación de testing, en la cual necesitamos (o sufrimos de versionitis) instalar también paquetes presentes en la rama de desarrollo unstable o experimental, o también el hecho de querer usar un repositorio con paquetes particulares, pero compilados para una rama diferente a la nuestra.

APT puede ser nuestro fiel amigo en estas circunstancias, permitiendo el uso de fuentes de ramas diferentes (y satisfacer las dependencias) sin obligarnos a una actualización del sistema entero y sin tener que enloquecer para resolver las dependencias, conflictos e inconsistencias varias.Esta característica es llamada también apt-pinning, nombre dado por el pin que se le otorga en el archivo de preferencias, como veremos a continuación.

Lo que haremos en esta guía será utilizar paquetes Debian provenientes de:

 

  • testing + unstable + experimental + multimedia

 

pero los pasos son fácilmente realizables también para otras situaciones como:

  • unstable + experimental
  • stable + testing
  • stable + unstable
  • stable + testing + unstable
  • etc...

Nota: No se debe abusar de apt-pinning. La finalidad de este articulo es tener un sistema testing al que podemos instalar ocasionalmente algunos paquetes de Sid o Experimental. Abusar a capricho instalando muchos paquetes de diferentes ramas puede hacer un sistema totalmente inestable.

2. Editar sources.list

Como primera medida realizamos una copia de seguridad de nuestro /etc/apt/sources.list, hecho esto lo editamos con nuestro editor favorito y agregamos los repositorios que utilizaremos:

  
### Debian oficial -- Testing
deb http://ftp.fr.debian.org/debian/ testing main contrib non-free

### Debian oficial -- Testing Seguridad.
deb http://security.debian.org/ jessie/updates main contrib non-free

#Multimedia testing
deb http://www.deb-multimedia.org testing main non-free

### Debian oficial -- Sid
deb http://ftp.us.debian.org/debian unstable main contrib non-free

###  Debian oficial -- Experimental
deb http://ftp.fr.debian.org/debian experimental main

Guardamos el archivo y ejecutamos en consola:

  # apt update

Nota: Recordar que si es una instalación nueva y agregáis el repositorio deb-multimedia debéis añadir la llave publica

3.Configuración de /etc/apt/preferences y /etc/apt/apt.conf.d/local

Llegados a este punto debemos preparar dos archivos que no están presentes en nuestro sistema Debian: se trata de los archivos /etc/apt/preferences y /etc/apt/apt.conf.d/local, que serán los encargados de instruir a APT sobre como gestionar las dependencias de los paquetes, informándolo de como debe comportarse en caso de conflictos u otros problemas.

Creamos el archivo /etc/apt/preferences:

   # nano /etc/apt/preferences

Y agregamos las siguientes directivas:


Package: *
Pin: release o=Unofficial Multimedia Packages
Pin-Priority: 950

Package: *
Pin: release a=testing
Pin-Priority: 850

Package: *
Pin: release n=sid
Pin-Priority: 800

Package: *
Pin: release a=experimental
Pin-Priority: 750

El pinning puede ser redirigido a un archivo, un origen, la versión de un paquete, un componente, etc...

Con "0=" se especifica el origen; es decir, la distribución del paquete, con "a=" la rama (oldstable, stable, testing, unstable y experimental) y con "n=" el código de la rama (Wheezy, Jessie, Stretch, sid, experimental).

Los números de prioridad tienen además un significado añadido, que a continuación se comenta. Llamando P a dicho número, tenemos:

  • P»1000: se fuerzan versiones de paquetes, aunque estas sean inferiores.
  • 990«P«=1000: siempre que la versión instalada no sea más reciente, el paquete es instalado, aunque no provenga de la rama principal.
  • 500«P«=990: siempre que el paquete instalado sea más antiguo y que no exista una versión en la rama principal, se instalará la versión.
  • 100 P <=500: El paquete se instala siempre y cuando no exista el mismo paquete en cualquiera de las otras ramas. Tampoco se instala en caso de tener una versión del paquete instalada que sea más reciente..
  • 0«P«=100: la versión solo se instala si no hay ninguna versión del paquete instalado.
  • P«0: no se instala la versión.

A raíz de estos resultados, cabría preguntarse: ¿Es viable hacer una des-actualización en Debian?. Respuesta: teóricamente sí, aunque en la práctica es complicado y lo más probable es que traiga de su mano complicaciones. Ha de notarse que el sistema de paquetes de Debian está preparado para actualizar paquetes, no para des-actualizarlos.

Si aun así, por simple curiosidad, quieres saber como se podría des-actualizar un paquete o la distribución entera, bastaría con indicar que la versión del paquete o la rama deseada tenga una prioridad superior a 1000.

Este dato es rastreado de modo inequívoco por APT cuando "hurga" el interior de los directorios "release" presente en todos los repositorios oficiales.

Ahora creamos el archivo /etc/apt/apt.conf.d/local:

  # nano /etc/apt/apt.conf.d/local

Agregamos lo siguiente:


APT::Default-Release "testing";
APT::Cache-Limit 55000000;
Apt::Get::Purge;
APT::Clean-Installed;
APT::Get::Fix-Broken;
APT::Get::Fix-Missing;
APT::Get::Show-Upgraded "true";

Hacemos nuevamente la actualización de la base de datos de paquetes:

  # apt update

De ahora en adelante tendremos dos posibilidades para instalar un paquete:

El método "normal" que utiliza paquetes provenientes de la versión impuesta por defecto (en este caso testing) en /etc/apt/apt.conf.d/local

   # apt install nombre_paquete

O como segunda opción, usando la opción -t , que realizará la instalación del paquete deseado para la versión especificada, resolviendo las dependencias automáticamente.

   # apt install -t version_de_debian nombre_paquete

4. Conocer información sobre un sistema mixto:

Antes que nada hay que instalar el paquete apt-show-versions:

  # apt install apt-show-versions

Para saber cuántos paquetes tenemos por cada rama:

  apt-show-versions -b|awk 'BEGIN{FS="/"}NF==2{a[$2]++}NF!=2{a["no oficial"]++}END{for (i in a) print i, a[i]}'

Para saber qué paquetes tenemos en ciertas rama:

  apt-show-versions -b|awk 'BEGIN{FS="/"}$2=="rama"'

Fuentes:

https://web.archive.org/web/20150916080534/http://www.esdebian.org/wiki/sistemas-mixtos

https://debian-handbook.info/browse/es-ES/stable/sect.apt-get.html#sect.apt-upgrade

http://geekland.eu/apt-pinning-en-debian/