¿Cómo instalar solo actualizaciones de un repositorio específico?

39

¿Cómo limito las actualizaciones que se instalan a las de un conjunto específico de repositorios? ¿Es esto posible?

Ton van den Heuvel
fuente
¿Desea poder especificar repositorio durante el tiempo de ejecución, o debería ser más una cosa estática? Las dos respuestas a continuación suponen la última opción.
tshepang
Idealmente sería durante el tiempo de ejecución. Sin embargo, la opción estática es suficiente.
Ton van den Heuvel
2
Su rumbo y la ayuda real que solicita son diferentes.
Sundar

Respuestas:

29

Usar fijación

La fijación es un proceso que le permite permanecer en una versión estable de Ubuntu (o cualquier otro sistema debian) mientras toma paquetes de una versión más reciente. - help.ubuntu.com

Puede deshabilitar las actualizaciones automáticas de ciertos repositorios sin eliminarlas por completo mediante aptpolíticas:

Para deshabilitar las actualizaciones automáticas del repositorio repo, agregue un archivo
/etc/apt/preferences.d/repocon el siguiente contenido:

Package: *
Pin: release n=repo
Pin-Priority: 50

Lo que dará a todos los paquetes de este repositorio una prioridad menor que los paquetes ya instalados (que tienen 100).

Para obtener más información man apt_preferenceso consulte el Wiki de la comunidad de Ubuntu .

kynan
fuente
3
Es una pena que la única respuesta de apt_preferences sea la última ...
Robert Siemer
¿Cómo saber qué versión es de qué repositorio?
Max N
2
@MaxN normalmente encontrarías esa información ejecutandoapt-cache policy package-name
Anwar
Esto no forzará un repositorio por no ser considerado durante la actualización. porque release n=repono va a cachear a nadie
Anwar
35

Puede especificar un lanzamiento con -topción. Como ejemplo, he agregado el siguiente repositorio /etc/apt/sources.listpara instalar la última versión de Iceweasel:

deb http://mozilla.debian.net/ squeeze-backports iceweasel-release

Como saben, hay un mismo paquete iceweaselen el repositorio oficial de Debian. Si quiero instalar Iceweasel desde esta versión específica, ejecuto:

apt-get install -t squeeze-backports iceweasel

de la página del manual de apt-get:

-t, --target-release, --default-release
           This option controls the default input to the policy engine, it creates a default pin at priority 990 using the specified
           release string. This overrides the general settings in /etc/apt/preferences. Specifically pinned packages are not affected by
           the value of this option. In short, this option lets you have simple control over which distribution packages will be retrieved
           from. Some common examples might be -t '2.1*', -t unstable or -t sid. Configuration Item: APT::Default-Release; see also the
           apt_preferences(5) manual page.

Creo que esta es una mejor solución.

ACTUALIZACIÓN : Como @SuB mencionó en el comentario, " -tespecifica la versión, no el nombre del repositorio. No hay un nombre de repositorio en Ubuntu (a diferencia de Linux basado en RedHat como RHEL, Fedora, CentOS, ...)".

dibujante
fuente
44
Como puede ver en el apt-getmanual, -tespecifique el nombre de la versión no del repositorio. No hay un nombre de repositorio en Ubuntu (a diferencia de Linux basado en RedHat como RHEL, Fedora, CentOS, ...)
SuB
1
@SuB Sí, tienes razón! ¡Confundí el nombre del repositorio con el lanzamiento!
dibujante
-t xenialFunciona para un solo paquete. pero todas sus dependencias aún se obtendrán de paquetes superiores
Anwar
10

Respuesta corta

Debe fijar los repositorios desde los que no desea instalar con una prioridad inferior a 100. Lo que significa (de la apt_preferencepágina de manual)

100 <= P <500
hace que se instale una versión a menos que haya una versión disponible que pertenezca a otra distribución o la versión instalada sea más reciente

Y para seleccionar un repositorio para fijar, usaría campos del Releasearchivo de repositorios . Tales como archive, label, release, versionetc. Al especificar los valores de estos campos, se pueden seleccionar con precisión un repositorio y asignar su prioridad preferente a la misma. Consulte la página apt_preference para más detalles.


Respuesta larga

Antes de continuar, necesitamos saber algo importante sobre la fijación. Eso incluye

  1. Campos de Releasearchivos y su asignación a apt-cache policysalida

  2. Formato de archivos de preferencias de apt

  3. Usar Releasecampos de archivos para establecer prioridad

1. Campos de Releasearchivo y apt-cache policysalida

Del artículo de Debian Wiki

  • Descripción
  • Etiqueta
  • Origen
  • Versión
  • Suite
  • Nombre clave
  • Componentes
  • Arquitecturas

Vería resultados de apt-cache policyestos

 500 http://mirrors.ircam.fr/pub/ubuntu/archive xenial/main amd64 Packages
 release v=16.04,o=Ubuntu,a=xenial,n=xenial,l=Ubuntu,c=main,b=amd64

Los valores en estas líneas provienen de los Releasearchivos.

  • Descripción establece la descripción de un repositorio. Esto no se muestra en la apt-cache policysalida

  • Etiqueta es la etiqueta del repositorio. Muchos repositorios tienen etiquetas vacías. Se muestra l=<label>en la salida.

  • Origen esto habla sobre el origen del repositorio. El repositorio oficial de Ubuntu tiene Ubuntucomo valor. Se muestra como o=en la salida

  • Versión es la versión de una distribución. Son las 16.04 para Xenial. Se muestra como v=en la salida

  • Suite es lo mismo que Archive . De debian wiki es El nombre de la distribución de Debian a la que pertenecen (o están diseñados) los paquetes en este directorio, es decir, estable, de prueba o inestable. . Para Ubuntu, estos son release-updates, release-securityetc. Por ejemplo xenial-updates,, xenial-security. Se muestra en la salida como a=xenial, a=xenial-security. Los PPA usan solo el nombre de la versión para esto, es por eso que no ayudará mucho en Pinning.

  • El componente habla sobre el tema de las licencias. Es main, multiverse, restricted, universeen Ubuntu. En la salida se muestra como c=maino c=restrictedetc. La mayoría de los PPA se utilizan mainpara este campo, por lo que tampoco ayuda a fijar mucho.

  • La arquitectura se trata de la arquitectura del sistema operativo. Mostrado como b=i386o b=amd64en la salida

  • El nombre en clave es el nombre de lanzamiento de la distribución. Para 16.04 lo es xenial. Para 14.04 lo es trusty. Se muestra en la apt-cache policysalida como n=xenialo n=trusty. Es lo mismo para todos los repositorios para una sola distribución por lo general. Es por eso que no ayuda a fijar mucho.

La otra línea en la apt-cache policysalida que comienza originindica el origen de Internet del repositorio. También se puede usar para fijar. Pero no debe mezclarse con el campo de Releasearchivos Origin. Esos son diferentes.

Usaremos estos valores para anclar un repositorio.

Entonces, ¿cómo usamos la fijación 1 para restringir el repositorio?

Hay varias formas de controlar la fijación y solo un pequeño subconjunto es efectivo para Ubuntu. Sin embargo, una explicación detallada está más allá del alcance de la respuesta. Consulte la apt_preferencepágina de manual para esto.

2. Formato de archivo pin

Los archivos de preferencias pin o apt residen en la /etc/apt/preferences.dcarpeta. Cada fijación contiene tres líneas.

  • La primera línea comienza con Package:un nombre de paquete separado por comas. Se permiten expresiones regulares y globs

  • La segunda línea comienza con Pin:y se usa para apuntar a un conjunto de paquetes.

    Si queremos anclar paquetes desde xenialmás alto xenial-updates, lo usaremos release a=xenial.

    Si queremos fijar la versión 5.0, la usaremos version 5.0aquí. Se permiten patitas de globo.

    O si queremos anclar paquetes desde el origen http://archive.ubuntu.com, usaremos origin "archive.ubuntu.com". Tenga en cuenta que no escribimos http://protocolo allí.

  • La tercera línea comienza con Pin-Priority:y su valor es un número. Lo que significa la prioridad de los elementos seleccionados anteriormente.

3. Uso de Releasecampos de archivos para establecer prioridad

Aquí hay un ejemplo

Package: *
Pin: release a=xenial
Pin-Priority: 1001

En este ejemplo, los paquetes de xenialarchivos tienen mayor prioridad que xenial-updatesy xenial-security.

Después de fijar, ejecutar un apt-cache policy nautilusprograma muestra que, de hecho, ha dado mayor prioridad a una versión inferior del xenialarchivo que a una versión superior del xenial-updatesarchivo. Fíjate en la Candidate:línea.

nautilus:
  Installed: 1:3.18.5-0ubuntu1~xenial1
  Candidate: 1:3.18.4.is.3.14.3-0ubuntu4
  Version table:
 *** 1:3.18.5-0ubuntu1~xenial1 100
        100 /var/lib/dpkg/status
     1:3.18.4.is.3.14.3-0ubuntu5 500
        500 http://us.archive.ubuntu.com/ubuntu xenial-updates/main amd64 Packages
     1:3.18.4.is.3.14.3-0ubuntu4 1001
        500 http://us.archive.ubuntu.com/ubuntu xenial/main amd64 Packages

Pero, si queremos dar prioridad a los paquetes provistos por PPA también, esto no funcionará. Porque los PPA usan el mismo nombre de archivo xenialde forma predeterminada. Por lo tanto, asignar una prioridad a a=xenialtambién se aplicará a esos paquetes. Por ejemplo (después de PPA habilitado),

13:31 $ apt-cache policy nautilus
nautilus:
  Installed: 1:3.18.5-0ubuntu1~xenial1
  Candidate: 1:3.18.5-0ubuntu1~xenial1
  Version table:
 *** 1:3.18.5-0ubuntu1~xenial1 1001
        500 http://ppa.launchpad.net/budgie-remix/ppa/ubuntu xenial/main amd64 Packages
        500 http://ppa.launchpad.net/gnome3-team/gnome3/ubuntu xenial/main amd64 Packages
        100 /var/lib/dpkg/status
     1:3.18.4.is.3.14.3-0ubuntu5 500
        500 http://us.archive.ubuntu.com/ubuntu xenial-updates/main amd64 Packages
     1:3.18.4.is.3.14.3-0ubuntu4 1001
        500 http://us.archive.ubuntu.com/ubuntu xenial/main amd64 Packages

Ahora la versión candidata es de un PPA. Ambos paquetes del xenialarchivo del repositorio oficial de Ubuntu y el PPA tienen la misma prioridad 1001, porque ambos usan el mismo valor para el Archivearchivo de lanzamiento. Para anclar con éxito, necesitamos combinar más campos en el archivo Pin.


Algunos ejemplos

Anclar un repositorio de PPA

Para anclar paquetes desde un repositorio, necesitamos apuntarlo usando la información que se encuentra en el apt-cache policycomando. Acabamos de ver que a=xenialeso no ayudará a señalar un repositorio. Necesitamos usar múltiples campos juntos usando una coma en un archivo de preferencias para apuntar con precisión a un repositorio.

Por ejemplo, para evitar todos los paquetes de http://ppa.launchpad.net/oibaf/graphics-drivers/ppa, podemos usar

Package: *
Pin: release n=xenial,o=LP-PPA-oibaf-graphics-drivers
Pin-Priority: 10

Aquí estamos utilizando el valor del nombre en código, así como el Originvalor del PPA. (Aunque el valor del nombre en clave no se requiere aquí en realidad). A veces, el repositorio puede perder estos valores. En esos casos, se deben utilizar algunas otras técnicas. La salida de apt-cache policy libgl1-mesa-glxdice que funciona. Se redujo la prioridad de todos los paquetes de este PPA.

libgl1-mesa-glx:
  Installed: 12.1~git1608200730.16ef7a~gd~x
  Candidate: 12.1~git1608200730.16ef7a~gd~x
  Version table:
 *** 12.1~git1608200730.16ef7a~gd~x 100
        -10 http://ppa.launchpad.net/oibaf/graphics-drivers/ubuntu xenial/main amd64 Packages
        100 /var/lib/dpkg/status
     11.2.0-1ubuntu2.1 500
        500 http://us.archive.ubuntu.com/ubuntu xenial-updates/main amd64 Packages
     11.2.0-1ubuntu2 500
        500 http://us.archive.ubuntu.com/ubuntu xenial/main amd64 Packages

Ignora el hecho de que es candidato. Esto sucedió porque ya está instalado en mi sistema . Verifique la prioridad a la derecha

Anclar un repositorio cuando falta información de lanzamiento

Si queremos anclar un repositorio cuya información de lanzamiento falta, como este http://download.opensuse.org/repositories/home:/sarimkhan/xUbuntu_14.04, debemos usar otro método. Dado que ningún otro repositorio está usando ese origen, podemos usarlo originpara anclar este repositorio de manera segura .

Package: *
Pin: origin download.opensuse.org
Pin-Priority: 10

Nota 1: Este origen es el origen de Internet, no el que especifica el proveedor en el archivo de lanzamiento.

Nota 2: Pin-Priority número tiene un significado especial. Consulte apt_preferencela página del manual para más detalles.

Anwar
fuente
La fijación es completamente inútil si el paquete es más nuevo en el repositorio que intenta evitar. Es decir, la mayoría de las veces.
bviktor hace
7

Una alternativa basada en GUI sería abrir el centro de software y seleccionar editar> fuentes de software ...

Fuentes de software con la pestaña de software Ubuntu seleccionada

Fuentes de software con otra pestaña de software seleccionada

todo lo que necesita hacer es desmarcar los repositorios de los que no desea actualizaciones.

Espero que esto ayude

Alano
fuente
5

La opción obvia es modificar /etc/apt/sources.listy comentar todos los demás repositorios, y luego ejecutar

apt-get update && apt-get upgrade && apt-get autoclean

Y luego eliminar comentarios de sources.list. Tal vez no sea la mejor manera, pero al menos las apt-getpáginas man no especifican ninguna forma de hacerlo.

En una nota relacionada, por ejemplo, el proceso de actualización de distribución de Ubuntu deshabilita todos los repositorios de terceros durante la actualización (y no solo ejecuta alguna opción para excluirlos temporalmente).

Olli
fuente
1

Otra opción de GUI es elegir el origen en el administrador de paquetes Synaptic.

  1. Busque el nombre del paquete que desea instalar
  2. Haz clic en el botón Origen.
  3. Elija el repositorio desde el que desea instalar
  4. Elige los paquetes
  5. Aplicar
woot
fuente