Wie installiere ich bestimmte Ubuntu-Pakete mit der genauen Version?

224

Ich möchte eine neue virtuelle Maschine mit einigen angegebenen Paketen (Name und Version) einrichten, die bereitgestellt werden.

Zum Beispiel Apache2 in Version 2.2.20-1ubuntu1mit allen Abhängigkeiten. Auch wenn auf den Servern eine neue Version dieses Pakets vorhanden ist, sollte diese installiert werden.

Die Lösung muss mit mehreren (n) "Setups" funktionieren / skalieren. Eine andere virtuelle Maschine benötigt möglicherweise eine ältere Version von Apache2.

Ich kenne momentan einige Möglichkeiten, die die genauen Pakete installieren, aber nicht so gut skalieren:

  1. Kopieren Sie alle erforderlichen *.debDaten manuell auf jede virtuelle Maschine und geben Sie Folgendes ein: dpkg -i... -> Konnte funktionieren, ist jedoch sehr fehleranfällig. (Manuelle Skripte etc.)
  2. Erstellen und verwenden Sie für jedes Setup ein neues Ubuntu-Repository. -> Funktioniert nicht, da ich n Repositories brauche.
  3. Richten Sie die Maschine einmal ein und kopieren Sie die VM / erstellen Sie einen Schnappschuss. -> Funktioniert nicht, da ich n VMs speichern müsste.

Mein Problem könnte als Patch-Verwaltung bezeichnet werden, aber ich möchte meine Pakete nicht auf die aktuelle Version aktualisieren. Mein Ziel ist es, alte Pakete zu installieren.

Ayckoster
quelle

Antworten:

227

Sie können apt-geteine bestimmte Version des Pakets so lange installieren, wie es sich in einem Archiv befindet, über das apt Bescheid weiß. Aus der apt-getManpage:

Eine bestimmte Version eines Pakets kann zur Installation ausgewählt werden, indem dem Paketnamen eine Entsprechung und die Version des Pakets, das ausgewählt werden soll, folgt. Dadurch wird diese Version gefunden und für die Installation ausgewählt. Alternativ kann eine bestimmte Distribution ausgewählt werden, indem Sie dem Paketnamen mit einem Schrägstrich und der Version der Distribution oder dem Archivnamen (stabil, eingefroren, instabil) folgen.

Zum Beispiel könnten Sie Folgendes tun:

sudo apt-get install apache2=2.2.20-1ubuntu1

Beachten Sie, dass Sie in diesem Fall möglicherweise eine Abhängigkeitsauflösung selbst vornehmen müssen. Wenn jedoch Probleme auftreten, werden Sie von apt-get darüber informiert, was diese verursacht. Auf meinem 11.10-System müsste ich Folgendes tun, damit dies funktioniert:

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
quelle
46
Woher wissen, welche Versionen verfügbar sind?
Rodrigo Gurgel
12
@ Rodrigo Gurgel, "aptitude versions apache2"
user169015
3
@ user169015 "version exists"! = "Version ist für Ubuntu apt
Kyle Strand
Hallo Kyle, ich habe deinen Kommentar nicht bekommen, obwohl das Paket auch mit apt installiert werden kann. Ich
bleibe
6
@ user169015 Ich denke, Sie verpassen den Punkt von Kyles Kommentar. Schauen Sie sich die Antwort von psusi unten an. Anscheinend hosten die Ubuntu APT-Repositories keine alten Versionen von Paketen mehr! Im Gegensatz zu Laufzeitpaket-Managern (pip, gem, maven usw.) können Sie sich nicht auf die Ubuntu APT-Repositorys verlassen, wenn Sie eine alte, als funktionierend bekannte Konfiguration wiederherstellen möchten. Ich war überrascht und enttäuscht, dies selbst zu realisieren. Vielleicht schafft Arch das besser? ( askubuntu.com/questions/728439/… )
Algen
66

Um zu überprüfen, welche Versionen verfügbar sind, können Sie Folgendes tun:

sudo apt-cache madison ^apache2

Wenn dies nicht funktioniert, können Sie sudo apt-get updatedie Paketliste vor dem Ausführen aktualisieren.

Kopieren Sie dann die Version oder verwenden Sie die folgende Syntax:

sudo apt-get install apache2=2.2\*

Um zu überprüfen, welche Version Sie installiert haben, führen Sie Folgendes aus:

dpkg -l 'apache2*' | grep ^i
Kenorb
quelle
5
Vielen Dank, dass Sie auf die =2.2\*Option hingewiesen haben, einen Platzhalter für die Auswahl einer verfügbaren Subversion zu verwenden. Das ist, was ich wissen wollte, aber nicht wissen, wie man fragt :)
Aexl
3
Bei der Auflistung der Versionen mit dpkg -l <packageName>wird die Versionsnummer manchmal abgeschnitten. Verwenden SieCOLUMNS=100 dpkg -l <packageName>
CJBS
Auf Yakkety, der erste Befehl gibt mir nur:N: Unable to locate package ^apache2
Jesse Glick
@JesseGlick sudo apt-get updateZuerst ausführen . Stellen Sie sicher, dass Sie die richtigen Apt-Quellen konfiguriert haben.
Kenorb
1
N: Paket ^ apache2 konnte nach $ sudo apt-get update nicht gefunden werden, aber sudo apt-get install apache2 = 2.2 * funktioniert für mich
Braian Mellor
17

Ich werde frühere Antworten mit anderen praktischen Versionsbefehlen in der aptFamilie erweitern. Um zu sehen, welche Versionen verfügbar sind, führen Sie Folgendes aus 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

Installieren Sie dann, wie an anderer Stelle erwähnt, eine bestimmte Version mit apt-get:

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

Sie können jetzt sehen, welche Version Sie installiert haben, indem Sie apt-cache policyerneut ausführen :

# 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

Wenn Sie nicht möchten, dass neuere Versionen bei Updates installiert werden, heften Sie das Paket an apt-mark:

# apt-mark hold apache2
apache2 set on hold.

Angenommen, eine neue Version von apache2 wird zum Paketindex hinzugefügt und Ihr Computer wird mit synchronisiert apt-get update. Das werden Sie sehen, wenn Sie das nächste Mal laufen 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
quelle
6

In der Praxis ist dies nicht möglich, da die alten Versionen nicht im Archiv gespeichert sind. Wenn Sie also nicht irgendwo eine Kopie der alten Version haben, können Sie sie nicht installieren. Sie sollten sich fragen, warum Sie überhaupt eine ältere Version installieren möchten. In einer stabilen Version besteht der Hauptgrund für die Veröffentlichung einer neuen Version darin, eine Sicherheitsanfälligkeit zu beheben, und Sie möchten keinen anfälligen Server ausführen, oder?

Psusi
quelle
25
Ich benötige dies, um exakte Kopien alter Umgebungen für Entwicklungszwecke zu reproduzieren. Ist es möglich, einen Spiegel einzurichten, der keine alten Paketversionen löscht, um auf die erforderlichen Pakete zuzugreifen, oder muss ich mehrere Repositorys einrichten, die nur Unterschiede enthalten?
Ayckoster
19
@psusi: Nicht gerade eine faire Antwort, es kann viele Gründe geben. In meinem Fall könnte die neuere Version tatsächlich einen Fehler aufweisen. Um dies zu überprüfen, wird die ältere Version benötigt. Nur ein Beispiel.
Cookie
2
@nomen, nein, es ist eine einzelne Distribution, die kein Rolling Release-Modell verwendet. Es wird sehr darauf geachtet, dass kritische Fehler und Sicherheitslücken, die in der stabilen Version behoben werden, keine Regressionen hervorrufen. Wenn dies jedoch der Fall ist, wird ein Fehlerbericht mit dem Tag "Regressionsfreigabe" eingereicht und repariert oder gerollt zurück.
Psusi
5
@nomen, wenn du deine eigenen Bedeutungen für Wörter erfinden willst, wirst du Schwierigkeiten haben, mit anderen zu kommunizieren. Für alle anderen auf der Welt ist das nicht das, was eine rollende Version ist, und die rollende Version ist genau das Gegenteil und schließt sich daher mit der stabilen Version gegenseitig aus. Und jetzt, da ich darüber nachdenke, befindet sich die mit der Veröffentlichung gelieferte Originalversion tatsächlich in der -release-Tasche, und Aktualisierungen werden in die -updates- oder -security-Tasche verschoben. Sie können also nicht zu einer vorherigen Aktualisierung zurückkehren kann auf die ursprünglich freigegebene Version zurückgreifen.
Psusi
5
@psusi: Hier ist noch einer für dich. Unison muss auf allen Computern immer dieselbe Version haben. Am 13.10 ist es jedoch eine andere Version als in 12.04 LTS. Also was jetzt? Wenn Sie auf eine Frage wie diese kommen, ist die Antwort, warum Sie das tun möchten, wirklich unglaublich wenig hilfreich und eine Zeitverschwendung für alle.
Cookie
2

Wie psusi erklärt, werden alte Versionen nicht im Ubuntu-Repository gespeichert, aber anscheinend finden Sie sie immer noch auf dem Launchpad. Also gehen Sie zu (ersetzen Sie trusty und amd64 durch Ihre Ubuntu-Version und -Architektur):

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

und wählen Sie die gewünschte Version. Dann lädst du die Deb als Datei herunter und installierst mit:

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

Ersetzen Sie erneut den Dateinamen in Ihrer Datei. Das wird mühsam, wenn Sie viele Pakete downgraden müssen, aber es ist besser als nichts, wenn Sie verzweifelt sind.

Sauger
quelle