web-dev-qa-db-fra.com

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

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

Par exemple, Apache2 dans la version 2.2.20-1ubuntu1 avec 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 manuellement tous les *.deb 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 le VM/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.

212
ayckoster

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

Une version spécifique d'un package peut être sélectionnée pour l'installation en suivant le nom du package avec un égal 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 paquet 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
215
fader

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

Sudo apt-cache madison ^Apache2

Si cela ne fonctionne pas, envisagez d'exécuter Sudo apt-get update avant de mettre à jour la liste des packages.

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
64
kenorb

Je développerai les réponses précédentes avec d'autres commandes de versioning pratiques de la famille apt. Pour voir quelles versions sont disponibles, exécutez 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 à nouveau apt-cache policy:

# 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 de 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 package et que votre ordinateur soit synchronisé avec apt-get update. Vous verrez ceci à la prochaine exécution de 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.
15
gsf

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 de disposer d’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?

7
psusi

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é.

2
soger