¿Cómo instalar paquetes específicos de Ubuntu, con la versión exacta?

225

Quiero configurar una nueva máquina virtual con algunos paquetes específicos (nombre y versión) que se proporcionan.

Por ejemplo apache2 en versión 2.2.20-1ubuntu1con todas las dependencias. Incluso si hay una nueva versión de este paquete en los servidores, este debería estar instalado.

La solución tiene que trabajar / escalar con múltiples (n) "configuraciones". Otra máquina virtual podría necesitar una versión anterior de apache2.

Actualmente conozco algunas posibilidades que instalan los paquetes exactos, pero no escalan tan bien:

  1. Copie todo lo requerido *.deben cada máquina virtual manualmente e ingrese: dpkg -i... -> Podría funcionar, pero es muy propenso a errores. (Guiones manuales, etc.)
  2. Cree y use un nuevo repositorio de Ubuntu para cada configuración. -> No funciona porque necesitaría n repositorios.
  3. Configure la máquina una vez y copie la VM / cree una instantánea. -> No funciona porque necesitaría almacenar n máquinas virtuales.

Mi problema podría etiquetarse como gestión de parches, pero no quiero actualizar mis paquetes a la versión actual. Mi objetivo es instalar paquetes antiguos.

ayckoster
fuente

Respuestas:

228

Puede usar apt-getpara instalar una versión específica del paquete siempre que esté en un archivo que conozca apt. Desde la página del apt-getmanual:

Se puede seleccionar una versión específica de un paquete para la instalación siguiendo el nombre del paquete con un igual y la versión del paquete para seleccionar. Esto hará que esa versión se localice y seleccione para su instalación. Alternativamente, se puede seleccionar una distribución específica siguiendo el nombre del paquete con una barra diagonal y la versión de la distribución o el nombre del archivo (estable, congelado, inestable).

Por ejemplo, podrías hacer:

sudo apt-get install apache2=2.2.20-1ubuntu1

Tenga en cuenta que es posible que deba hacer alguna resolución de dependencia por su cuenta en este caso, pero si hay algún problema, apt-get le dirá qué los está causando. En mi sistema 11.10, necesitaría hacer lo siguiente para que esto funcione:

sudo apt-get install apache2=2.2.20-1ubuntu1 \
                     apache2.2-common=2.2.20-1ubuntu1 \
                     apache2.2-bin=2.2.20-1ubuntu1 \
                     apache2-mpm-worker=2.2.20-1ubuntu1
fader
fuente
46
¿Cómo saber qué versiones están disponibles?
Rodrigo Gurgel
12
@Rodrigo Gurgel, "aptitude versiones apache2"
user169015
3
@ user169015 "versión existe"! = "la versión está empaquetada para Ubuntu y está disponible con apt"
Kyle Strand
Hola Kyle, no recibí tu comentario, aunque sí, el paquete también se puede instalar usando apt. Simplemente sigo con aptitude porque lo he estado usando durante mucho tiempo ... :)
user169015
66
@ user169015 Creo que te estás perdiendo el punto del comentario de Kyle. Echa un vistazo a la respuesta de psusi a continuación. Aparentemente, los repositorios Ubuntu APT no continúan alojando versiones antiguas de paquetes. Por lo tanto, a diferencia de los administradores de paquetes de tiempo de ejecución (pip, gem, maven, etc.), no puede confiar en los repositorios APT de Ubuntu si desea reconstituir una configuración antigua y conocida. Me sorprendió y me decepcionó darme cuenta de esto. ¿Quizás Arch maneja esto mejor? ( askubuntu.com/questions/728439/… )
algal
66

Para verificar qué versiones están disponibles, puede verificar a través de:

sudo apt-cache madison ^apache2

Si no funciona, considere ejecutar sudo apt-get updateantes para actualizar la lista de paquetes.

Luego copie la versión o use la siguiente sintaxis:

sudo apt-get install apache2=2.2\*

Para verificar qué versión ha instalado, ejecute:

dpkg -l 'apache2*' | grep ^i
kenorb
fuente
55
Muchas gracias por señalar la =2.2\*opción como una forma de usar un comodín para seleccionar cualquier subversión disponible. Eso es lo que quería saber pero no sabía cómo preguntar :)
aexl
3
Al enumerar las versiones usando dpkg -l <packageName>, el número de versión a veces se trunca. Para evitar esto, useCOLUMNS=100 dpkg -l <packageName>
CJBS
En Yakkety, el primer comando me da:N: Unable to locate package ^apache2
Jesse Glick
@JesseGlick Corre sudo apt-get updateprimero. Asegúrese de tener las fuentes Apt correctas configuradas.
kenorb
1
N: No se puede encontrar el paquete ^ apache2 después de $ sudo apt-get update pero sudo apt-get install apache2 = 2.2 * funciona para mí
Braian Mellor
17

Ampliaré las respuestas anteriores con otros comandos de control de versiones útiles en la aptfamilia. Para ver qué versiones están disponibles, ejecute apt-cache policy:

# apt-cache policy apache2
apache2:
  Installed: (none)
  Candidate: 2.4.7-1ubuntu4.5
  Version table:
     2.4.10-1ubuntu1.1~ubuntu14.04.1 0
        100 http://us.archive.ubuntu.com/ubuntu/ trusty-backports/main amd64 Packages
     2.4.7-1ubuntu4.5 0
        500 http://security.ubuntu.com/ubuntu/ trusty-security/main amd64 Packages
     2.4.7-1ubuntu4 0
        500 http://us.archive.ubuntu.com/ubuntu/ trusty/main amd64 Packages

Luego, como se menciona en otra parte, instale una versión específica con apt-get:

# apt-get install apache2=2.4.7-1ubuntu4.5
...

Ahora puede ver qué versión ha instalado ejecutando apt-cache policynuevamente:

# apt-cache policy apache2
apache2:
  Installed: 2.4.7-1ubuntu4.5
  Candidate: 2.4.7-1ubuntu4.5
  Version table:
     2.4.10-1ubuntu1.1~ubuntu14.04.1 0
        100 http://us.archive.ubuntu.com/ubuntu/ trusty-backports/main amd64 Packages
 *** 2.4.7-1ubuntu4.5 0
        500 http://security.ubuntu.com/ubuntu/ trusty-security/main amd64 Packages
        100 /var/lib/dpkg/status
     2.4.7-1ubuntu4 0
        500 http://us.archive.ubuntu.com/ubuntu/ trusty/main amd64 Packages

Si no desea que se instalen versiones más recientes en las actualizaciones, ancle el paquete con apt-mark:

# apt-mark hold apache2
apache2 set on hold.

Digamos que se agrega una nueva versión de apache2 al índice del paquete y su máquina se sincroniza con apt-get update. Verás esto la próxima vez que corras apt-get upgrade:

# apt-get upgrade
Reading package lists... Done
Building dependency tree       
Reading state information... Done
Calculating upgrade... Done
The following packages have been kept back:
  apache2
0 upgraded, 0 newly installed, 0 to remove and 1 not upgraded.
gsf
fuente
6

En términos prácticos, esto no es posible porque las versiones anteriores no se guardan en el archivo, por lo que, a menos que tenga una copia de la versión anterior en algún lugar, no puede instalarla. En primer lugar, debe preguntarse por qué desea instalar una versión anterior. En una versión estable, la razón principal para el lanzamiento de una nueva versión es corregir una vulnerabilidad de seguridad, y no desea ejecutar un servidor vulnerable, ¿verdad?

psusi
fuente
25
Necesito esto para reproducir copias exactas de entornos antiguos para fines de desarrollo. ¿Es posible configurar un espejo que no elimine las versiones antiguas de paquetes para acceder a los paquetes requeridos o necesito configurar múltiples repositorios que solo contienen diffs?
ayckoster
19
@psusi: No es exactamente una respuesta justa, puede haber muchas razones. En mi caso, la versión más nueva podría tener un error, y para verificar que es el caso, se necesita la versión anterior. Solo un ejemplo.
Cookie
2
@nomen, no, es una distribución única que no utiliza un modelo de lanzamiento continuo. Se tiene mucho cuidado para garantizar que cuando se corrijan errores críticos y vulnerabilidades de seguridad en la versión estable, no causen regresiones, pero si sucede, entonces presente un informe de error etiquetado con la versión de regresión y se reparará o rodará espalda.
psusi
55
@nomen, si quieres inventar tus propios significados para las palabras, te será difícil comunicarte con los demás. Para todos los demás en el mundo, eso no es lo que es una versión rodante, y la versión rodante es exactamente lo contrario, y por lo tanto, mutuamente excluyentes con una versión estable. Y ahora que lo pienso, la versión original incluida con el lanzamiento se guarda en el bolsillo de lanzamiento y las actualizaciones van al bolsillo de actualizaciones o seguridad, por lo que si bien no puede volver a una actualización anterior, usted puede volver a la versión lanzada originalmente.
psusi
55
@psusi: Aquí hay otro para ti. Se requiere que Unison sea siempre la misma versión en todas las máquinas. Sin embargo, en 13.10 es una versión diferente que en 12.04 LTS. ¿Y ahora que? Cuando se trata de una pregunta como esta, recibir una respuesta como por qué quieres hacer esto es realmente inútil y una pérdida de tiempo para todos.
Cookie
2

Como explica psusi, las versiones antiguas no se guardan en el repositorio de ubuntu, pero aparentemente todavía puedes encontrarlas en el launchpad. Entonces, vaya a (reemplace trusty y amd64 con su versión y arquitectura de ubuntu):

https://launchpad.net/ubuntu/trusty/amd64/apache2

y seleccione la versión que desee. Luego descarga el deb como un archivo e instala con:

dpkg -i apache2_2.4.7-1ubuntu4.20_amd64.deb

Nuevamente, reemplace el nombre del archivo a su archivo. Esto se vuelve tedioso si tiene que degradar muchos paquetes, pero es mejor que nada si está desesperado.

soger
fuente