Frage Wie installiere ich bestimmte Ubuntu-Pakete mit exakter Version?


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

Zum Beispiel apache2 in der Version 2.2.20-1ubuntu1 mit allen Abhängigkeiten. Auch wenn auf den Servern eine neue Version dieses Pakets vorhanden ist, sollte dieses installiert werden.

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

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

  1. Kopiere alle benötigten *.deb zu jeder virtuellen Maschine manuell und geben Sie ein: dpkg -i ... -> Könnte funktionieren, aber es ist sehr fehleranfällig. (Manuelle Skripte usw.)
  2. Erstellen und verwenden Sie ein neues Ubuntu-Repository für jedes Setup. -> Funktioniert nicht, weil ich n Repositorys benötigen würde.
  3. Richten Sie das Gerät einmal ein und kopieren Sie die VM / erstellen Sie einen Snapshot. -> Funktioniert nicht, weil ich n VMs speichern müsste.

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


188
2018-01-01 20:39


Ursprung




Antworten:


Sie können verwenden apt-get um eine bestimmte Version des Pakets so lange zu installieren, wie es in einem Archiv ist, das apt kennt. Von dem apt-get Manpage:

Eine bestimmte Version eines Pakets kann zur Installation ausgewählt werden, indem der Paketname mit einem equals und der Version des zu wählenden Pakets angegeben wird. Dies führt dazu, dass diese Version gefunden und zur Installation ausgewählt wird. Alternativ kann eine spezifische Verteilung ausgewählt werden, indem der Paketname mit einem Schrägstrich und der Version der Distribution oder dem Namen des Archivs (stabil, eingefroren, instabil) gefolgt wird.

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 selbst eine Abhängigkeitsauflösung durchführen müssen, aber wenn es irgendwelche Probleme gibt, wird apt-get Ihnen sagen, was sie verursacht. Auf meinem 11.10-System müsste ich Folgendes tun, um dies zum Laufen zu bringen:

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



Wie kann ich wissen, welche Versionen verfügbar sind? - Rodrigo Gurgel
@Rodrigo Gurgel, "aptitude versions apache2" - user169015
@ user169015 "version exists"! = "Version ist für Ubuntu paketiert und mit verfügbar apt" - Kyle Strand
Hallo Kyle, ich habe deinen Kommentar nicht bekommen, obwohl ja, Paket kann auch mit apt installiert werden. Ich bleibe einfach bei Eignung, weil ich das für eine lange Zeit benutzt habe ... :) - user169015
@ user169015 Ich denke du verpasst den Punkt von Kyles Kommentar. Schau dir die Antwort von psusi unten an. Anscheinend hosten die Ubuntu APT-Repositories keine alten Versionen von Paketen! Im Gegensatz zu den Runtime-Paketmanagern (Pip, Gem, Maven usw.) können Sie sich nicht auf die Ubuntu APT-Repositorys verlassen, wenn Sie eine alte, bekannt gute Konfiguration wiederherstellen möchten. Ich war überrascht und enttäuscht, dies selbst zu erkennen. Vielleicht geht Arch das besser an? ( askubuntu.com/questions/728439/ ... ) - algal


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

sudo apt-cache madison ^apache2

Wenn es nicht funktioniert, erwäge es zu laufen sudo apt-get update bevor Sie die Paketliste 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 du installiert hast, führe Folgendes aus:

dpkg -l 'apache2*' | grep ^i

51
2018-04-01 12:44



Vielen Dank für das Hinweisen auf die =2.2\* Option, um einen Platzhalter für die Auswahl einer verfügbaren Subversion zu verwenden. Das wollte ich wissen, wusste aber nicht wie man fragt :) - aexl
Beim Auflisten der Versionen mit dpkg -l <packageName>, die Versionsnummer ist manchmal abgeschnitten. Um dies zu vermeiden, verwenden Sie COLUMNS=100 dpkg -l <packageName> - CJBS
Auf Yakkety gibt mir der erste Befehl nur: N: Unable to locate package ^apache2 - Jesse Glick
@JesseGlick Lauf sudo apt-get update zuerst. Stellen Sie sicher, dass Sie die richtigen Apt-Quellen konfiguriert haben. - kenorb
N: Das Paket konnte nicht gefunden werden ^ apache2 nach $ sudo apt-get update, aber sudo apt-get install apache2 = 2.2 * funktioniert für mich - Braian Mellor


Ich werde auf frühere Antworten mit anderen handlichen Versionierungsbefehlen in erweitern apt Familie. Um zu sehen, welche Versionen verfügbar sind, führen Sie 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 sie ausführen apt-cache policy nochmal:

# 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 auf Updates installiert werden, fixieren Sie das Paket mit apt-mark:

# apt-mark hold apache2
apache2 set on hold.

Nehmen wir an, eine neue Version von apache2 wird zum Paketindex hinzugefügt und mit Ihrem Computer synchronisiert apt-get update. Sie werden das beim nächsten Lauf sehen 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 ist das nicht möglich, weil die alten Versionen nicht im Archiv aufbewahrt werden. Wenn Sie also keine Kopie der alten Version haben, können Sie sie nicht installieren. Sie sollten sich fragen, warum Sie überhaupt eine ältere Version installieren möchten. Bei einer stabilen Version ist der Hauptgrund für die Veröffentlichung einer neuen Version die Behebung einer Sicherheitslücke, und Sie möchten keinen anfälligen Server ausführen, oder?


8
2018-01-02 00:33



Ich brauche das, um exakte Kopien alter Umgebungen für Entwicklungszwecke zu reproduzieren. Ist es möglich, eine Spiegelung einzurichten, die alte Paketversionen nicht löscht, um auf die erforderlichen Pakete zuzugreifen, oder muss ich mehrere Repositories einrichten, die nur Diffs enthalten? - ayckoster
@psusi: Nicht gerade eine faire Antwort, es könnte viele Gründe geben. In meinem Fall könnte die neuere Version tatsächlich einen Fehler enthalten, und um dies zu überprüfen, wird die ältere Version benötigt. Nur ein Beispiel. - Cookie
@nomen, nein, es ist eine einzelne Distribution, die das tut nicht Verwenden Sie ein Rolling-Release-Modell. Es wird sorgfältig darauf geachtet, dass kritische Fehler und Sicherheitslücken in der stabilen Version behoben werden, dass sie keine Regressionen verursachen, aber wenn dies der Fall ist, sollten Sie einen Fehlerbericht mit Regression-Release einreichen zurück. - psusi
@nomen, wenn du deine eigenen Bedeutungen für Wörter erfinden willst, wirst du eine harte Zeit haben, mit anderen zu kommunizieren. Für alle anderen auf der Welt ist das nicht eine rollende Veröffentlichung, und Rolling Release ist das genaue Gegenteil und somit gegenseitig ausschließend mit stabiler Veröffentlichung. Und jetzt, wo ich darüber nachdenke, wird die Originalversion, die mit dem Release geliefert wurde, tatsächlich in der Freigabetasche aufbewahrt, und Updates werden in das Update- oder Sicherheitstool verschoben, sodass Sie zwar nicht zu einem früheren Update zurückkehren können kann auf die ursprünglich freigegebene Version zurückgehen. - psusi
@psusi: Hier ist noch eine für dich. Unison muss auf allen Rechnern immer dieselbe Version haben. Doch am 13.10 ist es eine andere Version als in 12.04 LTS. Also was nun? Wenn man zu einer solchen Frage kommt, ist es wirklich unglaublich hilfreich und eine Verschwendung von Zeit für jeden, eine Antwort zu erhalten, wie zum Beispiel warum. - Cookie