Comment installer des paquets Ubuntu spécifiques, avec la version exacte?


225

Je souhaite configurer une nouvelle machine virtuelle avec certains packages spécifiés (nom et version) fournis.

Par exemple, apache2 en version 2.2.20-1ubuntu1avec toutes les dépendances. Même s'il existe une nouvelle version de ce paquet sur les serveurs, celle-ci doit être installée.

La solution doit fonctionner / évoluer avec plusieurs (n) "configurations". Une autre machine virtuelle peut nécessiter une version plus ancienne d’apache2.

Je connais actuellement certaines possibilités d'installer les packages exacts, mais je ne fais pas une bonne mise à l'échelle:

  1. Copiez *.debmanuellement tous les éléments requis sur chaque machine virtuelle et entrez: dpkg -i... -> Peut fonctionner, mais il est très sujet aux erreurs. (Scripts manuels, etc.)
  2. Créez et utilisez un nouveau référentiel Ubuntu pour chaque configuration. -> Ne fonctionne pas car j'aurais besoin de n référentiels.
  3. Configurez l’appareil une fois et copiez la machine virtuelle / créez un instantané. -> Ne fonctionne pas car il me faudrait stocker n machines virtuelles.

Mon problème pourrait être qualifié de gestion des correctifs, mais je ne souhaite pas mettre à jour mes packages avec la version actuelle. Mon but est d'installer d'anciens paquets.

Réponses:


228

Vous pouvez utiliser apt-getpour installer une version spécifique du paquet dans la mesure où il se trouve dans une archive connue par apt. De la apt-getpage de manuel:

Une version spécifique d'un package peut être sélectionnée pour l'installation en suivant le nom du package avec un équivalent et la version du package à sélectionner. Cela entraînera la localisation et la sélection de la version à installer. Alternativement, une distribution spécifique peut être sélectionnée en suivant le nom du paquetage avec une barre oblique et la version de la distribution ou le nom de l'archive (stable, gelé, unstable).

Par exemple, vous pourriez faire:

sudo apt-get install apache2=2.2.20-1ubuntu1

Notez que dans ce cas, vous devrez peut-être résoudre vous-même certaines dépendances, mais en cas de problème, apt-get vous indiquera ce qui les cause. Sur mon système 11.10, je devrais procéder comme suit pour que cela fonctionne:

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

46
Comment savoir quelles versions sont disponibles?
Rodrigo Gurgel

12
@Rodrigo Gurgel, "aptitude versions apache2"
utilisateur169015 le

3
@ user169015 "version existe"! = "la version est fournie pour Ubuntu et disponible avec apt"
Kyle Strand

Bonjour Kyle, je n'ai pas compris votre commentaire, mais oui, le paquet peut également être installé avec apt. Je viens de coller avec aptitude parce que je l'utilise depuis longtemps ... :)
user169015

6
@ user169015 Je pense que vous manquez le commentaire de Kyle, Jetez un coup d'œil à la réponse de psusi ci-dessous. Apparemment, les référentiels Ubuntu APT ne continuent pas à héberger les anciennes versions de paquets! Donc, contrairement aux gestionnaires de paquets d'exécution (pip, gem, maven, etc.), vous ne pouvez pas vous fier aux référentiels Ubuntu APT si vous souhaitez reconstituer une configuration ancienne, en bon état. J'ai été surpris et déçu de m'en rendre compte moi-même. Peut-être que Arch gère mieux cela? ( askubuntu.com/questions/728439/… )
algue le

66

Pour vérifier quelles versions sont disponibles, vous pouvez vérifier via:

sudo apt-cache madison ^apache2

Si cela ne fonctionne pas, pensez à exécuter sudo apt-get updateavant de mettre à jour la liste de paquets.

Ensuite, copiez la version ou utilisez la syntaxe suivante:

sudo apt-get install apache2=2.2\*

Pour vérifier quelle version vous avez installée, lancez:

dpkg -l 'apache2*' | grep ^i

5
Merci beaucoup d'avoir signalé cette =2.2\*option comme moyen d'utiliser un caractère générique pour sélectionner une subversion disponible. C'est ce que je voulais savoir, mais je ne savais pas comment demander :)
aexl

3
Lorsque vous répertoriez les versions à l'aide de dpkg -l <packageName>, le numéro de version est parfois tronqué. Pour éviter cela, utilisezCOLUMNS=100 dpkg -l <packageName>
CJBS le

Sur Yakkety, la première commande me donne juste:N: Unable to locate package ^apache2
Jesse Glick le

@ JesseGlick Exécuter en sudo apt-get updatepremier. Assurez-vous d'avoir les bonnes sources d'Apt configurées.
Kenorb

1
N: Impossible de localiser le paquet ^ apache2 apres $ sudo apt-get update mais sudo apt-get install apache2 = 2.2 * fonctionne pour moi
Braian Mellor

17

Je développerai les réponses précédentes avec d'autres commandes de gestion de versions pratiques de la aptfamille. Pour voir quelles versions sont disponibles, lancez 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

Ensuite, comme mentionné ailleurs, installez une version spécifique avec apt-get:

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

Vous pouvez maintenant voir quelle version vous avez installée en exécutant à apt-cache policynouveau:

# 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 vous ne voulez pas que les nouvelles versions soient installées sur les mises à jour, épinglez le paquet avec apt-mark:

# apt-mark hold apache2
apache2 set on hold.

Supposons qu'une nouvelle version d'apache2 soit ajoutée à l'index du paquet et que votre ordinateur soit synchronisé avec apt-get update. Vous verrez ceci lors de votre prochaine course 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.

6

En pratique, cela n’est pas possible, car les anciennes versions ne sont pas conservées dans les archives. Par conséquent, vous ne pouvez pas l’installer à moins d’avoir une copie de l’ancienne version quelque part. Vous devriez vous demander pourquoi vous souhaitez installer une version plus ancienne en premier lieu. Sur une version stable, la raison principale pour laquelle une nouvelle version est publiée est la correction d’une faille de sécurité. Vous ne voulez pas exécuter un serveur vulnérable, n'est-ce pas?


25
J'ai besoin de cela pour reproduire des copies exactes d'anciens environnements à des fins de développement. Est-il possible de configurer un miroir qui ne supprime pas les anciennes versions de package pour accéder aux packages requis ou dois-je configurer plusieurs référentiels contenant uniquement des diffs?
ayckoster

19
@ psusi: Ce n'est pas une réponse juste, il peut y avoir plusieurs raisons. Dans mon cas, la version la plus récente pourrait en fait comporter un bogue. Pour vérifier que c'est bien le cas, l'ancienne version est nécessaire. Juste un exemple.
Cookie

2
@nomen, non, il s’agit d’une distribution simple qui n’utilise pas de modèle à libération progressive. Un soin tout particulier est pris pour s'assurer que lorsque les bogues critiques et les vulnérabilités en matière de sécurité sont corrigés dans la version stable, ils ne provoquent pas de régression. Si cela se produit, créez un rapport de bogue étiqueté avec régression-release, qui le corrigera ou le retournera. retour.
Psusi

5
@nomen, si vous voulez créer votre propre signification pour les mots, vous aurez du mal à communiquer avec les autres. Pour tous les autres pays du monde, ce n'est pas ce que l'on appelle une version en continu, et une version en rouleau est exactement le contraire, et donc mutuellement exclusive avec une version stable. Et maintenant que j'y pense, la version originale livrée avec la version est en fait conservée dans la poche -release, et les mises à jour sont placées dans la poche -updates ou -security, de sorte que vous ne pouvez pas revenir à une mise à jour précédente. peut revenir à la version d'origine.
psusi

5
@psusi: En voici un autre pour vous. Unison doit toujours avoir la même version sur toutes les machines. Pourtant, le 13.10 est une version différente de celle de 12.04 LTS. Et maintenant? Quand on en vient à une question comme celle-ci, recevoir une réponse du genre «Pourquoi voulez-vous faire cela est-il vraiment très inutile et une perte de temps pour tout le monde?
Cookie

2

Comme l'explique psusi, les anciennes versions ne sont pas conservées dans le référentiel Ubuntu, mais apparemment, vous pouvez toujours les trouver sur le tableau de bord. Donc, vous allez à (remplacez trusty et amd64 par votre version et architecture ubuntu):

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

et sélectionnez la version que vous désirez. Ensuite, vous téléchargez le fichier deb sous forme de fichier et l'installez avec:

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

Encore une fois, remplacez le nom de fichier par votre fichier. Cela devient fastidieux si vous devez déclasser beaucoup de paquets, mais c'est mieux que rien si vous êtes désespéré.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.