apt-mark Retener un paquete en una versión principal (no una menor específica)

apt-mark Retener un paquete en una versión principal (no una menor específica)

Quiero mantener versiones de paquetes en mis servidores para evitar que cambios importantes en la infraestructura rompan nuestro código (cambios de mongodb 2.4 a 2.6, por ejemplo).

Sé que puedo (por ejemplo), apt-mark hold packagepor ejemplo, pero luego dejo de recibir parches de seguridad y actualizaciones menores.

También me gustaría instalar paquetes configurando una versión principal (pero no menor)

por ejemplo, sé que puedo:

sudo apt-get install -y rabbitmq-server=3.3.5

Pero solo quiero fijar la instalación a una versión principal (3.*)

¿Cómo se puede lograr esto?

Respuesta1

Puede anclar a un conjunto comodín de números de versión. Verman apt_preferencespara un ejemplo:

El formulario específico asigna una prioridad (una "Prioridad de PIN") a uno o más paquetes específicos con una versión o rango de versiones específico. Por ejemplo, el siguiente registro asigna una prioridad alta a todas las versiones del paquete Perl cuyo número de versión comienza con "5.10". Se pueden separar varios paquetes por espacios.

Package: perl
Pin: version 5.10*
Pin-Priority: 1001

Entonces, por ejemplo, en Ubuntu 16.04, donde xenial-backportstiene una prioridad predeterminada de 100, la política inicial debhelperes:

$ apt-cache policy debhelper
debhelper:
  Installed: 9.20160115ubuntu3
  Candidate: 9.20160115ubuntu3
  Version table:
     10.2.2ubuntu1~ubuntu16.04.1 100
        100 http://jp.archive.ubuntu.com/ubuntu xenial-backports/main amd64 Packages
        100 http://jp.archive.ubuntu.com/ubuntu xenial-backports/main i386 Packages
 *** 9.20160115ubuntu3 500
        500 http://jp.archive.ubuntu.com/ubuntu xenial/main amd64 Packages
        500 http://jp.archive.ubuntu.com/ubuntu xenial/main i386 Packages
        100 /var/lib/dpkg/status

Luego, fijé los backports a una prioridad más alta:

$ cat /etc/apt/preferences.d/debhelper
Package: *
Pin: release v=16.04,o=Ubuntu,a=xenial-backports,n=xenial,l=Ubuntu,c=main,b=amd64
Pin-Priority: 600

$ apt-cache policy debhelper
debhelper:
  Installed: 9.20160115ubuntu3
  Candidate: 10.2.2ubuntu1~ubuntu16.04.1
  Version table:
     10.2.2ubuntu1~ubuntu16.04.1 600
        600 http://jp.archive.ubuntu.com/ubuntu xenial-backports/main amd64 Packages
        100 http://jp.archive.ubuntu.com/ubuntu xenial-backports/main i386 Packages
 *** 9.20160115ubuntu3 500
        500 http://jp.archive.ubuntu.com/ubuntu xenial/main amd64 Packages
        500 http://jp.archive.ubuntu.com/ubuntu xenial/main i386 Packages

Nuevamente fijando 9.*versiones de debhelpera una prioridad aún mayor:

$ cat /etc/apt/preferences.d/debhelper
Package: *
Pin: release v=16.04,o=Ubuntu,a=xenial-backports,n=xenial,l=Ubuntu,c=main,b=amd64
Pin-Priority: 600

Package: debhelper
Pin: version 9.*
Pin-Priority: 800

$ apt-cache policy debhelper
debhelper:
  Installed: 9.20160115ubuntu3
  Candidate: 9.20160115ubuntu3
  Version table:
     10.2.2ubuntu1~ubuntu16.04.1 600
        600 http://jp.archive.ubuntu.com/ubuntu xenial-backports/main amd64 Packages
        100 http://jp.archive.ubuntu.com/ubuntu xenial-backports/main i386 Packages
 *** 9.20160115ubuntu3 800
        500 http://jp.archive.ubuntu.com/ubuntu xenial/main amd64 Packages
        500 http://jp.archive.ubuntu.com/ubuntu xenial/main i386 Packages
        100 /var/lib/dpkg/status

Entonces solo necesitas crear un archivo /etc/apt/preferences.d/que tenga:

Package: rabbitmq-server
Pin: version 3.*
Pin-Priority: 1001

Ningún repositorio tiene una prioridad superior a 1000 de forma predeterminada, 1001 es suficiente para forzar a apt a degradar si es necesario:

P >= 1000 hace que se instale una versión incluso si esto constituye una degradación del paquete.

información relacionada