Vraag Hoe specifieke Ubuntu-pakketten te installeren, met de exacte versie?


Ik wil een nieuwe virtuele machine installeren met een aantal gespecificeerde pakketten (naam en versie), die worden meegeleverd.

Bijvoorbeeld apache2 in versie 2.2.20-1ubuntu1 met alle afhankelijkheden. Zelfs als er een nieuwe versie van dit pakket op de servers is, zou deze moeten worden geïnstalleerd.

De oplossing moet werken / schalen met meerdere (n) "setups". Een andere virtuele machine heeft mogelijk een oudere versie van apache2 nodig.

Ik ken momenteel enkele mogelijkheden die de exacte pakketten installeren, maar schalen niet zo goed:

  1. Kopieer alle vereiste *.deb naar elke virtuele machine handmatig en voer in: dpkg -i ... -> Zou kunnen werken, maar het is zeer foutgevoelig. (Handmatige scripts etc.)
  2. Maak en gebruik een nieuwe Ubuntu-repository voor elke opstelling. -> Werkt niet omdat ik n repository nodig heb.
  3. Stel de machine eenmaal in en kopieer de VM / maak een snapshot. -> Werkt niet omdat ik n VM's zou moeten opslaan.

Mijn probleem zou als patchbeheer kunnen worden bestempeld, maar ik wil mijn pakketten niet bijwerken naar de huidige versie. Mijn doel is om oude pakketten te installeren.


188
2018-01-01 20:39


oorsprong




antwoorden:


Je kunt gebruiken apt-get om een ​​specifieke versie van het pakket te installeren zolang het maar in een archief is dat apt kent. Van de apt-get manpage:

U kunt een specifieke versie van een pakket selecteren voor installatie door de pakketnaam te volgen met een gelijk aantal en de te selecteren versie van het pakket. Hierdoor wordt die versie gevonden en geselecteerd voor installatie. Als alternatief kan een specifieke verdeling worden geselecteerd door de pakketnaam te volgen met een schuine streep en de versie van de distributie of de archiefnaam (stabiel, bevroren, onstabiel).

U zou bijvoorbeeld kunnen doen:

sudo apt-get install apache2=2.2.20-1ubuntu1

Houd er rekening mee dat u in dit geval wellicht zelf een afhankelijkheidsresolutie moet uitvoeren, maar als er problemen zijn, zal apt-get u vertellen waardoor ze worden veroorzaakt. Op mijn 11.10-systeem zou ik het volgende moeten doen om dit te laten werken:

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

190
2018-01-01 20:57



hoe weet je welke versies beschikbaar zijn? - Rodrigo Gurgel
@Rodrigo Gurgel, "aptitude versions apache2" - user169015
@ user169015 "version exists"! = "versie is verpakt voor Ubuntu en beschikbaar met apt" - Kyle Strand
Hallo Kyle, ik heb je reactie niet gekregen, maar ja, het pakket kan ook met apt worden geïnstalleerd. Ik blijf gewoon vasthouden aan aanleg omdat ik dat al heel lang gebruik ... :) - user169015
@ user169015 Volgens mij mis je de opmerking van Kyle. Bekijk het antwoord van psusi hieronder. Blijkbaar blijven de Ubuntu APT-repositories geen oude versies van pakketten hosten! Dus in tegenstelling tot runtime-pakketbeheerders (pip, gem, maven, enz.), Kun je niet op de Ubuntu APT-repositories vertrouwen als je een oude, bekende-goede configuratie wilt reconstrueren. Ik was verrast en teleurgesteld om dit zelf te beseffen. Misschien gaat Arch hier beter mee om? ( askubuntu.com/questions/728439/... ) - algal


Om te controleren welke versies beschikbaar zijn, kunt u kijken via:

sudo apt-cache madison ^apache2

Als het niet werkt, overweeg dan om te rennen sudo apt-get update voordat de pakketlijst wordt bijgewerkt.

Kopieer de versie of gebruik de volgende syntaxis:

sudo apt-get install apache2=2.2\*

Ga als volgt te werk om te controleren welke versie u hebt geïnstalleerd:

dpkg -l 'apache2*' | grep ^i

51
2018-04-01 12:44



Heel erg bedankt voor het wijzen op de =2.2\* optie als een manier om een ​​jokerteken te gebruiken voor het selecteren van een beschikbare subversie. Dat is wat ik wilde weten, maar ik wist niet hoe ik het moest vragen :) - aexl
Bij het weergeven van de versies met dpkg -l <packageName>, het versienummer is soms afgekapt. Gebruik om dit te voorkomen COLUMNS=100 dpkg -l <packageName> - CJBS
Op Yakkety geeft het eerste commando me net: N: Unable to locate package ^apache2 - Jesse Glick
@JesseGlick Run sudo apt-get update eerste. Zorg ervoor dat je de juiste Apt-bronnen hebt geconfigureerd. - kenorb
N: Kan package ^ apache2 niet vinden na $ sudo apt-get update maar sudo apt-get install apache2 = 2.2 * werkt voor mij - Braian Mellor


Ik zal eerdere antwoorden uitbreiden met andere handige versiebeheeropdrachten in de apt familie. Om te zien welke versies beschikbaar zijn, voert u uit 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

Installeer vervolgens, zoals elders vermeld, een specifieke versie met apt-get:

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

Je kunt nu zien welke versie je hebt geïnstalleerd door te draaien apt-cache policy nog een keer:

# 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

Als u niet wilt dat nieuwere versies worden geïnstalleerd op updates, pincet het pakket dan met apt-mark:

# apt-mark hold apache2
apache2 set on hold.

Laten we zeggen dat een nieuwe versie van apache2 is toegevoegd aan de pakketindex en dat uw machine is gesynchroniseerd met apt-get update. Je ziet dit wanneer je weer gaat rennen 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.

10
2017-07-15 17:25





Praktisch gezien is dit niet mogelijk omdat de oude versies niet in het archief worden bewaard, dus tenzij u een kopie van de oude versie ergens hebt liggen, kunt u deze niet installeren. Je zou jezelf moeten afvragen waarom je een oudere versie wilt installeren. Op een stabiele release is de belangrijkste reden voor het vrijgeven van een nieuwe versie het verhelpen van een beveiligingsprobleem en wilt u geen kwetsbare server draaien?


8
2018-01-02 00:33



Ik heb dit nodig om exacte kopieën van oude omgevingen te reproduceren voor ontwikkelingsdoeleinden. Is het mogelijk om een ​​mirror in te stellen die geen oude pakketversies verwijdert om toegang te krijgen tot de vereiste pakketten of moet ik meerdere repository's instellen die alleen diffs bevatten? - ayckoster
@psusi: Niet bepaald een goede reactie, er kunnen veel redenen zijn. In mijn geval heeft de nieuwere versie mogelijk een bug en om te controleren of de oudere versie wel nodig is. Slechts een voorbeeld. - Cookie
@nomen, nee, het is een enkele distro die dat wel doet niet gebruik een rollend releasemodel. Er wordt veel zorg besteed om ervoor te zorgen dat wanneer kritieke fouten en beveiligingskwetsbaarheden worden opgelost in de stabiele release, ze geen regressies veroorzaken, maar als dit wel gebeurt, dien dan een bugrapport in dat is getagd met regressie-release en het zal worden gerepareerd of gerold terug. - psusi
@nomenen, als je je eigen betekenissen voor woorden wilt verzinnen, zal het moeilijk zijn om met anderen te communiceren. Voor alle anderen in de wereld is dat niet wat een rollende release is en rollende release is precies het tegenovergestelde en dus wederzijds exclusief met stabiele releases. En nu dat ik erover nadenk, wordt de originele versie die bij de release wordt geleverd, eigenlijk bewaard in de -leveringszak en updates gaan naar de -updates of -security-pocket, dus terwijl je niet terug kunt gaan naar een eerdere update, kan teruggaan naar de oorspronkelijk vrijgegeven versie. - psusi
@psusi: Hier is er nog een voor jou. Unison moet altijd dezelfde versie zijn op alle machines. Maar om 13.10 is het een andere versie dan in 12.04 LTS. Dus wat nu? Bij het komen tot een vraag als deze, is het ontvangen van een antwoord als waarom je dit wilt doen echt ongelofelijk onbehulpzaam en een verspilling van tijd voor iedereen. - Cookie